/******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./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 */ _arrayLikeToArray; } /* harmony export */ }); function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } /***/ }), /***/ "./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 */ _arrayWithHoles; } /* harmony export */ }); function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } /***/ }), /***/ "./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 */ _arrayWithoutHoles; } /* harmony export */ }); /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); function _arrayWithoutHoles(r) { if (Array.isArray(r)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r); } /***/ }), /***/ "./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 */ _assertThisInitialized; } /* harmony export */ }); function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } /***/ }), /***/ "./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 */ _classCallCheck; } /* harmony export */ }); function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } /***/ }), /***/ "./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 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"); function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } /***/ }), /***/ "./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 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"); function _defineProperty(e, r, t) { return (r = (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } /***/ }), /***/ "./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 export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ _extends; } /* harmony export */ }); function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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__) { "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(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } /***/ }), /***/ "./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 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"); function _inherits(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 && (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(t, e); } /***/ }), /***/ "./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 export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ _iterableToArray; } /* harmony export */ }); function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } /***/ }), /***/ "./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__) { "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; } } return a; } } /***/ }), /***/ "./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 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/@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 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"); 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/@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 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"); function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = (0,_objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } /***/ }), /***/ "./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 export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ _objectWithoutPropertiesLoose; } /* harmony export */ }); function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } /***/ }), /***/ "./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 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"); function _possibleConstructorReturn(t, e) { if (e && ("object" == (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return (0,_assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__["default"])(t); } /***/ }), /***/ "./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 export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ _setPrototypeOf; } /* harmony export */ }); function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } /***/ }), /***/ "./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 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"); function _slicedToArray(r, e) { return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__["default"])(r, e) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(r, e) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); } /***/ }), /***/ "./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(r) { return (0,_arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r) || (0,_iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(r) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(r) || (0,_nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); } /***/ }), /***/ "./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 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"); function toPrimitive(t, r) { if ("object" != (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /***/ }), /***/ "./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 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"); function toPropertyKey(t) { var i = (0,_toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(t, "string"); return "symbol" == (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(i) ? i : i + ""; } /***/ }), /***/ "./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(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); } /***/ }), /***/ "./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__) { "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(r, a) { if (r) { if ("string" == typeof r) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(r, a) : void 0; } } /***/ }), /***/ "./node_modules/@plotly/dash-component-plugins/dist/index.js": /*!*******************************************************************!*\ !*** ./node_modules/@plotly/dash-component-plugins/dist/index.js ***! \*******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { !function(e,n){ true?module.exports=n(__webpack_require__(/*! react */ "react")):0}(window,(function(e){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=1)}([function(n,t){n.exports=e},function(e,n,t){"use strict";t.r(n),t.d(n,"asyncDecorator",(function(){return u})),t.d(n,"inheritAsyncDecorator",(function(){return a})),t.d(n,"isReady",(function(){return c})),t.d(n,"History",(function(){return d}));var r=t(0);function o(e,n,t,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void t(e)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var n=this,t=arguments;return new Promise((function(r,i){var u=e.apply(n,t);function a(e){o(u,r,i,a,c,"next",e)}function c(e){o(u,r,i,a,c,"throw",e)}a(void 0)}))}}var u=function(e,n){var t,o={isReady:new Promise((function(e){t=e})),get:Object(r.lazy)((function(){return Promise.resolve(n()).then((function(e){return setTimeout(i(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t(!0);case 2:o.isReady=!0;case 3:case"end":return e.stop()}}),e)}))),0),e}))}))};return Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},a=function(e,n){Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return c(n)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function f(e,n){for(var t=0;t 1) { h -= 1; } } return [ h * 360, s * 100, v * 100 ]; }; convert.rgb.hwb = function (rgb) { var r = rgb[0]; var g = rgb[1]; var b = rgb[2]; var h = convert.rgb.hsl(rgb)[0]; var w = 1 / 255 * Math.min(r, Math.min(g, b)); b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); return [h, w * 100, b * 100]; }; convert.rgb.cmyk = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var c; var m; var y; var k; k = Math.min(1 - r, 1 - g, 1 - b); c = (1 - r - k) / (1 - k) || 0; m = (1 - g - k) / (1 - k) || 0; y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; }; /** * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance * */ function comparativeDistance(x, y) { return ( Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2) ); } convert.rgb.keyword = function (rgb) { var reversed = reverseKeywords[rgb]; if (reversed) { return reversed; } var currentClosestDistance = Infinity; var currentClosestKeyword; for (var keyword in cssKeywords) { if (cssKeywords.hasOwnProperty(keyword)) { var value = cssKeywords[keyword]; // Compute comparative distance var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest if (distance < currentClosestDistance) { currentClosestDistance = distance; currentClosestKeyword = keyword; } } } return currentClosestKeyword; }; convert.keyword.rgb = function (keyword) { return cssKeywords[keyword]; }; convert.rgb.xyz = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; // assume sRGB r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y * 100, z * 100]; }; convert.rgb.lab = function (rgb) { var xyz = convert.rgb.xyz(rgb); var x = xyz[0]; var y = xyz[1]; var z = xyz[2]; var l; var a; var b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; }; convert.hsl.rgb = function (hsl) { var h = hsl[0] / 360; var s = hsl[1] / 100; var l = hsl[2] / 100; var t1; var t2; var t3; var rgb; var val; if (s === 0) { val = l * 255; return [val, val, val]; } if (l < 0.5) { t2 = l * (1 + s); } else { t2 = l + s - l * s; } t1 = 2 * l - t2; rgb = [0, 0, 0]; for (var i = 0; i < 3; i++) { t3 = h + 1 / 3 * -(i - 1); if (t3 < 0) { t3++; } if (t3 > 1) { t3--; } if (6 * t3 < 1) { val = t1 + (t2 - t1) * 6 * t3; } else if (2 * t3 < 1) { val = t2; } else if (3 * t3 < 2) { val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; } else { val = t1; } rgb[i] = val * 255; } return rgb; }; convert.hsl.hsv = function (hsl) { var h = hsl[0]; var s = hsl[1] / 100; var l = hsl[2] / 100; var smin = s; var lmin = Math.max(l, 0.01); var sv; var v; l *= 2; s *= (l <= 1) ? l : 2 - l; smin *= lmin <= 1 ? lmin : 2 - lmin; v = (l + s) / 2; sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); return [h, sv * 100, v * 100]; }; convert.hsv.rgb = function (hsv) { var h = hsv[0] / 60; var s = hsv[1] / 100; var v = hsv[2] / 100; var hi = Math.floor(h) % 6; var f = h - Math.floor(h); var p = 255 * v * (1 - s); var q = 255 * v * (1 - (s * f)); var t = 255 * v * (1 - (s * (1 - f))); v *= 255; switch (hi) { case 0: return [v, t, p]; case 1: return [q, v, p]; case 2: return [p, v, t]; case 3: return [p, q, v]; case 4: return [t, p, v]; case 5: return [v, p, q]; } }; convert.hsv.hsl = function (hsv) { var h = hsv[0]; var s = hsv[1] / 100; var v = hsv[2] / 100; var vmin = Math.max(v, 0.01); var lmin; var sl; var l; l = (2 - s) * v; lmin = (2 - s) * vmin; sl = s * vmin; sl /= (lmin <= 1) ? lmin : 2 - lmin; sl = sl || 0; l /= 2; return [h, sl * 100, l * 100]; }; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb convert.hwb.rgb = function (hwb) { var h = hwb[0] / 360; var wh = hwb[1] / 100; var bl = hwb[2] / 100; var ratio = wh + bl; var i; var v; var f; var n; // wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } i = Math.floor(6 * h); v = 1 - bl; f = 6 * h - i; if ((i & 0x01) !== 0) { f = 1 - f; } n = wh + f * (v - wh); // linear interpolation var r; var g; var b; switch (i) { default: case 6: case 0: r = v; g = n; b = wh; break; case 1: r = n; g = v; b = wh; break; case 2: r = wh; g = v; b = n; break; case 3: r = wh; g = n; b = v; break; case 4: r = n; g = wh; b = v; break; case 5: r = v; g = wh; b = n; break; } return [r * 255, g * 255, b * 255]; }; convert.cmyk.rgb = function (cmyk) { var c = cmyk[0] / 100; var m = cmyk[1] / 100; var y = cmyk[2] / 100; var k = cmyk[3] / 100; var r; var g; var b; r = 1 - Math.min(1, c * (1 - k) + k); g = 1 - Math.min(1, m * (1 - k) + k); b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; }; convert.xyz.rgb = function (xyz) { var x = xyz[0] / 100; var y = xyz[1] / 100; var z = xyz[2] / 100; var r; var g; var b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); // assume sRGB r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) : r * 12.92; g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) : g * 12.92; b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) : b * 12.92; 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]; }; convert.xyz.lab = function (xyz) { var x = xyz[0]; var y = xyz[1]; var z = xyz[2]; var l; var a; var b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; }; convert.lab.xyz = function (lab) { var l = lab[0]; var a = lab[1]; var b = lab[2]; var x; var y; var z; y = (l + 16) / 116; x = a / 500 + y; z = y - b / 200; var y2 = Math.pow(y, 3); var x2 = Math.pow(x, 3); var z2 = Math.pow(z, 3); y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; x *= 95.047; y *= 100; z *= 108.883; return [x, y, z]; }; convert.lab.lch = function (lab) { var l = lab[0]; var a = lab[1]; var b = lab[2]; var hr; var h; var c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l, c, h]; }; convert.lch.lab = function (lch) { var l = lch[0]; var c = lch[1]; var h = lch[2]; var a; var b; var hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l, a, b]; }; convert.rgb.ansi16 = function (args) { var r = args[0]; var g = args[1]; var b = args[2]; var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization value = Math.round(value / 50); if (value === 0) { return 30; } var ansi = 30 + ((Math.round(b / 255) << 2) | (Math.round(g / 255) << 1) | Math.round(r / 255)); if (value === 2) { ansi += 60; } return ansi; }; convert.hsv.ansi16 = function (args) { // optimization here; we already know the value and don't need to get // it converted for us. return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); }; convert.rgb.ansi256 = function (args) { var r = args[0]; var g = args[1]; var b = args[2]; // we use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { return 16; } if (r > 248) { return 231; } return Math.round(((r - 8) / 247) * 24) + 232; } var ansi = 16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5); return ansi; }; convert.ansi16.rgb = function (args) { var color = args % 10; // handle greyscale if (color === 0 || color === 7) { if (args > 50) { color += 3.5; } color = color / 10.5 * 255; return [color, color, color]; } var mult = (~~(args > 50) + 1) * 0.5; var r = ((color & 1) * mult) * 255; var g = (((color >> 1) & 1) * mult) * 255; var b = (((color >> 2) & 1) * mult) * 255; return [r, g, b]; }; convert.ansi256.rgb = function (args) { // handle greyscale if (args >= 232) { var c = (args - 232) * 10 + 8; return [c, c, c]; } args -= 16; var rem; var r = Math.floor(args / 36) / 5 * 255; var g = Math.floor((rem = args % 36) / 6) / 5 * 255; var b = (rem % 6) / 5 * 255; return [r, g, b]; }; convert.rgb.hex = function (args) { var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF); var string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.hex.rgb = function (args) { var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); if (!match) { return [0, 0, 0]; } var colorString = match[0]; if (match[0].length === 3) { colorString = colorString.split('').map(function (char) { return char + char; }).join(''); } var integer = parseInt(colorString, 16); var r = (integer >> 16) & 0xFF; var g = (integer >> 8) & 0xFF; var b = integer & 0xFF; return [r, g, b]; }; convert.rgb.hcg = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var max = Math.max(Math.max(r, g), b); var min = Math.min(Math.min(r, g), b); var chroma = (max - min); var grayscale; var hue; if (chroma < 1) { grayscale = min / (1 - chroma); } else { grayscale = 0; } if (chroma <= 0) { hue = 0; } else if (max === r) { hue = ((g - b) / chroma) % 6; } else if (max === g) { hue = 2 + (b - r) / chroma; } else { hue = 4 + (r - g) / chroma + 4; } hue /= 6; hue %= 1; return [hue * 360, chroma * 100, grayscale * 100]; }; convert.hsl.hcg = function (hsl) { var s = hsl[1] / 100; var l = hsl[2] / 100; var c = 1; var f = 0; if (l < 0.5) { c = 2.0 * s * l; } else { c = 2.0 * s * (1.0 - l); } if (c < 1.0) { f = (l - 0.5 * c) / (1.0 - c); } return [hsl[0], c * 100, f * 100]; }; convert.hsv.hcg = function (hsv) { var s = hsv[1] / 100; var v = hsv[2] / 100; var c = s * v; var f = 0; if (c < 1.0) { f = (v - c) / (1 - c); } return [hsv[0], c * 100, f * 100]; }; convert.hcg.rgb = function (hcg) { var h = hcg[0] / 360; var c = hcg[1] / 100; var g = hcg[2] / 100; if (c === 0.0) { return [g * 255, g * 255, g * 255]; } var pure = [0, 0, 0]; var hi = (h % 1) * 6; var v = hi % 1; var w = 1 - v; var mg = 0; switch (Math.floor(hi)) { case 0: pure[0] = 1; pure[1] = v; pure[2] = 0; break; case 1: pure[0] = w; pure[1] = 1; pure[2] = 0; break; case 2: pure[0] = 0; pure[1] = 1; pure[2] = v; break; case 3: pure[0] = 0; pure[1] = w; pure[2] = 1; break; case 4: pure[0] = v; pure[1] = 0; pure[2] = 1; break; default: pure[0] = 1; pure[1] = 0; pure[2] = w; } mg = (1.0 - c) * g; return [ (c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255 ]; }; convert.hcg.hsv = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var v = c + g * (1.0 - c); var f = 0; if (v > 0.0) { f = c / v; } return [hcg[0], f * 100, v * 100]; }; convert.hcg.hsl = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var l = g * (1.0 - c) + 0.5 * c; var s = 0; if (l > 0.0 && l < 0.5) { s = c / (2 * l); } else if (l >= 0.5 && l < 1.0) { s = c / (2 * (1 - l)); } return [hcg[0], s * 100, l * 100]; }; convert.hcg.hwb = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var v = c + g * (1.0 - c); return [hcg[0], (v - c) * 100, (1 - v) * 100]; }; convert.hwb.hcg = function (hwb) { var w = hwb[1] / 100; var b = hwb[2] / 100; var v = 1 - b; var c = v - w; var g = 0; if (c < 1) { g = (v - c) / (1 - c); } return [hwb[0], c * 100, g * 100]; }; convert.apple.rgb = function (apple) { return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; }; convert.rgb.apple = function (rgb) { return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; }; convert.gray.rgb = function (args) { return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; convert.gray.hsl = convert.gray.hsv = function (args) { return [0, 0, args[0]]; }; convert.gray.hwb = function (gray) { return [0, 100, gray[0]]; }; convert.gray.cmyk = function (gray) { return [0, 0, 0, gray[0]]; }; convert.gray.lab = function (gray) { return [gray[0], 0, 0]; }; convert.gray.hex = function (gray) { var val = Math.round(gray[0] / 100 * 255) & 0xFF; var integer = (val << 16) + (val << 8) + val; var string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.rgb.gray = function (rgb) { var val = (rgb[0] + rgb[1] + rgb[2]) / 3; return [val / 255 * 100]; }; /***/ }), /***/ "./node_modules/color-convert/index.js": /*!*********************************************!*\ !*** ./node_modules/color-convert/index.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var conversions = __webpack_require__(/*! ./conversions */ "./node_modules/color-convert/conversions.js"); var route = __webpack_require__(/*! ./route */ "./node_modules/color-convert/route.js"); var convert = {}; var models = Object.keys(conversions); function wrapRaw(fn) { var wrappedFn = function (args) { if (args === undefined || args === null) { return args; } if (arguments.length > 1) { args = Array.prototype.slice.call(arguments); } return fn(args); }; // preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } return wrappedFn; } function wrapRounded(fn) { var wrappedFn = function (args) { if (args === undefined || args === null) { return args; } if (arguments.length > 1) { args = Array.prototype.slice.call(arguments); } var result = fn(args); // we're assuming the result is an array here. // see notice in conversions.js; don't use box types // in conversion functions. if (typeof result === 'object') { for (var len = result.length, i = 0; i < len; i++) { result[i] = Math.round(result[i]); } } return result; }; // preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } return wrappedFn; } models.forEach(function (fromModel) { convert[fromModel] = {}; Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); var routes = route(fromModel); var routeModels = Object.keys(routes); routeModels.forEach(function (toModel) { var fn = routes[toModel]; convert[fromModel][toModel] = wrapRounded(fn); convert[fromModel][toModel].raw = wrapRaw(fn); }); }); module.exports = convert; /***/ }), /***/ "./node_modules/color-convert/route.js": /*!*********************************************!*\ !*** ./node_modules/color-convert/route.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var conversions = __webpack_require__(/*! ./conversions */ "./node_modules/color-convert/conversions.js"); /* this function routes a model to all other models. all functions that are routed have a property `.conversion` attached to the returned synthetic function. This property is an array of strings, each with the steps in between the 'from' and 'to' color models (inclusive). conversions that are not possible simply are not included. */ function buildGraph() { var graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3 var models = Object.keys(conversions); for (var len = models.length, i = 0; i < len; i++) { graph[models[i]] = { // http://jsperf.com/1-vs-infinity // micro-opt, but this is simple. distance: -1, parent: null }; } return graph; } // https://en.wikipedia.org/wiki/Breadth-first_search function deriveBFS(fromModel) { var graph = buildGraph(); var queue = [fromModel]; // unshift -> queue -> pop graph[fromModel].distance = 0; while (queue.length) { var current = queue.pop(); var adjacents = Object.keys(conversions[current]); for (var len = adjacents.length, i = 0; i < len; i++) { var adjacent = adjacents[i]; var node = graph[adjacent]; if (node.distance === -1) { node.distance = graph[current].distance + 1; node.parent = current; queue.unshift(adjacent); } } } return graph; } function link(from, to) { return function (args) { return to(from(args)); }; } function wrapConversion(toModel, graph) { var path = [graph[toModel].parent, toModel]; var fn = conversions[graph[toModel].parent][toModel]; var cur = graph[toModel].parent; while (graph[cur].parent) { path.unshift(graph[cur].parent); fn = link(conversions[graph[cur].parent][cur], fn); cur = graph[cur].parent; } fn.conversion = path; return fn; } module.exports = function (fromModel) { var graph = deriveBFS(fromModel); var conversion = {}; var models = Object.keys(graph); for (var len = models.length, i = 0; i < len; i++) { var toModel = models[i]; var node = graph[toModel]; if (node.parent === null) { // no possible conversion, or this node is the source model. continue; } conversion[toModel] = wrapConversion(toModel, graph); } return conversion; }; /***/ }), /***/ "./node_modules/color-name/index.js": /*!******************************************!*\ !*** ./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-string/index.js": /*!********************************************!*\ !*** ./node_modules/color-string/index.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* MIT license */ var colorNames = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js"); var swizzle = __webpack_require__(/*! simple-swizzle */ "./node_modules/simple-swizzle/index.js"); var hasOwnProperty = Object.hasOwnProperty; var reverseNames = Object.create(null); // create a list of reverse color names for (var name in colorNames) { if (hasOwnProperty.call(colorNames, name)) { reverseNames[colorNames[name]] = name; } } var cs = module.exports = { to: {}, get: {} }; cs.get = function (string) { var prefix = string.substring(0, 3).toLowerCase(); var val; var model; switch (prefix) { case 'hsl': val = cs.get.hsl(string); model = 'hsl'; break; case 'hwb': val = cs.get.hwb(string); model = 'hwb'; break; default: val = cs.get.rgb(string); model = 'rgb'; break; } if (!val) { return null; } return {model: model, value: val}; }; cs.get.rgb = function (string) { if (!string) { return null; } var abbr = /^#([a-f0-9]{3,4})$/i; var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i; var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; var keyword = /^(\w+)$/; var rgb = [0, 0, 0, 1]; var match; var i; var hexAlpha; if (match = string.match(hex)) { hexAlpha = match[2]; match = match[1]; for (i = 0; i < 3; i++) { // https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19 var i2 = i * 2; rgb[i] = parseInt(match.slice(i2, i2 + 2), 16); } if (hexAlpha) { rgb[3] = parseInt(hexAlpha, 16) / 255; } } else if (match = string.match(abbr)) { match = match[1]; hexAlpha = match[3]; for (i = 0; i < 3; i++) { rgb[i] = parseInt(match[i] + match[i], 16); } if (hexAlpha) { rgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255; } } else if (match = string.match(rgba)) { for (i = 0; i < 3; i++) { rgb[i] = parseInt(match[i + 1], 0); } if (match[4]) { if (match[5]) { rgb[3] = parseFloat(match[4]) * 0.01; } else { rgb[3] = parseFloat(match[4]); } } } else if (match = string.match(per)) { for (i = 0; i < 3; i++) { rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); } if (match[4]) { if (match[5]) { rgb[3] = parseFloat(match[4]) * 0.01; } else { rgb[3] = parseFloat(match[4]); } } } else if (match = string.match(keyword)) { if (match[1] === 'transparent') { return [0, 0, 0, 0]; } if (!hasOwnProperty.call(colorNames, match[1])) { return null; } rgb = colorNames[match[1]]; rgb[3] = 1; return rgb; } else { return null; } for (i = 0; i < 3; i++) { rgb[i] = clamp(rgb[i], 0, 255); } rgb[3] = clamp(rgb[3], 0, 1); return rgb; }; cs.get.hsl = function (string) { if (!string) { return null; } var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; var match = string.match(hsl); if (match) { var alpha = parseFloat(match[4]); var h = ((parseFloat(match[1]) % 360) + 360) % 360; var s = clamp(parseFloat(match[2]), 0, 100); var l = clamp(parseFloat(match[3]), 0, 100); var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1); return [h, s, l, a]; } return null; }; cs.get.hwb = function (string) { if (!string) { return null; } var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; var match = string.match(hwb); if (match) { var alpha = parseFloat(match[4]); var h = ((parseFloat(match[1]) % 360) + 360) % 360; var w = clamp(parseFloat(match[2]), 0, 100); var b = clamp(parseFloat(match[3]), 0, 100); var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1); return [h, w, b, a]; } return null; }; cs.to.hex = function () { var rgba = swizzle(arguments); return ( '#' + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (rgba[3] < 1 ? (hexDouble(Math.round(rgba[3] * 255))) : '') ); }; cs.to.rgb = function () { var rgba = swizzle(arguments); return rgba.length < 4 || rgba[3] === 1 ? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')' : 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')'; }; cs.to.rgb.percent = function () { var rgba = swizzle(arguments); var r = Math.round(rgba[0] / 255 * 100); var g = Math.round(rgba[1] / 255 * 100); var b = Math.round(rgba[2] / 255 * 100); return rgba.length < 4 || rgba[3] === 1 ? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)' : 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')'; }; cs.to.hsl = function () { var hsla = swizzle(arguments); return hsla.length < 4 || hsla[3] === 1 ? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)' : 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')'; }; // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax // (hwb have alpha optional & 1 is default value) cs.to.hwb = function () { var hwba = swizzle(arguments); var a = ''; if (hwba.length >= 4 && hwba[3] !== 1) { a = ', ' + hwba[3]; } return 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')'; }; cs.to.keyword = function (rgb) { return reverseNames[rgb.slice(0, 3)]; }; // helpers function clamp(num, min, max) { return Math.min(Math.max(min, num), max); } function hexDouble(num) { var str = Math.round(num).toString(16).toUpperCase(); return (str.length < 2) ? '0' + str : str; } /***/ }), /***/ "./node_modules/color/index.js": /*!*************************************!*\ !*** ./node_modules/color/index.js ***! \*************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var colorString = __webpack_require__(/*! color-string */ "./node_modules/color-string/index.js"); var convert = __webpack_require__(/*! color-convert */ "./node_modules/color-convert/index.js"); var _slice = [].slice; var skippedModels = [ // to be honest, I don't really feel like keyword belongs in color convert, but eh. 'keyword', // gray conflicts with some method names, and has its own method defined. 'gray', // shouldn't really be in color-convert either... 'hex' ]; var hashedModelKeys = {}; Object.keys(convert).forEach(function (model) { hashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model; }); var limiters = {}; function Color(obj, model) { if (!(this instanceof Color)) { return new Color(obj, model); } if (model && model in skippedModels) { model = null; } if (model && !(model in convert)) { throw new Error('Unknown model: ' + model); } var i; var channels; if (obj == null) { // eslint-disable-line no-eq-null,eqeqeq this.model = 'rgb'; this.color = [0, 0, 0]; this.valpha = 1; } else if (obj instanceof Color) { this.model = obj.model; this.color = obj.color.slice(); this.valpha = obj.valpha; } else if (typeof obj === 'string') { var result = colorString.get(obj); if (result === null) { throw new Error('Unable to parse color from string: ' + obj); } this.model = result.model; channels = convert[this.model].channels; this.color = result.value.slice(0, channels); this.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1; } else if (obj.length) { this.model = model || 'rgb'; channels = convert[this.model].channels; var newArr = _slice.call(obj, 0, channels); this.color = zeroArray(newArr, channels); this.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1; } else if (typeof obj === 'number') { // this is always RGB - can be converted later on. obj &= 0xFFFFFF; this.model = 'rgb'; this.color = [ (obj >> 16) & 0xFF, (obj >> 8) & 0xFF, obj & 0xFF ]; this.valpha = 1; } else { this.valpha = 1; var keys = Object.keys(obj); if ('alpha' in obj) { keys.splice(keys.indexOf('alpha'), 1); this.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0; } var hashedKeys = keys.sort().join(''); if (!(hashedKeys in hashedModelKeys)) { throw new Error('Unable to parse color from object: ' + JSON.stringify(obj)); } this.model = hashedModelKeys[hashedKeys]; var labels = convert[this.model].labels; var color = []; for (i = 0; i < labels.length; i++) { color.push(obj[labels[i]]); } this.color = zeroArray(color); } // perform limitations (clamping, etc.) if (limiters[this.model]) { channels = convert[this.model].channels; for (i = 0; i < channels; i++) { var limit = limiters[this.model][i]; if (limit) { this.color[i] = limit(this.color[i]); } } } this.valpha = Math.max(0, Math.min(1, this.valpha)); if (Object.freeze) { Object.freeze(this); } } Color.prototype = { toString: function () { return this.string(); }, toJSON: function () { return this[this.model](); }, string: function (places) { var self = this.model in colorString.to ? this : this.rgb(); self = self.round(typeof places === 'number' ? places : 1); var args = self.valpha === 1 ? self.color : self.color.concat(this.valpha); return colorString.to[self.model](args); }, percentString: function (places) { var self = this.rgb().round(typeof places === 'number' ? places : 1); var args = self.valpha === 1 ? self.color : self.color.concat(this.valpha); return colorString.to.rgb.percent(args); }, array: function () { return this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha); }, object: function () { var result = {}; var channels = convert[this.model].channels; var labels = convert[this.model].labels; for (var i = 0; i < channels; i++) { result[labels[i]] = this.color[i]; } if (this.valpha !== 1) { result.alpha = this.valpha; } return result; }, unitArray: function () { var rgb = this.rgb().color; rgb[0] /= 255; rgb[1] /= 255; rgb[2] /= 255; if (this.valpha !== 1) { rgb.push(this.valpha); } return rgb; }, unitObject: function () { var rgb = this.rgb().object(); rgb.r /= 255; rgb.g /= 255; rgb.b /= 255; if (this.valpha !== 1) { rgb.alpha = this.valpha; } return rgb; }, round: function (places) { places = Math.max(places || 0, 0); return new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model); }, alpha: function (val) { if (arguments.length) { return new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model); } return this.valpha; }, // rgb red: getset('rgb', 0, maxfn(255)), green: getset('rgb', 1, maxfn(255)), blue: getset('rgb', 2, maxfn(255)), hue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style saturationl: getset('hsl', 1, maxfn(100)), lightness: getset('hsl', 2, maxfn(100)), saturationv: getset('hsv', 1, maxfn(100)), value: getset('hsv', 2, maxfn(100)), chroma: getset('hcg', 1, maxfn(100)), gray: getset('hcg', 2, maxfn(100)), white: getset('hwb', 1, maxfn(100)), wblack: getset('hwb', 2, maxfn(100)), cyan: getset('cmyk', 0, maxfn(100)), magenta: getset('cmyk', 1, maxfn(100)), yellow: getset('cmyk', 2, maxfn(100)), black: getset('cmyk', 3, maxfn(100)), x: getset('xyz', 0, maxfn(100)), y: getset('xyz', 1, maxfn(100)), z: getset('xyz', 2, maxfn(100)), l: getset('lab', 0, maxfn(100)), a: getset('lab', 1), b: getset('lab', 2), keyword: function (val) { if (arguments.length) { return new Color(val); } return convert[this.model].keyword(this.color); }, hex: function (val) { if (arguments.length) { return new Color(val); } return colorString.to.hex(this.rgb().round().color); }, rgbNumber: function () { var rgb = this.rgb().color; return ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF); }, luminosity: function () { // http://www.w3.org/TR/WCAG20/#relativeluminancedef var rgb = this.rgb().color; var lum = []; for (var i = 0; i < rgb.length; i++) { var chan = rgb[i] / 255; lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); } return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; }, contrast: function (color2) { // http://www.w3.org/TR/WCAG20/#contrast-ratiodef var lum1 = this.luminosity(); var lum2 = color2.luminosity(); if (lum1 > lum2) { return (lum1 + 0.05) / (lum2 + 0.05); } return (lum2 + 0.05) / (lum1 + 0.05); }, level: function (color2) { var contrastRatio = this.contrast(color2); if (contrastRatio >= 7.1) { return 'AAA'; } return (contrastRatio >= 4.5) ? 'AA' : ''; }, isDark: function () { // YIQ equation from http://24ways.org/2010/calculating-color-contrast var rgb = this.rgb().color; var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; return yiq < 128; }, isLight: function () { return !this.isDark(); }, negate: function () { var rgb = this.rgb(); for (var i = 0; i < 3; i++) { rgb.color[i] = 255 - rgb.color[i]; } return rgb; }, lighten: function (ratio) { var hsl = this.hsl(); hsl.color[2] += hsl.color[2] * ratio; return hsl; }, darken: function (ratio) { var hsl = this.hsl(); hsl.color[2] -= hsl.color[2] * ratio; return hsl; }, saturate: function (ratio) { var hsl = this.hsl(); hsl.color[1] += hsl.color[1] * ratio; return hsl; }, desaturate: function (ratio) { var hsl = this.hsl(); hsl.color[1] -= hsl.color[1] * ratio; return hsl; }, whiten: function (ratio) { var hwb = this.hwb(); hwb.color[1] += hwb.color[1] * ratio; return hwb; }, blacken: function (ratio) { var hwb = this.hwb(); hwb.color[2] += hwb.color[2] * ratio; return hwb; }, grayscale: function () { // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale var rgb = this.rgb().color; var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; return Color.rgb(val, val, val); }, fade: function (ratio) { return this.alpha(this.valpha - (this.valpha * ratio)); }, opaquer: function (ratio) { return this.alpha(this.valpha + (this.valpha * ratio)); }, rotate: function (degrees) { var hsl = this.hsl(); var hue = hsl.color[0]; hue = (hue + degrees) % 360; hue = hue < 0 ? 360 + hue : hue; hsl.color[0] = hue; return hsl; }, mix: function (mixinColor, weight) { // ported from sass implementation in C // https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 if (!mixinColor || !mixinColor.rgb) { throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor); } var color1 = mixinColor.rgb(); var color2 = this.rgb(); var p = weight === undefined ? 0.5 : weight; var w = 2 * p - 1; var a = color1.alpha() - color2.alpha(); var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; var w2 = 1 - w1; return Color.rgb( w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue(), color1.alpha() * p + color2.alpha() * (1 - p)); } }; // model conversion methods and static constructors Object.keys(convert).forEach(function (model) { if (skippedModels.indexOf(model) !== -1) { return; } var channels = convert[model].channels; // conversion methods Color.prototype[model] = function () { if (this.model === model) { return new Color(this); } if (arguments.length) { return new Color(arguments, model); } var newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha; return new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model); }; // 'static' construction methods Color[model] = function (color) { if (typeof color === 'number') { color = zeroArray(_slice.call(arguments), channels); } return new Color(color, model); }; }); function roundTo(num, places) { return Number(num.toFixed(places)); } function roundToPlace(places) { return function (num) { return roundTo(num, places); }; } function getset(model, channel, modifier) { model = Array.isArray(model) ? model : [model]; model.forEach(function (m) { (limiters[m] || (limiters[m] = []))[channel] = modifier; }); model = model[0]; return function (val) { var result; if (arguments.length) { if (modifier) { val = modifier(val); } result = this[model](); result.color[channel] = val; return result; } result = this[model]().color[channel]; if (modifier) { result = modifier(result); } return result; }; } function maxfn(max) { return function (v) { return Math.max(0, Math.min(max, v)); }; } function assertArray(val) { return Array.isArray(val) ? val : [val]; } function zeroArray(arr, length) { for (var i = 0; i < length; i++) { if (typeof arr[i] !== 'number') { arr[i] = 0; } } return arr; } module.exports = Color; /***/ }), /***/ "./node_modules/cookie/index.js": /*!**************************************!*\ !*** ./node_modules/cookie/index.js ***! \**************************************/ /***/ (function(__unused_webpack_module, exports) { "use strict"; /*! * cookie * Copyright(c) 2012-2014 Roman Shtylman * Copyright(c) 2015 Douglas Christopher Wilson * MIT Licensed */ /** * Module exports. * @public */ exports.parse = parse; exports.serialize = serialize; /** * Module variables. * @private */ var __toString = Object.prototype.toString /** * RegExp to match field-content in RFC 7230 sec 3.2 * * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text * obs-text = %x80-FF */ var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; /** * Parse a cookie header. * * Parse the given cookie header string into an object * The object has the various cookies as keys(names) => values * * @param {string} str * @param {object} [options] * @return {object} * @public */ function parse(str, options) { if (typeof str !== 'string') { throw new TypeError('argument str must be a string'); } var obj = {} var opt = options || {}; var dec = opt.decode || decode; var index = 0 while (index < str.length) { var eqIdx = str.indexOf('=', index) // no more cookie pairs if (eqIdx === -1) { break } var endIdx = str.indexOf(';', index) if (endIdx === -1) { endIdx = str.length } else if (endIdx < eqIdx) { // backtrack on prior semicolon index = str.lastIndexOf(';', eqIdx - 1) + 1 continue } var key = str.slice(index, eqIdx).trim() // only assign once if (undefined === obj[key]) { var val = str.slice(eqIdx + 1, endIdx).trim() // quoted values if (val.charCodeAt(0) === 0x22) { val = val.slice(1, -1) } obj[key] = tryDecode(val, dec); } index = endIdx + 1 } return obj; } /** * Serialize data into a cookie header. * * Serialize the a name value pair into a cookie string suitable for * http headers. An optional options object specified cookie parameters. * * serialize('foo', 'bar', { httpOnly: true }) * => "foo=bar; httpOnly" * * @param {string} name * @param {string} val * @param {object} [options] * @return {string} * @public */ function serialize(name, val, options) { var opt = options || {}; var enc = opt.encode || encode; if (typeof enc !== 'function') { throw new TypeError('option encode is invalid'); } if (!fieldContentRegExp.test(name)) { throw new TypeError('argument name is invalid'); } var value = enc(val); if (value && !fieldContentRegExp.test(value)) { throw new TypeError('argument val is invalid'); } var str = name + '=' + value; if (null != opt.maxAge) { var maxAge = opt.maxAge - 0; if (isNaN(maxAge) || !isFinite(maxAge)) { throw new TypeError('option maxAge is invalid') } str += '; Max-Age=' + Math.floor(maxAge); } if (opt.domain) { if (!fieldContentRegExp.test(opt.domain)) { throw new TypeError('option domain is invalid'); } str += '; Domain=' + opt.domain; } if (opt.path) { if (!fieldContentRegExp.test(opt.path)) { throw new TypeError('option path is invalid'); } str += '; Path=' + opt.path; } if (opt.expires) { var expires = opt.expires if (!isDate(expires) || isNaN(expires.valueOf())) { throw new TypeError('option expires is invalid'); } str += '; Expires=' + expires.toUTCString() } if (opt.httpOnly) { str += '; HttpOnly'; } if (opt.secure) { str += '; Secure'; } if (opt.partitioned) { str += '; Partitioned' } if (opt.priority) { var priority = typeof opt.priority === 'string' ? opt.priority.toLowerCase() : opt.priority switch (priority) { case 'low': str += '; Priority=Low' break case 'medium': str += '; Priority=Medium' break case 'high': str += '; Priority=High' break default: throw new TypeError('option priority is invalid') } } if (opt.sameSite) { var sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite; switch (sameSite) { case true: str += '; SameSite=Strict'; break; case 'lax': str += '; SameSite=Lax'; break; case 'strict': str += '; SameSite=Strict'; break; case 'none': str += '; SameSite=None'; break; default: throw new TypeError('option sameSite is invalid'); } } return str; } /** * URL-decode string value. Optimized to skip native call when no %. * * @param {string} str * @returns {string} */ function decode (str) { return str.indexOf('%') !== -1 ? decodeURIComponent(str) : str } /** * URL-encode value. * * @param {string} val * @returns {string} */ function encode (val) { return encodeURIComponent(val) } /** * Determine if value is a Date. * * @param {*} val * @private */ function isDate (val) { return __toString.call(val) === '[object Date]' || val instanceof Date } /** * Try decoding a string using a decoding function. * * @param {string} str * @param {function} decode * @private */ function tryDecode(str, decode) { try { return decode(str); } catch (e) { return str; } } /***/ }), /***/ "./node_modules/cose-base/cose-base.js": /*!*********************************************!*\ !*** ./node_modules/cose-base/cose-base.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(__webpack_require__(/*! layout-base */ "./node_modules/layout-base/layout-base.js")); else // removed by dead control flow {} })(this, function(__WEBPACK_EXTERNAL_MODULE__551__) { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ 45: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_630__) => { var coseBase = {}; coseBase.layoutBase = __nested_webpack_require_630__(551); coseBase.CoSEConstants = __nested_webpack_require_630__(806); coseBase.CoSEEdge = __nested_webpack_require_630__(767); coseBase.CoSEGraph = __nested_webpack_require_630__(880); coseBase.CoSEGraphManager = __nested_webpack_require_630__(578); coseBase.CoSELayout = __nested_webpack_require_630__(765); coseBase.CoSENode = __nested_webpack_require_630__(991); coseBase.ConstraintHandler = __nested_webpack_require_630__(902); module.exports = coseBase; /***/ }), /***/ 806: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_1167__) => { var FDLayoutConstants = __nested_webpack_require_1167__(551).FDLayoutConstants; function CoSEConstants() {} //CoSEConstants inherits static props in FDLayoutConstants for (var prop in FDLayoutConstants) { CoSEConstants[prop] = FDLayoutConstants[prop]; } CoSEConstants.DEFAULT_USE_MULTI_LEVEL_SCALING = false; CoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH; CoSEConstants.DEFAULT_COMPONENT_SEPERATION = 60; CoSEConstants.TILE = true; CoSEConstants.TILING_PADDING_VERTICAL = 10; CoSEConstants.TILING_PADDING_HORIZONTAL = 10; CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true; CoSEConstants.ENFORCE_CONSTRAINTS = true; CoSEConstants.APPLY_LAYOUT = true; CoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS = true; CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = true; // this should be set to false if there will be a constraint // This constant is for differentiating whether actual layout algorithm that uses cose-base wants to apply only incremental layout or // an incremental layout on top of a randomized layout. If it is only incremental layout, then this constant should be true. CoSEConstants.PURE_INCREMENTAL = CoSEConstants.DEFAULT_INCREMENTAL; module.exports = CoSEConstants; /***/ }), /***/ 767: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_2468__) => { var FDLayoutEdge = __nested_webpack_require_2468__(551).FDLayoutEdge; function CoSEEdge(source, target, vEdge) { FDLayoutEdge.call(this, source, target, vEdge); } CoSEEdge.prototype = Object.create(FDLayoutEdge.prototype); for (var prop in FDLayoutEdge) { CoSEEdge[prop] = FDLayoutEdge[prop]; } module.exports = CoSEEdge; /***/ }), /***/ 880: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_2879__) => { var LGraph = __nested_webpack_require_2879__(551).LGraph; function CoSEGraph(parent, graphMgr, vGraph) { LGraph.call(this, parent, graphMgr, vGraph); } CoSEGraph.prototype = Object.create(LGraph.prototype); for (var prop in LGraph) { CoSEGraph[prop] = LGraph[prop]; } module.exports = CoSEGraph; /***/ }), /***/ 578: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_3264__) => { var LGraphManager = __nested_webpack_require_3264__(551).LGraphManager; function CoSEGraphManager(layout) { LGraphManager.call(this, layout); } CoSEGraphManager.prototype = Object.create(LGraphManager.prototype); for (var prop in LGraphManager) { CoSEGraphManager[prop] = LGraphManager[prop]; } module.exports = CoSEGraphManager; /***/ }), /***/ 765: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_3683__) => { var FDLayout = __nested_webpack_require_3683__(551).FDLayout; var CoSEGraphManager = __nested_webpack_require_3683__(578); var CoSEGraph = __nested_webpack_require_3683__(880); var CoSENode = __nested_webpack_require_3683__(991); var CoSEEdge = __nested_webpack_require_3683__(767); var CoSEConstants = __nested_webpack_require_3683__(806); var ConstraintHandler = __nested_webpack_require_3683__(902); var FDLayoutConstants = __nested_webpack_require_3683__(551).FDLayoutConstants; var LayoutConstants = __nested_webpack_require_3683__(551).LayoutConstants; var Point = __nested_webpack_require_3683__(551).Point; var PointD = __nested_webpack_require_3683__(551).PointD; var DimensionD = __nested_webpack_require_3683__(551).DimensionD; var Layout = __nested_webpack_require_3683__(551).Layout; var Integer = __nested_webpack_require_3683__(551).Integer; var IGeometry = __nested_webpack_require_3683__(551).IGeometry; var LGraph = __nested_webpack_require_3683__(551).LGraph; var Transform = __nested_webpack_require_3683__(551).Transform; var LinkedList = __nested_webpack_require_3683__(551).LinkedList; function CoSELayout() { FDLayout.call(this); this.toBeTiled = {}; // Memorize if a node is to be tiled or is tiled this.constraints = {}; // keep layout constraints } CoSELayout.prototype = Object.create(FDLayout.prototype); for (var prop in FDLayout) { CoSELayout[prop] = FDLayout[prop]; } CoSELayout.prototype.newGraphManager = function () { var gm = new CoSEGraphManager(this); this.graphManager = gm; return gm; }; CoSELayout.prototype.newGraph = function (vGraph) { return new CoSEGraph(null, this.graphManager, vGraph); }; CoSELayout.prototype.newNode = function (vNode) { return new CoSENode(this.graphManager, vNode); }; CoSELayout.prototype.newEdge = function (vEdge) { return new CoSEEdge(null, null, vEdge); }; CoSELayout.prototype.initParameters = function () { FDLayout.prototype.initParameters.call(this, arguments); if (!this.isSubLayout) { if (CoSEConstants.DEFAULT_EDGE_LENGTH < 10) { this.idealEdgeLength = 10; } else { this.idealEdgeLength = CoSEConstants.DEFAULT_EDGE_LENGTH; } this.useSmartIdealEdgeLengthCalculation = CoSEConstants.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; // variables for tree reduction support this.prunedNodesAll = []; this.growTreeIterations = 0; this.afterGrowthIterations = 0; this.isTreeGrowing = false; this.isGrowthFinished = false; } }; // This method is used to set CoSE related parameters used by spring embedder. CoSELayout.prototype.initSpringEmbedder = function () { FDLayout.prototype.initSpringEmbedder.call(this); // variables for cooling this.coolingCycle = 0; this.maxCoolingCycle = this.maxIterations / FDLayoutConstants.CONVERGENCE_CHECK_PERIOD; this.finalTemperature = 0.04; this.coolingAdjuster = 1; }; CoSELayout.prototype.layout = function () { var createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; if (createBendsAsNeeded) { this.createBendpoints(); this.graphManager.resetAllEdges(); } this.level = 0; return this.classicLayout(); }; CoSELayout.prototype.classicLayout = function () { this.nodesWithGravity = this.calculateNodesToApplyGravitationTo(); this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity); this.calcNoOfChildrenForAllNodes(); this.graphManager.calcLowestCommonAncestors(); this.graphManager.calcInclusionTreeDepths(); this.graphManager.getRoot().calcEstimatedSize(); this.calcIdealEdgeLengths(); if (!this.incremental) { var forest = this.getFlatForest(); // The graph associated with this layout is flat and a forest if (forest.length > 0) { this.positionNodesRadially(forest); } // The graph associated with this layout is not flat or a forest else { // Reduce the trees when incremental mode is not enabled and graph is not a forest this.reduceTrees(); // Update nodes that gravity will be applied this.graphManager.resetAllNodesToApplyGravitation(); var allNodes = new Set(this.getAllNodes()); var intersection = this.nodesWithGravity.filter(function (x) { return allNodes.has(x); }); this.graphManager.setAllNodesToApplyGravitation(intersection); this.positionNodesRandomly(); } } else { if (CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL) { // Reduce the trees in incremental mode if only this constant is set to true this.reduceTrees(); // Update nodes that gravity will be applied this.graphManager.resetAllNodesToApplyGravitation(); var allNodes = new Set(this.getAllNodes()); var intersection = this.nodesWithGravity.filter(function (x) { return allNodes.has(x); }); this.graphManager.setAllNodesToApplyGravitation(intersection); } } if (Object.keys(this.constraints).length > 0) { ConstraintHandler.handleConstraints(this); this.initConstraintVariables(); } this.initSpringEmbedder(); if (CoSEConstants.APPLY_LAYOUT) { this.runSpringEmbedder(); } return true; }; CoSELayout.prototype.tick = function () { this.totalIterations++; if (this.totalIterations === this.maxIterations && !this.isTreeGrowing && !this.isGrowthFinished) { if (this.prunedNodesAll.length > 0) { this.isTreeGrowing = true; } else { return true; } } if (this.totalIterations % FDLayoutConstants.CONVERGENCE_CHECK_PERIOD == 0 && !this.isTreeGrowing && !this.isGrowthFinished) { if (this.isConverged()) { if (this.prunedNodesAll.length > 0) { this.isTreeGrowing = true; } else { return true; } } this.coolingCycle++; if (this.layoutQuality == 0) { // quality - "draft" this.coolingAdjuster = this.coolingCycle; } else if (this.layoutQuality == 1) { // quality - "default" this.coolingAdjuster = this.coolingCycle / 3; } // cooling schedule is based on http://www.btluke.com/simanf1.html -> cooling schedule 3 this.coolingFactor = Math.max(this.initialCoolingFactor - Math.pow(this.coolingCycle, Math.log(100 * (this.initialCoolingFactor - this.finalTemperature)) / Math.log(this.maxCoolingCycle)) / 100 * this.coolingAdjuster, this.finalTemperature); this.animationPeriod = Math.ceil(this.initialAnimationPeriod * Math.sqrt(this.coolingFactor)); } // Operations while tree is growing again if (this.isTreeGrowing) { if (this.growTreeIterations % 10 == 0) { if (this.prunedNodesAll.length > 0) { this.graphManager.updateBounds(); this.updateGrid(); this.growTree(this.prunedNodesAll); // Update nodes that gravity will be applied this.graphManager.resetAllNodesToApplyGravitation(); var allNodes = new Set(this.getAllNodes()); var intersection = this.nodesWithGravity.filter(function (x) { return allNodes.has(x); }); this.graphManager.setAllNodesToApplyGravitation(intersection); this.graphManager.updateBounds(); this.updateGrid(); if (CoSEConstants.PURE_INCREMENTAL) this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL / 2;else this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; } else { this.isTreeGrowing = false; this.isGrowthFinished = true; } } this.growTreeIterations++; } // Operations after growth is finished if (this.isGrowthFinished) { if (this.isConverged()) { return true; } if (this.afterGrowthIterations % 10 == 0) { this.graphManager.updateBounds(); this.updateGrid(); } if (CoSEConstants.PURE_INCREMENTAL) this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL / 2 * ((100 - this.afterGrowthIterations) / 100);else this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL * ((100 - this.afterGrowthIterations) / 100); this.afterGrowthIterations++; } var gridUpdateAllowed = !this.isTreeGrowing && !this.isGrowthFinished; var forceToNodeSurroundingUpdate = this.growTreeIterations % 10 == 1 && this.isTreeGrowing || this.afterGrowthIterations % 10 == 1 && this.isGrowthFinished; this.totalDisplacement = 0; this.graphManager.updateBounds(); this.calcSpringForces(); this.calcRepulsionForces(gridUpdateAllowed, forceToNodeSurroundingUpdate); this.calcGravitationalForces(); this.moveNodes(); this.animate(); return false; // Layout is not ended yet return false }; CoSELayout.prototype.getPositionsData = function () { var allNodes = this.graphManager.getAllNodes(); var pData = {}; for (var i = 0; i < allNodes.length; i++) { var rect = allNodes[i].rect; var id = allNodes[i].id; pData[id] = { id: id, x: rect.getCenterX(), y: rect.getCenterY(), w: rect.width, h: rect.height }; } return pData; }; CoSELayout.prototype.runSpringEmbedder = function () { this.initialAnimationPeriod = 25; this.animationPeriod = this.initialAnimationPeriod; var layoutEnded = false; // If aminate option is 'during' signal that layout is supposed to start iterating if (FDLayoutConstants.ANIMATE === 'during') { this.emit('layoutstarted'); } else { // If aminate option is 'during' tick() function will be called on index.js while (!layoutEnded) { layoutEnded = this.tick(); } this.graphManager.updateBounds(); } }; // overrides moveNodes method in FDLayout CoSELayout.prototype.moveNodes = function () { var lNodes = this.getAllNodes(); var node; // calculate displacement for each node for (var i = 0; i < lNodes.length; i++) { node = lNodes[i]; node.calculateDisplacement(); } if (Object.keys(this.constraints).length > 0) { this.updateDisplacements(); } // move each node for (var i = 0; i < lNodes.length; i++) { node = lNodes[i]; node.move(); } }; // constraint related methods: initConstraintVariables and updateDisplacements // initialize constraint related variables CoSELayout.prototype.initConstraintVariables = function () { var self = this; this.idToNodeMap = new Map(); this.fixedNodeSet = new Set(); var allNodes = this.graphManager.getAllNodes(); // fill idToNodeMap for (var i = 0; i < allNodes.length; i++) { var node = allNodes[i]; this.idToNodeMap.set(node.id, node); } // calculate fixed node weight for given compound node var calculateCompoundWeight = function calculateCompoundWeight(compoundNode) { var nodes = compoundNode.getChild().getNodes(); var node; var fixedNodeWeight = 0; for (var i = 0; i < nodes.length; i++) { node = nodes[i]; if (node.getChild() == null) { if (self.fixedNodeSet.has(node.id)) { fixedNodeWeight += 100; } } else { fixedNodeWeight += calculateCompoundWeight(node); } } return fixedNodeWeight; }; if (this.constraints.fixedNodeConstraint) { // fill fixedNodeSet this.constraints.fixedNodeConstraint.forEach(function (nodeData) { self.fixedNodeSet.add(nodeData.nodeId); }); // assign fixed node weights to compounds if they contain fixed nodes var allNodes = this.graphManager.getAllNodes(); var node; for (var i = 0; i < allNodes.length; i++) { node = allNodes[i]; if (node.getChild() != null) { var fixedNodeWeight = calculateCompoundWeight(node); if (fixedNodeWeight > 0) { node.fixedNodeWeight = fixedNodeWeight; } } } } if (this.constraints.relativePlacementConstraint) { var nodeToDummyForVerticalAlignment = new Map(); var nodeToDummyForHorizontalAlignment = new Map(); this.dummyToNodeForVerticalAlignment = new Map(); this.dummyToNodeForHorizontalAlignment = new Map(); this.fixedNodesOnHorizontal = new Set(); this.fixedNodesOnVertical = new Set(); // fill maps and sets this.fixedNodeSet.forEach(function (nodeId) { self.fixedNodesOnHorizontal.add(nodeId); self.fixedNodesOnVertical.add(nodeId); }); if (this.constraints.alignmentConstraint) { if (this.constraints.alignmentConstraint.vertical) { var verticalAlignment = this.constraints.alignmentConstraint.vertical; for (var i = 0; i < verticalAlignment.length; i++) { this.dummyToNodeForVerticalAlignment.set("dummy" + i, []); verticalAlignment[i].forEach(function (nodeId) { nodeToDummyForVerticalAlignment.set(nodeId, "dummy" + i); self.dummyToNodeForVerticalAlignment.get("dummy" + i).push(nodeId); if (self.fixedNodeSet.has(nodeId)) { self.fixedNodesOnHorizontal.add("dummy" + i); } }); } } if (this.constraints.alignmentConstraint.horizontal) { var horizontalAlignment = this.constraints.alignmentConstraint.horizontal; for (var i = 0; i < horizontalAlignment.length; i++) { this.dummyToNodeForHorizontalAlignment.set("dummy" + i, []); horizontalAlignment[i].forEach(function (nodeId) { nodeToDummyForHorizontalAlignment.set(nodeId, "dummy" + i); self.dummyToNodeForHorizontalAlignment.get("dummy" + i).push(nodeId); if (self.fixedNodeSet.has(nodeId)) { self.fixedNodesOnVertical.add("dummy" + i); } }); } } } if (CoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS) { this.shuffle = function (array) { var j, x, i; for (i = array.length - 1; i >= 2 * array.length / 3; i--) { j = Math.floor(Math.random() * (i + 1)); x = array[i]; array[i] = array[j]; array[j] = x; } return array; }; this.nodesInRelativeHorizontal = []; this.nodesInRelativeVertical = []; this.nodeToRelativeConstraintMapHorizontal = new Map(); this.nodeToRelativeConstraintMapVertical = new Map(); this.nodeToTempPositionMapHorizontal = new Map(); this.nodeToTempPositionMapVertical = new Map(); // fill arrays and maps this.constraints.relativePlacementConstraint.forEach(function (constraint) { if (constraint.left) { var nodeIdLeft = nodeToDummyForVerticalAlignment.has(constraint.left) ? nodeToDummyForVerticalAlignment.get(constraint.left) : constraint.left; var nodeIdRight = nodeToDummyForVerticalAlignment.has(constraint.right) ? nodeToDummyForVerticalAlignment.get(constraint.right) : constraint.right; if (!self.nodesInRelativeHorizontal.includes(nodeIdLeft)) { self.nodesInRelativeHorizontal.push(nodeIdLeft); self.nodeToRelativeConstraintMapHorizontal.set(nodeIdLeft, []); if (self.dummyToNodeForVerticalAlignment.has(nodeIdLeft)) { self.nodeToTempPositionMapHorizontal.set(nodeIdLeft, self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeIdLeft)[0]).getCenterX()); } else { self.nodeToTempPositionMapHorizontal.set(nodeIdLeft, self.idToNodeMap.get(nodeIdLeft).getCenterX()); } } if (!self.nodesInRelativeHorizontal.includes(nodeIdRight)) { self.nodesInRelativeHorizontal.push(nodeIdRight); self.nodeToRelativeConstraintMapHorizontal.set(nodeIdRight, []); if (self.dummyToNodeForVerticalAlignment.has(nodeIdRight)) { self.nodeToTempPositionMapHorizontal.set(nodeIdRight, self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeIdRight)[0]).getCenterX()); } else { self.nodeToTempPositionMapHorizontal.set(nodeIdRight, self.idToNodeMap.get(nodeIdRight).getCenterX()); } } self.nodeToRelativeConstraintMapHorizontal.get(nodeIdLeft).push({ right: nodeIdRight, gap: constraint.gap }); self.nodeToRelativeConstraintMapHorizontal.get(nodeIdRight).push({ left: nodeIdLeft, gap: constraint.gap }); } else { var nodeIdTop = nodeToDummyForHorizontalAlignment.has(constraint.top) ? nodeToDummyForHorizontalAlignment.get(constraint.top) : constraint.top; var nodeIdBottom = nodeToDummyForHorizontalAlignment.has(constraint.bottom) ? nodeToDummyForHorizontalAlignment.get(constraint.bottom) : constraint.bottom; if (!self.nodesInRelativeVertical.includes(nodeIdTop)) { self.nodesInRelativeVertical.push(nodeIdTop); self.nodeToRelativeConstraintMapVertical.set(nodeIdTop, []); if (self.dummyToNodeForHorizontalAlignment.has(nodeIdTop)) { self.nodeToTempPositionMapVertical.set(nodeIdTop, self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeIdTop)[0]).getCenterY()); } else { self.nodeToTempPositionMapVertical.set(nodeIdTop, self.idToNodeMap.get(nodeIdTop).getCenterY()); } } if (!self.nodesInRelativeVertical.includes(nodeIdBottom)) { self.nodesInRelativeVertical.push(nodeIdBottom); self.nodeToRelativeConstraintMapVertical.set(nodeIdBottom, []); if (self.dummyToNodeForHorizontalAlignment.has(nodeIdBottom)) { self.nodeToTempPositionMapVertical.set(nodeIdBottom, self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeIdBottom)[0]).getCenterY()); } else { self.nodeToTempPositionMapVertical.set(nodeIdBottom, self.idToNodeMap.get(nodeIdBottom).getCenterY()); } } self.nodeToRelativeConstraintMapVertical.get(nodeIdTop).push({ bottom: nodeIdBottom, gap: constraint.gap }); self.nodeToRelativeConstraintMapVertical.get(nodeIdBottom).push({ top: nodeIdTop, gap: constraint.gap }); } }); } else { var subGraphOnHorizontal = new Map(); // subgraph from vertical RP constraints var subGraphOnVertical = new Map(); // subgraph from vertical RP constraints // construct subgraphs from relative placement constraints this.constraints.relativePlacementConstraint.forEach(function (constraint) { if (constraint.left) { var left = nodeToDummyForVerticalAlignment.has(constraint.left) ? nodeToDummyForVerticalAlignment.get(constraint.left) : constraint.left; var right = nodeToDummyForVerticalAlignment.has(constraint.right) ? nodeToDummyForVerticalAlignment.get(constraint.right) : constraint.right; if (subGraphOnHorizontal.has(left)) { subGraphOnHorizontal.get(left).push(right); } else { subGraphOnHorizontal.set(left, [right]); } if (subGraphOnHorizontal.has(right)) { subGraphOnHorizontal.get(right).push(left); } else { subGraphOnHorizontal.set(right, [left]); } } else { var top = nodeToDummyForHorizontalAlignment.has(constraint.top) ? nodeToDummyForHorizontalAlignment.get(constraint.top) : constraint.top; var bottom = nodeToDummyForHorizontalAlignment.has(constraint.bottom) ? nodeToDummyForHorizontalAlignment.get(constraint.bottom) : constraint.bottom; if (subGraphOnVertical.has(top)) { subGraphOnVertical.get(top).push(bottom); } else { subGraphOnVertical.set(top, [bottom]); } if (subGraphOnVertical.has(bottom)) { subGraphOnVertical.get(bottom).push(top); } else { subGraphOnVertical.set(bottom, [top]); } } }); // function to construct components from a given graph // also returns an array that keeps whether each component contains fixed node var constructComponents = function constructComponents(graph, fixedNodes) { var components = []; var isFixed = []; var queue = new LinkedList(); var visited = new Set(); var count = 0; graph.forEach(function (value, key) { if (!visited.has(key)) { components[count] = []; isFixed[count] = false; var currentNode = key; queue.push(currentNode); visited.add(currentNode); components[count].push(currentNode); while (queue.length != 0) { currentNode = queue.shift(); if (fixedNodes.has(currentNode)) { isFixed[count] = true; } var neighbors = graph.get(currentNode); neighbors.forEach(function (neighbor) { if (!visited.has(neighbor)) { queue.push(neighbor); visited.add(neighbor); components[count].push(neighbor); } }); } count++; } }); return { components: components, isFixed: isFixed }; }; var resultOnHorizontal = constructComponents(subGraphOnHorizontal, self.fixedNodesOnHorizontal); this.componentsOnHorizontal = resultOnHorizontal.components; this.fixedComponentsOnHorizontal = resultOnHorizontal.isFixed; var resultOnVertical = constructComponents(subGraphOnVertical, self.fixedNodesOnVertical); this.componentsOnVertical = resultOnVertical.components; this.fixedComponentsOnVertical = resultOnVertical.isFixed; } } }; // updates node displacements based on constraints CoSELayout.prototype.updateDisplacements = function () { var self = this; if (this.constraints.fixedNodeConstraint) { this.constraints.fixedNodeConstraint.forEach(function (nodeData) { var fixedNode = self.idToNodeMap.get(nodeData.nodeId); fixedNode.displacementX = 0; fixedNode.displacementY = 0; }); } if (this.constraints.alignmentConstraint) { if (this.constraints.alignmentConstraint.vertical) { var allVerticalAlignments = this.constraints.alignmentConstraint.vertical; for (var i = 0; i < allVerticalAlignments.length; i++) { var totalDisplacementX = 0; for (var j = 0; j < allVerticalAlignments[i].length; j++) { if (this.fixedNodeSet.has(allVerticalAlignments[i][j])) { totalDisplacementX = 0; break; } totalDisplacementX += this.idToNodeMap.get(allVerticalAlignments[i][j]).displacementX; } var averageDisplacementX = totalDisplacementX / allVerticalAlignments[i].length; for (var j = 0; j < allVerticalAlignments[i].length; j++) { this.idToNodeMap.get(allVerticalAlignments[i][j]).displacementX = averageDisplacementX; } } } if (this.constraints.alignmentConstraint.horizontal) { var allHorizontalAlignments = this.constraints.alignmentConstraint.horizontal; for (var i = 0; i < allHorizontalAlignments.length; i++) { var totalDisplacementY = 0; for (var j = 0; j < allHorizontalAlignments[i].length; j++) { if (this.fixedNodeSet.has(allHorizontalAlignments[i][j])) { totalDisplacementY = 0; break; } totalDisplacementY += this.idToNodeMap.get(allHorizontalAlignments[i][j]).displacementY; } var averageDisplacementY = totalDisplacementY / allHorizontalAlignments[i].length; for (var j = 0; j < allHorizontalAlignments[i].length; j++) { this.idToNodeMap.get(allHorizontalAlignments[i][j]).displacementY = averageDisplacementY; } } } } if (this.constraints.relativePlacementConstraint) { if (CoSEConstants.RELAX_MOVEMENT_ON_CONSTRAINTS) { // shuffle array to randomize node processing order if (this.totalIterations % 10 == 0) { this.shuffle(this.nodesInRelativeHorizontal); this.shuffle(this.nodesInRelativeVertical); } this.nodesInRelativeHorizontal.forEach(function (nodeId) { if (!self.fixedNodesOnHorizontal.has(nodeId)) { var displacement = 0; if (self.dummyToNodeForVerticalAlignment.has(nodeId)) { displacement = self.idToNodeMap.get(self.dummyToNodeForVerticalAlignment.get(nodeId)[0]).displacementX; } else { displacement = self.idToNodeMap.get(nodeId).displacementX; } self.nodeToRelativeConstraintMapHorizontal.get(nodeId).forEach(function (constraint) { if (constraint.right) { var diff = self.nodeToTempPositionMapHorizontal.get(constraint.right) - self.nodeToTempPositionMapHorizontal.get(nodeId) - displacement; if (diff < constraint.gap) { displacement -= constraint.gap - diff; } } else { var diff = self.nodeToTempPositionMapHorizontal.get(nodeId) - self.nodeToTempPositionMapHorizontal.get(constraint.left) + displacement; if (diff < constraint.gap) { displacement += constraint.gap - diff; } } }); self.nodeToTempPositionMapHorizontal.set(nodeId, self.nodeToTempPositionMapHorizontal.get(nodeId) + displacement); if (self.dummyToNodeForVerticalAlignment.has(nodeId)) { self.dummyToNodeForVerticalAlignment.get(nodeId).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementX = displacement; }); } else { self.idToNodeMap.get(nodeId).displacementX = displacement; } } }); this.nodesInRelativeVertical.forEach(function (nodeId) { if (!self.fixedNodesOnHorizontal.has(nodeId)) { var displacement = 0; if (self.dummyToNodeForHorizontalAlignment.has(nodeId)) { displacement = self.idToNodeMap.get(self.dummyToNodeForHorizontalAlignment.get(nodeId)[0]).displacementY; } else { displacement = self.idToNodeMap.get(nodeId).displacementY; } self.nodeToRelativeConstraintMapVertical.get(nodeId).forEach(function (constraint) { if (constraint.bottom) { var diff = self.nodeToTempPositionMapVertical.get(constraint.bottom) - self.nodeToTempPositionMapVertical.get(nodeId) - displacement; if (diff < constraint.gap) { displacement -= constraint.gap - diff; } } else { var diff = self.nodeToTempPositionMapVertical.get(nodeId) - self.nodeToTempPositionMapVertical.get(constraint.top) + displacement; if (diff < constraint.gap) { displacement += constraint.gap - diff; } } }); self.nodeToTempPositionMapVertical.set(nodeId, self.nodeToTempPositionMapVertical.get(nodeId) + displacement); if (self.dummyToNodeForHorizontalAlignment.has(nodeId)) { self.dummyToNodeForHorizontalAlignment.get(nodeId).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementY = displacement; }); } else { self.idToNodeMap.get(nodeId).displacementY = displacement; } } }); } else { for (var i = 0; i < this.componentsOnHorizontal.length; i++) { var component = this.componentsOnHorizontal[i]; if (this.fixedComponentsOnHorizontal[i]) { for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForVerticalAlignment.has(component[j])) { this.dummyToNodeForVerticalAlignment.get(component[j]).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementX = 0; }); } else { this.idToNodeMap.get(component[j]).displacementX = 0; } } } else { var sum = 0; var count = 0; for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForVerticalAlignment.has(component[j])) { var actualNodes = this.dummyToNodeForVerticalAlignment.get(component[j]); sum += actualNodes.length * this.idToNodeMap.get(actualNodes[0]).displacementX; count += actualNodes.length; } else { sum += this.idToNodeMap.get(component[j]).displacementX; count++; } } var averageDisplacement = sum / count; for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForVerticalAlignment.has(component[j])) { this.dummyToNodeForVerticalAlignment.get(component[j]).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementX = averageDisplacement; }); } else { this.idToNodeMap.get(component[j]).displacementX = averageDisplacement; } } } } for (var i = 0; i < this.componentsOnVertical.length; i++) { var component = this.componentsOnVertical[i]; if (this.fixedComponentsOnVertical[i]) { for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForHorizontalAlignment.has(component[j])) { this.dummyToNodeForHorizontalAlignment.get(component[j]).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementY = 0; }); } else { this.idToNodeMap.get(component[j]).displacementY = 0; } } } else { var sum = 0; var count = 0; for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForHorizontalAlignment.has(component[j])) { var actualNodes = this.dummyToNodeForHorizontalAlignment.get(component[j]); sum += actualNodes.length * this.idToNodeMap.get(actualNodes[0]).displacementY; count += actualNodes.length; } else { sum += this.idToNodeMap.get(component[j]).displacementY; count++; } } var averageDisplacement = sum / count; for (var j = 0; j < component.length; j++) { if (this.dummyToNodeForHorizontalAlignment.has(component[j])) { this.dummyToNodeForHorizontalAlignment.get(component[j]).forEach(function (nodeId) { self.idToNodeMap.get(nodeId).displacementY = averageDisplacement; }); } else { this.idToNodeMap.get(component[j]).displacementY = averageDisplacement; } } } } } } }; CoSELayout.prototype.calculateNodesToApplyGravitationTo = function () { var nodeList = []; var graph; var graphs = this.graphManager.getGraphs(); var size = graphs.length; var i; for (i = 0; i < size; i++) { graph = graphs[i]; graph.updateConnected(); if (!graph.isConnected) { nodeList = nodeList.concat(graph.getNodes()); } } return nodeList; }; CoSELayout.prototype.createBendpoints = function () { var edges = []; edges = edges.concat(this.graphManager.getAllEdges()); var visited = new Set(); var i; for (i = 0; i < edges.length; i++) { var edge = edges[i]; if (!visited.has(edge)) { var source = edge.getSource(); var target = edge.getTarget(); if (source == target) { edge.getBendpoints().push(new PointD()); edge.getBendpoints().push(new PointD()); this.createDummyNodesForBendpoints(edge); visited.add(edge); } else { var edgeList = []; edgeList = edgeList.concat(source.getEdgeListToNode(target)); edgeList = edgeList.concat(target.getEdgeListToNode(source)); if (!visited.has(edgeList[0])) { if (edgeList.length > 1) { var k; for (k = 0; k < edgeList.length; k++) { var multiEdge = edgeList[k]; multiEdge.getBendpoints().push(new PointD()); this.createDummyNodesForBendpoints(multiEdge); } } edgeList.forEach(function (edge) { visited.add(edge); }); } } } if (visited.size == edges.length) { break; } } }; CoSELayout.prototype.positionNodesRadially = function (forest) { // We tile the trees to a grid row by row; first tree starts at (0,0) var currentStartingPoint = new Point(0, 0); var numberOfColumns = Math.ceil(Math.sqrt(forest.length)); var height = 0; var currentY = 0; var currentX = 0; var point = new PointD(0, 0); for (var i = 0; i < forest.length; i++) { if (i % numberOfColumns == 0) { // Start of a new row, make the x coordinate 0, increment the // y coordinate with the max height of the previous row currentX = 0; currentY = height; if (i != 0) { currentY += CoSEConstants.DEFAULT_COMPONENT_SEPERATION; } height = 0; } var tree = forest[i]; // Find the center of the tree var centerNode = Layout.findCenterOfTree(tree); // Set the staring point of the next tree currentStartingPoint.x = currentX; currentStartingPoint.y = currentY; // Do a radial layout starting with the center point = CoSELayout.radialLayout(tree, centerNode, currentStartingPoint); if (point.y > height) { height = Math.floor(point.y); } currentX = Math.floor(point.x + CoSEConstants.DEFAULT_COMPONENT_SEPERATION); } this.transform(new PointD(LayoutConstants.WORLD_CENTER_X - point.x / 2, LayoutConstants.WORLD_CENTER_Y - point.y / 2)); }; CoSELayout.radialLayout = function (tree, centerNode, startingPoint) { var radialSep = Math.max(this.maxDiagonalInTree(tree), CoSEConstants.DEFAULT_RADIAL_SEPARATION); CoSELayout.branchRadialLayout(centerNode, null, 0, 359, 0, radialSep); var bounds = LGraph.calculateBounds(tree); var transform = new Transform(); transform.setDeviceOrgX(bounds.getMinX()); transform.setDeviceOrgY(bounds.getMinY()); transform.setWorldOrgX(startingPoint.x); transform.setWorldOrgY(startingPoint.y); for (var i = 0; i < tree.length; i++) { var node = tree[i]; node.transform(transform); } var bottomRight = new PointD(bounds.getMaxX(), bounds.getMaxY()); return transform.inverseTransformPoint(bottomRight); }; CoSELayout.branchRadialLayout = function (node, parentOfNode, startAngle, endAngle, distance, radialSeparation) { // First, position this node by finding its angle. var halfInterval = (endAngle - startAngle + 1) / 2; if (halfInterval < 0) { halfInterval += 180; } var nodeAngle = (halfInterval + startAngle) % 360; var teta = nodeAngle * IGeometry.TWO_PI / 360; // Make polar to java cordinate conversion. var cos_teta = Math.cos(teta); var x_ = distance * Math.cos(teta); var y_ = distance * Math.sin(teta); node.setCenter(x_, y_); // Traverse all neighbors of this node and recursively call this // function. var neighborEdges = []; neighborEdges = neighborEdges.concat(node.getEdges()); var childCount = neighborEdges.length; if (parentOfNode != null) { childCount--; } var branchCount = 0; var incEdgesCount = neighborEdges.length; var startIndex; var edges = node.getEdgesBetween(parentOfNode); // If there are multiple edges, prune them until there remains only one // edge. while (edges.length > 1) { //neighborEdges.remove(edges.remove(0)); var temp = edges[0]; edges.splice(0, 1); var index = neighborEdges.indexOf(temp); if (index >= 0) { neighborEdges.splice(index, 1); } incEdgesCount--; childCount--; } if (parentOfNode != null) { //assert edges.length == 1; startIndex = (neighborEdges.indexOf(edges[0]) + 1) % incEdgesCount; } else { startIndex = 0; } var stepAngle = Math.abs(endAngle - startAngle) / childCount; for (var i = startIndex; branchCount != childCount; i = ++i % incEdgesCount) { var currentNeighbor = neighborEdges[i].getOtherEnd(node); // Don't back traverse to root node in current tree. if (currentNeighbor == parentOfNode) { continue; } var childStartAngle = (startAngle + branchCount * stepAngle) % 360; var childEndAngle = (childStartAngle + stepAngle) % 360; CoSELayout.branchRadialLayout(currentNeighbor, node, childStartAngle, childEndAngle, distance + radialSeparation, radialSeparation); branchCount++; } }; CoSELayout.maxDiagonalInTree = function (tree) { var maxDiagonal = Integer.MIN_VALUE; for (var i = 0; i < tree.length; i++) { var node = tree[i]; var diagonal = node.getDiagonal(); if (diagonal > maxDiagonal) { maxDiagonal = diagonal; } } return maxDiagonal; }; CoSELayout.prototype.calcRepulsionRange = function () { // formula is 2 x (level + 1) x idealEdgeLength return 2 * (this.level + 1) * this.idealEdgeLength; }; // Tiling methods // Group zero degree members whose parents are not to be tiled, create dummy parents where needed and fill memberGroups by their dummp parent id's CoSELayout.prototype.groupZeroDegreeMembers = function () { var self = this; // array of [parent_id x oneDegreeNode_id] var tempMemberGroups = {}; // A temporary map of parent node and its zero degree members this.memberGroups = {}; // A map of dummy parent node and its zero degree members whose parents are not to be tiled this.idToDummyNode = {}; // A map of id to dummy node var zeroDegree = []; // List of zero degree nodes whose parents are not to be tiled var allNodes = this.graphManager.getAllNodes(); // Fill zero degree list for (var i = 0; i < allNodes.length; i++) { var node = allNodes[i]; var parent = node.getParent(); // If a node has zero degree and its parent is not to be tiled if exists add that node to zeroDegres list if (this.getNodeDegreeWithChildren(node) === 0 && (parent.id == undefined || !this.getToBeTiled(parent))) { zeroDegree.push(node); } } // Create a map of parent node and its zero degree members for (var i = 0; i < zeroDegree.length; i++) { var node = zeroDegree[i]; // Zero degree node itself var p_id = node.getParent().id; // Parent id if (typeof tempMemberGroups[p_id] === "undefined") tempMemberGroups[p_id] = []; tempMemberGroups[p_id] = tempMemberGroups[p_id].concat(node); // Push node to the list belongs to its parent in tempMemberGroups } // If there are at least two nodes at a level, create a dummy compound for them Object.keys(tempMemberGroups).forEach(function (p_id) { if (tempMemberGroups[p_id].length > 1) { var dummyCompoundId = "DummyCompound_" + p_id; // The id of dummy compound which will be created soon self.memberGroups[dummyCompoundId] = tempMemberGroups[p_id]; // Add dummy compound to memberGroups var parent = tempMemberGroups[p_id][0].getParent(); // The parent of zero degree nodes will be the parent of new dummy compound // Create a dummy compound with calculated id var dummyCompound = new CoSENode(self.graphManager); dummyCompound.id = dummyCompoundId; dummyCompound.paddingLeft = parent.paddingLeft || 0; dummyCompound.paddingRight = parent.paddingRight || 0; dummyCompound.paddingBottom = parent.paddingBottom || 0; dummyCompound.paddingTop = parent.paddingTop || 0; self.idToDummyNode[dummyCompoundId] = dummyCompound; var dummyParentGraph = self.getGraphManager().add(self.newGraph(), dummyCompound); var parentGraph = parent.getChild(); // Add dummy compound to parent the graph parentGraph.add(dummyCompound); // For each zero degree node in this level remove it from its parent graph and add it to the graph of dummy parent for (var i = 0; i < tempMemberGroups[p_id].length; i++) { var node = tempMemberGroups[p_id][i]; parentGraph.remove(node); dummyParentGraph.add(node); } } }); }; CoSELayout.prototype.clearCompounds = function () { var childGraphMap = {}; var idToNode = {}; // Get compound ordering by finding the inner one first this.performDFSOnCompounds(); for (var i = 0; i < this.compoundOrder.length; i++) { idToNode[this.compoundOrder[i].id] = this.compoundOrder[i]; childGraphMap[this.compoundOrder[i].id] = [].concat(this.compoundOrder[i].getChild().getNodes()); // Remove children of compounds this.graphManager.remove(this.compoundOrder[i].getChild()); this.compoundOrder[i].child = null; } this.graphManager.resetAllNodes(); // Tile the removed children this.tileCompoundMembers(childGraphMap, idToNode); }; CoSELayout.prototype.clearZeroDegreeMembers = function () { var self = this; var tiledZeroDegreePack = this.tiledZeroDegreePack = []; Object.keys(this.memberGroups).forEach(function (id) { var compoundNode = self.idToDummyNode[id]; // Get the dummy compound tiledZeroDegreePack[id] = self.tileNodes(self.memberGroups[id], compoundNode.paddingLeft + compoundNode.paddingRight); // Set the width and height of the dummy compound as calculated compoundNode.rect.width = tiledZeroDegreePack[id].width; compoundNode.rect.height = tiledZeroDegreePack[id].height; compoundNode.setCenter(tiledZeroDegreePack[id].centerX, tiledZeroDegreePack[id].centerY); // compound left and top margings for labels // when node labels are included, these values may be set to different values below and are used in tilingPostLayout, // otherwise they stay as zero compoundNode.labelMarginLeft = 0; compoundNode.labelMarginTop = 0; // Update compound bounds considering its label properties and set label margins for left and top if (CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { var width = compoundNode.rect.width; var height = compoundNode.rect.height; if (compoundNode.labelWidth) { if (compoundNode.labelPosHorizontal == "left") { compoundNode.rect.x -= compoundNode.labelWidth; compoundNode.setWidth(width + compoundNode.labelWidth); compoundNode.labelMarginLeft = compoundNode.labelWidth; } else if (compoundNode.labelPosHorizontal == "center" && compoundNode.labelWidth > width) { compoundNode.rect.x -= (compoundNode.labelWidth - width) / 2; compoundNode.setWidth(compoundNode.labelWidth); compoundNode.labelMarginLeft = (compoundNode.labelWidth - width) / 2; } else if (compoundNode.labelPosHorizontal == "right") { compoundNode.setWidth(width + compoundNode.labelWidth); } } if (compoundNode.labelHeight) { if (compoundNode.labelPosVertical == "top") { compoundNode.rect.y -= compoundNode.labelHeight; compoundNode.setHeight(height + compoundNode.labelHeight); compoundNode.labelMarginTop = compoundNode.labelHeight; } else if (compoundNode.labelPosVertical == "center" && compoundNode.labelHeight > height) { compoundNode.rect.y -= (compoundNode.labelHeight - height) / 2; compoundNode.setHeight(compoundNode.labelHeight); compoundNode.labelMarginTop = (compoundNode.labelHeight - height) / 2; } else if (compoundNode.labelPosVertical == "bottom") { compoundNode.setHeight(height + compoundNode.labelHeight); } } } }); }; CoSELayout.prototype.repopulateCompounds = function () { for (var i = this.compoundOrder.length - 1; i >= 0; i--) { var lCompoundNode = this.compoundOrder[i]; var id = lCompoundNode.id; var horizontalMargin = lCompoundNode.paddingLeft; var verticalMargin = lCompoundNode.paddingTop; var labelMarginLeft = lCompoundNode.labelMarginLeft; var labelMarginTop = lCompoundNode.labelMarginTop; this.adjustLocations(this.tiledMemberPack[id], lCompoundNode.rect.x, lCompoundNode.rect.y, horizontalMargin, verticalMargin, labelMarginLeft, labelMarginTop); } }; CoSELayout.prototype.repopulateZeroDegreeMembers = function () { var self = this; var tiledPack = this.tiledZeroDegreePack; Object.keys(tiledPack).forEach(function (id) { var compoundNode = self.idToDummyNode[id]; // Get the dummy compound by its id var horizontalMargin = compoundNode.paddingLeft; var verticalMargin = compoundNode.paddingTop; var labelMarginLeft = compoundNode.labelMarginLeft; var labelMarginTop = compoundNode.labelMarginTop; // Adjust the positions of nodes wrt its compound self.adjustLocations(tiledPack[id], compoundNode.rect.x, compoundNode.rect.y, horizontalMargin, verticalMargin, labelMarginLeft, labelMarginTop); }); }; CoSELayout.prototype.getToBeTiled = function (node) { var id = node.id; //firstly check the previous results if (this.toBeTiled[id] != null) { return this.toBeTiled[id]; } //only compound nodes are to be tiled var childGraph = node.getChild(); if (childGraph == null) { this.toBeTiled[id] = false; return false; } var children = childGraph.getNodes(); // Get the children nodes //a compound node is not to be tiled if all of its compound children are not to be tiled for (var i = 0; i < children.length; i++) { var theChild = children[i]; if (this.getNodeDegree(theChild) > 0) { this.toBeTiled[id] = false; return false; } //pass the children not having the compound structure if (theChild.getChild() == null) { this.toBeTiled[theChild.id] = false; continue; } if (!this.getToBeTiled(theChild)) { this.toBeTiled[id] = false; return false; } } this.toBeTiled[id] = true; return true; }; // Get degree of a node depending of its edges and independent of its children CoSELayout.prototype.getNodeDegree = function (node) { var id = node.id; var edges = node.getEdges(); var degree = 0; // For the edges connected for (var i = 0; i < edges.length; i++) { var edge = edges[i]; if (edge.getSource().id !== edge.getTarget().id) { degree = degree + 1; } } return degree; }; // Get degree of a node with its children CoSELayout.prototype.getNodeDegreeWithChildren = function (node) { var degree = this.getNodeDegree(node); if (node.getChild() == null) { return degree; } var children = node.getChild().getNodes(); for (var i = 0; i < children.length; i++) { var child = children[i]; degree += this.getNodeDegreeWithChildren(child); } return degree; }; CoSELayout.prototype.performDFSOnCompounds = function () { this.compoundOrder = []; this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes()); }; CoSELayout.prototype.fillCompexOrderByDFS = function (children) { for (var i = 0; i < children.length; i++) { var child = children[i]; if (child.getChild() != null) { this.fillCompexOrderByDFS(child.getChild().getNodes()); } if (this.getToBeTiled(child)) { this.compoundOrder.push(child); } } }; /** * This method places each zero degree member wrt given (x,y) coordinates (top left). */ CoSELayout.prototype.adjustLocations = function (organization, x, y, compoundHorizontalMargin, compoundVerticalMargin, compoundLabelMarginLeft, compoundLabelMarginTop) { x += compoundHorizontalMargin + compoundLabelMarginLeft; y += compoundVerticalMargin + compoundLabelMarginTop; var left = x; for (var i = 0; i < organization.rows.length; i++) { var row = organization.rows[i]; x = left; var maxHeight = 0; for (var j = 0; j < row.length; j++) { var lnode = row[j]; lnode.rect.x = x; // + lnode.rect.width / 2; lnode.rect.y = y; // + lnode.rect.height / 2; x += lnode.rect.width + organization.horizontalPadding; if (lnode.rect.height > maxHeight) maxHeight = lnode.rect.height; } y += maxHeight + organization.verticalPadding; } }; CoSELayout.prototype.tileCompoundMembers = function (childGraphMap, idToNode) { var self = this; this.tiledMemberPack = []; Object.keys(childGraphMap).forEach(function (id) { // Get the compound node var compoundNode = idToNode[id]; self.tiledMemberPack[id] = self.tileNodes(childGraphMap[id], compoundNode.paddingLeft + compoundNode.paddingRight); compoundNode.rect.width = self.tiledMemberPack[id].width; compoundNode.rect.height = self.tiledMemberPack[id].height; compoundNode.setCenter(self.tiledMemberPack[id].centerX, self.tiledMemberPack[id].centerY); // compound left and top margings for labels // when node labels are included, these values may be set to different values below and are used in tilingPostLayout, // otherwise they stay as zero compoundNode.labelMarginLeft = 0; compoundNode.labelMarginTop = 0; // Update compound bounds considering its label properties and set label margins for left and top if (CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { var width = compoundNode.rect.width; var height = compoundNode.rect.height; if (compoundNode.labelWidth) { if (compoundNode.labelPosHorizontal == "left") { compoundNode.rect.x -= compoundNode.labelWidth; compoundNode.setWidth(width + compoundNode.labelWidth); compoundNode.labelMarginLeft = compoundNode.labelWidth; } else if (compoundNode.labelPosHorizontal == "center" && compoundNode.labelWidth > width) { compoundNode.rect.x -= (compoundNode.labelWidth - width) / 2; compoundNode.setWidth(compoundNode.labelWidth); compoundNode.labelMarginLeft = (compoundNode.labelWidth - width) / 2; } else if (compoundNode.labelPosHorizontal == "right") { compoundNode.setWidth(width + compoundNode.labelWidth); } } if (compoundNode.labelHeight) { if (compoundNode.labelPosVertical == "top") { compoundNode.rect.y -= compoundNode.labelHeight; compoundNode.setHeight(height + compoundNode.labelHeight); compoundNode.labelMarginTop = compoundNode.labelHeight; } else if (compoundNode.labelPosVertical == "center" && compoundNode.labelHeight > height) { compoundNode.rect.y -= (compoundNode.labelHeight - height) / 2; compoundNode.setHeight(compoundNode.labelHeight); compoundNode.labelMarginTop = (compoundNode.labelHeight - height) / 2; } else if (compoundNode.labelPosVertical == "bottom") { compoundNode.setHeight(height + compoundNode.labelHeight); } } } }); }; CoSELayout.prototype.tileNodes = function (nodes, minWidth) { var horizontalOrg = this.tileNodesByFavoringDim(nodes, minWidth, true); var verticalOrg = this.tileNodesByFavoringDim(nodes, minWidth, false); var horizontalRatio = this.getOrgRatio(horizontalOrg); var verticalRatio = this.getOrgRatio(verticalOrg); var bestOrg; // the best ratio is the one that is closer to 1 since the ratios are already normalized // and the best organization is the one that has the best ratio if (verticalRatio < horizontalRatio) { bestOrg = verticalOrg; } else { bestOrg = horizontalOrg; } return bestOrg; }; // get the width/height ratio of the organization that is normalized so that it will not be less than 1 CoSELayout.prototype.getOrgRatio = function (organization) { // get dimensions and calculate the initial ratio var width = organization.width; var height = organization.height; var ratio = width / height; // if the initial ratio is less then 1 then inverse it if (ratio < 1) { ratio = 1 / ratio; } // return the normalized ratio return ratio; }; /* * Calculates the ideal width for the rows. This method assumes that * each node has the same sizes and calculates the ideal row width that * approximates a square shaped complex accordingly. However, since nodes would * have different sizes some rows would have different sizes and the resulting * shape would not be an exact square. */ CoSELayout.prototype.calcIdealRowWidth = function (members, favorHorizontalDim) { // To approximate a square shaped complex we need to make complex width equal to complex height. // To achieve this we need to solve the following equation system for hc: // (x + bx) * hc - bx = (y + by) * vc - by, hc * vc = n // where x is the avarage width of the nodes, y is the avarage height of nodes // bx and by are the buffer sizes in horizontal and vertical dimensions accordingly, // hc and vc are the number of rows in horizontal and vertical dimensions // n is number of members. var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL; var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL; // number of members var membersSize = members.length; // sum of the width of all members var totalWidth = 0; // sum of the height of all members var totalHeight = 0; var maxWidth = 0; // traverse all members to calculate total width and total height and get the maximum members width members.forEach(function (node) { totalWidth += node.getWidth(); totalHeight += node.getHeight(); if (node.getWidth() > maxWidth) { maxWidth = node.getWidth(); } }); // average width of the members var averageWidth = totalWidth / membersSize; // average height of the members var averageHeight = totalHeight / membersSize; // solving the initial equation system for the hc yields the following second degree equation: // hc^2 * (x+bx) + hc * (by - bx) - n * (y + by) = 0 // the delta value to solve the equation above for hc var delta = Math.pow(verticalPadding - horizontalPadding, 2) + 4 * (averageWidth + horizontalPadding) * (averageHeight + verticalPadding) * membersSize; // solve the equation using delta value to calculate the horizontal count // that represents the number of nodes in an ideal row var horizontalCountDouble = (horizontalPadding - verticalPadding + Math.sqrt(delta)) / (2 * (averageWidth + horizontalPadding)); // round the calculated horizontal count up or down according to the favored dimension var horizontalCount; if (favorHorizontalDim) { horizontalCount = Math.ceil(horizontalCountDouble); // if horizontalCount count is not a float value then both of rounding to floor and ceil // will yield the same values. Instead of repeating the same calculation try going up // while favoring horizontal dimension in such cases if (horizontalCount == horizontalCountDouble) { horizontalCount++; } } else { horizontalCount = Math.floor(horizontalCountDouble); } // ideal width to be calculated var idealWidth = horizontalCount * (averageWidth + horizontalPadding) - horizontalPadding; // if max width is bigger than calculated ideal width reset ideal width to it if (maxWidth > idealWidth) { idealWidth = maxWidth; } // add the left-right margins to the ideal row width idealWidth += horizontalPadding * 2; // return the ideal row width1 return idealWidth; }; CoSELayout.prototype.tileNodesByFavoringDim = function (nodes, minWidth, favorHorizontalDim) { var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL; var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL; var tilingCompareBy = CoSEConstants.TILING_COMPARE_BY; var organization = { rows: [], rowWidth: [], rowHeight: [], width: 0, height: minWidth, // assume minHeight equals to minWidth verticalPadding: verticalPadding, horizontalPadding: horizontalPadding, centerX: 0, centerY: 0 }; if (tilingCompareBy) { organization.idealRowWidth = this.calcIdealRowWidth(nodes, favorHorizontalDim); } var getNodeArea = function getNodeArea(n) { return n.rect.width * n.rect.height; }; var areaCompareFcn = function areaCompareFcn(n1, n2) { return getNodeArea(n2) - getNodeArea(n1); }; // Sort the nodes in descending order of their areas nodes.sort(function (n1, n2) { var cmpBy = areaCompareFcn; if (organization.idealRowWidth) { cmpBy = tilingCompareBy; return cmpBy(n1.id, n2.id); } return cmpBy(n1, n2); }); // Create the organization -> calculate compound center var sumCenterX = 0; var sumCenterY = 0; for (var i = 0; i < nodes.length; i++) { var lNode = nodes[i]; sumCenterX += lNode.getCenterX(); sumCenterY += lNode.getCenterY(); } organization.centerX = sumCenterX / nodes.length; organization.centerY = sumCenterY / nodes.length; // Create the organization -> tile members for (var i = 0; i < nodes.length; i++) { var lNode = nodes[i]; if (organization.rows.length == 0) { this.insertNodeToRow(organization, lNode, 0, minWidth); } else if (this.canAddHorizontal(organization, lNode.rect.width, lNode.rect.height)) { var rowIndex = organization.rows.length - 1; if (!organization.idealRowWidth) { rowIndex = this.getShortestRowIndex(organization); } this.insertNodeToRow(organization, lNode, rowIndex, minWidth); } else { this.insertNodeToRow(organization, lNode, organization.rows.length, minWidth); } this.shiftToLastRow(organization); } return organization; }; CoSELayout.prototype.insertNodeToRow = function (organization, node, rowIndex, minWidth) { var minCompoundSize = minWidth; // Add new row if needed if (rowIndex == organization.rows.length) { var secondDimension = []; organization.rows.push(secondDimension); organization.rowWidth.push(minCompoundSize); organization.rowHeight.push(0); } // Update row width var w = organization.rowWidth[rowIndex] + node.rect.width; if (organization.rows[rowIndex].length > 0) { w += organization.horizontalPadding; } organization.rowWidth[rowIndex] = w; // Update compound width if (organization.width < w) { organization.width = w; } // Update height var h = node.rect.height; if (rowIndex > 0) h += organization.verticalPadding; var extraHeight = 0; if (h > organization.rowHeight[rowIndex]) { extraHeight = organization.rowHeight[rowIndex]; organization.rowHeight[rowIndex] = h; extraHeight = organization.rowHeight[rowIndex] - extraHeight; } organization.height += extraHeight; // Insert node organization.rows[rowIndex].push(node); }; //Scans the rows of an organization and returns the one with the min width CoSELayout.prototype.getShortestRowIndex = function (organization) { var r = -1; var min = Number.MAX_VALUE; for (var i = 0; i < organization.rows.length; i++) { if (organization.rowWidth[i] < min) { r = i; min = organization.rowWidth[i]; } } return r; }; //Scans the rows of an organization and returns the one with the max width CoSELayout.prototype.getLongestRowIndex = function (organization) { var r = -1; var max = Number.MIN_VALUE; for (var i = 0; i < organization.rows.length; i++) { if (organization.rowWidth[i] > max) { r = i; max = organization.rowWidth[i]; } } return r; }; /** * This method checks whether adding extra width to the organization violates * the aspect ratio(1) or not. */ CoSELayout.prototype.canAddHorizontal = function (organization, extraWidth, extraHeight) { // if there is an ideal row width specified use it instead of checking the aspect ratio if (organization.idealRowWidth) { var lastRowIndex = organization.rows.length - 1; var lastRowWidth = organization.rowWidth[lastRowIndex]; // check and return if ideal row width will be exceed if the node is added to the row return lastRowWidth + extraWidth + organization.horizontalPadding <= organization.idealRowWidth; } var sri = this.getShortestRowIndex(organization); if (sri < 0) { return true; } var min = organization.rowWidth[sri]; if (min + organization.horizontalPadding + extraWidth <= organization.width) return true; var hDiff = 0; // Adding to an existing row if (organization.rowHeight[sri] < extraHeight) { if (sri > 0) hDiff = extraHeight + organization.verticalPadding - organization.rowHeight[sri]; } var add_to_row_ratio; if (organization.width - min >= extraWidth + organization.horizontalPadding) { add_to_row_ratio = (organization.height + hDiff) / (min + extraWidth + organization.horizontalPadding); } else { add_to_row_ratio = (organization.height + hDiff) / organization.width; } // Adding a new row for this node hDiff = extraHeight + organization.verticalPadding; var add_new_row_ratio; if (organization.width < extraWidth) { add_new_row_ratio = (organization.height + hDiff) / extraWidth; } else { add_new_row_ratio = (organization.height + hDiff) / organization.width; } if (add_new_row_ratio < 1) add_new_row_ratio = 1 / add_new_row_ratio; if (add_to_row_ratio < 1) add_to_row_ratio = 1 / add_to_row_ratio; return add_to_row_ratio < add_new_row_ratio; }; //If moving the last node from the longest row and adding it to the last //row makes the bounding box smaller, do it. CoSELayout.prototype.shiftToLastRow = function (organization) { var longest = this.getLongestRowIndex(organization); var last = organization.rowWidth.length - 1; var row = organization.rows[longest]; var node = row[row.length - 1]; var diff = node.width + organization.horizontalPadding; // Check if there is enough space on the last row if (organization.width - organization.rowWidth[last] > diff && longest != last) { // Remove the last element of the longest row row.splice(-1, 1); // Push it to the last row organization.rows[last].push(node); organization.rowWidth[longest] = organization.rowWidth[longest] - diff; organization.rowWidth[last] = organization.rowWidth[last] + diff; organization.width = organization.rowWidth[instance.getLongestRowIndex(organization)]; // Update heights of the organization var maxHeight = Number.MIN_VALUE; for (var i = 0; i < row.length; i++) { if (row[i].height > maxHeight) maxHeight = row[i].height; } if (longest > 0) maxHeight += organization.verticalPadding; var prevTotal = organization.rowHeight[longest] + organization.rowHeight[last]; organization.rowHeight[longest] = maxHeight; if (organization.rowHeight[last] < node.height + organization.verticalPadding) organization.rowHeight[last] = node.height + organization.verticalPadding; var finalTotal = organization.rowHeight[longest] + organization.rowHeight[last]; organization.height += finalTotal - prevTotal; this.shiftToLastRow(organization); } }; CoSELayout.prototype.tilingPreLayout = function () { if (CoSEConstants.TILE) { // Find zero degree nodes and create a compound for each level this.groupZeroDegreeMembers(); // Tile and clear children of each compound this.clearCompounds(); // Separately tile and clear zero degree nodes for each level this.clearZeroDegreeMembers(); } }; CoSELayout.prototype.tilingPostLayout = function () { if (CoSEConstants.TILE) { this.repopulateZeroDegreeMembers(); this.repopulateCompounds(); } }; // ----------------------------------------------------------------------------- // Section: Tree Reduction methods // ----------------------------------------------------------------------------- // Reduce trees CoSELayout.prototype.reduceTrees = function () { var prunedNodesAll = []; var containsLeaf = true; var node; while (containsLeaf) { var allNodes = this.graphManager.getAllNodes(); var prunedNodesInStepTemp = []; containsLeaf = false; for (var i = 0; i < allNodes.length; i++) { node = allNodes[i]; if (node.getEdges().length == 1 && !node.getEdges()[0].isInterGraph && node.getChild() == null) { if (CoSEConstants.PURE_INCREMENTAL) { var otherEnd = node.getEdges()[0].getOtherEnd(node); var relativePosition = new DimensionD(node.getCenterX() - otherEnd.getCenterX(), node.getCenterY() - otherEnd.getCenterY()); prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner(), relativePosition]); } else { prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner()]); } containsLeaf = true; } } if (containsLeaf == true) { var prunedNodesInStep = []; for (var j = 0; j < prunedNodesInStepTemp.length; j++) { if (prunedNodesInStepTemp[j][0].getEdges().length == 1) { prunedNodesInStep.push(prunedNodesInStepTemp[j]); prunedNodesInStepTemp[j][0].getOwner().remove(prunedNodesInStepTemp[j][0]); } } prunedNodesAll.push(prunedNodesInStep); this.graphManager.resetAllNodes(); this.graphManager.resetAllEdges(); } } this.prunedNodesAll = prunedNodesAll; }; // Grow tree one step CoSELayout.prototype.growTree = function (prunedNodesAll) { var lengthOfPrunedNodesInStep = prunedNodesAll.length; var prunedNodesInStep = prunedNodesAll[lengthOfPrunedNodesInStep - 1]; var nodeData; for (var i = 0; i < prunedNodesInStep.length; i++) { nodeData = prunedNodesInStep[i]; this.findPlaceforPrunedNode(nodeData); nodeData[2].add(nodeData[0]); nodeData[2].add(nodeData[1], nodeData[1].source, nodeData[1].target); } prunedNodesAll.splice(prunedNodesAll.length - 1, 1); this.graphManager.resetAllNodes(); this.graphManager.resetAllEdges(); }; // Find an appropriate position to replace pruned node, this method can be improved CoSELayout.prototype.findPlaceforPrunedNode = function (nodeData) { var gridForPrunedNode; var nodeToConnect; var prunedNode = nodeData[0]; if (prunedNode == nodeData[1].source) { nodeToConnect = nodeData[1].target; } else { nodeToConnect = nodeData[1].source; } if (CoSEConstants.PURE_INCREMENTAL) { prunedNode.setCenter(nodeToConnect.getCenterX() + nodeData[3].getWidth(), nodeToConnect.getCenterY() + nodeData[3].getHeight()); } else { var startGridX = nodeToConnect.startX; var finishGridX = nodeToConnect.finishX; var startGridY = nodeToConnect.startY; var finishGridY = nodeToConnect.finishY; var upNodeCount = 0; var downNodeCount = 0; var rightNodeCount = 0; var leftNodeCount = 0; var controlRegions = [upNodeCount, rightNodeCount, downNodeCount, leftNodeCount]; if (startGridY > 0) { for (var i = startGridX; i <= finishGridX; i++) { controlRegions[0] += this.grid[i][startGridY - 1].length + this.grid[i][startGridY].length - 1; } } if (finishGridX < this.grid.length - 1) { for (var i = startGridY; i <= finishGridY; i++) { controlRegions[1] += this.grid[finishGridX + 1][i].length + this.grid[finishGridX][i].length - 1; } } if (finishGridY < this.grid[0].length - 1) { for (var i = startGridX; i <= finishGridX; i++) { controlRegions[2] += this.grid[i][finishGridY + 1].length + this.grid[i][finishGridY].length - 1; } } if (startGridX > 0) { for (var i = startGridY; i <= finishGridY; i++) { controlRegions[3] += this.grid[startGridX - 1][i].length + this.grid[startGridX][i].length - 1; } } var min = Integer.MAX_VALUE; var minCount; var minIndex; for (var j = 0; j < controlRegions.length; j++) { if (controlRegions[j] < min) { min = controlRegions[j]; minCount = 1; minIndex = j; } else if (controlRegions[j] == min) { minCount++; } } if (minCount == 3 && min == 0) { if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[2] == 0) { gridForPrunedNode = 1; } else if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[3] == 0) { gridForPrunedNode = 0; } else if (controlRegions[0] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { gridForPrunedNode = 3; } else if (controlRegions[1] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { gridForPrunedNode = 2; } } else if (minCount == 2 && min == 0) { var random = Math.floor(Math.random() * 2); if (controlRegions[0] == 0 && controlRegions[1] == 0) { ; if (random == 0) { gridForPrunedNode = 0; } else { gridForPrunedNode = 1; } } else if (controlRegions[0] == 0 && controlRegions[2] == 0) { if (random == 0) { gridForPrunedNode = 0; } else { gridForPrunedNode = 2; } } else if (controlRegions[0] == 0 && controlRegions[3] == 0) { if (random == 0) { gridForPrunedNode = 0; } else { gridForPrunedNode = 3; } } else if (controlRegions[1] == 0 && controlRegions[2] == 0) { if (random == 0) { gridForPrunedNode = 1; } else { gridForPrunedNode = 2; } } else if (controlRegions[1] == 0 && controlRegions[3] == 0) { if (random == 0) { gridForPrunedNode = 1; } else { gridForPrunedNode = 3; } } else { if (random == 0) { gridForPrunedNode = 2; } else { gridForPrunedNode = 3; } } } else if (minCount == 4 && min == 0) { var random = Math.floor(Math.random() * 4); gridForPrunedNode = random; } else { gridForPrunedNode = minIndex; } if (gridForPrunedNode == 0) { prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() - nodeToConnect.getHeight() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getHeight() / 2); } else if (gridForPrunedNode == 1) { prunedNode.setCenter(nodeToConnect.getCenterX() + nodeToConnect.getWidth() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); } else if (gridForPrunedNode == 2) { prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() + nodeToConnect.getHeight() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getHeight() / 2); } else { prunedNode.setCenter(nodeToConnect.getCenterX() - nodeToConnect.getWidth() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); } } }; module.exports = CoSELayout; /***/ }), /***/ 991: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_74190__) => { var FDLayoutNode = __nested_webpack_require_74190__(551).FDLayoutNode; var IMath = __nested_webpack_require_74190__(551).IMath; function CoSENode(gm, loc, size, vNode) { FDLayoutNode.call(this, gm, loc, size, vNode); } CoSENode.prototype = Object.create(FDLayoutNode.prototype); for (var prop in FDLayoutNode) { CoSENode[prop] = FDLayoutNode[prop]; } CoSENode.prototype.calculateDisplacement = function () { var layout = this.graphManager.getLayout(); // this check is for compound nodes that contain fixed nodes if (this.getChild() != null && this.fixedNodeWeight) { this.displacementX += layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.fixedNodeWeight; this.displacementY += layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.fixedNodeWeight; } else { this.displacementX += layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.noOfChildren; this.displacementY += layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.noOfChildren; } if (Math.abs(this.displacementX) > layout.coolingFactor * layout.maxNodeDisplacement) { this.displacementX = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementX); } if (Math.abs(this.displacementY) > layout.coolingFactor * layout.maxNodeDisplacement) { this.displacementY = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementY); } // non-empty compound node, propogate movement to children as well if (this.child && this.child.getNodes().length > 0) { this.propogateDisplacementToChildren(this.displacementX, this.displacementY); } }; CoSENode.prototype.propogateDisplacementToChildren = function (dX, dY) { var nodes = this.getChild().getNodes(); var node; for (var i = 0; i < nodes.length; i++) { node = nodes[i]; if (node.getChild() == null) { node.displacementX += dX; node.displacementY += dY; } else { node.propogateDisplacementToChildren(dX, dY); } } }; CoSENode.prototype.move = function () { var layout = this.graphManager.getLayout(); // a simple node or an empty compound node, move it if (this.child == null || this.child.getNodes().length == 0) { this.moveBy(this.displacementX, this.displacementY); layout.totalDisplacement += Math.abs(this.displacementX) + Math.abs(this.displacementY); } this.springForceX = 0; this.springForceY = 0; this.repulsionForceX = 0; this.repulsionForceY = 0; this.gravitationForceX = 0; this.gravitationForceY = 0; this.displacementX = 0; this.displacementY = 0; }; CoSENode.prototype.setPred1 = function (pred1) { this.pred1 = pred1; }; CoSENode.prototype.getPred1 = function () { return pred1; }; CoSENode.prototype.getPred2 = function () { return pred2; }; CoSENode.prototype.setNext = function (next) { this.next = next; }; CoSENode.prototype.getNext = function () { return next; }; CoSENode.prototype.setProcessed = function (processed) { this.processed = processed; }; CoSENode.prototype.isProcessed = function () { return processed; }; module.exports = CoSENode; /***/ }), /***/ 902: /***/ ((module, __unused_webpack_exports, __nested_webpack_require_77514__) => { 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 CoSEConstants = __nested_webpack_require_77514__(806); var LinkedList = __nested_webpack_require_77514__(551).LinkedList; var Matrix = __nested_webpack_require_77514__(551).Matrix; var SVD = __nested_webpack_require_77514__(551).SVD; function ConstraintHandler() {} ConstraintHandler.handleConstraints = function (layout) { // let layout = this.graphManager.getLayout(); // get constraints from layout var constraints = {}; constraints.fixedNodeConstraint = layout.constraints.fixedNodeConstraint; constraints.alignmentConstraint = layout.constraints.alignmentConstraint; constraints.relativePlacementConstraint = layout.constraints.relativePlacementConstraint; var idToNodeMap = new Map(); var nodeIndexes = new Map(); var xCoords = []; var yCoords = []; var allNodes = layout.getAllNodes(); var index = 0; // fill index map and coordinates for (var i = 0; i < allNodes.length; i++) { var node = allNodes[i]; if (node.getChild() == null) { nodeIndexes.set(node.id, index++); xCoords.push(node.getCenterX()); yCoords.push(node.getCenterY()); idToNodeMap.set(node.id, node); } } // if there exists relative placement constraint without gap value, set it to default if (constraints.relativePlacementConstraint) { constraints.relativePlacementConstraint.forEach(function (constraint) { if (!constraint.gap && constraint.gap != 0) { if (constraint.left) { constraint.gap = CoSEConstants.DEFAULT_EDGE_LENGTH + idToNodeMap.get(constraint.left).getWidth() / 2 + idToNodeMap.get(constraint.right).getWidth() / 2; } else { constraint.gap = CoSEConstants.DEFAULT_EDGE_LENGTH + idToNodeMap.get(constraint.top).getHeight() / 2 + idToNodeMap.get(constraint.bottom).getHeight() / 2; } } }); } /* auxiliary functions */ // calculate difference between two position objects var calculatePositionDiff = function calculatePositionDiff(pos1, pos2) { return { x: pos1.x - pos2.x, y: pos1.y - pos2.y }; }; // calculate average position of the nodes var calculateAvgPosition = function calculateAvgPosition(nodeIdSet) { var xPosSum = 0; var yPosSum = 0; nodeIdSet.forEach(function (nodeId) { xPosSum += xCoords[nodeIndexes.get(nodeId)]; yPosSum += yCoords[nodeIndexes.get(nodeId)]; }); return { x: xPosSum / nodeIdSet.size, y: yPosSum / nodeIdSet.size }; }; // find an appropriate positioning for the nodes in a given graph according to relative placement constraints // this function also takes the fixed nodes and alignment constraints into account // graph: dag to be evaluated, direction: "horizontal" or "vertical", // fixedNodes: set of fixed nodes to consider during evaluation, dummyPositions: appropriate coordinates of the dummy nodes var findAppropriatePositionForRelativePlacement = function findAppropriatePositionForRelativePlacement(graph, direction, fixedNodes, dummyPositions, componentSources) { // find union of two sets function setUnion(setA, setB) { var union = new Set(setA); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = setB[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var elem = _step.value; union.add(elem); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return union; } // find indegree count for each node var inDegrees = new Map(); graph.forEach(function (value, key) { inDegrees.set(key, 0); }); graph.forEach(function (value, key) { value.forEach(function (adjacent) { inDegrees.set(adjacent.id, inDegrees.get(adjacent.id) + 1); }); }); var positionMap = new Map(); // keeps the position for each node var pastMap = new Map(); // keeps the predecessors(past) of a node var queue = new LinkedList(); inDegrees.forEach(function (value, key) { if (value == 0) { queue.push(key); if (!fixedNodes) { if (direction == "horizontal") { positionMap.set(key, nodeIndexes.has(key) ? xCoords[nodeIndexes.get(key)] : dummyPositions.get(key)); } else { positionMap.set(key, nodeIndexes.has(key) ? yCoords[nodeIndexes.get(key)] : dummyPositions.get(key)); } } } else { positionMap.set(key, Number.NEGATIVE_INFINITY); } if (fixedNodes) { pastMap.set(key, new Set([key])); } }); // align sources of each component in enforcement phase if (fixedNodes) { componentSources.forEach(function (component) { var fixedIds = []; component.forEach(function (nodeId) { if (fixedNodes.has(nodeId)) { fixedIds.push(nodeId); } }); if (fixedIds.length > 0) { var position = 0; fixedIds.forEach(function (fixedId) { if (direction == "horizontal") { positionMap.set(fixedId, nodeIndexes.has(fixedId) ? xCoords[nodeIndexes.get(fixedId)] : dummyPositions.get(fixedId)); position += positionMap.get(fixedId); } else { positionMap.set(fixedId, nodeIndexes.has(fixedId) ? yCoords[nodeIndexes.get(fixedId)] : dummyPositions.get(fixedId)); position += positionMap.get(fixedId); } }); position = position / fixedIds.length; component.forEach(function (nodeId) { if (!fixedNodes.has(nodeId)) { positionMap.set(nodeId, position); } }); } else { var _position = 0; component.forEach(function (nodeId) { if (direction == "horizontal") { _position += nodeIndexes.has(nodeId) ? xCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId); } else { _position += nodeIndexes.has(nodeId) ? yCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId); } }); _position = _position / component.length; component.forEach(function (nodeId) { positionMap.set(nodeId, _position); }); } }); } // calculate positions of the nodes var _loop = function _loop() { var currentNode = queue.shift(); var neighbors = graph.get(currentNode); neighbors.forEach(function (neighbor) { if (positionMap.get(neighbor.id) < positionMap.get(currentNode) + neighbor.gap) { if (fixedNodes && fixedNodes.has(neighbor.id)) { var fixedPosition = void 0; if (direction == "horizontal") { fixedPosition = nodeIndexes.has(neighbor.id) ? xCoords[nodeIndexes.get(neighbor.id)] : dummyPositions.get(neighbor.id); } else { fixedPosition = nodeIndexes.has(neighbor.id) ? yCoords[nodeIndexes.get(neighbor.id)] : dummyPositions.get(neighbor.id); } positionMap.set(neighbor.id, fixedPosition); // TODO: may do unnecessary work if (fixedPosition < positionMap.get(currentNode) + neighbor.gap) { var diff = positionMap.get(currentNode) + neighbor.gap - fixedPosition; pastMap.get(currentNode).forEach(function (nodeId) { positionMap.set(nodeId, positionMap.get(nodeId) - diff); }); } } else { positionMap.set(neighbor.id, positionMap.get(currentNode) + neighbor.gap); } } inDegrees.set(neighbor.id, inDegrees.get(neighbor.id) - 1); if (inDegrees.get(neighbor.id) == 0) { queue.push(neighbor.id); } if (fixedNodes) { pastMap.set(neighbor.id, setUnion(pastMap.get(currentNode), pastMap.get(neighbor.id))); } }); }; while (queue.length != 0) { _loop(); } // readjust position of the nodes after enforcement if (fixedNodes) { // find indegree count for each node var sinkNodes = new Set(); graph.forEach(function (value, key) { if (value.length == 0) { sinkNodes.add(key); } }); var _components = []; pastMap.forEach(function (value, key) { if (sinkNodes.has(key)) { var isFixedComponent = false; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = value[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var nodeId = _step2.value; if (fixedNodes.has(nodeId)) { isFixedComponent = true; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } if (!isFixedComponent) { var isExist = false; var existAt = void 0; _components.forEach(function (component, index) { if (component.has([].concat(_toConsumableArray(value))[0])) { isExist = true; existAt = index; } }); if (!isExist) { _components.push(new Set(value)); } else { value.forEach(function (ele) { _components[existAt].add(ele); }); } } } }); _components.forEach(function (component, index) { var minBefore = Number.POSITIVE_INFINITY; var minAfter = Number.POSITIVE_INFINITY; var maxBefore = Number.NEGATIVE_INFINITY; var maxAfter = Number.NEGATIVE_INFINITY; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = component[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var nodeId = _step3.value; var posBefore = void 0; if (direction == "horizontal") { posBefore = nodeIndexes.has(nodeId) ? xCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId); } else { posBefore = nodeIndexes.has(nodeId) ? yCoords[nodeIndexes.get(nodeId)] : dummyPositions.get(nodeId); } var posAfter = positionMap.get(nodeId); if (posBefore < minBefore) { minBefore = posBefore; } if (posBefore > maxBefore) { maxBefore = posBefore; } if (posAfter < minAfter) { minAfter = posAfter; } if (posAfter > maxAfter) { maxAfter = posAfter; } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } var diff = (minBefore + maxBefore) / 2 - (minAfter + maxAfter) / 2; var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = component[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var _nodeId = _step4.value; positionMap.set(_nodeId, positionMap.get(_nodeId) + diff); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } }); } return positionMap; }; // find transformation based on rel. placement constraints if there are both alignment and rel. placement constraints // or if there are only rel. placement contraints where the largest component isn't sufficiently large var applyReflectionForRelativePlacement = function applyReflectionForRelativePlacement(relativePlacementConstraints) { // variables to count votes var reflectOnY = 0, notReflectOnY = 0; var reflectOnX = 0, notReflectOnX = 0; relativePlacementConstraints.forEach(function (constraint) { if (constraint.left) { xCoords[nodeIndexes.get(constraint.left)] - xCoords[nodeIndexes.get(constraint.right)] >= 0 ? reflectOnY++ : notReflectOnY++; } else { yCoords[nodeIndexes.get(constraint.top)] - yCoords[nodeIndexes.get(constraint.bottom)] >= 0 ? reflectOnX++ : notReflectOnX++; } }); if (reflectOnY > notReflectOnY && reflectOnX > notReflectOnX) { for (var _i = 0; _i < nodeIndexes.size; _i++) { xCoords[_i] = -1 * xCoords[_i]; yCoords[_i] = -1 * yCoords[_i]; } } else if (reflectOnY > notReflectOnY) { for (var _i2 = 0; _i2 < nodeIndexes.size; _i2++) { xCoords[_i2] = -1 * xCoords[_i2]; } } else if (reflectOnX > notReflectOnX) { for (var _i3 = 0; _i3 < nodeIndexes.size; _i3++) { yCoords[_i3] = -1 * yCoords[_i3]; } } }; // find weakly connected components in undirected graph var findComponents = function findComponents(graph) { // find weakly connected components in dag var components = []; var queue = new LinkedList(); var visited = new Set(); var count = 0; graph.forEach(function (value, key) { if (!visited.has(key)) { components[count] = []; var _currentNode = key; queue.push(_currentNode); visited.add(_currentNode); components[count].push(_currentNode); while (queue.length != 0) { _currentNode = queue.shift(); var neighbors = graph.get(_currentNode); neighbors.forEach(function (neighbor) { if (!visited.has(neighbor.id)) { queue.push(neighbor.id); visited.add(neighbor.id); components[count].push(neighbor.id); } }); } count++; } }); return components; }; // return undirected version of given dag var dagToUndirected = function dagToUndirected(dag) { var undirected = new Map(); dag.forEach(function (value, key) { undirected.set(key, []); }); dag.forEach(function (value, key) { value.forEach(function (adjacent) { undirected.get(key).push(adjacent); undirected.get(adjacent.id).push({ id: key, gap: adjacent.gap, direction: adjacent.direction }); }); }); return undirected; }; // return reversed (directions inverted) version of given dag var dagToReversed = function dagToReversed(dag) { var reversed = new Map(); dag.forEach(function (value, key) { reversed.set(key, []); }); dag.forEach(function (value, key) { value.forEach(function (adjacent) { reversed.get(adjacent.id).push({ id: key, gap: adjacent.gap, direction: adjacent.direction }); }); }); return reversed; }; /**** apply transformation to the initial draft layout to better align with constrained nodes ****/ // solve the Orthogonal Procrustean Problem to rotate and/or reflect initial draft layout // here we follow the solution in Chapter 20.2 of Borg, I. & Groenen, P. (2005) Modern Multidimensional Scaling: Theory and Applications /* construct source and target configurations */ var targetMatrix = []; // A - target configuration var sourceMatrix = []; // B - source configuration var standardTransformation = false; // false for no transformation, true for standart (Procrustes) transformation (rotation and/or reflection) var reflectionType = false; // false/true for reflection check, 'reflectOnX', 'reflectOnY' or 'reflectOnBoth' for reflection type if necessary var fixedNodes = new Set(); var dag = new Map(); // adjacency list to keep directed acyclic graph (dag) that consists of relative placement constraints var dagUndirected = new Map(); // undirected version of the dag var components = []; // weakly connected components // fill fixedNodes collection to use later if (constraints.fixedNodeConstraint) { constraints.fixedNodeConstraint.forEach(function (nodeData) { fixedNodes.add(nodeData.nodeId); }); } // construct dag from relative placement constraints if (constraints.relativePlacementConstraint) { // construct both directed and undirected version of the dag constraints.relativePlacementConstraint.forEach(function (constraint) { if (constraint.left) { if (dag.has(constraint.left)) { dag.get(constraint.left).push({ id: constraint.right, gap: constraint.gap, direction: "horizontal" }); } else { dag.set(constraint.left, [{ id: constraint.right, gap: constraint.gap, direction: "horizontal" }]); } if (!dag.has(constraint.right)) { dag.set(constraint.right, []); } } else { if (dag.has(constraint.top)) { dag.get(constraint.top).push({ id: constraint.bottom, gap: constraint.gap, direction: "vertical" }); } else { dag.set(constraint.top, [{ id: constraint.bottom, gap: constraint.gap, direction: "vertical" }]); } if (!dag.has(constraint.bottom)) { dag.set(constraint.bottom, []); } } }); dagUndirected = dagToUndirected(dag); components = findComponents(dagUndirected); } if (CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING) { // first check fixed node constraint if (constraints.fixedNodeConstraint && constraints.fixedNodeConstraint.length > 1) { constraints.fixedNodeConstraint.forEach(function (nodeData, i) { targetMatrix[i] = [nodeData.position.x, nodeData.position.y]; sourceMatrix[i] = [xCoords[nodeIndexes.get(nodeData.nodeId)], yCoords[nodeIndexes.get(nodeData.nodeId)]]; }); standardTransformation = true; } else if (constraints.alignmentConstraint) { (function () { // then check alignment constraint var count = 0; if (constraints.alignmentConstraint.vertical) { var verticalAlign = constraints.alignmentConstraint.vertical; var _loop2 = function _loop2(_i4) { var alignmentSet = new Set(); verticalAlign[_i4].forEach(function (nodeId) { alignmentSet.add(nodeId); }); var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) { return fixedNodes.has(x); })); var xPos = void 0; if (intersection.size > 0) xPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else xPos = calculateAvgPosition(alignmentSet).x; verticalAlign[_i4].forEach(function (nodeId) { targetMatrix[count] = [xPos, yCoords[nodeIndexes.get(nodeId)]]; sourceMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]]; count++; }); }; for (var _i4 = 0; _i4 < verticalAlign.length; _i4++) { _loop2(_i4); } standardTransformation = true; } if (constraints.alignmentConstraint.horizontal) { var horizontalAlign = constraints.alignmentConstraint.horizontal; var _loop3 = function _loop3(_i5) { var alignmentSet = new Set(); horizontalAlign[_i5].forEach(function (nodeId) { alignmentSet.add(nodeId); }); var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) { return fixedNodes.has(x); })); var yPos = void 0; if (intersection.size > 0) yPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else yPos = calculateAvgPosition(alignmentSet).y; horizontalAlign[_i5].forEach(function (nodeId) { targetMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yPos]; sourceMatrix[count] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]]; count++; }); }; for (var _i5 = 0; _i5 < horizontalAlign.length; _i5++) { _loop3(_i5); } standardTransformation = true; } if (constraints.relativePlacementConstraint) { reflectionType = true; } })(); } else if (constraints.relativePlacementConstraint) { // finally check relative placement constraint // find largest component in dag var largestComponentSize = 0; var largestComponentIndex = 0; for (var _i6 = 0; _i6 < components.length; _i6++) { if (components[_i6].length > largestComponentSize) { largestComponentSize = components[_i6].length; largestComponentIndex = _i6; } } // if largest component isn't dominant, then take the votes for reflection if (largestComponentSize < dagUndirected.size / 2) { applyReflectionForRelativePlacement(constraints.relativePlacementConstraint); standardTransformation = false; reflectionType = false; } else { // use largest component for transformation // construct horizontal and vertical subgraphs in the largest component var subGraphOnHorizontal = new Map(); var subGraphOnVertical = new Map(); var constraintsInlargestComponent = []; components[largestComponentIndex].forEach(function (nodeId) { dag.get(nodeId).forEach(function (adjacent) { if (adjacent.direction == "horizontal") { if (subGraphOnHorizontal.has(nodeId)) { subGraphOnHorizontal.get(nodeId).push(adjacent); } else { subGraphOnHorizontal.set(nodeId, [adjacent]); } if (!subGraphOnHorizontal.has(adjacent.id)) { subGraphOnHorizontal.set(adjacent.id, []); } constraintsInlargestComponent.push({ left: nodeId, right: adjacent.id }); } else { if (subGraphOnVertical.has(nodeId)) { subGraphOnVertical.get(nodeId).push(adjacent); } else { subGraphOnVertical.set(nodeId, [adjacent]); } if (!subGraphOnVertical.has(adjacent.id)) { subGraphOnVertical.set(adjacent.id, []); } constraintsInlargestComponent.push({ top: nodeId, bottom: adjacent.id }); } }); }); applyReflectionForRelativePlacement(constraintsInlargestComponent); reflectionType = false; // calculate appropriate positioning for subgraphs var positionMapHorizontal = findAppropriatePositionForRelativePlacement(subGraphOnHorizontal, "horizontal"); var positionMapVertical = findAppropriatePositionForRelativePlacement(subGraphOnVertical, "vertical"); // construct source and target configuration components[largestComponentIndex].forEach(function (nodeId, i) { sourceMatrix[i] = [xCoords[nodeIndexes.get(nodeId)], yCoords[nodeIndexes.get(nodeId)]]; targetMatrix[i] = []; if (positionMapHorizontal.has(nodeId)) { targetMatrix[i][0] = positionMapHorizontal.get(nodeId); } else { targetMatrix[i][0] = xCoords[nodeIndexes.get(nodeId)]; } if (positionMapVertical.has(nodeId)) { targetMatrix[i][1] = positionMapVertical.get(nodeId); } else { targetMatrix[i][1] = yCoords[nodeIndexes.get(nodeId)]; } }); standardTransformation = true; } } // if transformation is required, then calculate and apply transformation matrix if (standardTransformation) { /* calculate transformation matrix */ var transformationMatrix = void 0; var targetMatrixTranspose = Matrix.transpose(targetMatrix); // A' var sourceMatrixTranspose = Matrix.transpose(sourceMatrix); // B' // centralize transpose matrices for (var _i7 = 0; _i7 < targetMatrixTranspose.length; _i7++) { targetMatrixTranspose[_i7] = Matrix.multGamma(targetMatrixTranspose[_i7]); sourceMatrixTranspose[_i7] = Matrix.multGamma(sourceMatrixTranspose[_i7]); } // do actual calculation for transformation matrix var tempMatrix = Matrix.multMat(targetMatrixTranspose, Matrix.transpose(sourceMatrixTranspose)); // tempMatrix = A'B var SVDResult = SVD.svd(tempMatrix); // SVD(A'B) = USV', svd function returns U, S and V transformationMatrix = Matrix.multMat(SVDResult.V, Matrix.transpose(SVDResult.U)); // transformationMatrix = T = VU' /* apply found transformation matrix to obtain final draft layout */ for (var _i8 = 0; _i8 < nodeIndexes.size; _i8++) { var temp1 = [xCoords[_i8], yCoords[_i8]]; var temp2 = [transformationMatrix[0][0], transformationMatrix[1][0]]; var temp3 = [transformationMatrix[0][1], transformationMatrix[1][1]]; xCoords[_i8] = Matrix.dotProduct(temp1, temp2); yCoords[_i8] = Matrix.dotProduct(temp1, temp3); } // applied only both alignment and rel. placement constraints exist if (reflectionType) { applyReflectionForRelativePlacement(constraints.relativePlacementConstraint); } } } if (CoSEConstants.ENFORCE_CONSTRAINTS) { /**** enforce constraints on the transformed draft layout ****/ /* first enforce fixed node constraint */ if (constraints.fixedNodeConstraint && constraints.fixedNodeConstraint.length > 0) { var translationAmount = { x: 0, y: 0 }; constraints.fixedNodeConstraint.forEach(function (nodeData, i) { var posInTheory = { x: xCoords[nodeIndexes.get(nodeData.nodeId)], y: yCoords[nodeIndexes.get(nodeData.nodeId)] }; var posDesired = nodeData.position; var posDiff = calculatePositionDiff(posDesired, posInTheory); translationAmount.x += posDiff.x; translationAmount.y += posDiff.y; }); translationAmount.x /= constraints.fixedNodeConstraint.length; translationAmount.y /= constraints.fixedNodeConstraint.length; xCoords.forEach(function (value, i) { xCoords[i] += translationAmount.x; }); yCoords.forEach(function (value, i) { yCoords[i] += translationAmount.y; }); constraints.fixedNodeConstraint.forEach(function (nodeData) { xCoords[nodeIndexes.get(nodeData.nodeId)] = nodeData.position.x; yCoords[nodeIndexes.get(nodeData.nodeId)] = nodeData.position.y; }); } /* then enforce alignment constraint */ if (constraints.alignmentConstraint) { if (constraints.alignmentConstraint.vertical) { var xAlign = constraints.alignmentConstraint.vertical; var _loop4 = function _loop4(_i9) { var alignmentSet = new Set(); xAlign[_i9].forEach(function (nodeId) { alignmentSet.add(nodeId); }); var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) { return fixedNodes.has(x); })); var xPos = void 0; if (intersection.size > 0) xPos = xCoords[nodeIndexes.get(intersection.values().next().value)];else xPos = calculateAvgPosition(alignmentSet).x; alignmentSet.forEach(function (nodeId) { if (!fixedNodes.has(nodeId)) xCoords[nodeIndexes.get(nodeId)] = xPos; }); }; for (var _i9 = 0; _i9 < xAlign.length; _i9++) { _loop4(_i9); } } if (constraints.alignmentConstraint.horizontal) { var yAlign = constraints.alignmentConstraint.horizontal; var _loop5 = function _loop5(_i10) { var alignmentSet = new Set(); yAlign[_i10].forEach(function (nodeId) { alignmentSet.add(nodeId); }); var intersection = new Set([].concat(_toConsumableArray(alignmentSet)).filter(function (x) { return fixedNodes.has(x); })); var yPos = void 0; if (intersection.size > 0) yPos = yCoords[nodeIndexes.get(intersection.values().next().value)];else yPos = calculateAvgPosition(alignmentSet).y; alignmentSet.forEach(function (nodeId) { if (!fixedNodes.has(nodeId)) yCoords[nodeIndexes.get(nodeId)] = yPos; }); }; for (var _i10 = 0; _i10 < yAlign.length; _i10++) { _loop5(_i10); } } } /* finally enforce relative placement constraint */ if (constraints.relativePlacementConstraint) { (function () { var nodeToDummyForVerticalAlignment = new Map(); var nodeToDummyForHorizontalAlignment = new Map(); var dummyToNodeForVerticalAlignment = new Map(); var dummyToNodeForHorizontalAlignment = new Map(); var dummyPositionsForVerticalAlignment = new Map(); var dummyPositionsForHorizontalAlignment = new Map(); var fixedNodesOnHorizontal = new Set(); var fixedNodesOnVertical = new Set(); // fill maps and sets fixedNodes.forEach(function (nodeId) { fixedNodesOnHorizontal.add(nodeId); fixedNodesOnVertical.add(nodeId); }); if (constraints.alignmentConstraint) { if (constraints.alignmentConstraint.vertical) { var verticalAlignment = constraints.alignmentConstraint.vertical; var _loop6 = function _loop6(_i11) { dummyToNodeForVerticalAlignment.set("dummy" + _i11, []); verticalAlignment[_i11].forEach(function (nodeId) { nodeToDummyForVerticalAlignment.set(nodeId, "dummy" + _i11); dummyToNodeForVerticalAlignment.get("dummy" + _i11).push(nodeId); if (fixedNodes.has(nodeId)) { fixedNodesOnHorizontal.add("dummy" + _i11); } }); dummyPositionsForVerticalAlignment.set("dummy" + _i11, xCoords[nodeIndexes.get(verticalAlignment[_i11][0])]); }; for (var _i11 = 0; _i11 < verticalAlignment.length; _i11++) { _loop6(_i11); } } if (constraints.alignmentConstraint.horizontal) { var horizontalAlignment = constraints.alignmentConstraint.horizontal; var _loop7 = function _loop7(_i12) { dummyToNodeForHorizontalAlignment.set("dummy" + _i12, []); horizontalAlignment[_i12].forEach(function (nodeId) { nodeToDummyForHorizontalAlignment.set(nodeId, "dummy" + _i12); dummyToNodeForHorizontalAlignment.get("dummy" + _i12).push(nodeId); if (fixedNodes.has(nodeId)) { fixedNodesOnVertical.add("dummy" + _i12); } }); dummyPositionsForHorizontalAlignment.set("dummy" + _i12, yCoords[nodeIndexes.get(horizontalAlignment[_i12][0])]); }; for (var _i12 = 0; _i12 < horizontalAlignment.length; _i12++) { _loop7(_i12); } } } // construct horizontal and vertical dags (subgraphs) from overall dag var dagOnHorizontal = new Map(); var dagOnVertical = new Map(); var _loop8 = function _loop8(nodeId) { dag.get(nodeId).forEach(function (adjacent) { var sourceId = void 0; var targetNode = void 0; if (adjacent["direction"] == "horizontal") { sourceId = nodeToDummyForVerticalAlignment.get(nodeId) ? nodeToDummyForVerticalAlignment.get(nodeId) : nodeId; if (nodeToDummyForVerticalAlignment.get(adjacent.id)) { targetNode = { id: nodeToDummyForVerticalAlignment.get(adjacent.id), gap: adjacent.gap, direction: adjacent.direction }; } else { targetNode = adjacent; } if (dagOnHorizontal.has(sourceId)) { dagOnHorizontal.get(sourceId).push(targetNode); } else { dagOnHorizontal.set(sourceId, [targetNode]); } if (!dagOnHorizontal.has(targetNode.id)) { dagOnHorizontal.set(targetNode.id, []); } } else { sourceId = nodeToDummyForHorizontalAlignment.get(nodeId) ? nodeToDummyForHorizontalAlignment.get(nodeId) : nodeId; if (nodeToDummyForHorizontalAlignment.get(adjacent.id)) { targetNode = { id: nodeToDummyForHorizontalAlignment.get(adjacent.id), gap: adjacent.gap, direction: adjacent.direction }; } else { targetNode = adjacent; } if (dagOnVertical.has(sourceId)) { dagOnVertical.get(sourceId).push(targetNode); } else { dagOnVertical.set(sourceId, [targetNode]); } if (!dagOnVertical.has(targetNode.id)) { dagOnVertical.set(targetNode.id, []); } } }); }; var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { for (var _iterator5 = dag.keys()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { var nodeId = _step5.value; _loop8(nodeId); } // find source nodes of each component in horizontal and vertical dags } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } var undirectedOnHorizontal = dagToUndirected(dagOnHorizontal); var undirectedOnVertical = dagToUndirected(dagOnVertical); var componentsOnHorizontal = findComponents(undirectedOnHorizontal); var componentsOnVertical = findComponents(undirectedOnVertical); var reversedDagOnHorizontal = dagToReversed(dagOnHorizontal); var reversedDagOnVertical = dagToReversed(dagOnVertical); var componentSourcesOnHorizontal = []; var componentSourcesOnVertical = []; componentsOnHorizontal.forEach(function (component, index) { componentSourcesOnHorizontal[index] = []; component.forEach(function (nodeId) { if (reversedDagOnHorizontal.get(nodeId).length == 0) { componentSourcesOnHorizontal[index].push(nodeId); } }); }); componentsOnVertical.forEach(function (component, index) { componentSourcesOnVertical[index] = []; component.forEach(function (nodeId) { if (reversedDagOnVertical.get(nodeId).length == 0) { componentSourcesOnVertical[index].push(nodeId); } }); }); // calculate appropriate positioning for subgraphs var positionMapHorizontal = findAppropriatePositionForRelativePlacement(dagOnHorizontal, "horizontal", fixedNodesOnHorizontal, dummyPositionsForVerticalAlignment, componentSourcesOnHorizontal); var positionMapVertical = findAppropriatePositionForRelativePlacement(dagOnVertical, "vertical", fixedNodesOnVertical, dummyPositionsForHorizontalAlignment, componentSourcesOnVertical); // update positions of the nodes based on relative placement constraints var _loop9 = function _loop9(key) { if (dummyToNodeForVerticalAlignment.get(key)) { dummyToNodeForVerticalAlignment.get(key).forEach(function (nodeId) { xCoords[nodeIndexes.get(nodeId)] = positionMapHorizontal.get(key); }); } else { xCoords[nodeIndexes.get(key)] = positionMapHorizontal.get(key); } }; var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = positionMapHorizontal.keys()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { var key = _step6.value; _loop9(key); } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } var _loop10 = function _loop10(key) { if (dummyToNodeForHorizontalAlignment.get(key)) { dummyToNodeForHorizontalAlignment.get(key).forEach(function (nodeId) { yCoords[nodeIndexes.get(nodeId)] = positionMapVertical.get(key); }); } else { yCoords[nodeIndexes.get(key)] = positionMapVertical.get(key); } }; var _iteratorNormalCompletion7 = true; var _didIteratorError7 = false; var _iteratorError7 = undefined; try { for (var _iterator7 = positionMapVertical.keys()[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { var key = _step7.value; _loop10(key); } } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } })(); } } // assign new coordinates to nodes after constraint handling for (var _i13 = 0; _i13 < allNodes.length; _i13++) { var _node = allNodes[_i13]; if (_node.getChild() == null) { _node.setCenter(xCoords[nodeIndexes.get(_node.id)], yCoords[nodeIndexes.get(_node.id)]); } } }; module.exports = ConstraintHandler; /***/ }), /***/ 551: /***/ ((module) => { module.exports = __WEBPACK_EXTERNAL_MODULE__551__; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __nested_webpack_require_117795__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_117795__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __nested_webpack_exports__ = __nested_webpack_require_117795__(45); /******/ /******/ return __nested_webpack_exports__; /******/ })() ; }); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css": /*!*******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css ***! \*******************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, "._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\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", "",{"version":3,"sources":["webpack://./src/components/core/Toolbar.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,YAAY;IACZ,UAAU;IACV,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,0CAA0C;AAC9C;AACA;IACI,kBAAkB;AACtB;AACA;IACI,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,YAAY;AAChB;AACA;IACI,UAAU;AACd;AACA;IACI,eAAe;IACf,yBAAyB;AAC7B;AACA;IACI,eAAe;IACf,wBAAwB;AAC5B;AACA;IACI,eAAe;AACnB","sourcesContent":["._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\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"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css": /*!*************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css ***! \*************************************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".dash-callback-dag--container {\n border-radius: 4px;\n width: 80vw;\n position: relative;\n height: calc(100vh - 75px);\n overflow: hidden;\n box-sizing: border-box;\n background: #ffffff;\n display: inline-block;\n /* shadow-1 */\n box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165),\n 0px 2px 6px rgba(80, 103, 132, 0.12),\n 0px 0px 1px rgba(80, 103, 132, 0.32);\n}\n\n.dash-callback-dag--info {\n border-radius: 4px;\n position: absolute;\n padding: 8px;\n bottom: 16px;\n left: 16px;\n max-width: calc(100% - 32px);\n max-height: 50%;\n overflow: auto;\n box-sizing: border-box;\n background: rgba(255, 255, 255, 0.9);\n border: 2px solid #ccc;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n line-height: 2em;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--layoutSelector {\n position: absolute;\n top: 3px;\n right: 3px;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/CallbackGraph/CallbackGraphContainer.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,WAAW;IACX,kBAAkB;IAClB,0BAA0B;IAC1B,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB;IACnB,qBAAqB;IACrB,aAAa;IACb;;4CAEwC;AAC5C;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,4BAA4B;IAC5B,eAAe;IACf,cAAc;IACd,sBAAsB;IACtB,oCAAoC;IACpC,sBAAsB;IACtB,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,mBAAmB;IACnB,YAAY;IACZ,gBAAgB;IAChB,gCAAgC;AACpC;;AAEA;IACI,kBAAkB;IAClB,QAAQ;IACR,UAAU;AACd","sourcesContent":[".dash-callback-dag--container {\n border-radius: 4px;\n width: 80vw;\n position: relative;\n height: calc(100vh - 75px);\n overflow: hidden;\n box-sizing: border-box;\n background: #ffffff;\n display: inline-block;\n /* shadow-1 */\n box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165),\n 0px 2px 6px rgba(80, 103, 132, 0.12),\n 0px 0px 1px rgba(80, 103, 132, 0.32);\n}\n\n.dash-callback-dag--info {\n border-radius: 4px;\n position: absolute;\n padding: 8px;\n bottom: 16px;\n left: 16px;\n max-width: calc(100% - 32px);\n max-height: 50%;\n overflow: auto;\n box-sizing: border-box;\n background: rgba(255, 255, 255, 0.9);\n border: 2px solid #ccc;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n line-height: 2em;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--layoutSelector {\n position: absolute;\n top: 3px;\n right: 3px;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css": /*!***********************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css ***! \***********************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".error-container {\n padding: 0 10px;\n font-family: Courier;\n}\n\n.dash-fe-error__icon-x {\n position: absolute;\n right: 0;\n top: 0;\n color: #b9c2ce;\n font-size: 20px;\n cursor: pointer;\n}\n\n.dash-fe-error__icon-x:hover {\n color: #a1a9b5;\n}\n\n.dash-fe-errors {\n min-width: 386px;\n max-width: 650px;\n max-height: 450px;\n display: inline-block;\n}\n\n.dash-fe-error__icon-error {\n width: 20px;\n height: 20px;\n display: inline-block;\n margin-right: 16px;\n}\n.dash-fe-error__icon-close {\n width: 10px;\n height: 10px;\n position: absolute;\n right: 12px;\n top: 12px;\n display: inline-block;\n}\n.dash-fe-error__icon-arrow {\n width: 8px;\n height: 28px;\n margin: 0px 8px;\n}\n.dash-fe-error-top__group:first-child {\n /*\n * 77% is the maximum space allowed based off of the other elements\n * in the top part of the error container (timestamp & collapse arrow).\n * this was manually determined */\n width: 77%;\n}\n.dash-fe-error-top__group {\n display: inline-flex;\n align-items: center;\n}\n.dash-fe-error__title {\n text-align: left;\n margin: 0px;\n margin-left: 5px;\n padding: 0px;\n font-size: 12.6px;\n display: inline-block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 20px;\n}\n.dash-fe-error__timestamp {\n margin-right: 20px;\n}\n.dash-fe-error__collapse--flipped {\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.dash-fe-error__info_title {\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-top-left-radius: 4px;\n border-top-right-radius: 4px;\n padding: 10px;\n}\n\n.dash-fe-error__info {\n border: 1px solid #dfe8f3;\n margin: 0 0 1em 0;\n padding: 10px;\n\n background-color: white;\n border: 2px solid #dfe8f3;\n color: #506784;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.dash-fe-error__curved {\n border-radius: 4px;\n}\n\n.dash-fe-error__curved-top {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-width: 0px;\n}\n\n.dash-fe-error__curved-bottom {\n border-radius-bottom-left: 4px;\n border-radius-bottom-right: 4px;\n background-color: #ffefef;\n}\n\n.dash-be-error__st {\n background-color: #fdf3f4;\n min-width: 386px;\n max-width: 650px;\n /* iframe container handles the scrolling */\n overflow: hidden;\n display: inline-block;\n}\n\n.dash-be-error__str {\n background-color: #f5f6fa;\n min-width: 386px;\n width: 100%;\n overflow: auto;\n line-height: 17px;\n margin-bottom: 8px;\n}\n\n.dash-backend-error {\n padding: 8px;\n}\n\n.dash-error-menu {\n max-width: 50%;\n max-height: 60%;\n display: contents;\n font-family: monospace;\n font-size: 14px;\n font-variant-ligatures: common-ligatures;\n color: rgb(50, 50, 50);\n}\n\n.dash-error-card {\n box-sizing: border-box;\n display: inline-block;\n /* shadow-1 */\n border-radius: 4px;\n animation: dash-error-card-animation 0.5s;\n padding: 24px;\n text-align: left;\n background: transparent;\n width: 100%;\n}\n.dash-error-card--alerts-tray {\n position: absolute;\n top: -300px;\n left: -1px;\n animation: none;\n box-shadow: none;\n border: 1px solid #ececec;\n border-bottom: 0;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n width: 422px;\n}\n.dash-error-card--container {\n padding: 16px;\n width: 600px;\n max-width: 800px;\n margin-bottom: 4px;\n background-color: white;\n overflow: auto;\n border-radius: 6px;\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-error-card__topbar {\n width: 100%;\n height: 32px;\n display: flex;\n justify-content: flex-start;\n font-size: 14px;\n align-items: center;\n position: relative;\n padding-bottom: 14px;\n font-weight: 700;\n}\n.dash-error-card__message {\n font-size: 14px;\n}\n\n.dash-error-card__message > strong {\n color: #ff4500;\n}\n\n.dash-error-card__content {\n box-sizing: border-box;\n background-color: white;\n border-radius: 2px;\n margin-bottom: 15px;\n border: 1px solid #0018661a;\n font-size: 12.6px;\n}\n\n.dash-fe-error-item {\n background: #ffffff;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px;\n cursor: pointer;\n}\n\n@keyframes dash-error-card-animation {\n from {\n opacity: 0;\n -webkit-transform: scale(1.1);\n -moz-transform: scale(1.1);\n -ms-transform: scale(1.1);\n transform: scale(1.1);\n }\n to {\n opacity: 1;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n transform: scale(1);\n }\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/FrontEnd/FrontEndError.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,oBAAoB;AACxB;;AAEA;IACI,kBAAkB;IAClB,QAAQ;IACR,MAAM;IACN,cAAc;IACd,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;AACzB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,qBAAqB;IACrB,kBAAkB;AACtB;AACA;IACI,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,WAAW;IACX,SAAS;IACT,qBAAqB;AACzB;AACA;IACI,UAAU;IACV,YAAY;IACZ,eAAe;AACnB;AACA;IACI;;;qCAGiC;IACjC,UAAU;AACd;AACA;IACI,oBAAoB;IACpB,mBAAmB;AACvB;AACA;IACI,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,qBAAqB;IACrB,uBAAuB;IACvB,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;AACrB;AACA;IACI,kBAAkB;AACtB;AACA;IACI,iCAAiC;IACjC,6BAA6B;IAC7B,yBAAyB;AAC7B;;AAEA;IACI,SAAS;IACT,cAAc;IACd,eAAe;IACf,yBAAyB;IACzB,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,4BAA4B;IAC5B,aAAa;AACjB;;AAEA;IACI,yBAAyB;IACzB,iBAAiB;IACjB,aAAa;;IAEb,uBAAuB;IACvB,yBAAyB;IACzB,cAAc;IACd,cAAc;IACd,qBAAqB;AACzB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;AAC5B;;AAEA;IACI,8BAA8B;IAC9B,+BAA+B;IAC/B,yBAAyB;AAC7B;;AAEA;IACI,yBAAyB;IACzB,gBAAgB;IAChB,gBAAgB;IAChB,2CAA2C;IAC3C,gBAAgB;IAChB,qBAAqB;AACzB;;AAEA;IACI,yBAAyB;IACzB,gBAAgB;IAChB,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,sBAAsB;IACtB,eAAe;IACf,wCAAwC;IACxC,sBAAsB;AAC1B;;AAEA;IACI,sBAAsB;IACtB,qBAAqB;IACrB,aAAa;IACb,kBAAkB;IAClB,yCAAyC;IACzC,aAAa;IACb,gBAAgB;IAChB,uBAAuB;IACvB,WAAW;AACf;AACA;IACI,kBAAkB;IAClB,WAAW;IACX,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,yBAAyB;IACzB,gBAAgB;IAChB,8BAA8B;IAC9B,+BAA+B;IAC/B,YAAY;AAChB;AACA;IACI,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,uBAAuB;IACvB,cAAc;IACd,kBAAkB;IAClB;;8CAE0C;AAC9C;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,aAAa;IACb,2BAA2B;IAC3B,eAAe;IACf,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;AACpB;AACA;IACI,eAAe;AACnB;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,sBAAsB;IACtB,uBAAuB;IACvB,kBAAkB;IAClB,mBAAmB;IACnB,2BAA2B;IAC3B,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI;QACI,UAAU;QACV,6BAA6B;QAC7B,0BAA0B;QAC1B,yBAAyB;QACzB,qBAAqB;IACzB;IACA;QACI,UAAU;QACV,2BAA2B;QAC3B,wBAAwB;QACxB,uBAAuB;QACvB,mBAAmB;IACvB;AACJ","sourcesContent":[".error-container {\n padding: 0 10px;\n font-family: Courier;\n}\n\n.dash-fe-error__icon-x {\n position: absolute;\n right: 0;\n top: 0;\n color: #b9c2ce;\n font-size: 20px;\n cursor: pointer;\n}\n\n.dash-fe-error__icon-x:hover {\n color: #a1a9b5;\n}\n\n.dash-fe-errors {\n min-width: 386px;\n max-width: 650px;\n max-height: 450px;\n display: inline-block;\n}\n\n.dash-fe-error__icon-error {\n width: 20px;\n height: 20px;\n display: inline-block;\n margin-right: 16px;\n}\n.dash-fe-error__icon-close {\n width: 10px;\n height: 10px;\n position: absolute;\n right: 12px;\n top: 12px;\n display: inline-block;\n}\n.dash-fe-error__icon-arrow {\n width: 8px;\n height: 28px;\n margin: 0px 8px;\n}\n.dash-fe-error-top__group:first-child {\n /*\n * 77% is the maximum space allowed based off of the other elements\n * in the top part of the error container (timestamp & collapse arrow).\n * this was manually determined */\n width: 77%;\n}\n.dash-fe-error-top__group {\n display: inline-flex;\n align-items: center;\n}\n.dash-fe-error__title {\n text-align: left;\n margin: 0px;\n margin-left: 5px;\n padding: 0px;\n font-size: 12.6px;\n display: inline-block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 20px;\n}\n.dash-fe-error__timestamp {\n margin-right: 20px;\n}\n.dash-fe-error__collapse--flipped {\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.dash-fe-error__info_title {\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-top-left-radius: 4px;\n border-top-right-radius: 4px;\n padding: 10px;\n}\n\n.dash-fe-error__info {\n border: 1px solid #dfe8f3;\n margin: 0 0 1em 0;\n padding: 10px;\n\n background-color: white;\n border: 2px solid #dfe8f3;\n color: #506784;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.dash-fe-error__curved {\n border-radius: 4px;\n}\n\n.dash-fe-error__curved-top {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-width: 0px;\n}\n\n.dash-fe-error__curved-bottom {\n border-radius-bottom-left: 4px;\n border-radius-bottom-right: 4px;\n background-color: #ffefef;\n}\n\n.dash-be-error__st {\n background-color: #fdf3f4;\n min-width: 386px;\n max-width: 650px;\n /* iframe container handles the scrolling */\n overflow: hidden;\n display: inline-block;\n}\n\n.dash-be-error__str {\n background-color: #f5f6fa;\n min-width: 386px;\n width: 100%;\n overflow: auto;\n line-height: 17px;\n margin-bottom: 8px;\n}\n\n.dash-backend-error {\n padding: 8px;\n}\n\n.dash-error-menu {\n max-width: 50%;\n max-height: 60%;\n display: contents;\n font-family: monospace;\n font-size: 14px;\n font-variant-ligatures: common-ligatures;\n color: rgb(50, 50, 50);\n}\n\n.dash-error-card {\n box-sizing: border-box;\n display: inline-block;\n /* shadow-1 */\n border-radius: 4px;\n animation: dash-error-card-animation 0.5s;\n padding: 24px;\n text-align: left;\n background: transparent;\n width: 100%;\n}\n.dash-error-card--alerts-tray {\n position: absolute;\n top: -300px;\n left: -1px;\n animation: none;\n box-shadow: none;\n border: 1px solid #ececec;\n border-bottom: 0;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n width: 422px;\n}\n.dash-error-card--container {\n padding: 16px;\n width: 600px;\n max-width: 800px;\n margin-bottom: 4px;\n background-color: white;\n overflow: auto;\n border-radius: 6px;\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-error-card__topbar {\n width: 100%;\n height: 32px;\n display: flex;\n justify-content: flex-start;\n font-size: 14px;\n align-items: center;\n position: relative;\n padding-bottom: 14px;\n font-weight: 700;\n}\n.dash-error-card__message {\n font-size: 14px;\n}\n\n.dash-error-card__message > strong {\n color: #ff4500;\n}\n\n.dash-error-card__content {\n box-sizing: border-box;\n background-color: white;\n border-radius: 2px;\n margin-bottom: 15px;\n border: 1px solid #0018661a;\n font-size: 12.6px;\n}\n\n.dash-fe-error-item {\n background: #ffffff;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px;\n cursor: pointer;\n}\n\n@keyframes dash-error-card-animation {\n from {\n opacity: 0;\n -webkit-transform: scale(1.1);\n -moz-transform: scale(1.1);\n -ms-transform: scale(1.1);\n transform: scale(1.1);\n }\n to {\n opacity: 1;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n transform: scale(1);\n }\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css": /*!******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css ***! \******************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".percy-show {\n display: none;\n}\n\n@media only percy {\n .percy-hide {\n display: none;\n }\n .percy-show {\n display: block;\n }\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/Percy.css"],"names":[],"mappings":"AAAA;IACI,aAAa;AACjB;;AAEA;IACI;QACI,aAAa;IACjB;IACA;QACI,cAAc;IAClB;AACJ","sourcesContent":[".percy-show {\n display: none;\n}\n\n@media only percy {\n .percy-hide {\n display: none;\n }\n .percy-show {\n display: block;\n }\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css": /*!***************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css ***! \***************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".dash-debug-menu {\n transition: 0.3s;\n position: fixed;\n bottom: 35px;\n right: 35px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10001;\n background-color: #119dff;\n border-radius: 100%;\n width: 64px;\n height: 64px;\n cursor: pointer;\n}\n.dash-debug-menu--open {\n transform: rotate(-180deg);\n}\n\n.dash-debug-menu__outer button {\n height: auto;\n padding: 0 8px;\n line-height: normal;\n text-transform: none;\n font-size: 14px;\n border-radius: 0px;\n letter-spacing: normal;\n white-space: nowrap;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: none;\n outline: none;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__popup {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 100%;\n right: 0;\n gap: 8px;\n max-height: calc(100vh - 75px);\n justify-content: flex-end;\n}\n\n.dash-debug-menu__version-opt-out {\n display: flex;\n width: 426px;\n padding: 16px;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n border-radius: 8px;\n border: 1px solid rgba(0, 24, 102, 0.1);\n background: #fff;\n align-self: flex-end;\n position: relative;\n /* Shadow/Small */\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-debug-menu__version-opt-out__text {\n display: inline-block;\n}\n\n.dash-debug-menu__version-opt-out__text a {\n color: #7f4bc4;\n text-decoration: none;\n}\n\n.dash-debug-menu__version-opt-out__text span {\n margin-right: 5px;\n}\n\n.dash-debug-menu__version-opt-out button {\n display: flex;\n height: 24px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n line-height: 18px;\n padding: 16px 12px;\n}\n\n.dash-debug-menu__version-opt-out__buttons-container {\n display: flex;\n gap: 8px;\n align-self: stretch;\n justify-content: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid rgba(0, 24, 102, 0.1);\n}\n\n.dash-debug-menu__version-opt-out__button-primary {\n border: none;\n color: #fff;\n background: #7f4bc4;\n}\n\n.dash-debug-menu__version-opt-out__button-secondary {\n background: rgba(161, 89, 255, 0.05);\n color: #7f4bc4;\n border: 1px solid rgba(134, 74, 212, 0.8);\n}\n\n.dash-debug-menu:hover {\n background-color: #108de4;\n}\n\n.dash-debug-menu__outer {\n transition: 0.3s;\n box-sizing: border-box;\n position: fixed;\n bottom: -1px;\n right: -1px;\n display: flex;\n color: black;\n flex-direction: row;\n font-family: Verdana, sans-serif !important;\n font-size: 14px;\n justify-content: flex-end;\n align-items: center;\n z-index: 10000;\n border-radius: 5px 0 0 0;\n padding: 15px 0;\n background-color: #f5f6fa;\n box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04),\n 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03);\n border: 1px solid rgba(0, 24, 102, 0.1);\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--collapsed {\n max-width: 50px;\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--expanded {\n max-width: 682px;\n}\n\n.dash-debug-menu__upgrade-tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 6px;\n border: 1px solid #0018661a;\n padding: 11px;\n box-shadow: 0px 0px 14px 5px #00000012;\n z-index: 1200;\n}\n\n.dash-debug-menu__toggle {\n color: #7f4bc4;\n transition: 0.3s;\n}\n.dash-debug-menu__toggle--expanded {\n transform: rotate(180deg);\n}\n.dash-debug-menu__error-indicator {\n width: 8px;\n height: 8px;\n background-color: #DC3E42;\n border-radius: 100%;\n position: absolute;\n right: 3px;\n top: 13px;\n}\n.dash-debug-menu__status {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dash-debug-menu__content {\n display: flex;\n align-items: stretch;\n margin-left: 15px;\n transition: all 0.5s ease;\n}\n\n.dash-debug-menu__version {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__divider {\n width: 1.5px;\n height: 26px;\n margin: 0px 13px;\n background-color: #0015594d;\n}\n\n.dash-debug-menu__button {\n background: none;\n border: none;\n box-shadow: 0 1px #d3dae6;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: background-color 0.2s;\n font-family: Verdana, sans-serif !important;\n font-weight: bold;\n color: black;\n}\n\n.dash-debug-menu__button.dash-debug-menu__button--selected {\n color: #7f4bc4;\n box-shadow: 0 2px #0071c2;\n}\n.dash-debug-menu__button.dash-debug-menu__button--selected:hover {\n color: #5806c4;\n}\n\n.dash-debug-alert {\n display: flex;\n align-items: center;\n font-size: 10px;\n}\n\n.dash-debug-alert-label {\n display: flex;\n position: fixed;\n bottom: 81px;\n right: 29px;\n z-index: 10002;\n cursor: pointer;\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25),\n 0px 1px 3px rgba(162, 177, 198, 0.32);\n border-radius: 32px;\n background-color: white;\n padding: 4px;\n color: rgb(50, 50, 50);\n}\n\n.dash-debug-menu__error-count {\n font-size: 12px;\n color: #fff;\n background-color: #c73a3a;\n padding: 3px 5px;\n border-radius: 3px;\n}\n\n.dash-debug-disconnected {\n font-size: 14px;\n margin-left: 3px;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/menu/DebugMenu.css"],"names":[],"mappings":"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","sourcesContent":[".dash-debug-menu {\n transition: 0.3s;\n position: fixed;\n bottom: 35px;\n right: 35px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10001;\n background-color: #119dff;\n border-radius: 100%;\n width: 64px;\n height: 64px;\n cursor: pointer;\n}\n.dash-debug-menu--open {\n transform: rotate(-180deg);\n}\n\n.dash-debug-menu__outer button {\n height: auto;\n padding: 0 8px;\n line-height: normal;\n text-transform: none;\n font-size: 14px;\n border-radius: 0px;\n letter-spacing: normal;\n white-space: nowrap;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: none;\n outline: none;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__popup {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 100%;\n right: 0;\n gap: 8px;\n max-height: calc(100vh - 75px);\n justify-content: flex-end;\n}\n\n.dash-debug-menu__version-opt-out {\n display: flex;\n width: 426px;\n padding: 16px;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n border-radius: 8px;\n border: 1px solid rgba(0, 24, 102, 0.1);\n background: #fff;\n align-self: flex-end;\n position: relative;\n /* Shadow/Small */\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-debug-menu__version-opt-out__text {\n display: inline-block;\n}\n\n.dash-debug-menu__version-opt-out__text a {\n color: #7f4bc4;\n text-decoration: none;\n}\n\n.dash-debug-menu__version-opt-out__text span {\n margin-right: 5px;\n}\n\n.dash-debug-menu__version-opt-out button {\n display: flex;\n height: 24px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n line-height: 18px;\n padding: 16px 12px;\n}\n\n.dash-debug-menu__version-opt-out__buttons-container {\n display: flex;\n gap: 8px;\n align-self: stretch;\n justify-content: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid rgba(0, 24, 102, 0.1);\n}\n\n.dash-debug-menu__version-opt-out__button-primary {\n border: none;\n color: #fff;\n background: #7f4bc4;\n}\n\n.dash-debug-menu__version-opt-out__button-secondary {\n background: rgba(161, 89, 255, 0.05);\n color: #7f4bc4;\n border: 1px solid rgba(134, 74, 212, 0.8);\n}\n\n.dash-debug-menu:hover {\n background-color: #108de4;\n}\n\n.dash-debug-menu__outer {\n transition: 0.3s;\n box-sizing: border-box;\n position: fixed;\n bottom: -1px;\n right: -1px;\n display: flex;\n color: black;\n flex-direction: row;\n font-family: Verdana, sans-serif !important;\n font-size: 14px;\n justify-content: flex-end;\n align-items: center;\n z-index: 10000;\n border-radius: 5px 0 0 0;\n padding: 15px 0;\n background-color: #f5f6fa;\n box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04),\n 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03);\n border: 1px solid rgba(0, 24, 102, 0.1);\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--collapsed {\n max-width: 50px;\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--expanded {\n max-width: 682px;\n}\n\n.dash-debug-menu__upgrade-tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 6px;\n border: 1px solid #0018661a;\n padding: 11px;\n box-shadow: 0px 0px 14px 5px #00000012;\n z-index: 1200;\n}\n\n.dash-debug-menu__toggle {\n color: #7f4bc4;\n transition: 0.3s;\n}\n.dash-debug-menu__toggle--expanded {\n transform: rotate(180deg);\n}\n.dash-debug-menu__error-indicator {\n width: 8px;\n height: 8px;\n background-color: #DC3E42;\n border-radius: 100%;\n position: absolute;\n right: 3px;\n top: 13px;\n}\n.dash-debug-menu__status {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dash-debug-menu__content {\n display: flex;\n align-items: stretch;\n margin-left: 15px;\n transition: all 0.5s ease;\n}\n\n.dash-debug-menu__version {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__divider {\n width: 1.5px;\n height: 26px;\n margin: 0px 13px;\n background-color: #0015594d;\n}\n\n.dash-debug-menu__button {\n background: none;\n border: none;\n box-shadow: 0 1px #d3dae6;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: background-color 0.2s;\n font-family: Verdana, sans-serif !important;\n font-weight: bold;\n color: black;\n}\n\n.dash-debug-menu__button.dash-debug-menu__button--selected {\n color: #7f4bc4;\n box-shadow: 0 2px #0071c2;\n}\n.dash-debug-menu__button.dash-debug-menu__button--selected:hover {\n color: #5806c4;\n}\n\n.dash-debug-alert {\n display: flex;\n align-items: center;\n font-size: 10px;\n}\n\n.dash-debug-alert-label {\n display: flex;\n position: fixed;\n bottom: 81px;\n right: 29px;\n z-index: 10002;\n cursor: pointer;\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25),\n 0px 1px 3px rgba(162, 177, 198, 0.32);\n border-radius: 32px;\n background-color: white;\n padding: 4px;\n color: rgb(50, 50, 50);\n}\n\n.dash-debug-menu__error-count {\n font-size: 12px;\n color: #fff;\n background-color: #c73a3a;\n padding: 3px 5px;\n border-radius: 3px;\n}\n\n.dash-debug-disconnected {\n font-size: 14px;\n margin-left: 3px;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.css": /*!*****************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.css ***! \*****************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".dash-debug-menu__upgrade-tooltip button,\n.dash-debug-menu__upgrade-tooltip a {\n background: white;\n border: none;\n padding: 2px 5px;\n white-space: nowrap;\n color: #7f4bc4;\n font-size: 10pt;\n text-decoration: none;\n cursor: pointer;\n display: flex;\n font-family: Verdana, sans-serif !important;\n font-weight: 500;\n line-height: normal;\n}\n\n.dash-debug-menu__upgrade-tooltip:after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 10px;\n border-style: solid;\n border-color: white transparent transparent transparent;\n}\n\n.dash-debug-menu__outer button.dash-debug-menu__upgrade-button {\n background-color: #a159ff0d;\n border: 1px solid #864ad433;\n color: #7f4bc4;\n margin-left: 10px;\n font-family: Verdana, sans-serif !important;\n cursor: pointer;\n height: 20px;\n padding: 0px 8px;\n border-radius: 3px;\n font-weight: 500;\n}\n\n.dash-debug-menu__upgrade-button:hover {\n background-color: #864ad433;\n border-color: #864ad433;\n color: #7f4bc4;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/menu/VersionInfo.css"],"names":[],"mappings":"AAAA;;IAEI,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,cAAc;IACd,eAAe;IACf,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,2CAA2C;IAC3C,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI,YAAY;IACZ,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,uDAAuD;AAC3D;;AAEA;IACI,2BAA2B;IAC3B,2BAA2B;IAC3B,cAAc;IACd,iBAAiB;IACjB,2CAA2C;IAC3C,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;AACpB;;AAEA;IACI,2BAA2B;IAC3B,uBAAuB;IACvB,cAAc;AAClB","sourcesContent":[".dash-debug-menu__upgrade-tooltip button,\n.dash-debug-menu__upgrade-tooltip a {\n background: white;\n border: none;\n padding: 2px 5px;\n white-space: nowrap;\n color: #7f4bc4;\n font-size: 10pt;\n text-decoration: none;\n cursor: pointer;\n display: flex;\n font-family: Verdana, sans-serif !important;\n font-weight: 500;\n line-height: normal;\n}\n\n.dash-debug-menu__upgrade-tooltip:after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 10px;\n border-style: solid;\n border-color: white transparent transparent transparent;\n}\n\n.dash-debug-menu__outer button.dash-debug-menu__upgrade-button {\n background-color: #a159ff0d;\n border: 1px solid #864ad433;\n color: #7f4bc4;\n margin-left: 10px;\n font-family: Verdana, sans-serif !important;\n cursor: pointer;\n height: 20px;\n padding: 0px 8px;\n border-radius: 3px;\n font-weight: 500;\n}\n\n.dash-debug-menu__upgrade-button:hover {\n background-color: #864ad433;\n border-color: #864ad433;\n color: #7f4bc4;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ (function(module) { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": /*!************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! \************************************************************/ /***/ (function(module) { "use strict"; module.exports = function (item) { var content = item[1]; var cssMapping = item[3]; if (!cssMapping) { return content; } if (typeof btoa === "function") { var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); var sourceMapping = "/*# ".concat(data, " */"); return [content].concat([sourceMapping]).join("\n"); } return [content].join("\n"); }; /***/ }), /***/ "./node_modules/cytoscape-dagre/cytoscape-dagre.js": /*!*********************************************************!*\ !*** ./node_modules/cytoscape-dagre/cytoscape-dagre.js ***! \*********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(__webpack_require__(/*! dagre */ "./node_modules/dagre/index.js")); else // removed by dead control flow {} })(this, function(__WEBPACK_EXTERNAL_MODULE__4__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __nested_webpack_require_633__(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_633__); /******/ /******/ // 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_633__.m = modules; /******/ /******/ // expose the module cache /******/ __nested_webpack_require_633__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __nested_webpack_require_633__.d = function(exports, name, getter) { /******/ if(!__nested_webpack_require_633__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __nested_webpack_require_633__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __nested_webpack_require_633__.t = function(value, mode) { /******/ if(mode & 1) value = __nested_webpack_require_633__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __nested_webpack_require_633__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_633__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __nested_webpack_require_633__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __nested_webpack_require_633__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __nested_webpack_require_633__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __nested_webpack_require_633__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __nested_webpack_require_633__(__nested_webpack_require_633__.s = 0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __nested_webpack_require_4097__) { var impl = __nested_webpack_require_4097__(1); // registers the extension on a cytoscape lib ref var register = function register(cytoscape) { if (!cytoscape) { return; } // can't register if cytoscape unspecified cytoscape('layout', 'dagre', impl); // register with cytoscape.js }; if (typeof cytoscape !== 'undefined') { // expose to global cytoscape (i.e. window.cytoscape) register(cytoscape); } module.exports = register; /***/ }), /* 1 */ /***/ (function(module, exports, __nested_webpack_require_4608__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var isFunction = function isFunction(o) { return typeof o === 'function'; }; var defaults = __nested_webpack_require_4608__(2); var assign = __nested_webpack_require_4608__(3); var dagre = __nested_webpack_require_4608__(4); // constructor // options : object containing layout options function DagreLayout(options) { this.options = assign({}, defaults, options); } // runs the layout DagreLayout.prototype.run = function () { var options = this.options; var layout = this; var cy = options.cy; // cy is automatically populated for us in the constructor var eles = options.eles; var getVal = function getVal(ele, val) { return isFunction(val) ? val.apply(ele, [ele]) : val; }; var bb = options.boundingBox || { x1: 0, y1: 0, w: cy.width(), h: cy.height() }; if (bb.x2 === undefined) { bb.x2 = bb.x1 + bb.w; } if (bb.w === undefined) { bb.w = bb.x2 - bb.x1; } if (bb.y2 === undefined) { bb.y2 = bb.y1 + bb.h; } if (bb.h === undefined) { bb.h = bb.y2 - bb.y1; } var g = new dagre.graphlib.Graph({ multigraph: true, compound: true }); var gObj = {}; var setGObj = function setGObj(name, val) { if (val != null) { gObj[name] = val; } }; setGObj('nodesep', options.nodeSep); setGObj('edgesep', options.edgeSep); setGObj('ranksep', options.rankSep); setGObj('rankdir', options.rankDir); setGObj('align', options.align); setGObj('ranker', options.ranker); setGObj('acyclicer', options.acyclicer); g.setGraph(gObj); g.setDefaultEdgeLabel(function () { return {}; }); g.setDefaultNodeLabel(function () { return {}; }); // add nodes to dagre var nodes = eles.nodes(); if (isFunction(options.sort)) { nodes = nodes.sort(options.sort); } for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var nbb = node.layoutDimensions(options); g.setNode(node.id(), { width: nbb.w, height: nbb.h, name: node.id() }); // console.log( g.node(node.id()) ); } // set compound parents for (var _i = 0; _i < nodes.length; _i++) { var _node = nodes[_i]; if (_node.isChild()) { g.setParent(_node.id(), _node.parent().id()); } } // add edges to dagre var edges = eles.edges().stdFilter(function (edge) { return !edge.source().isParent() && !edge.target().isParent(); // dagre can't handle edges on compound nodes }); if (isFunction(options.sort)) { edges = edges.sort(options.sort); } for (var _i2 = 0; _i2 < edges.length; _i2++) { var edge = edges[_i2]; g.setEdge(edge.source().id(), edge.target().id(), { minlen: getVal(edge, options.minLen), weight: getVal(edge, options.edgeWeight), name: edge.id() }, edge.id()); // console.log( g.edge(edge.source().id(), edge.target().id(), edge.id()) ); } dagre.layout(g); var gNodeIds = g.nodes(); for (var _i3 = 0; _i3 < gNodeIds.length; _i3++) { var id = gNodeIds[_i3]; var n = g.node(id); cy.getElementById(id).scratch().dagre = n; } var dagreBB; if (options.boundingBox) { dagreBB = { x1: Infinity, x2: -Infinity, y1: Infinity, y2: -Infinity }; nodes.forEach(function (node) { var dModel = node.scratch().dagre; dagreBB.x1 = Math.min(dagreBB.x1, dModel.x); dagreBB.x2 = Math.max(dagreBB.x2, dModel.x); dagreBB.y1 = Math.min(dagreBB.y1, dModel.y); dagreBB.y2 = Math.max(dagreBB.y2, dModel.y); }); dagreBB.w = dagreBB.x2 - dagreBB.x1; dagreBB.h = dagreBB.y2 - dagreBB.y1; } else { dagreBB = bb; } var constrainPos = function constrainPos(p) { if (options.boundingBox) { var xPct = dagreBB.w === 0 ? 0 : (p.x - dagreBB.x1) / dagreBB.w; var yPct = dagreBB.h === 0 ? 0 : (p.y - dagreBB.y1) / dagreBB.h; return { x: bb.x1 + xPct * bb.w, y: bb.y1 + yPct * bb.h }; } else { return p; } }; nodes.layoutPositions(layout, options, function (ele) { ele = _typeof(ele) === "object" ? ele : this; var dModel = ele.scratch().dagre; return constrainPos({ x: dModel.x, y: dModel.y }); }); return this; // chaining }; module.exports = DagreLayout; /***/ }), /* 2 */ /***/ (function(module, exports) { var defaults = { // dagre algo options, uses default value on undefined nodeSep: undefined, // the separation between adjacent nodes in the same rank edgeSep: undefined, // the separation between adjacent edges in the same rank rankSep: undefined, // the separation between adjacent nodes in the same rank rankDir: undefined, // 'TB' for top to bottom flow, 'LR' for left to right, align: undefined, // alignment for rank nodes. Can be 'UL', 'UR', 'DL', or 'DR', where U = up, D = down, L = left, and R = right acyclicer: undefined, // If set to 'greedy', uses 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. ranker: undefined, // Type of algorithm to assigns a rank to each node in the input graph. // Possible values: network-simplex, tight-tree or longest-path minLen: function minLen(edge) { return 1; }, // number of ranks to keep between the source and target of the edge edgeWeight: function edgeWeight(edge) { return 1; }, // higher weight edges are generally made shorter and straighter than lower weight edges // general layout options fit: true, // whether to fit to viewport padding: 30, // fit padding spacingFactor: undefined, // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up nodeDimensionsIncludeLabels: false, // whether labels should be included in determining the space used by a node animate: false, // whether to transition the node positions animateFilter: function animateFilter(node, i) { return true; }, // whether to animate specific nodes when animation is on; non-animated nodes immediately go to their final positions animationDuration: 500, // duration of animation in ms if enabled animationEasing: undefined, // easing of animation if enabled boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } transform: function transform(node, pos) { return pos; }, // a function that applies a transform to the final node position ready: function ready() {}, // on layoutready sort: undefined, // a sorting function to order the nodes and edges; e.g. function(a, b){ return a.data('weight') - b.data('weight') } // because cytoscape dagre creates a directed graph, and directed graphs use the node order as a tie breaker when // defining the topology of a graph, this sort function can help ensure the correct order of the nodes/edges. // this feature is most useful when adding and removing the same nodes and edges multiple times in a graph. stop: function stop() {} // on layoutstop }; module.exports = defaults; /***/ }), /* 3 */ /***/ (function(module, exports) { // Simple, internal Object.assign() polyfill for options objects etc. module.exports = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { for (var _len = arguments.length, srcs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { srcs[_key - 1] = arguments[_key]; } srcs.forEach(function (src) { Object.keys(src).forEach(function (k) { return tgt[k] = src[k]; }); }); return tgt; }; /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE__4__; /***/ }) /******/ ]); }); /***/ }), /***/ "./node_modules/cytoscape-fcose/cytoscape-fcose.js": /*!*********************************************************!*\ !*** ./node_modules/cytoscape-fcose/cytoscape-fcose.js ***! \*********************************************************/ /***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;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); } (function webpackUniversalModuleDefinition(root, factory) { if (( false ? 0 : _typeof(exports)) === 'object' && ( false ? 0 : _typeof(module)) === 'object') module.exports = factory(__webpack_require__(/*! cose-base */ "./node_modules/cose-base/cose-base.js"));else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! cose-base */ "./node_modules/cose-base/cose-base.js")], __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 // removed by dead control flow {} })(this, function (__WEBPACK_EXTERNAL_MODULE__140__) { return /******/function () { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = { /***/658: (/***/function _(module) { // Simple, internal Object.assign() polyfill for options objects etc. module.exports = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { for (var _len = arguments.length, srcs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { srcs[_key - 1] = arguments[_key]; } srcs.forEach(function (src) { Object.keys(src).forEach(function (k) { return tgt[k] = src[k]; }); }); return tgt; }; /***/ }), /***/548: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_1743__) { var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /* * Auxiliary functions */ var LinkedList = __nested_webpack_require_1743__(140).layoutBase.LinkedList; var auxiliary = {}; // get the top most nodes auxiliary.getTopMostNodes = function (nodes) { var nodesMap = {}; for (var i = 0; i < nodes.length; i++) { nodesMap[nodes[i].id()] = true; } var roots = nodes.filter(function (ele, i) { if (typeof ele === "number") { ele = i; } var parent = ele.parent()[0]; while (parent != null) { if (nodesMap[parent.id()]) { return false; } parent = parent.parent()[0]; } return true; }); return roots; }; // find disconnected components and create dummy nodes that connect them auxiliary.connectComponents = function (cy, eles, topMostNodes, dummyNodes) { var queue = new LinkedList(); var visited = new Set(); var visitedTopMostNodes = []; var currentNeighbor = void 0; var minDegreeNode = void 0; var minDegree = void 0; var isConnected = false; var count = 1; var nodesConnectedToDummy = []; var components = []; var _loop = function _loop() { var cmpt = cy.collection(); components.push(cmpt); var currentNode = topMostNodes[0]; var childrenOfCurrentNode = cy.collection(); childrenOfCurrentNode.merge(currentNode).merge(currentNode.descendants().intersection(eles)); visitedTopMostNodes.push(currentNode); childrenOfCurrentNode.forEach(function (node) { queue.push(node); visited.add(node); cmpt.merge(node); }); var _loop2 = function _loop2() { currentNode = queue.shift(); // Traverse all neighbors of this node var neighborNodes = cy.collection(); currentNode.neighborhood().nodes().forEach(function (node) { if (eles.intersection(currentNode.edgesWith(node)).length > 0) { neighborNodes.merge(node); } }); for (var i = 0; i < neighborNodes.length; i++) { var neighborNode = neighborNodes[i]; currentNeighbor = topMostNodes.intersection(neighborNode.union(neighborNode.ancestors())); if (currentNeighbor != null && !visited.has(currentNeighbor[0])) { var childrenOfNeighbor = currentNeighbor.union(currentNeighbor.descendants()); childrenOfNeighbor.forEach(function (node) { queue.push(node); visited.add(node); cmpt.merge(node); if (topMostNodes.has(node)) { visitedTopMostNodes.push(node); } }); } } }; while (queue.length != 0) { _loop2(); } cmpt.forEach(function (node) { eles.intersection(node.connectedEdges()).forEach(function (e) { // connectedEdges() usually cached if (cmpt.has(e.source()) && cmpt.has(e.target())) { // has() is cheap cmpt.merge(e); } }); }); if (visitedTopMostNodes.length == topMostNodes.length) { isConnected = true; } if (!isConnected || isConnected && count > 1) { minDegreeNode = visitedTopMostNodes[0]; minDegree = minDegreeNode.connectedEdges().length; visitedTopMostNodes.forEach(function (node) { if (node.connectedEdges().length < minDegree) { minDegree = node.connectedEdges().length; minDegreeNode = node; } }); nodesConnectedToDummy.push(minDegreeNode.id()); // TO DO: Check efficiency of this part var temp = cy.collection(); temp.merge(visitedTopMostNodes[0]); visitedTopMostNodes.forEach(function (node) { temp.merge(node); }); visitedTopMostNodes = []; topMostNodes = topMostNodes.difference(temp); count++; } }; do { _loop(); } while (!isConnected); if (dummyNodes) { if (nodesConnectedToDummy.length > 0) { dummyNodes.set('dummy' + (dummyNodes.size + 1), nodesConnectedToDummy); } } return components; }; // relocates componentResult to originalCenter if there is no fixedNodeConstraint auxiliary.relocateComponent = function (originalCenter, componentResult, options) { if (!options.fixedNodeConstraint) { var minXCoord = Number.POSITIVE_INFINITY; var maxXCoord = Number.NEGATIVE_INFINITY; var minYCoord = Number.POSITIVE_INFINITY; var maxYCoord = Number.NEGATIVE_INFINITY; if (options.quality == "draft") { // calculate current bounding box var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = componentResult.nodeIndexes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _ref = _step.value; var _ref2 = _slicedToArray(_ref, 2); var key = _ref2[0]; var value = _ref2[1]; var cyNode = options.cy.getElementById(key); if (cyNode) { var nodeBB = cyNode.boundingBox(); var leftX = componentResult.xCoords[value] - nodeBB.w / 2; var rightX = componentResult.xCoords[value] + nodeBB.w / 2; var topY = componentResult.yCoords[value] - nodeBB.h / 2; var bottomY = componentResult.yCoords[value] + nodeBB.h / 2; if (leftX < minXCoord) minXCoord = leftX; if (rightX > maxXCoord) maxXCoord = rightX; if (topY < minYCoord) minYCoord = topY; if (bottomY > maxYCoord) maxYCoord = bottomY; } } // find difference between current and original center } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var diffOnX = originalCenter.x - (maxXCoord + minXCoord) / 2; var diffOnY = originalCenter.y - (maxYCoord + minYCoord) / 2; // move component to original center componentResult.xCoords = componentResult.xCoords.map(function (x) { return x + diffOnX; }); componentResult.yCoords = componentResult.yCoords.map(function (y) { return y + diffOnY; }); } else { // calculate current bounding box Object.keys(componentResult).forEach(function (item) { var node = componentResult[item]; var leftX = node.getRect().x; var rightX = node.getRect().x + node.getRect().width; var topY = node.getRect().y; var bottomY = node.getRect().y + node.getRect().height; if (leftX < minXCoord) minXCoord = leftX; if (rightX > maxXCoord) maxXCoord = rightX; if (topY < minYCoord) minYCoord = topY; if (bottomY > maxYCoord) maxYCoord = bottomY; }); // find difference between current and original center var _diffOnX = originalCenter.x - (maxXCoord + minXCoord) / 2; var _diffOnY = originalCenter.y - (maxYCoord + minYCoord) / 2; // move component to original center Object.keys(componentResult).forEach(function (item) { var node = componentResult[item]; node.setCenter(node.getCenterX() + _diffOnX, node.getCenterY() + _diffOnY); }); } } }; auxiliary.calcBoundingBox = function (parentNode, xCoords, yCoords, nodeIndexes) { // calculate bounds var left = Number.MAX_SAFE_INTEGER; var right = Number.MIN_SAFE_INTEGER; var top = Number.MAX_SAFE_INTEGER; var bottom = Number.MIN_SAFE_INTEGER; var nodeLeft = void 0; var nodeRight = void 0; var nodeTop = void 0; var nodeBottom = void 0; var nodes = parentNode.descendants().not(":parent"); var s = nodes.length; for (var i = 0; i < s; i++) { var node = nodes[i]; nodeLeft = xCoords[nodeIndexes.get(node.id())] - node.width() / 2; nodeRight = xCoords[nodeIndexes.get(node.id())] + node.width() / 2; nodeTop = yCoords[nodeIndexes.get(node.id())] - node.height() / 2; nodeBottom = yCoords[nodeIndexes.get(node.id())] + node.height() / 2; if (left > nodeLeft) { left = nodeLeft; } if (right < nodeRight) { right = nodeRight; } if (top > nodeTop) { top = nodeTop; } if (bottom < nodeBottom) { bottom = nodeBottom; } } var boundingBox = {}; boundingBox.topLeftX = left; boundingBox.topLeftY = top; boundingBox.width = right - left; boundingBox.height = bottom - top; return boundingBox; }; // This function finds and returns parent nodes whose all children are hidden auxiliary.calcParentsWithoutChildren = function (cy, eles) { var parentsWithoutChildren = cy.collection(); eles.nodes(':parent').forEach(function (parent) { var check = false; parent.children().forEach(function (child) { if (child.css('display') != 'none') { check = true; } }); if (!check) { parentsWithoutChildren.merge(parent); } }); return parentsWithoutChildren; }; module.exports = auxiliary; /***/ }), /***/816: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_14032__) { /** The implementation of the postprocessing part that applies CoSE layout over the spectral layout */ var aux = __nested_webpack_require_14032__(548); var CoSELayout = __nested_webpack_require_14032__(140).CoSELayout; var CoSENode = __nested_webpack_require_14032__(140).CoSENode; var PointD = __nested_webpack_require_14032__(140).layoutBase.PointD; var DimensionD = __nested_webpack_require_14032__(140).layoutBase.DimensionD; var LayoutConstants = __nested_webpack_require_14032__(140).layoutBase.LayoutConstants; var FDLayoutConstants = __nested_webpack_require_14032__(140).layoutBase.FDLayoutConstants; var CoSEConstants = __nested_webpack_require_14032__(140).CoSEConstants; // main function that cose layout is processed var coseLayout = function coseLayout(options, spectralResult) { var cy = options.cy; var eles = options.eles; var nodes = eles.nodes(); var edges = eles.edges(); var nodeIndexes = void 0; var xCoords = void 0; var yCoords = void 0; var idToLNode = {}; if (options.randomize) { nodeIndexes = spectralResult["nodeIndexes"]; xCoords = spectralResult["xCoords"]; yCoords = spectralResult["yCoords"]; } var isFn = function isFn(fn) { return typeof fn === 'function'; }; var optFn = function optFn(opt, ele) { if (isFn(opt)) { return opt(ele); } else { return opt; } }; /**** Postprocessing functions ****/ var parentsWithoutChildren = aux.calcParentsWithoutChildren(cy, eles); // transfer cytoscape nodes to cose nodes var processChildrenList = function processChildrenList(parent, children, layout, options) { var size = children.length; for (var i = 0; i < size; i++) { var theChild = children[i]; var children_of_children = null; if (theChild.intersection(parentsWithoutChildren).length == 0) { children_of_children = theChild.children(); } var theNode = void 0; var dimensions = theChild.layoutDimensions({ nodeDimensionsIncludeLabels: options.nodeDimensionsIncludeLabels }); if (theChild.outerWidth() != null && theChild.outerHeight() != null) { if (options.randomize) { if (!theChild.isParent()) { theNode = parent.add(new CoSENode(layout.graphManager, new PointD(xCoords[nodeIndexes.get(theChild.id())] - dimensions.w / 2, yCoords[nodeIndexes.get(theChild.id())] - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h)))); } else { var parentInfo = aux.calcBoundingBox(theChild, xCoords, yCoords, nodeIndexes); if (theChild.intersection(parentsWithoutChildren).length == 0) { theNode = parent.add(new CoSENode(layout.graphManager, new PointD(parentInfo.topLeftX, parentInfo.topLeftY), new DimensionD(parentInfo.width, parentInfo.height))); } else { // for the parentsWithoutChildren theNode = parent.add(new CoSENode(layout.graphManager, new PointD(parentInfo.topLeftX, parentInfo.topLeftY), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h)))); } } } else { theNode = parent.add(new CoSENode(layout.graphManager, new PointD(theChild.position('x') - dimensions.w / 2, theChild.position('y') - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h)))); } } else { theNode = parent.add(new CoSENode(this.graphManager)); } // Attach id to the layout node and repulsion value theNode.id = theChild.data("id"); theNode.nodeRepulsion = optFn(options.nodeRepulsion, theChild); // Attach the paddings of cy node to layout node theNode.paddingLeft = parseInt(theChild.css('padding')); theNode.paddingTop = parseInt(theChild.css('padding')); theNode.paddingRight = parseInt(theChild.css('padding')); theNode.paddingBottom = parseInt(theChild.css('padding')); //Attach the label properties to both compound and simple nodes if labels will be included in node dimensions //These properties will be used while updating bounds of compounds during iterations or tiling //and will be used for simple nodes while transferring final positions to cytoscape if (options.nodeDimensionsIncludeLabels) { theNode.labelWidth = theChild.boundingBox({ includeLabels: true, includeNodes: false, includeOverlays: false }).w; theNode.labelHeight = theChild.boundingBox({ includeLabels: true, includeNodes: false, includeOverlays: false }).h; theNode.labelPosVertical = theChild.css("text-valign"); theNode.labelPosHorizontal = theChild.css("text-halign"); } // Map the layout node idToLNode[theChild.data("id")] = theNode; if (isNaN(theNode.rect.x)) { theNode.rect.x = 0; } if (isNaN(theNode.rect.y)) { theNode.rect.y = 0; } if (children_of_children != null && children_of_children.length > 0) { var theNewGraph = void 0; theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode); processChildrenList(theNewGraph, children_of_children, layout, options); } } }; // transfer cytoscape edges to cose edges var processEdges = function processEdges(layout, gm, edges) { var idealLengthTotal = 0; var edgeCount = 0; for (var i = 0; i < edges.length; i++) { var edge = edges[i]; var sourceNode = idToLNode[edge.data("source")]; var targetNode = idToLNode[edge.data("target")]; if (sourceNode && targetNode && sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) { var e1 = gm.add(layout.newEdge(), sourceNode, targetNode); e1.id = edge.id(); e1.idealLength = optFn(options.idealEdgeLength, edge); e1.edgeElasticity = optFn(options.edgeElasticity, edge); idealLengthTotal += e1.idealLength; edgeCount++; } } // we need to update the ideal edge length constant with the avg. ideal length value after processing edges // in case there is no edge, use other options if (options.idealEdgeLength != null) { if (edgeCount > 0) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = idealLengthTotal / edgeCount;else if (!isFn(options.idealEdgeLength)) // in case there is no edge, but option gives a value to use CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength;else // in case there is no edge and we cannot get a value from option (because it's a function) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50; // we need to update these constant values based on the ideal edge length constant CoSEConstants.MIN_REPULSION_DIST = FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0; CoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH; } }; // transfer cytoscape constraints to cose layout var processConstraints = function processConstraints(layout, options) { // get nodes to be fixed if (options.fixedNodeConstraint) { layout.constraints["fixedNodeConstraint"] = options.fixedNodeConstraint; } // get nodes to be aligned if (options.alignmentConstraint) { layout.constraints["alignmentConstraint"] = options.alignmentConstraint; } // get nodes to be relatively placed if (options.relativePlacementConstraint) { layout.constraints["relativePlacementConstraint"] = options.relativePlacementConstraint; } }; /**** Apply postprocessing ****/ if (options.nestingFactor != null) CoSEConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = options.nestingFactor; if (options.gravity != null) CoSEConstants.DEFAULT_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = options.gravity; if (options.numIter != null) CoSEConstants.MAX_ITERATIONS = FDLayoutConstants.MAX_ITERATIONS = options.numIter; if (options.gravityRange != null) CoSEConstants.DEFAULT_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = options.gravityRange; if (options.gravityCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = options.gravityCompound; if (options.gravityRangeCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = options.gravityRangeCompound; if (options.initialEnergyOnIncremental != null) CoSEConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = options.initialEnergyOnIncremental; if (options.tilingCompareBy != null) CoSEConstants.TILING_COMPARE_BY = options.tilingCompareBy; if (options.quality == 'proof') LayoutConstants.QUALITY = 2;else LayoutConstants.QUALITY = 0; CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS = FDLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = options.nodeDimensionsIncludeLabels; CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = !options.randomize; CoSEConstants.ANIMATE = FDLayoutConstants.ANIMATE = LayoutConstants.ANIMATE = options.animate; CoSEConstants.TILE = options.tile; CoSEConstants.TILING_PADDING_VERTICAL = typeof options.tilingPaddingVertical === 'function' ? options.tilingPaddingVertical.call() : options.tilingPaddingVertical; CoSEConstants.TILING_PADDING_HORIZONTAL = typeof options.tilingPaddingHorizontal === 'function' ? options.tilingPaddingHorizontal.call() : options.tilingPaddingHorizontal; CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = true; CoSEConstants.PURE_INCREMENTAL = !options.randomize; LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = options.uniformNodeDimensions; // This part is for debug/demo purpose if (options.step == "transformed") { CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true; CoSEConstants.ENFORCE_CONSTRAINTS = false; CoSEConstants.APPLY_LAYOUT = false; } if (options.step == "enforced") { CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false; CoSEConstants.ENFORCE_CONSTRAINTS = true; CoSEConstants.APPLY_LAYOUT = false; } if (options.step == "cose") { CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false; CoSEConstants.ENFORCE_CONSTRAINTS = false; CoSEConstants.APPLY_LAYOUT = true; } if (options.step == "all") { if (options.randomize) CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = true;else CoSEConstants.TRANSFORM_ON_CONSTRAINT_HANDLING = false; CoSEConstants.ENFORCE_CONSTRAINTS = true; CoSEConstants.APPLY_LAYOUT = true; } if (options.fixedNodeConstraint || options.alignmentConstraint || options.relativePlacementConstraint) { CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = false; } else { CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = true; } var coseLayout = new CoSELayout(); var gm = coseLayout.newGraphManager(); processChildrenList(gm.addRoot(), aux.getTopMostNodes(nodes), coseLayout, options); processEdges(coseLayout, gm, edges); processConstraints(coseLayout, options); coseLayout.runLayout(); return idToLNode; }; module.exports = { coseLayout: coseLayout }; /***/ }), /***/212: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_27297__) { 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"); } } /** The implementation of the fcose layout algorithm */ var assign = __nested_webpack_require_27297__(658); var aux = __nested_webpack_require_27297__(548); var _require = __nested_webpack_require_27297__(657), spectralLayout = _require.spectralLayout; var _require2 = __nested_webpack_require_27297__(816), coseLayout = _require2.coseLayout; var defaults = Object.freeze({ // 'draft', 'default' or 'proof' // - 'draft' only applies spectral layout // - 'default' improves the quality with subsequent CoSE layout (fast cooling rate) // - 'proof' improves the quality with subsequent CoSE layout (slow cooling rate) quality: "default", // Use random node positions at beginning of layout // if this is set to false, then quality option must be "proof" randomize: true, // Whether or not to animate the layout animate: true, // Duration of animation in ms, if enabled animationDuration: 1000, // Easing of animation, if enabled animationEasing: undefined, // Fit the viewport to the repositioned nodes fit: true, // Padding around layout padding: 30, // Whether to include labels in node dimensions. Valid in "proof" quality nodeDimensionsIncludeLabels: false, // Whether or not simple nodes (non-compound nodes) are of uniform dimensions uniformNodeDimensions: false, // Whether to pack disconnected components - valid only if randomize: true packComponents: true, // Layout step - all, transformed, enforced, cose - for debug purpose only step: "all", /* spectral layout options */ // False for random, true for greedy samplingType: true, // Sample size to construct distance matrix sampleSize: 25, // Separation amount between nodes nodeSeparation: 75, // Power iteration tolerance piTol: 0.0000001, /* CoSE layout options */ // Node repulsion (non overlapping) multiplier nodeRepulsion: function nodeRepulsion(node) { return 4500; }, // Ideal edge (non nested) length idealEdgeLength: function idealEdgeLength(edge) { return 50; }, // Divisor to compute edge forces edgeElasticity: function edgeElasticity(edge) { return 0.45; }, // Nesting factor (multiplier) to compute ideal edge length for nested edges nestingFactor: 0.1, // Gravity force (constant) gravity: 0.25, // Maximum number of iterations to perform numIter: 2500, // For enabling tiling tile: true, // The function that specifies the criteria for comparing nodes while sorting them during tiling operation. // Takes the node id as a parameter and the default tiling operation is perfomed when this option is not set. tilingCompareBy: undefined, // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function) tilingPaddingVertical: 10, // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function) tilingPaddingHorizontal: 10, // Gravity range (constant) for compounds gravityRangeCompound: 1.5, // Gravity force (constant) for compounds gravityCompound: 1.0, // Gravity range (constant) gravityRange: 3.8, // Initial cooling factor for incremental layout initialEnergyOnIncremental: 0.3, /* constraint options */ // Fix required nodes to predefined positions // [{nodeId: 'n1', position: {x: 100, y: 200}, {...}] fixedNodeConstraint: undefined, // Align required nodes in vertical/horizontal direction // {vertical: [['n1', 'n2')], ['n3', 'n4']], horizontal: ['n2', 'n4']} alignmentConstraint: undefined, // Place two nodes relatively in vertical/horizontal direction // [{top: 'n1', bottom: 'n2', gap: 100}, {left: 'n3', right: 'n4', gap: 75}] relativePlacementConstraint: undefined, /* layout event callbacks */ ready: function ready() {}, // on layoutready stop: function stop() {} // on layoutstop }); var Layout = function () { function Layout(options) { _classCallCheck(this, Layout); this.options = assign({}, defaults, options); } _createClass(Layout, [{ key: 'run', value: function run() { var layout = this; var options = this.options; var cy = options.cy; var eles = options.eles; var spectralResult = []; var xCoords = void 0; var yCoords = void 0; var coseResult = []; var components = void 0; var componentCenters = []; // basic validity check for constraint inputs if (options.fixedNodeConstraint && (!Array.isArray(options.fixedNodeConstraint) || options.fixedNodeConstraint.length == 0)) { options.fixedNodeConstraint = undefined; } if (options.alignmentConstraint) { if (options.alignmentConstraint.vertical && (!Array.isArray(options.alignmentConstraint.vertical) || options.alignmentConstraint.vertical.length == 0)) { options.alignmentConstraint.vertical = undefined; } if (options.alignmentConstraint.horizontal && (!Array.isArray(options.alignmentConstraint.horizontal) || options.alignmentConstraint.horizontal.length == 0)) { options.alignmentConstraint.horizontal = undefined; } } if (options.relativePlacementConstraint && (!Array.isArray(options.relativePlacementConstraint) || options.relativePlacementConstraint.length == 0)) { options.relativePlacementConstraint = undefined; } // if any constraint exists, set some options var constraintExist = options.fixedNodeConstraint || options.alignmentConstraint || options.relativePlacementConstraint; if (constraintExist) { // constraints work with these options options.tile = false; options.packComponents = false; } // decide component packing is enabled or not var layUtil = void 0; var packingEnabled = false; if (cy.layoutUtilities && options.packComponents) { layUtil = cy.layoutUtilities("get"); if (!layUtil) layUtil = cy.layoutUtilities(); packingEnabled = true; } if (eles.nodes().length > 0) { // if packing is not enabled, perform layout on the whole graph if (!packingEnabled) { // store component center var boundingBox = options.eles.boundingBox(); componentCenters.push({ x: boundingBox.x1 + boundingBox.w / 2, y: boundingBox.y1 + boundingBox.h / 2 }); // apply spectral layout if (options.randomize) { var result = spectralLayout(options); spectralResult.push(result); } // apply cose layout as postprocessing if (options.quality == "default" || options.quality == "proof") { coseResult.push(coseLayout(options, spectralResult[0])); aux.relocateComponent(componentCenters[0], coseResult[0], options); // relocate center to original position } else { aux.relocateComponent(componentCenters[0], spectralResult[0], options); // relocate center to original position } } else { // packing is enabled var topMostNodes = aux.getTopMostNodes(options.eles.nodes()); components = aux.connectComponents(cy, options.eles, topMostNodes); // store component centers components.forEach(function (component) { var boundingBox = component.boundingBox(); componentCenters.push({ x: boundingBox.x1 + boundingBox.w / 2, y: boundingBox.y1 + boundingBox.h / 2 }); }); //send each component to spectral layout if randomized if (options.randomize) { components.forEach(function (component) { options.eles = component; spectralResult.push(spectralLayout(options)); }); } if (options.quality == "default" || options.quality == "proof") { var toBeTiledNodes = cy.collection(); if (options.tile) { // behave nodes to be tiled as one component var nodeIndexes = new Map(); var _xCoords = []; var _yCoords = []; var count = 0; var tempSpectralResult = { nodeIndexes: nodeIndexes, xCoords: _xCoords, yCoords: _yCoords }; var indexesToBeDeleted = []; components.forEach(function (component, index) { if (component.edges().length == 0) { component.nodes().forEach(function (node, i) { toBeTiledNodes.merge(component.nodes()[i]); if (!node.isParent()) { tempSpectralResult.nodeIndexes.set(component.nodes()[i].id(), count++); tempSpectralResult.xCoords.push(component.nodes()[0].position().x); tempSpectralResult.yCoords.push(component.nodes()[0].position().y); } }); indexesToBeDeleted.push(index); } }); if (toBeTiledNodes.length > 1) { var _boundingBox = toBeTiledNodes.boundingBox(); componentCenters.push({ x: _boundingBox.x1 + _boundingBox.w / 2, y: _boundingBox.y1 + _boundingBox.h / 2 }); components.push(toBeTiledNodes); spectralResult.push(tempSpectralResult); for (var i = indexesToBeDeleted.length - 1; i >= 0; i--) { components.splice(indexesToBeDeleted[i], 1); spectralResult.splice(indexesToBeDeleted[i], 1); componentCenters.splice(indexesToBeDeleted[i], 1); } ; } } components.forEach(function (component, index) { // send each component to cose layout options.eles = component; coseResult.push(coseLayout(options, spectralResult[index])); aux.relocateComponent(componentCenters[index], coseResult[index], options); // relocate center to original position }); } else { components.forEach(function (component, index) { aux.relocateComponent(componentCenters[index], spectralResult[index], options); // relocate center to original position }); } // packing var componentsEvaluated = new Set(); if (components.length > 1) { var subgraphs = []; var hiddenEles = eles.filter(function (ele) { return ele.css('display') == 'none'; }); components.forEach(function (component, index) { var nodeIndexes = void 0; if (options.quality == "draft") { nodeIndexes = spectralResult[index].nodeIndexes; } if (component.nodes().not(hiddenEles).length > 0) { var subgraph = {}; subgraph.edges = []; subgraph.nodes = []; var nodeIndex = void 0; component.nodes().not(hiddenEles).forEach(function (node) { if (options.quality == "draft") { if (!node.isParent()) { nodeIndex = nodeIndexes.get(node.id()); subgraph.nodes.push({ x: spectralResult[index].xCoords[nodeIndex] - node.boundingbox().w / 2, y: spectralResult[index].yCoords[nodeIndex] - node.boundingbox().h / 2, width: node.boundingbox().w, height: node.boundingbox().h }); } else { var parentInfo = aux.calcBoundingBox(node, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes); subgraph.nodes.push({ x: parentInfo.topLeftX, y: parentInfo.topLeftY, width: parentInfo.width, height: parentInfo.height }); } } else { if (coseResult[index][node.id()]) { subgraph.nodes.push({ x: coseResult[index][node.id()].getLeft(), y: coseResult[index][node.id()].getTop(), width: coseResult[index][node.id()].getWidth(), height: coseResult[index][node.id()].getHeight() }); } } }); component.edges().forEach(function (edge) { var source = edge.source(); var target = edge.target(); if (source.css("display") != "none" && target.css("display") != "none") { if (options.quality == "draft") { var sourceNodeIndex = nodeIndexes.get(source.id()); var targetNodeIndex = nodeIndexes.get(target.id()); var sourceCenter = []; var targetCenter = []; if (source.isParent()) { var parentInfo = aux.calcBoundingBox(source, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes); sourceCenter.push(parentInfo.topLeftX + parentInfo.width / 2); sourceCenter.push(parentInfo.topLeftY + parentInfo.height / 2); } else { sourceCenter.push(spectralResult[index].xCoords[sourceNodeIndex]); sourceCenter.push(spectralResult[index].yCoords[sourceNodeIndex]); } if (target.isParent()) { var _parentInfo = aux.calcBoundingBox(target, spectralResult[index].xCoords, spectralResult[index].yCoords, nodeIndexes); targetCenter.push(_parentInfo.topLeftX + _parentInfo.width / 2); targetCenter.push(_parentInfo.topLeftY + _parentInfo.height / 2); } else { targetCenter.push(spectralResult[index].xCoords[targetNodeIndex]); targetCenter.push(spectralResult[index].yCoords[targetNodeIndex]); } subgraph.edges.push({ startX: sourceCenter[0], startY: sourceCenter[1], endX: targetCenter[0], endY: targetCenter[1] }); } else { if (coseResult[index][source.id()] && coseResult[index][target.id()]) { subgraph.edges.push({ startX: coseResult[index][source.id()].getCenterX(), startY: coseResult[index][source.id()].getCenterY(), endX: coseResult[index][target.id()].getCenterX(), endY: coseResult[index][target.id()].getCenterY() }); } } } }); if (subgraph.nodes.length > 0) { subgraphs.push(subgraph); componentsEvaluated.add(index); } } }); var shiftResult = layUtil.packComponents(subgraphs, options.randomize).shifts; if (options.quality == "draft") { spectralResult.forEach(function (result, index) { var newXCoords = result.xCoords.map(function (x) { return x + shiftResult[index].dx; }); var newYCoords = result.yCoords.map(function (y) { return y + shiftResult[index].dy; }); result.xCoords = newXCoords; result.yCoords = newYCoords; }); } else { var _count = 0; componentsEvaluated.forEach(function (index) { Object.keys(coseResult[index]).forEach(function (item) { var nodeRectangle = coseResult[index][item]; nodeRectangle.setCenter(nodeRectangle.getCenterX() + shiftResult[_count].dx, nodeRectangle.getCenterY() + shiftResult[_count].dy); }); _count++; }); } } } } // get each element's calculated position var getPositions = function getPositions(ele, i) { if (options.quality == "default" || options.quality == "proof") { if (typeof ele === "number") { ele = i; } var pos = void 0; var node = void 0; var theId = ele.data('id'); coseResult.forEach(function (result) { if (theId in result) { pos = { x: result[theId].getRect().getCenterX(), y: result[theId].getRect().getCenterY() }; node = result[theId]; } }); if (options.nodeDimensionsIncludeLabels) { if (node.labelWidth) { if (node.labelPosHorizontal == "left") { pos.x += node.labelWidth / 2; } else if (node.labelPosHorizontal == "right") { pos.x -= node.labelWidth / 2; } } if (node.labelHeight) { if (node.labelPosVertical == "top") { pos.y += node.labelHeight / 2; } else if (node.labelPosVertical == "bottom") { pos.y -= node.labelHeight / 2; } } } if (pos == undefined) pos = { x: ele.position("x"), y: ele.position("y") }; return { x: pos.x, y: pos.y }; } else { var _pos = void 0; spectralResult.forEach(function (result) { var index = result.nodeIndexes.get(ele.id()); if (index != undefined) { _pos = { x: result.xCoords[index], y: result.yCoords[index] }; } }); if (_pos == undefined) _pos = { x: ele.position("x"), y: ele.position("y") }; return { x: _pos.x, y: _pos.y }; } }; // quality = "draft" and randomize = false are contradictive so in that case positions don't change if (options.quality == "default" || options.quality == "proof" || options.randomize) { // transfer calculated positions to nodes (positions of only simple nodes are evaluated, compounds are positioned automatically) var parentsWithoutChildren = aux.calcParentsWithoutChildren(cy, eles); var _hiddenEles = eles.filter(function (ele) { return ele.css('display') == 'none'; }); options.eles = eles.not(_hiddenEles); eles.nodes().not(":parent").not(_hiddenEles).layoutPositions(layout, options, getPositions); if (parentsWithoutChildren.length > 0) { parentsWithoutChildren.forEach(function (ele) { ele.position(getPositions(ele)); }); } } else { console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'."); } } }]); return Layout; }(); module.exports = Layout; /***/ }), /***/657: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_51576__) { /** The implementation of the spectral layout that is the first part of the fcose layout algorithm */ var aux = __nested_webpack_require_51576__(548); var Matrix = __nested_webpack_require_51576__(140).layoutBase.Matrix; var SVD = __nested_webpack_require_51576__(140).layoutBase.SVD; // main function that spectral layout is processed var spectralLayout = function spectralLayout(options) { var cy = options.cy; var eles = options.eles; var nodes = eles.nodes(); var parentNodes = eles.nodes(":parent"); var dummyNodes = new Map(); // map to keep dummy nodes and their neighbors var nodeIndexes = new Map(); // map to keep indexes to nodes var parentChildMap = new Map(); // mapping btw. compound and its representative node var allNodesNeighborhood = []; // array to keep neighborhood of all nodes var xCoords = []; var yCoords = []; var samplesColumn = []; // sampled vertices var minDistancesColumn = []; var C = []; // column sampling matrix var PHI = []; // intersection of column and row sampling matrices var INV = []; // inverse of PHI var firstSample = void 0; // the first sampled node var nodeSize = void 0; var infinity = 100000000; var small = 0.000000001; var piTol = options.piTol; var samplingType = options.samplingType; // false for random, true for greedy var nodeSeparation = options.nodeSeparation; var sampleSize = void 0; /**** Spectral-preprocessing functions ****/ /**** Spectral layout functions ****/ // determine which columns to be sampled var randomSampleCR = function randomSampleCR() { var sample = 0; var count = 0; var flag = false; while (count < sampleSize) { sample = Math.floor(Math.random() * nodeSize); flag = false; for (var i = 0; i < count; i++) { if (samplesColumn[i] == sample) { flag = true; break; } } if (!flag) { samplesColumn[count] = sample; count++; } else { continue; } } }; // takes the index of the node(pivot) to initiate BFS as a parameter var BFS = function BFS(pivot, index, samplingMethod) { var path = []; // the front of the path var front = 0; // the back of the path var back = 0; var current = 0; var temp = void 0; var distance = []; var max_dist = 0; // the furthest node to be returned var max_ind = 1; for (var i = 0; i < nodeSize; i++) { distance[i] = infinity; } path[back] = pivot; distance[pivot] = 0; while (back >= front) { current = path[front++]; var neighbors = allNodesNeighborhood[current]; for (var _i = 0; _i < neighbors.length; _i++) { temp = nodeIndexes.get(neighbors[_i]); if (distance[temp] == infinity) { distance[temp] = distance[current] + 1; path[++back] = temp; } } C[current][index] = distance[current] * nodeSeparation; } if (samplingMethod) { for (var _i2 = 0; _i2 < nodeSize; _i2++) { if (C[_i2][index] < minDistancesColumn[_i2]) minDistancesColumn[_i2] = C[_i2][index]; } for (var _i3 = 0; _i3 < nodeSize; _i3++) { if (minDistancesColumn[_i3] > max_dist) { max_dist = minDistancesColumn[_i3]; max_ind = _i3; } } } return max_ind; }; // apply BFS to all nodes or selected samples var allBFS = function allBFS(samplingMethod) { var sample = void 0; if (!samplingMethod) { randomSampleCR(); // call BFS for (var i = 0; i < sampleSize; i++) { BFS(samplesColumn[i], i, samplingMethod, false); } } else { sample = Math.floor(Math.random() * nodeSize); firstSample = sample; for (var _i4 = 0; _i4 < nodeSize; _i4++) { minDistancesColumn[_i4] = infinity; } for (var _i5 = 0; _i5 < sampleSize; _i5++) { samplesColumn[_i5] = sample; sample = BFS(sample, _i5, samplingMethod); } } // form the squared distances for C for (var _i6 = 0; _i6 < nodeSize; _i6++) { for (var j = 0; j < sampleSize; j++) { C[_i6][j] *= C[_i6][j]; } } // form PHI for (var _i7 = 0; _i7 < sampleSize; _i7++) { PHI[_i7] = []; } for (var _i8 = 0; _i8 < sampleSize; _i8++) { for (var _j = 0; _j < sampleSize; _j++) { PHI[_i8][_j] = C[samplesColumn[_j]][_i8]; } } }; // perform the SVD algorithm and apply a regularization step var sample = function sample() { var SVDResult = SVD.svd(PHI); var a_q = SVDResult.S; var a_u = SVDResult.U; var a_v = SVDResult.V; var max_s = a_q[0] * a_q[0] * a_q[0]; var a_Sig = []; // regularization for (var i = 0; i < sampleSize; i++) { a_Sig[i] = []; for (var j = 0; j < sampleSize; j++) { a_Sig[i][j] = 0; if (i == j) { a_Sig[i][j] = a_q[i] / (a_q[i] * a_q[i] + max_s / (a_q[i] * a_q[i])); } } } INV = Matrix.multMat(Matrix.multMat(a_v, a_Sig), Matrix.transpose(a_u)); }; // calculate final coordinates var powerIteration = function powerIteration() { // two largest eigenvalues var theta1 = void 0; var theta2 = void 0; // initial guesses for eigenvectors var Y1 = []; var Y2 = []; var V1 = []; var V2 = []; for (var i = 0; i < nodeSize; i++) { Y1[i] = Math.random(); Y2[i] = Math.random(); } Y1 = Matrix.normalize(Y1); Y2 = Matrix.normalize(Y2); var count = 0; // to keep track of the improvement ratio in power iteration var current = small; var previous = small; var temp = void 0; while (true) { count++; for (var _i9 = 0; _i9 < nodeSize; _i9++) { V1[_i9] = Y1[_i9]; } Y1 = Matrix.multGamma(Matrix.multL(Matrix.multGamma(V1), C, INV)); theta1 = Matrix.dotProduct(V1, Y1); Y1 = Matrix.normalize(Y1); current = Matrix.dotProduct(V1, Y1); temp = Math.abs(current / previous); if (temp <= 1 + piTol && temp >= 1) { break; } previous = current; } for (var _i10 = 0; _i10 < nodeSize; _i10++) { V1[_i10] = Y1[_i10]; } count = 0; previous = small; while (true) { count++; for (var _i11 = 0; _i11 < nodeSize; _i11++) { V2[_i11] = Y2[_i11]; } V2 = Matrix.minusOp(V2, Matrix.multCons(V1, Matrix.dotProduct(V1, V2))); Y2 = Matrix.multGamma(Matrix.multL(Matrix.multGamma(V2), C, INV)); theta2 = Matrix.dotProduct(V2, Y2); Y2 = Matrix.normalize(Y2); current = Matrix.dotProduct(V2, Y2); temp = Math.abs(current / previous); if (temp <= 1 + piTol && temp >= 1) { break; } previous = current; } for (var _i12 = 0; _i12 < nodeSize; _i12++) { V2[_i12] = Y2[_i12]; } // theta1 now contains dominant eigenvalue // theta2 now contains the second-largest eigenvalue // V1 now contains theta1's eigenvector // V2 now contains theta2's eigenvector //populate the two vectors xCoords = Matrix.multCons(V1, Math.sqrt(Math.abs(theta1))); yCoords = Matrix.multCons(V2, Math.sqrt(Math.abs(theta2))); }; /**** Preparation for spectral layout (Preprocessing) ****/ // connect disconnected components (first top level, then inside of each compound node) aux.connectComponents(cy, eles, aux.getTopMostNodes(nodes), dummyNodes); parentNodes.forEach(function (ele) { aux.connectComponents(cy, eles, aux.getTopMostNodes(ele.descendants().intersection(eles)), dummyNodes); }); // assign indexes to nodes (first real, then dummy nodes) var index = 0; for (var i = 0; i < nodes.length; i++) { if (!nodes[i].isParent()) { nodeIndexes.set(nodes[i].id(), index++); } } var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = dummyNodes.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; nodeIndexes.set(key, index++); } // instantiate the neighborhood matrix } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } for (var _i13 = 0; _i13 < nodeIndexes.size; _i13++) { allNodesNeighborhood[_i13] = []; } // form a parent-child map to keep representative node of each compound node parentNodes.forEach(function (ele) { var children = ele.children().intersection(eles); // let random = 0; while (children.nodes(":childless").length == 0) { // random = Math.floor(Math.random() * children.nodes().length); // if all children are compound then proceed randomly children = children.nodes()[0].children().intersection(eles); } // select the representative node - we can apply different methods here // random = Math.floor(Math.random() * children.nodes(":childless").length); var index = 0; var min = children.nodes(":childless")[0].connectedEdges().length; children.nodes(":childless").forEach(function (ele2, i) { if (ele2.connectedEdges().length < min) { min = ele2.connectedEdges().length; index = i; } }); parentChildMap.set(ele.id(), children.nodes(":childless")[index].id()); }); // add neighborhood relations (first real, then dummy nodes) nodes.forEach(function (ele) { var eleIndex = void 0; if (ele.isParent()) eleIndex = nodeIndexes.get(parentChildMap.get(ele.id()));else eleIndex = nodeIndexes.get(ele.id()); ele.neighborhood().nodes().forEach(function (node) { if (eles.intersection(ele.edgesWith(node)).length > 0) { if (node.isParent()) allNodesNeighborhood[eleIndex].push(parentChildMap.get(node.id()));else allNodesNeighborhood[eleIndex].push(node.id()); } }); }); var _loop = function _loop(_key) { var eleIndex = nodeIndexes.get(_key); var disconnectedId = void 0; dummyNodes.get(_key).forEach(function (id) { if (cy.getElementById(id).isParent()) disconnectedId = parentChildMap.get(id);else disconnectedId = id; allNodesNeighborhood[eleIndex].push(disconnectedId); allNodesNeighborhood[nodeIndexes.get(disconnectedId)].push(_key); }); }; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = dummyNodes.keys()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var _key = _step2.value; _loop(_key); } // nodeSize now only considers the size of transformed graph } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } nodeSize = nodeIndexes.size; var spectralResult = void 0; // If number of nodes in transformed graph is 1 or 2, either SVD or powerIteration causes problem // So skip spectral and layout the graph with cose if (nodeSize > 2) { // if # of nodes in transformed graph is smaller than sample size, // then use # of nodes as sample size sampleSize = nodeSize < options.sampleSize ? nodeSize : options.sampleSize; // instantiates the partial matrices that will be used in spectral layout for (var _i14 = 0; _i14 < nodeSize; _i14++) { C[_i14] = []; } for (var _i15 = 0; _i15 < sampleSize; _i15++) { INV[_i15] = []; } /**** Apply spectral layout ****/ if (options.quality == "draft" || options.step == "all") { allBFS(samplingType); sample(); powerIteration(); spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords }; } else { nodeIndexes.forEach(function (value, key) { xCoords.push(cy.getElementById(key).position("x")); yCoords.push(cy.getElementById(key).position("y")); }); spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords }; } return spectralResult; } else { var iterator = nodeIndexes.keys(); var firstNode = cy.getElementById(iterator.next().value); var firstNodePos = firstNode.position(); var firstNodeWidth = firstNode.outerWidth(); xCoords.push(firstNodePos.x); yCoords.push(firstNodePos.y); if (nodeSize == 2) { var secondNode = cy.getElementById(iterator.next().value); var secondNodeWidth = secondNode.outerWidth(); xCoords.push(firstNodePos.x + firstNodeWidth / 2 + secondNodeWidth / 2 + options.idealEdgeLength); yCoords.push(firstNodePos.y); } spectralResult = { nodeIndexes: nodeIndexes, xCoords: xCoords, yCoords: yCoords }; return spectralResult; } }; module.exports = { spectralLayout: spectralLayout }; /***/ }), /***/579: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_68018__) { var impl = __nested_webpack_require_68018__(212); // registers the extension on a cytoscape lib ref var register = function register(cytoscape) { if (!cytoscape) { return; } // can't register if cytoscape unspecified cytoscape('layout', 'fcose', impl); // register with cytoscape.js }; if (typeof cytoscape !== 'undefined') { // expose to global cytoscape (i.e. window.cytoscape) register(cytoscape); } module.exports = register; /***/ }), /***/140: (/***/function _(module) { module.exports = __WEBPACK_EXTERNAL_MODULE__140__; /***/ }) /******/ }; /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __nested_webpack_require_68983__(moduleId) { /******/ // Check if module is in cache /******/var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_68983__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __nested_webpack_exports__ = __nested_webpack_require_68983__(579); /******/ /******/ return __nested_webpack_exports__; /******/ }(); }); /***/ }), /***/ "./node_modules/cytoscape/dist/cytoscape.esm.mjs": /*!*******************************************************!*\ !*** ./node_modules/cytoscape/dist/cytoscape.esm.mjs ***! \*******************************************************/ /***/ (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 */ cytoscape; } /* harmony export */ }); /** * Copyright (c) 2016-2024, The Cytoscape Consortium. * * 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. */ 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); } 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, 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$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } 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) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } 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 _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 _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 () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (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 () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } 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; }; var string = function string(obj) { return obj != null && _typeof(obj) == typeofstr; }; var fn$6 = function fn(obj) { return obj != null && _typeof(obj) === typeoffn; }; var array = function array(obj) { return !elementOrCollection(obj) && (Array.isArray ? Array.isArray(obj) : obj != null && obj instanceof Array); }; var plainObject = function plainObject(obj) { return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object; }; var object = function object(obj) { return obj != null && _typeof(obj) === typeofobj; }; var number$1 = function number(obj) { return obj != null && _typeof(obj) === _typeof(1) && !isNaN(obj); }; var integer = function integer(obj) { return number$1(obj) && Math.floor(obj) === obj; }; var htmlElement = function htmlElement(obj) { if ('undefined' === typeofhtmlele) { return undefined; } else { return null != obj && obj instanceof HTMLElement; } }; var elementOrCollection = function elementOrCollection(obj) { return element(obj) || collection(obj); }; var element = function element(obj) { return instanceStr(obj) === 'collection' && obj._private.single; }; var collection = function collection(obj) { return instanceStr(obj) === 'collection' && !obj._private.single; }; var core = function core(obj) { return instanceStr(obj) === 'core'; }; var stylesheet = function stylesheet(obj) { return instanceStr(obj) === 'stylesheet'; }; var event = function event(obj) { return instanceStr(obj) === 'event'; }; var emptyString = function emptyString(obj) { if (obj === undefined || obj === null) { // null is empty return true; } else if (obj === '' || obj.match(/^\s+$/)) { return true; // empty string is empty } return false; // otherwise, we don't know what we've got }; var domElement = function domElement(obj) { if (typeof HTMLElement === 'undefined') { return false; // we're not in a browser so it doesn't matter } else { return obj instanceof HTMLElement; } }; var boundingBox = function boundingBox(obj) { return plainObject(obj) && number$1(obj.x1) && number$1(obj.x2) && number$1(obj.y1) && number$1(obj.y2); }; var promise = function promise(obj) { return object(obj) && fn$6(obj.then); }; var ms = function ms() { return navigator && navigator.userAgent.match(/msie|trident|edge/i); }; // probably a better way to detect this... var memoize$1 = function memoize(fn, keyFn) { if (!keyFn) { keyFn = function keyFn() { if (arguments.length === 1) { return arguments[0]; } 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; }; var camel2dash = memoize$1(function (str) { return str.replace(/([A-Z])/g, function (v) { return '-' + v.toLowerCase(); }); }); var dash2camel = memoize$1(function (str) { return str.replace(/(-\w)/g, function (v) { return v[1].toUpperCase(); }); }); var prependCamel = memoize$1(function (prefix, str) { return prefix + str[0].toUpperCase() + str.substring(1); }, function (prefix, str) { return prefix + '$' + str; }); var capitalize = function capitalize(str) { if (emptyString(str)) { return str; } return str.charAt(0).toUpperCase() + str.substring(1); }; var number = '(?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))'; var rgba = 'rgb[a]?\\((' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)(?:\\s*,\\s*(' + number + '))?\\)'; var rgbaNoBackRefs = 'rgb[a]?\\((?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)(?:\\s*,\\s*(?:' + number + '))?\\)'; var hsla = 'hsl[a]?\\((' + number + ')\\s*,\\s*(' + number + '[%])\\s*,\\s*(' + number + '[%])(?:\\s*,\\s*(' + number + '))?\\)'; var hslaNoBackRefs = 'hsl[a]?\\((?:' + number + ')\\s*,\\s*(?:' + number + '[%])\\s*,\\s*(?:' + number + '[%])(?:\\s*,\\s*(?:' + number + '))?\\)'; var hex3 = '\\#[0-9a-fA-F]{3}'; var hex6 = '\\#[0-9a-fA-F]{6}'; var ascending = function ascending(a, b) { if (a < b) { return -1; } else if (a > b) { return 1; } else { return 0; } }; var descending = function descending(a, b) { return -1 * ascending(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); b = parseInt(hex[3] + hex[3], base); } else { r = parseInt(hex[1] + hex[2], base); 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) 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; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; 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 // 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 { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = Math.round(255 * hue2rgb(p, q, h + 1 / 3)); 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) 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] } if (channel < 0 || channel > 255) { 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) { return colors[color.toLowerCase()]; }; var color2tuple = function color2tuple(color) { return (array(color) ? color : null) || colorname2tuple(color) || hex2tuple(color) || rgb2tuple(color) || hsl2tuple(color); }; var colors = { // special colour names transparent: [0, 0, 0, 0], // NB alpha === 0 // regular colours 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], grey: [128, 128, 128], green: [0, 128, 0], greenyellow: [173, 255, 47], 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], 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] }; // 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 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; }; /** * 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 */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } var isObject_1 = isObject; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; var _freeGlobal = freeGlobal; /** 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')(); var _root = root; /** * 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(); }; var now_1 = now; /** Used to match a single whitespace character. */ var reWhitespace = /\s/; /** * 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; while (index-- && reWhitespace.test(string.charAt(index))) {} return index; } var _trimmedEndIndex = trimmedEndIndex; /** Used to match leading whitespace. */ var reTrimStart = /^\s+/; /** * 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; } var _baseTrim = baseTrim; /** Built-in value references. */ var Symbol$1 = _root.Symbol; var _Symbol = Symbol$1; /** Used for built-in method references. */ var objectProto$5 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$4 = objectProto$5.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString$1 = objectProto$5.toString; /** Built-in value references. */ var symToStringTag$1 = _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$4.call(value, symToStringTag$1), tag = value[symToStringTag$1]; try { value[symToStringTag$1] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString$1.call(value); if (unmasked) { if (isOwn) { value[symToStringTag$1] = tag; } else { delete value[symToStringTag$1]; } } return result; } var _getRawTag = getRawTag; /** Used for built-in method references. */ var objectProto$4 = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto$4.toString; /** * 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); } var _objectToString = objectToString; /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** 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); } var _baseGetTag = baseGetTag; /** * 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 */ function isObjectLike(value) { return value != null && typeof value == 'object'; } var isObjectLike_1 = isObjectLike; /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * 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_1(value) && _baseGetTag(value) == symbolTag); } var isSymbol_1 = isSymbol; /** 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; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; /** * 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 */ function toNumber(value) { if (typeof value == 'number') { return value; } if (isSymbol_1(value)) { return NAN; } if (isObject_1(value)) { var other = typeof value.valueOf == 'function' ? value.valueOf() : value; value = isObject_1(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 toNumber_1 = toNumber; /** Error message constants. */ var FUNC_ERROR_TEXT$1 = 'Expected a function'; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMax = Math.max, nativeMin = Math.min; /** * 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; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT$1); } wait = toNumber_1(wait) || 0; if (isObject_1(options)) { leading = !!options.leading; maxing = 'maxWait' in options; maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait; trailing = 'trailing' in options ? !!options.trailing : trailing; } function invokeFunc(time) { var args = lastArgs, thisArg = lastThis; 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_1(); if (shouldInvoke(time)) { return trailingEdge(time); } // Restart the timer. timerId = setTimeout(timerExpired, remainingWait(time)); } function trailingEdge(time) { timerId = undefined; // 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 cancel() { if (timerId !== undefined) { clearTimeout(timerId); } lastInvokeTime = 0; lastArgs = lastCallTime = lastThis = timerId = undefined; } function flush() { return timerId === undefined ? result : trailingEdge(now_1()); } function debounced() { var time = now_1(), isInvoking = shouldInvoke(time); 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 debounce_1 = debounce; var performance = _window ? _window.performance : null; var pnow = performance && performance.now ? function () { return performance.now(); } : function () { return Date.now(); }; var raf = function () { if (_window) { if (_window.requestAnimationFrame) { return function (fn) { _window.requestAnimationFrame(fn); }; } else if (_window.mozRequestAnimationFrame) { return function (fn) { _window.mozRequestAnimationFrame(fn); }; } else if (_window.webkitRequestAnimationFrame) { return function (fn) { _window.webkitRequestAnimationFrame(fn); }; } else if (_window.msRequestAnimationFrame) { return function (fn) { _window.msRequestAnimationFrame(fn); }; } } return function (fn) { if (fn) { setTimeout(function () { fn(pnow()); }, 1000 / 60); } }; }(); var requestAnimationFrame = function requestAnimationFrame(fn) { return raf(fn); }; 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) { var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; // sdbm/string-hash return seed * K + num | 0; }; var hashIntAlt = function hashIntAlt(num) { var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED_ALT; // djb2/string-hash return (seed << 5) + seed + num | 0; }; var combineHashes = function combineHashes(hash1, hash2) { return hash1 * 0x200000 + hash2; }; var combineHashesArray = function combineHashesArray(hashes) { return hashes[0] * 0x200000 + hashes[1]; }; var hashArrays = function hashArrays(hashes1, hashes2) { return [hashInt(hashes1[0], hashes2[0]), hashIntAlt(hashes1[1], hashes2[1])]; }; var hashIntsArray = function hashIntsArray(ints, seed) { var entry = { value: 0, done: false }; var i = 0; var length = ints.length; var iterator = { next: function next() { if (i < length) { entry.value = ints[i++]; } else { entry.done = true; } return entry; } }; return hashIterableInts(iterator, seed); }; var hashString = function hashString(str, seed) { var entry = { value: 0, done: false }; var i = 0; var length = str.length; var iterator = { next: function next() { if (i < length) { entry.value = str.charCodeAt(i++); } else { entry.done = true; } return entry; } }; return hashIterableInts(iterator, seed); }; var hashStrings = function hashStrings() { return hashStringsArray(arguments); }; 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; var trueify = function trueify() { return true; }; var falsify = function falsify() { return false; }; var zeroify = function zeroify() { return 0; }; var noop$1 = function noop() {}; var error = function error(msg) { throw new Error(msg); }; var warnings = function warnings(enabled) { if (enabled !== undefined) { warningsEnabled = !!enabled; } else { return warningsEnabled; } }; var warn = function warn(msg) { /* eslint-disable no-console */ if (!warnings()) { return; } if (warnSupported) { console.warn(msg); } else { console.log(msg); if (traceSupported) { console.trace(); } } }; /* eslint-enable */ var clone = function clone(obj) { return extend({}, obj); }; // 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)) { return clone(obj); } else { return obj; } }; var copyArray$1 = function copyArray(arr) { return arr.slice(); }; 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 (a ^ 15 // if "a" is not 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 = {}; var staticEmptyObject = function staticEmptyObject() { return _staticEmptyObject; }; 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; }; }; 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; } } } }; var clearArray = function clearArray(arr) { arr.splice(0, arr.length); }; var push = function push(arr, otherArr) { for (var i = 0; i < otherArr.length; i++) { var el = otherArr[i]; arr.push(el); } }; var getPrefixedProperty = function getPrefixedProperty(obj, propName, prefix) { if (prefix) { propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth } return obj[propName]; }; var setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, value) { if (prefix) { propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth } obj[propName] = value; }; /* global Map */ var ObjectMap = /*#__PURE__*/function () { function ObjectMap() { _classCallCheck(this, ObjectMap); this._obj = {}; } _createClass(ObjectMap, [{ key: "set", value: function set(key, val) { this._obj[key] = val; return this; } }, { key: "delete", value: function _delete(key) { this._obj[key] = undefined; return this; } }, { key: "clear", value: function clear() { this._obj = {}; } }, { key: "has", value: function has(key) { return this._obj[key] !== undefined; } }, { key: "get", value: function get(key) { return this._obj[key]; } }]); return ObjectMap; }(); var Map$2 = typeof Map !== 'undefined' ? Map : ObjectMap; /* global Set */ 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() { return 'set'; } }, { key: "add", value: function add(val) { var o = this._obj; if (o[val] !== 1) { o[val] = 1; this.size++; } } }, { key: "delete", value: function _delete(val) { var o = this._obj; if (o[val] === 1) { o[val] = 0; this.size--; } } }, { key: "clear", value: function clear() { this._obj = Object.create(null); } }, { key: "has", value: function has(val) { return this._obj[val] === 1; } }, { key: "toArray", value: function toArray() { var _this = this; return Object.keys(this._obj).filter(function (key) { return _this.has(key); }); } }, { key: "forEach", value: function forEach(callback, thisArg) { 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; // 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 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 this.length = 1; this[0] = this; // NOTE: when something is added here, add also to ele.json() var _p = this._private = { cy: cy, single: true, // indicates this is an element data: params.data || {}, // data object position: params.position || { x: 0, y: 0 }, // (x, y) position pair autoWidth: undefined, // width and height of nodes calculated by the renderer when set to special 'auto' value autoHeight: undefined, autoPadding: undefined, compoundBoundsClean: false, // whether the compound dimensions need to be recalculated the next time dimensions are read listeners: [], // array of bound listeners group: group, // string; 'nodes' or 'edges' style: {}, // properties as set by the style rstyle: {}, // properties for style sent from the renderer to the core styleCxts: [], // applied style contexts from the styler styleKeys: {}, // per-group keys of style property values removed: true, // whether it's inside the vis; true if removed (set true here since we call restore) selected: params.selected ? true : false, // whether it's selected selectable: params.selectable === undefined ? true : params.selectable ? true : false, // whether it's selectable locked: params.locked ? true : false, // whether the element is locked (cannot be moved) grabbed: false, // whether the element is grabbed by the mouse; renderer sets this privately grabbable: params.grabbable === undefined ? true : params.grabbable ? true : false, // whether the element can be grabbed pannable: params.pannable === undefined ? group === 'edges' ? true : false : params.pannable ? true : false, // whether the element has passthrough panning enabled active: false, // whether the element is active from user interaction classes: new Set$1(), // map ( className => true ) animation: { // object for currently-running animations current: [], queue: [] }, rscratch: {}, // object in which the renderer can store information scratch: params.scratch || {}, // scratch objects edges: [], // array of connected edges children: [], // array of children parent: params.parent && params.parent.isNode() ? params.parent : null, // parent ref traversalCache: {}, // cache of output of traversal functions backgrounding: false, // whether background images are loading bbCache: null, // cache of the current bounding box bbCacheShift: { x: 0, y: 0 }, // shift applied to cached bb to be applied on next get bodyBounds: null, // bounds cache of element body, w/o overlay overlayBounds: null, // bounds cache of element body, including overlay labelBounds: { // bounds cache of labels all: null, source: null, target: null, main: null }, arrowBounds: { // bounds cache of edge arrows source: null, target: null, 'mid-source': null, '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 if (params.renderedPosition) { var rpos = params.renderedPosition; var pan = cy.pan(); var zoom = cy.zoom(); _p.position = { x: (rpos.x - pan.x) / zoom, 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(); } }; var defineSearch = function defineSearch(params) { params = { bfs: params.bfs || !params.dfs, dfs: params.dfs || !params.bfs }; // 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; var v = roots = string(roots) ? this.filter(roots) : roots; var Q = []; var connectedNodes = []; var connectedBy = {}; var id2depth = {}; var V = {}; var j = 0; var found; var _this$byGroup = this.byGroup(), 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; var tgt = prevEdge != null ? prevEdge.target() : null; 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 var elesfn$v = { breadthFirstSearch: defineSearch({ bfs: true }), depthFirstSearch: defineSearch({ dfs: true }) }; // nice, short mathematical alias elesfn$v.bfs = elesfn$v.breadthFirstSearch; elesfn$v.dfs = elesfn$v.depthFirstSearch; var heap$1 = createCommonjsModule(function (module, exports) { // 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; /* Default comparison function to be used */ defaultCmp = function(x, y) { if (x < y) { return -1; } if (x > y) { return 1; } 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; } 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); }; /* Push item onto heap, maintaining the heap invariant. */ heappush = function(array, item, cmp) { if (cmp == null) { cmp = defaultCmp; } array.push(item); return _siftdown(array, 0, array.length - 1, cmp); }; /* 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; }; /* 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) */ heapreplace = function(array, item, cmp) { var returnitem; if (cmp == null) { cmp = defaultCmp; } returnitem = array[0]; array[0] = item; _siftup(array, 0, cmp); return returnitem; }; /* Fast version of a heappush followed by a heappop. */ heappushpop = function(array, item, cmp) { var _ref; if (cmp == null) { cmp = defaultCmp; } 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; }; /* Transform list into a heap, in-place, in O(array.length) time. */ heapify = function(array, cmp) { var i, _i, _len, _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)); } 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; } pos = array.indexOf(item); if (pos === -1) { 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; } 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. */ nsmallest = function(array, n, cmp) { var elem, 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 (_j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; 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; } break; } 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; } array[pos] = array[childpos]; pos = childpos; childpos = 2 * pos + 1; } 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 = []; } 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) { { return module.exports = factory(); } })(this, function() { return Heap; }); }).call(commonjsGlobal); }); var heap = heap$1; var dijkstraDefaults = defaults$g({ root: null, weight: function weight(edge) { return 1; }, directed: false }); var elesfn$u = { dijkstra: function dijkstra(options) { if (!plainObject(options)) { var args = arguments; options = { root: args[0], weight: args[1], directed: args[2] }; } var _dijkstraDefaults = dijkstraDefaults(options), 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; 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(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] = { node: u, edge: vDist.edge }; } } // for } // while return { distanceTo: function distanceTo(node) { var target = string(node) ? nodes.filter(node)[0] : node[0]; return knownDist[target.id()]; }, pathTo: function pathTo(node) { var target = string(node) ? nodes.filter(node)[0] : node[0]; 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); S.unshift(p.node); u = p.node; uid = u.id(); } } return eles.spawn(S); } }; } }; var elesfn$t = { // kruskal's algorithm (finds min spanning tree, assuming undirected graph) // implemented from pseudocode from wikipedia kruskal: function kruskal(weightFn) { weightFn = weightFn || function (edge) { return 1; }; var _this$byGroup = this.byGroup(), 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 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 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]; var v = edge.target()[0]; var setUIndex = findSetIndex(u); var setVIndex = findSetIndex(v); var setU = forest[setUIndex]; var setV = forest[setVIndex]; if (setUIndex !== setVIndex) { A.merge(edge); // combine forests for u and v setU.merge(setV); forest.splice(setVIndex, 1); } } return A; } }; var aStarDefaults = defaults$g({ root: null, goal: null, weight: function weight(edge) { return 1; }, heuristic: function heuristic(edge) { return 0; }, directed: false }); 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 = cy.collection(root)[0]; goal = cy.collection(goal)[0]; var sid = root.id(); var tid = goal.id(); var gScore = {}; var fScore = {}; var closedSetIds = {}; var openSet = new heap(function (a, b) { return fScore[a.id()] - fScore[b.id()]; }); 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 var steps = 0; // Main loop while (openSet.size() > 0) { popFromOpenSet(); 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 closedSetIds[cMinId] = true; // 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 if (!this.hasElementWithId(e.id())) { continue; } // 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 if (!this.hasElementWithId(wid)) { continue; } // if node is in closedSet, ignore it if (closedSetIds[wid]) { continue; } // New tentative score for node w var tempScore = gScore[cMinId] + weight(e); // Update gScore for node w if: // w not present in openSet // OR // tentative gScore is less than previous value // w not in openSet if (!isInOpenSet(wid)) { gScore[wid] = tempScore; fScore[wid] = tempScore + heuristic(w); addToOpenSet(w, wid); cameFrom[wid] = cMin; cameFromEdge[wid] = e; continue; } // w already in openSet, but with greater gScore if (tempScore < gScore[wid]) { gScore[wid] = tempScore; fScore[wid] = tempScore + heuristic(w); cameFrom[wid] = cMin; cameFromEdge[wid] = e; } } // End of neighbors update } // End of main loop // If we've reached here, then we've not reached our goal return { found: false, distance: undefined, path: undefined, steps: steps }; } }; // elesfn var floydWarshallDefaults = defaults$g({ weight: function weight(edge) { return 1; }, directed: false }); 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; var weightFn = weight; var _this$byGroup = this.byGroup(), 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 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 var next = new Array(Nsq); 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); // 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 (!directed) { var ts = t * N + s; // target to source index if (!directed && dist[ts] > _weight) { dist[ts] = _weight; next[ts] = s; edgeNext[ts] = edge; } } } // 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]; } } } } 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); var j = indexOfArgEle(to); return dist[i * N + j]; }, path: function path(from, to) { 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]; edge = edgeNext[prev * N + i]; path.merge(edge); path.merge(atIndex(i)); } return path; } }; return res; } // floydWarshall }; // elesfn var bellmanFordDefaults = defaults$g({ weight: function weight(edge) { return 1; }, directed: false, root: null }); 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; var weightFn = weight; var eles = this; var cy = this.cy(); var _this$byGroup = this.byGroup(), edges = _this$byGroup.edges, nodes = _this$byGroup.nodes; var numNodes = nodes.length; var infoMap = new Map$2(); var hasNegativeWeightCycle = false; var negativeWeightCycles = []; root = cy.collection(root)[0]; // in case selector passed edges.unmergeBy(function (edge) { 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; 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 } 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 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; info2.edge = edge; 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 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); } } } else { break; } } } } return { distanceTo: distanceTo, pathTo: pathTo, hasNegativeWeightCycle: hasNegativeWeightCycle, negativeWeightCycles: negativeWeightCycles }; } // bellmanFord }; // elesfn 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 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 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 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 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 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; edges.unmergeBy(function (edge) { return edge.isLoop(); }); var numNodes = nodes.length; 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) 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 var minCutSize = Infinity; var minCutEdgeIndexes = []; 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 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) 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 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? if (res1.length <= res2.length && res1.length < minCutSize) { minCutSize = res1.length; minCutEdgeIndexes = res1; copyNodesMap(metaNodeMap, minCutNodeMap); } else if (res2.length <= res1.length && res2.length < minCutSize) { minCutSize = res2.length; minCutEdgeIndexes = res2; copyNodesMap(metaNodeMap2, minCutNodeMap); } } // end of main loop // 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 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 var constructComponent = function constructComponent(subset) { var component = _this.spawn(); subset.forEach(function (node) { component.merge(node); node.connectedEdges().forEach(function (edge) { // ensure edge is within calling collection and edge is not in cut if (_this.contains(edge) && !cut.contains(edge)) { component.merge(edge); } }); }); return component; }; var components = [constructComponent(partition1), constructComponent(partition2)]; var ret = { cut: cut, components: components, // n.b. partitions are included to be compatible with the old api spec // (could be removed in a future major version) partition1: partition1, partition2: partition2 }; return ret; } }; // elesfn var copyPosition = function copyPosition(p) { return { x: p.x, y: p.y }; }; var modelToRenderedPosition = function modelToRenderedPosition(p, zoom, pan) { return { x: p.x * zoom + pan.x, y: p.y * zoom + pan.y }; }; var renderedToModelPosition = function renderedToModelPosition(p, zoom, pan) { return { x: (p.x - pan.x) / zoom, y: (p.y - pan.y) / zoom }; }; var array2point = function array2point(arr) { return { x: arr[0], y: arr[1] }; }; 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) { var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 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) { var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; 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 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; off++; } } else { // just remove it if we don't want to consider holes arr.splice(i, 1); } } if (sort) { arr.sort(function (a, b) { return a - b; }); // requires copy = true if you don't want to change the orig } var len = arr.length; var mid = Math.floor(len / 2); if (len % 2 !== 0) { return arr[mid + 1 + off]; } else { return (arr[mid - 1 + off] + arr[mid + off]) / 2; } }; var deg2rad = function deg2rad(deg) { return Math.PI * deg / 180; }; var getAngleFromDisp = function getAngleFromDisp(dispX, dispY) { return Math.atan2(dispY, dispX) - Math.PI / 2; }; var log2 = Math.log2 || function (n) { return Math.log(n) / Math.log(2); }; var signum = function signum(x) { if (x > 0) { return 1; } else if (x < 0) { return -1; } else { return 0; } }; var dist = function dist(p1, p2) { return Math.sqrt(sqdist(p1, p2)); }; var sqdist = function sqdist(p1, p2) { var dx = p2.x - p1.x; var dy = p2.y - p1.y; return dx * dx + dy * dy; }; var inPlaceSumNormalize = function inPlaceSumNormalize(v) { 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 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; }; var qbezierPtAt = function qbezierPtAt(p0, p1, p2, t) { return { x: qbezierAt(p0.x, p1.x, p2.x, t), y: qbezierAt(p0.y, p1.y, p2.y, t) }; }; var lineAt = function lineAt(p0, p1, t, d) { var vec = { x: p1.x - p0.x, y: p1.y - p0.y }; var vecDist = dist(p0, p1); var normVec = { x: vec.x / vecDist, y: vec.y / vecDist }; t = t == null ? 0 : t; d = d != null ? d : t * vecDist; return { x: p0.x + normVec.x * d, y: p0.y + normVec.y * 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 var makeBoundingBox = function makeBoundingBox(bb) { if (bb == null) { return { x1: Infinity, y1: Infinity, x2: -Infinity, y2: -Infinity, w: 0, h: 0 }; } else if (bb.x1 != null && bb.y1 != null) { if (bb.x2 != null && bb.y2 != null && bb.x2 >= bb.x1 && bb.y2 >= bb.y1) { return { x1: bb.x1, y1: bb.y1, x2: bb.x2, y2: bb.y2, w: bb.x2 - bb.x1, h: bb.y2 - bb.y1 }; } else if (bb.w != null && bb.h != null && bb.w >= 0 && bb.h >= 0) { return { x1: bb.x1, y1: bb.y1, x2: bb.x1 + bb.w, y2: bb.y1 + bb.h, w: bb.w, h: bb.h }; } } }; var copyBoundingBox = function copyBoundingBox(bb) { return { x1: bb.x1, x2: bb.x2, w: bb.w, y1: bb.y1, y2: bb.y2, h: bb.h }; }; var clearBoundingBox = function clearBoundingBox(bb) { bb.x1 = Infinity; bb.y1 = Infinity; bb.x2 = -Infinity; bb.y2 = -Infinity; bb.w = 0; bb.h = 0; }; var shiftBoundingBox = function shiftBoundingBox(bb, dx, dy) { return { x1: bb.x1 + dx, x2: bb.x2 + dx, y1: bb.y1 + dy, y2: bb.y2 + dy, w: bb.w, h: bb.h }; }; 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; bb1.y1 = Math.min(bb1.y1, bb2.y1); bb1.y2 = Math.max(bb1.y2, bb2.y2); bb1.h = bb1.y2 - bb1.y1; }; var expandBoundingBoxByPoint = function expandBoundingBoxByPoint(bb, x, y) { bb.x1 = Math.min(bb.x1, x); bb.x2 = Math.max(bb.x2, x); bb.w = bb.x2 - bb.x1; bb.y1 = Math.min(bb.y1, y); bb.y2 = Math.max(bb.y2, y); bb.h = bb.y2 - bb.y1; }; var expandBoundingBox = function expandBoundingBox(bb) { var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; bb.x1 -= padding; bb.x2 += padding; bb.y1 -= padding; bb.y2 += padding; bb.w = bb.x2 - bb.x1; bb.h = bb.y2 - bb.y1; return 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) { top = bottom = padding[0]; 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; bb.y2 += bottom; bb.w = bb.x2 - bb.x1; bb.h = bb.y2 - bb.y1; return bb; }; // assign the values of bb2 into bb1 var assignBoundingBox = function assignBoundingBox(bb1, bb2) { bb1.x1 = bb2.x1; bb1.y1 = bb2.y1; bb1.x2 = bb2.x2; bb1.y2 = bb2.y2; bb1.w = bb1.x2 - bb1.x1; bb1.h = bb1.y2 - bb1.y1; }; var boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) { // case: one bb to right of other if (bb1.x1 > bb2.x2) { return false; } if (bb2.x1 > bb1.x2) { return false; } // 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 if (bb1.y2 < bb2.y1) { return false; } if (bb2.y2 < bb1.y1) { return false; } // case: one bb below other if (bb1.y1 > bb2.y2) { return false; } if (bb2.y1 > bb1.y2) { return false; } // otherwise, must have some overlap return true; }; var inBoundingBox = function inBoundingBox(bb, x, y) { return bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2; }; var pointInBoundingBox = function pointInBoundingBox(bb, pt) { return inBoundingBox(bb, pt.x, pt.y); }; var boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) { return inBoundingBox(bb1, bb2.x1, bb2.y1) && inBoundingBox(bb1, bb2.x2, bb2.y2); }; var roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) { var radius = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 'auto'; var cornerRadius = radius === 'auto' ? getRoundRectangleRadius(width, height) : radius; var halfWidth = width / 2; var halfHeight = height / 2; cornerRadius = Math.min(cornerRadius, halfWidth, halfHeight); var doWidth = cornerRadius !== halfWidth, doHeight = cornerRadius !== halfHeight; // Check intersections with straight line segments var straightLineIntersections; // Top segment, left to right if (doWidth) { 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 if (doHeight) { 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 if (doWidth) { 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 if (doHeight) { 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 { 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 if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) { return [arcIntersections[0], arcIntersections[1]]; } } // 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 if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) { return [arcIntersections[0], arcIntersections[1]]; } } // 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 if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) { return [arcIntersections[0], arcIntersections[1]]; } } // 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 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); var x2 = Math.max(lx1, lx2); var y1 = Math.min(ly1, ly2); var y2 = Math.max(ly1, ly2); return x1 - t <= x && x <= x2 + t && y1 - t <= y && y <= y2 + t; }; var inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, tolerance) { var bb = { x1: Math.min(x1, x3, x2) - tolerance, 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 (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) { // console.log('bezier out of rough bb') return false; } else { // console.log('do more expensive check'); return true; } }; 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; var root2 = (-b - sqrtR) / denom; return [root1, root2]; }; 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 if (a === 0) { a = epsilon; } b /= a; c /= a; d /= a; var discriminant, q, r, dum1, s, t, term1, r13; q = (3.0 * c - b * b) / 9.0; r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b)); r /= 54.0; 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); t = r - Math.sqrt(discriminant); t = t < 0 ? -Math.pow(-t, 1.0 / 3.0) : Math.pow(t, 1.0 / 3.0); result[0] = -term1 + s + t; term1 += (s + t) / 2.0; result[4] = result[2] = -term1; term1 = Math.sqrt(3.0) * (-t + s) / 2; result[3] = term1; 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)); r13 = 2.0 * Math.sqrt(q); result[0] = -term1 + r13 * Math.cos(dum1 / 3.0); result[2] = -term1 + r13 * Math.cos((dum1 + 2.0 * Math.PI) / 3.0); result[4] = -term1 + r13 * Math.cos((dum1 + 4.0 * Math.PI) / 3.0); return; }; 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 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)); if (minDistanceSquared >= 0) { if (distSquared < minDistanceSquared) { minDistanceSquared = distSquared; } } else { minDistanceSquared = distSquared; } } return minDistanceSquared; }; var sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) { var offset = [x - x1, y - y1]; var line = [x2 - x1, y2 - y1]; var lineSq = line[0] * line[0] + line[1] * line[1]; 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; 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]; } else { 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 ){ // down++; // } } else { continue; } } if (up % 2 === 0) { return false; } else { return true; } }; var pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) { 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 { angle = -angle - Math.PI / 2; } } else { angle = direction; } var cos = Math.cos(-angle); 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, corners) { var cutPolygonPoints = new Array(basePoints.length * 2); for (var i = 0; i < corners.length; i++) { var corner = corners[i]; cutPolygonPoints[i * 4 + 0] = corner.startX; cutPolygonPoints[i * 4 + 1] = corner.startY; cutPolygonPoints[i * 4 + 2] = corner.stopX; cutPolygonPoints[i * 4 + 3] = corner.stopY; var squaredDistance = Math.pow(corner.cx - x, 2) + Math.pow(corner.cy - y, 2); if (squaredDistance <= Math.pow(corner.radius, 2)) { 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]; nextLineEndX = lineSet[(i + 1) * 4 + 2]; nextLineEndY = lineSet[(i + 1) * 4 + 3]; } else { nextLineStartX = lineSet[0]; nextLineStartY = lineSet[1]; 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 var offsetX = nextPointY - currentPointY; var offsetY = -(nextPointX - currentPointX); // Normalize var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY); var normalizedOffsetX = offsetX / offsetLength; var normalizedOffsetY = offsetY / offsetLength; expandedLineSet[i * 4] = currentPointX + normalizedOffsetX * pad; expandedLineSet[i * 4 + 1] = currentPointY + normalizedOffsetY * 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) { var dispX = centerX - x; var dispY = centerY - y; dispX /= ellipseWradius; 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]; }; var checkInEllipse = function checkInEllipse(x, y, width, height, centerX, centerY, padding) { x -= centerX; y -= centerY; x /= width / 2 + padding; y /= height / 2 + padding; return x * x + y * y <= 1; }; // 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]; } else { var farIntersectionX = inRangeParams[1] * d[0] + x1; var farIntersectionY = inRangeParams[1] * d[1] + y1; return [nearIntersectionX, nearIntersectionY, farIntersectionX, farIntersectionY]; } } else { return [nearIntersectionX, nearIntersectionY]; } }; var midOfThree = function midOfThree(a, b, c) { if (b <= a && a <= c || c <= a && a <= b) { return a; } else if (a <= b && b <= c || c <= b && b <= a) { return b; } else { return c; } }; // (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; var dx43 = x4 - x3; var dy13 = y1 - y3; var dy21 = y2 - y1; var dy43 = y4 - 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 { if (!infiniteLines) { return []; } else { return [x1 + ua * dx21, y1 + ua * dy21]; } } } 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 if (midOfThree(x1, x2, x3) === x3) { return [x3, y3]; } // 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 ) // 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); } else { points = transformedPoints; } } 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]; } else { 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, corners) { var intersections = []; var intersection; var lines = new Array(basePoints.length * 2); corners.forEach(function (corner, i) { if (i === 0) { lines[lines.length - 2] = corner.startX; lines[lines.length - 1] = corner.startY; } else { lines[i * 4 - 2] = corner.startX; lines[i * 4 - 1] = corner.startY; } lines[i * 4] = corner.stopX; lines[i * 4 + 1] = corner.stopY; intersection = intersectLineCircle(x, y, centerX, centerY, corner.cx, corner.cy, corner.radius); if (intersection.length !== 0) { intersections.push(intersection[0], intersection[1]); } }); for (var i = 0; i < lines.length / 4; i++) { intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[i * 4], lines[i * 4 + 1], lines[i * 4 + 2], lines[i * 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 _i3 = 1; _i3 < intersections.length / 2; _i3++) { var squaredDistance = Math.pow(intersections[_i3 * 2] - x, 2) + Math.pow(intersections[_i3 * 2 + 1] - y, 2); if (squaredDistance <= lowestSquaredDistance) { lowestIntersection[0] = intersections[_i3 * 2]; lowestIntersection[1] = intersections[_i3 * 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) { var points = generateUnitNgonPoints(sides, rotationRadians); points = fitPolygonToSquare(points); return points; }; var fitPolygonToSquare = function fitPolygonToSquare(points) { var x, y; var sides = points.length / 2; var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; for (var i = 0; i < sides; i++) { x = points[2 * i]; y = points[2 * i + 1]; minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); } // stretch factors var sx = 2 / (maxX - minX); var sy = 2 / (maxY - minY); for (var _i4 = 0; _i4 < sides; _i4++) { x = points[2 * _i4] = points[2 * _i4] * sx; y = points[2 * _i4 + 1] = points[2 * _i4 + 1] * sy; minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); } if (minY < -1) { for (var _i5 = 0; _i5 < sides; _i5++) { y = points[2 * _i5 + 1] = points[2 * _i5 + 1] + (-1 - minY); } } return points; }; var generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) { var increment = 1.0 / sides * 2 * Math.PI; var startAngle = sides % 2 === 0 ? Math.PI / 2.0 + increment / 2.0 : Math.PI / 2.0; 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 var getRoundRectangleRadius = function getRoundRectangleRadius(width, height) { return Math.min(width / 4, height / 4, 8); }; // Set the default radius var getRoundPolygonRadius = function getRoundPolygonRadius(width, height) { return Math.min(width / 10, height / 10, 8); }; var getCutRectangleCornerLength = function getCutRectangleCornerLength() { return 8; }; 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 var getBarrelCurveConstants = function getBarrelCurveConstants(width, height) { return { heightOffset: Math.min(15, 0.05 * height), widthOffset: Math.min(100, 0.25 * width), ctrlPtOffsetPct: 0.05 }; }; var pageRankDefaults = defaults$g({ dampingFactor: 0.8, precision: 0.000001, iterations: 200, weight: function weight(edge) { return 1; } }); var elesfn$o = { pageRank: function pageRank(options) { var _pageRankDefaults = pageRankDefaults(options), 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; var numNodes = nodes.length; var numNodesSqd = numNodes * numNodes; 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 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 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 if (srcId === tgtId) { continue; } var s = nodes.indexOfId(srcId); var t = nodes.indexOfId(tgtId); var w = weight(edge); var _n = t * numNodes + s; // 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 var p = 1.0 / numNodes + additionalProb; // Shorthand // 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 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 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 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 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 (diff < precision) { break; } } // Construct result var res = { rank: function rank(node) { node = cy.collection(node)[0]; return eigenvector[nodes.indexOf(node)]; } }; return res; } // pageRank }; // elesfn var defaults$f = defaults$g({ root: null, weight: function weight(edge) { return 1; }, directed: false, alpha: 0 }); var elesfn$n = { degreeCentralityNormalized: function degreeCentralityNormalized(options) { options = defaults$f(options); 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 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; } }; } else { var indegrees = {}; var outdegrees = {}; var maxIndegree = 0; var maxOutdegree = 0; for (var _i = 0; _i < numNodes; _i++) { var _node = nodes[_i]; var id = _node.id(); // 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" degreeCentrality: function degreeCentrality(options) { options = defaults$f(options); var cy = this.cy(); var callingEles = this; var _options = options, 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 for (var i = 0; i < connEdges.length; i++) { s += weight(connEdges[i]); } return { degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha) }; } else { var edges = root.connectedEdges(); var incoming = edges.filter(function (edge) { return edge.target().same(root) && callingEles.has(edge); }); var outgoing = edges.filter(function (edge) { return edge.source().same(root) && callingEles.has(edge); }); var k_in = incoming.length; var k_out = outgoing.length; var s_in = 0; 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 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 elesfn$n.dc = elesfn$n.degreeCentrality; elesfn$n.dcn = elesfn$n.degreeCentralityNormalised = elesfn$n.degreeCentralityNormalized; var defaults$e = defaults$g({ harmonic: true, weight: function weight() { return 1; }, directed: false, root: null }); var elesfn$m = { closenessCentralityNormalized: function closenessCentralityNormalized(options) { var _defaults = defaults$e(options), harmonic = _defaults.harmonic, weight = _defaults.weight, directed = _defaults.directed; var cy = this.cy(); var closenesses = {}; var maxCloseness = 0; var nodes = this.nodes(); var fw = this.floydWarshall({ weight: weight, directed: directed }); // 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 { currCloseness += d; } } } 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(); } else { // from is a node node = node.id(); } return closenesses[node] / maxCloseness; } }; }, // 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 var dijkstra = this.dijkstra({ root: root, weight: weight, directed: directed }); 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 { totalDistance += d; } } } return harmonic ? totalDistance : 1 / totalDistance; } // closenessCentrality }; // elesfn // nice, short mathematical alias elesfn$m.cc = elesfn$m.closenessCentrality; elesfn$m.ccn = elesfn$m.closenessCentralityNormalised = elesfn$m.closenessCentralityNormalized; var defaults$d = defaults$g({ weight: null, directed: false }); 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; var weighted = weight != null; var cy = this.cy(); // starting var V = this.nodes(); var A = {}; var _C = {}; var max = 0; var C = { set: function set(key, val) { _C[key] = val; if (val > max) { max = val; } }, get: function get(key) { return _C[key]; } }; // 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 { A[vid] = v.openNeighborhood().nodes(); // get neighbors of every node } 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(function (a, b) { return d[a] - d[b]; }); // queue // 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); } else { // 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); } } } 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(); return C.get(id); }, betweennessNormalized: function betweennessNormalized(node) { if (max == 0) { return 0; } var id = cy.collection(node).id(); return C.get(id) / max; } }; // alias ret.betweennessNormalised = ret.betweennessNormalized; return ret; } // betweennessCentrality }; // elesfn // nice, short mathematical alias elesfn$l.bc = elesfn$l.betweennessCentrality; // Implemented by Zoe Xi @zoexi for GSOC 2016 /* eslint-disable no-unused-vars */ var defaults$c = defaults$g({ expandFactor: 2, // affects time of computation and cluster granularity to some extent: M * M inflateFactor: 2, // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j) multFactor: 1, // 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 function (edge) { return 1; }] }); /* eslint-enable */ var setOptions$3 = function setOptions(options) { return defaults$c(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? 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 _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); // 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++) { if (i != j && isDuplicate(clusters[i], clusters[j])) { clusters.splice(j, 1); } } } return clusters; }; var markovClustering = function markovClustering(options) { var nodes = this.nodes(); var edges = this.edges(); var cy = this.cy(); // 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) var n = nodes.length, n2 = n * n; var M = new Array(n2), _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 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: _M = expand(M, n, opts.expandFactor); // 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 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) { return getDistance(length, getP, getQ, 0, addSquaredDiff, sqrt); } else { // for single attr case, more efficient to avoid sqrt return getDistance(length, getP, getQ, 0, addAbsDiff); } }, squaredEuclidean: function squaredEuclidean(length, getP, getQ) { return getDistance(length, getP, getQ, 0, addSquaredDiff); }, manhattan: function manhattan(length, getP, getQ) { return getDistance(length, getP, getQ, 0, addAbsDiff); }, max: function max(length, getP, getQ) { return getDistance(length, getP, getQ, -Infinity, maxAbsDiff); } }; // 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 { return impl(length, getP, getQ, nodeP, nodeQ); } } var defaults$b = defaults$g({ k: 2, m: 2, sensitivityThreshold: 0.0001, distance: 'euclidean', maxIterations: 10, attributes: [], testMode: false, testCentroids: null }); var setOptions$2 = function setOptions(options) { return defaults$b(options); }; var getDist = function getDist(type, node, centroid, attributes, mode) { var noNodeP = mode !== 'kMedoids'; var getP = noNodeP ? function (i) { return centroid[i]; } : 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 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 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. 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. while (seenBefore(node, medoids, i)) { node = nodes[Math.floor(Math.random() * nodes.length)]; } medoids[i] = node; } } else { // Relatively large data set, so pretty safe to not check and just select random nodes for (var _i2 = 0; _i2 < k; _i2++) { 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 opts = setOptions$2(options); // Begin k-means algorithm var clusters = new Array(opts.k); var assignment = {}; var centroids; // Step 1: Initialize centroid positions if (opts.testMode) { if (typeof opts.testCentroids === 'number') { // TODO: implement a seeded random number generator. opts.testCentroids; centroids = randomCentroids(nodes, opts.k, opts.attributes); } else if (_typeof(opts.testCentroids) === 'object') { centroids = opts.testCentroids; } else { centroids = randomCentroids(nodes, opts.k, opts.attributes); } } 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 # assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans'); } // 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. 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; // 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 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 if (opts.testMode) { if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') { medoids = opts.testCentroids; } else { medoids = randomMedoids(nodes, opts.k); } } 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 # 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, // 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 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 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 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 clusters; var centroids; var U; var _U; var weight; // 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 var isStillMoving = true; var iterations = 0; while (isStillMoving && iterations < opts.maxIterations) { isStillMoving = false; // Step 2: Calculate the centroids for each step. updateCentroids(centroids, nodes, U, weight, opts); // 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. clusters = assign$1(nodes, U, opts, cy); return { clusters: clusters, degreeOfMembership: U }; }; var kClustering = { kMeans: kMeans, kMedoids: kMedoids, fuzzyCMeans: fuzzyCMeans, fcm: fuzzyCMeans }; // Implemented by Zoe Xi @zoexi for GSOC 2016 var defaults$a = defaults$g({ distance: 'euclidean', // distance metric to compare nodes linkage: 'min', // linkage criterion : how to determine the distance between clusters of nodes mode: 'threshold', // mode:'threshold' => clusters must be threshold distance apart threshold: Infinity, // the distance threshold // mode:'dendrogram' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters addDendrogram: false, // whether to add the dendrogram to the graph for viz 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); }, function (i) { 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 if (opts.mode === 'dendrogram') { merged = { left: c1, right: c2, key: c1.key }; } else { merged = { value: c1.value.concat(c2.value), key: c1.key }; } clusters[c1.index] = merged; clusters.splice(c2.index, 1); 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]; } } else if (opts.linkage === 'mean') { dist = (dists[c1.key][cur.key] * c1.size + dists[c2.key][cur.key] * c2.size) / (c1.size + c2.size); } 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 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 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 { if (root.left) getAllChildren(root.left, arr); 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); var node = cy.add({ group: 'nodes', data: { id: leftStr + ',' + rightStr } }); cy.add({ group: 'edges', data: { source: leftStr, target: node.id() } }); cy.add({ group: 'edges', data: { source: rightStr, target: node.id() } }); return node.id(); } else if (root.value) { return root.value.id(); } }; var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { if (!root) return []; var left = [], right = [], leaves = []; if (k === 0) { // don't cut tree, simply return all nodes as 1 single cluster if (root.left) getAllChildren(root.left, left); if (root.right) getAllChildren(root.right, right); leaves = left.concat(right); return [cy.collection(leaves)]; } else if (k === 1) { // cut at root if (root.value) { // leaf node return [cy.collection(root.value)]; } else { if (root.left) getAllChildren(root.left, left); if (root.right) getAllChildren(root.right, right); return [cy.collection(left), cy.collection(right)]; } } else { if (root.value) { return [cy.collection(root.value)]; } else { if (root.left) left = buildClustersFromTree(root.left, k - 1, cy); if (root.right) right = buildClustersFromTree(root.right, k - 1, cy); return left.concat(right); } } }; var hierarchicalClustering = function hierarchicalClustering(options) { var cy = this.cy(); 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 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 for (var n = 0; n < nodes.length; n++) { var cluster = { value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]], key: n, index: n }; clusters[n] = cluster; index[n] = cluster; dists[n] = []; mins[n] = 0; } // 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. var merged = mergeClosest(clusters, index, dists, mins, opts); while (merged) { merged = mergeClosest(clusters, index, dists, mins, opts); } var retClusters; // 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 cluster.key = cluster.index = null; retClusters[i] = cy.collection(cluster.value); }); } return retClusters; }; var hierarchicalClustering$1 = { hierarchicalClustering: hierarchicalClustering, hca: hierarchicalClustering }; // Implemented by Zoe Xi @zoexi for GSOC 2016 var defaults$9 = defaults$g({ distance: 'euclidean', // distance metric to compare attributes between two nodes preference: 'median', // suitability of a data point to serve as an exemplar damping: 0.8, // damping factor between [0.5, 1) maxIterations: 1000, // max number of iterations to run minIterations: 100, // min number of iterations to run in order for clustering to stop attributes: [// functions to quantify the similarity between any two points // 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))) { error("Preference must be one of [".concat(validPrefs.map(function (p) { return "'".concat(p, "'"); }).join(', '), "] or a number. Got: ").concat(pref)); } return defaults$9(options); }; 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 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') { p = mean(S); } else if (preference === 'min') { p = min(S); } else if (preference === 'max') { p = max(S); } else { // 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 id2position = {}; for (var i = 0; i < nodes.length; i++) { id2position[nodes[i].id()] = i; } // 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 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 } for (var _i2 = 0; _i2 < n; _i2++) { for (var j = 0; j < n; j++) { if (_i2 !== j) { S[_i2 * n + j] = getSimilarity(opts.distance, nodes[_i2], nodes[j], opts.attributes); } } } // 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 R = new Array(n2); for (var _i4 = 0; _i4 < n2; _i4++) { R[_i4] = 0.0; } // 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; 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; maxI = _j; } else if (AS > max2) { 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 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 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 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 }; var hierholzerDefaults = defaults$g({ root: undefined, directed: false }); var elesfn$k = { hierholzer: function hierholzer(options) { if (!plainObject(options)) { var args = arguments; options = { root: args[0], directed: args[1] }; } var _hierholzerDefaults = hierholzerDefaults(options), root = _hierholzerDefaults.root, directed = _hierholzerDefaults.directed; var eles = this; var dflag = false; var oddIn; var oddOut; var startVertex; 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) { if (oddOut) dflag = true;else oddOut = id; } else if (d2 > 1 || d1 > 1) { dflag = true; } nodes[id] = []; ele.outgoers().forEach(function (e) { if (e.isEdge()) nodes[id].push(e.id()); }); } else { edges[id] = [undefined, ele.target().id()]; } }); } 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()); }); } else { edges[id] = [ele.source().id(), ele.target().id()]; } }); } var result = { found: false, trail: undefined }; if (dflag) return result;else if (oddOut && oddIn) { if (directed) { if (startVertex && oddOut != startVertex) { return result; } startVertex = oddOut; } else { if (startVertex && oddOut != startVertex && oddIn != startVertex) { return result; } else if (!startVertex) { startVertex = oddOut; } } } 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; }); currentNode = adjHead; } else if (!directed && currentNode != adjTail) { nodes[adjTail] = nodes[adjTail].filter(function (e) { return e != adj; }); 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())); trail.unshift(eles.getElementById(subtour.shift())); } else { subtour = walk(subtour.shift()).concat(subtour); } } trail.unshift(eles.getElementById(subtour.shift())); // final node for (var d in nodes) { if (nodes[d].length) { return result; } } result.found = true; result.trail = this.spawn(trail, true); return result; } }; var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { var eles = this; var nodes = {}; var id = 0; var edgeCount = 0; 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); component.merge(edge); connectedNodes.forEach(function (node) { var nodeId = node.id(); var connectedEdges = node.connectedEdges().intersection(eles); component.merge(node); if (!nodes[nodeId].cutVertex) { component.merge(connectedEdges); } else { component.merge(connectedEdges.filter(function (edge) { return edge.isLoop(); })); } }); }); components.push(component); }; var biconnectedSearch = function biconnectedSearch(root, currentNode, parent) { if (root === parent) edgeCount += 1; nodes[currentNode] = { id: id, low: id++, cutVertex: false }; var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles); if (edges.size() === 0) { components.push(eles.spawn(eles.getElementById(currentNode))); } else { var sourceId, targetId, otherNodeId, edgeId; edges.forEach(function (edge) { 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({ x: currentNode, y: otherNodeId, 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); } } else { nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].id); } } }); } }; eles.forEach(function (ele) { if (ele.isNode()) { var nodeId = ele.id(); if (!(nodeId in nodes)) { edgeCount = 0; biconnectedSearch(nodeId, nodeId); nodes[nodeId].cutVertex = edgeCount > 1; } } }); var cutVertices = Object.keys(nodes).filter(function (id) { return nodes[id].cutVertex; }).map(function (id) { return eles.getElementById(id); }); return { cut: eles.spawn(cutVertices), components: components }; }; var hopcroftTarjanBiconnected$1 = { hopcroftTarjanBiconnected: hopcroftTarjanBiconnected, htbc: hopcroftTarjanBiconnected, htb: hopcroftTarjanBiconnected, hopcroftTarjanBiconnectedComponents: hopcroftTarjanBiconnected }; var tarjanStronglyConnected = function tarjanStronglyConnected() { var eles = this; var nodes = {}; var index = 0; var components = []; var stack = []; var cut = eles.spawn(eles); var stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) { stack.push(sourceNodeId); nodes[sourceNodeId] = { index: index, low: index++, explored: false }; 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); } } }); return { cut: cut, components: components }; }; var tarjanStronglyConnected$1 = { tarjanStronglyConnected: tarjanStronglyConnected, tsc: tarjanStronglyConnected, tscc: tarjanStronglyConnected, tarjanStronglyConnectedComponents: tarjanStronglyConnected }; var elesfn$j = {}; [elesfn$v, elesfn$u, elesfn$t, elesfn$s, elesfn$r, elesfn$q, elesfn$p, elesfn$o, elesfn$n, elesfn$m, elesfn$l, markovClustering$1, kClustering, hierarchicalClustering$1, affinityPropagation$1, elesfn$k, hopcroftTarjanBiconnected$1, tarjanStronglyConnected$1].forEach(function (props) { extend(elesfn$j, props); }); /*! Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) 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] */ /* 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 */ 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 */ /* provide optional information-hiding proxy */ this.proxy = { then: this.then.bind(this) }; /* support optional executor function */ if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this)); }; /* promise API methods */ api.prototype = { /* promise resolving methods */ fulfill: function fulfill(value) { return deliver(this, STATE_FULFILLED, 'fulfillValue', value); }, 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] */ execute(curr); return next.proxy; /* [Promises/A+ 2.2.7, 3.3] */ } }; /* 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] */ execute(curr); } return curr; }; /* 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 */ 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 */ var handlers = curr[name]; 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] */ }; /* execute procedure asynchronously */ /* [Promises/A+ 2.2.4, 3.1] */ if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0); }; /* 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 { 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] */ return; } resolve(next, result); /* [Promises/A+ 2.2.7.1] */ } }; }; /* "Promise Resolution Procedure" */ /* [Promises/A+ 2.3] */ var resolve = function resolve(promise, x) { /* 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] */ 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] */ function (y) { if (resolved) return; 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] */ function (r) { if (resolved) return; 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] */ } return; } /* 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); }, function (err) { rejectAll(err); }); } else { var val = p; fulfill(i, val); } })(i); } }); }; 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; _p.playing = false; _p.hooked = false; _p.applying = false; _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 || { x: pos.x, y: pos.y }; _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style); } if (isCore) { var pan = target.pan(); _p.startPan = { x: pan.x, y: pan.y }; _p.startZoom = target.zoom(); } // for future timeline/animations impl this.length = 1; this[0] = this; }; var anifn = Animation.prototype; extend(anifn, { instanceString: function instanceString() { return 'animation'; }, 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); // 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 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... return this; }, playing: function playing() { return this._private.playing; }, apply: function apply() { 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 return this; }, applying: function applying() { return this._private.applying; }, pause: function pause() { var _p = this._private; _p.playing = false; _p.started = false; return this; }, stop: function stop() { var _p = this._private; _p.playing = false; _p.started = false; _p.stopped = true; // to be removed from animation queues return this; }, rewind: function rewind() { return this.progress(0); }, fastforward: function fastforward() { return this.progress(1); }, time: function time(t) { var _p = this._private; if (t === undefined) { return _p.progress * _p.duration; } else { return this.progress(t / _p.duration); } }, 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() { return this._private.progress === 1; }, 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 if (_p.style) { for (var i = 0; i < _p.style.length; i++) { var prop = _p.style[i]; var name = prop.name; var startStyleProp = _p.startStyle[name]; _p.startStyle[name] = prop; _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(); }); }); } }); anifn.complete = anifn.completed; anifn.run = anifn.play; anifn.running = anifn.playing; var define$3 = { animated: function animated() { return function animatedImpl() { 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, complete: complete }); }; }, // 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, complete: complete }); }; }, // 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 } 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 if (isCore && properties.panBy != null) { var panBy = properties.panBy; var cyPan = cy.pan(); properties.pan = { x: cyPan.x + panBy.x, y: cyPan.y + panBy.y }; } // 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 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 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; } } else { properties.zoom = null; // an inavalid zoom (e.g. no delta) gets automatically destroyed } } return new Animation(all[0], properties); }; }, // 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 for (var i = 0; i < all.length; i++) { var ele = all[i]; var queue = ele.animated() && (properties.queue === undefined || properties.queue); var ani = ele.animation(properties, queue ? { queue: true } : 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 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`) cy.notify('draw'); return this; }; } // stop }; // define /** * 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 * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; var isArray_1 = isArray; /** 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_1(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol_1(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); } var _isKey = isKey; /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * 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 */ function isFunction(value) { if (!isObject_1(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; } var isFunction_1 = isFunction; /** Used to detect overreaching core-js shims. */ var coreJsData = _root['__core-js_shared__']; var _coreJsData = coreJsData; /** 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); } var _isMasked = isMasked; /** Used for built-in method references. */ var funcProto$1 = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString$1 = funcProto$1.toString; /** * 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$1.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } var _toSource = toSource; /** * 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$3 = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty$3 = objectProto$3.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty$3).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_1(value) || _isMasked(value)) { return false; } var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; return pattern.test(_toSource(value)); } var _baseIsNative = baseIsNative; /** * 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$1(object, key) { return object == null ? undefined : object[key]; } var _getValue = getValue$1; /** * 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; } var _getNative = getNative; /* Built-in method references that are verified to be native. */ var nativeCreate = _getNative(Object, 'create'); var _nativeCreate = nativeCreate; /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; this.size = 0; } var _hashClear = hashClear; /** * 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; } var _hashDelete = hashDelete; /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto$2 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$2 = objectProto$2.hasOwnProperty; /** * 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$1 ? undefined : result; } return hasOwnProperty$2.call(data, key) ? data[key] : undefined; } var _hashGet = hashGet; /** Used for built-in method references. */ var objectProto$1 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$1 = objectProto$1.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$1.call(data, key); } var _hashHas = hashHas; /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * 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; } var _hashSet = hashSet; /** * 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; 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; var _Hash = Hash; /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } var _listCacheClear = listCacheClear; /** * 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 */ function eq(value, other) { return value === other || (value !== value && other !== other); } var eq_1 = eq; /** * 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_1(array[length][0], key)) { return length; } } return -1; } var _assocIndexOf = assocIndexOf; /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * 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); 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; } var _listCacheDelete = listCacheDelete; /** * 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); return index < 0 ? undefined : data[index][1]; } var _listCacheGet = listCacheGet; /** * 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; } var _listCacheHas = listCacheHas; /** * 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); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } var _listCacheSet = listCacheSet; /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ 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]); } } // Add methods to `ListCache`. ListCache.prototype.clear = _listCacheClear; ListCache.prototype['delete'] = _listCacheDelete; ListCache.prototype.get = _listCacheGet; ListCache.prototype.has = _listCacheHas; ListCache.prototype.set = _listCacheSet; var _ListCache = ListCache; /* Built-in method references that are verified to be native. */ var Map$1 = _getNative(_root, 'Map'); var _Map = Map$1; /** * 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 }; } var _mapCacheClear = mapCacheClear; /** * 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`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } var _isKeyable = isKeyable; /** * 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; } var _getMapData = getMapData; /** * 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; } var _mapCacheDelete = mapCacheDelete; /** * 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); } var _mapCacheGet = mapCacheGet; /** * 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); } var _mapCacheHas = mapCacheHas; /** * 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; } var _mapCacheSet = mapCacheSet; /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ 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; var _MapCache = MapCache; /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /** * 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'] * * // 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; 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; } // Expose `MapCache`. memoize.Cache = _MapCache; var memoize_1 = memoize; /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * 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_1(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } var _memoizeCapped = memoizeCapped; /** 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; /** * 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; }); var _stringToPath = stringToPath; /** * 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); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } var _arrayMap = arrayMap; /** Used as references for various `Number` constants. */ var INFINITY$1 = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = _Symbol ? _Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * 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_1(value)) { // Recursively convert values (susceptible to call stack limits). return _arrayMap(value, baseToString) + ''; } if (isSymbol_1(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; } var _baseToString = baseToString; /** * 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' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString$1(value) { return value == null ? '' : _baseToString(value); } var toString_1 = toString$1; /** * 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_1(value)) { return value; } return _isKey(value, object) ? [value] : _stringToPath(toString_1(value)); } var _castPath = castPath; /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * 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_1(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } var _toKey = toKey; /** * 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); var index = 0, length = path.length; while (object != null && index < length) { object = object[_toKey(path[index++])]; } return (index && index == length) ? object : undefined; } var _baseGet = baseGet; /** * 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 * * _.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 get_1 = get; var defineProperty = (function() { try { var func = _getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); var _defineProperty = defineProperty; /** * 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; } } var _baseAssignValue = baseAssignValue; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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_1(objValue, value)) || (value === undefined && !(key in object))) { _baseAssignValue(object, key, value); } } var _assignValue = assignValue; /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * 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; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } var _isIndex = isIndex; /** * 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_1(object)) { return object; } path = _castPath(path, object); var index = -1, length = path.length, lastIndex = length - 1, nested = object; 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_1(objValue) ? objValue : (_isIndex(path[index + 1]) ? [] : {}); } } _assignValue(nested, key, newValue); nested = nested[key]; } return object; } var _baseSet = baseSet; /** * 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`. * * @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 * * 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); } var set_1 = set; /** * 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; } var _copyArray = copyArray; /** * 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'] * * _.toPath('a[0].b.c'); * // => ['a', '0', 'b', 'c'] */ function toPath(value) { if (isArray_1(value)) { return _arrayMap(value, _toKey); } return isSymbol_1(value) ? [value] : _copyArray(_stringToPath(toString_1(value))); } var toPath_1 = toPath; var define$2 = { // access data field data: function data(params) { var defaults = { field: 'data', bindingEvent: 'data', allowBinding: false, allowSetting: false, allowGetting: false, settingEvent: 'data', settingTriggersEvent: false, triggerFnName: 'trigger', immutableKeys: {}, // key => true if immutable updateStyle: false, beforeGet: function beforeGet(self) {}, beforeSet: function beforeSet(self, obj) {}, onSet: function onSet(self) {}, canSet: function canSet(self) { return true; } }; params = extend({}, defaults, params); return function dataImpl(name, value) { var p = params; 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; // .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_1(name); // .data('foo') if (p.allowGetting && value === undefined) { // get var ret; if (single) { 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_1(single._private[p.field], path); } else { ret = single._private[p.field][name]; } } return ret; // .data('foo', 'bar') } else if (p.allowSetting && value !== undefined) { // set var valid = !p.immutableKeys[name]; if (valid) { var change = _defineProperty$1({}, 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_1(ele._private[p.field], path, value); } else { ele._private[p.field][name] = value; } } } // update mappers if asked if (p.updateStyle) { self.updateStyle(); } // call onSet callback p.onSet(self); if (p.settingTriggersEvent) { self[p.triggerFnName](p.settingEvent); } } } // .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 if (p.updateStyle) { self.updateStyle(); } // call onSet callback p.onSet(self); if (p.settingTriggersEvent) { self[p.triggerFnName](p.settingEvent); } // .data(function(){ ... }) } else if (p.allowBinding && fn$6(name)) { // bind to event var fn = name; 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 = { field: 'data', event: 'data', 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') 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() } 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 = { eventAliasesOn: function eventAliasesOn(proto) { 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.pon = p.promiseOn = function (events, selector) { var self = this; var args = Array.prototype.slice.call(arguments, 0); return new Promise$1(function (resolve, reject) { var callback = function callback(e) { self.off.apply(self, offArgs); resolve(e); }; var onArgs = args.concat([callback]); var offArgs = onArgs.concat([]); self.on.apply(self, onArgs); }); }; } }; // define // use this module to cherry pick functions into your prototype var define = {}; [define$3, define$2, define$1].forEach(function (m) { extend(define, m); }); var elesfn$i = { animate: define.animate(), animation: define.animation(), animated: define.animated(), clearQueue: define.clearQueue(), delay: define.delay(), delayAnimation: define.delayAnimation(), stop: define.stop() }; 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 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 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 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 if (changed.length > 0) { this.spawn(changed).updateStyle().emit('class'); } return self; }, addClass: function addClass(classes) { return this.toggleClass(classes, true); }, hasClass: function hasClass(className) { var ele = this[0]; return ele != null && ele._private.classes.has(className); }, toggleClass: function toggleClass(classes, toggle) { if (!array(classes)) { // extract classes from string classes = classes.match(/\S+/g) || []; } var self = this; var toggleUndefd = toggle === undefined; var changed = []; // eles who had classes changed for (var i = 0, il = self.length; i < il; i++) { 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; } else if (!toggle || toggleUndefd && hasClass) { 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 if (changed.length > 0) { this.spawn(changed).updateStyle().emit('class'); } return self; }, removeClass: function removeClass(classes) { return this.toggleClass(classes, false); }, flashClass: function flashClass(classes, duration) { var self = this; if (duration == null) { duration = 250; } else if (duration === 0) { return self; // nothing to do really } self.addClass(classes); setTimeout(function () { self.removeClass(classes); }, duration); return self; } }; 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 comparatorOp: '=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=', // binary comparison op (used in data selectors) boolOp: '\\?|\\!|\\^', // boolean (unary) operators (used in data selectors) string: '"(?:\\\\"|[^"])*"' + '|' + "'(?:\\\\'|[^'])*'", // string literals (used in data selectors) -- doublequotes | singlequotes number: number, // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123 meta: 'degree|indegree|outdegree', // allowed metadata fields (i.e. allowed functions to use from Collection) separator: '\\s*,\\s*', // queries are separated by commas, e.g. edge[foo = 'bar'], node.someClass descendant: '\\s+', child: '\\s+>\\s+', subject: '\\$', group: 'node|edge|\\*', directedEdge: '\\s+->\\s+', 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 ops = tokens.comparatorOp.split('|'); for (i = 0; i < ops.length; i++) { op = ops[i]; tokens.comparatorOp += '|@' + op; } // 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; } })(); /** * Make a new query object * * @prop type {Type} The type enum (int) of the query * @prop checks List of checks to make against an ele to test for a match */ var newQuery = function newQuery() { return { checks: [] }; }; /** * A check type enum-like object. Uses integer values for fast match() lookup. * The ordering does not matter as long as the ints are unique. */ 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 }; var stateSelectors = [{ selector: ':selected', matches: function matches(ele) { return ele.selected(); } }, { selector: ':unselected', matches: function matches(ele) { return !ele.selected(); } }, { selector: ':selectable', matches: function matches(ele) { return ele.selectable(); } }, { selector: ':unselectable', matches: function matches(ele) { return !ele.selectable(); } }, { selector: ':locked', matches: function matches(ele) { return ele.locked(); } }, { selector: ':unlocked', matches: function matches(ele) { return !ele.locked(); } }, { selector: ':visible', matches: function matches(ele) { return ele.visible(); } }, { selector: ':hidden', matches: function matches(ele) { return !ele.visible(); } }, { selector: ':transparent', matches: function matches(ele) { return ele.transparent(); } }, { selector: ':grabbed', matches: function matches(ele) { return ele.grabbed(); } }, { selector: ':free', matches: function matches(ele) { return !ele.grabbed(); } }, { selector: ':removed', matches: function matches(ele) { return ele.removed(); } }, { selector: ':inside', matches: function matches(ele) { return !ele.removed(); } }, { selector: ':grabbable', matches: function matches(ele) { return ele.grabbable(); } }, { selector: ':ungrabbable', matches: function matches(ele) { return !ele.grabbable(); } }, { selector: ':animated', matches: function matches(ele) { return ele.animated(); } }, { selector: ':unanimated', matches: function matches(ele) { return !ele.animated(); } }, { selector: ':parent', matches: function matches(ele) { return ele.isParent(); } }, { selector: ':childless', matches: function matches(ele) { return ele.isChildless(); } }, { selector: ':child', matches: function matches(ele) { return ele.isChild(); } }, { selector: ':orphan', matches: function matches(ele) { return ele.isOrphan(); } }, { selector: ':nonorphan', matches: function matches(ele) { return ele.isChild(); } }, { selector: ':compound', matches: function matches(ele) { if (ele.isNode()) { return ele.isParent(); } else { return ele.source().isParent() || ele.target().isParent(); } } }, { selector: ':loop', matches: function matches(ele) { return ele.isLoop(); } }, { selector: ':simple', matches: function matches(ele) { return ele.isSimple(); } }, { selector: ':active', matches: function matches(ele) { return ele.active(); } }, { selector: ':inactive', matches: function matches(ele) { return !ele.active(); } }, { selector: ':backgrounding', matches: function matches(ele) { return ele.backgrounding(); } }, { selector: ':nonbackgrounding', matches: function matches(ele) { return !ele.backgrounding(); } }].sort(function (a, b) { // 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); }; 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; // - 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 query: true, regex: '(' + tokens.group + ')', populate: function populate(selector, query, _ref) { var _ref2 = _slicedToArray(_ref, 1), group = _ref2[0]; query.checks.push({ type: Type.GROUP, value: group === '*' ? group : group + 's' }); } }, { name: 'state', query: true, regex: stateSelectorRegex, populate: function populate(selector, query, _ref3) { var _ref4 = _slicedToArray(_ref3, 1), state = _ref4[0]; query.checks.push({ type: Type.STATE, value: state }); } }, { name: 'id', query: true, regex: '\\#(' + tokens.id + ')', populate: function populate(selector, query, _ref5) { var _ref6 = _slicedToArray(_ref5, 1), id = _ref6[0]; query.checks.push({ type: Type.ID, value: cleanMetaChars(id) }); } }, { name: 'className', query: true, regex: '\\.(' + tokens.className + ')', populate: function populate(selector, query, _ref7) { var _ref8 = _slicedToArray(_ref7, 1), className = _ref8[0]; query.checks.push({ type: Type.CLASS, value: cleanMetaChars(className) }); } }, { name: 'dataExists', query: true, regex: '\\[\\s*(' + tokens.variable + ')\\s*\\]', populate: function populate(selector, query, _ref9) { var _ref10 = _slicedToArray(_ref9, 1), variable = _ref10[0]; query.checks.push({ type: Type.DATA_EXIST, field: cleanMetaChars(variable) }); } }, { name: 'dataCompare', query: true, 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]; 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), operator: comparatorOp, value: value }); } }, { name: 'dataBool', query: true, 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]; query.checks.push({ type: Type.DATA_BOOL, field: cleanMetaChars(variable), operator: boolOp }); } }, { name: 'metaCompare', query: true, 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]; query.checks.push({ type: Type.META_COMPARE, field: cleanMetaChars(meta), operator: comparatorOp, value: parseFloat(number) }); } }, { name: 'nextQuery', separator: true, regex: tokens.separator, populate: function populate(selector, query) { var currentSubject = selector.currentSubject; 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 var nextQuery = selector[selector.length++] = newQuery(); return nextQuery; // this is the new query to be filled by the following exprs } }, { name: 'directedEdge', separator: true, regex: tokens.directedEdge, populate: function populate(selector, query) { if (selector.currentSubject == null) { // undirected edge var edgeQuery = newQuery(); var source = query; var target = newQuery(); edgeQuery.checks.push({ type: Type.DIRECTED_EDGE, source: source, target: target }); // 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 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 replaceLastQuery(selector, query, srcTgtQ); selector.edgeCount++; return _target; // now populating the target with the following expressions } } }, { name: 'undirectedEdge', separator: true, regex: tokens.undirectedEdge, populate: function populate(selector, query) { if (selector.currentSubject == null) { // undirected edge var edgeQuery = newQuery(); var source = query; var target = newQuery(); edgeQuery.checks.push({ type: Type.UNDIRECTED_EDGE, nodes: [source, target] }); // 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 return target; } else { // neighbourhood var nhoodQ = newQuery(); var node = query; var neighbor = newQuery(); nhoodQ.checks.push({ type: Type.NODE_NEIGHBOR, node: node, neighbor: neighbor }); // 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 } } }, { name: 'child', separator: true, regex: tokens.child, populate: function populate(selector, query) { if (selector.currentSubject == null) { // default: child query var parentChildQuery = newQuery(); var child = newQuery(); var parent = selector[selector.length - 1]; parentChildQuery.checks.push({ type: Type.CHILD, parent: parent, child: child }); // 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 return child; } else if (selector.currentSubject === query) { // compound split query var compound = newQuery(); var left = selector[selector.length - 1]; var right = newQuery(); var subject = newQuery(); var _child = newQuery(); var _parent = newQuery(); // 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 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 _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` selector.currentSubject = subject; selector.compoundCount++; return _child; // now populating the right side's child } else { // 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 _parent2.checks = query.checks; // the previous query contains the checks for the parent query.checks = pcQChecks; // pc query takes over selector.compoundCount++; return _child2; // we're now populating the child } } }, { name: 'descendant', separator: true, regex: tokens.descendant, populate: function populate(selector, query) { if (selector.currentSubject == null) { // default: descendant query var ancChQuery = newQuery(); var descendant = newQuery(); var ancestor = selector[selector.length - 1]; ancChQuery.checks.push({ type: Type.DESCENDANT, ancestor: ancestor, descendant: descendant }); // 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 return descendant; } else if (selector.currentSubject === query) { // compound split query var compound = newQuery(); var left = selector[selector.length - 1]; var right = newQuery(); var subject = newQuery(); var _descendant = newQuery(); var _ancestor = newQuery(); // 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 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 _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` selector.currentSubject = subject; selector.compoundCount++; return _descendant; // now populating the right side's descendant } else { // 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 _ancestor2.checks = query.checks; // the previous query contains the checks for the parent query.checks = adQChecks; // pc query takes over selector.compoundCount++; return _descendant2; // we're now populating the child } } }, { name: 'subject', modifier: true, regex: tokens.subject, populate: function populate(selector, query) { if (selector.currentSubject != null && selector.currentSubject !== query) { 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]; // clean up unused fields for new type topChk.nodes = null; } } }]; exprs.forEach(function (e) { return e.regexObj = new RegExp('^' + e.regex); }); /** * Of all the expressions, find the first match in the remaining text. * @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; name = n; var consumed = m[0]; remaining = remaining.substring(consumed.length); break; // we've consumed one expr, so we can return now } } return { expr: expr, match: match, name: name, 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; var currentQuery = self[0] = newQuery(); self.length = 1; remaining = consumeWhitespace(remaining); // get rid of leading whitespace 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 ret = exprInfo.expr.populate(self, currentQuery, args); if (ret === false) { return false; // exit if population failed } else if (ret != null) { currentQuery = ret; // change the current query to be filled if the expr specifies } } 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 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; } else if (q.edgeCount === 1) { 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 ''; } else { return obj; } }; var cleanVal = function cleanVal(val) { if (string(val)) { return '"' + val + '"'; } else { return clean(val); } }; var space = function space(val) { return ' ' + val + ' '; }; var checkToString = function checkToString(check, subject) { var type = check.type, 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; return '[' + field + space(clean(operator)) + cleanVal(value) + ']'; } case Type.DATA_BOOL: { var _operator = check.operator, _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; 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); var sub = queryToString(check.subject, subject); 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; }; var parse$1 = { parse: parse, toString: toString }; var valCmp = function valCmp(fieldVal, operator, value) { var matches; var isFieldStr = string(fieldVal); var isFieldNum = number$1(fieldVal); var isValStr = string(value); var fieldStr, valStr; 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 (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 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; } }; var existCmp = function existCmp(fieldVal) { return fieldVal !== undefined; }; var data$1 = function data(ele, field) { return ele.data(field); }; var meta = function meta(ele, field) { return 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; return valCmp(meta(ele, field), operator, value); }; match[Type.DATA_COMPARE] = function (check, ele) { var field = check.field, 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; return boolCmp(data$1(ele, field), operator); }; match[Type.DATA_EXIST] = function (check, ele) { var field = check.field; 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]; var src = ele.source(); 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 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? 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 }; var Selector = function Selector(selector) { this.inputText = selector; this.currentSubject = null; this.compoundCount = 0; this.edgeCount = 0; this.length = 0; if (selector == null || string(selector) && selector.match(/^\s*$/)) ; else if (elementOrCollection(selector)) { this.addQuery({ checks: [{ type: Type.COLLECTION, value: selector.collection() }] }); } else if (fn$6(selector)) { this.addQuery({ checks: [{ type: Type.FILTER, value: selector }] }); } else if (string(selector)) { if (!this.parse(selector)) { this.invalid = true; } } else { 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 = { allAre: function allAre(selector) { var selObj = new Selector(selector); return this.every(function (ele) { return selObj.matches(ele); }); }, is: function is(selector) { var selObj = new Selector(selector); return this.some(function (ele) { return selObj.matches(ele); }); }, 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) { // cheap collection ref check if (this === collection) { return true; } collection = this.cy().collection(collection); var thisLength = this.length; var collectionLength = collection.length; // cheap length check if (thisLength !== collectionLength) { return false; } // cheap element ref check if (thisLength === 1) { return this[0] === collection[0]; } return this.every(function (ele) { return collection.hasElementWithId(ele.id()); }); }, anySame: function anySame(collection) { collection = this.cy().collection(collection); return this.some(function (ele) { return collection.hasElementWithId(ele.id()); }); }, allAreNeighbors: function allAreNeighbors(collection) { collection = this.cy().collection(collection); var nhood = this.neighborhood(); return collection.every(function (ele) { return nhood.hasElementWithId(ele.id()); }); }, contains: function contains(collection) { collection = this.cy().collection(collection); var self = this; return collection.every(function (ele) { return self.hasElementWithId(ele.id()); }); } }; elesfn$g.allAreNeighbours = elesfn$g.allAreNeighbors; elesfn$g.has = elesfn$g.contains; elesfn$g.equal = elesfn$g.equals = elesfn$g.same; var cache = function cache(fn, name) { return function traversalCache(arg1, arg2, arg3, arg4) { 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 { return ch[hash] = fn.call(eles, arg1, arg2, arg3, arg4); } } else { return fn.call(eles, arg1, arg2, arg3, arg4); } }; }; var elesfn$f = { parent: function parent(selector) { 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(); ancestors = ancestors || parents; ancestors = ancestors.intersect(parents); // current list must be common with current ele parents set } return ancestors.filter(selector); }, orphans: function orphans(selector) { return this.stdFilter(function (ele) { return ele.isOrphan(); }).filter(selector); }, nonorphans: function nonorphans(selector) { return this.stdFilter(function (ele) { return ele.isChild(); }).filter(selector); }, 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) { return this.parent().children().not(this).filter(selector); }, 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 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 elesfn$f.ancestors = elesfn$f.parents; var fn$5, elesfn$e; fn$5 = elesfn$e = { data: define.data({ field: 'data', bindingEvent: 'data', allowBinding: true, allowSetting: true, settingEvent: 'data', settingTriggersEvent: true, triggerFnName: 'trigger', allowGetting: true, immutableKeys: { 'id': true, 'source': true, 'target': true, 'parent': true }, updateStyle: true }), removeData: define.removeData({ field: 'data', event: 'data', triggerFnName: 'trigger', triggerEvent: true, immutableKeys: { 'id': true, 'source': true, 'target': true, 'parent': 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 }), rscratch: define.data({ field: 'rscratch', allowBinding: false, allowSetting: true, settingTriggersEvent: false, allowGetting: true }), removeRscratch: define.removeData({ field: 'rscratch', triggerEvent: false }), id: function id() { var ele = this[0]; if (ele) { return ele._private.data.id; } } }; // 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())) { return 2; } else { return 1; } }), indegree: defineDegreeFunction(function (node, edge) { if (edge.target().same(node)) { return 1; } else { return 0; } }), outdegree: defineDegreeFunction(function (node, edge) { if (edge.source().same(node)) { return 1; } else { return 0; } }) }); 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; }), maxDegree: defineDegreeBoundsFunction('degree', function (degree, max) { return degree > max; }), minIndegree: defineDegreeBoundsFunction('indegree', function (degree, min) { return degree < min; }), maxIndegree: defineDegreeBoundsFunction('indegree', function (degree, max) { return degree > max; }), minOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, min) { return degree < min; }), maxOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, max) { return degree > max; }) }); 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', allowBinding: true, allowSetting: true, settingEvent: 'position', settingTriggersEvent: true, triggerFnName: 'emitAndNotify', allowGetting: true, validKeys: ['x', 'y'], beforeGet: function beforeGet(ele) { ele.updateCompoundBounds(); }, beforeSet: function beforeSet(eles, newPos) { beforePositionSet(eles, newPos, false); }, onSet: function onSet(eles) { eles.dirtyCompoundBoundsCache(); }, canSet: function canSet(ele) { return !ele.locked(); } }; fn$4 = elesfn$c = { position: define.data(positionDef), // position but no notification to renderer silentPosition: define.data(extend({}, positionDef, { allowBinding: false, allowSetting: true, settingTriggersEvent: false, allowGetting: false, beforeSet: function beforeSet(eles, newPos) { beforePositionSet(eles, newPos, true); }, onSet: function onSet(eles) { eles.dirtyCompoundBoundsCache(); } })), positions: function positions(pos, silent) { if (plainObject(pos)) { if (silent) { this.silentPosition(pos); } else { this.position(pos); } } else if (fn$6(pos)) { 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); } else { ele.position(_pos); } } } 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, y: number$1(dim.y) ? dim.y : 0 }; silent = val; } else if (string(dim) && number$1(val)) { delta = { x: 0, y: 0 }; 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 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) { if (plainObject(dim)) { this.shift(dim, true); } 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 renderedPosition: function renderedPosition(dim, val) { var ele = this[0]; var cy = this.cy(); var zoom = cy.zoom(); 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); } else if (rpos !== undefined) { // set whole position _ele.position(renderedToModelPosition(rpos, zoom, pan)); } } } else { // getting var pos = ele.position(); rpos = modelToRenderedPosition(pos, zoom, pan); if (dim === undefined) { // then return the whole rendered position return rpos; } else { // then return the specified dimension return rpos[dim]; } } } else if (!setting) { return undefined; // for empty collection case } return this; // chaining }, // get/set the position relative to the parent relativePosition: function relativePosition(dim, val) { var ele = this[0]; var cy = this.cy(); 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) { for (var i = 0; i < this.length; i++) { var _ele2 = this[i]; 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]); } else if (ppos !== undefined) { // set whole position _ele2.position({ x: ppos.x + origin.x, y: ppos.y + origin.y }); } } } 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; } else { // then return the specified dimension return ppos[dim]; } } } else if (!setting) { return undefined; // for empty collection case } return this; // chaining } }; // 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; fn$4.relativePoint = fn$4.relativePosition; 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(); var zoom = cy.zoom(); var pan = cy.pan(); var x1 = bb.x1 * zoom + pan.x; var x2 = bb.x2 * zoom + pan.x; var y1 = bb.y1 * zoom + pan.y; var y2 = bb.y2 * zoom + pan.y; return { x1: x1, x2: x2, y1: y1, y2: y2, w: x2 - x1, 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'); } } }); 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 if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { return this; } // 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'; var min = { width: { val: parent.pstyle('min-width').pfValue, left: parent.pstyle('min-width-bias-left'), right: parent.pstyle('min-width-bias-right') }, height: { val: parent.pstyle('min-height').pfValue, top: parent.pstyle('min-height-bias-top'), bottom: parent.pstyle('min-height-bias-bottom') } }; var bb = children.boundingBox({ includeLabels: includeLabels, includeOverlays: false, // updating the compound bounds happens outside of the regular // 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 if (bb.w === 0 || bb.h === 0) { bb = { w: parent.pstyle('width').pfValue, h: parent.pstyle('height').pfValue }; bb.x1 = pos.x - bb.w / 2; bb.x2 = pos.x + bb.w / 2; 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; } } else if (paddingObject.units === 'px') { return paddingObject.pfValue; } else { 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; var heightBiasDiffs = computeBiasValues(min.height.val - bb.h, topVal, bottomVal); var diffTop = heightBiasDiffs.biasDiff; var diffBottom = heightBiasDiffs.biasComplementDiff; _p.autoPadding = computePaddingValues(bb.w, bb.h, parent.pstyle('padding'), parent.pstyle('padding-relative-to').value); _p.autoWidth = Math.max(bb.w, min.width.val); pos.x = (-diffLeft + bb.x1 + bb.x2 + diffRight) / 2; _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 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; b.y2 = y2 > b.y2 ? y2 : b.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; y = rstyle.srcY; } else if (prefix === 'target') { x = rstyle.tgtX; y = rstyle.tgtY; } else { x = rstyle.midX; y = rstyle.midY; } // always store the individual arrow bounds var bbs = _p.arrowBounds = _p.arrowBounds || {}; var bb = bbs[prefix] = bbs[prefix] || {}; bb.x1 = x - halfArW; bb.y1 = y - halfArW; bb.x2 = x + halfArW; bb.y2 = y + halfArW; bb.w = bb.x2 - bb.x1; bb.h = bb.y2 - bb.y1; expandBoundingBox(bb, 1); 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'); var labelWidth = prefixedProperty(rstyle, 'labelWidth', prefix); var labelHeight = prefixedProperty(rstyle, 'labelHeight', prefix); var labelX = prefixedProperty(rstyle, 'labelX', prefix); var labelY = prefixedProperty(rstyle, 'labelY', prefix); var marginX = ele.pstyle(prefixDash + 'text-margin-x').pfValue; var marginY = ele.pstyle(prefixDash + 'text-margin-y').pfValue; var isEdge = ele.isEdge(); var rotation = ele.pstyle(prefixDash + 'text-rotation'); var outlineWidth = ele.pstyle('text-outline-width').pfValue; var borderWidth = ele.pstyle('text-border-width').pfValue; var halfBorderWidth = borderWidth / 2; var padding = ele.pstyle('text-background-padding').pfValue; var marginOfError = 2; // expand to work around browser dimension inaccuracies var lh = labelHeight; var lw = labelWidth; 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; ly1 = labelY - lh_2; ly2 = labelY + lh_2; } else { switch (halign.value) { case 'left': 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 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 var bbPrefix = prefix || 'main'; var bbs = _p.labelBounds; var bb = bbs[bbPrefix] = bbs[bbPrefix] || {}; bb.x1 = lx1; bb.y1 = ly1; bb.x2 = lx2; bb.y2 = ly2; bb.w = lx2 - lx1; 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 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; return { x: x * cos - y * sin + xo, y: x * sin + y * cos + yo }; }; var px1y1 = rotate(lx1, ly1); var px1y2 = rotate(lx1, ly2); var px2y1 = rotate(lx2, ly1); var px2y2 = rotate(lx2, ly2); lx1 = Math.min(px1y1.x, px1y2.x, px2y1.x, px2y2.x); lx2 = Math.max(px1y1.x, px1y2.x, px2y1.x, px2y2.x); 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; bbRot.y1 = ly1; bbRot.x2 = lx2; bbRot.y2 = ly2; bbRot.w = lx2 - lx1; bbRot.h = ly2 - ly1; updateBounds(bounds, lx1, ly1, lx2, ly2); updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2); } return bounds; }; var updateBoundsFromOutline = function updateBoundsFromOutline(bounds, ele) { if (ele.cy().headless()) { return; } var outlineOpacity = ele.pstyle('outline-opacity').value; var outlineWidth = ele.pstyle('outline-width').value; if (outlineOpacity > 0 && outlineWidth > 0) { var outlineOffset = ele.pstyle('outline-offset').value; var nodeShape = ele.pstyle('shape').value; var outlineSize = outlineWidth + outlineOffset; var scaleX = (bounds.w + outlineSize * 2) / bounds.w; var scaleY = (bounds.h + outlineSize * 2) / bounds.h; var xOffset = 0; var yOffset = 0; if (["diamond", "pentagon", "round-triangle"].includes(nodeShape)) { scaleX = (bounds.w + outlineSize * 2.4) / bounds.w; yOffset = -outlineSize / 3.6; } else if (["concave-hexagon", "rhomboid", "right-rhomboid"].includes(nodeShape)) { scaleX = (bounds.w + outlineSize * 2.4) / bounds.w; } else if (nodeShape === "star") { scaleX = (bounds.w + outlineSize * 2.8) / bounds.w; scaleY = (bounds.h + outlineSize * 2.6) / bounds.h; yOffset = -outlineSize / 3.8; } else if (nodeShape === "triangle") { scaleX = (bounds.w + outlineSize * 2.8) / bounds.w; scaleY = (bounds.h + outlineSize * 2.4) / bounds.h; yOffset = -outlineSize / 1.4; } else if (nodeShape === "vee") { scaleX = (bounds.w + outlineSize * 4.4) / bounds.w; scaleY = (bounds.h + outlineSize * 3.8) / bounds.h; yOffset = -outlineSize * .5; } var hDelta = bounds.h * scaleY - bounds.h; var wDelta = bounds.w * scaleX - bounds.w; expandBoundingBoxSides(bounds, [Math.ceil(hDelta / 2), Math.ceil(wDelta / 2)]); if (xOffset != 0 || yOffset !== 0) { var oBounds = shiftBoundingBox(bounds, xOffset, yOffset); updateBoundingBox(bounds, oBounds); } } }; // 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(); var headless = cy.headless(); var bounds = makeBoundingBox(); var _p = ele._private; 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 isDisplayed = function isDisplayed(ele) { return ele.pstyle('display').value !== 'none'; }; var displayed = !styleEnabled || isDisplayed(ele) // 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 ///////////////////////// ex1 = x - halfW; ex2 = x + halfW; ey1 = y - halfH; ey2 = y + halfH; updateBounds(bounds, ex1, ey1, ex2, ey2); if (styleEnabled && options.includeOutlines) { updateBoundsFromOutline(bounds, ele); } } else if (isEdge && options.includeEdges) { if (styleEnabled && !headless) { 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 ex1 -= wHalf; ex2 += wHalf; ey1 -= wHalf; ey2 += wHalf; 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.endsWith('segments') || curveStyle.endsWith('taxi')) { var pts; switch (curveStyle) { case 'bezier': case 'unbundled-bezier': pts = rstyle.bezierPts; break; case 'segments': case 'taxi': case 'round-segments': case 'round-taxi': pts = rstyle.linePts; break; } if (pts != null) { for (var j = 0; j < pts.length; j++) { var pt = pts[j]; ex1 = pt.x - wHalf; ex2 = pt.x + wHalf; ey1 = pt.y - wHalf; ey2 = pt.y + wHalf; updateBounds(bounds, ex1, ey1, ex2, ey2); } } } // 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(); var n2pos = n2.position(); ex1 = n1pos.x; 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 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 //////// 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 var bbBody = _p.bodyBounds = _p.bodyBounds || {}; assignBoundingBox(bbBody, bounds); expandBoundingBoxSides(bbBody, manualExpansion); expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies // overlay ////////// if (styleEnabled) { ex1 = bounds.x1; ex2 = bounds.x2; 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 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 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); key += tf(opts.includeLabels); key += tf(opts.includeMainLabels); key += tf(opts.includeSourceLabels); key += tf(opts.includeTargetLabels); key += tf(opts.includeOverlays); key += tf(opts.includeOutlines); 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; var isEdge = ele.isEdge(); var key = opts == null ? defBbOptsKey : getKey(opts); var usingDefOpts = key === defBbOptsKey; 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 if (!usingDefOpts) { var isNode = ele.isNode(); bb = makeBoundingBox(); if (opts.includeNodes && isNode || opts.includeEdges && !isNode) { if (opts.includeOverlays) { updateBoundsFromBox(bb, _p.overlayBounds); } else { updateBoundsFromBox(bb, _p.bodyBounds); } } if (opts.includeLabels) { if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) { updateBoundsFromBox(bb, _p.labelBounds.all); } else { 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, includeLabels: true, includeMainLabels: true, includeSourceLabels: true, includeTargetLabels: true, includeOverlays: true, includeUnderlays: true, includeOutlines: true, useCache: true }; 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 // 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(); options = options || defBbOpts; var opts = filledBbOpts(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]; var _p = ele._private; var currPosKey = getBoundingBoxPosKey(ele); var isPosKeySame = _p.bbCachePosKey === currPosKey; var useCache = opts.useCache && isPosKeySame && !_p.styleDirty; 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); bounds.y2 = noninf(bounds.y2); bounds.w = noninf(bounds.x2 - bounds.x1); 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; _p.bbCache = null; _p.bbCachePosKey = null; _p.bodyBounds = null; _p.overlayBounds = null; _p.labelBounds.all = null; _p.labelBounds.source = null; _p.labelBounds.target = null; _p.labelBounds.main = null; _p.labelBounds.sourceRot = null; _p.labelBounds.targetRot = null; _p.labelBounds.mainRot = null; _p.arrowBounds.source = null; _p.arrowBounds.target = null; _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 // - 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(); parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle } var bb = copyBoundingBox(this.boundingBox({ useCache: false })); nodes.silentPositions(getOldPos); if (hasCompoundNodes) { parents.dirtyCompoundBoundsCache(); parents.dirtyBoundingBoxCache(); parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle } 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; } } else { return 1; } } }; 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 { return 1; } } }; 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 { return ele.pstyle('padding').pfValue; } } else { 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) { if (ele.isEdge()) { 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(); var pan = cy.pan(); var zoom = cy.zoom(); return getPoints(ele).map(function (p) { return modelToRenderedPosition(p, zoom, pan); }); } }; 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, mult: true }, segmentPoints: { get: segmentPoints, mult: true }, sourceEndpoint: { get: sourceEndpoint }, targetEndpoint: { get: targetEndpoint }, midpoint: { 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); }; } else { obj[rName] = function () { return ifEdgeRenderedPosition(this, spec.get); }; } return obj; }, {}); var dimensions = extend({}, position, bounds, widthHeight, edgePoints); /*! Event object based on jQuery events, MIT license 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 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.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse; } else if (src != null && src.type) { // Plain object containing all event details props = src; } else { // Event string this.type = src; } // Put explicitly provided properties onto the event object if (props != null) { // more efficient to manually copy fields we use this.originalEvent = props.originalEvent; this.type = props.type != null ? props.type : this.type; this.cy = props.cy; this.target = props.target; this.position = props.position; this.renderedPosition = props.renderedPosition; 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; var zoom = this.cy.zoom(); var pan = this.cy.pan(); this.renderedPosition = { x: pos.x * zoom + pan.x, y: pos.y * zoom + pan.y }; } // 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 (e.preventDefault) { e.preventDefault(); } }, stopPropagation: function stopPropagation() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if (!e) { return; } // if stopPropagation exists run it on the original event if (e.stopPropagation) { e.stopPropagation(); } }, stopImmediatePropagation: function stopImmediatePropagation() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; 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 eventMatches( /*context, listener, eventObj*/ ) { return true; }, addEventFields: function addEventFields( /*context, evt*/ ) {}, callbackContext: function callbackContext(context /*, listener, eventObj*/) { return context; }, beforeEmit: function beforeEmit( /* context, listener, eventObj */ ) {}, afterEmit: function afterEmit( /* context, listener, eventObj */ ) {}, bubble: function bubble( /*context*/ ) { return false; }, 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; } else { 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 } } }; 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); return; } else if (plainObject(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) { var type = match[1]; var namespace = match[2] ? match[2] : null; var eventObj = makeEventObj(self, { type: type, namespace: namespace, target: self.context }); handler(self, eventObj); } } }; p.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) { forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) { if (fn$6(callback)) { self.listeners.push({ event: event, // full event string callback: callback, // callback to run type: type, // the event type (e.g. 'click') namespace: namespace, // the event namespace (e.g. ".foo") 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$1(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*/) { 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 = [{ event: eventObj.event, type: eventObj.type, namespace: eventObj.namespace, callback: 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); } }, events); this.emitting--; return this; }; var emitterOptions$1 = { qualifierCompare: function qualifierCompare(selector1, selector2) { if (selector1 == null || selector2 == null) { return selector1 == null && selector2 == null; } else { return selector1.sameText(selector2); } }, 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) { evt.cy = ele.cy(); evt.target = ele; }, callbackContext: function callbackContext(ele, listener, eventObj) { return listener.qualifier != null ? eventObj.target : ele; }, beforeEmit: function beforeEmit(context, listener /*, eventObj*/) { if (listener.conf && listener.conf.once) { listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback); } }, bubble: function bubble() { return true; }, parent: function parent(ele) { return ele.isChild() ? ele.parent() : ele.cy(); } }; var argSelector$1 = function argSelector(arg) { if (string(arg)) { return new Selector(arg); } else { 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() { return this._private.emitter; }, 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() { for (var i = 0; i < this.length; i++) { 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, { once: true, onceCollection: this }); } }, emit: function emit(events, extraParams) { for (var i = 0; i < this.length; i++) { var ele = this[i]; ele.emitter().emit(events, extraParams); } return this; }, emitAndNotify: function emitAndNotify(event, extraParams) { // for internal use only if (this.length === 0) { return; } // empty collections don't need to notify anything // notify renderer this.cy().notify(event, this); this.emit(event, extraParams); return this; } }; define.eventAliasesOn(elesfn$9); var elesfn$8 = { nodes: function nodes(selector) { return this.filter(function (ele) { return ele.isNode(); }).filter(selector); }, edges: function edges(selector) { return this.filter(function (ele) { return ele.isEdge(); }).filter(selector); }, // internal helper to get nodes and edges as separate collections with single iteration over elements 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 }; }, filter: function filter(_filter, thisArg) { if (_filter === undefined) { // check this first b/c it's the most common/performant case return this; } else if (string(_filter) || elementOrCollection(_filter)) { return new Selector(_filter).filter(this); } 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; } else { 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; } }, absoluteComplement: function absoluteComplement() { var cy = this.cy(); return cy.mutableElements().not(this); }, intersect: function intersect(other) { // if a selector is specified, then filter by it instead if (string(other)) { 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 { retEles.push(ele); } } }; add(col1, col2, left); add(col2, col1, right); return { left: left, right: right, both: both }; }, 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; map.set(id, { ele: toAddEle, index: index }); } } 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 this[i] = undefined; map["delete"](id); 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]; var lastEleId = lastEle._private.data.id; this[lastEleI] = undefined; this[i] = lastEle; map.set(lastEleId, { ele: lastEle, index: i }); } // the collection is now 1 ele smaller this.length--; return this; }, // remove single ele in place in calling collection unmergeOne: function unmergeOne(ele) { ele = ele[0]; var _p = this._private; var id = ele._private.data.id; var map = _p.map; var entry = map.get(id); if (!entry) { return this; // no need to remove } var i = entry.index; this.unmergeAt(i); return this; }, // 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 }; }, min: function min(valFn, thisArg) { 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 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; fn$1['n'] = fn$1['&'] = fn$1['.'] = fn$1.and = fn$1.intersection = fn$1.intersect; fn$1['^'] = fn$1['(+)'] = fn$1['(-)'] = fn$1.symmetricDifference = fn$1.symdiff = fn$1.xor; fn$1.fnFilter = fn$1.filterFn = fn$1.stdFilter = fn$1.filter; fn$1.complement = fn$1.abscomp = fn$1.absoluteComplement; var elesfn$7 = { isNode: function isNode() { return this.group() === 'nodes'; }, isEdge: function isEdge() { return this.group() === 'edges'; }, isLoop: function isLoop() { return this.isEdge() && this.source()[0] === this.target()[0]; }, isSimple: function isSimple() { return this.isEdge() && this.source()[0] !== this.target()[0]; }, group: function group() { var ele = this[0]; if (ele) { return ele._private.group; } } }; /** * Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges), * and z-index (low to high). These styles affect how this applies: * * z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the * same depth as the root of the compound graph, followed by the default value `auto` which draws in order from * root to leaves of the compound graph. The last drawn is `top`. * z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes. * `manual` ignores this convention and draws based on the `z-index` value setting. * 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' 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' 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) return a.poolIndex() - b.poolIndex(); }; 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 } } return this; }, 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() { return this.length; }, eq: function eq(i) { return this[i] || this.spawn(); }, first: function first() { return this[0] || this.spawn(); }, last: function last() { return this[this.length - 1] || this.spawn(); }, empty: function empty() { return this.length === 0; }, nonempty: function nonempty() { return !this.empty(); }, sort: function sort(sortFn) { if (!fn$6(sortFn)) { return this; } var sorted = this.toArray().sort(sortFn); return this.spawn(sorted); }, sortByZIndex: function sortByZIndex() { return this.sort(zIndexSort); }, zDepth: function zDepth() { var ele = this[0]; if (!ele) { return undefined; } // 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 } return depth; } else { var src = _p.source; var tgt = _p.target; var srcDepth = src.zDepth(); var tgtDepth = tgt.zDepth(); return Math.max(srcDepth, tgtDepth, 0); // depth of deepest parent } } }; 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 if (isIteratorSupported) { elesfn$6[Symbol.iterator] = function () { var _this = this; // eslint-disable-line no-undef var entry = { value: undefined, done: false }; var i = 0; var length = this.length; return _defineProperty$1({ next: function next() { if (i < length) { entry.value = _this[i++]; } else { entry.value = undefined; entry.done = true; } return entry; } }, Symbol.iterator, function () { // eslint-disable-line no-undef return this; }); }; } }; defineSymbolIterator(); var getLayoutDimensionOptions = defaults$g({ nodeDimensionsIncludeLabels: false }); var elesfn$5 = { // Calculates and returns node dimensions { x, y } based on options given layoutDimensions: function layoutDimensions(options) { options = getLayoutDimensionOptions(options); var dims; if (!this.takesUpSpace()) { dims = { w: 0, h: 0 }; } else if (options.nodeDimensionsIncludeLabels) { var bbDim = this.boundingBox(); dims = { w: bbDim.w, h: bbDim.h }; } else { dims = { w: this.outerWidth(), h: this.outerHeight() }; } // 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) layoutPositions: function layoutPositions(layout, options, fn) { var nodes = this.nodes().filter(function (n) { return !n.isParent(); }); var cy = this.cy(); var layoutEles = options.eles; // nodes & edges var getMemoizeKey = function getMemoizeKey(node) { return node.id(); }; var fnMem = memoize$1(fn, getMemoizeKey); // memoized version of position function layout.emit({ type: 'layoutstart', layout: layout }); layout.animations = []; var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) { var center = { x: nodesBb.x1 + nodesBb.w / 2, y: nodesBb.y1 + nodesBb.h / 2 }; var spacingVector = { // scale from center of bounding box (not necessarily 0,0) x: (pos.x - center.x) * spacing, y: (pos.y - center.y) * spacing }; return { x: center.x + spacingVector.x, 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$1(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, duration: options.animationDuration, easing: options.animationEasing }); layout.animations.push(ani); } else { node.position(newPos); } } if (options.fit) { var fitAni = cy.animation({ fit: { boundingBox: layoutEles.boundingBoxAt(getFinalPos), padding: options.padding }, duration: options.animationDuration, easing: options.animationEasing }); layout.animations.push(fitAni); } else if (options.zoom !== undefined && options.pan !== undefined) { var zoomPanAni = cy.animation({ zoom: options.zoom, pan: options.pan, duration: options.animationDuration, easing: options.animationEasing }); layout.animations.push(zoomPanAni); } layout.animations.forEach(function (ani) { return ani.play(); }); layout.one('layoutready', options.ready); layout.emit({ type: 'layoutready', layout: layout }); Promise$1.all(layout.animations.map(function (ani) { return ani.promise(); })).then(function () { layout.one('layoutstop', options.stop); layout.emit({ type: 'layoutstop', layout: layout }); }); } 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', layout: layout }); layout.one('layoutstop', options.stop); layout.emit({ type: 'layoutstop', layout: layout }); } return this; // chaining }, layout: function layout(options) { var cy = this.cy(); return cy.makeLayout(extend({}, options, { eles: this })); } }; // 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 { val = cache[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()); eles.merge(eles.connectedEdges()); eles.forEach(dirty); } else { this.forEach(function (ele) { dirty(ele); 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); return this; // chaining and exit early when batching } 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 ); var changedEles = updatedEles; if (notifyRenderer) { changedEles.emitAndNotify('style'); // let renderer know we changed style } else { changedEles.emit('style'); // just fire the event } updatedEles.forEach(function (ele) { return ele._private.styleDirty = true; }); 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; cy.style().apply(ele); } } }, // get the internal parsed style object for the specified property parsedStyle: function parsedStyle(property) { 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) { return cy.style().getDefaultProperty(property); } else { return null; } } }, 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; } }, numericStyleUnits: function numericStyleUnits(property) { var ele = this[0]; if (!ele.cy().styleEnabled()) { return; } if (ele) { return ele.pstyle(property).units; } }, // get the specified css property as a rendered value (i.e. on-screen value) // 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); } }, // 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; style.applyBypass(this, props, updateTransitions); this.emitAndNotify('style'); // let the renderer know we've updated style } else if (string(name)) { if (value === undefined) { // then get the property from the style var ele = this[0]; if (ele) { return style.getStylePropertyValue(ele, name); } else { // empty collection => can't get any value return; } } else { // then set the bypass with the property value style.applyBypass(this, name, value, updateTransitions); this.emitAndNotify('style'); // let the renderer know we've updated style } } else if (name === undefined) { var _ele = this[0]; if (_ele) { return style.getRawStyle(_ele); } else { // empty collection => can't get any value 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]; style.removeAllBypasses(ele, updateTransitions); } } 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]; var opacity = parent.pstyle('opacity').value; 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; } else { return ele.effectiveOpacity() === 0; } } }, 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 { var src = _p.source; var tgt = _p.target; return edgeOkViaNode(src) && (!hasCompoundNodes || checkCompound(src, edgeOkViaNode)) && (src === tgt || edgeOkViaNode(tgt) && (!hasCompoundNodes || checkCompound(tgt, edgeOkViaNode))); } } }; } var eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) { return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true); }); elesfn$4.takesUpSpace = cachePrototypeStyleFunction('takesUpSpace', defineDerivedStateFunction({ ok: eleTakesUpSpace })); var eleInteractive = cacheStyleFunction('eleInteractive', function (ele) { return ele.pstyle('events').value === 'yes' && ele.pstyle('visibility').value === 'visible' && eleTakesUpSpace(ele); }); var parentInteractive = cacheStyleFunction('parentInteractive', function (parent) { return parent.pstyle('visibility').value === 'visible' && eleTakesUpSpace(parent); }); elesfn$4.interactive = cachePrototypeStyleFunction('interactive', defineDerivedStateFunction({ ok: eleInteractive, 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); }); var edgeVisibleViaNode = eleTakesUpSpace; elesfn$4.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunction({ 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; elesfn$4.renderedCss = elesfn$4.renderedStyle; 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 ) if (args.length === 2) { var data = args[0]; var handler = args[1]; this.on(params.event, data, 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. (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, ableField: params.ableField, overrideAble: params.overrideAble, value: true }); elesfn$3[params.off] = defineSwitchFunction({ event: params.off, field: params.field, ableField: params.ableField, overrideAble: params.overrideAble, value: false }); } defineSwitchSet({ field: 'locked', overrideField: function overrideField(ele) { return ele.cy().autolock() ? true : undefined; }, on: 'lock', off: 'unlock' }); defineSwitchSet({ field: 'grabbable', overrideField: function overrideField(ele) { return ele.cy().autoungrabify() || ele.pannable() ? false : undefined; }, on: 'grabify', off: 'ungrabify' }); defineSwitchSet({ field: 'selected', ableField: 'selectable', overrideAble: function overrideAble(ele) { return ele.cy().autounselectify() ? false : undefined; }, on: 'select', off: 'unselect' }); defineSwitchSet({ field: 'selectable', overrideField: function overrideField(ele) { return ele.cy().autounselectify() ? false : undefined; }, on: 'selectify', 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', off: 'unactivate' }); defineSwitchSet({ field: 'pannable', on: 'panify', off: 'unpanify' }); elesfn$3.inactive = function () { var ele = this[0]; if (ele) { return !ele._private.active; } }; 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); } else if (params.incoming && tgt === ele) { oEles.push(edge); oEles.push(src); } } } 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({ noIncomingEdges: true }), // get the leaf nodes in the DAG leaves: defineDagExtremity({ noOutgoingEdges: true }), // normally called children in graph theory // these nodes =edges=> outgoing nodes outgoers: cache(defineDagOneHop({ outgoing: true }), 'outgoers'), // aka DAG descendants successors: defineDagAllHops({ outgoing: true }), // normally called parents in graph theory // these nodes <=edges= incoming nodes incomers: cache(defineDagOneHop({ incoming: true }), 'incomers'), // aka DAG ancestors predecessors: defineDagAllHops({ incoming: true }) }); // 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 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 if (otherNode.length > 0) { elements.push(otherNode[0]); // add node 1 hop away } // add connected edge elements.push(edge[0]); } } return this.spawn(elements, true).filter(selector); }, 'neighborhood'), closedNeighborhood: function closedNeighborhood(selector) { return this.neighborhood().add(this).filter(selector); }, openNeighborhood: function openNeighborhood(selector) { return this.neighborhood(selector); } }); // aliases elesfn$2.neighbourhood = elesfn$2.neighborhood; elesfn$2.closedNeighbourhood = elesfn$2.closedNeighborhood; 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({ attr: 'source' }), targets: defineSourceFunction({ 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 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'), codirectedEdges: cache(defineParallelEdgesFunction({ codirected: true }), 'codirectedEdges') }); function defineParallelEdgesFunction(params) { var defaults = { codirected: false }; params = extend({}, defaults, params); return function parallelEdgesImpl(selector) { // micro-optimised for renderer var elements = []; var edges = this.edges(); 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 for (var j = 0; j < srcEdges1.length; j++) { var edge2 = srcEdges1[j]; var edge2data = edge2._private.data; var tgtid2 = edge2data.target; 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 ///////////////// extend(elesfn$2, { components: function components(root) { var self = this; var cy = self.cy(); 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 } var visitInComponent = function visitInComponent(node, component) { visited.merge(node); 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(); components.push(cmpt); var root = unvisited[0]; visitInComponent(root, cmpt); self.bfs({ directed: false, roots: root, visit: function visit(v) { return visitInComponent(v, cmpt); } }); cmpt.forEach(function (node) { node.connectedEdges().forEach(function (e) { // connectedEdges() usually cached if (self.has(e) && cmpt.has(e.source()) && cmpt.has(e.target())) { // has() is cheap cmpt.merge(e); // forEach() only considers nodes -- sets N at call time } }); }); }; do { _loop(); } while (unvisited.length > 0); return components; }, component: function component() { var ele = this[0]; return ele.cy().mutableElements().components(ele)[0]; } }); 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$2(); 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 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; // 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)) { continue; // can't create element if prior id already exists } var ele = new Element(cy, json, false); 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, { index: this.length, 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$2(); var eles = this.eles; for (var _i2 = 0; _i2 < eles.length; _i2++) { var _ele = eles[_i2]; m.set(_ele.id(), { index: _i2, ele: _ele }); } } }; if (unique) { this._private.map = map; } // restore the elements if we created them from json if (createdElements && !removed) { this.restore(); } }; // 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; } else { // an element 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(); 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); } } else { // 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 } ele = ele.move({ parent: parent }); } } } if (obj.position) { ele.position(obj.position); } // 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](); } else { ele[falseFnName](); } } }; 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), group: p.group, removed: p.removed, selected: p.selected, selectable: p.selectable, locked: p.locked, grabbable: p.grabbable, pannable: p.pannable, classes: null }; json.classes = ''; var i = 0; p.classes.forEach(function (cls) { return json.classes += i++ === 0 ? cls : ' ' + cls; }); 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(); var clone = new Element(cy, json, false); // NB no restore 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 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 if (ele.isNode()) { // put to front of array if node nodes.push(ele); } else { // put to end of array if edge edges.push(ele); } } elements = nodes.concat(edges); var i; var removeFromElements = function removeFromElements() { elements.splice(i, 1); i--; }; // 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 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 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 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 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 } if (val == null || val === '') { // can't create if source or target is not defined properly error('Can not create edge `' + id + '` with unspecified ' + field); badSourceOrTarget = true; } else if (!cy.hasElementWithId(val)) { // can't create edge if one of its nodes doesn't exist error('Can not create edge `' + id + '` with nonexistant ' + field + ' `' + val + '`'); 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 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 _private.map = new Map$2(); _private.map.set(id, { ele: _ele2, index: 0 }); _private.removed = false; if (addToPool) { cy.addToPool(_ele2); } } // for each element // 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; } else if (parent[0].removed()) { warn('Node added with missing parent, reference to parent removed'); _data4.parent = undefined; node._private.parent = null; } 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 break; } ancestor = ancestor.parent(); } if (!selfAsParent) { // connect with children parent[0]._private.children.push(node); node._private.parent = parent[0]; // 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 _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 }; 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 function addConnectedEdges(node) { var edges = node._private.edges; for (var i = 0; i < edges.length; i++) { add(edges[i]); } } // 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 addConnectedEdges(ele); addChildren(ele); } 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) 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 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]; var children = parent._private.children; var pid = parent.id(); removeFromArray(children, ele); // remove parent => child ref ele._private.parent = null; // remove child => parent ref if (!alteredParents.ids[pid]) { alteredParents.ids[pid] = true; 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(); } } } 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 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 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 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); }); var corefn$9 = { add: function add(opts) { var 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 else if (array(opts)) { var _jsons = opts; elements = new Collection(cy, _jsons); } // 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 else { var _json = opts; elements = new Element(cy, _json).collection(); } return elements; }, remove: function remove(collection) { if (elementOrCollection(collection)) ; else if (string(collection)) { var selector = collection; collection = this.$(selector); } return collection.remove(); } }; /* global Float32Array */ /*! 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. */ if (arguments.length !== 4) { return false; } /* 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. */ 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; 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; 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); if (initialSlope >= NEWTON_MIN_SLOPE) { return newtonRaphsonIterate(aX, guessForT); } else if (initialSlope === 0.0) { return guessForT; } else { 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, y: mY1 }, { x: mX2, 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, v: initialState.v + derivative.dv * dt, tension: initialState.tension, friction: initialState.friction }; return { dx: state.v, 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); 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; 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. */ 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]; }; }; }(); var cubicBezier = function cubicBezier(t1, p1, t2, p2) { var bezier = generateCubicBezier(t1, p1, t2, p2); return function (start, end, percent) { return start + (end - start) * bezier(percent); }; }; var easings = { 'linear': function linear(start, end, percent) { return start + (end - start) * percent; }, // default easings 'ease': cubicBezier(0.25, 0.1, 0.25, 1), 'ease-in': cubicBezier(0.42, 0, 1, 1), 'ease-out': cubicBezier(0, 0, 0.58, 1), 'ease-in-out': cubicBezier(0.42, 0, 0.58, 1), // sine 'ease-in-sine': cubicBezier(0.47, 0, 0.745, 0.715), 'ease-out-sine': cubicBezier(0.39, 0.575, 0.565, 1), 'ease-in-out-sine': cubicBezier(0.445, 0.05, 0.55, 0.95), // quad 'ease-in-quad': cubicBezier(0.55, 0.085, 0.68, 0.53), 'ease-out-quad': cubicBezier(0.25, 0.46, 0.45, 0.94), 'ease-in-out-quad': cubicBezier(0.455, 0.03, 0.515, 0.955), // cubic 'ease-in-cubic': cubicBezier(0.55, 0.055, 0.675, 0.19), 'ease-out-cubic': cubicBezier(0.215, 0.61, 0.355, 1), 'ease-in-out-cubic': cubicBezier(0.645, 0.045, 0.355, 1), // quart 'ease-in-quart': cubicBezier(0.895, 0.03, 0.685, 0.22), 'ease-out-quart': cubicBezier(0.165, 0.84, 0.44, 1), 'ease-in-out-quart': cubicBezier(0.77, 0, 0.175, 1), // quint 'ease-in-quint': cubicBezier(0.755, 0.05, 0.855, 0.06), 'ease-out-quint': cubicBezier(0.23, 1, 0.32, 1), 'ease-in-out-quint': cubicBezier(0.86, 0, 0.07, 1), // expo 'ease-in-expo': cubicBezier(0.95, 0.05, 0.795, 0.035), 'ease-out-expo': cubicBezier(0.19, 1, 0.22, 1), 'ease-in-out-expo': cubicBezier(1, 0, 0, 1), // circ 'ease-in-circ': cubicBezier(0.6, 0.04, 0.98, 0.335), '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 return easings.linear; // duration 0 => jump to end so impl doesn't matter } var spring = generateSpringRK4(tension, friction, duration); return function (start, end, percent) { return start + (end - start) * spring(percent); }; }, 'cubic-bezier': cubicBezier }; 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 !== '%')) { return prop.pfValue; } else { return prop.value; } } else { 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); } else { easedArr.push(ei); } } return easedArr; } return undefined; } function step$1(self, ani, now, isCore) { var isEles = !isCore; var _p = self._private; var ani_p = ani._private; var pEasing = ani_p.easing; var startTime = ani_p.startTime; var cy = isCore ? self : self.cy(); var style = cy.style(); if (!ani_p.easingImpl) { if (pEasing == null) { // use default ani_p.easingImpl = easings['linear']; } else { // then define w/ name var easingVals; if (string(pEasing)) { var easingProp = style.parse('transition-timing-function', pEasing); easingVals = easingProp.value; } else { // then assume preparsed array easingVals = pEasing; } var name, args; if (string(easingVals)) { name = easingVals; args = []; } else { name = easingVals[1]; args = easingVals.slice(2).map(function (n) { return +n; }); } if (args.length > 0) { // create with args if (name === 'spring') { args.push(ani_p.duration); // need duration to generate spring } ani_p.easingImpl = easings[name].apply(null, args); } else { // static impl by name ani_p.easingImpl = easings[name]; } } } 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]; var _name = prop.name; var end = prop; var start = ani_p.startStyle[_name]; var propSpec = style.properties[start.name]; var easedVal = ease(start, end, percent, easing, propSpec); 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; } function startAnimation(self, ani, now, isCore) { var ani_p = ani._private; ani_p.started = true; ani_p.startTime = now - ani_p.progress * ani_p.duration; } 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 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 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; ani_p.playing = false; ani_p.started = false; callbacks(ani_p.frames); continue; } if (!ani_p.playing && !ani_p.applying) { continue; } // 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; ani_p.playing = false; 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 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); // 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 eles.unmerge(doneEles); cy.emit('step'); } // stepAll var corefn$8 = { // pull in animation functions animate: define.animate(), animation: define.animation(), animated: define.animated(), clearQueue: define.clearQueue(), delay: define.delay(), delayAnimation: define.delayAnimation(), 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() { this._private.animationsRunning = false; }, 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) { stepAll(now, cy); }, renderer.beforeRenderPriorities.animations); } else { // manage the animation loop ourselves headlessStep(); // first call } } }; var emitterOptions = { qualifierCompare: function qualifierCompare(selector1, selector2) { if (selector1 == null || selector2 == null) { return selector1 == null && selector2 == null; } else { return selector1.sameText(selector2); } }, 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) { evt.cy = cy; evt.target = cy; }, callbackContext: function callbackContext(cy, listener, eventObj) { return listener.qualifier != null ? eventObj.target : cy; } }; var argSelector = function argSelector(arg) { if (string(arg)) { return new Selector(arg); } else { 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() { return this._private.emitter; }, on: function on(events, selector, callback) { this.emitter().on(events, argSelector(selector), callback); return this; }, removeListener: function removeListener(events, selector, callback) { this.emitter().removeListener(events, argSelector(selector), callback); return this; }, removeAllListeners: function removeAllListeners() { this.emitter().removeAllListeners(); return this; }, one: function one(events, selector, callback) { this.emitter().one(events, argSelector(selector), callback); return this; }, once: function once(events, selector, callback) { this.emitter().one(events, argSelector(selector), callback); return this; }, emit: function emit(events, extraParams) { this.emitter().emit(events, extraParams); return this; }, emitAndNotify: function emitAndNotify(event, eles) { this.emit(event); this.notify(event, eles); return this; } }; define.eventAliasesOn(elesfn); var corefn$7 = { png: function png(options) { var renderer = this._private.renderer; options = options || {}; return renderer.png(options); }, jpg: function jpg(options) { var renderer = this._private.renderer; options = options || {}; options.bg = options.bg || '#fff'; return renderer.jpg(options); } }; 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 })); return layout; } }; 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 } if (!_p.notificationsEnabled) { return; } // exit on disabled var renderer = this.renderer(); // 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) { this.notifications(false); callback(); this.notifications(true); }, batching: function batching() { return this._private.batchCount > 0; }, 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(); // 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 { renderer.notify(eventName, eles); } }); } return this; }, batch: function batch(callback) { this.startBatch(); callback(); this.endBatch(); return this; }, // for backwards compatibility batchData: function batchData(map) { 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]; var ele = cy.getElementById(id); ele.data(data); } }); } }; var rendererDefaults = defaults$g({ hideEdgesOnViewport: false, textureOnViewport: false, motionBlur: false, motionBlurOpacity: 0.05, pixelRatio: undefined, desktopTapThreshold: 4, touchTapThreshold: 8, wheelSensitivity: 1, debug: false, showFps: false }); var corefn$4 = { renderTo: function renderTo(context, zoom, pan, pxRatio) { var r = this._private.renderer; r.renderTo(context, zoom, pan, pxRatio); return this; }, renderer: function renderer() { return this._private.renderer; }, forceRender: function forceRender() { this.notify('draw'); return this; }, resize: function resize() { this.invalidateSize(); this.emitAndNotify('resize'); return this; }, 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); this.notify('init'); }, destroyRenderer: function destroyRenderer() { var cy = this; 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 = {}; _p.rstyle = {}; _p.animation.current = []; _p.animation.queue = []; }); }, onRender: function onRender(fn) { return this.on('render', fn); }, offRender: function offRender(fn) { return this.off('render', fn); } }; corefn$4.invalidateDimensions = corefn$4.resize; var corefn$3 = { // get a collection // - empty collection on no args // - collection of elements in the graph on selector arg // - guarantee a returned collection when elements or collection specified collection: function collection(eles, opts) { if (string(eles)) { return this.$(eles); } else if (elementOrCollection(eles)) { return eles.collection(); } else if (array(eles)) { 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 { return eles.spawnSelf(); } }, mutableElements: function mutableElements() { return this._private.elements; } }; // aliases corefn$3.elements = corefn$3.filter = corefn$3.$; var styfn$8 = {}; // keys for style blocks, e.g. ttfftt var TRUE = 't'; 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) { props = cxt.properties; // need to check them all } else if (cxtHasMappedProps) { props = cxt.mappedProperties; // only need to check mapped } 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 // (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) { addedProp[name] = true; 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 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' if (contextSelectorMatches) { cxtKey += TRUE; } else { cxtKey += FALSE; } } // for context diffProps = self.getPropertiesDiff(prevKey, cxtKey); ele._private.styleCxtKey = cxtKey; return { key: cxtKey, diffPropNames: diffProps, empty: diffProps.length === 0 }; }; // 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 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) { continue; // no existing prop means nothing needs to be removed // nb affects initial application on mapped values like control-point-distances } else if (eleProp.bypass) { cxtProp = { name: diffPropName, deleteBypassed: true }; } else { cxtProp = { name: diffPropName, "delete": true }; } } // 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 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 && eleProp.mapping.value === cxtProp.value // the current prop on the ele is a flat prop value for the function mapper ) { // 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'; // 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 // - 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 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) 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 // 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]); // label dims // var sk = _p.styleKeys; _p.labelDimsKey = combineHashesArray(sk.labelDimensions); 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); _p.sourceLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, sourceLabelKeys)); var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions); _p.targetLabelKey = combineHashesArray(targetLabelKeys); _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys)); } // node // if (isNode) { var _p$styleKeys = _p.styleKeys, nodeBody = _p$styleKeys.nodeBody, nodeBorder = _p$styleKeys.nodeBorder, nodeOutline = _p$styleKeys.nodeOutline, backgroundImage = _p$styleKeys.backgroundImage, compound = _p$styleKeys.compound, pie = _p$styleKeys.pie; var nodeKeys = [nodeBody, nodeBorder, nodeOutline, 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 = ''; _p.styleKeys = {}; _p.styleKey = null; _p.labelKey = null; _p.labelStyleKey = null; _p.sourceLabelKey = null; _p.sourceLabelStyleKey = null; _p.targetLabelKey = null; _p.targetLabelStyleKey = null; _p.nodeKey = null; _p.hasPie = null; }; // apply a property to the style (for internal use) // returns whether application was successful // // now, this function flattens the property, and here's how: // // for parsedProp:{ bypass: true, deleteBypass: true } // no property is generated, instead the bypass property in the // element's style is replaced by what's pointed to by the `bypassed` // field in the bypass property (i.e. restoring the property the // bypass was overriding) // // for parsedProp:{ mapped: truthy } // the generated flattenedProp:{ mapping: prop } // // for parsedProp:{ bypass: true } // the generated flattenedProp:{ bypassed: parsedProp } styfn$8.applyParsedProperty = function (ele, parsedProp) { var self = this; var prop = parsedProp; var style = ele._private.style; var flatProp; var types = self.types; var type = self.properties[prop.name].type; var propIsBypass = prop.bypass; var origProp = style[prop.name]; var origPropIsBypass = origProp && origProp.bypass; var _p = ele._private; var flatPropMapping = 'mapping'; var getVal = function getVal(p) { if (p == null) { return null; } else if (p.pfValue != null) { return p.pfValue; } else { return p.value; } }; var checkTriggers = function checkTriggers() { var fromVal = getVal(origProp); var toVal = getVal(prop); self.checkTriggers(ele, prop.name, fromVal, toVal); }; // 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) { checkTriggers(); return true; // can't delete if no prop } else if (origProp.bypass) { // delete bypassed origProp.bypassed = undefined; checkTriggers(); return true; } else { return false; // we're unsuccessful deleting the bypassed } } // 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) { checkTriggers(); return true; // property is already not defined } else if (origProp.bypass) { // then replace the bypass property with the original // because the bypassed property was already applied (and therefore parsed), we can just replace it (no reapplying necessary) style[prop.name] = origProp.bypassed; checkTriggers(); return true; } else { return false; // we're unsuccessful deleting the bypass } } 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 switch (prop.mapped) { // flatten the property if mapped case types.mapData: { // 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 if (percent < 0) { percent = 0; } else if (percent > 1) { percent = 1; } if (type.color) { var r1 = prop.valueMin[0]; var r2 = prop.valueMax[0]; var g1 = prop.valueMin[1]; var g2 = prop.valueMax[1]; var b1 = prop.valueMin[2]; var b2 = prop.valueMax[2]; var a1 = prop.valueMin[3] == null ? 1 : prop.valueMin[3]; var a2 = prop.valueMax[3] == null ? 1 : prop.valueMax[3]; var clr = [Math.round(r1 + (r2 - r1) * percent), Math.round(g1 + (g2 - g1) * percent), Math.round(b1 + (b2 - b1) * percent), Math.round(a1 + (a2 - a1) * percent)]; flatProp = { // colours are simple, so just create the flat property instead of expensive string parsing bypass: prop.bypass, // we're a bypass if the mapping property is a bypass name: prop.name, value: clr, strValue: 'rgb(' + clr[0] + ', ' + clr[1] + ', ' + clr[2] + ')' }; } else if (type.number) { var calcValue = prop.valueMin + (prop.valueMax - prop.valueMin) * percent; flatProp = this.parse(prop.name, calcValue, prop.bypass, flatPropMapping); } else { return false; // can only map to colours and numbers } if (!flatProp) { // if we can't flatten the property, then don't apply the property 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; } // 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 default: return false; // not a valid mapping } // 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 prop.bypassed = origProp.bypassed; // steal bypassed prop from old bypass } else { // then link the orig prop to the new bypass prop.bypassed = origProp; } style[prop.name] = prop; // and set } else { // prop is not bypass if (origPropIsBypass) { // then keep the orig prop (since it's a bypass) and link to the new prop origProp.bypassed = prop; } else { // then just replace the old prop with the new one 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; } else { style[propName] = null; } } } } } }; // 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 } } 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 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; var diff = false; var initVal = void 0; var initDt = 0.000001; // delta time % value for initVal (allows animating out of init zero opacity) if (!fromProp) { continue; } // 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; // 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; // 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 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 if (!anyPrev) { return; } _p.transitioning = true; new Promise$1(function (resolve) { if (delay > 0) { ele.delayAnimation(delay).play().promise().then(resolve); } else { resolve(); } }).then(function () { return ele.animation({ style: style, duration: duration, easing: ele.pstyle('transition-timing-function').value, queue: false }).play().promise(); }).then(function () { // if( !isBypass ){ self.removeBypasses(ele, props); ele.emitAndNotify('style'); // } _p.transitioning = false; }); } else if (_p.transitioning) { this.removeBypasses(ele, props); ele.emitAndNotify('style'); _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 if ( // only for beziers -- so performance of other edges isn't affected prop.triggersBoundsOfParallelBeziers && name === 'curve-style' && (fromValue === 'bezier' || toValue === 'bezier')) { ele.parallelEdges().forEach(function (pllEdge) { if (pllEdge.isBundledBezier()) { pllEdge.dirtyBoundingBoxCache(); } }); } if (prop.triggersBoundsOfConnectedEdges && name === 'display' && (fromValue === 'none' || toValue === 'none')) { ele.connectedEdges().forEach(function (edge) { edge.dirtyBoundingBoxCache(); }); } }); }; 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 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 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); } } } } else if (string(name)) { // then parse the single property var _parsedProp = this.parse(name, value, true); if (_parsedProp) { props.push(_parsedProp); } } else if (plainObject(name)) { // then parse each property 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); } } } } else { // can't do anything without well defined properties return false; } // we've failed if there are no valid properties if (props.length === 0) { return false; } // 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 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]; var type = this.properties[name].type; 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) { prop.strValue = value.join(' '); } 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 }; this.applyParsedProperty(ele, parsedProp); 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 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 styfn$6.containerCss = function (propName) { var cy = this._private.cy; var domElement = cy.container(); 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 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 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; 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) { return getValueStringWithUnits(v, units[i]); }).join(' '); } else { return getValueStringWithUnits(value, units); } } else { if (isArrayValue) { return value.map(function (v) { return string(v) ? v : '' + getRenderedValue(v); }).join(' '); } else { return '' + getRenderedValue(value); } } } else if (strValue != null) { 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)) { styleProp = this.parse(name, styleProp.strValue); } else { 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) { hash[0] = hashInt(chVal, hash[0]); 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]); hash[1] = hashIntAlt(chVal, hash[1]); } } } 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; var props = context.style || context.css; var names = Object.keys(props); style.selector(selector); // apply selector for (var j = 0; j < names.length; j++) { var name = names[j]; var value = props[name]; style.css(name, value); // apply property } } return style; }; // 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 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 remaining = remaining.replace(/[/][*](\s|.)+?[*][/]/g, ''); function removeSelAndBlockFromRemaining() { // remove the parsed selector and block from the remaining text to parse if (remaining.length > selAndBlockStr.length) { remaining = remaining.substr(selAndBlockStr.length); } else { remaining = ''; } } function removePropAndValFromRem() { // remove the parsed property and value from the remaining block text to parse if (blockRem.length > propAndValStr.length) { blockRem = blockRem.substr(propAndValStr.length); } else { 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]; // 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 removeSelAndBlockFromRemaining(); continue; } } // 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 removePropAndValFromRem(); continue; } var parsedProp = style.parse(propStr, valStr); if (!parsedProp) { 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 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(); style.appendFromString(string); return style; }; 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)$', '^(.+)$']; // each visual style property has a type and needs to be validated according to it styfn$2.types = { time: { number: true, min: 0, units: 's|ms', implicitUnits: 'ms' }, percent: { number: true, min: 0, max: 100, units: '%', implicitUnits: '%' }, percentages: { number: true, min: 0, max: 100, units: '%', implicitUnits: '%', multiple: true }, zeroOneNumber: { number: true, min: 0, max: 1, unitless: true }, zeroOneNumbers: { number: true, min: 0, max: 1, unitless: true, multiple: true }, nOneOneNumber: { number: true, min: -1, max: 1, unitless: true }, nonNegativeInt: { number: true, min: 0, integer: true, unitless: true }, nonNegativeNumber: { number: true, min: 0, unitless: true }, position: { enums: ['parent', 'origin'] }, nodeSize: { number: true, min: 0, enums: ['label'] }, number: { number: true, unitless: true }, numbers: { number: true, unitless: true, multiple: true }, positiveNumber: { number: true, unitless: true, min: 0, strictMin: true }, size: { number: true, min: 0 }, bidirectionalSize: { number: true }, // allows negative bidirectionalSizeMaybePercent: { number: true, allowPercent: true }, // allows negative bidirectionalSizes: { number: true, multiple: true }, // allows negative sizeMaybePercent: { number: true, min: 0, allowPercent: true }, axisDirection: { enums: ['horizontal', 'leftward', 'rightward', 'vertical', 'upward', 'downward', 'auto'] }, paddingRelativeTo: { enums: ['width', 'height', 'average', 'min', 'max'] }, bgWH: { number: true, min: 0, allowPercent: true, enums: ['auto'], multiple: true }, bgPos: { number: true, allowPercent: true, multiple: true }, bgRelativeTo: { enums: ['inner', 'include-padding'], multiple: true }, bgRepeat: { enums: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'], multiple: true }, bgFit: { enums: ['none', 'contain', 'cover'], multiple: true }, bgCrossOrigin: { enums: ['anonymous', 'use-credentials', 'null'], multiple: true }, bgClip: { enums: ['none', 'node'], multiple: true }, bgContainment: { enums: ['inside', 'over'], multiple: true }, color: { color: true }, colors: { color: true, multiple: true }, fill: { enums: ['solid', 'linear-gradient', 'radial-gradient'] }, bool: { enums: ['yes', 'no'] }, bools: { enums: ['yes', 'no'], multiple: true }, lineStyle: { enums: ['solid', 'dotted', 'dashed'] }, lineCap: { enums: ['butt', 'round', 'square'] }, linePosition: { enums: ['center', 'inside', 'outside'] }, lineJoin: { enums: ['round', 'bevel', 'miter'] }, borderStyle: { enums: ['solid', 'dotted', 'dashed', 'double'] }, curveStyle: { enums: ['bezier', 'unbundled-bezier', 'haystack', 'segments', 'straight', 'straight-triangle', 'taxi', 'round-segments', 'round-taxi'] }, radiusType: { enums: ['arc-radius', 'influence-radius'], multiple: true }, fontFamily: { regex: '^([\\w- \\"]+(?:\\s*,\\s*[\\w- \\"]+)*)$' }, fontStyle: { enums: ['italic', 'normal', 'oblique'] }, fontWeight: { enums: ['normal', 'bold', 'bolder', 'lighter', '100', '200', '300', '400', '500', '600', '800', '900', 100, 200, 300, 400, 500, 600, 700, 800, 900] }, textDecoration: { enums: ['none', 'underline', 'overline', 'line-through'] }, textTransform: { enums: ['none', 'uppercase', 'lowercase'] }, textWrap: { enums: ['none', 'wrap', 'ellipsis'] }, textOverflowWrap: { enums: ['whitespace', 'anywhere'] }, textBackgroundShape: { enums: ['rectangle', 'roundrectangle', 'round-rectangle'] }, nodeShape: { enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'cutrectangle', 'cut-rectangle', 'bottomroundrectangle', 'bottom-round-rectangle', 'barrel', 'ellipse', 'triangle', 'round-triangle', 'square', 'pentagon', 'round-pentagon', 'hexagon', 'round-hexagon', 'concavehexagon', 'concave-hexagon', 'heptagon', 'round-heptagon', 'octagon', 'round-octagon', 'tag', 'round-tag', 'star', 'diamond', 'round-diamond', 'vee', 'rhomboid', 'right-rhomboid', 'polygon'] }, overlayShape: { enums: ['roundrectangle', 'round-rectangle', 'ellipse'] }, cornerRadius: { number: true, min: 0, units: 'px|em', implicitUnits: 'px', enums: ['auto'] }, compoundIncludeLabels: { enums: ['include', 'exclude'] }, arrowShape: { enums: ['tee', 'triangle', 'triangle-tee', 'circle-triangle', 'triangle-cross', 'triangle-backcurve', 'vee', 'square', 'circle', 'diamond', 'chevron', 'none'] }, arrowFill: { enums: ['filled', 'hollow'] }, arrowWidth: { number: true, units: '%|px|em', implicitUnits: 'px', enums: ['match-line'] }, display: { enums: ['element', 'none'] }, visibility: { enums: ['hidden', 'visible'] }, zCompoundDepth: { enums: ['bottom', 'orphan', 'auto', 'top'] }, zIndexCompare: { enums: ['auto', 'manual'] }, valign: { enums: ['top', 'center', 'bottom'] }, halign: { enums: ['left', 'center', 'right'] }, justification: { enums: ['left', 'center', 'right', 'auto'] }, text: { string: true }, data: { mapping: true, regex: data('data') }, layoutData: { mapping: true, regex: data('layoutData') }, scratch: { mapping: true, regex: data('scratch') }, mapData: { mapping: true, regex: mapData('mapData') }, mapLayoutData: { mapping: true, regex: mapData('mapLayoutData') }, mapScratch: { mapping: true, regex: mapData('mapScratch') }, fn: { mapping: true, fn: true }, url: { regexes: urlRegexes, singleRegexMatchValue: true }, urls: { regexes: urlRegexes, singleRegexMatchValue: true, multiple: true }, propList: { propList: true }, angle: { number: true, units: 'deg|rad', implicitUnits: 'rad' }, textRotation: { number: true, units: 'deg|rad', implicitUnits: 'rad', enums: ['none', 'autorotate'] }, polygonPointList: { number: true, multiple: true, evenMultiple: true, min: -1, max: 1, unitless: true }, edgeDistances: { enums: ['intersection', 'node-position', 'endpoints'] }, edgeEndpoint: { number: true, multiple: true, units: '%|px|em|deg|rad', implicitUnits: 'px', enums: ['inside-to-node', 'outside-to-node', 'outside-to-node-or-label', 'outside-to-line', 'outside-to-line-or-label'], singleEnum: true, validate: function validate(valArr, unitsArr) { switch (valArr.length) { 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; } } }, easing: { regexes: ['^(spring)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$', '^(cubic-bezier)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$'], enums: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine', 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad', 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic', 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart', 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint', 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo', 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ'] }, gradientDirection: { 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, min: 0, validate: function validate(valArr) { var length = valArr.length; return length === 1 || length === 2 || length === 4; } } }; var diff = { zeroNonZero: function zeroNonZero(val1, val2) { 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) { return true; } else { return false; } }, any: function any(val1, val2) { return val1 != val2; }, emptyNonEmpty: function emptyNonEmpty(str1, str2) { var empty1 = emptyString(str1); var empty2 = emptyString(str2); return empty1 && !empty2 || !empty1 && empty2; } }; // 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 var t = styfn$2.types; var mainLabel = [{ name: 'label', type: t.text, triggersBounds: diff.any, triggersZOrder: diff.emptyNonEmpty }, { name: 'text-rotation', type: t.textRotation, triggersBounds: diff.any }, { name: 'text-margin-x', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'text-margin-y', type: t.bidirectionalSize, triggersBounds: diff.any }]; var sourceLabel = [{ name: 'source-label', type: t.text, triggersBounds: diff.any }, { name: 'source-text-rotation', type: t.textRotation, triggersBounds: diff.any }, { name: 'source-text-margin-x', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'source-text-margin-y', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'source-text-offset', type: t.size, triggersBounds: diff.any }]; var targetLabel = [{ name: 'target-label', type: t.text, triggersBounds: diff.any }, { name: 'target-text-rotation', type: t.textRotation, triggersBounds: diff.any }, { name: 'target-text-margin-x', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'target-text-margin-y', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'target-text-offset', type: t.size, triggersBounds: diff.any }]; var labelDimensions = [{ name: 'font-family', type: t.fontFamily, triggersBounds: diff.any }, { name: 'font-style', type: t.fontStyle, triggersBounds: diff.any }, { name: 'font-weight', type: t.fontWeight, triggersBounds: diff.any }, { name: 'font-size', type: t.size, triggersBounds: diff.any }, { name: 'text-transform', type: t.textTransform, triggersBounds: diff.any }, { name: 'text-wrap', type: t.textWrap, triggersBounds: diff.any }, { name: 'text-overflow-wrap', type: t.textOverflowWrap, triggersBounds: diff.any }, { name: 'text-max-width', type: t.size, triggersBounds: diff.any }, { name: 'text-outline-width', type: t.size, triggersBounds: diff.any }, { name: 'line-height', type: t.positiveNumber, triggersBounds: diff.any }]; var commonLabel = [{ name: 'text-valign', type: t.valign, triggersBounds: diff.any }, { name: 'text-halign', type: t.halign, triggersBounds: diff.any }, { name: 'color', type: t.color }, { name: 'text-outline-color', type: t.color }, { name: 'text-outline-opacity', type: t.zeroOneNumber }, { name: 'text-background-color', type: t.color }, { name: 'text-background-opacity', type: t.zeroOneNumber }, { name: 'text-background-padding', type: t.size, triggersBounds: diff.any }, { name: 'text-border-opacity', type: t.zeroOneNumber }, { name: 'text-border-color', type: t.color }, { name: 'text-border-width', type: t.size, triggersBounds: diff.any }, { name: 'text-border-style', type: t.borderStyle, triggersBounds: diff.any }, { name: 'text-background-shape', type: t.textBackgroundShape, triggersBounds: diff.any }, { name: 'text-justification', type: t.justification }]; var behavior = [{ name: 'events', type: t.bool, triggersZOrder: diff.any }, { name: 'text-events', type: t.bool, triggersZOrder: diff.any }]; var visibility = [{ name: 'display', type: t.display, triggersZOrder: diff.any, triggersBounds: diff.any, triggersBoundsOfConnectedEdges: true }, { name: 'visibility', type: t.visibility, triggersZOrder: diff.any }, { name: 'opacity', type: t.zeroOneNumber, triggersZOrder: diff.zeroNonZero }, { name: 'text-opacity', type: t.zeroOneNumber }, { name: 'min-zoomed-font-size', type: t.size }, { name: 'z-compound-depth', type: t.zCompoundDepth, triggersZOrder: diff.any }, { name: 'z-index-compare', type: t.zIndexCompare, triggersZOrder: diff.any }, { name: 'z-index', type: t.number, triggersZOrder: diff.any }]; var overlay = [{ name: 'overlay-padding', type: t.size, triggersBounds: diff.any }, { name: 'overlay-color', type: t.color }, { name: 'overlay-opacity', type: t.zeroOneNumber, triggersBounds: diff.zeroNonZero }, { name: 'overlay-shape', type: t.overlayShape, triggersBounds: diff.any }, { name: 'overlay-corner-radius', type: t.cornerRadius }]; var underlay = [{ name: 'underlay-padding', type: t.size, triggersBounds: diff.any }, { name: 'underlay-color', type: t.color }, { name: 'underlay-opacity', type: t.zeroOneNumber, triggersBounds: diff.zeroNonZero }, { name: 'underlay-shape', type: t.overlayShape, triggersBounds: diff.any }, { name: 'underlay-corner-radius', type: t.cornerRadius }]; var transition = [{ name: 'transition-property', type: t.propList }, { name: 'transition-duration', type: t.time }, { name: 'transition-delay', type: t.time }, { 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) } else { return parsedProp.pfValue; } }; var nodeBody = [{ name: 'height', type: t.nodeSize, triggersBounds: diff.any, hashOverride: nodeSizeHashOverride }, { name: 'width', type: t.nodeSize, triggersBounds: diff.any, hashOverride: nodeSizeHashOverride }, { name: 'shape', type: t.nodeShape, triggersBounds: diff.any }, { name: 'shape-polygon-points', type: t.polygonPointList, triggersBounds: diff.any }, { name: 'corner-radius', type: t.cornerRadius }, { name: 'background-color', type: t.color }, { name: 'background-fill', type: t.fill }, { name: 'background-opacity', type: t.zeroOneNumber }, { name: 'background-blacken', type: t.nOneOneNumber }, { name: 'background-gradient-stop-colors', type: t.colors }, { name: 'background-gradient-stop-positions', type: t.percentages }, { name: 'background-gradient-direction', type: t.gradientDirection }, { name: 'padding', type: t.sizeMaybePercent, triggersBounds: diff.any }, { name: 'padding-relative-to', type: t.paddingRelativeTo, triggersBounds: diff.any }, { name: 'bounds-expansion', type: t.boundsExpansion, triggersBounds: diff.any }]; var nodeBorder = [{ name: 'border-color', type: t.color }, { name: 'border-opacity', type: t.zeroOneNumber }, { name: 'border-width', type: t.size, triggersBounds: diff.any }, { name: 'border-style', type: t.borderStyle }, { name: 'border-cap', type: t.lineCap }, { name: 'border-join', type: t.lineJoin }, { name: 'border-dash-pattern', type: t.numbers }, { name: 'border-dash-offset', type: t.number }, { name: 'border-position', type: t.linePosition }]; var nodeOutline = [{ name: 'outline-color', type: t.color }, { name: 'outline-opacity', type: t.zeroOneNumber }, { name: 'outline-width', type: t.size, triggersBounds: diff.any }, { name: 'outline-style', type: t.borderStyle }, { name: 'outline-offset', type: t.size, triggersBounds: diff.any }]; var backgroundImage = [{ name: 'background-image', type: t.urls }, { name: 'background-image-crossorigin', type: t.bgCrossOrigin }, { name: 'background-image-opacity', type: t.zeroOneNumbers }, { name: 'background-image-containment', type: t.bgContainment }, { name: 'background-image-smoothing', type: t.bools }, { name: 'background-position-x', type: t.bgPos }, { name: 'background-position-y', type: t.bgPos }, { name: 'background-width-relative-to', type: t.bgRelativeTo }, { name: 'background-height-relative-to', type: t.bgRelativeTo }, { name: 'background-repeat', type: t.bgRepeat }, { name: 'background-fit', type: t.bgFit }, { name: 'background-clip', type: t.bgClip }, { name: 'background-width', type: t.bgWH }, { name: 'background-height', type: t.bgWH }, { name: 'background-offset-x', type: t.bgPos }, { name: 'background-offset-y', type: t.bgPos }]; var compound = [{ name: 'position', type: t.position, triggersBounds: diff.any }, { name: 'compound-sizing-wrt-labels', type: t.compoundIncludeLabels, triggersBounds: diff.any }, { name: 'min-width', type: t.size, triggersBounds: diff.any }, { name: 'min-width-bias-left', type: t.sizeMaybePercent, triggersBounds: diff.any }, { name: 'min-width-bias-right', type: t.sizeMaybePercent, triggersBounds: diff.any }, { name: 'min-height', type: t.size, triggersBounds: diff.any }, { name: 'min-height-bias-top', type: t.sizeMaybePercent, triggersBounds: diff.any }, { name: 'min-height-bias-bottom', type: t.sizeMaybePercent, triggersBounds: diff.any }]; var edgeLine = [{ name: 'line-style', type: t.lineStyle }, { name: 'line-color', type: t.color }, { name: 'line-fill', type: t.fill }, { name: 'line-cap', type: t.lineCap }, { name: 'line-opacity', type: t.zeroOneNumber }, { name: 'line-dash-pattern', type: t.numbers }, { name: 'line-dash-offset', type: t.number }, { name: 'line-gradient-stop-colors', type: t.colors }, { name: 'line-gradient-stop-positions', type: t.percentages }, { name: 'curve-style', type: t.curveStyle, triggersBounds: diff.any, triggersBoundsOfParallelBeziers: true }, { name: 'haystack-radius', type: t.zeroOneNumber, triggersBounds: diff.any }, { name: 'source-endpoint', type: t.edgeEndpoint, triggersBounds: diff.any }, { name: 'target-endpoint', type: t.edgeEndpoint, triggersBounds: diff.any }, { name: 'control-point-step-size', type: t.size, triggersBounds: diff.any }, { name: 'control-point-distances', type: t.bidirectionalSizes, triggersBounds: diff.any }, { name: 'control-point-weights', type: t.numbers, triggersBounds: diff.any }, { name: 'segment-distances', type: t.bidirectionalSizes, triggersBounds: diff.any }, { name: 'segment-weights', type: t.numbers, triggersBounds: diff.any }, { name: 'segment-radii', type: t.numbers, triggersBounds: diff.any }, { name: 'radius-type', type: t.radiusType, triggersBounds: diff.any }, { name: 'taxi-turn', type: t.bidirectionalSizeMaybePercent, triggersBounds: diff.any }, { name: 'taxi-turn-min-distance', type: t.size, triggersBounds: diff.any }, { name: 'taxi-direction', type: t.axisDirection, triggersBounds: diff.any }, { name: 'taxi-radius', type: t.number, triggersBounds: diff.any }, { name: 'edge-distances', type: t.edgeDistances, triggersBounds: diff.any }, { name: 'arrow-scale', type: t.positiveNumber, triggersBounds: diff.any }, { name: 'loop-direction', type: t.angle, triggersBounds: diff.any }, { name: 'loop-sweep', type: t.angle, triggersBounds: diff.any }, { name: 'source-distance-from-node', type: t.size, triggersBounds: diff.any }, { name: 'target-distance-from-node', type: t.size, triggersBounds: diff.any }]; var ghost = [{ name: 'ghost', type: t.bool, triggersBounds: diff.any }, { name: 'ghost-offset-x', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'ghost-offset-y', type: t.bidirectionalSize, triggersBounds: diff.any }, { name: 'ghost-opacity', type: t.zeroOneNumber }]; var core = [{ name: 'selection-box-color', type: t.color }, { name: 'selection-box-opacity', type: t.zeroOneNumber }, { name: 'selection-box-border-color', type: t.color }, { name: 'selection-box-border-width', type: t.size }, { name: 'active-bg-color', type: t.color }, { name: 'active-bg-opacity', type: t.zeroOneNumber }, { name: 'active-bg-size', type: t.size }, { name: 'outside-texture-bg-color', type: t.color }, { name: 'outside-texture-bg-opacity', type: t.zeroOneNumber }]; // 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', type: t.color }); pie.push({ name: 'pie-' + i + '-background-size', type: t.percent }); pie.push({ name: 'pie-' + i + '-background-opacity', type: t.zeroOneNumber }); } // edge arrows var edgeArrow = []; var arrowPrefixes = styfn$2.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target']; [{ name: 'arrow-shape', type: t.arrowShape, triggersBounds: diff.any }, { name: 'arrow-color', type: t.color }, { name: 'arrow-fill', type: t.arrowFill }, { name: 'arrow-width', type: t.arrowWidth }].forEach(function (prop) { 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, nodeOutline, 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, nodeOutline: nodeOutline, 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: 'segment-distance', pointsTo: 'segment-distances' }, { name: 'segment-weight', pointsTo: 'segment-weights' }, { name: 'segment-radius', pointsTo: 'segment-radii' }, { 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', 'overlay-corner-radius': 'auto', 'underlay-opacity': 0, 'underlay-color': '#000', 'underlay-padding': 10, 'underlay-shape': 'round-rectangle', 'underlay-corner-radius': 'auto', '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', 'border-dash-pattern': [4, 2], 'border-dash-offset': 0, 'border-cap': 'butt', 'border-join': 'miter', 'border-position': 'center', 'outline-color': '#999', 'outline-opacity': 1, 'outline-width': 0, 'outline-offset': 0, 'outline-style': 'solid', 'height': 30, 'width': 30, 'shape': 'ellipse', 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1', 'corner-radius': 'auto', '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, 'segment-radii': 15, 'radius-type': 'arc-radius', 'taxi-turn': '50%', 'taxi-radius': 15, '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' }, { name: 'arrow-width', value: 1 }].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; 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; // 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 !== 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; }, 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 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; // 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); } /** * @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 }; // default layout options 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 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 }; 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 = 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); } } 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(); var cornerRadius = node.pstyle('corner-radius').value === 'auto' ? 'auto' : node.pstyle('corner-radius').pfValue; var rs = node._private.rscratch; 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, cornerRadius, rs)) { 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 if (rs.isRound) { dispX = rs.midVector[1]; dispY = -rs.midVector[0]; } else { var i2 = pts.length / 2 - 1; var i1 = 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 if (!rs.isRound) { 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; }; /** * Explained by Blindman67 at https://stackoverflow.com/a/44856925/11028828 */ // Declare reused variable to avoid reallocating variables every time the function is called var x, y, v1 = {}, v2 = {}, sinA, sinA90, radDirection, drawDirection, angle, halfAngle, cRadius, lenOut, radius, limit; var startX, startY, stopX, stopY; var lastPoint; // convert 2 points into vector form, polar form, and normalised var asVec = function asVec(p, pp, v) { v.x = pp.x - p.x; v.y = pp.y - p.y; v.len = Math.sqrt(v.x * v.x + v.y * v.y); v.nx = v.x / v.len; v.ny = v.y / v.len; v.ang = Math.atan2(v.ny, v.nx); }; var invertVec = function invertVec(originalV, invertedV) { invertedV.x = originalV.x * -1; invertedV.y = originalV.y * -1; invertedV.nx = originalV.nx * -1; invertedV.ny = originalV.ny * -1; invertedV.ang = originalV.ang > 0 ? -(Math.PI - originalV.ang) : Math.PI + originalV.ang; }; var calcCornerArc = function calcCornerArc(previousPoint, currentPoint, nextPoint, radiusMax, isArcRadius) { //----------------------------------------- // Part 1 previousPoint !== lastPoint ? asVec(currentPoint, previousPoint, v1) : invertVec(v2, v1); // Avoid recalculating vec if it is the invert of the last one calculated asVec(currentPoint, nextPoint, v2); sinA = v1.nx * v2.ny - v1.ny * v2.nx; sinA90 = v1.nx * v2.nx - v1.ny * -v2.ny; angle = Math.asin(Math.max(-1, Math.min(1, sinA))); if (Math.abs(angle) < 1e-6) { x = currentPoint.x; y = currentPoint.y; cRadius = radius = 0; return; } //----------------------------------------- radDirection = 1; drawDirection = false; if (sinA90 < 0) { if (angle < 0) { angle = Math.PI + angle; } else { angle = Math.PI - angle; radDirection = -1; drawDirection = true; } } else { if (angle > 0) { radDirection = -1; drawDirection = true; } } if (currentPoint.radius !== undefined) { radius = currentPoint.radius; } else { radius = radiusMax; } //----------------------------------------- // Part 2 halfAngle = angle / 2; //----------------------------------------- limit = Math.min(v1.len / 2, v2.len / 2); if (isArcRadius) { //----------------------------------------- // Part 3 lenOut = Math.abs(Math.cos(halfAngle) * radius / Math.sin(halfAngle)); //----------------------------------------- // Special part A if (lenOut > limit) { lenOut = limit; cRadius = Math.abs(lenOut * Math.sin(halfAngle) / Math.cos(halfAngle)); } else { cRadius = radius; } } else { lenOut = Math.min(limit, radius); cRadius = Math.abs(lenOut * Math.sin(halfAngle) / Math.cos(halfAngle)); } //----------------------------------------- //----------------------------------------- // Part 4 stopX = currentPoint.x + v2.nx * lenOut; stopY = currentPoint.y + v2.ny * lenOut; //----------------------------------------- // Part 5 x = stopX - v2.ny * cRadius * radDirection; y = stopY + v2.nx * cRadius * radDirection; //----------------------------------------- // Additional Part : calculate start point E startX = currentPoint.x + v1.nx * lenOut; startY = currentPoint.y + v1.ny * lenOut; // Save last point to avoid recalculating vector when not needed lastPoint = currentPoint; }; /** * Draw corner provided by {@link getRoundCorner} * * @param ctx :CanvasRenderingContext2D * @param roundCorner {{cx:number, cy:number, radius:number, endAngle: number, startAngle: number, counterClockwise: boolean}} */ function drawPreparedRoundCorner(ctx, roundCorner) { if (roundCorner.radius === 0) ctx.lineTo(roundCorner.cx, roundCorner.cy);else ctx.arc(roundCorner.cx, roundCorner.cy, roundCorner.radius, roundCorner.startAngle, roundCorner.endAngle, roundCorner.counterClockwise); } /** * Get round corner from a point and its previous and next neighbours in a path * * @param previousPoint {{x: number, y:number, radius: number?}} * @param currentPoint {{x: number, y:number, radius: number?}} * @param nextPoint {{x: number, y:number, radius: number?}} * @param radiusMax :number * @param isArcRadius :boolean * @return {{ * cx:number, cy:number, radius:number, * startX:number, startY:number, * stopX:number, stopY: number, * endAngle: number, startAngle: number, counterClockwise: boolean * }} */ function getRoundCorner(previousPoint, currentPoint, nextPoint, radiusMax) { var isArcRadius = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; if (radiusMax === 0 || currentPoint.radius === 0) return { cx: currentPoint.x, cy: currentPoint.y, radius: 0, startX: currentPoint.x, startY: currentPoint.y, stopX: currentPoint.x, stopY: currentPoint.y, startAngle: undefined, endAngle: undefined, counterClockwise: undefined }; calcCornerArc(previousPoint, currentPoint, nextPoint, radiusMax, isArcRadius); return { cx: x, cy: y, radius: cRadius, startX: startX, startY: startY, stopX: stopX, stopY: stopY, startAngle: v1.ang + Math.PI / 2 * radDirection, endAngle: v2.ang - Math.PI / 2 * radDirection, counterClockwise: drawDirection }; } var BRp$c = {}; BRp$c.findMidptPtsEtc = function (edge, pairInfo) { var posPts = pairInfo.posPts, intersectionPts = pairInfo.intersectionPts, vectorNormInverse = pairInfo.vectorNormInverse; var midptPts; // 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 }; }; 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 } 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 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 segmentWs = edge.pstyle('segment-weights'); var segmentDs = edge.pstyle('segment-distances'); var segmentRs = edge.pstyle('segment-radii'); var segmentTs = edge.pstyle('radius-type'); var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length); var lastRadius = segmentRs.pfValue[segmentRs.pfValue.length - 1]; var lastRadiusType = segmentTs.pfValue[segmentTs.pfValue.length - 1]; rs.edgeType = 'segments'; rs.segpts = []; rs.radii = []; rs.isArcRadius = []; 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); rs.radii.push(segmentRs.pfValue[s] !== undefined ? segmentRs.pfValue[s] : lastRadius); rs.isArcRadius.push((segmentTs.pfValue[s] !== undefined ? segmentTs.pfValue[s] : lastRadiusType) === 'arc-radius'); } }; 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 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 _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 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]; } } if (rs.isRound) { var radius = edge.pstyle('taxi-radius').value; var isArcRadius = edge.pstyle('radius-type').value[0] === 'arc-radius'; rs.radii = new Array(rs.segpts.length / 2).fill(radius); rs.isArcRadius = new Array(rs.segpts.length / 2).fill(isArcRadius); } }; 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, srcCornerRadius = pairInfo.srcCornerRadius, tgtCornerRadius = pairInfo.tgtCornerRadius, srcRs = pairInfo.srcRs, tgtRs = pairInfo.tgtRs; 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, srcCornerRadius, srcRs); 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, tgtCornerRadius, tgtRs); 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.isRound) { rs.roundCorners = []; for (var i = 2; i + 3 < rs.allpts.length; i += 2) { var radius = rs.radii[i / 2 - 1]; var isArcRadius = rs.isArcRadius[i / 2 - 1]; rs.roundCorners.push(getRoundCorner({ x: rs.allpts[i - 2], y: rs.allpts[i - 1] }, { x: rs.allpts[i], y: rs.allpts[i + 1], radius: radius }, { x: rs.allpts[i + 2], y: rs.allpts[i + 3] }, radius, isArcRadius)); } } 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; if (!rs.isRound) { rs.midX = rs.segpts[_i]; rs.midY = rs.segpts[_i + 1]; } else { var point = { x: rs.segpts[_i], y: rs.segpts[_i + 1] }; var corner = rs.roundCorners[_i / 2]; var v = [point.x - corner.cx, point.y - corner.cy]; var factor = corner.radius / Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2)); v = v.map(function (c) { return c * factor; }); rs.midX = corner.cx + v[0]; rs.midY = corner.cy + v[1]; rs.midVector = v; } } } }; 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$2(), 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$2(); 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.endsWith('segments') || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle.endsWith('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)]; var srcCornerRadius = pairInfo.srcCornerRadius = src.pstyle('corner-radius').value === 'auto' ? 'auto' : src.pstyle('corner-radius').pfValue; var tgtCornerRadius = pairInfo.tgtCornerRadius = tgt.pstyle('corner-radius').value === 'auto' ? 'auto' : tgt.pstyle('corner-radius').pfValue; var tgtRs = pairInfo.tgtRs = tgt._private.rscratch; var srcRs = pairInfo.srcRs = src._private.rscratch; 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.endsWith('segments') || _curveStyle.endsWith('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, srcCornerRadius, srcRs); 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, tgtCornerRadius, tgtRs); 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, tgtCornerRadius, tgtRs) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y, srcCornerRadius, srcRs); 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; rs.isRound = _curveStyle.startsWith('round'); 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.endsWith('segments')) { _this.findSegmentsPoints(_edge, passedPairInfo); } else if (_curveStyle.endsWith('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(); var rs = node._private.rscratch; 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, node.pstyle('corner-radius').value === 'auto' ? 'auto' : node.pstyle('corner-radius').pfValue, rs); } }; 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 srcRs = source._private.rscratch; var tgtRs = target._private.rscratch; 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 srcCornerRadius = source.pstyle('corner-radius').value === 'auto' ? 'auto' : source.pstyle('corner-radius').pfValue; var tgtManEndpt = edge.pstyle('target-endpoint'); var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value; var tgtCornerRadius = target.pstyle('corner-radius').value === 'auto' ? 'auto' : target.pstyle('corner-radius').pfValue; 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, tgtCornerRadius, tgtRs); 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, srcCornerRadius, srcRs); 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 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; } 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 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; } 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_1(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(containerWindow, '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(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; } // 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(containerWindow, '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(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]; } // 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 = [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]; } }, 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(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(); } }); 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; } 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, 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(); } //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, cornerRadius) { this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) { return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding); }, checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) { 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, cornerRadius) { this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) { return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding); }, checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) { return checkInEllipse(x, y, width, height, centerX, centerY, padding); } }; }; BRp$2.generateRoundPolygon = function (name, points) { return this.nodeShapes[name] = { renderer: this, name: name, points: points, getOrCreateCorners: function getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, field) { if (rs[field] !== undefined && rs[field + '-cx'] === centerX && rs[field + '-cy'] === centerY) { return rs[field]; } rs[field] = new Array(points.length / 2); rs[field + '-cx'] = centerX; rs[field + '-cy'] = centerY; var halfW = width / 2; var halfH = height / 2; cornerRadius = cornerRadius === 'auto' ? getRoundPolygonRadius(width, height) : cornerRadius; var p = new Array(points.length / 2); for (var _i = 0; _i < points.length / 2; _i++) { p[_i] = { x: centerX + halfW * points[_i * 2], y: centerY + halfH * points[_i * 2 + 1] }; } var i, p1, p2, p3, len = p.length; p1 = p[len - 1]; // for each point for (i = 0; i < len; i++) { p2 = p[i % len]; p3 = p[(i + 1) % len]; rs[field][i] = getRoundCorner(p1, p2, p3, cornerRadius); p1 = p2; p2 = p3; } return rs[field]; }, draw: function draw(context, centerX, centerY, width, height, cornerRadius, rs) { this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points, this.getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, 'drawCorners')); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius, rs) { return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height, padding, this.getOrCreateCorners(nodeX, nodeY, width, height, cornerRadius, rs, 'corners')); }, checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius, rs) { return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height, this.getOrCreateCorners(centerX, centerY, width, height, cornerRadius, rs, 'corners')); } }; }; 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, cornerRadius) { this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, this.points, cornerRadius); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) { return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding, cornerRadius); }, checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) { var halfWidth = width / 2; var halfHeight = height / 2; cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(width, height) : cornerRadius; cornerRadius = Math.min(halfWidth, halfHeight, cornerRadius); 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 - halfWidth + cornerRadius, centerY - halfHeight + cornerRadius, padding)) { return true; } // Check top right quarter circle if (checkInEllipse(x, y, diam, diam, centerX + halfWidth - cornerRadius, centerY - halfHeight + cornerRadius, padding)) { return true; } // Check bottom right quarter circle if (checkInEllipse(x, y, diam, diam, centerX + halfWidth - cornerRadius, centerY + halfHeight - cornerRadius, padding)) { return true; } // Check bottom left quarter circle if (checkInEllipse(x, y, diam, diam, centerX - halfWidth + cornerRadius, centerY + halfHeight - 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, cornerRadius) { this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, null, cornerRadius); }, generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY, cornerRadius) { var cl = cornerRadius === 'auto' ? this.cornerLength : cornerRadius; 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, cornerRadius) { var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY, cornerRadius); 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, cornerRadius) { var cl = cornerRadius === 'auto' ? this.cornerLength : cornerRadius; // Check hBox if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * cl, [0, -1], padding)) { return true; } // Check vBox if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * cl, 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, cornerRadius) { this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) { // 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, cornerRadius) { 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, cornerRadius) { this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height, this.points, cornerRadius); }, intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding, cornerRadius) { 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, cornerRadius); }, checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY, cornerRadius) { cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(width, height) : cornerRadius; 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(); var containerWindow = r.cy.window(); // 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 } 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 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_1(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)); }; } }; // 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$2(); this.keyForId = new Map$2(); this.cachesByLvl = new Map$2(); 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$2(); 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(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_1(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(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_1(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); } }; 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 'haystack': for (var _i = 2; _i + 1 < pts.length; _i += 2) { context.lineTo(pts[_i], pts[_i + 1]); } break; case 'segments': if (rs.isRound) { var _iterator = _createForOfIteratorHelper(rs.roundCorners), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var corner = _step.value; drawPreparedRoundCorner(context, corner); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } context.lineTo(pts[pts.length - 2], pts[pts.length - 1]); } else { for (var _i2 = 2; _i2 + 1 < pts.length; _i2 += 2) { context.lineTo(pts[_i2], pts[_i2 + 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 pArrowWidth = edge.pstyle(prefix + '-arrow-width'); var arrowWidth = pArrowWidth.value === 'match-line' ? edgeWidth : pArrowWidth.pfValue; if (pArrowWidth.units === '%') arrowWidth *= edgeWidth; 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, arrowWidth, 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, arrowWidth, x, y, angle); }; CRp$8.drawArrowShape = function (edge, context, fill, edgeWidth, shape, shapeWidth, 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 = shapeWidth / (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 cornerRadius = node.pstyle('corner-radius').value; if (cornerRadius !== 'auto') cornerRadius = node.pstyle('corner-radius').pfValue; 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, cornerRadius, rs); 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, cornerRadius, rs); 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; var stroke = arguments.length > 6 ? arguments[6] : undefined; 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(); if (stroke) ctx.stroke();else 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; var styleShape = ele.pstyle('text-background-shape').strValue; var rounded = styleShape.indexOf('round') === 0; var roundRadius = 2; 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 + ')'; if (rounded) { roundRect(context, bgX, bgY, bgW, bgH, roundRadius); } 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; } } if (rounded) { roundRect(context, bgX, bgY, bgW, bgH, roundRadius, 'stroke'); } else { context.strokeRect(bgX, bgY, bgW, bgH); } if (textBorderStyle === 'double') { var whiteWidth = textBorderWidth / 2; if (rounded) { roundRect(context, bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2, roundRadius, 'stroke'); } else { 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 borderJoin = node.pstyle('border-join').value; var borderCap = node.pstyle('border-cap').value; var borderPosition = node.pstyle('border-position').value; var borderPattern = node.pstyle('border-dash-pattern').pfValue; var borderOffset = node.pstyle('border-dash-offset').pfValue; var borderOpacity = node.pstyle('border-opacity').value * eleOpacity; var outlineWidth = node.pstyle('outline-width').pfValue; var outlineColor = node.pstyle('outline-color').value; var outlineStyle = node.pstyle('outline-style').value; var outlineOpacity = node.pstyle('outline-opacity').value * eleOpacity; var outlineOffset = node.pstyle('outline-offset').value; var cornerRadius = node.pstyle('corner-radius').value; if (cornerRadius !== 'auto') cornerRadius = node.pstyle('corner-radius').pfValue; 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); }; var setupOutlineColor = function setupOutlineColor() { var otlnOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : outlineOpacity; r.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], otlnOpy); }; // // setup shape var getPath = function getPath(width, height, shape, points) { var pathCache = r.nodePathCache = r.nodePathCache || []; var key = hashStrings(shape === 'polygon' ? shape + ',' + points.join(',') : shape, '' + height, '' + width, '' + cornerRadius); var cachedPath = pathCache[key]; var path; var cacheHit = false; if (cachedPath != null) { path = cachedPath; cacheHit = true; rs.pathCache = path; } else { path = new Path2D(); pathCache[key] = rs.pathCache = path; } return { path: path, cacheHit: cacheHit }; }; var styleShape = node.pstyle('shape').strValue; var shapePts = node.pstyle('shape-polygon-points').pfValue; if (usePaths) { context.translate(pos.x, pos.y); var shapePath = getPath(nodeWidth, nodeHeight, styleShape, shapePts); path = shapePath.path; pathCacheHit = shapePath.cacheHit; } 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, cornerRadius, rs); } 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, cornerRadius, rs); } } } }; 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 = borderCap; context.lineJoin = borderJoin; if (context.setLineDash) { // for very outofdate browsers switch (borderStyle) { case 'dotted': context.setLineDash([1, 1]); break; case 'dashed': context.setLineDash(borderPattern); context.lineDashOffset = borderOffset; break; case 'solid': case 'double': context.setLineDash([]); break; } } if (borderPosition !== 'center') { context.save(); context.lineWidth *= 2; if (borderPosition === 'inside') { usePaths ? context.clip(path) : context.clip(); } else { var region = new Path2D(); region.rect(-nodeWidth / 2 - borderWidth, -nodeHeight / 2 - borderWidth, nodeWidth + 2 * borderWidth, nodeHeight + 2 * borderWidth); region.addPath(path); context.clip(region, 'evenodd'); } usePaths ? context.stroke(path) : context.stroke(); context.restore(); } else { usePaths ? context.stroke(path) : 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 drawOutline = function drawOutline() { if (outlineWidth > 0) { context.lineWidth = outlineWidth; context.lineCap = 'butt'; if (context.setLineDash) { // for very outofdate browsers switch (outlineStyle) { case 'dotted': context.setLineDash([1, 1]); break; case 'dashed': context.setLineDash([4, 2]); break; case 'solid': case 'double': context.setLineDash([]); break; } } var npos = pos; if (usePaths) { npos = { x: 0, y: 0 }; } var shape = r.getNodeShape(node); var bWidth = borderWidth; if (borderPosition === 'inside') bWidth = 0; if (borderPosition === 'outside') bWidth *= 2; var scaleX = (nodeWidth + bWidth + (outlineWidth + outlineOffset)) / nodeWidth; var scaleY = (nodeHeight + bWidth + (outlineWidth + outlineOffset)) / nodeHeight; var sWidth = nodeWidth * scaleX; var sHeight = nodeHeight * scaleY; var points = r.nodeShapes[shape].points; var _path; if (usePaths) { var outlinePath = getPath(sWidth, sHeight, shape, points); _path = outlinePath.path; } // draw the outline path, either by using expanded points or by scaling // the dimensions, depending on shape if (shape === "ellipse") { r.drawEllipsePath(_path || context, npos.x, npos.y, sWidth, sHeight); } else if (['round-diamond', 'round-heptagon', 'round-hexagon', 'round-octagon', 'round-pentagon', 'round-polygon', 'round-triangle', 'round-tag'].includes(shape)) { var sMult = 0; var offsetX = 0; var offsetY = 0; if (shape === 'round-diamond') { sMult = (bWidth + outlineOffset + outlineWidth) * 1.4; } else if (shape === 'round-heptagon') { sMult = (bWidth + outlineOffset + outlineWidth) * 1.075; offsetY = -(bWidth / 2 + outlineOffset + outlineWidth) / 35; } else if (shape === 'round-hexagon') { sMult = (bWidth + outlineOffset + outlineWidth) * 1.12; } else if (shape === 'round-pentagon') { sMult = (bWidth + outlineOffset + outlineWidth) * 1.13; offsetY = -(bWidth / 2 + outlineOffset + outlineWidth) / 15; } else if (shape === 'round-tag') { sMult = (bWidth + outlineOffset + outlineWidth) * 1.12; offsetX = (bWidth / 2 + outlineWidth + outlineOffset) * .07; } else if (shape === 'round-triangle') { sMult = (bWidth + outlineOffset + outlineWidth) * (Math.PI / 2); offsetY = -(bWidth + outlineOffset / 2 + outlineWidth) / Math.PI; } if (sMult !== 0) { scaleX = (nodeWidth + sMult) / nodeWidth; sWidth = nodeWidth * scaleX; if (!['round-hexagon', 'round-tag'].includes(shape)) { scaleY = (nodeHeight + sMult) / nodeHeight; sHeight = nodeHeight * scaleY; } } cornerRadius = cornerRadius === 'auto' ? getRoundPolygonRadius(sWidth, sHeight) : cornerRadius; var halfW = sWidth / 2; var halfH = sHeight / 2; var radius = cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2; var p = new Array(points.length / 2); var corners = new Array(points.length / 2); for (var _i3 = 0; _i3 < points.length / 2; _i3++) { p[_i3] = { x: npos.x + offsetX + halfW * points[_i3 * 2], y: npos.y + offsetY + halfH * points[_i3 * 2 + 1] }; } var _i2, p1, p2, p3, len = p.length; p1 = p[len - 1]; // for each point for (_i2 = 0; _i2 < len; _i2++) { p2 = p[_i2 % len]; p3 = p[(_i2 + 1) % len]; corners[_i2] = getRoundCorner(p1, p2, p3, radius); p1 = p2; p2 = p3; } r.drawRoundPolygonPath(_path || context, npos.x + offsetX, npos.y + offsetY, nodeWidth * scaleX, nodeHeight * scaleY, points, corners); } else if (['roundrectangle', 'round-rectangle'].includes(shape)) { cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(sWidth, sHeight) : cornerRadius; r.drawRoundRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2); } else if (['cutrectangle', 'cut-rectangle'].includes(shape)) { cornerRadius = cornerRadius === 'auto' ? getCutRectangleCornerLength() : cornerRadius; r.drawCutRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, null, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 4); } else if (['bottomroundrectangle', 'bottom-round-rectangle'].includes(shape)) { cornerRadius = cornerRadius === 'auto' ? getRoundRectangleRadius(sWidth, sHeight) : cornerRadius; r.drawBottomRoundRectanglePath(_path || context, npos.x, npos.y, sWidth, sHeight, cornerRadius + (bWidth + outlineWidth + outlineOffset) / 2); } else if (shape === "barrel") { r.drawBarrelPath(_path || context, npos.x, npos.y, sWidth, sHeight); } else if (shape.startsWith("polygon") || ['rhomboid', 'right-rhomboid', 'round-tag', 'tag', 'vee'].includes(shape)) { var pad = (bWidth + outlineWidth + outlineOffset) / nodeWidth; points = joinLines(expandPolygon(points, pad)); r.drawPolygonPath(_path || context, npos.x, npos.y, nodeWidth, nodeHeight, points); } else { var _pad = (bWidth + outlineWidth + outlineOffset) / nodeWidth; points = joinLines(expandPolygon(points, -_pad)); r.drawPolygonPath(_path || context, npos.x, npos.y, nodeWidth, nodeHeight, points); } if (usePaths) { context.stroke(_path); } else { context.stroke(); } if (outlineStyle === 'double') { context.lineWidth = bWidth / 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); setupOutlineColor(); drawOutline(); 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); } setupOutlineColor(); drawOutline(); 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; var radius = node.pstyle("".concat(overlayOrUnderlay, "-corner-radius")).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, radius); 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, corners) { corners.forEach(function (corner) { return drawPreparedRoundCorner(context, corner); }); context.closePath(); }; // Round rectangle drawing CRp$3.drawRoundRectanglePath = function (context, x, y, width, height, radius) { var halfWidth = width / 2; var halfHeight = height / 2; var cornerRadius = radius === 'auto' ? getRoundRectangleRadius(width, height) : Math.min(radius, halfHeight, halfWidth); 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, radius) { var halfWidth = width / 2; var halfHeight = height / 2; var cornerRadius = radius === 'auto' ? getRoundRectangleRadius(width, height) : radius; 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, points, corners) { var halfWidth = width / 2; var halfHeight = height / 2; var cornerLength = corners === 'auto' ? getCutRectangleCornerLength() : corners; 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, corners) { 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, corners); case 'roundrectangle': case 'round-rectangle': return this.drawRoundRectanglePath(context, centerX, centerY, width, height, corners); case 'cutrectangle': case 'cut-rectangle': return this.drawCutRectanglePath(context, centerX, centerY, width, height, points, corners); case 'bottomroundrectangle': case 'bottom-round-rectangle': return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height, corners); 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 }]; // registered extensions to cytoscape, indexed by name 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); }); }); // 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'; }; // 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.29.2"; 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; /***/ }), /***/ "./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"); }); delete node.selfEdges; }); }); } 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); } function canonicalize(attrs) { var newAttrs = {}; _.forEach(attrs, function(v, k) { newAttrs[k.toLowerCase()] = v; }); 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 } } 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__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); module.exports = { run: run, cleanup: cleanup }; /* * 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 }); } return; } 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 }); g.setEdge(childBottom, bottom, { weight: thisWeight, minlen: minlen, nestingEdge: true }); }); if (!g.parent(v)) { g.setEdge(root, top, { weight: 0, minlen: height + depths[v] }); } } 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; } function sumWeights(g) { return _.reduce(g.edges(), function(acc, e) { return acc + g.edge(e).weight; }, 0); } 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); } }); } /***/ }), /***/ "./node_modules/dagre/lib/normalize.js": /*!*********************************************!*\ !*** ./node_modules/dagre/lib/normalize.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); module.exports = { run: run, undo: undo }; /* * 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); }); } 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; if (wRank === vRank + 1) return; g.removeEdge(e); 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; } 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; } v = w; node = g.node(v); } }); } /***/ }), /***/ "./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__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); module.exports = addSubgraphConstraints; function addSubgraphConstraints(g, cg, vs) { var prev = {}, rootPrev; _.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; } }); /* 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); */ } /***/ }), /***/ "./node_modules/dagre/lib/order/barycenter.js": /*!****************************************************!*\ !*** ./node_modules/dagre/lib/order/barycenter.js ***! \****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); module.exports = barycenter; 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 }); return { v: v, barycenter: result.sum / result.weight, weight: result.weight }; } }); } /***/ }), /***/ "./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 _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); module.exports = buildLayerGraph; /* * 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); }); _.forEach(g.nodes(), function(v) { var node = g.node(v), parent = g.parent(v); if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) { result.setNode(v); result.setParent(v, parent || root); // 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 }); }); if (_.has(node, "minRank")) { result.setNode(v, { borderLeft: node.borderLeft[rank], borderRight: node.borderRight[rank] }); } } }); return result; } function createRootNode(g) { var v; while (g.hasNode((v = _.uniqueId("_root")))); return v; } /***/ }), /***/ "./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"; 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; } /***/ }), /***/ "./node_modules/dagre/lib/order/index.js": /*!***********************************************!*\ !*** ./node_modules/dagre/lib/order/index.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; 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"); module.exports = order; /* * 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"); var layering = initOrder(g); assignOrder(g, layering); var bestCC = Number.POSITIVE_INFINITY, best; for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) { sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2); layering = util.buildLayerMatrix(g); var cc = crossCount(g, layering); if (cc < bestCC) { lastBest = 0; best = _.cloneDeep(layering); bestCC = cc; } } assignOrder(g, best); } function buildLayerGraphs(g, ranks, relationship) { return _.map(ranks, function(rank) { return buildLayerGraph(g, rank, relationship); }); } 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); }); } function assignOrder(g, layering) { _.forEach(layering, function(layer) { _.forEach(layer, function(v, i) { g.node(v).order = i; }); }); } /***/ }), /***/ "./node_modules/dagre/lib/order/init-order.js": /*!****************************************************!*\ !*** ./node_modules/dagre/lib/order/init-order.js ***! \****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); module.exports = initOrder; /* * 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 []; }); 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); } var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; }); _.forEach(orderedVs, dfs); return layers; } /***/ }), /***/ "./node_modules/dagre/lib/order/resolve-conflicts.js": /*!***********************************************************!*\ !*** ./node_modules/dagre/lib/order/resolve-conflicts.js ***! \***********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); module.exports = resolveConflicts; /* * 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; } }); _.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; } if (_.isUndefined(uEntry.barycenter) || _.isUndefined(vEntry.barycenter) || uEntry.barycenter >= vEntry.barycenter) { mergeEntries(vEntry, uEntry); } }; } function handleOut(vEntry) { return function(wEntry) { wEntry["in"].push(vEntry); if (--wEntry.indegree === 0) { sourceSet.push(wEntry); } }; } while (sourceSet.length) { var entry = sourceSet.pop(); entries.push(entry); _.forEach(entry["in"].reverse(), handleIn(entry)); _.forEach(entry.out, handleOut(entry)); } 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; } /***/ }), /***/ "./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"); module.exports = sortSubgraph; 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 = {}; if (bl) { movable = _.filter(movable, function(w) { return w !== bl && w !== br; }); } 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 entries = resolveConflicts(barycenters, cg); expandSubgraphs(entries, subgraphs); var result = sort(entries, biasRight); 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; } } 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); }); } 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; } } /***/ }), /***/ "./node_modules/dagre/lib/order/sort.js": /*!**********************************************!*\ !*** ./node_modules/dagre/lib/order/sort.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 = sort; 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; sortable.sort(compareWithBias(!!biasRight)); vsIndex = consumeUnsortable(vs, unsortable, vsIndex); _.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 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; } function compareWithBias(bias) { return function(entryV, entryW) { if (entryV.barycenter < entryW.barycenter) { return -1; } else if (entryV.barycenter > entryW.barycenter) { return 1; } return !bias ? entryV.i - entryW.i : entryW.i - entryV.i; }; } /***/ }), /***/ "./node_modules/dagre/lib/parent-dummy-chains.js": /*!*******************************************************!*\ !*** ./node_modules/dagre/lib/parent-dummy-chains.js ***! \*******************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); module.exports = parentDummyChains; function parentDummyChains(g) { var postorderNums = postorder(g); _.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; while (v !== edgeObj.w) { node = g.node(v); if (ascending) { while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) { pathIdx++; } if (pathV === lca) { ascending = false; } } if (!ascending) { while (pathIdx < path.length - 1 && g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) { pathIdx++; } pathV = path[pathIdx]; } g.setParent(v, pathV); v = g.successors(v)[0]; } }); } // 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; // 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; // Traverse from w to LCA parent = w; while ((parent = g.parent(parent)) !== lca) { wPath.push(parent); } return { path: vPath.concat(wPath.reverse()), lca: lca }; } function postorder(g) { var result = {}; var lim = 0; function dfs(v) { var low = lim; _.forEach(g.children(v), dfs); result[v] = { low: low, lim: lim++ }; } _.forEach(g.children(), dfs); return result; } /***/ }), /***/ "./node_modules/dagre/lib/position/bk.js": /*!***********************************************!*\ !*** ./node_modules/dagre/lib/position/bk.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "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 util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); /* * This module provides coordinate assignment based on Brandes and Köpf, "Fast * and Simple Horizontal Coordinate Assignment." */ module.exports = { positionX: positionX, findType1Conflicts: findType1Conflicts, findType2Conflicts: findType2Conflicts, addConflict: addConflict, hasConflict: hasConflict, verticalAlignment: verticalAlignment, horizontalCompaction: horizontalCompaction, alignCoordinates: alignCoordinates, findSmallestWidthAlignment: findSmallestWidthAlignment, balance: balance }; /* * 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 = {}; 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); _.forEach(layer, function(v, i) { var w = findOtherInnerSegmentNode(g, v), k1 = w ? g.node(w).order : prevLayerLength; 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; } _.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); } }); } }); } function visitLayer(north, south) { var prevNorthPos = -1, nextNorthPos, southPos = 0; _.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); }); return south; } _.reduce(layering, visitLayer); return conflicts; } function findOtherInnerSegmentNode(g, v) { if (g.node(v).dummy) { return _.find(g.predecessors(v), function(u) { return g.node(u).dummy; }); } } function addConflict(conflicts, v, w) { if (v > w) { var tmp = v; v = w; w = tmp; } var conflictsV = conflicts[v]; if (!conflictsV) { conflicts[v] = conflictsV = {}; } conflictsV[w] = true; } 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. */ 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; }); }); _.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]; } } } }); }); return { root: root, align: align }; } 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"; 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); } } 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]]; }); return xs; } function buildBlockGraph(g, layering, root, reverseSep) { var blockGraph = new Graph(), graphLabel = g.graph(), sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep); _.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; }); }); 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; _.forIn(xs, function (x, v) { var halfWidth = width(g, v) / 2; max = Math.max(x + halfWidth, max); min = Math.min(x - halfWidth, min); }); return max - min; }); } /* * 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 alignCoordinates(xss, alignTo) { var alignToVals = _.values(alignTo), alignToMin = _.min(alignToVals), alignToMax = _.max(alignToVals); _.forEach(["u", "d"], function(vert) { _.forEach(["l", "r"], function(horiz) { var alignment = vert + horiz, xs = xss[alignment], delta; if (xs === alignTo) return; var xsVals = _.values(xs); delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals); if (delta) { xss[alignment] = _.mapValues(xs, function(x) { return x + delta; }); } }); }); } 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; } }); } 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; }); }); var smallestWidth = findSmallestWidthAlignment(g, xss); alignCoordinates(xss, smallestWidth); return balance(xss, g.graph().align); } 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; 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; } } if (delta) { sum += reverseSep ? delta : -delta; } 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; return sum; }; } function width(g, v) { return g.node(v).width; } /***/ }), /***/ "./node_modules/dagre/lib/position/index.js": /*!**************************************************!*\ !*** ./node_modules/dagre/lib/position/index.js ***! \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; 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); module.exports = position; function position(g) { g = util.asNonCompoundGraph(g); positionY(g); _.forEach(positionX(g), function(x, v) { g.node(v).x = x; }); } 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; }); } /***/ }), /***/ "./node_modules/dagre/lib/rank/feasible-tree.js": /*!******************************************************!*\ !*** ./node_modules/dagre/lib/rank/feasible-tree.js ***! \******************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "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. * * 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 feasibleTree(g) { var t = new Graph({ directed: false }); // 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 t; } /* * 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); } }); } _.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); } }); } function shiftRanks(t, g, delta) { _.forEach(t.nodes(), function(v) { g.node(v).rank += delta; }); } /***/ }), /***/ "./node_modules/dagre/lib/rank/index.js": /*!**********************************************!*\ !*** ./node_modules/dagre/lib/rank/index.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; 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. * * 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 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); } } // A fast and simple ranker, but results are far from optimal. var longestPathRanker = longestPath; function tightTreeRanker(g) { longestPath(g); feasibleTree(g); } function networkSimplexRanker(g) { networkSimplex(g); } /***/ }), /***/ "./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. * * 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 networkSimplex(g) { g = simplify(g); initRank(g); var t = feasibleTree(g); initLowLimValues(t); initCutValues(t, g); var e, f; while ((e = leaveEdge(t))) { f = enterEdge(t, g, e); exchangeEdges(t, g, e, f); } } /* * 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); }); } function assignCutValue(t, g, child) { var childLab = t.node(child); var parent = childLab.parent; t.edge(child, parent).cutvalue = calcCutValue(t, g, child); } /* * 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); } 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; } function initLowLimValues(tree, root) { if (arguments.length < 2) { root = tree.nodes()[0]; } 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); } }); 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; } return nextLim; } 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; // 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; } 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; } var candidates = _.filter(g.edges(), function(edge) { return flip === isDescendant(t, t.node(edge.v), tailLabel) && flip !== isDescendant(t, t.node(edge.w), tailLabel); }); return _.minBy(candidates, function(edge) { return slack(g, edge); }); } 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); } 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 (!edge) { edge = g.edge(parent, v); flipped = true; } g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen); }); } /* * Returns true if the edge is in the tree. */ function isTreeEdge(tree, u, v) { return tree.hasEdge(u, v); } /* * 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; } /***/ }), /***/ "./node_modules/dagre/lib/rank/util.js": /*!*********************************************!*\ !*** ./node_modules/dagre/lib/rank/util.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; 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. * * 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 = {}; 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); } /* * 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; } /***/ }), /***/ "./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 addDummyNode(g, type, attrs, name) { var v; do { v = _.uniqueId(name); } while (g.hasNode(v)); attrs.dummy = type; g.setNode(v, attrs); return v; } /* * 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 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; } 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 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"); } 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 { 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 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; } }); } 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); } 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 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; } /* * 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) { /** * A simple dependency graph */ /** * 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 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); }); } 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; }); } }; // Create some aliases DepGraph.prototype.directDependentsOf = DepGraph.prototype.directDependantsOf; DepGraph.prototype.dependentsOf = DepGraph.prototype.dependantsOf; /** * 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 } }); 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__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); 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); } _.each(g.nodes(), function(v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); 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; /* * 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]; } 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); } 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__) { 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; 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 (weight < 0) { throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); } if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; 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) { break; } edgeFn(v).forEach(updateNeighbors); } 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"); module.exports = findCycles; function findCycles(g) { return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); }); } /***/ }), /***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js": /*!*********************************************************!*\ !*** ./node_modules/graphlib/lib/alg/floyd-warshall.js ***! \*********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); module.exports = floydWarshall; 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(); 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 }; }); }); 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; } }); }); }); return results; } /***/ }), /***/ "./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/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; } throw e; } return true; } /***/ }), /***/ "./node_modules/graphlib/lib/alg/postorder.js": /*!****************************************************!*\ !*** ./node_modules/graphlib/lib/alg/postorder.js ***! \****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); module.exports = postorder; function postorder(g, vs) { return dfs(g, vs, "post"); } /***/ }), /***/ "./node_modules/graphlib/lib/alg/preorder.js": /*!***************************************************!*\ !*** ./node_modules/graphlib/lib/alg/preorder.js ***! \***************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); module.exports = preorder; function preorder(g, vs) { return dfs(g, vs, "pre"); } /***/ }), /***/ "./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; 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; } g.nodeEdges(v).forEach(updateNeighbors); } 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); } }); 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; } /***/ }), /***/ "./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(); } if (!_.has(visited, node)) { stack[node] = true; visited[node] = true; _.each(g.predecessors(node), visit); delete stack[node]; results.push(node); } } _.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; }); }; /** * 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. * * @param {Object} key */ PriorityQueue.prototype.priority = function(key) { var index = this._keyIndices[key]; if (index !== undefined) { return this._arr[index].priority; } }; /** * 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"); } 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; } 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); } this._arr[index].priority = priority; this._decrease(index); }; 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); } } }; 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; } }; 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/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 = {}; } /* Number of nodes in the graph. Should only be changed by the implementation. */ Graph.prototype._nodeCount = 0; /* Number of edges in the graph. Should only be changed by the implementation. */ Graph.prototype._edgeCount = 0; /* === Graph functions ========= */ Graph.prototype.isDirected = function() { return this._isDirected; }; Graph.prototype.isMultigraph = function() { return this._isMultigraph; }; Graph.prototype.isCompound = function() { return this._isCompound; }; Graph.prototype.setGraph = function(label) { this._label = label; return this; }; Graph.prototype.graph = function() { return this._label; }; /* === Node functions ========== */ Graph.prototype.setDefaultNodeLabel = function(newDefault) { if (!_.isFunction(newDefault)) { newDefault = _.constant(newDefault); } this._defaultNodeLabelFn = newDefault; return this; }; 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]); }); }; Graph.prototype.sinks = function() { var self = this; return _.filter(this.nodes(), function(v) { return _.isEmpty(self._out[v]); }); }; 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; }; Graph.prototype.setNode = function(v, value) { if (_.has(this._nodes, v)) { if (arguments.length > 1) { this._nodes[v] = value; } 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]; }; Graph.prototype.hasNode = function(v) { return _.has(this._nodes, v); }; 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; }; Graph.prototype.setParent = function(v, parent) { if (!this._isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } 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"); } } 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]; }; Graph.prototype.parent = function(v) { if (this._isCompound) { var parent = this._parent[v]; if (parent !== GRAPH_NODE) { return parent; } } }; Graph.prototype.children = function(v) { if (_.isUndefined(v)) { v = GRAPH_NODE; } 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 []; } }; Graph.prototype.predecessors = function(v) { var predsV = this._preds[v]; if (predsV) { return _.keys(predsV); } }; Graph.prototype.successors = function(v) { var sucsV = this._sucs[v]; if (sucsV) { return _.keys(sucsV); } }; 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 }); copy.setGraph(this.graph()); var self = this; _.each(this._nodes, function(value, v) { if (filter(v)) { copy.setNode(v, value); } }); _.each(this._edgeObjs, function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); 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 ========== */ Graph.prototype.setDefaultEdgeLabel = function(newDefault) { if (!_.isFunction(newDefault)) { newDefault = _.constant(newDefault); } this._defaultEdgeLabelFn = newDefault; return this; }; Graph.prototype.edgeCount = function() { return this._edgeCount; }; Graph.prototype.edges = function() { return _.values(this._edgeObjs); }; 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; }; /* * 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]; 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; } } 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"); } // It didn't exist, so we need to create it. // First ensure the nodes exist. this.setNode(v); this.setNode(w); this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); 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]; }; 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); }; 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; }; 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; }); } }; 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; }); } }; 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]; } } 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); } 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; } function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } /***/ }), /***/ "./node_modules/graphlib/lib/index.js": /*!********************************************!*\ !*** ./node_modules/graphlib/lib/index.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { // 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/graphlib/lib/json.js": /*!*******************************************!*\ !*** ./node_modules/graphlib/lib/json.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"); module.exports = { write: write, read: read }; 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; } 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/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._; } module.exports = lodash; /***/ }), /***/ "./node_modules/graphlib/lib/version.js": /*!**********************************************!*\ !*** ./node_modules/graphlib/lib/version.js ***! \**********************************************/ /***/ (function(module) { module.exports = '2.1.8'; /***/ }), /***/ "./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); } } var keys = getOwnPropertyNames(sourceComponent); if (getOwnPropertySymbols) { keys = keys.concat(getOwnPropertySymbols(sourceComponent)); } 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) {} } } } return targetComponent; } module.exports = hoistNonReactStatics; /***/ }), /***/ "./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. */ /** * 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. */ 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'); } } 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'; } error.framesToPop = 1; // we don't care about invariant's own frame throw error; } }; module.exports = invariant; /***/ }), /***/ "./node_modules/is-string-blank/index.js": /*!***********************************************!*\ !*** ./node_modules/is-string-blank/index.js ***! \***********************************************/ /***/ (function(module) { "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/layout-base/layout-base.js": /*!*************************************************!*\ !*** ./node_modules/layout-base/layout-base.js ***! \*************************************************/ /***/ (function(module) { (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(); else // removed by dead control flow {} })(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__) { "use strict"; function LayoutConstants() {} /** * Layout Quality: 0:draft, 1:default, 2:proof */ LayoutConstants.QUALITY = 1; /** * 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; // ----------------------------------------------------------------------------- // 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; /* * Whether to consider labels in node dimensions or not */ LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false; /* * Default dimension of a non-compound node. */ LayoutConstants.SIMPLE_NODE_SIZE = 40; /* * Default dimension of a non-compound node. */ LayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2; /* * Empty compound node size. When a compound node is empty, its both * dimensions should be of this value. */ LayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40; /* * Minimum length that an edge should take during layout */ LayoutConstants.MIN_EDGE_LENGTH = 1; /* * 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; module.exports = LayoutConstants; /***/ }), /* 1 */ /***/ (function(module, exports, __nested_webpack_require_4947__) { "use strict"; var LGraphObject = __nested_webpack_require_4947__(2); var IGeometry = __nested_webpack_require_4947__(8); var IMath = __nested_webpack_require_4947__(9); function LEdge(source, target, vEdge) { LGraphObject.call(this, vEdge); this.isOverlapingSourceAndTarget = false; this.vGraphObject = vEdge; this.bendpoints = []; this.source = source; this.target = target; } LEdge.prototype = Object.create(LGraphObject.prototype); for (var prop in LGraphObject) { LEdge[prop] = LGraphObject[prop]; } LEdge.prototype.getSource = function () { return this.source; }; LEdge.prototype.getTarget = function () { return this.target; }; LEdge.prototype.isInterGraph = function () { return this.isInterGraph; }; LEdge.prototype.getLength = function () { return this.length; }; LEdge.prototype.isOverlapingSourceAndTarget = function () { return this.isOverlapingSourceAndTarget; }; LEdge.prototype.getBendpoints = function () { return this.bendpoints; }; LEdge.prototype.getLca = function () { return this.lca; }; LEdge.prototype.getSourceInLca = function () { return this.sourceInLca; }; LEdge.prototype.getTargetInLca = function () { return this.targetInLca; }; 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"; } }; 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(); } 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); } }; 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 (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; /***/ }), /* 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; } LGraphObject.call(this, vNode); //Alternative constructor 2 : LNode(Layout layout, Object vNode) if (gm.graphManager != null) gm = gm.graphManager; 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(); } 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; }; LNode.prototype.getOwner = function () { // if (this.owner != null) { // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) { // throw "assert failed"; // } // } return this.owner; }; LNode.prototype.getWidth = function () { return this.rect.width; }; LNode.prototype.setWidth = function (width) { this.rect.width = width; }; LNode.prototype.getHeight = function () { return this.rect.height; }; LNode.prototype.setHeight = function (height) { this.rect.height = height; }; LNode.prototype.getCenterX = function () { return this.rect.x + this.rect.width / 2; }; 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); }; LNode.prototype.getRect = function () { return this.rect; }; LNode.prototype.getDiagonal = function () { return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height); }; /** * 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; }; 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; }; LNode.prototype.moveBy = function (dx, dy) { this.rect.x += dx; this.rect.y += dy; }; LNode.prototype.getEdgeListToNode = function (to) { var edgeList = []; var edge; var self = this; self.edges.forEach(function (edge) { if (edge.target == to) { if (edge.source != self) throw "Incorrect edge source!"; edgeList.push(edge); } }); return edgeList; }; LNode.prototype.getEdgesBetween = function (other) { var edgeList = []; var edge; var self = this; self.edges.forEach(function (edge) { if (!(edge.source == self || edge.target == self)) throw "Incorrect edge source and/or target"; if (edge.target == other || edge.source == other) { edgeList.push(edge); } }); return edgeList; }; LNode.prototype.getNeighborsList = function () { var neighbors = new Set(); var self = this; self.edges.forEach(function (edge) { if (edge.source == self) { neighbors.add(edge.target); } else { if (edge.target != self) { throw "Incorrect incidency!"; } neighbors.add(edge.source); } }); 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); }); } } 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]; noOfChildren += childNode.getNoOfChildren(); } } if (noOfChildren == 0) { noOfChildren = 1; } return noOfChildren; }; LNode.prototype.getEstimatedSize = function () { if (this.estimatedSize == Integer.MIN_VALUE) { throw "assert failed"; } return this.estimatedSize; }; 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; 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; var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY; var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY; randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY; this.rect.x = randomCenterX; this.rect.y = randomCenterY; }; 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()); // Update compound bounds considering its label properties if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { var width = childGraph.getRight() - childGraph.getLeft(); var height = childGraph.getBottom() - childGraph.getTop(); 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); } } 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); } } } } }; LNode.prototype.getInclusionTreeDepth = function () { if (this.inclusionTreeDepth == Integer.MAX_VALUE) { throw "assert failed"; } 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; } var top = this.rect.y; if (top > LayoutConstants.WORLD_BOUNDARY) { top = LayoutConstants.WORLD_BOUNDARY; } else if (top < -LayoutConstants.WORLD_BOUNDARY) { top = -LayoutConstants.WORLD_BOUNDARY; } 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 this.owner.getParent(); }; 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; module.exports = FDLayoutConstants; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function PointD(x, y) { if (x == null && y == null) { this.x = 0; this.y = 0; } else { this.x = x; this.y = y; } } PointD.prototype.getX = function () { return this.x; }; PointD.prototype.getY = function () { return this.y; }; PointD.prototype.setX = function (x) { this.x = x; }; PointD.prototype.setY = function (y) { this.y = y; }; PointD.prototype.getDifference = function (pt) { return new DimensionD(this.x - pt.x, this.y - pt.y); }; 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__) { "use strict"; 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); 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]; } LGraph.prototype.getNodes = function () { return this.nodes; }; LGraph.prototype.getEdges = function () { return this.edges; }; LGraph.prototype.getGraphManager = function () { return this.graphManager; }; LGraph.prototype.getParent = function () { return this.parent; }; LGraph.prototype.getLeft = function () { return this.left; }; LGraph.prototype.getRight = function () { return this.right; }; LGraph.prototype.getTop = function () { return this.top; }; LGraph.prototype.getBottom = function () { return this.bottom; }; LGraph.prototype.isConnected = function () { return this.isConnected; }; 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!"; } if (sourceNode.owner != targetNode.owner) { return null; } // set source and target newEdge.source = sourceNode; newEdge.target = targetNode; // set as intra-graph edge newEdge.isInterGraph = false; // add to graph edge list this.getEdges().push(newEdge); // add to incidency lists sourceNode.edges.push(newEdge); if (targetNode != sourceNode) { targetNode.edges.push(newEdge); } return newEdge; } }; 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]; 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!"; } 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!"; } edge.source.edges.splice(sourceIndex, 1); if (edge.target != edge.source) { edge.target.edges.splice(targetIndex, 1); } 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; 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; } 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; } if (bottom < nodeBottom) { bottom = nodeBottom; } } 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; } 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; } } 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(); } }; LGraph.prototype.getEstimatedSize = function () { if (this.estimatedSize == Integer.MIN_VALUE) { throw "assert failed"; } 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(); } if (size == 0) { this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE; } else { this.estimatedSize = size / Math.sqrt(this.nodes.length); } 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); }); 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); }); } } } 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; } } }; 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 (parentNode == null) { throw "Parent node is null!"; } if (this.graphs.indexOf(newGraph) > -1) { throw "Graph already in this graph mgr!"; } this.graphs.push(newGraph); if (newGraph.parent != null) { throw "Already has a parent!"; } if (parentNode.child != null) { throw "Already has a child!"; } newGraph.parent = parentNode; parentNode.child = newGraph; 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; // 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); return newEdge; } } }; 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 if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) { throw "Source and/or target doesn't know this edge!"; } 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!"; } if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) { throw "Not in owner graph manager's edge list!"; } var index = edge.source.owner.getGraphManager().edges.indexOf(edge); edge.source.owner.getGraphManager().edges.splice(index, 1); } }; 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; }; 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()); } edgeList = edgeList.concat(this.edges); this.allEdges = edgeList; } return this.allEdges; }; LGraphManager.prototype.getAllNodesToApplyGravitation = function () { return this.allNodesToApplyGravitation; }; LGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) { if (this.allNodesToApplyGravitation != null) { throw "assert failed"; } this.allNodesToApplyGravitation = nodeList; }; LGraphManager.prototype.getRoot = function () { return this.rootGraph; }; 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; }; LGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) { if (!(firstNode != null && secondNode != null)) { throw "assert failed"; } if (firstNode == secondNode) { return true; } // 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; } 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(); if (parentNode == null) { break; } if (parentNode == firstNode) { return true; } ownerGraph = parentNode.getOwner(); if (ownerGraph == null) { break; } } 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; if (sourceNode == targetNode) { edge.lca = sourceNode.getOwner(); continue; } sourceAncestorGraph = sourceNode.getOwner(); while (edge.lca == null) { edge.targetInLca = targetNode; targetAncestorGraph = targetNode.getOwner(); while (edge.lca == null) { if (targetAncestorGraph == sourceAncestorGraph) { edge.lca = targetAncestorGraph; break; } if (targetAncestorGraph == this.rootGraph) { break; } if (edge.lca != null) { throw "assert failed"; } edge.targetInLca = targetAncestorGraph.getParent(); targetAncestorGraph = edge.targetInLca.getOwner(); } if (sourceAncestorGraph == this.rootGraph) { break; } if (edge.lca == null) { edge.sourceInLca = sourceAncestorGraph.getParent(); sourceAncestorGraph = edge.sourceInLca.getOwner(); } } if (edge.lca == null) { throw "assert failed"; } } }; LGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) { if (firstNode == secondNode) { return firstNode.getOwner(); } 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; } 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); } } }; 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); } } // 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; } }; /** * 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(); //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(); //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; } } // 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; //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; } } //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; } } } 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; } }; /** * 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; 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; } 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 } 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); 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; } }; /** * 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]; } // 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 // ----------------------------------------------------------------------------- /** * 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() {} /** * 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; } }; 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__) { "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; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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; } if (next !== null) { next.prev = node; } else { list.tail = node; } node.prev = prev; node.next = next; list.length++; return node; }; var _remove = function _remove(node, list) { var prev = node.prev, next = node.next; 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; list.length--; return node; }; var LinkedList = function () { function LinkedList(vals) { var _this = this; _classCallCheck(this, LinkedList); this.length = 0; this.head = null; this.tail = null; if (vals != null) { vals.forEach(function (v) { return _this.push(v); }); } } _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; } } }]); 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); } else { this.x = Math.floor(x + 0.5); this.y = Math.floor(y + 0.5); } } }; 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; } } 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; }; RectangleD.prototype.intersects = function (a) { if (this.getRight() < a.x) { return false; } if (this.getBottom() < a.y) { return false; } if (a.getRight() < this.x) { return false; } if (a.getBottom() < this.y) { return false; } return true; }; RectangleD.prototype.getCenterX = function () { return this.x + this.width / 2; }; RectangleD.prototype.getMinX = function () { return this.getX(); }; 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(); }; RectangleD.prototype.getMaxY = function () { return this.getY() + this.height; }; RectangleD.prototype.getWidthHalf = function () { return this.width / 2; }; RectangleD.prototype.getHeightHalf = function () { return this.height / 2; }; 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; } if (obj.uniqueID != null) { return obj.uniqueID; } obj.uniqueID = UniqueIDGeneretor.getString(); UniqueIDGeneretor.lastID++; return obj.uniqueID; }; 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__) { "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; } } 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(); }; Layout.prototype.newGraphManager = function () { var gm = new LGraphManager(this); this.graphManager = gm; return gm; }; Layout.prototype.newGraph = function (vGraph) { return new LGraph(null, this.graphManager, vGraph); }; Layout.prototype.newNode = function (vNode) { return new LNode(this.graphManager, vNode); }; 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; 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(); } 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(); // reset all edges, since the topology has changed this.graphManager.resetAllEdges(); } // 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()); } }; 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]); } } // 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; // 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. 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); } } }; /** * 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; } }; 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). 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); } } } }; 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; 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(); } } } }; /** * 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; } // 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. while (unProcessedNodes.length > 0 && isForest) { toBeVisited.push(unProcessedNodes[0]); // 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); // 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; } } } } // 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(); } } 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)); graph.add(dummyNode); // create new dummy edge between prev and dummy node var dummyEdge = this.newEdge(null); this.graphManager.add(dummyEdge, prev, dummyNode); dummyNodes.add(dummyNode); prev = dummyNode; } var dummyEdge = this.newEdge(null); this.graphManager.add(dummyEdge, prev, edge.target); this.edgeToDummyNodes.set(edge, dummyNodes); // 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); for (var k = 0; k < edges.length; k++) { var lEdge = edges[k]; if (lEdge.bendpoints.length > 0) { var path = this.edgeToDummyNodes.get(lEdge); for (var i = 0; i < path.length; i++) { var dummyNode = path[i]; var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY()); // 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); } // add the real edge to graph this.graphManager.add(lEdge, lEdge.source, lEdge.target); } } }; 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; if (sliderValue <= 50) { a = 9.0 * defaultValue / 500.0; b = defaultValue / 10.0; } else { a = 9.0 * defaultValue / 50.0; b = -8 * defaultValue; } 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); var removedNodes = []; var remainingDegrees = new Map(); var foundCenter = false; var centerNode = null; if (list.length == 1 || list.length == 2) { foundCenter = true; centerNode = list[0]; } 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); } } 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); } }); } removedNodes = removedNodes.concat(tempList); if (list.length == 1 || list.length == 2) { foundCenter = true; centerNode = list[0]; } } return centerNode; }; /** * 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; }; module.exports = Layout; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; 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; /***/ }), /* 17 */ /***/ (function(module, exports, __nested_webpack_require_84109__) { "use strict"; var PointD = __nested_webpack_require_84109__(5); 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; } Transform.prototype.getWorldOrgX = function () { return this.lworldOrgX; }; Transform.prototype.setWorldOrgX = function (wox) { this.lworldOrgX = wox; }; Transform.prototype.getWorldOrgY = function () { return this.lworldOrgY; }; Transform.prototype.setWorldOrgY = function (woy) { this.lworldOrgY = woy; }; Transform.prototype.getWorldExtX = function () { return this.lworldExtX; }; Transform.prototype.setWorldExtX = function (wex) { this.lworldExtX = wex; }; Transform.prototype.getWorldExtY = function () { return this.lworldExtY; }; Transform.prototype.setWorldExtY = function (wey) { this.lworldExtY = wey; }; /* Device related */ Transform.prototype.getDeviceOrgX = function () { return this.ldeviceOrgX; }; Transform.prototype.setDeviceOrgX = function (dox) { this.ldeviceOrgX = dox; }; Transform.prototype.getDeviceOrgY = function () { return this.ldeviceOrgY; }; Transform.prototype.setDeviceOrgY = function (doy) { this.ldeviceOrgY = doy; }; Transform.prototype.getDeviceExtX = function () { return this.ldeviceExtX; }; Transform.prototype.setDeviceExtX = function (dex) { this.ldeviceExtX = dex; }; 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; } return xDevice; }; 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; } 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; }; 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; }; 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__) { "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 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); function FDLayout() { Layout.call(this); 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; } 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); this.totalIterations = 0; this.notAnimatedIterations = 0; this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION; this.grid = []; }; FDLayout.prototype.calcIdealEdgeLengths = function () { var edge; var originalIdealLength; var lcaDepth; var source; var target; var sizeOfSourceInLca; var sizeOfTargetInLca; 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(); sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize(); sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize(); if (this.useSmartIdealEdgeLengthCalculation) { edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE; } lcaDepth = edge.getLca().getInclusionTreeDepth(); 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; } 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(); }; 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); } }; 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(); } 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]; // If both nodes are not members of the same graph, skip. if (nodeA.getOwner() != nodeB.getOwner()) { continue; } this.calcRepulsionForce(nodeA, nodeB); } } } }; FDLayout.prototype.calcGravitationalForces = function () { var node; var lNodes = this.getAllNodesToApplyGravitation(); 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(); } }; FDLayout.prototype.calcSpringForce = function (edge, idealLength) { var sourceNode = edge.getSource(); var targetNode = edge.getTarget(); var length; var springForce; var springForceX; var springForceY; // Update edge length if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) { edge.updateLengthSimple(); } else { edge.updateLength(); if (edge.isOverlapingSourceAndTarget) { return; } } length = edge.getLength(); if (length == 0) return; // 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; }; 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; 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); // 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 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); 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; } distanceSquared = distanceX * distanceX + distanceY * distanceY; distance = Math.sqrt(distanceSquared); // Here we use half of the nodes' repulsion values for backward compatibility repulsionForce = (nodeA.nodeRepulsion / 2 + nodeB.nodeRepulsion / 2) * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared; // Project force onto x and y axes repulsionForceX = repulsionForce * distanceX / distance; repulsionForceY = repulsionForce * distanceY / distance; // Apply forces on the two nodes nodeA.repulsionForceX -= repulsionForceX; nodeA.repulsionForceY -= repulsionForceY; nodeB.repulsionForceX += repulsionForceX; nodeB.repulsionForceY += repulsionForceY; } }; FDLayout.prototype.calcGravitationalForce = function (node) { var ownerGraph; var ownerCenterX; var ownerCenterY; var distanceX; var distanceY; var absDistanceX; var absDistanceY; var estimatedSize; ownerGraph = node.getOwner(); 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; if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant; node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant; } } }; FDLayout.prototype.isConverged = function () { var converged; var oscilating = false; if (this.totalIterations > this.maxIterations / 3) { oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2; } converged = this.totalDisplacement < this.totalDisplacementThreshold; this.oldTotalDisplacement = this.totalDisplacement; return converged || oscilating; }; FDLayout.prototype.animate = function () { if (this.animationDuringLayout && !this.isSubLayout) { if (this.notAnimatedIterations == this.animationPeriod) { this.update(); this.notAnimatedIterations = 0; } else { this.notAnimatedIterations++; } } }; //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 // ----------------------------------------------------------------------------- FDLayout.prototype.calcGrid = function (graph) { 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 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 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(); this.grid = this.calcGrid(this.graphManager.getRoot()); // 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()); } }; FDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) { 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; 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]; // 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; } // 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 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); } } } } } } nodeA.surrounding = [].concat(_toConsumableArray(surrounding)); } for (i = 0; i < nodeA.surrounding.length; i++) { this.calcRepulsionForce(nodeA, nodeA.surrounding[i]); } }; FDLayout.prototype.calcRepulsionRange = function () { return 0.0; }; module.exports = FDLayout; /***/ }), /* 19 */ /***/ (function(module, exports, __nested_webpack_require_103214__) { "use strict"; var LEdge = __nested_webpack_require_103214__(1); var FDLayoutConstants = __nested_webpack_require_103214__(4); 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; } 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__) { "use strict"; 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; //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; //Start and finish grid coordinates that this node is fallen into this.startX = 0; this.finishX = 0; this.startY = 0; this.finishY = 0; //Geometric neighbors of this node this.surrounding = []; } FDLayoutNode.prototype = Object.create(LNode.prototype); for (var prop in LNode) { FDLayoutNode[prop] = LNode[prop]; } 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__) { "use strict"; function DimensionD(width, height) { this.width = 0; this.height = 0; if (width !== null && height !== null) { this.height = height; this.width = width; } } DimensionD.prototype.getWidth = function () { return this.width; }; DimensionD.prototype.setWidth = function (width) { this.width = width; }; DimensionD.prototype.getHeight = function () { return this.height; }; DimensionD.prototype.setHeight = function (height) { this.height = height; }; module.exports = DimensionD; /***/ }), /* 22 */ /***/ (function(module, exports, __nested_webpack_require_105759__) { "use strict"; 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); } }; HashMap.prototype.contains = function (key) { var theId = UniqueIDGeneretor.createID(key); return this.map[key] != null; }; HashMap.prototype.get = function (key) { var theId = UniqueIDGeneretor.createID(key); return this.map[theId]; }; HashMap.prototype.keySet = function () { return this.keys; }; module.exports = HashMap; /***/ }), /* 23 */ /***/ (function(module, exports, __nested_webpack_require_106487__) { "use strict"; var UniqueIDGeneretor = __nested_webpack_require_106487__(14); function HashSet() { this.set = {}; } ; HashSet.prototype.add = function (obj) { var theId = UniqueIDGeneretor.createID(obj); if (!this.contains(theId)) this.set[theId] = obj; }; HashSet.prototype.remove = function (obj) { delete this.set[UniqueIDGeneretor.createID(obj)]; }; 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; }; HashSet.prototype.size = function () { return Object.keys(this.set).length; }; //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]]); } }; HashSet.prototype.size = function () { return Object.keys(this.set).length; }; 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__) { "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 = []; 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; }; /** * matrix transpose * array and result are 2d arrays */ 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]; } } return result; }; /** * multiply array with constant * array and result are 1d arrays */ Matrix.multCons = function (array, constant) { var result = []; for (var i = 0; i < array.length; i++) { result[i] = array[i] * constant; } 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]; } return result; }; /** * dot product of two arrays with same size * array1 and array2 are 1d arrays */ Matrix.dotProduct = function (array1, array2) { var product = 0; for (var i = 0; i < array1.length; i++) { product += array1[i] * array2[i]; } return product; }; /** * magnitude of an array * array is 1d array */ Matrix.mag = function (array) { return Math.sqrt(this.dotProduct(array, array)); }; /** * normalization of an array * array and result are 1d array */ Matrix.normalize = function (array) { var result = []; var magnitude = this.mag(array); 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; for (var i = 0; i < array.length; i++) { sum += array[i]; } sum *= -1 / array.length; for (var _i = 0; _i < array.length; _i++) { result[_i] = sum + array[_i]; } return result; }; /** * 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 = []; // 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]; } result[_i3] = _sum2; } return result; }; module.exports = Matrix; /***/ }), /* 25 */ /***/ (function(module, exports, __nested_webpack_require_111039__) { "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 classic Quicksort algorithm with Hoare's partition * - Works also on LinkedList objects * * Copyright: i-Vis Research Group, Bilkent University, 2007 - present */ 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; var length = void 0; if (A instanceof LinkedList) length = A.size();else length = A.length; this._quicksort(A, 0, length - 1); } _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 Quicksort; }(); module.exports = Quicksort; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Singular Value Decomposition implementation function SVD() {}; /* 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 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. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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." "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. 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. 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. 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 (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. 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. 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. 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. 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. 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. 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. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ 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; }; // 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__) { "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"); } } /** * 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. */ 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; // Just the remove redundancy this.iMax = sequence1.length + 1; this.jMax = sequence2.length + 1; // 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); for (var j = 0; j < this.jMax; j++) { this.grid[i][j] = 0; } } // 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); 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; // Calculate scores and tracebacks this.computeGrids(); } _createClass(NeedlemanWunsch, [{ key: "getScore", value: function getScore() { return this.score; } }, { key: "getAlignments", value: function getAlignments() { return this.alignments; } // 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]; } // 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 up = this.grid[_i2 - 1][_j2] + this.gap_penalty; var left = this.grid[_i2][_j2 - 1] + this.gap_penalty; // If there exists multiple max values, capture them for multiple paths var maxOf = [diag, up, left]; var indices = this.arrayAllMaxIndexes(maxOf); // Update Grids this.grid[_i2][_j2] = maxOf[indices[0]]; this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)]; } } // 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 = []; inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length], seq1: "", seq2: "" }); while (inProcessAlignments[0]) { var current = inProcessAlignments[0]; var directions = this.tracebackGrid[current.pos[0]][current.pos[1]]; 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 }); } if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1, sequence2: current.seq2 }); inProcessAlignments.shift(); } return this.alignments; } // 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; } }, { key: "arrayAllMaxIndexes", value: function arrayAllMaxIndexes(array) { return this.getAllIndexes(array, Math.max.apply(null, array)); } }]); return NeedlemanWunsch; }(); module.exports = NeedlemanWunsch; /***/ }), /* 28 */ /***/ (function(module, exports, __nested_webpack_require_145732__) { "use strict"; var layoutBase = function layoutBase() { return; }; 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__) { "use strict"; function Emitter() { this.listeners = []; } var p = Emitter.prototype; p.addListener = function (event, callback) { this.listeners.push({ event: event, callback: callback }); }; p.removeListener = function (event, callback) { for (var i = this.listeners.length; i >= 0; i--) { var l = this.listeners[i]; if (l.event === event && l.callback === callback) { this.listeners.splice(i, 1); } } }; p.emit = function (event, data) { for (var i = 0; i < this.listeners.length; i++) { var l = this.listeners[i]; if (event === l.event) { l.callback(data); } } }; module.exports = Emitter; /***/ }) /******/ ]); }); /***/ }), /***/ "./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 */ /** 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; /** 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]'; /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** 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; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; /** 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; /** 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')(); /** * 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); } /** * 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; } /** * 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; } /** * 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; } /** * 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; while (++index < length) { if (array[index] === value) { return index; } } return -1; } /** * 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; while (length--) { if (array[length] === placeholder) { result++; } } return result; } /** * 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]; } /** * 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; } /** * 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 = []; while (++index < length) { var value = array[index]; if (value === placeholder || value === PLACEHOLDER) { array[index] = PLACEHOLDER; result[resIndex++] = index; } } return result; } /** 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) : ''; }()); /** 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 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.*?') + '$' ); /** 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; /* Used to set `toString` methods. */ var defineProperty = (function() { var func = getNative(Object, 'defineProperty'), name = getNative.name; return (name && name.length > 2) ? func : undefined; }()); /** * 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) : {}; } /** * 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)); } /** * 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; } /** * 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; } /** * 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); function wrapper() { var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; return fn.apply(isBind ? thisArg : this, arguments); } return wrapper; } /** * 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. */ 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; }; } /** * 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); 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; } /** * Creates a function that wraps `func` to invoke it with optional `this` * binding of `thisArg`, partial application, and currying. * * @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 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; 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; 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; } /** * 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); 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; while (++leftIndex < leftLength) { args[leftIndex] = partials[leftIndex]; } while (argsLength--) { args[leftIndex++] = arguments[++argsIndex]; } return apply(fn, isBind ? thisArg : this, args); } 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. */ 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); } var result = wrapFunc(func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity); result.placeholder = placeholder; return setWrapToString(result, func, bitmask); } /** * 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; } ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); arity = arity === undefined ? arity : toInteger(arity); length -= holders ? holders.length : 0; 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 ]; 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); 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); } /** * 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; } /** * 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; } /** * 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) : []; } /** * 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; details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; details = details.join(length > 2 ? ', ' : ' '); return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); } /** * 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) { length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (typeof value == 'number' || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); } /** * 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); } /** * 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))) }); }; /** * 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 ''; } /** * 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 curried = _.curry(abc); * * curried(1)(2)(3); * // => [1, 2, 3] * * 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 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; } /** * 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 */ 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 * [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 */ function isObject(value) { var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * 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 */ function isObjectLike(value) { return !!value && typeof value == 'object'; } /** * 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); } /** * 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 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; } return value === value ? value : 0; } /** * 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 */ function toInteger(value) { var result = toFinite(value), remainder = result % 1; return result === result ? (remainder ? result - remainder : result) : 0; } /** * 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 */ 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); } /** * 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; }; } /** * 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 identity(value) { return value; } // Assign default placeholders. curry.placeholder = {}; module.exports = curry; /***/ }), /***/ "./node_modules/lodash/_DataView.js": /*!******************************************!*\ !*** ./node_modules/lodash/_DataView.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 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"); /** * 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; 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 = 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"); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ 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]); } } // 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; /***/ }), /***/ "./node_modules/lodash/_MapCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_MapCache.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"); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ 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"); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; /***/ }), /***/ "./node_modules/lodash/_SetCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_SetCache.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"); /** * * Creates an array cache object to store unique values. * * @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. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ 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; 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) { /** * 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); } 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/lodash/_arrayFilter.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayFilter.js ***! \*********************************************/ /***/ (function(module) { /** * A specialized version of `_.filter` 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 {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; /***/ }), /***/ "./node_modules/lodash/_arrayIncludes.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayIncludes.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.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 = arrayIncludes; /***/ }), /***/ "./node_modules/lodash/_arrayIncludesWith.js": /*!***************************************************!*\ !*** ./node_modules/lodash/_arrayIncludesWith.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; while (++index < length) { if (comparator(value, array[index])) { return true; } } return false; } module.exports = arrayIncludesWith; /***/ }), /***/ "./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; /** * 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; 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 = arrayLikeKeys; /***/ }), /***/ "./node_modules/lodash/_arrayMap.js": /*!******************************************!*\ !*** ./node_modules/lodash/_arrayMap.js ***! \******************************************/ /***/ (function(module) { /** * 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); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }), /***/ "./node_modules/lodash/_arrayPush.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arrayPush.js ***! \*******************************************/ /***/ (function(module) { /** * 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; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; /***/ }), /***/ "./node_modules/lodash/_arrayReduce.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayReduce.js ***! \*********************************************/ /***/ (function(module) { /** * 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; if (initAccum && length) { accumulator = array[++index]; } while (++index < length) { accumulator = iteratee(accumulator, array[index], index, array); } return accumulator; } module.exports = arrayReduce; /***/ }), /***/ "./node_modules/lodash/_arraySome.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arraySome.js ***! \*******************************************/ /***/ (function(module) { /** * 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; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } module.exports = arraySome; /***/ }), /***/ "./node_modules/lodash/_asciiSize.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_asciiSize.js ***! \*******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.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 = asciiSize; /***/ }), /***/ "./node_modules/lodash/_assignMergeValue.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_assignMergeValue.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"); /** * 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 = assignMergeValue; /***/ }), /***/ "./node_modules/lodash/_assignValue.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_assignValue.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"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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); } } module.exports = assignValue; /***/ }), /***/ "./node_modules/lodash/_assocIndexOf.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_assocIndexOf.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.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 = assocIndexOf; /***/ }), /***/ "./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"); /** * 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); } module.exports = baseAssign; /***/ }), /***/ "./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"); /** * 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); } module.exports = baseAssignIn; /***/ }), /***/ "./node_modules/lodash/_baseAssignValue.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseAssignValue.js ***! \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); /** * 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; } } module.exports = baseAssignValue; /***/ }), /***/ "./node_modules/lodash/_baseClone.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseClone.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"); /** 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; /** * The base implementation of `_.clone` and `_.cloneDeep` which tracks * traversed objects. * * @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 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)); }); } 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 = baseClone; /***/ }), /***/ "./node_modules/lodash/_baseCreate.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseCreate.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; /***/ }), /***/ "./node_modules/lodash/_baseEach.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseEach.js ***! \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); /** * 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); module.exports = baseEach; /***/ }), /***/ "./node_modules/lodash/_baseExtremum.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseExtremum.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** * 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; 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 = baseExtremum; /***/ }), /***/ "./node_modules/lodash/_baseFilter.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseFilter.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); /** * 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; } module.exports = baseFilter; /***/ }), /***/ "./node_modules/lodash/_baseFindIndex.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseFindIndex.js ***! \***********************************************/ /***/ (function(module) { /** * 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; } module.exports = baseFindIndex; /***/ }), /***/ "./node_modules/lodash/_baseFlatten.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseFlatten.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), isFlattenable = __webpack_require__(/*! ./_isFlattenable */ "./node_modules/lodash/_isFlattenable.js"); /** * 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 = []); 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 = baseFlatten; /***/ }), /***/ "./node_modules/lodash/_baseFor.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseFor.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); /** * 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(); module.exports = baseFor; /***/ }), /***/ "./node_modules/lodash/_baseForOwn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseForOwn.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * 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); } module.exports = baseForOwn; /***/ }), /***/ "./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"); /** * 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); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; } module.exports = baseGet; /***/ }), /***/ "./node_modules/lodash/_baseGetAllKeys.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseGetAllKeys.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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)); } module.exports = baseGetAllKeys; /***/ }), /***/ "./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"); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** 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; /***/ }), /***/ "./node_modules/lodash/_baseGt.js": /*!****************************************!*\ !*** ./node_modules/lodash/_baseGt.js ***! \****************************************/ /***/ (function(module) { /** * 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; } module.exports = baseGt; /***/ }), /***/ "./node_modules/lodash/_baseHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseHas.js ***! \*****************************************/ /***/ (function(module) { /** 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 `_.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); } module.exports = baseHas; /***/ }), /***/ "./node_modules/lodash/_baseHasIn.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseHasIn.js ***! \*******************************************/ /***/ (function(module) { /** * 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); } module.exports = baseHasIn; /***/ }), /***/ "./node_modules/lodash/_baseIndexOf.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIndexOf.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; /***/ }), /***/ "./node_modules/lodash/_baseIsArguments.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsArguments.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 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; } module.exports = baseIsArguments; /***/ }), /***/ "./node_modules/lodash/_baseIsEqual.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsEqual.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"); /** * 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; } return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } module.exports = baseIsEqual; /***/ }), /***/ "./node_modules/lodash/_baseIsEqualDeep.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** 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; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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; 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__'); 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); } } if (!isSameTag) { return false; } stack || (stack = new Stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } module.exports = baseIsEqualDeep; /***/ }), /***/ "./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"); /** `Object#toString` result references. */ var mapTag = '[object Map]'; /** * 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; /***/ }), /***/ "./node_modules/lodash/_baseIsMatch.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsMatch.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); /** 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; 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]; 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 true; } module.exports = baseIsMatch; /***/ }), /***/ "./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; } module.exports = baseIsNaN; /***/ }), /***/ "./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)); } module.exports = baseIsNative; /***/ }), /***/ "./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]'; /** * 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; } module.exports = baseIsSet; /***/ }), /***/ "./node_modules/lodash/_baseIsTypedArray.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_baseIsTypedArray.js ***! \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** `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]'; 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 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; /** * 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/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"); /** * 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); } module.exports = baseIteratee; /***/ }), /***/ "./node_modules/lodash/_baseKeys.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseKeys.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"); /** 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; } module.exports = baseKeys; /***/ }), /***/ "./node_modules/lodash/_baseKeysIn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseKeysIn.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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 = []; for (var key in object) { if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { result.push(key); } } return result; } module.exports = baseKeysIn; /***/ }), /***/ "./node_modules/lodash/_baseLt.js": /*!****************************************!*\ !*** ./node_modules/lodash/_baseLt.js ***! \****************************************/ /***/ (function(module) { /** * 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; } 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. * * @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; /***/ }), /***/ "./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); }; } 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"); /** * 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; if (newValue === undefined) { newValue = srcValue; } assignMergeValue(object, key, newValue); } }, keysIn); } module.exports = baseMerge; /***/ }), /***/ "./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); if (stacked) { assignMergeValue(object, key, stacked); return; } var newValue = customizer ? customizer(objValue, srcValue, (key + ''), object, source, stack) : undefined; var isCommon = newValue === undefined; if (isCommon) { var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); 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); } module.exports = baseMergeDeep; /***/ }), /***/ "./node_modules/lodash/_baseOrderBy.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseOrderBy.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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 result = baseMap(collection, function(value, key, collection) { var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); }); return { 'criteria': criteria, 'index': ++index, 'value': value }; }); return baseSortBy(result, function(object, other) { return compareMultiple(object, other, orders); }); } 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; /***/ }), /***/ "./node_modules/lodash/_basePickBy.js": /*!********************************************!*\ !*** ./node_modules/lodash/_basePickBy.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** * 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 = {}; while (++index < length) { var path = paths[index], value = baseGet(object, path); if (predicate(value, path)) { baseSet(result, castPath(path, object), value); } } return result; } module.exports = basePickBy; /***/ }), /***/ "./node_modules/lodash/_baseProperty.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseProperty.js ***! \**********************************************/ /***/ (function(module) { /** * 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]; }; } module.exports = baseProperty; /***/ }), /***/ "./node_modules/lodash/_basePropertyDeep.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_basePropertyDeep.js ***! \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** * 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/lodash/_baseRange.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseRange.js ***! \*******************************************/ /***/ (function(module) { /* 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; /***/ }), /***/ "./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; } module.exports = baseReduce; /***/ }), /***/ "./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 + ''); } module.exports = baseRest; /***/ }), /***/ "./node_modules/lodash/_baseSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseSet.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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); var index = -1, length = path.length, lastIndex = length - 1, nested = object; 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; /***/ }), /***/ "./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 }); }; module.exports = baseSetToString; /***/ }), /***/ "./node_modules/lodash/_baseSortBy.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseSortBy.js ***! \********************************************/ /***/ (function(module) { /** * 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; } module.exports = baseSortBy; /***/ }), /***/ "./node_modules/lodash/_baseTimes.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseTimes.js ***! \*******************************************/ /***/ (function(module) { /** * 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); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; /***/ }), /***/ "./node_modules/lodash/_baseToString.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseToString.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * 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; } 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"); /** Used to match leading whitespace. */ var reTrimStart = /^\s+/; /** * 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; } module.exports = baseTrim; /***/ }), /***/ "./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); }; } module.exports = baseUnary; /***/ }), /***/ "./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); } 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; } module.exports = baseUniq; /***/ }), /***/ "./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/lodash/_baseZipObject.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseZipObject.js ***! \***********************************************/ /***/ (function(module) { /** * 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; /***/ }), /***/ "./node_modules/lodash/_castFunction.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_castFunction.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; } module.exports = castFunction; /***/ }), /***/ "./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; /***/ }), /***/ "./node_modules/lodash/_cloneArrayBuffer.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_cloneArrayBuffer.js ***! \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"); /** * 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; } module.exports = cloneArrayBuffer; /***/ }), /***/ "./node_modules/lodash/_cloneBuffer.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneBuffer.js ***! \*********************************************/ /***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.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, allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; /** * 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); buffer.copy(result); return result; } module.exports = cloneBuffer; /***/ }), /***/ "./node_modules/lodash/_cloneDataView.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_cloneDataView.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); /** * 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); } module.exports = cloneDataView; /***/ }), /***/ "./node_modules/lodash/_cloneRegExp.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneRegExp.js ***! \*********************************************/ /***/ (function(module) { /** 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; } module.exports = cloneRegExp; /***/ }), /***/ "./node_modules/lodash/_cloneSymbol.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneSymbol.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * 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)) : {}; } module.exports = cloneSymbol; /***/ }), /***/ "./node_modules/lodash/_cloneTypedArray.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_cloneTypedArray.js ***! \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /***/ }), /***/ "./node_modules/lodash/_compareAscending.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_compareAscending.js ***! \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** * 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); var othIsDefined = other !== undefined, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); 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; } } return 0; } module.exports = compareAscending; /***/ }), /***/ "./node_modules/lodash/_compareMultiple.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_compareMultiple.js ***! \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; 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; /***/ }), /***/ "./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; /***/ }), /***/ "./node_modules/lodash/_copyObject.js": /*!********************************************!*\ !*** ./node_modules/lodash/_copyObject.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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 index = -1, length = props.length; while (++index < length) { var key = props[index]; 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; } module.exports = copyObject; /***/ }), /***/ "./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"); /** * 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); } module.exports = copySymbols; /***/ }), /***/ "./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"); /** * 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); } module.exports = copySymbolsIn; /***/ }), /***/ "./node_modules/lodash/_coreJsData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_coreJsData.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** 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; customizer = (assigner.length > 3 && typeof customizer == 'function') ? (length--, customizer) : undefined; 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; }); } module.exports = createAssigner; /***/ }), /***/ "./node_modules/lodash/_createBaseEach.js": /*!************************************************!*\ !*** ./node_modules/lodash/_createBaseEach.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** * 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); while ((fromRight ? index-- : ++index < length)) { if (iteratee(iterable[index], index, iterable) === false) { break; } } return collection; }; } module.exports = createBaseEach; /***/ }), /***/ "./node_modules/lodash/_createBaseFor.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_createBaseFor.js ***! \***********************************************/ /***/ (function(module) { /** * 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; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } module.exports = createBaseFor; /***/ }), /***/ "./node_modules/lodash/_createFind.js": /*!********************************************!*\ !*** ./node_modules/lodash/_createFind.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** * 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; }; } module.exports = createFind; /***/ }), /***/ "./node_modules/lodash/_createRange.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_createRange.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** * 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); } step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); return baseRange(start, end, step, fromRight); }; } module.exports = createRange; /***/ }), /***/ "./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"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * 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); }; module.exports = createSet; /***/ }), /***/ "./node_modules/lodash/_defineProperty.js": /*!************************************************!*\ !*** ./node_modules/lodash/_defineProperty.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }), /***/ "./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; /** * 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 (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; } 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]; 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; } module.exports = equalArrays; /***/ }), /***/ "./node_modules/lodash/_equalByTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_equalByTag.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** `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; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **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`. */ 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; // 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; case symbolTag: if (symbolValueOf) { return symbolValueOf.call(object) == symbolValueOf.call(other); } } return false; } module.exports = equalByTag; /***/ }), /***/ "./node_modules/lodash/_equalObjects.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_equalObjects.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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`. */ 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; if (objLength != othLength && !isPartial) { return false; } 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 skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; 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; // 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; } module.exports = equalObjects; /***/ }), /***/ "./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"); /** * 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. */ function flatRest(func) { return setToString(overRest(func, undefined, flatten), func + ''); } module.exports = flatRest; /***/ }), /***/ "./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/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/lodash/_getAllKeysIn.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /***/ }), /***/ "./node_modules/lodash/_getMapData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getMapData.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; } module.exports = getMapData; /***/ }), /***/ "./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; while (length--) { var key = result[length], value = object[key]; result[length] = [key, value, isStrictComparable(value)]; } return result; } module.exports = getMatchData; /***/ }), /***/ "./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"); /** * 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; /***/ }), /***/ "./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); module.exports = getPrototype; /***/ }), /***/ "./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"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** 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 nativeObjectToString = objectProto.toString; /** 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; } module.exports = getRawTag; /***/ }), /***/ "./node_modules/lodash/_getSymbols.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getSymbols.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* 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); }); }; module.exports = getSymbols; /***/ }), /***/ "./node_modules/lodash/_getSymbolsIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getSymbolsIn.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; }; module.exports = getSymbolsIn; /***/ }), /***/ "./node_modules/lodash/_getTag.js": /*!****************************************!*\ !*** ./node_modules/lodash/_getTag.js ***! \****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; 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) : ''; 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; /***/ }), /***/ "./node_modules/lodash/_getValue.js": /*!******************************************!*\ !*** ./node_modules/lodash/_getValue.js ***! \******************************************/ /***/ (function(module) { /** * 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; /***/ }), /***/ "./node_modules/lodash/_hasPath.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hasPath.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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)); } module.exports = hasPath; /***/ }), /***/ "./node_modules/lodash/_hasUnicode.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hasUnicode.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 rsZWJ = '\\u200d'; /** 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 + ']'); /** * 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); } module.exports = hasUnicode; /***/ }), /***/ "./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"); /** * 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/lodash/_hashDelete.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hashDelete.js ***! \********************************************/ /***/ (function(module) { /** * 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; } module.exports = hashDelete; /***/ }), /***/ "./node_modules/lodash/_hashGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashGet.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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 hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; /***/ }), /***/ "./node_modules/lodash/_hashHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashHas.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** 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 = hashHas; /***/ }), /***/ "./node_modules/lodash/_hashSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashSet.js ***! \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * 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 = hashSet; /***/ }), /***/ "./node_modules/lodash/_initCloneArray.js": /*!************************************************!*\ !*** ./node_modules/lodash/_initCloneArray.js ***! \************************************************/ /***/ (function(module) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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); // Add properties assigned by `RegExp#exec`. if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { result.index = array.index; result.input = array.input; } return result; } module.exports = initCloneArray; /***/ }), /***/ "./node_modules/lodash/_initCloneByTag.js": /*!************************************************!*\ !*** ./node_modules/lodash/_initCloneByTag.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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]'; 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]'; /** * 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); case boolTag: case dateTag: return new Ctor(+object); case dataViewTag: return cloneDataView(object, isDeep); case float32Tag: case float64Tag: case int8Tag: case int16Tag: case int32Tag: case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: return cloneTypedArray(object, isDeep); case mapTag: return new Ctor; case numberTag: case stringTag: return new Ctor(object); case regexpTag: return cloneRegExp(object); case setTag: return new Ctor; case symbolTag: return cloneSymbol(object); } } module.exports = initCloneByTag; /***/ }), /***/ "./node_modules/lodash/_initCloneObject.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_initCloneObject.js ***! \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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"); /** * Initializes an object clone. * * @private * @param {Object} object The object to clone. * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { return (typeof object.constructor == 'function' && !isPrototype(object)) ? baseCreate(getPrototype(object)) : {}; } module.exports = initCloneObject; /***/ }), /***/ "./node_modules/lodash/_isFlattenable.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_isFlattenable.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /** * 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]); } module.exports = isFlattenable; /***/ }), /***/ "./node_modules/lodash/_isIndex.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_isIndex.js ***! \*****************************************/ /***/ (function(module) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * 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; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; /***/ }), /***/ "./node_modules/lodash/_isIterateeCall.js": /*!************************************************!*\ !*** ./node_modules/lodash/_isIterateeCall.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; } module.exports = isIterateeCall; /***/ }), /***/ "./node_modules/lodash/_isKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_isKey.js ***! \***************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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/lodash/_isKeyable.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_isKeyable.js ***! \*******************************************/ /***/ (function(module) { /** * 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`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; /***/ }), /***/ "./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"); /** 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); } module.exports = isMasked; /***/ }), /***/ "./node_modules/lodash/_isPrototype.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_isPrototype.js ***! \*********************************************/ /***/ (function(module) { /** 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; return value === proto; } module.exports = isPrototype; /***/ }), /***/ "./node_modules/lodash/_isStrictComparable.js": /*!****************************************************!*\ !*** ./node_modules/lodash/_isStrictComparable.js ***! \****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /***/ }), /***/ "./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; /***/ }), /***/ "./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"); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * 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); 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; } module.exports = listCacheDelete; /***/ }), /***/ "./node_modules/lodash/_listCacheGet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheGet.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; /***/ }), /***/ "./node_modules/lodash/_listCacheHas.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheHas.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.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; /***/ }), /***/ "./node_modules/lodash/_listCacheSet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheSet.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; /***/ }), /***/ "./node_modules/lodash/_mapCacheClear.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_mapCacheClear.js ***! \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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 }; } module.exports = mapCacheClear; /***/ }), /***/ "./node_modules/lodash/_mapCacheDelete.js": /*!************************************************!*\ !*** ./node_modules/lodash/_mapCacheDelete.js ***! \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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/lodash/_mapCacheGet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheGet.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * 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); } module.exports = mapCacheGet; /***/ }), /***/ "./node_modules/lodash/_mapCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheHas.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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/lodash/_mapCacheSet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheSet.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * 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/lodash/_mapToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_mapToArray.js ***! \********************************************/ /***/ (function(module) { /** * 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); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } module.exports = mapToArray; /***/ }), /***/ "./node_modules/lodash/_matchesStrictComparable.js": /*!*********************************************************!*\ !*** ./node_modules/lodash/_matchesStrictComparable.js ***! \*********************************************************/ /***/ (function(module) { /** * 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))); }; } module.exports = matchesStrictComparable; /***/ }), /***/ "./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"); /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * 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; }); var cache = result.cache; return result; } module.exports = memoizeCapped; /***/ }), /***/ "./node_modules/lodash/_nativeCreate.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeCreate.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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'); module.exports = nativeCreate; /***/ }), /***/ "./node_modules/lodash/_nativeKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_nativeKeys.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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); module.exports = nativeKeys; /***/ }), /***/ "./node_modules/lodash/_nativeKeysIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeKeysIn.js ***! \**********************************************/ /***/ (function(module) { /** * 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 result; } module.exports = nativeKeysIn; /***/ }), /***/ "./node_modules/lodash/_nodeUtil.js": /*!******************************************!*\ !*** ./node_modules/lodash/_nodeUtil.js ***! \******************************************/ /***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.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; /** 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; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; /***/ }), /***/ "./node_modules/lodash/_objectToString.js": /*!************************************************!*\ !*** ./node_modules/lodash/_objectToString.js ***! \************************************************/ /***/ (function(module) { /** 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; /** * 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/lodash/_overArg.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_overArg.js ***! \*****************************************/ /***/ (function(module) { /** * 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; /***/ }), /***/ "./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"); /* 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); 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); }; } module.exports = overRest; /***/ }), /***/ "./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"); /** 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')(); module.exports = root; /***/ }), /***/ "./node_modules/lodash/_safeGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_safeGet.js ***! \*****************************************/ /***/ (function(module) { /** * 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; } return object[key]; } module.exports = safeGet; /***/ }), /***/ "./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__'; /** * 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; } module.exports = setCacheAdd; /***/ }), /***/ "./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; /***/ }), /***/ "./node_modules/lodash/_setToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_setToArray.js ***! \********************************************/ /***/ (function(module) { /** * 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); set.forEach(function(value) { result[++index] = value; }); return result; } module.exports = setToArray; /***/ }), /***/ "./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"); /** * 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); module.exports = setToString; /***/ }), /***/ "./node_modules/lodash/_shortOut.js": /*!******************************************!*\ !*** ./node_modules/lodash/_shortOut.js ***! \******************************************/ /***/ (function(module) { /** 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; /** * 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. */ function shortOut(func) { var count = 0, lastCalled = 0; 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); }; } 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"); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; /***/ }), /***/ "./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; /***/ }), /***/ "./node_modules/lodash/_stackGet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackGet.js ***! \******************************************/ /***/ (function(module) { /** * 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. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; /***/ }), /***/ "./node_modules/lodash/_stackHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackHas.js ***! \******************************************/ /***/ (function(module) { /** * 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`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; /***/ }), /***/ "./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; /** * 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. */ 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; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; /***/ }), /***/ "./node_modules/lodash/_strictIndexOf.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_strictIndexOf.js ***! \***********************************************/ /***/ (function(module) { /** * 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"); /** * 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); } module.exports = stringSize; /***/ }), /***/ "./node_modules/lodash/_stringToPath.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_stringToPath.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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; /** * 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; }); module.exports = stringToPath; /***/ }), /***/ "./node_modules/lodash/_toKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_toKey.js ***! \***************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * 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; } module.exports = toKey; /***/ }), /***/ "./node_modules/lodash/_toSource.js": /*!******************************************!*\ !*** ./node_modules/lodash/_toSource.js ***! \******************************************/ /***/ (function(module) { /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * 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 ''; } module.exports = toSource; /***/ }), /***/ "./node_modules/lodash/_trimmedEndIndex.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_trimmedEndIndex.js ***! \*************************************************/ /***/ (function(module) { /** Used to match a single whitespace character. */ var reWhitespace = /\s/; /** * 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; while (index-- && reWhitespace.test(string.charAt(index))) {} return index; } module.exports = trimmedEndIndex; /***/ }), /***/ "./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'); /** * 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; } return result; } module.exports = unicodeSize; /***/ }), /***/ "./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; /** * 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 }]; * * var shallow = _.clone(objects); * console.log(shallow[0] === objects[0]); * // => true */ function clone(value) { return baseClone(value, CLONE_SYMBOLS_FLAG); } module.exports = clone; /***/ }), /***/ "./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; /** * 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); } module.exports = cloneDeep; /***/ }), /***/ "./node_modules/lodash/constant.js": /*!*****************************************!*\ !*** ./node_modules/lodash/constant.js ***! \*****************************************/ /***/ (function(module) { /** * 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; }; } module.exports = constant; /***/ }), /***/ "./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; /** * 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; if (guard && isIterateeCall(sources[0], sources[1], guard)) { length = 1; } while (++index < length) { var source = sources[index]; var props = keysIn(source); var propsIndex = -1; var propsLength = props.length; 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; /***/ }), /***/ "./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/lodash/eq.js": /*!***********************************!*\ !*** ./node_modules/lodash/eq.js ***! \***********************************/ /***/ (function(module) { /** * 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 */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; /***/ }), /***/ "./node_modules/lodash/filter.js": /*!***************************************!*\ !*** ./node_modules/lodash/filter.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"); /** * 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)); } module.exports = filter; /***/ }), /***/ "./node_modules/lodash/find.js": /*!*************************************!*\ !*** ./node_modules/lodash/find.js ***! \*************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var createFind = __webpack_require__(/*! ./_createFind */ "./node_modules/lodash/_createFind.js"), findIndex = __webpack_require__(/*! ./findIndex */ "./node_modules/lodash/findIndex.js"); /** * 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' * * // The `_.property` iteratee shorthand. * _.find(users, 'active'); * // => object for 'barney' */ var find = createFind(findIndex); module.exports = find; /***/ }), /***/ "./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; /** * This method is like `_.find` except that it returns the index of the first * element `predicate` returns truthy for instead of the element itself. * * @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 * * 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 */ 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 baseFindIndex(array, baseIteratee(predicate, 3), index); } module.exports = findIndex; /***/ }), /***/ "./node_modules/lodash/flatten.js": /*!****************************************!*\ !*** ./node_modules/lodash/flatten.js ***! \****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"); /** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.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; /***/ }), /***/ "./node_modules/lodash/forEach.js": /*!****************************************!*\ !*** ./node_modules/lodash/forEach.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"); /** * 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). */ function forEach(collection, iteratee) { var func = isArray(collection) ? arrayEach : baseEach; return func(collection, castFunction(iteratee)); } module.exports = forEach; /***/ }), /***/ "./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"); /** * 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; * * _.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/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 * * _.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; } module.exports = get; /***/ }), /***/ "./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"); /** * 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 * * _.has(other, 'a'); * // => false */ function has(object, path) { return object != null && hasPath(object, path, baseHas); } module.exports = has; /***/ }), /***/ "./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"); /** * 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 * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } module.exports = hasIn; /***/ }), /***/ "./node_modules/lodash/identity.js": /*!*****************************************!*\ !*** ./node_modules/lodash/identity.js ***! \*****************************************/ /***/ (function(module) { /** * 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 identity(value) { return value; } module.exports = identity; /***/ }), /***/ "./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; /** * 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 * * _.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'); }; module.exports = isArguments; /***/ }), /***/ "./node_modules/lodash/isArray.js": /*!****************************************!*\ !*** ./node_modules/lodash/isArray.js ***! \****************************************/ /***/ (function(module) { /** * 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 * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }), /***/ "./node_modules/lodash/isArrayLike.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArrayLike.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"); /** * 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 * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } 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 * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } 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 * * _.isBuffer(new Uint8Array(2)); * // => false */ 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]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * 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`. * * @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 * * _.isEmpty(null); * // => true * * _.isEmpty(true); * // => true * * _.isEmpty(1); * // => true * * _.isEmpty([1, 2, 3]); * // => false * * _.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; /***/ }), /***/ "./node_modules/lodash/isFunction.js": /*!*******************************************!*\ !*** ./node_modules/lodash/isFunction.js ***! \*******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 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]'; /** * 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 */ 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; /***/ }), /***/ "./node_modules/lodash/isLength.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isLength.js ***! \*****************************************/ /***/ (function(module) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @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 * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } 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. * * @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 * * _.isMap(new Map); * // => true * * _.isMap(new WeakMap); * // => false */ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; module.exports = isMap; /***/ }), /***/ "./node_modules/lodash/isObject.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isObject.js ***! \*****************************************/ /***/ (function(module) { /** * 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 */ function isObject(value) { var type = typeof value; return value != null && (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". * * @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 */ function isObjectLike(value) { return value != null && 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`. * * @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 * * function Foo() { * this.a = 1; * } * * _.isPlainObject(new Foo); * // => false * * _.isPlainObject([1, 2, 3]); * // => false * * _.isPlainObject({ 'x': 0, 'y': 0 }); * // => true * * _.isPlainObject(Object.create(null)); * // => true */ function isPlainObject(value) { if (!isObjectLike(value) || baseGetTag(value) != objectTag) { return false; } 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/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. * * @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 * * _.isSet(new Set); * // => true * * _.isSet(new WeakSet); * // => false */ 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"); /** `Object#toString` result references. */ var stringTag = '[object String]'; /** * Checks if `value` is classified as a `String` primitive or object. * * @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 * * _.isString('abc'); * // => true * * _.isString(1); * // => false */ function isString(value) { return typeof value == 'string' || (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); } 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. * * @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) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }), /***/ "./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; /** * 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 * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; /***/ }), /***/ "./node_modules/lodash/isUndefined.js": /*!********************************************!*\ !*** ./node_modules/lodash/isUndefined.js ***! \********************************************/ /***/ (function(module) { /** * 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 * * _.isUndefined(null); * // => false */ function isUndefined(value) { return value === undefined; } module.exports = isUndefined; /***/ }), /***/ "./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"); /** * 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); } 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"); /** * 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; * * _.keysIn(new Foo); * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ function keysIn(object) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } module.exports = keysIn; /***/ }), /***/ "./node_modules/lodash/last.js": /*!*************************************!*\ !*** ./node_modules/lodash/last.js ***! \*************************************/ /***/ (function(module) { /** * 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; } module.exports = last; /***/ }), /***/ "./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"); /** * 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)); } module.exports = map; /***/ }), /***/ "./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"); /** * 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) * * // 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); baseForOwn(object, function(value, key, object) { baseAssignValue(result, key, iteratee(value, key, object)); }); return result; } module.exports = mapValues; /***/ }), /***/ "./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"); /** * 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 * * _.max([]); * // => undefined */ function max(array) { return (array && array.length) ? baseExtremum(array, identity, baseGt) : undefined; } module.exports = max; /***/ }), /***/ "./node_modules/lodash/memoize.js": /*!****************************************!*\ !*** ./node_modules/lodash/memoize.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'; /** * 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'] * * // 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; 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; } // Expose `MapCache`. memoize.Cache = MapCache; module.exports = memoize; /***/ }), /***/ "./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"); /** * 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 }] * }; * * _.merge(object, other); * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } */ var merge = createAssigner(function(object, source, srcIndex) { baseMerge(object, source, srcIndex); }); module.exports = merge; /***/ }), /***/ "./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"); /** * 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 * * _.min([]); * // => undefined */ function min(array) { return (array && array.length) ? baseExtremum(array, identity, baseLt) : undefined; } module.exports = min; /***/ }), /***/ "./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"); /** * 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 } * * // The `_.property` iteratee shorthand. * _.minBy(objects, 'n'); * // => { 'n': 1 } */ function minBy(array, iteratee) { return (array && array.length) ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) : undefined; } module.exports = minBy; /***/ }), /***/ "./node_modules/lodash/noop.js": /*!*************************************!*\ !*** ./node_modules/lodash/noop.js ***! \*************************************/ /***/ (function(module) { /** * This method returns `undefined`. * * @static * @memberOf _ * @since 2.3.0 * @category Util * @example * * _.times(2, _.noop); * // => [undefined, undefined] */ function noop() { // No operation performed. } module.exports = noop; /***/ }), /***/ "./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"); /** * 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"); /** * 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 }; * * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ var pick = flatRest(function(object, paths) { return object == null ? {} : basePick(object, paths); }); module.exports = pick; /***/ }), /***/ "./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"); /** * 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] * * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); * // => [1, 2] */ function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } module.exports = property; /***/ }), /***/ "./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"); /** * 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] * * _.range(0); * // => [] */ var range = createRange(); module.exports = range; /***/ }), /***/ "./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"); /** * 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 * * _.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; return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach); } module.exports = reduce; /***/ }), /***/ "./node_modules/lodash/size.js": /*!*************************************!*\ !*** ./node_modules/lodash/size.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"); /** `Object#toString` result references. */ var mapTag = '[object Map]', setTag = '[object Set]'; /** * 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 * * _.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; /***/ }), /***/ "./node_modules/lodash/sortBy.js": /*!***************************************!*\ !*** ./node_modules/lodash/sortBy.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"); /** * 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]] * * _.sortBy(users, ['user', 'age']); * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] */ 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), []); }); module.exports = sortBy; /***/ }), /***/ "./node_modules/lodash/stubArray.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubArray.js ***! \******************************************/ /***/ (function(module) { /** * 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); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; /***/ }), /***/ "./node_modules/lodash/stubFalse.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubFalse.js ***! \******************************************/ /***/ (function(module) { /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; /***/ }), /***/ "./node_modules/lodash/toFinite.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toFinite.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; /** * 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 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; } return value === value ? value : 0; } module.exports = toFinite; /***/ }), /***/ "./node_modules/lodash/toInteger.js": /*!******************************************!*\ !*** ./node_modules/lodash/toInteger.js ***! \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); /** * 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 */ function toInteger(value) { var result = toFinite(value), remainder = result % 1; return result === result ? (remainder ? result - remainder : result) : 0; } module.exports = toInteger; /***/ }), /***/ "./node_modules/lodash/toNumber.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toNumber.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; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; /** * 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 */ 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; /***/ }), /***/ "./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"); /** * 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 } * * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); * // => { 'a': 1, 'b': 2, 'c': 3 } */ function toPlainObject(value) { return copyObject(value, keysIn(value)); } module.exports = toPlainObject; /***/ }), /***/ "./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"); /** * 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' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }), /***/ "./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"); /** * 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] * * _.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); 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 = {}; } } (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { return iteratee(accumulator, value, index, object); }); return accumulator; } module.exports = transform; /***/ }), /***/ "./node_modules/lodash/union.js": /*!**************************************!*\ !*** ./node_modules/lodash/union.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"); /** * 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 * * _.union([2], [1, 2]); * // => [2, 1] */ 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"); /** Used to generate unique IDs. */ var idCounter = 0; /** * 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; } module.exports = uniqueId; /***/ }), /***/ "./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 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) * * _.values('hi'); * // => ['h', 'i'] */ function values(object) { return object == null ? [] : baseValues(object, keys(object)); } module.exports = values; /***/ }), /***/ "./node_modules/lodash/zipObject.js": /*!******************************************!*\ !*** ./node_modules/lodash/zipObject.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"); /** * 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 * * _.zipObject(['a', 'b'], [1, 2]); * // => { 'a': 1, 'b': 2 } */ function zipObject(props, values) { return baseZipObject(props || [], values || [], assignValue); } module.exports = zipObject; /***/ }), /***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": /*!*************************************************************!*\ !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.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. */ var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; module.exports = ReactPropTypesSecret; /***/ }), /***/ "./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"); /** * 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 * * const equals3 = R.equals(3); * R.all(equals3)([3, 3, 3, 3]); //=> true * R.all(equals3)([3, 3, 1, 3]); //=> false */ 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/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"); /** * 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 * * const t = R.always('Tee'); * t(); //=> 'Tee' */ 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"] = (always); /***/ }), /***/ "./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"); /** * 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 * * 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 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/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_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"); /** * 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.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 * * 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.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 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"] = (ap); /***/ }), /***/ "./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_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"); /** * Returns a new list containing the contents of the given list, followed by * the given element. * * @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 * @example * * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests'] * R.append('tests', []); //=> ['tests'] * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] */ 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"] = (append); /***/ }), /***/ "./node_modules/ramda/es/assoc.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_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"); /** * 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.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 * * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3} */ 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); /***/ }), /***/ "./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_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"); 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); } /** * 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_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"] = (assocPath); /***/ }), /***/ "./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"); /** * 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.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 * * 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 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"] = (bind); /***/ }), /***/ "./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_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"); /** * 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. * * 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 Object * @sig {*} -> {*} * @param {*} value The object or array to clone * @return {*} A deeply cloned copy of `val` * @example * * const objects = [{}, {}, {}]; * const objectsClone = R.clone(objects); * objects === objectsClone; //=> false * objects[0] === objectsClone[0]; //=> false */ 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/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_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** * Makes a comparator function out of a function that reports whether the first * element is less than the second. * * @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` * @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 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); /***/ }), /***/ "./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_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"); /** * 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`. * * @example * * R.concat('ABC', 'DEF'); // 'ABCDEF' * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] * R.concat([], []); //=> [] */ 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); } 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"] = (concat); /***/ }), /***/ "./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_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"); /** * 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.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 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" * * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b)) */ 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"] = (converge); /***/ }), /***/ "./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"); /** * 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.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 * * 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 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"] = (curryN); /***/ }), /***/ "./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"); /** * Returns the second argument if it is not `null`, `undefined` or `NaN`; * otherwise the first argument is returned. * * @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 * @example * * const defaultTo42 = R.defaultTo(42); * * 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/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 _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); /** * 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 [*] -> [*] -> [*] * @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.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 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/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_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"); /** * Returns a new object that does not contain a `prop` property. * * @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 * @example * * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3} */ 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_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"); /** * 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; } /** * 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.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.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}} */ 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"] = (dissocPath); /***/ }), /***/ "./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_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"); /** * 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). * * Dispatches to the `empty` method of the first argument, if present. * * @func * @memberOf R * @since v0.3.0 * @category Function * @sig a -> a * @param {*} x * @return {*} * @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 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"] = (empty); /***/ }), /***/ "./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"); /** * 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.15.0 * @category Relation * @sig a -> b -> Boolean * @param {*} a * @param {*} b * @return {Boolean} * @example * * 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 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); /***/ }), /***/ "./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 _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"); 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); } /** * 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.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. * @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} */ 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"] = (evolve); /***/ }), /***/ "./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 _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"); /** * 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.1.0 * @category List * @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 * @example * * 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 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/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"); /** * 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.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 * * 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 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); /***/ }), /***/ "./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"); /** * 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.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 * * 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 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/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_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"); /** * 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.1.0 * @category List * @sig [a] -> [b] * @param {Array} list The array to consider. * @return {Array} The flattened list. * @see R.unnest * @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] */ 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/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_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"); /** * 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.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 * * 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 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/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"); /** * 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.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. * @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} */ 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/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 _reduceBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.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. * * Acts as a transducer if a transformer is given in list position. * * @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 * @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}] * // } */ 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/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"); /** * Returns whether or not an object has an own property with the specified name * * @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. * @example * * const hasName = R.has('name'); * hasName({name: 'alice'}); //=> true * hasName({name: 'bob'}); //=> true * hasName({}); //=> false * * const point = {x: 0, y: 0}; * const pointHas = R.has(R.__, point); * pointHas('x'); //=> true * pointHas('y'); //=> true * pointHas('z'); //=> false */ 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); /***/ }), /***/ "./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_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"); /** * Returns whether or not a path exists in an object. Only the object's * own properties are checked. * * @func * @memberOf R * @since v0.26.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 * @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 */ 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"] = (hasPath); /***/ }), /***/ "./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_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"); /** * A function that does nothing but return the parameter supplied to it. Good * as a default or placeholder function. * * @func * @memberOf R * @since v0.1.0 * @category Function * @sig a -> a * @param {*} x The value to return. * @return {*} The input value, `x`. * @example * * R.identity(1); //=> 1 * * const obj = {}; * R.identity(obj) === obj; //=> true * @symb R.identity(a) = a */ 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/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"); /** * 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 * * 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 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/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_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"); /** * 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 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"] = (indexOf); /***/ }), /***/ "./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_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); /** * 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.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] */ 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"); 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); } 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/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 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.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'); } } /***/ }), /***/ "./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/_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 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"); /** * 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_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/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"); /** * 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. */ 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/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 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"); 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); } /** * 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. */ 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. if (_isPrimitive(value)) { return value; } 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(Array(value.length)); 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; } } 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]; } } }; return _ObjectMap; }(); /***/ }), /***/ "./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 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/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 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); }; } /***/ }), /***/ "./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 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; } /***/ }), /***/ "./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 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 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/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 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"); /** * Optimized internal one-arity curry function. * * @private * @category Function * @param {Function} fn The function to curry. * @return {Function} The curried function. */ 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); } }; } /***/ }), /***/ "./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 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"); /** * Optimized internal two-arity curry function. * * @private * @category Function * @param {Function} fn The function to curry. * @return {Function} The curried function. */ 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/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 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"); /** * Optimized internal three-arity curry function. * * @private * @category Function * @param {Function} fn The function to curry. * @return {Function} The curried function. */ 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/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 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"); /** * Internal curryN function. * * @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; 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/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 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"); /** * 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); } } return fn.apply(this, arguments); }; } /***/ }), /***/ "./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"); /** * 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 */ 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/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 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"); 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); } /** * private _uniqContentEquals function. * That function is checking equality of 2 iterator contents with 2 assumptions * - iterators lengths are the same * - iterators values are unique * * 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] * */ 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; } 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/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 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; } return result; } /***/ }), /***/ "./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 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/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 */ _has; } /* harmony export */ }); function _has(prop, obj) { return Object.prototype.hasOwnProperty.call(obj, prop); } /***/ }), /***/ "./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 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; } /***/ }), /***/ "./node_modules/ramda/es/internal/_includesWith.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_includesWith.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 */ _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; } return false; } /***/ }), /***/ "./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 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 _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); } 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 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 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/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__) { "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__) { "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"); 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); } /** * 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 */ 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__) { "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__) { "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; }); /***/ }), /***/ "./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 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 _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); } function _isPlaceholder(a) { return a != null && _typeof(a) === 'object' && a['@@functional/placeholder'] === true; } /***/ }), /***/ "./node_modules/ramda/es/internal/_isString.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_isString.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 */ _isString; } /* harmony export */ }); function _isString(x) { return Object.prototype.toString.call(x) === '[object String]'; } /***/ }), /***/ "./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 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 */ }); /** * 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]'; } /***/ }), /***/ "./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 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"); /** * `_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; }; } /***/ }), /***/ "./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; } /***/ }), /***/ "./node_modules/ramda/es/internal/_nth.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/internal/_nth.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 */ _nth; } /* harmony export */ }); /* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); function _nth(offset, list) { var idx = offset < 0 ? list.length + offset : offset; return (0,_isString_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list) ? list.charAt(idx) : list[idx]; } /***/ }), /***/ "./node_modules/ramda/es/internal/_objectAssign.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_objectAssign.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"); // 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__) { "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/_path.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/internal/_path.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 */ _path; } /* 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 _nth_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_nth.js */ "./node_modules/ramda/es/internal/_nth.js"); function _path(pathAr, obj) { var val = obj; for (var i = 0; i < pathAr.length; i += 1) { if (val == null) { return undefined; } var p = pathAr[i]; if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_0__["default"])(p)) { val = (0,_nth_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p, val); } else { val = val[p]; } } return val; } /***/ }), /***/ "./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, '\\"') + '"'; } /***/ }), /***/ "./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 _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"); function _iterableReduce(reducer, acc, iter) { var step = iter.next(); while (!step.done) { acc = reducer(acc, step.value); step = iter.next(); } 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/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 }; } /***/ }), /***/ "./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__); /** * 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); /***/ }), /***/ "./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 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"); 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); } 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_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/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 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; } return xf['@@transducer/result'](acc); } /***/ }), /***/ "./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 _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"); 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/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 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"); 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/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 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); }; } /***/ }), /***/ "./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); } }); /***/ }), /***/ "./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"); 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/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 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"); 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/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 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"); 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/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 _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); 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/_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 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"); 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_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/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 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"); 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); }; } /***/ }), /***/ "./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 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/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_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"); /** * 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] */ 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/invoker.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/invoker.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_2__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); /* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __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"); /** * 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) */ var invoker = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function invoker(arity, method) { return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arity + 1, function () { var target = arguments[arity]; if (target != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__["default"])(target[method])) { return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity)); } 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); /***/ }), /***/ "./node_modules/ramda/es/is.js": /*!*************************************!*\ !*** ./node_modules/ramda/es/is.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"); 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); } /** * 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); /***/ }), /***/ "./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_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"); /** * 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, R.isNotEmpty * @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 */ 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"] = (isEmpty); /***/ }), /***/ "./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_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 */ 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); /***/ }), /***/ "./node_modules/ramda/es/join.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/join.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"); /** * 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); /***/ }), /***/ "./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 _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); /***/ }), /***/ "./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_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; }; /** * 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_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"] = (keys); /***/ }), /***/ "./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 _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.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. * * @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 * @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} */ 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); /***/ }), /***/ "./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_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 _internal_path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_path.js */ "./node_modules/ramda/es/internal/_path.js"); /** * Returns a lens whose focus is the specified path. * * @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 * @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}]} */ var lensPath = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lensPath(p) { return (0,_lens_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (val) { return (0,_internal_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, val); }, (0,_assocPath_js__WEBPACK_IMPORTED_MODULE_3__["default"])(p)); }); /* harmony default export */ __webpack_exports__["default"] = (lensPath); /***/ }), /***/ "./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_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 the second; `false` * otherwise. * * @func * @memberOf R * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> Boolean * @param {*} a * @param {*} b * @return {Boolean} * @see R.gt * @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 */ 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"] = (lt); /***/ }), /***/ "./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 _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"); /** * 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. * * 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.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 * @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) */ 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/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"); /** * 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.9.0 * @category Object * @sig ((*, String, Object) -> *) -> Object -> Object * @param {Function} fn * @param {Object} obj * @return {Object} * @see R.map * @example * * const xyz = { x: 1, y: 2, z: 3 }; * const prependKeyAndDouble = (num, key, obj) => key + (num * 2); * * R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' } */ 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"] = (mapObjIndexed); /***/ }), /***/ "./node_modules/ramda/es/max.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 _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"); 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 larger of its two arguments. * * @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 * @example * * R.max(789, 123); //=> 789 * R.max('a', 'b'); //=> 'b' */ 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/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_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"); /** * 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.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) * * withAge({birth: 1921, death: 1999}); * //=> {birth: 1921, death: 1999, age: 78} (returned from cache) */ 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"] = (memoizeWith); /***/ }), /***/ "./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 _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 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/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 _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"); /** * 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.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 * * 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 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"] = (mergeDeepWithKey); /***/ }), /***/ "./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_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"); /** * 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.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.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} */ 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/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"); /** * 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.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.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} */ 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/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_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"); /** * 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.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.mergeWith(R.concat, * { a: true, values: [10, 20] }, * { b: true, values: [15, 35] }); * //=> { a: true, b: true, values: [10, 20, 15, 35] } */ 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); /***/ }), /***/ "./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_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"); /** * 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.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 * * 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 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 result; }); /* harmony default export */ __webpack_exports__["default"] = (mergeWithKey); /***/ }), /***/ "./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} */ 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/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_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"); /** * 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_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"] = (once); /***/ }), /***/ "./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 _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)); } }; }; /** * 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/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 _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"); /** * 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_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/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 _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /* harmony import */ var _internal_path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_path.js */ "./node_modules/ramda/es/internal/_path.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 * * 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 path = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_path_js__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ __webpack_exports__["default"] = (path); /***/ }), /***/ "./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_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); /* harmony import */ var _internal_path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_path.js */ "./node_modules/ramda/es/internal/_path.js"); /* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.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 * * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A" */ 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,_internal_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj)); }); /* harmony default export */ __webpack_exports__["default"] = (pathOr); /***/ }), /***/ "./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 * * 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 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"] = (pick); /***/ }), /***/ "./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 _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); /***/ }), /***/ "./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_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"); /** * 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] */ 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); /***/ }), /***/ "./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_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"); /** * 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'] */ 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"] = (prepend); /***/ }), /***/ "./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_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 _internal_nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_nth.js */ "./node_modules/ramda/es/internal/_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,_internal_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj) : obj[p]; }); /* harmony default export */ __webpack_exports__["default"] = (prop); /***/ }), /***/ "./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_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"); /** * 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] */ 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"] = (propEq); /***/ }), /***/ "./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_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); /** * 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' */ var props = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function props(ps, obj) { return ps.map(function (p) { return (0,_prop_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p, obj); }); }); /* harmony default export */ __webpack_exports__["default"] = (props); /***/ }), /***/ "./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_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"); /** * 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) */ 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); /***/ }), /***/ "./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_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"); /** * 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"]} */ 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/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 _filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); /** * 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_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"] = (reject); /***/ }), /***/ "./node_modules/ramda/es/remove.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_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] */ 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); /***/ }), /***/ "./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_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(''); //=> '' */ 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/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_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"); /** * 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_1__["default"])(lens, (0,_always_js__WEBPACK_IMPORTED_MODULE_2__["default"])(v), x); }); /* harmony default export */ __webpack_exports__["default"] = (set); /***/ }), /***/ "./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 _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 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.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 {*} * @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' */ 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/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_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. * * @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 * @example * * const diff = function(a, b) { return a - b; }; * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] */ 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/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 _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"); /** * Checks if a list starts with the provided sublist. * * Similarly, checks if a string starts with the provided substring. * * @func * @memberOf R * @since v0.24.0 * @category List * @sig [a] -> [a] -> Boolean * @sig String -> String -> Boolean * @param {*} prefix * @param {*} list * @return {Boolean} * @see R.endsWith * @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 */ 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/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_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. * * @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 * @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' * ]; * * 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 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/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_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"); /** * 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.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.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]] */ 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/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_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"); /** * 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.14.0 * @category String * @sig * -> String * @param {*} val * @return {String} * @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")' */ 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"] = (toString); /***/ }), /***/ "./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_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.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'. * * @func * @memberOf R * @since v0.8.0 * @category Type * @sig * -> String * @param {*} val The value to test * @return {String} * @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(async () => {}); //=> "AsyncFunction" * R.type(undefined); //=> "Undefined" * R.type(BigInt(123)); //=> "BigInt" */ 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"] = (type); /***/ }), /***/ "./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 _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 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.1.0 * @category List * @sig [a] -> [a] * @param {Array} list The array to consider. * @return {Array} The list of unique items. * @example * * R.uniq([1, 1, 2, 1]); //=> [1, 2] * R.uniq([1, '1']); //=> [1, '1'] * R.uniq([[42], [42]]); //=> [[42]] */ 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/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 _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"); /** * 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. * * @func * @memberOf R * @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.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] */ 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); } idx += 1; } return result; })); /* harmony default export */ __webpack_exports__["default"] = (uniqBy); /***/ }), /***/ "./node_modules/ramda/es/values.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/values.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 list of all the enumerable own properties of the supplied object. * Note that the order of the output array is not guaranteed across different * JS platforms. * * @func * @memberOf R * @since v0.1.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 properties. * @see R.valuesIn, R.keys, R.toPairs * @example * * R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3] */ var values = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function values(obj) { var props = (0,_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj); var len = props.length; var vals = []; var idx = 0; while (idx < len) { vals[idx] = obj[props[idx]]; idx += 1; } return vals; }); /* harmony default export */ __webpack_exports__["default"] = (values); /***/ }), /***/ "./node_modules/ramda/es/view.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/view.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"); // `Const` is a functor that effectively ignores the function given to `map`. var Const = function Const(x) { return { value: x, 'fantasy-land/map': function fantasyLand_map() { return this; } }; }; /** * Returns a "view" of the given data structure, determined by the given lens. * The lens's focus determines which portion of the data structure is visible. * * @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 -> s -> a * @param {Lens} lens * @param {*} x * @return {*} * @see R.set, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath * @example * * const xLens = R.lensProp('x'); * * R.view(xLens, {x: 1, y: 2}); //=> 1 * R.view(xLens, {x: 4, y: 2}); //=> 4 */ var view = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function view(lens, x) { // Using `Const` effectively ignores the setter function of the `lens`, // leaving the value returned by the getter function unmodified. return lens(Const)(x).value; }); /* harmony default export */ __webpack_exports__["default"] = (view); /***/ }), /***/ "./node_modules/ramda/es/zip.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/zip.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 pairing up equally-positioned * items from both lists. The returned list is truncated to the length of the * shorter of the two input lists. * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`. * * @func * @memberOf R * @since v0.1.0 * @category List * @sig [a] -> [b] -> [[a,b]] * @param {Array} list1 The first array to consider. * @param {Array} list2 The second array to consider. * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`. * @example * * R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']] * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]] */ var zip = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function zip(a, b) { var len = Math.min(a.length, b.length); var rv = Array(len); var idx = 0; while (idx < len) { rv[idx] = [a[idx], b[idx]]; idx += 1; } return rv; }); /* harmony default export */ __webpack_exports__["default"] = (zip); /***/ }), /***/ "./node_modules/ramda/es/zipObj.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/zipObj.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 object out of a list of keys and a list of values. * Key/value pairing is truncated to the length of the shorter of the two lists. * Note: `zipObj` is equivalent to `pipe(zip, fromPairs)`. * * @func * @memberOf R * @since v0.3.0 * @category List * @sig [String] -> [*] -> {String: *} * @param {Array} keys The array that will be properties on the output object. * @param {Array} values The list of values on the output object. * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`. * @example * * R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3} */ var zipObj = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function zipObj(keys, values) { var idx = 0; var len = Math.min(keys.length, values.length); var out = {}; while (idx < len) { out[keys[idx]] = values[idx]; idx += 1; } return out; }); /* harmony default export */ __webpack_exports__["default"] = (zipObj); /***/ }), /***/ "./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 */ 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]; } /***/ }), /***/ "./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-cytoscapejs/dist/react-cytoscape.modern.js": /*!***********************************************************************!*\ !*** ./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.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 */ w; } /* 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 cytoscape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! cytoscape */ "./node_modules/cytoscape/dist/cytoscape.esm.mjs"); function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } 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); } var o = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), l = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array), s = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), a = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().number), i = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool), r = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().oneOfType), c = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), u = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func), d = { id: o, className: o, style: r([o, s]), elements: r([l, c]), stylesheet: r([l, c]), layout: r([s, c]), pan: r([s, c]), zoom: a, panningEnabled: i, userPanningEnabled: i, minZoom: a, maxZoom: a, zoomingEnabled: i, userZoomingEnabled: i, boxSelectionEnabled: i, autoungrabify: i, autolock: i, autounselectify: i, get: u, toJson: u, diff: u, forEach: u, cy: u, headless: i, styleEnabled: i, hideEdgesOnViewport: i, textureOnViewport: i, motionBlur: i, motionBlurOpacity: a, wheelSensitivity: a, pixelRatio: r([o, s]) }, p = function p(e, t) { if (function (e, t) { return null == e || null == t; }(e, t) && (null != e || null != t)) return !0; if (e === t) return !1; if ("object" != _typeof(e) || "object" != _typeof(t)) return e !== t; var n = Object.keys(e), o = Object.keys(t), l = function l(n) { return e[n] !== t[n]; }; return n.length !== o.length || !(!n.some(l) && !o.some(l)); }, m = function m(e, t) { return null != e ? e[t] : null; }, y = { diff: p, get: m, toJson: function toJson(e) { return e; }, forEach: function forEach(e, t) { return e.forEach(t); }, elements: [{ data: { id: "a", label: "Example node A" } }, { data: { id: "b", label: "Example node B" } }, { data: { id: "e", source: "a", target: "b" } }], stylesheet: [{ selector: "node", style: { label: "data(label)" } }], zoom: 1, pan: { x: 0, y: 0 } }, h = function h(e, t, n, o) { return n(m(e, o), m(t, o)); }, b = function b(e, t, n, o, l, s, a) { e.batch(function () { (o === p || h(t, n, o, "elements")) && x(e, m(t, "elements"), m(n, "elements"), l, s, a, o), h(t, n, o, "stylesheet") && E(e, m(t, "stylesheet"), m(n, "stylesheet"), l), ["zoom", "minZoom", "maxZoom", "zoomingEnabled", "userZoomingEnabled", "pan", "panningEnabled", "userPanningEnabled", "boxSelectionEnabled", "autoungrabify", "autolock", "autounselectify"].forEach(function (s) { h(t, n, o, s) && f(e, s, m(t, s), m(n, s), l); }); }), h(t, n, o, "layout") && g(e, m(t, "layout"), m(n, "layout"), l); }, f = function f(e, t, n, o, l) { e[t](l(o)); }, g = function g(e, t, n, o) { var l = o(n); null != l && e.layout(l).run(); }, E = function E(e, t, n, o) { var l = e.style(); null != l && l.fromJson(o(n)).update(); }, x = function x(e, t, n, o, l, s, a) { var i = [], r = e.collection(), c = [], u = {}, d = {}, p = function p(e) { return l(l(e, "data"), "id"); }; s(n, function (e) { var t = p(e); d[t] = e; }), null != t && s(t, function (t) { var n = p(t); u[n] = t, function (e) { return null != d[e]; }(n) || r.merge(e.getElementById(n)); }), s(n, function (e) { var t = p(e), n = function (e) { return u[e]; }(t); (function (e) { return null != u[e]; })(t) ? c.push({ ele1: n, ele2: e }) : i.push(o(e)); }), r.length > 0 && e.remove(r), i.length > 0 && e.add(i), c.forEach(function (_ref) { var t = _ref.ele1, n = _ref.ele2; return O(e, t, n, o, l, a); }); }, O = function O(e, t, n, o, l, s) { var a = l(l(n, "data"), "id"), i = e.getElementById(a), r = {}; ["data", "position", "selected", "selectable", "locked", "grabbable", "classes"].forEach(function (e) { var a = l(n, e); s(a, l(t, e)) && (r[e] = o(a)); }); var c = l(n, "scratch"); s(c, l(t, "scratch")) && i.scratch(o(c)), Object.keys(r).length > 0 && i.json(r); }; var w = /*#__PURE__*/function (_e$Component) { function w(t) { var _this; _classCallCheck(this, w); _this = _callSuper(this, w, [t]), _this.displayName = "CytoscapeComponent", _this.containerRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); return _this; } _inherits(w, _e$Component); return _createClass(w, [{ key: "componentDidMount", value: function componentDidMount() { var e = this.containerRef.current, _this$props = this.props, t = _this$props.global, o = _this$props.headless, l = _this$props.styleEnabled, s = _this$props.hideEdgesOnViewport, a = _this$props.textureOnViewport, i = _this$props.motionBlur, r = _this$props.motionBlurOpacity, c = _this$props.wheelSensitivity, u = _this$props.pixelRatio, d = this._cy = new cytoscape__WEBPACK_IMPORTED_MODULE_2__["default"]({ container: e, headless: o, styleEnabled: l, hideEdgesOnViewport: s, textureOnViewport: a, motionBlur: i, motionBlurOpacity: r, wheelSensitivity: c, pixelRatio: u }); t && (window[t] = d), this.updateCytoscape(null, this.props); } }, { key: "updateCytoscape", value: function updateCytoscape(e, t) { var n = this._cy, o = t.diff, l = t.toJson, s = t.get, a = t.forEach; b(n, e, t, o, l, s, a), null != t.cy && t.cy(n); } }, { key: "componentDidUpdate", value: function componentDidUpdate(e) { this.updateCytoscape(e, this.props); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._cy.destroy(); } }, { key: "render", value: function render() { var _this$props2 = this.props, t = _this$props2.id, n = _this$props2.className, o = _this$props2.style; return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: this.containerRef, id: t, className: n, style: o }); } }], [{ key: "propTypes", get: function get() { return d; } }, { key: "defaultProps", get: function get() { return y; } }, { key: "normalizeElements", value: function normalizeElements(e) { if (null != e.length) return e; { var _t = e.nodes, _n = e.edges; return null == _t && (_t = []), null == _n && (_n = []), _t.concat(_n); } } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); /***/ }), /***/ "./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) // removed by dead control flow {} 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"); 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"); 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; } } 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; } 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/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 _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"); 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; } 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' } }; }; 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); /***/ }), /***/ "./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 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"); 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 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; } return Infinity; } function isIterableMap(collection) { return typeof collection.set === 'function'; } 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); 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); var _iterator = _createForOfIteratorHelper(collection), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var item = _step.value; if (idx > to) { done = false; break; } 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 }); } } idx++; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } res = { hasMore: !done, entries: entries }; } return res; } function getRanges(from, to, limit) { var ranges = []; 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; } 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 (!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; } } else { if (length <= limit && !isSubset) { return getEntriesBound(from, to).entries; } } var limitedEntries; 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/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 */ 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"); 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 _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; } 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; } // 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 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); }; 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); } deprecatedStylingMethods.forEach(function (name) { // eslint-disable-next-line no-console console.error("Styling method \"".concat(name, "\" is deprecated, use \"theme\" property instead")); 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]; } return { style: _objectSpread(_objectSpread({}, style), props[name].apply(props, args)) }; }; }); } return theme; } function getStateFromProps(props) { var theme = checkLegacyTheming(props.theme, props); if (props.invertTheme) { theme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_11__.invertTheme)(theme); } return { styling: (0,_createStylingFromTheme__WEBPACK_IMPORTED_MODULE_12__["default"])(theme) }; } 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; } (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)); } } }, { 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]; }); } }, { 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)); (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/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 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/react-redux/es/components/Context.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/components/Context.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 */ ReactReduxContext: function() { return /* binding */ ReactReduxContext; } /* 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__); var ReactReduxContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null); if (true) { ReactReduxContext.displayName = 'ReactRedux'; } /* harmony default export */ __webpack_exports__["default"] = (ReactReduxContext); /***/ }), /***/ "./node_modules/react-redux/es/components/Provider.js": /*!************************************************************!*\ !*** ./node_modules/react-redux/es/components/Provider.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 _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _utils_Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/Subscription */ "./node_modules/react-redux/es/utils/Subscription.js"); /* harmony import */ var _utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/useIsomorphicLayoutEffect */ "./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js"); 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 () { var subscription = (0,_utils_Subscription__WEBPACK_IMPORTED_MODULE_2__.createSubscription)(store); return { store, subscription, getServerState: serverState ? function () { return serverState; } : undefined }; }, [store, serverState]); var previousState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return store.getState(); }, [store]); (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_3__.useIsomorphicLayoutEffect)(function () { var subscription = contextValue.subscription; subscription.onStateChange = subscription.notifyNestedSubs; subscription.trySubscribe(); if (previousState !== store.getState()) { subscription.notifyNestedSubs(); } return function () { subscription.tryUnsubscribe(); subscription.onStateChange = undefined; }; }, [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, { value: contextValue }, children); } /* harmony default export */ __webpack_exports__["default"] = (Provider); /***/ }), /***/ "./node_modules/react-redux/es/components/connect.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/components/connect.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 */ initializeConnect: function() { return /* binding */ initializeConnect; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); /* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! hoist-non-react-statics */ "./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"); /* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_2__); /* 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 react_is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-is */ "./node_modules/react-redux/node_modules/react-is/index.js"); /* harmony import */ var _connect_selectorFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../connect/selectorFactory */ "./node_modules/react-redux/es/connect/selectorFactory.js"); /* harmony import */ var _connect_mapDispatchToProps__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../connect/mapDispatchToProps */ "./node_modules/react-redux/es/connect/mapDispatchToProps.js"); /* harmony import */ var _connect_mapStateToProps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../connect/mapStateToProps */ "./node_modules/react-redux/es/connect/mapStateToProps.js"); /* harmony import */ var _connect_mergeProps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../connect/mergeProps */ "./node_modules/react-redux/es/connect/mergeProps.js"); /* harmony import */ var _utils_Subscription__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/Subscription */ "./node_modules/react-redux/es/utils/Subscription.js"); /* harmony import */ var _utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useIsomorphicLayoutEffect */ "./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js"); /* harmony import */ var _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/shallowEqual */ "./node_modules/react-redux/es/utils/shallowEqual.js"); /* harmony import */ var _utils_warning__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/warning */ "./node_modules/react-redux/es/utils/warning.js"); /* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/useSyncExternalStore */ "./node_modules/react-redux/es/utils/useSyncExternalStore.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r) { if (Array.isArray(r)) return r; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var _excluded = ["reactReduxForwardedRef"]; /* eslint-disable valid-jsdoc, @typescript-eslint/no-unused-vars */ var useSyncExternalStore = _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_14__.notInitialized; var initializeConnect = function initializeConnect(fn) { useSyncExternalStore = fn; }; // Define some constant arrays just to avoid re-creating these var EMPTY_ARRAY = [null, 0]; var NO_SUBSCRIPTION_ARRAY = [null, null]; // Attempts to stringify whatever not-really-a-component value we were given // for logging in an error message var stringifyComponent = function stringifyComponent(Comp) { try { return JSON.stringify(Comp); } catch (err) { return String(Comp); } }; // This is "just" a `useLayoutEffect`, but with two modifications: // - we need to fall back to `useEffect` in SSR to avoid annoying warnings // - we extract this to a separate function to avoid closing over values // and causing memory leaks function useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) { (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { return effectFunc.apply(void 0, _toConsumableArray(effectArgs)); }, dependencies); } // Effect callback, extracted: assign the latest props values to refs for later usage function captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, // actualChildProps: unknown, childPropsFromStoreUpdate, notifyNestedSubs) { // We want to capture the wrapper props and child props we used for later comparisons lastWrapperProps.current = wrapperProps; renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update if (childPropsFromStoreUpdate.current) { childPropsFromStoreUpdate.current = null; notifyNestedSubs(); } } // Effect callback, extracted: subscribe to the Redux store or nearest connected ancestor, // check for updates after dispatched actions, and trigger re-renders. function subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, isMounted, childPropsFromStoreUpdate, notifyNestedSubs, // forceComponentUpdateDispatch: React.Dispatch, additionalSubscribeListener) { // If we're not subscribed to the store, nothing to do here if (!shouldHandleStateChanges) return function () {}; // Capture values for checking if and when this component unmounts var didUnsubscribe = false; var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component var checkForUpdates = function checkForUpdates() { if (didUnsubscribe || !isMounted.current) { // Don't run stale listeners. // Redux doesn't guarantee unsubscriptions happen until next dispatch. return; } // TODO We're currently calling getState ourselves here, rather than letting `uSES` do it var latestStoreState = store.getState(); var newChildProps, error; try { // Actually run the selector with the most recent store state and wrapper props // to determine what the child props should be newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current); } catch (e) { error = e; lastThrownError = e; } if (!error) { lastThrownError = null; } // If the child props haven't changed, nothing to do here - cascade the subscription update if (newChildProps === lastChildProps.current) { if (!renderIsScheduled.current) { notifyNestedSubs(); } } else { // Save references to the new child props. Note that we track the "child props from store update" // as a ref instead of a useState/useReducer because we need a way to determine if that value has // been processed. If this went into useState/useReducer, we couldn't clear out the value without // forcing another re-render, which we don't want. lastChildProps.current = newChildProps; childPropsFromStoreUpdate.current = newChildProps; renderIsScheduled.current = true; // TODO This is hacky and not how `uSES` is meant to be used // Trigger the React `useSyncExternalStore` subscriber additionalSubscribeListener(); } }; // Actually subscribe to the nearest connected ancestor (or store) subscription.onStateChange = checkForUpdates; subscription.trySubscribe(); // Pull data from the store after first render in case the store has // changed since we began. checkForUpdates(); var unsubscribeWrapper = function unsubscribeWrapper() { didUnsubscribe = true; subscription.tryUnsubscribe(); subscription.onStateChange = null; if (lastThrownError) { // It's possible that we caught an error due to a bad mapState function, but the // parent re-rendered without this component and we're about to unmount. // This shouldn't happen as long as we do top-down subscriptions correctly, but // if we ever do those wrong, this throw will surface the error in our tests. // In that case, throw the error from here so it doesn't get lost. throw lastThrownError; } }; return unsubscribeWrapper; } // Reducer initial state creation for our update reducer var initStateUpdates = function initStateUpdates() { return EMPTY_ARRAY; }; function strictEqual(a, b) { return a === b; } /** * Infers the type of props that a connector will inject into a component. */ var hasWarnedAboutDeprecatedPureOption = false; /** * Connects a React component to a Redux store. * * - Without arguments, just wraps the component, without changing the behavior / props * * - If 2 params are passed (3rd param, mergeProps, is skipped), default behavior * is to override ownProps (as stated in the docs), so what remains is everything that's * not a state or dispatch prop * * - When 3rd param is passed, we don't know if ownProps propagate and whether they * should be valid component props, because it depends on mergeProps implementation. * As such, it is the user's responsibility to extend ownProps interface from state or * dispatch props or both when applicable * * @param mapStateToProps A function that extracts values from state * @param mapDispatchToProps Setup for dispatching actions * @param mergeProps Optional callback to merge state and dispatch props together * @param options Options for configuring the connection * */ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, pure = _ref.pure, _ref$areStatesEqual = _ref.areStatesEqual, areStatesEqual = _ref$areStatesEqual === void 0 ? strictEqual : _ref$areStatesEqual, _ref$areOwnPropsEqual = _ref.areOwnPropsEqual, areOwnPropsEqual = _ref$areOwnPropsEqual === void 0 ? _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_11__["default"] : _ref$areOwnPropsEqual, _ref$areStatePropsEqu = _ref.areStatePropsEqual, areStatePropsEqual = _ref$areStatePropsEqu === void 0 ? _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_11__["default"] : _ref$areStatePropsEqu, _ref$areMergedPropsEq = _ref.areMergedPropsEqual, areMergedPropsEqual = _ref$areMergedPropsEq === void 0 ? _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_11__["default"] : _ref$areMergedPropsEq, _ref$forwardRef = _ref.forwardRef, forwardRef = _ref$forwardRef === void 0 ? false : _ref$forwardRef, _ref$context = _ref.context, context = _ref$context === void 0 ? _Context__WEBPACK_IMPORTED_MODULE_13__.ReactReduxContext : _ref$context; if (true) { if (pure !== undefined && !hasWarnedAboutDeprecatedPureOption) { hasWarnedAboutDeprecatedPureOption = true; (0,_utils_warning__WEBPACK_IMPORTED_MODULE_12__["default"])('The `pure` option has been removed. `connect` is now always a "pure/memoized" component'); } } var Context = context; var initMapStateToProps = (0,_connect_mapStateToProps__WEBPACK_IMPORTED_MODULE_7__.mapStateToPropsFactory)(mapStateToProps); var initMapDispatchToProps = (0,_connect_mapDispatchToProps__WEBPACK_IMPORTED_MODULE_6__.mapDispatchToPropsFactory)(mapDispatchToProps); var initMergeProps = (0,_connect_mergeProps__WEBPACK_IMPORTED_MODULE_8__.mergePropsFactory)(mergeProps); var shouldHandleStateChanges = Boolean(mapStateToProps); var wrapWithConnect = function wrapWithConnect(WrappedComponent) { if ( true && !(0,react_is__WEBPACK_IMPORTED_MODULE_4__.isValidElementType)(WrappedComponent)) { throw new Error("You must pass a component to the function returned by connect. Instead received ".concat(stringifyComponent(WrappedComponent))); } var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component'; var displayName = "Connect(".concat(wrappedComponentName, ")"); var selectorFactoryOptions = { shouldHandleStateChanges, displayName, wrappedComponentName, WrappedComponent, // @ts-ignore initMapStateToProps, // @ts-ignore initMapDispatchToProps, initMergeProps, areStatesEqual, areStatePropsEqual, areOwnPropsEqual, areMergedPropsEqual }; function ConnectFunction(props) { var _useMemo = (0,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. var reactReduxForwardedRef = props.reactReduxForwardedRef, 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 () { // 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; }, [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. // 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. var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch); var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store); if ( true && !didStoreComeFromProps && !didStoreComeFromContext) { throw new Error("Could not find \"store\" in the context of " + "\"".concat(displayName, "\". Either wrap the root component in a , ") + "or pass a custom React context provider to and the corresponding " + "React context consumer to ".concat(displayName, " in connect options.")); } // Based on the previous check, one of these must be true var store = didStoreComeFromProps ? props.store : contextValue.store; var getServerState = didStoreComeFromContext ? contextValue.getServerState : store.getState; var childPropsSelector = (0,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 () { 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. var subscription = (0,_utils_Subscription__WEBPACK_IMPORTED_MODULE_9__.createSubscription)(store, didStoreComeFromProps ? undefined : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in // the middle of the notification loop, where `subscription` will then be null. This can // probably be avoided if Subscription's listeners logic is changed to not call listeners // that have been unsubscribed in the middle of the notification loop. 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, // and memoize that value to avoid unnecessary context updates. var overriddenContextValue = (0,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 // the existing context value is from the nearest connected ancestor. return contextValue; } // Otherwise, put this component's subscription instance into context, so that // connected descendants won't update until after this component is done return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, contextValue, { subscription }); }, [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)(); (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 selector = function selector() { // Tricky logic here: // - This render may have been triggered by a Redux store update that produced new child props // - However, we may have gotten new wrapper props after that // If we have new child props, and the same wrapper props, we know we should use the new child props as-is. // But, if we have new wrapper props, those might change the child props, so we have to recalculate things. // So, we'll use the child props from store update only if the wrapper props are the same as last time. if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) { return childPropsFromStoreUpdate.current; } // TODO We're reading the store directly in render() here. Bad idea? // This will likely cause Bad Things (TM) to happen in Concurrent Mode. // Note that we do this because on renders _not_ caused by store updates, we need the latest store state // to determine what the child props should be. return childPropsSelector(store.getState(), wrapperProps); }; return selector; }, [store, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns // 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 subscribe = function subscribe(reactListener) { if (!subscription) { return function () {}; } return subscribeUpdates(shouldHandleStateChanges, store, subscription, // @ts-ignore childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, isMounted, childPropsFromStoreUpdate, notifyNestedSubs, reactListener); }; return subscribe; }, [subscription]); useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, childPropsFromStoreUpdate, notifyNestedSubs]); var actualChildProps; try { actualChildProps = useSyncExternalStore( // TODO We're passing through a big wrapper that does a bunch of extra side effects besides subscribing subscribeForReact, // TODO This is incredibly hacky. We've already processed the store update and calculated new child props, // TODO and we're just passing that through so it triggers a re-render for us rather than relying on `uSES`. actualChildPropsSelector, getServerState ? function () { return childPropsSelector(getServerState(), wrapperProps); } : actualChildPropsSelector); } catch (err) { if (latestSubscriptionCallbackError.current) { ; err.message += "\nThe error may be correlated with this previous error:\n".concat(latestSubscriptionCallbackError.current.stack, "\n\n"); } throw err; } (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { latestSubscriptionCallbackError.current = undefined; childPropsFromStoreUpdate.current = undefined; lastChildProps.current = actualChildProps; }); // 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 () { return (/*#__PURE__*/ // @ts-ignore react__WEBPACK_IMPORTED_MODULE_3___default().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 () { 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, { value: overriddenContextValue }, renderedWrappedComponent); } return renderedWrappedComponent; }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]); return renderedChild; } var _Connect = react__WEBPACK_IMPORTED_MODULE_3___default().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) { // @ts-ignore return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(Connect, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { reactReduxForwardedRef: ref })); }); var forwarded = _forwarded; forwarded.displayName = displayName; forwarded.WrappedComponent = WrappedComponent; return hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_2___default()(forwarded, WrappedComponent); } return hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_2___default()(Connect, WrappedComponent); }; return wrapWithConnect; } /* harmony default export */ __webpack_exports__["default"] = (connect); /***/ }), /***/ "./node_modules/react-redux/es/connect/invalidArgFactory.js": /*!******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/invalidArgFactory.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 */ createInvalidArgFactory: function() { return /* binding */ createInvalidArgFactory; } /* 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); } function createInvalidArgFactory(arg, name) { return function (dispatch, options) { throw new Error("Invalid value of type ".concat(_typeof(arg), " for ").concat(name, " argument when connecting component ").concat(options.wrappedComponentName, ".")); }; } /***/ }), /***/ "./node_modules/react-redux/es/connect/mapDispatchToProps.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/mapDispatchToProps.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 */ mapDispatchToPropsFactory: function() { return /* binding */ mapDispatchToPropsFactory; } /* harmony export */ }); /* harmony import */ var _utils_bindActionCreators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/bindActionCreators */ "./node_modules/react-redux/es/utils/bindActionCreators.js"); /* harmony import */ var _wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wrapMapToProps */ "./node_modules/react-redux/es/connect/wrapMapToProps.js"); /* harmony import */ var _invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./invalidArgFactory */ "./node_modules/react-redux/es/connect/invalidArgFactory.js"); 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); } function mapDispatchToPropsFactory(mapDispatchToProps) { return mapDispatchToProps && _typeof(mapDispatchToProps) === 'object' ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(function (dispatch) { return ( // @ts-ignore (0,_utils_bindActionCreators__WEBPACK_IMPORTED_MODULE_0__["default"])(mapDispatchToProps, dispatch) ); }) : !mapDispatchToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(function (dispatch) { return { dispatch }; }) : typeof mapDispatchToProps === 'function' ? // @ts-ignore (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsFunc)(mapDispatchToProps, 'mapDispatchToProps') : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__.createInvalidArgFactory)(mapDispatchToProps, 'mapDispatchToProps'); } /***/ }), /***/ "./node_modules/react-redux/es/connect/mapStateToProps.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/connect/mapStateToProps.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 */ mapStateToPropsFactory: function() { return /* binding */ mapStateToPropsFactory; } /* harmony export */ }); /* harmony import */ var _wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapMapToProps */ "./node_modules/react-redux/es/connect/wrapMapToProps.js"); /* harmony import */ var _invalidArgFactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./invalidArgFactory */ "./node_modules/react-redux/es/connect/invalidArgFactory.js"); function mapStateToPropsFactory(mapStateToProps) { return !mapStateToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__.wrapMapToPropsConstant)(function () { return {}; }) : typeof mapStateToProps === 'function' ? // @ts-ignore (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__.wrapMapToPropsFunc)(mapStateToProps, 'mapStateToProps') : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_1__.createInvalidArgFactory)(mapStateToProps, 'mapStateToProps'); } /***/ }), /***/ "./node_modules/react-redux/es/connect/mergeProps.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/connect/mergeProps.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 */ defaultMergeProps: function() { return /* binding */ defaultMergeProps; }, /* harmony export */ mergePropsFactory: function() { return /* binding */ mergePropsFactory; }, /* harmony export */ wrapMergePropsFunc: function() { return /* binding */ wrapMergePropsFunc; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/verifyPlainObject */ "./node_modules/react-redux/es/utils/verifyPlainObject.js"); /* harmony import */ var _invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./invalidArgFactory */ "./node_modules/react-redux/es/connect/invalidArgFactory.js"); function defaultMergeProps(stateProps, dispatchProps, ownProps) { // @ts-ignore return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, ownProps, stateProps, dispatchProps); } function wrapMergePropsFunc(mergeProps) { return function initMergePropsProxy(dispatch, _ref) { var displayName = _ref.displayName, areMergedPropsEqual = _ref.areMergedPropsEqual; var hasRunOnce = false; var mergedProps; return function mergePropsProxy(stateProps, dispatchProps, ownProps) { var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps); if (hasRunOnce) { if (!areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps; } else { hasRunOnce = true; mergedProps = nextMergedProps; if (true) (0,_utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_1__["default"])(mergedProps, displayName, 'mergeProps'); } return mergedProps; }; }; } function mergePropsFactory(mergeProps) { return !mergeProps ? function () { return defaultMergeProps; } : typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__.createInvalidArgFactory)(mergeProps, 'mergeProps'); } /***/ }), /***/ "./node_modules/react-redux/es/connect/selectorFactory.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/connect/selectorFactory.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 */ finalPropsSelectorFactory; }, /* harmony export */ pureFinalPropsSelectorFactory: function() { return /* binding */ pureFinalPropsSelectorFactory; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); /* harmony import */ var _verifySubselectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./verifySubselectors */ "./node_modules/react-redux/es/connect/verifySubselectors.js"); var _excluded = ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"]; function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref2) { var areStatesEqual = _ref2.areStatesEqual, areOwnPropsEqual = _ref2.areOwnPropsEqual, areStatePropsEqual = _ref2.areStatePropsEqual; var hasRunAtLeastOnce = false; var state; var ownProps; var stateProps; var dispatchProps; var mergedProps; function handleFirstCall(firstState, firstOwnProps) { state = firstState; ownProps = firstOwnProps; stateProps = mapStateToProps(state, ownProps); dispatchProps = mapDispatchToProps(dispatch, ownProps); mergedProps = mergeProps(stateProps, dispatchProps, ownProps); hasRunAtLeastOnce = true; return mergedProps; } function handleNewPropsAndNewState() { stateProps = mapStateToProps(state, ownProps); if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps); mergedProps = mergeProps(stateProps, dispatchProps, ownProps); return mergedProps; } function handleNewProps() { if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps); if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps); mergedProps = mergeProps(stateProps, dispatchProps, ownProps); return mergedProps; } function handleNewState() { var nextStateProps = mapStateToProps(state, ownProps); var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps); stateProps = nextStateProps; if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps); return mergedProps; } function handleSubsequentCalls(nextState, nextOwnProps) { var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps); var stateChanged = !areStatesEqual(nextState, state, nextOwnProps, ownProps); state = nextState; ownProps = nextOwnProps; if (propsChanged && stateChanged) return handleNewPropsAndNewState(); if (propsChanged) return handleNewProps(); if (stateChanged) return handleNewState(); return mergedProps; } return function pureFinalPropsSelector(nextState, nextOwnProps) { return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps); }; } // TODO: Add more comments // The selector returned by selectorFactory will memoize its results, // allowing connect's shouldComponentUpdate to return false if final // props have not changed. function finalPropsSelectorFactory(dispatch, _ref) { var initMapStateToProps = _ref.initMapStateToProps, initMapDispatchToProps = _ref.initMapDispatchToProps, initMergeProps = _ref.initMergeProps, options = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(_ref, _excluded); var mapStateToProps = initMapStateToProps(dispatch, options); var mapDispatchToProps = initMapDispatchToProps(dispatch, options); var mergeProps = initMergeProps(dispatch, options); if (true) { (0,_verifySubselectors__WEBPACK_IMPORTED_MODULE_1__["default"])(mapStateToProps, mapDispatchToProps, mergeProps); } return pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options); } /***/ }), /***/ "./node_modules/react-redux/es/connect/verifySubselectors.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/verifySubselectors.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 */ verifySubselectors; } /* harmony export */ }); /* harmony import */ var _utils_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/warning */ "./node_modules/react-redux/es/utils/warning.js"); function verify(selector, methodName) { if (!selector) { throw new Error("Unexpected value for ".concat(methodName, " in connect.")); } else if (methodName === 'mapStateToProps' || methodName === 'mapDispatchToProps') { if (!Object.prototype.hasOwnProperty.call(selector, 'dependsOnOwnProps')) { (0,_utils_warning__WEBPACK_IMPORTED_MODULE_0__["default"])("The selector for ".concat(methodName, " of connect did not specify a value for dependsOnOwnProps.")); } } } function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps) { verify(mapStateToProps, 'mapStateToProps'); verify(mapDispatchToProps, 'mapDispatchToProps'); verify(mergeProps, 'mergeProps'); } /***/ }), /***/ "./node_modules/react-redux/es/connect/wrapMapToProps.js": /*!***************************************************************!*\ !*** ./node_modules/react-redux/es/connect/wrapMapToProps.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 */ getDependsOnOwnProps: function() { return /* binding */ getDependsOnOwnProps; }, /* harmony export */ wrapMapToPropsConstant: function() { return /* binding */ wrapMapToPropsConstant; }, /* harmony export */ wrapMapToPropsFunc: function() { return /* binding */ wrapMapToPropsFunc; } /* harmony export */ }); /* harmony import */ var _utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/verifyPlainObject */ "./node_modules/react-redux/es/utils/verifyPlainObject.js"); function wrapMapToPropsConstant( // * Note: // It seems that the dispatch argument // could be a dispatch function in some cases (ex: whenMapDispatchToPropsIsMissing) // and a state object in some others (ex: whenMapStateToPropsIsMissing) // eslint-disable-next-line no-unused-vars getConstant) { return function initConstantSelector(dispatch) { var constant = getConstant(dispatch); function constantSelector() { return constant; } constantSelector.dependsOnOwnProps = false; return constantSelector; }; } // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args // to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine // whether mapToProps needs to be invoked when props have changed. // // A length of one signals that mapToProps does not depend on props from the parent component. // A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and // therefore not reporting its length accurately.. // TODO Can this get pulled out so that we can subscribe directly to the store if we don't need ownProps? function getDependsOnOwnProps(mapToProps) { return mapToProps.dependsOnOwnProps ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1; } // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction, // this function wraps mapToProps in a proxy function which does several things: // // * Detects whether the mapToProps function being called depends on props, which // is used by selectorFactory to decide if it should reinvoke on props changes. // // * On first call, handles mapToProps if returns another function, and treats that // new function as the true mapToProps for subsequent calls. // // * On first call, verifies the first result is a plain object, in order to warn // the developer that their mapToProps function is not returning a valid result. // function wrapMapToPropsFunc(mapToProps, methodName) { return function initProxySelector(dispatch, _ref) { var displayName = _ref.displayName; var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) { return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch, undefined); }; // allow detectFactoryAndVerify to get ownProps proxy.dependsOnOwnProps = true; proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) { proxy.mapToProps = mapToProps; proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps); var props = proxy(stateOrDispatch, ownProps); if (typeof props === 'function') { proxy.mapToProps = props; proxy.dependsOnOwnProps = getDependsOnOwnProps(props); props = proxy(stateOrDispatch, ownProps); } if (true) (0,_utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_0__["default"])(props, displayName, methodName); return props; }; return proxy; }; } /***/ }), /***/ "./node_modules/react-redux/es/exports.js": /*!************************************************!*\ !*** ./node_modules/react-redux/es/exports.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 */ Provider: function() { return /* reexport safe */ _components_Provider__WEBPACK_IMPORTED_MODULE_0__["default"]; }, /* harmony export */ ReactReduxContext: function() { return /* reexport safe */ _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext; }, /* harmony export */ connect: function() { return /* reexport safe */ _components_connect__WEBPACK_IMPORTED_MODULE_1__["default"]; }, /* harmony export */ createDispatchHook: function() { return /* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.createDispatchHook; }, /* harmony export */ createSelectorHook: function() { return /* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.createSelectorHook; }, /* harmony export */ createStoreHook: function() { return /* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.createStoreHook; }, /* harmony export */ shallowEqual: function() { return /* reexport safe */ _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_6__["default"]; }, /* harmony export */ useDispatch: function() { return /* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.useDispatch; }, /* harmony export */ useSelector: function() { return /* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.useSelector; }, /* harmony export */ useStore: function() { return /* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.useStore; } /* harmony export */ }); /* harmony import */ var _components_Provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/Provider */ "./node_modules/react-redux/es/components/Provider.js"); /* harmony import */ var _components_connect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/connect */ "./node_modules/react-redux/es/components/connect.js"); /* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/useDispatch */ "./node_modules/react-redux/es/hooks/useDispatch.js"); /* harmony import */ var _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useSelector */ "./node_modules/react-redux/es/hooks/useSelector.js"); /* harmony import */ var _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks/useStore */ "./node_modules/react-redux/es/hooks/useStore.js"); /* harmony import */ var _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/shallowEqual */ "./node_modules/react-redux/es/utils/shallowEqual.js"); /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./types */ "./node_modules/react-redux/es/types.js"); /***/ }), /***/ "./node_modules/react-redux/es/hooks/useDispatch.js": /*!**********************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useDispatch.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 */ createDispatchHook: function() { return /* binding */ createDispatchHook; }, /* harmony export */ useDispatch: function() { return /* binding */ useDispatch; } /* harmony export */ }); /* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _useStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useStore */ "./node_modules/react-redux/es/hooks/useStore.js"); /** * Hook factory, which creates a `useDispatch` hook bound to a given context. * * @param {React.Context} [context=ReactReduxContext] Context passed to your ``. * @returns {Function} A `useDispatch` hook bound to the specified context. */ function createDispatchHook() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_0__.ReactReduxContext; var useStore = // @ts-ignore context === _components_Context__WEBPACK_IMPORTED_MODULE_0__.ReactReduxContext ? _useStore__WEBPACK_IMPORTED_MODULE_1__.useStore : (0,_useStore__WEBPACK_IMPORTED_MODULE_1__.createStoreHook)(context); return function useDispatch() { var store = useStore(); // @ts-ignore return store.dispatch; }; } /** * A hook to access the redux `dispatch` function. * * @returns {any|function} redux store's `dispatch` function * * @example * * import React, { useCallback } from 'react' * import { useDispatch } from 'react-redux' * * export const CounterComponent = ({ value }) => { * const dispatch = useDispatch() * const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), []) * return ( *
* {value} * *
* ) * } */ var useDispatch = /*#__PURE__*/createDispatchHook(); /***/ }), /***/ "./node_modules/react-redux/es/hooks/useReduxContext.js": /*!**************************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useReduxContext.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 */ useReduxContext: function() { return /* binding */ useReduxContext; } /* 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"); /** * A hook to access the value of the `ReactReduxContext`. This is a low-level * hook that you should usually not need to call directly. * * @returns {any} the value of the `ReactReduxContext` * * @example * * import React from 'react' * import { useReduxContext } from 'react-redux' * * export const CounterComponent = () => { * const { store } = useReduxContext() * 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; } /***/ }), /***/ "./node_modules/react-redux/es/hooks/useSelector.js": /*!**********************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useSelector.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 */ createSelectorHook: function() { return /* binding */ createSelectorHook; }, /* harmony export */ initializeUseSelector: function() { return /* binding */ initializeUseSelector; }, /* harmony export */ useSelector: function() { return /* binding */ useSelector; } /* 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 _useReduxContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useReduxContext */ "./node_modules/react-redux/es/hooks/useReduxContext.js"); /* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/useSyncExternalStore */ "./node_modules/react-redux/es/utils/useSyncExternalStore.js"); var useSyncExternalStoreWithSelector = _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_3__.notInitialized; var initializeUseSelector = function initializeUseSelector(fn) { useSyncExternalStoreWithSelector = fn; }; var refEquality = function refEquality(a, b) { return a === b; }; /** * Hook factory, which creates a `useSelector` hook bound to a given context. * * @param {React.Context} [context=ReactReduxContext] Context passed to your ``. * @returns {Function} A `useSelector` hook bound to the specified context. */ 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); }; return function useSelector(selector) { var equalityFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : refEquality; if (true) { if (!selector) { throw new Error("You must pass a selector to useSelector"); } if (typeof selector !== 'function') { throw new Error("You must pass a function as a selector to useSelector"); } if (typeof equalityFn !== 'function') { throw new Error("You must pass a function as an equality function to useSelector"); } } var _useReduxContext = useReduxContext(), store = _useReduxContext.store, subscription = _useReduxContext.subscription, getServerState = _useReduxContext.getServerState; var selectedState = useSyncExternalStoreWithSelector(subscription.addNestedSub, store.getState, getServerState || store.getState, selector, equalityFn); (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(selectedState); return selectedState; }; } /** * A hook to access the redux store's state. This hook takes a selector function * as an argument. The selector is called with the store state. * * This hook takes an optional equality comparison function as the second parameter * that allows you to customize the way the selected state is compared to determine * whether the component needs to be re-rendered. * * @param {Function} selector the selector function * @param {Function=} equalityFn the function that will be used to determine equality * * @returns {any} the selected state * * @example * * import React from 'react' * import { useSelector } from 'react-redux' * * export const CounterComponent = () => { * const counter = useSelector(state => state.counter) * return
{counter}
* } */ var useSelector = /*#__PURE__*/createSelectorHook(); /***/ }), /***/ "./node_modules/react-redux/es/hooks/useStore.js": /*!*******************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useStore.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 */ 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"); /** * Hook factory, which creates a `useStore` hook bound to a given context. * * @param {React.Context} [context=ReactReduxContext] Context passed to your ``. * @returns {Function} A `useStore` hook bound to the specified context. */ function createStoreHook() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_1__.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); }; return function useStore() { var _useReduxContext = useReduxContext(), store = _useReduxContext.store; // @ts-ignore return store; }; } /** * A hook to access the redux store. * * @returns {any} the redux store * * @example * * import React from 'react' * import { useStore } from 'react-redux' * * export const ExampleComponent = () => { * const store = useStore() * return
{store.getState()}
* } */ var useStore = /*#__PURE__*/createStoreHook(); /***/ }), /***/ "./node_modules/react-redux/es/index.js": /*!**********************************************!*\ !*** ./node_modules/react-redux/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 */ Provider: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.Provider; }, /* harmony export */ ReactReduxContext: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.ReactReduxContext; }, /* harmony export */ batch: function() { return /* reexport safe */ _utils_reactBatchedUpdates__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates; }, /* harmony export */ connect: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.connect; }, /* harmony export */ createDispatchHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createDispatchHook; }, /* harmony export */ createSelectorHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createSelectorHook; }, /* harmony export */ createStoreHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createStoreHook; }, /* harmony export */ shallowEqual: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.shallowEqual; }, /* harmony export */ useDispatch: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useDispatch; }, /* harmony export */ useSelector: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useSelector; }, /* harmony export */ useStore: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useStore; } /* harmony export */ }); /* harmony import */ var use_sync_external_store_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! use-sync-external-store/shim */ "./node_modules/use-sync-external-store/shim/index.js"); /* harmony import */ var use_sync_external_store_shim_with_selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! use-sync-external-store/shim/with-selector */ "./node_modules/use-sync-external-store/shim/with-selector.js"); /* harmony import */ var _utils_reactBatchedUpdates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/reactBatchedUpdates */ "./node_modules/react-redux/es/utils/reactBatchedUpdates.js"); /* harmony import */ var _utils_batch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/batch */ "./node_modules/react-redux/es/utils/batch.js"); /* harmony import */ var _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useSelector */ "./node_modules/react-redux/es/hooks/useSelector.js"); /* harmony import */ var _components_connect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/connect */ "./node_modules/react-redux/es/components/connect.js"); /* harmony import */ var _exports__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./exports */ "./node_modules/react-redux/es/exports.js"); // The primary entry point assumes we're working with standard ReactDOM/RN, but // older versions that do not include `useSyncExternalStore` (React 16.9 - 17.x). // Because of that, the useSyncExternalStore compat shim is needed. (0,_hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.initializeUseSelector)(use_sync_external_store_shim_with_selector__WEBPACK_IMPORTED_MODULE_1__.useSyncExternalStoreWithSelector); (0,_components_connect__WEBPACK_IMPORTED_MODULE_5__.initializeConnect)(use_sync_external_store_shim__WEBPACK_IMPORTED_MODULE_0__.useSyncExternalStore); // Enable batched updates in our subscriptions for use // with standard React renderers (ReactDOM, React Native) (0,_utils_batch__WEBPACK_IMPORTED_MODULE_3__.setBatch)(_utils_reactBatchedUpdates__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates); /***/ }), /***/ "./node_modules/react-redux/es/types.js": /*!**********************************************!*\ !*** ./node_modules/react-redux/es/types.js ***! \**********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./node_modules/react-redux/es/utils/Subscription.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/utils/Subscription.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 */ createSubscription: function() { return /* binding */ createSubscription; } /* harmony export */ }); /* harmony import */ var _batch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./batch */ "./node_modules/react-redux/es/utils/batch.js"); // encapsulates the subscription logic for connecting a component to the redux store, as // well as nesting subscriptions of descendant components, so that we can ensure the // ancestor components re-render before descendants function createListenerCollection() { var batch = (0,_batch__WEBPACK_IMPORTED_MODULE_0__.getBatch)(); var first = null; var last = null; return { clear() { first = null; last = null; }, notify() { batch(function () { var listener = first; while (listener) { listener.callback(); listener = listener.next; } }); }, get() { var listeners = []; var listener = first; while (listener) { listeners.push(listener); listener = listener.next; } return listeners; }, subscribe(callback) { var isSubscribed = true; var listener = last = { callback, next: null, prev: last }; if (listener.prev) { listener.prev.next = listener; } else { first = listener; } return function unsubscribe() { if (!isSubscribed || first === null) return; isSubscribed = false; if (listener.next) { listener.next.prev = listener.prev; } else { last = listener.prev; } if (listener.prev) { listener.prev.next = listener.next; } else { first = listener.next; } }; } }; } var nullListeners = { notify() {}, get: function get() { return []; } }; function createSubscription(store, parentSub) { var unsubscribe; var listeners = nullListeners; function addNestedSub(listener) { trySubscribe(); return listeners.subscribe(listener); } function notifyNestedSubs() { listeners.notify(); } function handleChangeWrapper() { if (subscription.onStateChange) { subscription.onStateChange(); } } function isSubscribed() { return Boolean(unsubscribe); } function trySubscribe() { if (!unsubscribe) { unsubscribe = parentSub ? parentSub.addNestedSub(handleChangeWrapper) : store.subscribe(handleChangeWrapper); listeners = createListenerCollection(); } } function tryUnsubscribe() { if (unsubscribe) { unsubscribe(); unsubscribe = undefined; listeners.clear(); listeners = nullListeners; } } var subscription = { addNestedSub, notifyNestedSubs, handleChangeWrapper, isSubscribed, trySubscribe, tryUnsubscribe, getListeners: function getListeners() { return listeners; } }; return subscription; } /***/ }), /***/ "./node_modules/react-redux/es/utils/batch.js": /*!****************************************************!*\ !*** ./node_modules/react-redux/es/utils/batch.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 */ getBatch: function() { return /* binding */ getBatch; }, /* harmony export */ setBatch: function() { return /* binding */ setBatch; } /* harmony export */ }); // Default to a dummy "batch" implementation that just runs the callback function defaultNoopBatch(callback) { callback(); } var batch = defaultNoopBatch; // Allow injecting another batching function later var setBatch = function setBatch(newBatch) { return batch = newBatch; }; // Supply a getter just to skip dealing with ESM bindings var getBatch = function getBatch() { return batch; }; /***/ }), /***/ "./node_modules/react-redux/es/utils/bindActionCreators.js": /*!*****************************************************************!*\ !*** ./node_modules/react-redux/es/utils/bindActionCreators.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 */ bindActionCreators; } /* harmony export */ }); function bindActionCreators(actionCreators, dispatch) { var boundActionCreators = {}; var _loop = function _loop() { var actionCreator = actionCreators[key]; if (typeof actionCreator === 'function') { boundActionCreators[key] = function () { return dispatch(actionCreator.apply(void 0, arguments)); }; } }; for (var key in actionCreators) { _loop(); } return boundActionCreators; } /***/ }), /***/ "./node_modules/react-redux/es/utils/isPlainObject.js": /*!************************************************************!*\ !*** ./node_modules/react-redux/es/utils/isPlainObject.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 */ isPlainObject; } /* 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); } /** * @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 = Object.getPrototypeOf(obj); if (proto === null) return true; var baseProto = proto; while (Object.getPrototypeOf(baseProto) !== null) { baseProto = Object.getPrototypeOf(baseProto); } return proto === baseProto; } /***/ }), /***/ "./node_modules/react-redux/es/utils/reactBatchedUpdates.js": /*!******************************************************************!*\ !*** ./node_modules/react-redux/es/utils/reactBatchedUpdates.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 */ unstable_batchedUpdates: function() { return /* reexport safe */ react_dom__WEBPACK_IMPORTED_MODULE_0__.unstable_batchedUpdates; } /* harmony export */ }); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ "react-dom"); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__); /***/ }), /***/ "./node_modules/react-redux/es/utils/shallowEqual.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/utils/shallowEqual.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 */ shallowEqual; } /* 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); } function is(x, y) { if (x === y) { return x !== 0 || y !== 0 || 1 / x === 1 / y; } else { return x !== x && y !== y; } } function shallowEqual(objA, objB) { if (is(objA, objB)) return true; if (_typeof(objA) !== 'object' || objA === null || _typeof(objB) !== 'object' || objB === null) { return false; } var keysA = Object.keys(objA); var keysB = Object.keys(objB); if (keysA.length !== keysB.length) return false; for (var i = 0; i < keysA.length; i++) { if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { return false; } } return true; } /***/ }), /***/ "./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js": /*!************************************************************************!*\ !*** ./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.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 */ canUseDOM: function() { return /* binding */ canUseDOM; }, /* harmony export */ useIsomorphicLayoutEffect: function() { return /* binding */ useIsomorphicLayoutEffect; } /* 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__); // React currently throws a warning when using useLayoutEffect on the server. // To get around it, we can conditionally useEffect on the server (no-op) and // useLayoutEffect in the browser. We need useLayoutEffect to ensure the store // subscription callback always has the selector from the latest render commit // available, otherwise a store update may happen between render and the effect, // which may cause missed updates; we also must ensure the store subscription // is created synchronously, otherwise a store update may occur before the // subscription is created and an inconsistent state may be observed // Matches logic in React's `shared/ExecutionEnvironment` file var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); var useIsomorphicLayoutEffect = canUseDOM ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect; /***/ }), /***/ "./node_modules/react-redux/es/utils/useSyncExternalStore.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/utils/useSyncExternalStore.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 */ notInitialized: function() { return /* binding */ notInitialized; } /* harmony export */ }); var notInitialized = function notInitialized() { throw new Error('uSES not initialized!'); }; /***/ }), /***/ "./node_modules/react-redux/es/utils/verifyPlainObject.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/utils/verifyPlainObject.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 */ verifyPlainObject; } /* harmony export */ }); /* harmony import */ var _isPlainObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isPlainObject */ "./node_modules/react-redux/es/utils/isPlainObject.js"); /* harmony import */ var _warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./warning */ "./node_modules/react-redux/es/utils/warning.js"); function verifyPlainObject(value, displayName, methodName) { if (!(0,_isPlainObject__WEBPACK_IMPORTED_MODULE_0__["default"])(value)) { (0,_warning__WEBPACK_IMPORTED_MODULE_1__["default"])("".concat(methodName, "() in ").concat(displayName, " must return a plain object. Instead received ").concat(value, ".")); } } /***/ }), /***/ "./node_modules/react-redux/es/utils/warning.js": /*!******************************************************!*\ !*** ./node_modules/react-redux/es/utils/warning.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 */ warning; } /* harmony export */ }); /** * 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); } /* 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); /* eslint-disable no-empty */ } catch (e) {} /* eslint-enable no-empty */ } /***/ }), /***/ "./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js": /*!************************************************************************************!*\ !*** ./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js ***! \************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { "use strict"; /** * @license React * 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. */ 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); } if (true) { (function () { 'use strict'; // ATTENTION // When adding new symbols to this file, // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' // The Symbol used to tag the ReactElement-like types. var REACT_ELEMENT_TYPE = Symbol.for('react.element'); var REACT_PORTAL_TYPE = Symbol.for('react.portal'); var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); var REACT_CONTEXT_TYPE = Symbol.for('react.context'); var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); var REACT_MEMO_TYPE = Symbol.for('react.memo'); var REACT_LAZY_TYPE = Symbol.for('react.lazy'); var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); // ----------------------------------------------------------------------------- var enableScopeAPI = false; // Experimental Create Event Handle API. var enableCacheElement = false; var enableTransitionTracing = false; // No known bugs, but needs performance testing var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber // stuff. Intended to enable React core members to more easily debug scheduling // issues in DEV builds. var enableDebugTracing = false; // Track which Fiber(s) schedule render work. var REACT_MODULE_REFERENCE; { REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); } function isValidElementType(type) { if (typeof type === 'string' || typeof type === 'function') { return true; } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { return true; } if (_typeof(type) === 'object' && type !== null) { if (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 || // This needs to include all possible module reference object // types supported by any Flight configuration anywhere since // we don't know which Flight build this will end up being used // with. type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { return true; } } return false; } 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_FRAGMENT_TYPE: case REACT_PROFILER_TYPE: case REACT_STRICT_MODE_TYPE: case REACT_SUSPENSE_TYPE: case REACT_SUSPENSE_LIST_TYPE: return type; default: var $$typeofType = type && type.$$typeof; switch ($$typeofType) { case REACT_SERVER_CONTEXT_TYPE: 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; } 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 SuspenseList = REACT_SUSPENSE_LIST_TYPE; var hasWarnedAboutDeprecatedIsAsyncMode = false; var hasWarnedAboutDeprecatedIsConcurrentMode = 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 18+.'); } } return false; } function isConcurrentMode(object) { { if (!hasWarnedAboutDeprecatedIsConcurrentMode) { hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.'); } } return false; } 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; } function isSuspenseList(object) { return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; } 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.SuspenseList = SuspenseList; 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.isSuspenseList = isSuspenseList; exports.isValidElementType = isValidElementType; exports.typeOf = typeOf; })(); } /***/ }), /***/ "./node_modules/react-redux/node_modules/react-is/index.js": /*!*****************************************************************!*\ !*** ./node_modules/react-redux/node_modules/react-is/index.js ***! \*****************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; if (false) // removed by dead control flow {} else { module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js"); } /***/ }), /***/ "./node_modules/redux-actions/es/createAction.js": /*!*******************************************************!*\ !*** ./node_modules/redux-actions/es/createAction.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 */ 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"); 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/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 default export */ __webpack_exports__["default"] = (function (value) { return value; }); /***/ }), /***/ "./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 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__) { "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__) { "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 */ 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 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/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"); /** * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js * * 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 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. '; } // Inlined version of the `symbol-observable` polyfill var $$observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); /** * 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(); } }; /** * @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; 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; switch (type) { case 'boolean': case 'string': case 'number': case 'symbol': case 'function': { return type; } } 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, ''); } function ctorName(val) { return typeof val.constructor === 'function' ? val.constructor.name : null; } 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'; } function kindOf(val) { var typeOfVal = typeof val; if (true) { typeOfVal = miniKindOf(val); } return typeOfVal; } /** * @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'` * */ 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 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) + "'"); } 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. */ 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. */ 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; } 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). */ 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."); } 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.'); } if (isDispatching) { throw new Error( false ? 0 : 'Reducers may not dispatch actions.'); } try { isDispatching = true; currentState = currentReducer(currentState, action); } finally { isDispatching = false; } 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} */ function replaceReducer(nextReducer) { if (typeof nextReducer !== 'function') { throw new Error( false ? 0 : "Expected the nextReducer to be a function. Instead, received: '" + kindOf(nextReducer)); } 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; } /** * 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; /** * 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); } /* 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'; 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; 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."); } } function assertReducerShape(reducers) { Object.keys(reducers).forEach(function (key) { var reducer = reducers[key]; var initialState = reducer(undefined, { type: ActionTypes.INIT }); 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."); } 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 + "\""); } } if (typeof reducers[key] === 'function') { finalReducers[key] = reducers[key]; } } var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same // keys multiple times. var unexpectedKeyCache; if (true) { unexpectedKeyCache = {}; } var shapeAssertionError; try { assertReducerShape(finalReducers); } catch (e) { shapeAssertionError = e; } return function combination(state, action) { if (state === void 0) { state = {}; } if (shapeAssertionError) { throw shapeAssertionError; } if (true) { var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache); if (warningMessage) { warning(warningMessage); } } var hasChanged = false; var nextState = {}; 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); 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. */ function bindActionCreators(actionCreators, dispatch) { if (typeof actionCreators === 'function') { return bindActionCreator(actionCreators, dispatch); } 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 = {}; for (var key in actionCreators) { var actionCreator = actionCreators[key]; if (typeof actionCreator === 'function') { boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); } } 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]; } 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)); }; }); } /** * 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. */ function applyMiddleware() { for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) { middlewares[_key] = arguments[_key]; } 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/simple-swizzle/index.js": /*!**********************************************!*\ !*** ./node_modules/simple-swizzle/index.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var isArrayish = __webpack_require__(/*! is-arrayish */ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.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]; 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/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'))); }; /***/ }), /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": /*!****************************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.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; } } 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; }; }; /***/ }), /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": /*!********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! \********************************************************************/ /***/ (function(module) { "use strict"; var memo = {}; /* istanbul ignore next */ function getTarget(target) { if (typeof memo[target] === "undefined") { var styleTarget = document.querySelector(target); // 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; } 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."); } target.appendChild(style); } module.exports = insertBySelector; /***/ }), /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": /*!**********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! \**********************************************************************/ /***/ (function(module) { "use strict"; /* 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/style-loader/dist/runtime/setAttributesWithoutAttributes.js": /*!**********************************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! \**********************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; /* 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"; /* 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)))), " */"); } // 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); } /* istanbul ignore next */ function domAPI(options) { if (typeof document === "undefined") { return { update: function update() {}, remove: function remove() {} }; } var styleElement = options.insertStyleElement(options); return { update: function update(obj) { apply(styleElement, options, obj); }, remove: function remove() { removeStyleElement(styleElement); } }; } module.exports = domAPI; /***/ }), /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": /*!*********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! \*********************************************************************/ /***/ (function(module) { "use strict"; /* 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; /***/ }), /***/ "./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"; /** * @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. */ if (true) { (function() { '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 ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; 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); } } } 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 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); } } /** * 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 ; } var objectIs = typeof Object.is === 'function' ? Object.is : is; // 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; 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 value = getSnapshot(); { if (!didWarnUncachedGetSnapshot) { var cachedValue = getSnapshot(); 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. 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. 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 }); } }, [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 }); } 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. return subscribe(handleStoreChange); }, [subscribe]); useDebugValue(value); return value; } function checkIfSnapshotChanged(inst) { var latestGetSnapshot = inst.getSnapshot; var prevValue = inst.value; try { var nextValue = latestGetSnapshot(); return !objectIs(prevValue, nextValue); } catch (error) { return true; } } 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'); var isServerEnvironment = !canUseDOM; var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore; var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim; 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/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"; /** * @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. */ if (true) { (function() { '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 ; } var objectIs = typeof Object.is === 'function' ? Object.is : is; 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. 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; } 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; var memoizedSelector = function (nextSnapshot) { if (!hasMemo) { // The first time the hook is called, there is no memoized result. hasMemo = true; memoizedSnapshot = nextSnapshot; 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; } } } memoizedSelection = _nextSelection; return _nextSelection; } // We may be able to reuse the previous invocation's result. // 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. // 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. // Assigning this to a constant so that Flow knows it can't change. var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot; 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()); } })(); } /***/ }), /***/ "./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"; if (false) // removed by dead control flow {} 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/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"; if (false) // removed by dead control flow {} 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"); } /***/ }), /***/ "./src/APIController.react.js": /*!************************************!*\ !*** ./src/APIController.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 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 _components_error_GlobalErrorContainer_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/error/GlobalErrorContainer.react */ "./src/components/error/GlobalErrorContainer.react.js"); /* 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 _actions_dependencies__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); /* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actions/api */ "./src/actions/api.js"); /* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actions/utils */ "./src/actions/utils.js"); /* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./persistence */ "./src/persistence.js"); /* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./reducers/constants */ "./src/reducers/constants.js"); /* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./constants/constants */ "./src/constants/constants.js"); /* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils/wait */ "./src/utils/wait.ts"); /* harmony import */ var _isSimpleComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./isSimpleComponent */ "./src/isSimpleComponent.js"); /* harmony import */ var _wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./wrapper/DashWrapper */ "./src/wrapper/DashWrapper.tsx"); function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } /** * 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; 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_8__.EventEmitter(); } var renderedTree = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); (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__*/_regenerator().m(function _callee() { return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: renderedTree.current = false; _context.n = 1; return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_12__["default"])(0); case 1: events.current.emit('rendered'); case 2: return _context.a(2); } }, _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_11__.STATUS.OK, 'loading'])) { if (config.ui) { content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { dangerouslySetInnerHTML: { __html: layoutRequest.content } }); } else { 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_11__.STATUS.OK, 'loading'])) { if (config.ui) { content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { dangerouslySetInnerHTML: { __html: dependenciesRequest.content } }); } else { 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_10__.getAppState)('HYDRATED')) { renderedTree.current = true; content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, Array.isArray(layout) ? layout.map(function (c, i) { return (0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_13__["default"])(c) ? c : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_14__["default"], { _dashprivate_error: error, componentPath: [i], key: i }); }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_14__["default"], { _dashprivate_error: error, componentPath: [] })); } 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_3__["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_7__["default"])('_dash-layout', 'GET', 'layoutRequest')); } else if (layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_11__.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_9__.applyPersistence)(layoutRequest.content, dispatch); dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.setPaths)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_5__.computePaths)(finalLayout, [], null, events.current))); dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.setLayout)(finalLayout)); } } if ((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(dependenciesRequest)) { dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_7__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); } else if (dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_11__.STATUS.OK && ((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(graphs) || graphs.reset)) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.setGraphs)((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_6__.computeGraphs)(dependenciesRequest.content, (0,_actions__WEBPACK_IMPORTED_MODULE_4__.dispatchError)(dispatch)))); } if ( // dependenciesRequest and its computed stores dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_11__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(graphs) && // LayoutRequest and its computed stores layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_11__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(layout) && // Hasn't already hydrated appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_10__.getAppState)('STARTED')) { var hasError = false; try { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.hydrateInitialOutputs)((0,_actions__WEBPACK_IMPORTED_MODULE_4__.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_4__.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_10__.getAppState)('STARTED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_10__.getAppState)('HYDRATED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_10__.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().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, 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 _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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var UnconnectedAppContainer = /*#__PURE__*/function (_React$Component) { function UnconnectedAppContainer(props) { var _this; _classCallCheck(this, UnconnectedAppContainer); _this = _callSuper(this, UnconnectedAppContainer, [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; } _inherits(UnconnectedAppContainer, _React$Component); return _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)); } }]); }((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 ***! \***********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "prop-types"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__); /* 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 react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./store */ "./src/store.ts"); /* harmony import */ var _AppContainer_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AppContainer.react */ "./src/AppContainer.react.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } var AppProvider = function AppProvider(_ref) { var _ref$hooks = _ref.hooks, hooks = _ref$hooks === void 0 ? { layout_pre: null, layout_post: null, request_pre: null, request_post: null, callback_resolved: null, request_refresh_jwt: null } : _ref$hooks; var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(function () { return new _store__WEBPACK_IMPORTED_MODULE_3__["default"](); }), _useState2 = _slicedToArray(_useState, 1), store = _useState2[0].store; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(react_redux__WEBPACK_IMPORTED_MODULE_2__.Provider, { store: store }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_AppContainer_react__WEBPACK_IMPORTED_MODULE_4__["default"], { hooks: hooks })); }; AppProvider.propTypes = { hooks: prop_types__WEBPACK_IMPORTED_MODULE_0___default().shape({ layout_pre: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func), layout_post: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func), request_pre: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func), request_post: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func), callback_resolved: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func), request_refresh_jwt: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().func) }) }; /* 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"); /* harmony import */ var _dashApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dashApi */ "./src/dashApi.ts"); 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); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classCallCheck(a, n) { if (!(a instanceof n)) 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": /*!******************************!*\ !*** ./src/StoreObserver.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 */ StoreObserver; } /* harmony export */ }); /* 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 _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); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var StoreObserver = /*#__PURE__*/_createClass(function StoreObserver(_store) { var _this = this; _classCallCheck(this, StoreObserver); _defineProperty(this, "_store", void 0); _defineProperty(this, "_unsubscribe", void 0); _defineProperty(this, "_observers", []); _defineProperty(this, "observe", function (observer, inputs) { if (typeof observer === 'function') { if (!Array.isArray(inputs)) { throw new Error('inputs must be an array'); } _this.add(observer, inputs); return function () { return _this.remove(observer); }; } _this.add(observer.observer, observer.inputs); return function () { return _this.remove(observer.observer); }; }); _defineProperty(this, "setStore", function (store) { _this.__finalize__(); _this.__init__(store); }); _defineProperty(this, "__finalize__", function () { var _this$_unsubscribe; return (_this$_unsubscribe = _this._unsubscribe) === null || _this$_unsubscribe === void 0 ? void 0 : _this$_unsubscribe.call(_this); }); _defineProperty(this, "__init__", function (store) { _this._store = store; if (store) { _this._unsubscribe = store.subscribe(_this.notify); } _this._observers.forEach(function (o) { o.lastState = null; }); }); _defineProperty(this, "add", function (observer, inputs) { return _this._observers.push({ inputPaths: (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function (p) { return p.split('.'); }, inputs), lastState: null, observer, triggered: false }); }); _defineProperty(this, "notify", function () { var store = _this._store; if (!store) { return; } var state = store.getState(); 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) { o.triggered = true; }); triggered.forEach(function (o) { o.lastState = store.getState(); o.observer(store); o.triggered = false; }); }); _defineProperty(this, "remove", function (observer) { return _this._observers.splice(_this._observers.findIndex(function (o) { return observer === o.observer; }, _this._observers), 1); }); this.__init__(_store); }); /***/ }), /***/ "./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 _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /* 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__*/_regenerator().m(function _callee(dispatch, getState) { var _getState, config, hooks, newHeaders, url, setConnectionStatus, res, retry, _body, newJwt, contentType, content, message, _t, _t2; return _regenerator().w(function (_context) { while (1) switch (_context.n) { 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.p = 1; retry = 0; case 2: if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_2__.MAX_AUTH_RETRIES)) { _context.n = 11; break; } _context.p = 3; _context.n = 4; return request[method](url, config.fetch, body); case 4: res = _context.v; _context.n = 6; break; case 5: _context.p = 5; _t = _context.v; // 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.a(2); case 6: if (!(res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_3__.STATUS.UNAUTHORIZED || res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_3__.STATUS.BAD_REQUEST)) { _context.n = 9; break; } if (!hooks.request_refresh_jwt) { _context.n = 9; break; } _context.n = 7; return res.text(); case 7: _body = _context.v; if (!_body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_3__.JWT_EXPIRED_MESSAGE)) { _context.n = 9; break; } _context.n = 8; return hooks.request_refresh_jwt(config.fetch.headers.Authorization.substr('Bearer '.length)); case 8: newJwt = _context.v; if (!newJwt) { _context.n = 9; break; } newHeaders = { Authorization: "Bearer ".concat(newJwt) }; config = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(config, { fetch: { headers: newHeaders } }); return _context.a(3, 10); case 9: return _context.a(3, 11); case 10: retry++; _context.n = 2; break; case 11: 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.n = 12; break; } return _context.a(2, res.json().then(function (json) { dispatch({ type: store, payload: { status: res.status, content: json, id } }); return json; })); case 12: _context.n = 13; return res.text(); case 13: content = _context.v; logWarningOnce('Response is missing header: content-type: application/json'); return _context.a(2, dispatch({ type: store, payload: { id, status: res.status, content } })); case 14: _context.p = 14; _t2 = _context.v; message = 'Error from API call: ' + endpoint; (0,_actions__WEBPACK_IMPORTED_MODULE_0__.handleAsyncError)(_t2, message, dispatch); case 15: return _context.a(2); } }, _callee, null, [[3, 5], [1, 14]]); })); return function (_x, _x2) { return _ref.apply(this, arguments); }; }(); } /***/ }), /***/ "./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 */ 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_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pick.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/pluck.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zip.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/toPairs.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/intersection.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_25__ = __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_12__ = __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"); /* harmony import */ var _utils_libraries__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/libraries */ "./src/utils/libraries.ts"); /* harmony import */ var _patternMatching__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./patternMatching */ "./src/actions/patternMatching.ts"); /* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./loading */ "./src/actions/loading.ts"); 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); } function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var addBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddBlocked); var addCompletedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackAggregateActionType.AddCompleted); var addExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddExecuted); var addExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddExecuting); var addPrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddPrioritized); var addRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddRequested); var addStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddStored); var addWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddWatched); var removeExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveExecuted); var removeBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveBlocked); var removeExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveExecuting); var removePrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemovePrioritized); var removeRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveRequested); var removeStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveStored); var removeWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveWatched); var aggregateCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackAggregateActionType.Aggregate); var updateResourceUsage = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])('UPDATE_RESOURCE_USAGE'); var addCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])('ADD_CALLBACK_JOB'); var removeCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["default"])('REMOVE_CALLBACK_JOB'); var setCallbackJobOutdated = (0,redux_actions__WEBPACK_IMPORTED_MODULE_12__["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]; } if (idProps.length !== 1) { if (!idProps.length) { if (spec.allow_optional) { idProps = [_objectSpread(_objectSpread({}, spec), {}, { value: null })]; msg = ''; } else { 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_13__["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_14__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(['id', 'property']), idProps)); } } return [idProps[0], msg]; } 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_16__["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++; } 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); } 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); } throw new ReferenceError(err); } var getVals = function getVals(input) { return Array.isArray(input) ? (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])('value', input) : input.value; }; var zipIfArray = function zipIfArray(a, b) { return Array.isArray(a) ? (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(a, b) : [[a, b]]; }; function cleanOutputProp(property) { return property.split('@')[0]; } function handleClientside(_x, _x2, _x3, _x4) { return _handleClientside.apply(this, arguments); } function _handleClientside() { _handleClientside = _asyncToGenerator(/*#__PURE__*/_regenerator().m(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, _t4; return _regenerator().w(function (_context3) { while (1) switch (_context3.n) { 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.p = 1; namespace = clientside_function.namespace, function_name = clientside_function.function_name; args = inputs.map(getVals); if (state) { args = (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(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.triggered_id = getTriggeredId(payload.changedPropIds); dc.callback_context.inputs_list = inputs; dc.callback_context.inputs = inputDict; dc.callback_context.states_list = state; dc.callback_context.states = stateDict; dc.callback_context.outputs_list = outputs; 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.n = 3; break; } _context3.n = 2; return returnValue; case 2: returnValue = _context3.v; case 3: if (outputs) { 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.n = 6; break; case 4: _context3.p = 4; _t4 = _context3.v; if (!(_t4 === dc.PreventUpdate)) { _context3.n = 5; break; } status = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE; _context3.n = 6; break; case 5: status = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.CLIENTSIDE_ERROR; throw _t4; case 6: _context3.p = 6; 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.f(6); case 7: return _context3.a(2, result); } }, _callee2, null, [[1, 4, 6, 7]]); })); return _handleClientside.apply(this, arguments); } function updateComponent(component_id, props, cb) { return function (dispatch, getState) { var _getState = getState(), paths = _getState.paths, config = _getState.config; var componentPath = (0,_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, component_id); if (!componentPath) { if (!config.suppress_callback_exceptions) { (0,___WEBPACK_IMPORTED_MODULE_5__.dispatchError)(dispatch)('ID running component not found in layout', ['Component defined in running keyword not found in layout.', "Component id: \"".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(component_id), "\""), 'This ID was used in the callback(s) for Output(s):', "".concat(cb.output), 'You can suppress this exception by setting', '`suppress_callback_exceptions=True`.']); } // We need to stop further processing because functions further on // can't operate on an 'undefined' object, and they will throw an // error. return; } dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.updateProps)({ props, itempath: componentPath, renderType: 'callback' })); dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.notifyObservers)({ id: component_id, props })); }; } /** * Update a component props with `running`/`progress`/`set_props` calls. * * @param outputs Props to update. * @param cb The originating callback info. * @returns */ function sideUpdate(outputs, cb) { return function (dispatch, getState) { (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(outputs).reduce(function (acc, _ref2, i) { var _ref3 = _slicedToArray(_ref2, 2), id = _ref3[0], value = _ref3[1]; var componentId = id, propName, replacedIds = []; if (id.startsWith('{')) { var _parsePMCId = (0,_patternMatching__WEBPACK_IMPORTED_MODULE_10__.parsePMCId)(id); var _parsePMCId2 = _slicedToArray(_parsePMCId, 2); componentId = _parsePMCId2[0]; propName = _parsePMCId2[1]; replacedIds = (0,_patternMatching__WEBPACK_IMPORTED_MODULE_10__.replacePMC)(componentId, cb, i, getState); } else if (id.includes('.')) { var _id$split = id.split('.'); var _id$split2 = _slicedToArray(_id$split, 2); componentId = _id$split2[0]; propName = _id$split2[1]; } var props = propName ? { [propName]: value } : value; if (replacedIds.length === 0) { acc.push([componentId, props]); } else if (replacedIds.length === 1) { acc.push([replacedIds[0], props]); } else { replacedIds.forEach(function (rep) { acc.push([rep, props]); }); } return acc; }, []).forEach(function (_ref4) { var _ref5 = _slicedToArray(_ref4, 2), id = _ref5[0], idProps = _ref5[1]; dispatch(updateComponent(id, idProps, cb)); }); }; } function handleServerside(dispatch, hooks, config, payload, background, additionalArgs, getState, running) { if (hooks.request_pre) { hooks.request_pre(payload); } var requestTime = Date.now(); var body = JSON.stringify(payload); var cacheKey; var job; var runningOff; var progressDefault; var moreArgs = additionalArgs; if (running) { dispatch(sideUpdate(running.running, payload)); runningOff = running.runningOff; } 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 newBody = body; var addArg = function addArg(name, value) { var delim = '?'; if (url.includes('?')) { delim = '&'; } url = "".concat(url).concat(delim).concat(name, "=").concat(value); }; if (cacheKey || job) { if (cacheKey) addArg('cacheKey', cacheKey); if (job) addArg('job', job); // clear inputs as background callback doesnt need inputs, just verify for context var tmpBody = JSON.parse(newBody); for (var i = 0; i < tmpBody.inputs.length; i++) { tmpBody.inputs[i]['value'] = null; } for (var _i = 0; _i < ((tmpBody === null || tmpBody === void 0 ? void 0 : tmpBody.state) || []).length; _i++) { tmpBody.state[_i]['value'] = null; } newBody = JSON.stringify(tmpBody); } if (moreArgs) { moreArgs.forEach(function (_ref6) { var _ref7 = _slicedToArray(_ref6, 2), key = _ref7[0], value = _ref7[1]; return addArg(key, value); }); moreArgs = moreArgs.filter(function (_ref8) { var _ref9 = _slicedToArray(_ref8, 3), _ = _ref9[0], __ = _ref9[1], single = _ref9[2]; return !single; }); } return fetch(url, (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(config.fetch, { method: 'POST', headers, body: newBody })); }; 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) { dispatch(sideUpdate(runningOff, payload)); } if (progressDefault) { dispatch(sideUpdate(progressDefault, payload)); } }; 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: JSON.stringify(payload.outputs) }; dispatch(addCallbackJob(jobInfo)); job = data.job; } if (data.sideUpdate) { dispatch(sideUpdate(data.sideUpdate, payload)); } if (data.progress) { dispatch(sideUpdate(data.progress, payload)); } if (!progressDefault && data.progressDefault) { progressDefault = data.progressDefault; } if (!background || data.response !== undefined) { if (data.dist) { Promise.all(data.dist.map(_utils_libraries__WEBPACK_IMPORTED_MODULE_9__.loadLibrary)).then(function () { completeJob(); finishLine(data); }); } else { completeJob(); finishLine(data); } } else { // Poll chain. setTimeout(handle, background.interval !== undefined ? background.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 getTriggeredId(triggered) { // for regular callbacks, takes the first triggered prop_id, e.g. "btn.n_clicks" and returns "btn" // for pattern matching callback, e.g. '{"index":0, "type":"btn"}' and returns {index:0, type: "btn"}' if (triggered && triggered.length) { var trig = triggered[0]; var componentId; if (trig.startsWith('{')) { componentId = JSON.parse(trig.substring(0, trig.lastIndexOf('}') + 1)); } else { componentId = trig.split('.')[0]; } return componentId; } } function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getState) { var allOutputs = _ref0.allOutputs; var _cb$callback = cb.callback, output = _cb$callback.output, inputs = _cb$callback.inputs, state = _cb$callback.state, clientside_function = _cb$callback.clientside_function, background = _cb$callback.background, 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 }); } var outputs = []; var outputErrors = []; allOutputs.forEach(function (out, i) { var _unwrapIfNotMulti3 = unwrapIfNotMulti(paths, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_15__["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_22__["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 _ref1 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { var loadingOutputs, changedPropIds, parsedChangedPropsIds, payload, data, newConfig, newHeaders, lastError, additionalArgs, jsonOutput, _loop, _ret, retry, _t2, _t3; return _regenerator().w(function (_context2) { while (1) switch (_context2.n) { case 0: loadingOutputs = outputs.map(function (out) { var _out$property; return { path: (0,_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, out.id), property: (_out$property = out.property) === null || _out$property === void 0 ? void 0 : _out$property.split('@')[0], id: out.id }; }); dispatch((0,_loading__WEBPACK_IMPORTED_MODULE_11__.loading)(loadingOutputs)); _context2.p = 1; changedPropIds = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(cb.changedPropIds); parsedChangedPropsIds = changedPropIds.map(function (propId) { if (propId.startsWith('{')) { return (0,_patternMatching__WEBPACK_IMPORTED_MODULE_10__.parsePMCId)(propId)[0]; } return propId; }); payload = { output, outputs: (0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.isMultiOutputProp)(output) ? outputs : outputs[0], inputs: inVals, changedPropIds, parsedChangedPropsIds, state: cb.callback.state.length ? fillVals(paths, layout, cb, state, 'State') : undefined }; if (!clientside_function) { _context2.n = 5; break; } _context2.p = 2; _context2.n = 3; return handleClientside(dispatch, clientside_function, config, payload); case 3: data = _context2.v; return _context2.a(2, { data, payload }); case 4: _context2.p = 4; _t2 = _context2.v; return _context2.a(2, { error: _t2, payload }); case 5: newConfig = config; newHeaders = null; additionalArgs = []; jsonOutput = JSON.stringify(payload.outputs); (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(getState().callbackJobs).forEach(function (job) { if (jsonOutput === 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_24__["default"])(job.cancelInputs, cb.callback.inputs); if (inter.length) { additionalArgs.push(['cancelJob', job.jobId]); if (job.progressDefault) { dispatch(sideUpdate(job.progressDefault, payload)); } } }); _loop = /*#__PURE__*/_regenerator().m(function _loop() { var _data, currentLayout, body, oldJwt, newJwt, _t; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: _context.p = 0; _context.n = 1; return handleServerside(dispatch, hooks, newConfig, payload, background, additionalArgs.length ? additionalArgs : undefined, getState, cb.callback.running); case 1: _data = _context.v; if (newHeaders) { dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.addHttpHeaders)(newHeaders)); } // Layout may have changed. currentLayout = getState().layout; (0,ramda__WEBPACK_IMPORTED_MODULE_22__["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_16__["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_16__["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_25__["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.a(2, { v: { data: _data, payload } }); case 2: _context.p = 2; _t = _context.v; lastError = _t; if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_1__.MAX_AUTH_RETRIES && (_t.status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.UNAUTHORIZED || _t.status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.BAD_REQUEST))) { _context.n = 5; break; } _context.n = 3; return _t.text(); case 3: body = _context.v; if (!body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_0__.JWT_EXPIRED_MESSAGE)) { _context.n = 5; break; } if (!(hooks.request_refresh_jwt !== null)) { _context.n = 5; break; } oldJwt = null; if (config.fetch.headers.Authorization) { oldJwt = config.fetch.headers.Authorization.substr('Bearer '.length); } _context.n = 4; return hooks.request_refresh_jwt(oldJwt); case 4: newJwt = _context.v; if (!newJwt) { _context.n = 5; break; } newHeaders = { Authorization: "Bearer ".concat(newJwt) }; newConfig = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(config, { fetch: { headers: newHeaders } }); return _context.a(2, 0); case 5: return _context.a(2, 1); } }, _loop, null, [[0, 2]]); }); retry = 0; case 6: if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_1__.MAX_AUTH_RETRIES)) { _context2.n = 11; break; } return _context2.d(_regeneratorValues(_loop()), 7); case 7: _ret = _context2.v; if (!(_ret === 0)) { _context2.n = 8; break; } return _context2.a(3, 10); case 8: if (!(_ret === 1)) { _context2.n = 9; break; } return _context2.a(3, 11); case 9: if (!_ret) { _context2.n = 10; break; } return _context2.a(2, _ret.v); case 10: retry++; _context2.n = 6; break; case 11: return _context2.a(2, { error: lastError, payload: null }); case 12: _context2.p = 12; _t3 = _context2.v; return _context2.a(2, { error: _t3, payload: null }); case 13: _context2.p = 13; dispatch((0,_loading__WEBPACK_IMPORTED_MODULE_11__.loaded)(loadingOutputs)); return _context2.f(13); case 14: return _context2.a(2); } }, _callee, null, [[2, 4], [1, 12, 13, 14]]); })); return function __execute() { return _ref1.apply(this, arguments); }; }(); var newCb = _objectSpread(_objectSpread({}, cb), {}, { executionPromise: __execute() }); return newCb; } catch (error) { return _objectSpread(_objectSpread({}, cb), {}, { executionPromise: { error, payload: null } }); } } /***/ }), /***/ "./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 */ 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, INSERT_COMPONENT: 1, REMOVE_COMPONENT: 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/actions/dependencies.js": /*!*************************************!*\ !*** ./src/actions/dependencies.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 */ }); /* 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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); } /* * 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_6__["default"])(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; } /* * 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(',') + '}'; } /* * 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; } 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_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; var hasOutputs = true; if (outputs.length === 1 && !outputs[0].id && !outputs[0].property) { hasOutputs = false; } 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); }); }); if (hasOutputs) { findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs); findMismatchedWildcards(outputs, inputs, state, head, dispatchError); } }); } 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.']); } if (_typeof(id) === 'object') { if ((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(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_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(', ')]); } } 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) { 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_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.length ? outputs[0].id : undefined), 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; }; 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 (_ref0) { var outputs = _ref0.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 (_ref1) { var id = _ref1.id, property = _ref1.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 (_ref10) { var keys = _ref10.keys, values = _ref10.values, callbacks = _ref10.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, no_output = dep.no_output; var out = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])({ inputs: fixIds, state: fixIds }, dep); if (no_output) { // No output case out.outputs = []; out.noOutput = true; } else { 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]); } 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_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; } } 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); } } } 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_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; } /* 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_2__.combineIdAndProp)({ id, property }), outIdProp); }); } else { addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.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.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); } }); }); // 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 }; } /* * 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(_ref11) { var id = _ref11.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 (_ref12) { var outId = _ref12.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, ''); 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 []; } 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); }); }); } /* * 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/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 */ 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_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/partition.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.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/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 _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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r) { if (Array.isArray(r)) return r; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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)); } }); } matches.forEach(function (match) { match.changedPropIds[idAndProp] = changeType || DIRECT; if (withPriority) { match.priority = getPriority(graphs, paths, match); } }); 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 []; } // 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)); // 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)); // 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))); } } // Ramda.JS `difference` function is slow because it compares objects entirely // This cause the following `filter` to be exponentially slow as the number of inputs or outputs grow // We can optimize this by comparing only the `id+prop` part of the inputs & outputs. // Original difference takes 380ms on average to compute difference between 200 inputs and 1 output. // The following function takes 1-2ms on average. var differenceBasedOnId = function differenceBasedOnId(inputs, outputs) { return inputs.filter(function (input) { return !outputs.some(function (output) { return combineIdAndProp(input) === combineIdAndProp(output); }); }); }; // 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)]; }, differenceBasedOnId((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths)), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)))); }, candidates); }; 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_11__["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_12__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_13__["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]; // If there's no additional exclusions, break loop - callbacks have been cleaned if (!excluded.length) { break; } callbacks = included; // 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); }); } } /* 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))); } /* * 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_11__["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_11__["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 }] : []; } 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 (_ref0) { var vals = _ref0.values, path = _ref0.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/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 */ addComponentToLayout: function() { return /* binding */ addComponentToLayout; }, /* 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 */ insertComponent: function() { return /* binding */ insertComponent; }, /* harmony export */ notifyObservers: function() { return /* binding */ notifyObservers; }, /* harmony export */ onError: function() { return /* binding */ onError; }, /* harmony export */ onPropChange: function() { return /* binding */ onPropChange; }, /* harmony export */ redo: function() { return /* binding */ redo; }, /* harmony export */ removeComponent: function() { return /* binding */ removeComponent; }, /* 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 ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.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_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"); /* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../persistence */ "./src/persistence.js"); function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } var onError = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ON_ERROR')); var setAppLifecycle = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_APP_LIFECYCLE')); var setConfig = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_CONFIG')); var addHttpHeaders = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ADD_HTTP_HEADERS')); var setGraphs = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_GRAPHS')); var setHooks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_HOOKS')); var setLayout = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_LAYOUT')); var setPaths = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_PATHS')); var setRequestQueue = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_REQUEST_QUEUE')); var insertComponent = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('INSERT_COMPONENT')); var removeComponent = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('REMOVE_COMPONENT')); var onPropChange = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ON_PROP_CHANGE')); function updateProps(payload) { return function (dispatch, getState) { var component = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(payload.itempath, getState().layout); (0,_persistence__WEBPACK_IMPORTED_MODULE_7__.recordUiEdit)(component, payload.props, dispatch); dispatch(onPropChange(payload)); }; } var addComponentToLayout = function addComponentToLayout(payload) { return function (dispatch, getState) { var _getState = getState(), paths = _getState.paths; dispatch(insertComponent(payload)); dispatch(setPaths((0,_paths__WEBPACK_IMPORTED_MODULE_6__.computePaths)(payload.component, payload.componentPath, paths))); }; }; 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_10__["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 _getState2 = getState(), graphs = _getState2.graphs, paths = _getState2.paths, layout = _getState2.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 _getState3 = getState(), history = _getState3.history, paths = _getState3.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_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__*/_regenerator().m(function _callee(dispatch, getState) { var _getState4, graphs, paths; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: _getState4 = getState(), graphs = _getState4.graphs, paths = _getState4.paths; dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_0__.addRequestedCallbacks)((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_5__.includeObservers)(id, props, graphs, paths))); case 1: return _context.a(2); } }, _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"); /* harmony default export */ __webpack_exports__["default"] = (function (layout, paths, targets) { if (!targets.length) { return true; } 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_2__.getPath)(paths, id); if (!pathOfId) { return; } var target = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(pathOfId, layout); if (!target) { return; } 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; })])); } }); return promises.length ? Promise.all(promises) : true; }); /***/ }), /***/ "./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/loading.ts": /*!********************************!*\ !*** ./src/actions/loading.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 */ loaded: function() { return /* binding */ loaded; }, /* harmony export */ loading: function() { return /* binding */ loading; } /* harmony export */ }); /* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); var loading = (0,redux_actions__WEBPACK_IMPORTED_MODULE_0__["default"])('LOADING'); var loaded = (0,redux_actions__WEBPACK_IMPORTED_MODULE_0__["default"])('LOADED'); /***/ }), /***/ "./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 _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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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"); 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); } /* * 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_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; } }, oldObjs); } (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); } } else { strs[id] = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(startingPath, itempath); } } }); // We include an event emitter here because it will be used along with // paths to determine when the app is ready for callbacks. return { strs, objs, events: events || oldPaths.events }; } 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/actions/patternMatching.ts": /*!****************************************!*\ !*** ./src/actions/patternMatching.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 */ getAllPMCIds: function() { return /* binding */ getAllPMCIds; }, /* harmony export */ parsePMCId: function() { return /* binding */ parsePMCId; }, /* harmony export */ replacePMC: function() { return /* binding */ replacePMC; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/toPairs.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } /** * Deserialize pattern matching ids that come in one of the form: * - '{"type":"component","index":["MATCH"]}.children' * - '{"type":"component","index":["MATCH"]}' * * @param id The raw object as a string id. * @returns The id object. */ function parsePMCId(id) { var componentId, propName; var index = id.lastIndexOf('}'); if (index + 2 < id.length) { propName = id.substring(index + 2); componentId = JSON.parse(id.substring(0, index + 1)); } else { componentId = JSON.parse(id); } return [componentId, propName]; } /** * Get all the associated ids for an id. * * @param id Id to get all the pmc ids from. * @param state State of the store. * @param triggerKey Key to remove from the equality comparison. * @returns */ function getAllPMCIds(id, state, triggerKey) { var keysOfIds = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(id); var idKey = keysOfIds.join(','); return state.paths.objs[idKey].map(function (obj) { return keysOfIds.reduce(function (acc, key, i) { acc[key] = obj.values[i]; return acc; }, {}); }).filter(function (obj) { return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(triggerKey, obj), (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(triggerKey, id)); }); } /** * Replace the pattern matching ids with the actual trigger value * for MATCH, all the ids for ALL and smaller than the trigger value * for ALLSMALLER. * * @param id The parsed id in dictionary format. * @param cb Original callback info. * @param index Index of the dependency in case there is more than one changed id. * @param getState Function to get the state of the redux store. * @returns List of replaced ids. */ function replacePMC(id, cb, index, getState) { var extras = []; var replaced = {}; (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(id).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; if (extras.length) { // All done. return; } if (Array.isArray(value)) { var triggerValue = (cb.parsedChangedPropsIds[index] || cb.parsedChangedPropsIds[0])[key]; if (value.includes('MATCH')) { replaced[key] = triggerValue; } else if (value.includes('ALL')) { extras = getAllPMCIds(id, getState(), key); } else if (value.includes('ALLSMALLER')) { extras = getAllPMCIds(id, getState(), key).filter(function (obj) { return obj[key] < triggerValue; }); } } else { replaced[key] = value; } }); if (extras.length) { return extras; } return [replaced]; } /***/ }), /***/ "./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"); 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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function requestDependencies() { return function (dispatch, getState) { (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { var _getState = getState(), graphs = _getState.graphs; dispatch((0,_index__WEBPACK_IMPORTED_MODULE_1__.setGraphs)(_objectSpread(_objectSpread({}, graphs), {}, { reset: true }))); dispatch((0,_api__WEBPACK_IMPORTED_MODULE_2__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); }); }; } /***/ }), /***/ "./src/actions/utils.js": /*!******************************!*\ !*** ./src/actions/utils.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 */ }); /* 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 _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); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } /* * 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); } 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_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; } 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)); } }); } 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); } 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 (found) { _backPath.push(curPath); } else { _frontPath.push(curPath); } } } 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])); } } } } 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); } } }); } }; // 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 = {}; } return _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]; } 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); }); } }]); }(); /***/ }), /***/ "./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 */ 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__); 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); } /* * 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__); function Loading(props) { if (props.isLoading) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "_dash-loading-callback" }); } return null; } Loading.propTypes = { isLoading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired }; /* 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 _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); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var Reloader = /*#__PURE__*/function (_React$Component) { function Reloader(props) { var _this; _classCallCheck(this, Reloader); _this = _callSuper(this, Reloader, [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(_this); return _this; } _inherits(Reloader, _React$Component); return _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(); } (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; } } } 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' }); } } 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; } }]); }((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/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"); 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_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); /* 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); /***/ }), /***/ "./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 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 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.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"); 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_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); /***/ }), /***/ "./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 */ CallbackGraphContainer: function() { return /* binding */ CallbackGraphContainer; } /* 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.esm.mjs"); /* 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(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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); } 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_8__.stringifyId)(id); var idType = _typeof(id) === 'object' ? 'wildcard' : 'component'; // 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_13__["default"])(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_14__["default"])(status).length === 2) { return status.latest; } return status; } function flattenOutputs(res) { var outputs = {}; for (var idStr in res) { for (var prop in res[idStr]) { outputs[idStr + '.' + prop] = res[idStr][prop]; } } return outputs; } function flattenInputs(inArray, final) { (inArray || []).forEach(function (inItem) { if (Array.isArray(inItem)) { flattenInputs(inItem, final); } else { var id = inItem.id, property = inItem.property, value = inItem.value; final[(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_8__.stringifyId)(id) + '.' + property] = value; } }); 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; }); 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; }); // 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; } var idPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, id); return idPath ? (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(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(); }); // 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_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..."))); } // 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; } case 'property': { elementName = data.parent; elementInfo[data.label] = getPropValue(data); break; } // 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)); }; 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_17__["default"])(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_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; } })) : 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); }))); } CallbackGraph.propTypes = {}; var UnconnectedCallbackGraphContainer = /*#__PURE__*/function (_Component) { function UnconnectedCallbackGraphContainer(props) { var _this; _classCallCheck(this, UnconnectedCallbackGraphContainer); _this = _callSuper(this, UnconnectedCallbackGraphContainer, [props]); _this.state = { hasError: false }; return _this; } _inherits(UnconnectedCallbackGraphContainer, _Component); return _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 }; } }]); }(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); /***/ }), /***/ "./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': 'Verdana, 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); /***/ }), /***/ "./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 */ 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. 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 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; } /** * 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; // 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)); } 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/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 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 _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); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var ComponentErrorBoundary = /*#__PURE__*/function (_Component) { function ComponentErrorBoundary(props) { var _this; _classCallCheck(this, ComponentErrorBoundary); _this = _callSuper(this, ComponentErrorBoundary, [props]); _this.state = { myID: props.componentId, oldChildren: null, hasError: false }; return _this; } _inherits(ComponentErrorBoundary, _Component); 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); } }, { 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 }; } }]); }(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/components/error/FrontEnd/FrontEndError.css": /*!*********************************************************!*\ !*** ./src/components/error/FrontEnd/FrontEndError.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_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); /***/ }), /***/ "./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 */ 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 _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); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(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 _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(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 && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var FrontEndError = /*#__PURE__*/function (_Component) { function FrontEndError(props) { var _this; _classCallCheck(this, FrontEndError); _this = _callSuper(this, FrontEndError, [props]); _this.state = { collapsed: _this.props.isListItem }; return _this; } _inherits(FrontEndError, _Component); return _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-item test-devtools-error-toggle", onClick: function onClick() { return _this2.setState({ collapsed: !collapsed }); } }, /*#__PURE__*/React.createElement("span", { className: "dash-fe-error-top__group" }, /*#__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 }); } }))); return /*#__PURE__*/React.createElement("div", { className: cardClasses }, errorHeader, !collapsed && /*#__PURE__*/React.createElement(ErrorContent, { error: e.error })); } }]); }(react__WEBPACK_IMPORTED_MODULE_2__.Component); function BackendError(_ref) { var error = _ref.error, base = _ref.base; var iframeRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)(null); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)('500px'), _useState2 = _slicedToArray(_useState, 2), height = _useState2[0], setHeight = _useState2[1]; // Default height (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () { var handleMessage = function handleMessage(event) { if (event.data && _typeof(event.data) === 'object' && event.data.type === 'IFRAME_HEIGHT') { setHeight("".concat(event.data.height, "px")); } }; window.addEventListener('message', handleMessage); return function () { return window.removeEventListener('message', handleMessage); }; }, []); return /*#__PURE__*/React.createElement("iframe", { ref: iframeRef, srcDoc: error.html.replace('', "\n ")).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)', border: 'none', height: height } }); } var MAX_MESSAGE_LENGTH = 40; /* eslint-disable no-inline-comments */ function UnconnectedErrorContent(_ref2) { var error = _ref2.error, base = _ref2.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, ' r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } var classes = function classes(base, variant, variant2) { return "".concat(base, " ").concat(base, "--").concat(variant) + (variant2 ? " ".concat(base, "--").concat(variant2) : ''); }; var isCollapsed = function isCollapsed() { try { return localStorage.getItem('dash_debug_menu_collapsed') === 'true'; } catch (e) { // If localStorage is not available, default to false return false; } }; var MenuContent = function MenuContent(_ref) { var hotReload = _ref.hotReload, connected = _ref.connected, popup = _ref.popup, toggleErrors = _ref.toggleErrors, errCount = _ref.errCount, toggleCallbackGraph = _ref.toggleCallbackGraph, config = _ref.config; var _StatusIcon = hotReload ? connected ? _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"] : _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_7__["default"] : _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_4__["default"]; var status = hotReload ? connected ? 'available' : 'unavailable' : 'cold'; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__content" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: toggleErrors, className: (popup == 'errors' ? 'dash-debug-menu__button--selected' : null) + ' dash-debug-menu__button', id: "dash-debug-menu__errors-button" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_ErrorIcon_svg__WEBPACK_IMPORTED_MODULE_5__["default"], { className: "dash-debug-menu__icon" }), "Errors", errCount > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "test-devtools-error-count dash-debug-menu__error-count" }, errCount) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: toggleCallbackGraph, className: (popup == 'callbackGraph' ? 'dash-debug-menu__button--selected' : '') + ' dash-debug-menu__button', id: "dash-debug-menu__callback-graph-button" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_GraphIcon_svg__WEBPACK_IMPORTED_MODULE_6__["default"], { className: "dash-debug-menu__icon" }), "Callbacks"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__divider" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_VersionInfo_react__WEBPACK_IMPORTED_MODULE_9__.VersionInfo, { config: config }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__divider" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__status dash-debug-menu__button--".concat(status) }, "Server", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_StatusIcon, { className: "dash-debug-menu__icon" })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__divider", style: { marginRight: 0 } })); }; var DebugMenu = function DebugMenu(_ref2) { var error = _ref2.error, hotReload = _ref2.hotReload, config = _ref2.config, children = _ref2.children; var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('errors'), _useState2 = _slicedToArray(_useState, 2), popup = _useState2[0], setPopup = _useState2[1]; var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(isCollapsed), _useState4 = _slicedToArray(_useState3, 2), collapsed = _useState4[0], setCollapsed = _useState4[1]; var errCount = error.frontEnd.length + error.backEnd.length; var connected = error.backEndConnected; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (errCount > 0 && popup == null) { setPopup('errors'); } }, [errCount]); var toggleErrors = function toggleErrors() { setPopup(popup == 'errors' ? null : 'errors'); }; var toggleCallbackGraph = function toggleCallbackGraph() { setPopup(popup == 'callbackGraph' ? null : 'callbackGraph'); }; var toggleCollapsed = function toggleCollapsed() { setCollapsed(!collapsed); try { localStorage.setItem('dash_debug_menu_collapsed', !collapsed); } catch (e) { // If localStorage is not available, do nothing } }; var errors = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(error.frontEnd, error.backEnd); var popupContent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__popup" }, popup == 'callbackGraph' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CallbackGraph_CallbackGraphContainer_react__WEBPACK_IMPORTED_MODULE_10__.CallbackGraphContainer, null) : undefined, popup == 'errors' && errCount > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEnd_FrontEndErrorContainer_react__WEBPACK_IMPORTED_MODULE_11__.FrontEndErrorContainer, { clickHandler: toggleErrors, errors: errors, connected: error.backEndConnected }) : undefined); var menuContent = collapsed ? undefined : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MenuContent, { popup: popup, errCount: errCount, toggleErrors: toggleErrors, toggleCallbackGraph: toggleCallbackGraph, config: config, hotReload: hotReload, connected: connected }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: classes('dash-debug-menu__outer', collapsed ? 'collapsed' : 'expanded') }, popupContent, menuContent, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: toggleCollapsed, className: classes('dash-debug-menu__toggle', collapsed ? 'collapsed' : 'expanded') }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_Expand_svg__WEBPACK_IMPORTED_MODULE_8__["default"], null), errCount > 0 && collapsed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__error-indicator" }) : null)), children); }; 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), config: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object) }; /***/ }), /***/ "./src/components/error/menu/VersionInfo.css": /*!***************************************************!*\ !*** ./src/components/error/menu/VersionInfo.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_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./VersionInfo.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.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_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); /***/ }), /***/ "./src/components/error/menu/VersionInfo.react.js": /*!********************************************************!*\ !*** ./src/components/error/menu/VersionInfo.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 */ VersionInfo: function() { return /* binding */ VersionInfo; } /* 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 _VersionInfo_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VersionInfo.css */ "./src/components/error/menu/VersionInfo.css"); function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } var DAY_IN_MS = 86400000; function compareVersions(v1, v2) { // Remove any non-numeric characters from the version strings // and anything after them (e.g. 1.2.3-rc.1 -> 1.2.3, 1.2.3+build.1 -> 1.2.3) v1 = v1.replace(/\.?[^0-9.].*$/, ''); v2 = v2.replace(/\.?[^0-9.].*$/, ''); var v1Parts = v1.split('.').map(Number); var v2Parts = v2.split('.').map(Number); for (var i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) { var part1 = v1Parts[i] || 0; var part2 = v2Parts[i] || 0; if (part1 > part2) return 1; if (part1 < part2) return -1; } return 0; } function requestDashVersionInfo(_x) { return _requestDashVersionInfo.apply(this, arguments); } function _requestDashVersionInfo() { _requestDashVersionInfo = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(config) { var currentDashVersion, dashVersionUrl, pythonVersion, ddkVersion, plotlyVersion, cachedVersionInfo, cachedNewDashVersionLink, lastFetched, queryParams, _t; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: currentDashVersion = config.dash_version, dashVersionUrl = config.dash_version_url, pythonVersion = config.python_version, ddkVersion = config.ddk_version, plotlyVersion = config.plotly_version; _context.p = 1; cachedVersionInfo = localStorage.getItem('cachedNewDashVersion'); cachedNewDashVersionLink = localStorage.getItem('cachedNewDashVersionLink'); lastFetched = localStorage.getItem('lastFetched'); _context.n = 3; break; case 2: _context.p = 2; _t = _context.v; return _context.a(2, {}); case 3: if (!(lastFetched && Date.now() - Number(lastFetched) < DAY_IN_MS && cachedVersionInfo)) { _context.n = 4; break; } return _context.a(2, { version: JSON.parse(cachedVersionInfo), link: cachedNewDashVersionLink }); case 4: if (!shouldRequestDashVersion(config)) { _context.n = 5; break; } queryParams = new URLSearchParams({ dash_version: currentDashVersion, python_version: pythonVersion, ddk_version: ddkVersion, plotly_version: plotlyVersion }).toString(); return _context.a(2, fetch(dashVersionUrl + '?' + queryParams, { mode: 'cors' }).then(function (response) { return response.json(); }).then(function (body) { if (body && body.version && body.link) { try { localStorage.setItem('cachedNewDashVersion', JSON.stringify(body.version)); localStorage.setItem('cachedNewDashVersionLink', body.link); localStorage.setItem('lastFetched', Date.now()); } catch (e) { // Ignore errors if localStorage is not available } return body; } else { return {}; } }).catch(function () { return {}; })); case 5: return _context.a(2); } }, _callee, null, [[1, 2]]); })); return _requestDashVersionInfo.apply(this, arguments); } function shouldRequestDashVersion(config) { // If version check is disabled, return false to avoid // checking localStorage unnecessarily if (config.disable_version_check) { return false; } var showNotifications, lastFetched; try { showNotifications = localStorage.getItem('showNotifications') !== 'false'; lastFetched = localStorage.getItem('lastFetched'); } catch (e) { // If localStorage is not available, return false return false; } return showNotifications && (!lastFetched || Date.now() - Number(lastFetched) > DAY_IN_MS); } function shouldShowUpgradeNotification(currentDashVersion, newDashVersion, config) { // If version check is disabled, return false to avoid // checking localStorage unnecessarily if (config.disable_version_check) { return false; } var showNotifications, lastDismissed, lastDismissedVersion; try { showNotifications = localStorage.getItem('showNotifications') !== 'false'; lastDismissed = localStorage.getItem('lastDismissed'); lastDismissedVersion = localStorage.getItem('lastDismissedVersion'); } catch (e) { // If localStorage is not available, return false return false; } if (newDashVersion === undefined || compareVersions(currentDashVersion, newDashVersion) >= 0 || !showNotifications) { return false; } else if (lastDismissed && Date.now() - Number(lastDismissed) > DAY_IN_MS) { return true; } else if (lastDismissedVersion && !lastDismissed && compareVersions(lastDismissedVersion, newDashVersion) < 0) { return true; } else { return !lastDismissed && !lastDismissedVersion; } } var VersionInfo = function VersionInfo(_ref) { var config = _ref.config; var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined), _useState2 = _slicedToArray(_useState, 2), newDashVersion = _useState2[0], setNewDashVersion = _useState2[1]; var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined), _useState4 = _slicedToArray(_useState3, 2), newDashVersionLink = _useState4[0], setNewDashVersionLink = _useState4[1]; var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false), _useState6 = _slicedToArray(_useState5, 2), upgradeTooltipOpened = _useState6[0], setUpgradeTooltipOpened = _useState6[1]; var setDontShowAgain = function setDontShowAgain() { // Set local storage to record the last dismissed notification try { localStorage.setItem('showNotifications', false); } catch (e) { // Ignore errors if localStorage is not available } setUpgradeTooltipOpened(false); }; var setRemindMeLater = function setRemindMeLater() { // Set local storage to record the last dismissed notification try { localStorage.setItem('lastDismissed', Date.now()); } catch (e) { // Ignore errors if localStorage is not available } setUpgradeTooltipOpened(false); }; var setSkipThisVersion = function setSkipThisVersion() { // Set local storage to record the last dismissed version try { localStorage.setItem('lastDismissedVersion', newDashVersion); } catch (e) { // Ignore errors if localStorage is not available } setUpgradeTooltipOpened(false); }; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { requestDashVersionInfo(config).then(function (body) { if (body) { setNewDashVersionLink(body.link); setNewDashVersion(body.version); } }); }, []); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { var hideUpgradeTooltip = function hideUpgradeTooltip(e) { if (upgradeTooltipOpened && !e.target.matches('.dash-debug-menu__version, .dash-debug-menu__version *')) { setUpgradeTooltipOpened(false); } }; // Close the upgrade tooltip if the user clicks outside of it document.addEventListener('click', hideUpgradeTooltip); return function () { return document.removeEventListener('click', hideUpgradeTooltip); }; }, [upgradeTooltipOpened]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__version" }, upgradeTooltipOpened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__upgrade-tooltip" }, newDashVersionLink ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { target: "_blank", href: newDashVersionLink }, "Read details") : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: setSkipThisVersion }, "Skip this version"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: setRemindMeLater }, "Remind me tomorrow"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: setDontShowAgain }, "Silence all version notifications")) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "v", config.dash_version), shouldShowUpgradeNotification(config.dash_version, newDashVersion, config) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "dash-debug-menu__upgrade-button", onClick: function onClick() { return setUpgradeTooltipOpened(!upgradeTooltipOpened); } }, "Dash update available - v", newDashVersion) : null); }; /***/ }), /***/ "./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__); // 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 overflow: hidden;\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__) { "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 : '{}'); } /***/ }), /***/ "./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' }; /***/ }), /***/ "./src/dashApi.ts": /*!************************!*\ !*** ./src/dashApi.ts ***! \************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var _wrapper_DashContext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapper/DashContext */ "./src/wrapper/DashContext.tsx"); /* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions/paths */ "./src/actions/paths.js"); /* harmony import */ var _utils_stores__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/stores */ "./src/utils/stores.ts"); /* harmony import */ var _wrapper_ExternalWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./wrapper/ExternalWrapper */ "./src/wrapper/ExternalWrapper.tsx"); /* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); /** * Get the dash props from a component path or id. * * @param componentPathOrId The path or the id of the component to get the props of. * @param propPath Additional key to get the property instead of plain props. * @returns */ function getLayout(componentPathOrId) { var ds = (0,_utils_stores__WEBPACK_IMPORTED_MODULE_2__.getStores)(); for (var y = 0; y < ds.length; y++) { var _ds$y$getState = ds[y].getState(), paths = _ds$y$getState.paths, layout = _ds$y$getState.layout; var componentPath = void 0; if (!Array.isArray(componentPathOrId)) { componentPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_1__.getPath)(paths, componentPathOrId); } else { componentPath = componentPathOrId; } var props = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(componentPath, layout); if (props !== undefined) { return props; } } } window.dash_component_api = { ExternalWrapper: _wrapper_ExternalWrapper__WEBPACK_IMPORTED_MODULE_3__["default"], DashContext: _wrapper_DashContext__WEBPACK_IMPORTED_MODULE_0__.DashContext, useDashContext: _wrapper_DashContext__WEBPACK_IMPORTED_MODULE_0__.useDashContext, getLayout, stringifyId: _actions_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId }; /***/ }), /***/ "./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); }); /***/ }), /***/ "./src/observers/documentTitle.ts": /*!****************************************!*\ !*** ./src/observers/documentTitle.ts ***! \****************************************/ /***/ (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_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 _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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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; } // 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', renderType: 'callback' })); return props; } 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)); // 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 }); })); // 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 message; if (cb.callback.no_output) { var inpts = (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(cb.changedPropIds).join(', '); message = "Callback error with no output from input ".concat(inpts); } else { 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; 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/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_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 _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); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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__*/_regenerator().m(function _callee(cb) { var result, _getState2, watched, appLifecycle, callback_resolved, currentCb; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: _context.n = 1; return cb.executionPromise; case 1: result = _context.v; _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.n = 2; break; } return _context.a(2); case 2: 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_4__["default"])(function (_cb) { return _cb === cb || _cb.executionPromise === cb.executionPromise; }, watched); if (currentCb) { _context.n = 3; break; } return _context.a(2); case 3: // 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 4: return _context.a(2); } }, _callee); })); return function (_x) { return _ref2.apply(this, arguments); }; }()); }, inputs: ['callbacks.executing'] }; /* 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 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/observers/prioritizedCallbacks.ts": /*!***********************************************!*\ !*** ./src/observers/prioritizedCallbacks.ts ***! \***********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* 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/sort.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __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 _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); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r) { if (Array.isArray(r)) return r; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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_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 { allOutputs, allPropIds }; }; var getIds = function getIds(cb, paths) { var items = [].concat(_toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths))), _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getState(paths)))); var uniqueIds = new Map(items.map(function (item) { return [(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(item.id), item]; })); var uniqueItems = Array.from(uniqueIds.values()); return uniqueItems; }; var observer = { observer: function () { var _observer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(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 _regenerator().w(function (_context2) { while (1) switch (_context2.n) { 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.n = 1; break; } return _context2.a(2); case 1: 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_6__["default"])(sortPriority, prioritized); // Divide between sync and async _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["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_8__["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_8__["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__*/_regenerator().m(function _callee(cb) { var _getState3, blocked, currentCb, executingCallback; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: _context.n = 1; return cb.isReady; case 1: _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_9__["default"])(function (_cb) { return _cb === cb || _cb.isReady === cb.isReady; }, blocked); if (currentCb) { _context.n = 2; break; } return _context.a(2); case 2: 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 3: return _context.a(2); } }, _callee); })); return function (_x2) { return _ref3.apply(this, arguments); }; }()); } case 2: return _context2.a(2); } }, _callee2); })); function observer(_x) { return _observer.apply(this, arguments); } return observer; }(), inputs: ['callbacks.prioritized', 'callbacks.completed'] }; /* 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_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 _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); } function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } var observer = { observer: function () { var _observer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(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 _regenerator().w(function (_context2) { while (1) switch (_context2.n) { case 0: dispatch = _ref.dispatch, getState = _ref.getState; _context2.n = 1; return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_3__["default"])(0); case 1: _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); /* 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])); } } }); /* 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.n = 4; break; } candidates = requested.slice(0); _loop = /*#__PURE__*/_regenerator().m(function _loop() { var readyCallback, blockedByAssumptions, modified; return _regenerator().w(function (_context) { while (1) switch (_context.n) { 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 1: return _context.a(2); } }, _loop); }); case 2: if (!candidates.length) { _context2.n = 4; break; } return _context2.d(_regeneratorValues(_loop()), 3); case 3: _context2.n = 2; break; case 4: /* 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])); // 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 5: return _context2.a(2); } }, _callee); })); function observer(_x) { return _observer.apply(this, arguments); } 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_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(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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/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_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(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } 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); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Generalized persistence for component props * * When users input new prop values, they can be stored and reapplied later, * when the component is recreated (changing `Tab` for example) or when the * page is reloaded (depending on `persistence_type`). Storage is tied to * component ID, and the prop values will not be stored with components * without an ID. * * Renderer handles the mechanics, but components must define a few props: * * - `persistence`: boolean, string, or number. For simple usage, set to `true` * to enable persistence, omit or set `false` to disable. For more complex * scenarios, use any truthy value, and change to a *different* truthy value * when you want the persisted values cleared. (modeled off `uirevision` in) * plotly.js * Typically should have no default, but the other persistence props should * have defaults, so all a user needs to do to enable persistence is set this * one prop. * * - `persisted_props`: array of prop names or "nested prop IDs" allowed to * persist. Normally should default to the full list of supported props, * so they can all be enabled at once. The main exception to this is if * there's a prop that *can* be persisted but most users wouldn't want this. * A nested prop ID describes *part* of a prop to store. It must be * "." where propName is the prop that has this info, and * piece may or may not map to the exact substructure being stored but is * meaningful to the user. For example, in `dash_table`, `columns.name` * stores `columns[i].name` for all columns `i`. Nested props also need * entries in `persistenceTransforms` - see below. * * - `persistence_type`: one of "local", "session", or "memory", just like * `dcc.Store`. But the default here should be "local" because the main use * case is to maintain settings across reloads. * * If any `persisted_props` are nested prop IDs, the component should define a * class property (not a React prop) `persistenceTransforms`, as an object: * { * [propName]: { * [piece]: { * extract: propValue => valueToStore, * apply: (storedValue, propValue) => newPropValue * } * } * } * - `extract` turns a prop value into a reduced value to store. * - `apply` puts an extracted value back into the prop. Make sure this creates * a new object rather than mutating `proValue`, and that if there are * multiple `piece` entries for one `propName`, their `apply` functions * commute - which should not be an issue if they extract and apply * non-intersecting parts of the full prop. * You only need to define these for the props that need them. * It's important that `extract` pulls out *only* the relevant pieces of the * prop, because persistence is only maintained if the extracted value of the * prop before applying persistence is the same as it was before the user's * changes. */ var storePrefix = '_dash_persistence.'; function err(e) { var error = typeof e === 'string' ? new Error(e) : e; return (0,redux_actions__WEBPACK_IMPORTED_MODULE_2__["default"])('ON_ERROR')({ type: 'frontEnd', error }); } /* * Does a key fit this prefix? Must either be an exact match * or, if a separator is provided, a scoped match - exact prefix * followed by the separator (then anything else) */ function keyPrefixMatch(prefix, separator) { var fullStr = prefix + separator; var fullLen = fullStr.length; return function (key) { return key === prefix || key.substr(0, fullLen) === fullStr; }; } var UNDEFINED = 'U'; var _parse = function _parse(val) { return val === UNDEFINED ? undefined : JSON.parse(val || null); }; var _stringify = function _stringify(val) { return val === undefined ? UNDEFINED : JSON.stringify(val); }; var WebStore = /*#__PURE__*/function () { function WebStore(backEnd) { _classCallCheck(this, WebStore); this._name = backEnd; this._storage = window[backEnd]; } return _createClass(WebStore, [{ key: "hasItem", value: function hasItem(key) { return this._storage.getItem(storePrefix + key) !== null; } }, { key: "getItem", value: function getItem(key) { // note: _storage.getItem returns null on missing keys // and JSON.parse(null) returns null as well return _parse(this._storage.getItem(storePrefix + key)); } }, { key: "_setItem", value: function _setItem(key, value) { // unprotected version of setItem, for use by tryGetWebStore this._storage.setItem(storePrefix + key, _stringify(value)); } /* * In addition to the regular key->value to set, setItem takes * dispatch as a parameter, so it can report OOM to devtools */ }, { key: "setItem", value: function setItem(key, value, dispatch) { try { this._setItem(key, value); } catch (e) { dispatch(err("".concat(key, " failed to save in ").concat(this._name, ". Persisted props may be lost."))); // TODO: at some point we may want to convert this to fall back // on memory, pulling out all persistence keys and putting them // in a MemStore that gets used from then onward. } } }, { key: "removeItem", value: function removeItem(key) { this._storage.removeItem(storePrefix + key); } /* * clear matching keys matching (optionally followed by a dot and more * characters) - or all keys associated with this store if no prefix. */ }, { key: "clear", value: function clear(keyPrefix) { var _this = this; var fullPrefix = storePrefix + (keyPrefix || ''); var keyMatch = keyPrefixMatch(fullPrefix, keyPrefix ? '.' : ''); var keysToRemove = []; // 2-step process, so we don't depend on any particular behavior of // key order while removing some for (var i = 0; i < this._storage.length; i++) { var fullKey = this._storage.key(i); if (keyMatch(fullKey)) { keysToRemove.push(fullKey); } } (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (k) { return _this._storage.removeItem(k); }, keysToRemove); } }]); }(); var MemStore = /*#__PURE__*/function () { function MemStore() { _classCallCheck(this, MemStore); this._data = {}; } return _createClass(MemStore, [{ key: "hasItem", value: function hasItem(key) { return key in this._data; } }, { key: "getItem", value: function getItem(key) { // run this storage through JSON too so we know we get a fresh object // each retrieval return _parse(this._data[key]); } }, { key: "setItem", value: function setItem(key, value) { this._data[key] = _stringify(value); } }, { key: "removeItem", value: function removeItem(key) { delete this._data[key]; } }, { key: "clear", value: function clear(keyPrefix) { var _this2 = this; if (keyPrefix) { (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (key) { return delete _this2._data[key]; }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(keyPrefixMatch(keyPrefix, '.'), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(this._data))); } else { this._data = {}; } } }]); }(); // Make a string 2^16 characters long (*2 bytes/char = 130kB), to test storage. // That should be plenty for common persistence use cases, // without getting anywhere near typical browser limits var pow = 16; function longString() { var s = 'Spam'; for (var i = 2; i < pow; i++) { s += s; } return s; } var stores = { memory: new MemStore() // Defer testing & making local/session stores until requested. // That way if we have errors here they can show up in devtools. }; var backEnds = { local: 'localStorage', session: 'sessionStorage' }; function tryGetWebStore(backEnd, dispatch) { var store = new WebStore(backEnd); var fallbackStore = stores.memory; var storeTest = longString(); var testKey = storePrefix + 'x.x'; try { store._setItem(testKey, storeTest); if (store.getItem(testKey) !== storeTest) { dispatch(err("".concat(backEnd, " init failed set/get, falling back to memory"))); return fallbackStore; } store.removeItem(testKey); return store; } catch (e) { dispatch(err("".concat(backEnd, " init first try failed; clearing and retrying"))); } try { store.clear(); store._setItem(testKey, storeTest); if (store.getItem(testKey) !== storeTest) { throw new Error('nope'); } store.removeItem(testKey); dispatch(err("".concat(backEnd, " init set/get succeeded after clearing!"))); return store; } catch (e) { dispatch(err("".concat(backEnd, " init still failed, falling back to memory"))); return fallbackStore; } } function getStore(type, dispatch) { if (!stores[type]) { stores[type] = tryGetWebStore(backEnds[type], dispatch); } return stores[type]; } var noopTransform = { extract: function extract(propValue) { return propValue; }, apply: function apply(storedValue, _propValue) { return storedValue; } }; var getTransform = function getTransform(element, propName, propPart) { if (element.persistenceTransforms && element.persistenceTransforms[propName]) { if (propPart) { return element.persistenceTransforms[propName][propPart]; } return element.persistenceTransforms[propName]; } return noopTransform; }; var getValsKey = function getValsKey(id, persistedProp, 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, type = layout.type, namespace = layout.namespace; if (!type || !namespace) { // not a real component - just need the props for recursion return { props }; } var id = props.id, persistence = props.persistence; var element = _registry__WEBPACK_IMPORTED_MODULE_0__["default"].resolve(layout); var getVal = function getVal(prop) { return props[prop] || (element.defaultProps || element.dashPersistence || {})[prop]; }; var persisted_props = getVal('persisted_props'); var persistence_type = getVal('persistence_type'); var canPersist = id && persisted_props && persistence_type; return { canPersist, id, props, element, persistence, persisted_props, persistence_type }; }; function recordUiEdit(layout, newProps, dispatch) { var _getProps = getProps(layout), canPersist = _getProps.canPersist, id = _getProps.id, props = _getProps.props, element = _getProps.element, persistence = _getProps.persistence, persisted_props = _getProps.persisted_props, persistence_type = _getProps.persistence_type; // if the "persistence" property is changed as a callback output, // skip the persistence storage overwriting. var isPersistenceMismatch = (newProps === null || newProps === void 0 ? void 0 : newProps.persistence) !== undefined && newProps.persistence !== persistence; if (!canPersist || !persistence || isPersistenceMismatch) { return; } (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (persistedProp) { var _persistedProp$split = persistedProp.split('.'), _persistedProp$split2 = _slicedToArray(_persistedProp$split, 2), propName = _persistedProp$split2[0], propPart = _persistedProp$split2[1]; if (newProps[propName] !== undefined) { var storage = getStore(persistence_type, dispatch); var _getTransform = getTransform(element, propName, propPart), extract = _getTransform.extract; var valsKey = getValsKey(id, persistedProp, persistence); var originalVal = extract(props[propName]); var newVal = extract(newProps[propName]); // mainly for nested props with multiple persisted parts, it's // possible to have the same value as before - should not store // in this case. if (originalVal !== newVal) { if (storage.hasItem(valsKey)) { originalVal = storage.getItem(valsKey)[1]; } var vals = originalVal === undefined ? [newVal] : [newVal, originalVal]; storage.setItem(valsKey, vals, dispatch); } } }, persisted_props); } /* * Used for entire layouts (on load) or partial layouts (from children * callbacks) to apply previously-stored UI edits to components */ function applyPersistence(layout, dispatch) { if ((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(layout) !== 'Object' || !layout.props) { return layout; } return persistenceMods(layout, layout, [], dispatch); } var UNDO = true; function modProp(key, storage, element, props, persistedProp, update, undo) { if (storage.hasItem(key)) { var _storage$getItem = storage.getItem(key), _storage$getItem2 = _slicedToArray(_storage$getItem, 2), newVal = _storage$getItem2[0], originalVal = _storage$getItem2[1]; var fromVal = undo ? newVal : originalVal; var toVal = undo ? originalVal : newVal; var _persistedProp$split3 = persistedProp.split('.'), _persistedProp$split4 = _slicedToArray(_persistedProp$split3, 2), propName = _persistedProp$split4[0], propPart = _persistedProp$split4[1]; var transform = getTransform(element, propName, propPart); 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 // value for this persistence ID storage.removeItem(key); } } } function persistenceMods(layout, component, path, dispatch) { var _getProps2 = getProps(component), canPersist = _getProps2.canPersist, id = _getProps2.id, props = _getProps2.props, element = _getProps2.element, persistence = _getProps2.persistence, persisted_props = _getProps2.persisted_props, persistence_type = _getProps2.persistence_type; var layoutOut = layout; if (canPersist && persistence) { var storage = getStore(persistence_type, dispatch); var update = {}; (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_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(path.concat('props', propName)), update[propName], layoutOut); } } // recurse inward var children = props.children; if (Array.isArray(children)) { children.forEach(function (child, i) { 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_6__["default"])(children) === 'Object' && children.props) { layoutOut = persistenceMods(layoutOut, children, path.concat('props', 'children'), dispatch); } return layoutOut; } /* * When we receive new explicit props from a callback, * these override UI-driven edits of those exact props * but not for props nested inside children */ function prunePersistence(layout, newProps, dispatch) { var _getProps3 = getProps(layout), canPersist = _getProps3.canPersist, id = _getProps3.id, props = _getProps3.props, persistence = _getProps3.persistence, persisted_props = _getProps3.persisted_props, persistence_type = _getProps3.persistence_type, element = _getProps3.element; var getFinal = function getFinal(propName, prevVal) { return propName in newProps ? newProps[propName] : prevVal; }; var finalPersistence = getFinal('persistence', persistence); if (!canPersist || !(persistence || finalPersistence)) { return newProps; } var finalPersistenceType = getFinal('persistence_type', persistence_type); var finalPersistedProps = getFinal('persisted_props', persisted_props); var persistenceChanged = finalPersistence !== persistence || finalPersistenceType !== persistence_type || finalPersistedProps !== persisted_props; var notInNewProps = function notInNewProps(persistedProp) { return !(persistedProp.split('.')[0] in newProps); }; var update = {}; var depersistedProps = props; if (persistenceChanged && persistence) { // clear previously-applied persistence var storage = getStore(persistence_type, dispatch); (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_4__["default"])(notInNewProps, persisted_props)); depersistedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(props, update); } if (finalPersistence && persistenceChanged) { var finalStorage = getStore(finalPersistenceType, dispatch); // apply new persistence (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_4__["default"])(notInNewProps, finalPersistedProps)); } return persistenceChanged ? (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(newProps, update) : newProps; } /***/ }), /***/ "./src/reducers/api.js": /*!*****************************!*\ !*** ./src/reducers/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 */ createApiReducer; } /* harmony export */ }); /* 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() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; var newState = state; if (action.type === store) { var _action$payload = action.payload, id = _action$payload.id, status = _action$payload.status, content = _action$payload.content; var newRequest = { status, content }; if (Array.isArray(id)) { newState = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(id, newRequest, state); } else if (id) { newState = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(id, newRequest, state); } else { newState = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(state, newRequest); } } return newState; }; } /***/ }), /***/ "./src/reducers/appLifecycle.js": /*!**************************************!*\ !*** ./src/reducers/appLifecycle.js ***! \**************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/reducers/constants.js"); function appLifecycle() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_constants__WEBPACK_IMPORTED_MODULE_1__.getAppState)('STARTED'); var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('SET_APP_LIFECYCLE'): return (0,_constants__WEBPACK_IMPORTED_MODULE_1__.getAppState)(action.payload); default: return state; } } /* harmony default export */ __webpack_exports__["default"] = (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 _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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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__["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 ***! \*********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); var initialChange = { id: null, props: {} }; function changed() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialChange; // This is empty just to initialize the store. Changes // are actually recorded in reducer.js so that we can // resolve paths to id. return state; } /* harmony default export */ __webpack_exports__["default"] = (changed); /***/ }), /***/ "./src/reducers/config.js": /*!********************************!*\ !*** ./src/reducers/config.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 */ 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/mergeDeepRight.js"); function config() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; 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__["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__["default"])(state, { fetch: { headers: action.payload } }); } return state; } /***/ }), /***/ "./src/reducers/constants.js": /*!***********************************!*\ !*** ./src/reducers/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 */ getAppState: function() { return /* binding */ getAppState; } /* harmony export */ }); function getAppState(state) { var stateList = { STARTED: 'STARTED', HYDRATED: 'HYDRATED', DESTROYED: 'DESTROYED' }; if (stateList[state]) { return stateList[state]; } throw new Error("".concat(state, " is not a valid app state.")); } /***/ }), /***/ "./src/reducers/dependencyGraph.js": /*!*****************************************!*\ !*** ./src/reducers/dependencyGraph.js ***! \*****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); var initialGraph = {}; var graphs = function graphs() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialGraph; var action = arguments.length > 1 ? arguments[1] : undefined; if (action.type === 'SET_GRAPHS') { return action.payload; } return state; }; /* harmony default export */ __webpack_exports__["default"] = (graphs); /***/ }), /***/ "./src/reducers/error.js": /*!*******************************!*\ !*** ./src/reducers/error.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 */ error; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var initialError = { frontEnd: [], backEnd: [], backEndConnected: true }; function error() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialError; var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case 'ON_ERROR': { var frontEnd = state.frontEnd, backEnd = state.backEnd, backEndConnected = state.backEndConnected; // log errors to the console for stack tracing and so they're // available even with debugging off /* eslint-disable-next-line no-console */ console.error(action.payload.error); if (action.payload.type === 'frontEnd') { return { frontEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() })].concat(_toConsumableArray(frontEnd)), backEnd, backEndConnected }; } else if (action.payload.type === 'backEnd') { return { frontEnd, backEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() })].concat(_toConsumableArray(backEnd)), backEndConnected }; } return state; } case 'SET_CONNECTION_STATUS': { return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(state, { backEndConnected: action.payload }); } default: { return state; } } } /***/ }), /***/ "./src/reducers/history.js": /*!*********************************!*\ !*** ./src/reducers/history.js ***! \*********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var initialHistory = { past: [], present: {}, future: [] }; function history() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialHistory; var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case 'UNDO': { var past = state.past, present = state.present, future = state.future; var previous = past[past.length - 1]; var newPast = past.slice(0, past.length - 1); return { past: newPast, present: previous, future: [present].concat(_toConsumableArray(future)) }; } case 'REDO': { var _past = state.past, _present = state.present, _future = state.future; var next = _future[0]; var newFuture = _future.slice(1); return { past: [].concat(_toConsumableArray(_past), [_present]), present: next, future: newFuture }; } case 'REVERT': { var _past2 = state.past, _future2 = state.future; var _previous = _past2[_past2.length - 1]; var _newPast = _past2.slice(0, _past2.length - 1); return { past: _newPast, present: _previous, future: _toConsumableArray(_future2) }; } default: { return state; } } } /* harmony default export */ __webpack_exports__["default"] = (history); /***/ }), /***/ "./src/reducers/hooks.js": /*!*******************************!*\ !*** ./src/reducers/hooks.js ***! \*******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); var customHooks = function customHooks() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { layout_pre: null, layout_post: null, request_pre: null, request_post: null, callback_resolved: null, request_refresh_jwt: null, bear: false }; var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case 'SET_HOOKS': return action.payload; default: return state; } }; /* harmony default export */ __webpack_exports__["default"] = (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; (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; }); /***/ }), /***/ "./src/reducers/layout.js": /*!********************************!*\ !*** ./src/reducers/layout.js ***! \********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* 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 ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissocPath.js"); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); 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); } 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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_0__.getAction)('SET_LAYOUT')) { if (Array.isArray(action.payload)) { return _toConsumableArray(action.payload); } return _objectSpread({}, action.payload); } 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); } // Custom component rendered out of tree. else if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('INSERT_COMPONENT')) { var _action$payload = action.payload, component = _action$payload.component, componentPath = _action$payload.componentPath; return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(componentPath, component, state); } else if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('REMOVE_COMPONENT')) { var _componentPath = action.payload.componentPath; return (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(_componentPath, state); } return state; }; /* harmony default export */ __webpack_exports__["default"] = (layout); /***/ }), /***/ "./src/reducers/loading.ts": /*!*********************************!*\ !*** ./src/reducers/loading.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 */ loading; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); function loading() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case 'LOADED': return action.payload.reduce(function (acc, load) { var loadPath = [JSON.stringify(load.path)]; var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])([], loadPath, acc); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(loadPath, prev.filter(function (loading) { return loading.property !== load.property; }), acc); }, state); case 'LOADING': return action.payload.reduce(function (acc, load) { var loadPath = [JSON.stringify(load.path)]; var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])([], loadPath, acc); if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(load, prev)) { // duplicate outputs prev.push(load); } return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(loadPath, prev, acc); }, state); default: return state; } } /***/ }), /***/ "./src/reducers/paths.js": /*!*******************************!*\ !*** ./src/reducers/paths.js ***! \*******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); var initialPaths = { strs: {}, objs: {} }; var paths = function paths() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialPaths; var action = arguments.length > 1 ? arguments[1] : undefined; if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('SET_PATHS')) { return action.payload; } return state; }; /* harmony default export */ __webpack_exports__["default"] = (paths); /***/ }), /***/ "./src/reducers/profile.js": /*!*********************************!*\ !*** ./src/reducers/profile.js ***! \*********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* 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(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } var defaultProfile = { count: 0, total: 0, compute: 0, network: { time: 0, upload: 0, download: 0 }, resources: {}, status: { latest: null }, result: {} }; var defaultState = { updated: [], resources: {}, callbacks: {}, graphLayout: null }; var profile = function profile() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; var action = arguments.length > 1 ? arguments[1] : undefined; if (action.type === 'UPDATE_RESOURCE_USAGE') { // Keep a record of the most recent change. This // is subtly different from history.present because // it watches all props, not just inputs. var _action$payload = action.payload, id = _action$payload.id, usage = _action$payload.usage, status = _action$payload.status; var statusMapped = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[status] || status; // Keep track of the callback that actually changed. var newState = { updated: [id], resources: state.resources, callbacks: state.callbacks, // graphLayout is never passed in via actions, because we don't // want it to trigger a rerender of the callback graph. // See CallbackGraphContainer.react graphLayout: state.graphLayout }; 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; // Update resource usage & params. cb.count += 1; cb.status.latest = statusMapped; cb.status[statusMapped] = (cb.status[statusMapped] || 0) + 1; cb.result = action.payload.result; cb.inputs = action.payload.inputs; cb.state = action.payload.state; if (usage) { var __dash_client = usage.__dash_client, __dash_server = usage.__dash_server, __dash_upload = usage.__dash_upload, __dash_download = usage.__dash_download, user = _objectWithoutProperties(usage, _excluded); cb.total += __dash_client; cb.compute += __dash_server; cb.network.time += __dash_client - __dash_server; cb.network.upload += __dash_upload; cb.network.download += __dash_download; for (var r in user) { if (user.hasOwnProperty(r)) { cbResources[r] = (cbResources[r] || 0) + user[r]; totalResources[r] = (totalResources[r] || 0) + user[r]; } } } return newState; } return state; }; /* harmony default export */ __webpack_exports__["default"] = (profile); /***/ }), /***/ "./src/reducers/reducer.js": /*!*********************************!*\ !*** ./src/reducers/reducer.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 */ apiRequests: function() { return /* binding */ apiRequests; }, /* harmony export */ createReducer: function() { return /* binding */ createReducer; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEach.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); /* 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 _paths__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./paths */ "./src/reducers/paths.js"); /* harmony import */ var _callbackJobs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./callbackJobs */ "./src/reducers/callbackJobs.ts"); /* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./loading */ "./src/reducers/loading.ts"); /* harmony import */ var _wrapper_wrapping__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../wrapper/wrapping */ "./src/wrapper/wrapping.ts"); function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var apiRequests = ['dependenciesRequest', 'layoutRequest', 'reloadRequest', 'loginRequest']; var layoutHashes = function layoutHashes() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; if ((0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(action.type, ['UNDO_PROP_CHANGE', 'REDO_PROP_CHANGE', 'ON_PROP_CHANGE'])) { // Let us compare the paths sums to get updates without triggering // render on the parent containers. var actionPath = action.payload.itempath; var strPath = (0,_wrapper_wrapping__WEBPACK_IMPORTED_MODULE_16__.stringifyPath)(actionPath); var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(0, [strPath, 'hash'], state); state = (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(strPath, { hash: prev + 1, changedProps: action.payload.props, renderType: action.payload.renderType }, state); } return state; }; function mainReducer() { var parts = { 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"], paths: _paths__WEBPACK_IMPORTED_MODULE_13__["default"], layoutHashes, loading: _loading__WEBPACK_IMPORTED_MODULE_15__["default"] }; (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(function (r) { parts[r] = (0,_api__WEBPACK_IMPORTED_MODULE_1__["default"])(r); }, apiRequests); parts.callbackJobs = _callbackJobs__WEBPACK_IMPORTED_MODULE_14__["default"]; return (0,redux__WEBPACK_IMPORTED_MODULE_21__.combineReducers)(parts); } function getInputHistoryState(payload, state, recordChanges) { var graphs = state.graphs, paths = state.paths, layout = state.layout; var itempath = payload.itempath, props = payload.props; var refProps = (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(itempath.concat(['props']), layout) || {}; var id = refProps.id; var historyEntry; if (id) { if (recordChanges) { state.changed = { id, props }; } historyEntry = { id, props: {} }; (0,ramda__WEBPACK_IMPORTED_MODULE_23__["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]; } }); } return historyEntry; } function recordHistory(reducer) { return function (state, action) { // Record initial state var type = action.type, payload = action.payload; 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_24__["default"])(historyEntry.props)) { state.history.present = historyEntry; } } var nextState = reducer(state, action); if (type === 'ON_PROP_CHANGE' && payload.source !== 'response') { /* * if the prop change is an input, then * record it so that it can be played back */ var _historyEntry = getInputHistoryState(payload, nextState); if (_historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(_historyEntry.props)) { nextState.history = { past: [].concat(_toConsumableArray(nextState.history.past), [state.history.present]), present: _historyEntry, future: [] }; } } return nextState; }; } function reloaderReducer(reducer) { return function (state, action) { var _ref = state || {}, history = _ref.history, config = _ref.config, hooks = _ref.hooks; var newState = state; if (action.type === 'RELOAD') { newState = { history, config, hooks }; } else if (action.type === 'SET_CONFIG') { // new config also reloads, and even clears history, // in case there's a new user or even a totally different app! // hooks are set at an even higher level than config though. newState = { hooks }; } return reducer(newState, action); }; } function createReducer() { return reloaderReducer(recordHistory(mainReducer())); } /***/ }), /***/ "./src/registry.js": /*!*************************!*\ !*** ./src/registry.js ***! \*************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = ({ resolve: function resolve(component) { var type = component.type, namespace = component.namespace; var ns = window[namespace]; if (ns) { if (ns[type]) { return ns[type]; } throw new Error("Component ".concat(type, " not found in ").concat(namespace)); } throw new Error("".concat(namespace, " was not found.")); } }); /***/ }), /***/ "./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_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); /* harmony import */ var redux_thunk__WEBPACK_IMPORTED_MODULE_11__ = __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_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./observers/prioritizedCallbacks */ "./src/observers/prioritizedCallbacks.ts"); /* harmony import */ var _observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./observers/requestedCallbacks */ "./src/observers/requestedCallbacks.ts"); /* harmony import */ var _observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./observers/storedCallbacks */ "./src/observers/storedCallbacks.ts"); 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); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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_9__["default"])(function () { var observe = _this.storeObserver.observe; // FIXME Remove observer pattern and refactor to standard reducers/actions/selectors. observe(_observers_documentTitle__WEBPACK_IMPORTED_MODULE_2__["default"]); observe(_observers_isLoading__WEBPACK_IMPORTED_MODULE_5__["default"]); observe(_observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_7__["default"]); observe(_observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_6__["default"]); observe(_observers_executingCallbacks__WEBPACK_IMPORTED_MODULE_4__["default"]); observe(_observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_3__["default"]); observe(_observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_8__["default"]); })); _defineProperty(this, "createAppStore", function (reducer, middleware) { _this.__store = (0,redux__WEBPACK_IMPORTED_MODULE_10__.createStore)(reducer, middleware); _this.storeObserver.setStore(_this.__store); var ds = window.dash_stores = window.dash_stores || []; if (!ds.includes(_this.__store)) { ds.push(_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) // removed by dead control flow {} 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_10__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_11__["default"]))); } else { _this.createAppStore(reducer, (0,redux__WEBPACK_IMPORTED_MODULE_10__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_11__["default"])); } } if (!reset) { // TODO - Protect this under a debug mode? window.store = _this.__store; } if (false) // removed by dead control flow {} return _this.__store; }); this.__store = this.initializeStore(); } return _createClass(RendererStore, [{ key: "store", get: function get() { return this.__store; } }]); }(); /***/ }), /***/ "./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(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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/clientsideFunctions.ts": /*!******************************************!*\ !*** ./src/utils/clientsideFunctions.ts ***! \******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/index */ "./src/actions/index.js"); /* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/paths */ "./src/actions/paths.js"); /* harmony import */ var _stores__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stores */ "./src/utils/stores.ts"); /** * Set the props of a dash component by id or path. * * @param idOrPath Path or id of the dash component to update. * @param props The props to update. */ function set_props(idOrPath, props) { var ds = (0,_stores__WEBPACK_IMPORTED_MODULE_2__.getStores)(); for (var y = 0; y < ds.length; y++) { var _ds$y = ds[y], dispatch = _ds$y.dispatch, getState = _ds$y.getState; var componentPath = void 0; var _getState = getState(), paths = _getState.paths; if (!Array.isArray(idOrPath)) { componentPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_1__.getPath)(paths, idOrPath); } else { componentPath = idOrPath; } dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_0__.updateProps)({ props, itempath: componentPath, renderType: 'clientsideApi' })); dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_0__.notifyObservers)({ id: idOrPath, props })); } } // Clean url code adapted from https://github.com/braintree/sanitize-url/blob/main/src/constants.ts // to allow for data protocol. var invalidProtocols = /^([^\w]*)(javascript|vbscript)/im; var newLines = /&(tab|newline);/gi; // eslint-disable-next-line no-control-regex var ctrlChars = /[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim; var htmlEntities = /&#(\w+)(^\w|;)?/g; var clean_url = function clean_url(url) { var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'about:blank'; if (url === '') { return url; } var cleaned = url.replace(newLines, '').replace(ctrlChars, '').replace(htmlEntities, function (_, dec) { return String.fromCharCode(dec); }).trim(); if (invalidProtocols.test(cleaned)) { return fallback; } return url; }; var dc = window.dash_clientside = window.dash_clientside || {}; dc['set_props'] = set_props; dc['clean_url'] = dc['clean_url'] === undefined ? clean_url : dc['clean_url']; /***/ }), /***/ "./src/utils/libraries.ts": /*!********************************!*\ !*** ./src/utils/libraries.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 */ loadLibrary: function() { return /* binding */ loadLibrary; } /* harmony export */ }); function loadLibrary(resource) { var prom; var head = document.querySelector('head'); if (resource.type === '_js_dist') { var element = document.createElement('script'); element.src = resource.url; element.async = true; prom = new Promise(function (resolve, reject) { element.onload = function () { resolve(); }; element.onerror = function (error) { return reject(error); }; }); head === null || head === void 0 || head.appendChild(element); } else if (resource.type === '_css_dist') { var _element = document.createElement('link'); _element.href = resource.url; _element.rel = 'stylesheet'; prom = new Promise(function (resolve, reject) { _element.onload = function () { resolve(); }; _element.onerror = function (error) { return reject(error); }; }); head === null || head === void 0 || head.appendChild(_element); } return prom; } /***/ }), /***/ "./src/utils/stores.ts": /*!*****************************!*\ !*** ./src/utils/stores.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 */ getStores: function() { return /* binding */ getStores; } /* harmony export */ }); function getStores() { var stores = window.dash_stores = window.dash_stores || []; return stores; } /***/ }), /***/ "./src/utils/wait.ts": /*!***************************!*\ !*** ./src/utils/wait.ts ***! \***************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /* harmony default export */ __webpack_exports__["default"] = (/*#__PURE__*/function () { var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(duration) { var _resolve, p; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: p = new Promise(function (resolve) { return _resolve = resolve; }); setTimeout(_resolve, duration); return _context.a(2, p); } }, _callee); })); return function (_x) { return _ref.apply(this, arguments); }; }()); /***/ }), /***/ "./src/wrapper/CheckedComponent.tsx": /*!******************************************!*\ !*** ./src/wrapper/CheckedComponent.tsx ***! \******************************************/ /***/ (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 */ CheckedComponent; } /* harmony export */ }); /* harmony import */ var _checkPropTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../checkPropTypes */ "./src/checkPropTypes.js"); /* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js"); /* harmony import */ var _wrapping__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./wrapping */ "./src/wrapper/wrapping.ts"); function CheckedComponent(p) { var element = p.element, props = p.props, children = p.children, component = p.component; (0,_wrapping__WEBPACK_IMPORTED_MODULE_2__.validateComponent)(component); var errorMessage = (0,_checkPropTypes__WEBPACK_IMPORTED_MODULE_0__["default"])(element.propTypes, props, 'component prop', element); if (errorMessage) { (0,_exceptions__WEBPACK_IMPORTED_MODULE_1__.propTypeErrorHandler)(errorMessage, props, component.type); } return children; } /***/ }), /***/ "./src/wrapper/DashContext.tsx": /*!*************************************!*\ !*** ./src/wrapper/DashContext.tsx ***! \*************************************/ /***/ (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 */ DashContextProvider: function() { return /* binding */ DashContextProvider; }, /* harmony export */ useDashContext: function() { return /* binding */ useDashContext; } /* 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_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); var DashContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createContext({}); function DashContextProvider(props) { var children = props.children, componentPath = props.componentPath; var stringPath = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return JSON.stringify(componentPath); }, [componentPath]); var store = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useStore)(); var isLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (options) { var _ref = options || {}, extraPath = _ref.extraPath, rawPath = _ref.rawPath, filterFunc = _ref.filterFunc; var loadingPath = [stringPath]; if (extraPath) { loadingPath = [JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentPath, extraPath))]; } else if (rawPath) { loadingPath = [JSON.stringify(rawPath)]; } var loading = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([], loadingPath, store.getState().loading); return filterFunc ? loading.filter(filterFunc).length > 0 : loading.length > 0; }, [stringPath]); var useLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (options) { var _ref2 = options || {}, filterFunc = _ref2.filterFunc, extraPath = _ref2.extraPath, rawPath = _ref2.rawPath; return (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) { var loadingPath = [stringPath]; if (extraPath) { loadingPath = [JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentPath, extraPath))]; } else if (rawPath) { loadingPath = [JSON.stringify(rawPath)]; } var load = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([], loadingPath, state.loading); if (filterFunc) { return load.filter(filterFunc).length > 0; } return load.length > 0; }); }, [stringPath]); var ctxValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return { componentPath, isLoading, useLoading, useSelector: react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector, useStore: react_redux__WEBPACK_IMPORTED_MODULE_1__.useStore, useDispatch: react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch }; }, [stringPath]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DashContext.Provider, { value: ctxValue }, children); } function useDashContext() { var ctx = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(DashContext); if (!ctx) { // eslint-disable-next-line no-console console.error('Dash Context was not found, component was rendered without a wrapper. Use `window.dash_component_api.ExternalWrapper` to make sure the component is properly connected.'); } return ctx || {}; } /***/ }), /***/ "./src/wrapper/DashWrapper.tsx": /*!*************************************!*\ !*** ./src/wrapper/DashWrapper.tsx ***! \*************************************/ /***/ (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 ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pickBy.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.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/keys.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pick.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/pathOr.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mapObjIndexed.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/is.js"); /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/error/ComponentErrorBoundary.react */ "./src/components/error/ComponentErrorBoundary.react.js"); /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); /* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); /* harmony import */ var _wrapping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./wrapping */ "./src/wrapper/wrapping.ts"); /* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); /* harmony import */ var _isSimpleComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../isSimpleComponent */ "./src/isSimpleComponent.js"); /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./selectors */ "./src/wrapper/selectors.ts"); /* harmony import */ var _CheckedComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CheckedComponent */ "./src/wrapper/CheckedComponent.tsx"); /* harmony import */ var _DashContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./DashContext */ "./src/wrapper/DashContext.tsx"); 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); } var _excluded = ["componentPath", "_dashprivate_error", "_passedComponent", "_newRender"], _excluded2 = ["_dash_error"]; 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(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } function DashWrapper(_ref) { var componentPath = _ref.componentPath, _dashprivate_error = _ref._dashprivate_error, _passedComponent = _ref._passedComponent, _newRender = _ref._newRender, extras = _objectWithoutProperties(_ref, _excluded); var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)(); var memoizedKeys = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}); var newRender = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false); var renderedPath = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(componentPath); var renderComponent = null; var renderComponentProps = null; var renderH = null; // Get the config for the component as props var config = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_8__.selectConfig); // Select component and it's props, along with render hash, changed props and the reason for render var _useSelector = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)((0,_selectors__WEBPACK_IMPORTED_MODULE_8__.selectDashProps)(componentPath), _selectors__WEBPACK_IMPORTED_MODULE_8__.selectDashPropsEqualityFn), _useSelector2 = _slicedToArray(_useSelector, 5), component = _useSelector2[0], componentProps = _useSelector2[1], h = _useSelector2[2], changedProps = _useSelector2[3], renderType = _useSelector2[4]; renderComponent = component; renderComponentProps = componentProps; renderH = h; (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { if (_newRender) { newRender.current = true; renderH = 0; if (renderH in memoizedKeys.current) { delete memoizedKeys.current[renderH]; } } else { newRender.current = false; } renderedPath.current = componentPath; }, [_newRender]); var setProps = function setProps(newProps) { var _renderComponentProps = renderComponentProps, id = _renderComponentProps.id; var _dash_error = newProps._dash_error, restProps = _objectWithoutProperties(newProps, _excluded2); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore dispatch(function (dispatch, getState) { var currentState = getState(); var graphs = currentState.graphs; var oldLayout = (0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.getComponentLayout)(renderedPath.current, currentState); if (!oldLayout) return; var oldProps = oldLayout.props; if (!oldProps) return; var changedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(function (val, key) { return !(0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(val, oldProps[key]); }, restProps); if (_dash_error) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.onError)({ type: 'frontEnd', error: _dash_error })); } if ((0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(changedProps)) { return; } // Identify the modified props that are required for callbacks var watchedKeys = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_4__.getWatchedKeys)(id, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(changedProps), graphs); (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.batch)(function () { // Only dispatch changes to Dash if a watched prop changed if (watchedKeys.length) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.notifyObservers)({ id, props: (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(watchedKeys, changedProps) })); } // Always update this component's props dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.updateProps)({ props: changedProps, itempath: renderedPath.current, renderType: 'internal' })); }); }); }; var createContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (container, containerPath, _childNewRender) { var _container$props; if ((0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_7__["default"])(renderComponent)) { return renderComponent; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DashWrapper, { key: container !== null && container !== void 0 && (_container$props = container.props) !== null && _container$props !== void 0 && _container$props.id ? (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(container.props.id) : (0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.stringifyPath)(containerPath), _dashprivate_error: _dashprivate_error, componentPath: containerPath, _passedComponent: container, _newRender: _childNewRender }); }, []); var wrapChildrenProp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (node, childrenPath, _childNewRender) { if (Array.isArray(node)) { return node.map(function (n, i) { if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.isDryComponent)(n)) { return createContainer(n, (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(componentPath, ['props'].concat(_toConsumableArray(childrenPath), [i])), _childNewRender); } return n; }); } if (!(0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.isDryComponent)(node)) { return node; } return createContainer(node, (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(componentPath, ['props'].concat(_toConsumableArray(childrenPath))), _childNewRender); }, [componentPath]); var extraProps = _objectSpread({ setProps }, extras); if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.checkRenderTypeProp)(renderComponent)) { extraProps['dashRenderType'] = newRender.current ? 'parent' : changedProps ? renderType : 'parent'; } var setHydratedProps = function setHydratedProps(component, componentProps) { // Hydrate components props var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])([], ['children_props', component === null || component === void 0 ? void 0 : component.namespace, component === null || component === void 0 ? void 0 : component.type], config); var props = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])('children', componentProps), extraProps); var _loop = function _loop() { var childrenProp = childrenProps[i]; var childNewRender = 0; if (childrenProp.split('.')[0].replace('[]', '').replace('{}', '') in changedProps || newRender.current || !renderH) { childNewRender = {}; } var handleObject = function handleObject(obj, opath) { return (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(function (node, k) { return wrapChildrenProp(node, [].concat(_toConsumableArray(opath), [k]), childNewRender); }, obj); }; if (childrenProp.includes('.')) { var childrenPath = childrenProp.split('.'); var node; var nodeValue; if (childrenProp.includes('[]')) { var _node; var frontPath = [], backPath = []; var found = false, hasObject = false; // At first the childrenPath is always a list of strings. childrenPath.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_21__["default"])(frontPath, props); if (node === undefined || !((_node = node) !== null && _node !== void 0 && _node.length)) { return 0; // continue } var firstNode = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(backPath, node[0]); if (!firstNode) { return 0; // continue } nodeValue = node.map(function (el, i) { var elementPath = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(frontPath, (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])([i], backPath)); var listValue; if (hasObject) { if (backPath.length) { listValue = handleObject((0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(backPath, el), elementPath); } else { listValue = handleObject(el, elementPath); } } else { listValue = wrapChildrenProp((0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(backPath, el), elementPath, childNewRender); } return (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(backPath, listValue, el); }); childrenPath = 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 < childrenPath.length; j++) { var cur = childrenPath[j]; if (cur.includes('{}')) { dynamic = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(front, [cur.replace('{}', '')]); if (j < childrenPath.length - 1) { hasBack = true; } } else { if (hasBack) { _backPath.push(cur); } else { front.push(cur); } } } var dynValue = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(dynamic, props); if (dynValue !== undefined) { // too dynamic for proper ts. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore nodeValue = (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(function (d, k) { return wrapChildrenProp(hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(_backPath, d) : d, hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(dynamic, (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])([k], _backPath)) : (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(dynamic, [k]), childNewRender); }, dynValue); childrenPath = dynamic; } } else { node = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(childrenPath, props); if (node === undefined) { return 0; // continue } nodeValue = wrapChildrenProp(node, childrenPath, childNewRender); } } props = (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(childrenPath, nodeValue, props); } else { if (childrenProp.includes('{}')) { var opath = childrenProp.replace('{}', ''); var isArray = childrenProp.includes('[]'); if (isArray) { opath = opath.replace('[]', ''); } var _node2 = props[opath]; if (_node2 !== undefined) { if (isArray) { for (var _j = 0; _j < _node2.length; _j++) { var aPath = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])([opath], [_j]); props = (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(aPath, handleObject(_node2[_j], aPath), props); } } else { props = (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(opath, handleObject(_node2, [opath]), props); } } } else { var _node3 = props[childrenProp]; if (_node3 !== undefined) { props = (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(childrenProp, wrapChildrenProp(_node3, [childrenProp], childNewRender), props); } } } }, _ret; for (var i = 0; i < childrenProps.length; i++) { _ret = _loop(); if (_ret === 0) continue; } if ((0,ramda__WEBPACK_IMPORTED_MODULE_24__["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_4__.stringifyId)(props.id); } return props; }; var hydrateFunc = function hydrateFunc() { if (newRender.current) { renderComponent = _passedComponent; renderComponentProps = _passedComponent === null || _passedComponent === void 0 ? void 0 : _passedComponent.props; } if (!renderComponent) { return null; } var element = _registry__WEBPACK_IMPORTED_MODULE_6__["default"].resolve(renderComponent); var hydratedProps = setHydratedProps(renderComponent, renderComponentProps); var hydratedChildren; if (renderComponentProps.children !== undefined) { hydratedChildren = wrapChildrenProp(renderComponentProps.children, ['children'], !renderH || newRender.current || 'children' in changedProps ? {} : 0); } newRender.current = false; return config.props_check ? (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CheckedComponent__WEBPACK_IMPORTED_MODULE_9__["default"], { element: element, props: hydratedProps, component: renderComponent }, (0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.createElement)(element, hydratedProps, extraProps, hydratedChildren))) : (0,_wrapping__WEBPACK_IMPORTED_MODULE_5__.createElement)(element, hydratedProps, extraProps, hydratedChildren); }; var hydrated = null; if (renderH in memoizedKeys.current && !newRender.current) { hydrated = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(memoizedKeys.current[renderH]) ? memoizedKeys.current[renderH] : null; } if (!hydrated) { hydrated = hydrateFunc(); memoizedKeys.current = { [renderH]: hydrated }; } return renderComponent ? (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_2__["default"], { componentType: renderComponent.type, componentId: (0,ramda__WEBPACK_IMPORTED_MODULE_25__["default"])(Object, renderComponentProps.id) ? (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(renderComponentProps.id) : renderComponentProps.id, error: _dashprivate_error, dispatch: dispatch }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DashContext__WEBPACK_IMPORTED_MODULE_10__.DashContextProvider, { componentPath: componentPath }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(hydrated) ? hydrated : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null)))) : (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null)); } /* harmony default export */ __webpack_exports__["default"] = (DashWrapper); /***/ }), /***/ "./src/wrapper/ExternalWrapper.tsx": /*!*****************************************!*\ !*** ./src/wrapper/ExternalWrapper.tsx ***! \*****************************************/ /***/ (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 react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _DashWrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DashWrapper */ "./src/wrapper/DashWrapper.tsx"); /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } /** * For rendering components that are out of the regular layout tree. */ function ExternalWrapper(_ref) { var component = _ref.component, componentPath = _ref.componentPath, _ref$temp = _ref.temp, temp = _ref$temp === void 0 ? false : _ref$temp; var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)(); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false), _useState2 = _slicedToArray(_useState, 2), inserted = _useState2[0], setInserted = _useState2[1]; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { // Give empty props for the inserted components. // The props will come from the parent so they can be updated. dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.addComponentToLayout)({ component, componentPath })); setInserted(true); return function () { if (temp) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.removeComponent)({ componentPath })); } }; }, []); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.batch)(function () { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.updateProps)({ itempath: componentPath, props: component.props })); if (component.props.id) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.notifyObservers)({ id: component.props.id, props: component.props })); } }); }, [component.props]); if (!inserted) { return null; } // Render a wrapper with the actual props. return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DashWrapper__WEBPACK_IMPORTED_MODULE_2__["default"], { componentPath: componentPath }); } /* harmony default export */ __webpack_exports__["default"] = (ExternalWrapper); /***/ }), /***/ "./src/wrapper/selectors.ts": /*!**********************************!*\ !*** ./src/wrapper/selectors.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 */ selectConfig: function() { return /* binding */ selectConfig; }, /* harmony export */ selectDashProps: function() { return /* binding */ selectDashProps; }, /* harmony export */ selectDashPropsEqualityFn: function() { return /* binding */ selectDashPropsEqualityFn; } /* harmony export */ }); /* harmony import */ var _wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapping */ "./src/wrapper/wrapping.ts"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 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(r) { if (Array.isArray(r)) return r; } var previousHashes = {}; var isFirstLevelPropsChild = function isFirstLevelPropsChild(updatedPath, strPath) { var updatedSegments = updatedPath.split(','); var fullSegments = strPath.split(','); // Check that strPath actually starts with updatedPath var startsWithPath = fullSegments.every(function (seg, i) { return updatedSegments[i] === seg; }); if (!startsWithPath) return [false, []]; // Get the remaining path after the prefix var remainingSegments = updatedSegments.slice(fullSegments.length); var propsCount = remainingSegments.filter(function (s) { return s === 'props'; }).length; return [propsCount < 2, remainingSegments]; }; function determineChangedProps(state, strPath) { var combinedHash = 0; var renderType; // Default render type, adjust as needed var changedProps = {}; Object.entries(state.layoutHashes).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), updatedPath = _ref2[0], pathHash = _ref2[1]; var _isFirstLevelPropsChi = isFirstLevelPropsChild(updatedPath, strPath), _isFirstLevelPropsChi2 = _slicedToArray(_isFirstLevelPropsChi, 2), descendant = _isFirstLevelPropsChi2[0], remainingSegments = _isFirstLevelPropsChi2[1]; if (descendant) { var previousHash = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])({}, [updatedPath], previousHashes); combinedHash += (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(0, ['hash'], pathHash); if (previousHash !== pathHash) { if (updatedPath !== strPath) { Object.assign(changedProps, { [remainingSegments[1]]: true }); renderType = 'components'; } else { Object.assign(changedProps, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])({}, ['changedProps'], pathHash)); renderType = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])({}, ['renderType'], pathHash); } previousHashes[updatedPath] = pathHash; } } }); return { hash: combinedHash, changedProps, renderType }; } var selectDashProps = function selectDashProps(componentPath) { return function (state) { var c = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.getComponentLayout)(componentPath, state); // Layout hashes records the number of times a path has been updated. // sum with the parents hash (match without the last ']') to get the real hash // Then it can be easily compared without having to compare the props. var strPath = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.stringifyPath)(componentPath); var hash; if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.checkDashChildrenUpdate)(c)) { hash = determineChangedProps(state, strPath); } else { hash = state.layoutHashes[strPath]; } var h = 0; var changedProps = {}; var renderType = ''; if (hash) { h = hash['hash']; changedProps = hash['changedProps']; renderType = hash['renderType']; } return [c, c === null || c === void 0 ? void 0 : c.props, h, changedProps, renderType]; }; }; function selectDashPropsEqualityFn(_ref3, _ref4) { var _ref5 = _slicedToArray(_ref3, 3), _ = _ref5[0], __ = _ref5[1], hash = _ref5[2]; var _ref6 = _slicedToArray(_ref4, 3), ___ = _ref6[0], ____ = _ref6[1], previousHash = _ref6[2]; // Only need to compare the hash as any change is summed up return hash === previousHash; } function selectConfig(state) { return state.config; } /***/ }), /***/ "./src/wrapper/wrapping.ts": /*!*********************************!*\ !*** ./src/wrapper/wrapping.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 */ checkDashChildrenUpdate: function() { return /* binding */ checkDashChildrenUpdate; }, /* harmony export */ checkRenderTypeProp: function() { return /* binding */ checkRenderTypeProp; }, /* harmony export */ createElement: function() { return /* binding */ createElement; }, /* harmony export */ getComponentLayout: function() { return /* binding */ getComponentLayout; }, /* harmony export */ isDryComponent: function() { return /* binding */ isDryComponent; }, /* harmony export */ stringifyPath: function() { return /* binding */ stringifyPath; }, /* harmony export */ validateComponent: function() { return /* binding */ validateComponent; } /* 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 ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/join.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/pathOr.js"); function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function createElement(element, props, extraProps, children) { var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["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 /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(element, allProps, children); } function isDryComponent(obj) { return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(obj) === 'Object' && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('type', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('namespace', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('props', obj); } function validateComponent(componentDefinition) { if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentDefinition) === 'Array') { throw new Error('The children property of a component is a list of lists, instead ' + 'of just a list. This can sometimes be due to a trailing comma. ' + '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_2__["default"])(componentDefinition) === 'Object' && !((0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('namespace', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('type', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["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)); } } function stringifyPath(layoutPath) { return (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(',', layoutPath); } function getComponentLayout(componentPath, state) { return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(componentPath, state.layout); } function checkRenderTypeProp(componentDefinition) { return 'dashRenderType' in (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])({}, [componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.namespace, componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.type], window); } function checkDashChildrenUpdate(componentDefinition) { return 'dashChildrenUpdate' in (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])({}, [componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.namespace, componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.type], window); } /***/ }), /***/ "prop-types": /*!****************************!*\ !*** external "PropTypes" ***! \****************************/ /***/ (function(module) { "use strict"; module.exports = window["PropTypes"]; /***/ }), /***/ "react": /*!************************!*\ !*** external "React" ***! \************************/ /***/ (function(module) { "use strict"; module.exports = window["React"]; /***/ }), /***/ "react-dom": /*!***************************!*\ !*** external "ReactDOM" ***! \***************************/ /***/ (function(module) { "use strict"; module.exports = window["ReactDOM"]; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ loaded: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/global */ /******/ !function() { /******/ __webpack_require__.g = (function() { /******/ if (typeof globalThis === 'object') return globalThis; /******/ try { /******/ return this || new Function('return this')(); /******/ } catch (e) { /******/ if (typeof window === 'object') return window; /******/ } /******/ })(); /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/node module decorator */ /******/ !function() { /******/ __webpack_require__.nmd = function(module) { /******/ module.paths = []; /******/ if (!module.children) module.children = []; /******/ return module; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/nonce */ /******/ !function() { /******/ __webpack_require__.nc = undefined; /******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. !function() { "use strict"; var __webpack_exports__ = {}; /*!********************************************!*\ !*** ./node_modules/whatwg-fetch/fetch.js ***! \********************************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DOMException: function() { return /* binding */ DOMException; }, /* harmony export */ Headers: function() { return /* binding */ Headers; }, /* harmony export */ Request: function() { return /* binding */ Request; }, /* harmony export */ Response: function() { return /* binding */ Response; }, /* harmony export */ fetch: function() { return /* binding */ fetch; } /* harmony export */ }); /* eslint-disable no-prototype-builtins */ var g = (typeof globalThis !== 'undefined' && globalThis) || (typeof self !== 'undefined' && self) || // eslint-disable-next-line no-undef (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g) || {} var support = { searchParams: 'URLSearchParams' in g, iterable: 'Symbol' in g && 'iterator' in Symbol, blob: 'FileReader' in g && 'Blob' in g && (function() { try { new Blob() return true } catch (e) { return false } })(), formData: 'FormData' in g, arrayBuffer: 'ArrayBuffer' in g } function isDataView(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ] var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 } } function normalizeName(name) { if (typeof name !== 'string') { name = String(name) } if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') { throw new TypeError('Invalid character in header field name: "' + name + '"') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value) } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift() return {done: value === undefined, value: value} } } if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator } } return iterator } function Headers(headers) { this.map = {} if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value) }, 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) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]) }, this) } } Headers.prototype.append = function(name, value) { name = normalizeName(name) value = normalizeValue(value) var oldValue = this.map[name] this.map[name] = oldValue ? oldValue + ', ' + value : value } Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)] } Headers.prototype.get = function(name) { name = normalizeName(name) return this.has(name) ? this.map[name] : null } Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) } Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value) } Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this) } } } Headers.prototype.keys = function() { var items = [] this.forEach(function(value, name) { items.push(name) }) return iteratorFor(items) } Headers.prototype.values = function() { var items = [] this.forEach(function(value) { items.push(value) }) return iteratorFor(items) } Headers.prototype.entries = function() { var items = [] this.forEach(function(value, name) { items.push([name, value]) }) return iteratorFor(items) } if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries } function consumed(body) { if (body._noBody) return if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result) } reader.onerror = function() { reject(reader.error) } }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsArrayBuffer(blob) return promise } function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type) var encoding = match ? match[1] : 'utf-8' reader.readAsText(blob, encoding) return promise } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf) var chars = new Array(view.length) for (var i = 0; i < view.length; i++) { chars[i] = String.fromCharCode(view[i]) } return chars.join('') } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength) view.set(new Uint8Array(buf)) return view.buffer } } function Body() { this.bodyUsed = false this._initBody = function(body) { /* fetch-mock wraps the Response object in an ES6 Proxy to provide useful test harness features such as flush. However, on ES5 browsers without fetch or Proxy support pollyfills must be used; the proxy-pollyfill is unable to proxy an attribute unless it exists on the object before the Proxy is created. This change ensures Response.bodyUsed exists on the instance, while maintaining the 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 } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString() } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer) // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]) } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body) } else { this._bodyText = body = Object.prototype.toString.call(body) } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8') } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type) } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') } } } if (support.blob) { this.blob = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } } } 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 if (support.blob) { return this.blob().then(readBlobAsArrayBuffer) } else { throw new Error('could not read as ArrayBuffer') } } this.text = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } } if (support.formData) { this.formData = function() { return this.text().then(decode) } } this.json = function() { return this.text().then(JSON.parse) } return this } // HTTP methods whose capitalization should be normalized var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'] function normalizeMethod(method) { var upcased = method.toUpperCase() return methods.indexOf(upcased) > -1 ? upcased : method } function Request(input, options) { if (!(this instanceof Request)) { throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') } options = options || {} var body = options.body if (input instanceof Request) { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url this.credentials = input.credentials if (!options.headers) { this.headers = new Headers(input.headers) } this.method = input.method this.mode = input.mode this.signal = input.signal if (!body && input._bodyInit != null) { body = input._bodyInit input.bodyUsed = true } } else { this.url = String(input) } this.credentials = options.credentials || this.credentials || 'same-origin' if (options.headers || !this.headers) { this.headers = new Headers(options.headers) } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null 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) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body) if (this.method === 'GET' || this.method === 'HEAD') { if (options.cache === 'no-store' || options.cache === 'no-cache') { // Search for a '_' parameter in the query string var reParamSearch = /([?&])_=[^&]*/ if (reParamSearch.test(this.url)) { // If it already exists then set the value with the current time this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime()) } else { // Otherwise add a new '_' parameter to the end with the current time var reQueryString = /\?/ this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime() } } } } Request.prototype.clone = function() { return new Request(this, {body: this._bodyInit}) } function decode(body) { var form = new FormData() body .trim() .split('&') .forEach(function(bytes) { if (bytes) { var split = bytes.split('=') var name = split.shift().replace(/\+/g, ' ') var value = split.join('=').replace(/\+/g, ' ') form.append(decodeURIComponent(name), decodeURIComponent(value)) } }) return form } function parseHeaders(rawHeaders) { var headers = new Headers() // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ') // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill // https://github.com/github/fetch/issues/748 // https://github.com/zloirock/core-js/issues/751 preProcessedHeaders .split('\r') .map(function(header) { return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header }) .forEach(function(line) { var parts = line.split(':') var key = parts.shift().trim() if (key) { var value = parts.join(':').trim() try { headers.append(key, value) } catch (error) { console.warn('Response ' + error.message) } } }) return headers } Body.call(Request.prototype) function Response(bodyInit, options) { if (!(this instanceof Response)) { throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') } if (!options) { 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) this.url = options.url || '' this._initBody(bodyInit) } Body.call(Response.prototype) Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) } Response.error = function() { var response = new Response(null, {status: 200, statusText: ''}) response.ok = false response.status = 0 response.type = 'error' return response } var redirectStatuses = [301, 302, 303, 307, 308] Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) } var DOMException = g.DOMException try { new DOMException() } catch (err) { DOMException = function(message, name) { this.message = message this.name = name var error = Error(message) this.stack = error.stack } DOMException.prototype = Object.create(Error.prototype) DOMException.prototype.constructor = DOMException } function fetch(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init) if (request.signal && request.signal.aborted) { return reject(new DOMException('Aborted', 'AbortError')) } var xhr = new XMLHttpRequest() function abortXhr() { xhr.abort() } xhr.onload = function() { var options = { 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.indexOf('file://') === 0 && (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() { resolve(new Response(body, options)) }, 0) } xhr.onerror = function() { setTimeout(function() { reject(new TypeError('Network request failed')) }, 0) } xhr.ontimeout = function() { setTimeout(function() { reject(new TypeError('Network request timed out')) }, 0) } xhr.onabort = function() { setTimeout(function() { reject(new DOMException('Aborted', 'AbortError')) }, 0) } function fixUrl(url) { try { return url === '' && g.location.href ? g.location.href : url } catch (e) { return url } } xhr.open(request.method, fixUrl(request.url), true) if (request.credentials === 'include') { xhr.withCredentials = true } else if (request.credentials === 'omit') { xhr.withCredentials = false } if ('responseType' in xhr) { if (support.blob) { xhr.responseType = 'blob' } else if ( support.arrayBuffer ) { xhr.responseType = 'arraybuffer' } } 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) }) } if (request.signal) { request.signal.addEventListener('abort', abortXhr) xhr.onreadystatechange = function() { // DONE (success or failure) if (xhr.readyState === 4) { request.signal.removeEventListener('abort', abortXhr) } } } xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) }) } fetch.polyfill = true if (!g.fetch) { g.fetch = fetch g.Headers = Headers g.Request = Request g.Response = Response } }(); // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. !function() { "use strict"; /*!**********************!*\ !*** ./src/index.js ***! \**********************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _DashRenderer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DashRenderer */ "./src/DashRenderer.js"); /* harmony import */ var _utils_clientsideFunctions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/clientsideFunctions */ "./src/utils/clientsideFunctions.ts"); // make DashRenderer globally available window.DashRenderer = _DashRenderer__WEBPACK_IMPORTED_MODULE_0__.DashRenderer; }(); window.dash_renderer = __webpack_exports__; /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaF9yZW5kZXJlci5kZXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0EsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGcUQ7QUFDckQ7QUFDQSwrQkFBK0IsZ0VBQWdCO0FBQy9DOzs7Ozs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRitDO0FBQy9DO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQSx3SEFBd0gsNkRBQWE7QUFDckk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYK0M7QUFDL0M7QUFDQSxjQUFjLDZEQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUcsUUFBUSw4REFBYztBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFlBQVksa0VBQWtFO0FBQ3RGLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzFCQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRmlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBLE1BQU0sOERBQWM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQjZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0RUFBNEI7QUFDcEM7QUFDQTtBQUNBLGdCQUFnQixjQUFjLHdDQUF3QztBQUN0RTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUmtDO0FBQzZCO0FBQy9EO0FBQ0Esd0JBQXdCLHNEQUFPO0FBQy9CO0FBQ0EsU0FBUyxxRUFBcUI7QUFDOUI7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSmlEO0FBQ1k7QUFDWTtBQUN0QjtBQUNuRDtBQUNBLFNBQVMsOERBQWMsT0FBTyxvRUFBb0IsVUFBVSwwRUFBMEIsVUFBVSwrREFBZTtBQUMvRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOdUQ7QUFDSjtBQUNzQjtBQUNsQjtBQUN2RDtBQUNBLFNBQVMsaUVBQWlCLE9BQU8sK0RBQWUsT0FBTywwRUFBMEIsT0FBTyxpRUFBaUI7QUFDekc7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTmtDO0FBQ2xDO0FBQ0Esa0JBQWtCLHNEQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzREFBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVmtDO0FBQ1M7QUFDM0M7QUFDQSxVQUFVLDJEQUFXO0FBQ3JCLHFCQUFxQixzREFBTztBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNScUQ7QUFDckQ7QUFDQTtBQUNBLHFDQUFxQyxnRUFBZ0I7QUFDckQsY0FBYztBQUNkLCtMQUErTCxnRUFBZ0I7QUFDL007QUFDQTs7Ozs7Ozs7Ozs7QUNQQSxlQUFlLEtBQWlELGtCQUFrQixtQkFBTyxDQUFDLG9CQUFPLEdBQUcsQ0FBK0ssQ0FBQyxxQkFBcUIsbUJBQW1CLFNBQVMsY0FBYyw0QkFBNEIsWUFBWSxxQkFBcUIsMkRBQTJELHVDQUF1QyxxQ0FBcUMsb0JBQW9CLEVBQUUsaUJBQWlCLDRGQUE0RixlQUFlLHdDQUF3QyxTQUFTLEVBQUUsbUJBQW1CLDhCQUE4QixxREFBcUQsMEJBQTBCLDZDQUE2QyxzQkFBc0IsNkRBQTZELFlBQVksZUFBZSxTQUFTLGlCQUFpQixpQ0FBaUMsaUJBQWlCLFlBQVksVUFBVSxzQkFBc0IsbUJBQW1CLGlEQUFpRCxpQkFBaUIsZ0JBQWdCLFlBQVksaUJBQWlCLGFBQWEsMENBQTBDLFNBQVMsNkNBQTZDLFNBQVMsK0JBQStCLFNBQVMsK0JBQStCLFNBQVMsR0FBRyxXQUFXLDBCQUEwQixJQUFJLHdCQUF3QixTQUFTLGlCQUFpQix5Q0FBeUMsY0FBYyxrQkFBa0IsdUJBQXVCLGtDQUFrQyxtQkFBbUIsY0FBYyxzQkFBc0IsY0FBYyx1QkFBdUIsVUFBVSxJQUFJLG9CQUFvQixTQUFTLGlDQUFpQyxJQUFJLGtDQUFrQyw4Q0FBOEMsMERBQTBELDRDQUE0QyxNQUFNLHVCQUF1Qiw2QkFBNkIsb0JBQW9CLGtDQUFrQyxLQUFLLFNBQVMsR0FBRyxJQUFJLG9FQUFvRSxlQUFlLGtCQUFrQixRQUFRLGlCQUFpQiw2REFBNkQsZUFBZSxhQUFhLEVBQUUsZUFBZSwrQ0FBK0MsZ0JBQWdCLFlBQVksV0FBVyxLQUFLLFdBQVcsK0dBQStHLGdEQUFnRCxhQUFhLGVBQWUsOEVBQThFLFNBQVMsVUFBVSxlQUFlLDJDQUEyQywwQ0FBMEMsRUFBRSxpQ0FBaUMsK0NBQStDLHlDQUF5Qyw0RUFBNEUsWUFBWSxJQUFJLEdBQUcsR0FBRzs7Ozs7Ozs7Ozs7QUNBNWhHOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU8sUUFBUTtBQUNoQyxpQkFBaUIsT0FBTyxRQUFRO0FBQ2hDLGtCQUFrQixPQUFPLE9BQU87QUFDaEMsa0JBQWtCLE9BQU8sT0FBTztBQUNoQyxpQkFBaUIsUUFBUSxPQUFPO0FBQ2hDLGlCQUFpQixRQUFRLE9BQU87QUFDaEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLEVBQUUsVUFBVSxFQUFFO0FBQzdEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYSxhQUFhO0FBQzFDO0FBQ0EsZ0JBQWdCLGFBQWEsYUFBYTtBQUMxQztBQUNBLGdCQUFnQixhQUFhLGFBQWE7QUFDMUM7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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNFQUFzRSxtQ0FBbUM7O0FBRXpHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsMEhBQTBIO0FBQzFILFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtS0FBbUs7QUFDbks7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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LFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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UTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRLFdBQVc7QUFDOUIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsK0NBQStDLGlCQUFpQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG1DQUFtQywwQkFBMEI7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQ0FBc0MsV0FBVztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFdBQVc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0Msc0NBQXNDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsR0FB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtDQUFrQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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QUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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TjtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSTs7QUFFTCwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9FQUFvRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FB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QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDBEQUEwRDtBQUMxRCxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpQkFBaUIsS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIseUJBQXlCO0FBQ3pCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDRCQUE0QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsVUFBVTs7QUFFVixZQUFZO0FBQ1osWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGOztBQUVoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHlCQUF5QjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx5QkFBeUIseUJBQXlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxxQkFBcUI7QUFDMUUsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTs7QUFFakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVELGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIsbUJBQW1CO0FBQ25CLGtCQUFrQjtBQUNsQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHdCQUF3QjtBQUN4QixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHNCQUFzQjtBQUN0Qix1QkFBdUI7QUFDdkIsNEJBQTRCO0FBQzVCLHNCQUFzQjtBQUN0Qix3QkFBd0I7QUFDeEIsMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUN6QixnQ0FBZ0M7QUFDaEMsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUMsVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQjtBQUNwQjtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUEsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWYsdUJBQXVCO0FBQ3ZCLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxzQkFBc0I7QUFDdEIsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQixvQkFBb0I7QUFDcEIsNkJBQTZCO0FBQzdCLGdDQUFnQztBQUNoQyxvQkFBb0I7QUFDcEIsc0JBQXNCO0FBQ3RCLHlCQUF5QjtBQUN6Qix1QkFBdUI7QUFDdkIsb0JBQW9CO0FBQ3BCLDRCQUE0QjtBQUM1QixnQ0FBZ0M7QUFDaEMscUNBQXFDOztBQUVyQyx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsaUJBQWlCOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw0QkFBNEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGFBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGFBQWE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDJDQUEyQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUJBQXFCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsOEJBQThCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlCQUF5QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFH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O0FBQ3BFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtDQUFrQztBQUN4RDs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyx5QkFBeUI7QUFDOUQ7QUFDQTtBQUNB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QjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JGYTs7QUFFYixRQUFRLG1CQUFPLENBQUMscURBQVc7QUFDM0IsWUFBWSxzRkFBNEI7QUFDeEMsV0FBVyxtQkFBTyxDQUFDLGlEQUFTOztBQUU1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixjQUFj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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCw4Q0FBOEMsd0JBQXdCO0FBQ3RFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLDJCQUEyQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNY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R0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxzQkFBc0I7QUFDbEU7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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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Q0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVksZ0NBQW1COztBQUUvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQSwwQkFBMEIsS0FBSzs7QUFFL0I7QUFDQTtBQUNBLDBCQUEwQixLQUFLOztBQUUvQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSixvQ0FBb0M7QUFDcEMsSUFBSTtBQUNKLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EsaUNBQWlDLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELCtEQUErRCx5REFBeUQscUVBQXFFLDZEQUE2RCx3QkFBd0I7O0FBRWpqQixrREFBa0QsMENBQTBDOztBQUU1RjtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBLHFHQUFxRyxxQkFBcUIsbUJBQW1COztBQUU3STs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQSxtQ0FBbUMsMEJBQTBCLDBDQUEwQyxnQkFBZ0IsT0FBTyxvQkFBb0IsZUFBZSxPQUFPOztBQUV4SyxzQkFBc0IsZ0NBQW1CO0FBQ3pDLG9CQUFvQixnQ0FBbUI7QUFDdkMsWUFBWSxnQ0FBbUI7QUFDL0IsWUFBWSxnQ0FBbUI7QUFDL0IsYUFBYSxnQ0FBbUI7QUFDaEMsYUFBYSxnQ0FBbUI7QUFDaEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxjQUFjLGdDQUFtQjs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0JBQXNCLDBCQUEwQjtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGtCQUFrQjtBQUNwQzs7QUFFQTtBQUNBOztBQUVBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlCQUFpQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQSxhQUFhLGdDQUFtQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBLG1DQUFtQywwQkFBMEIsMENBQTBDLGdCQUFnQixPQUFPLG9CQUFvQixlQUFlLE9BQU87O0FBRXhLLGFBQWEsZ0NBQW1CO0FBQ2hDLHdCQUF3QixnQ0FBbUI7QUFDM0Msc0JBQXNCLGdDQUFtQjtBQUN6QyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLFlBQVksZ0NBQW1COztBQUUvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixtQkFBbUI7QUFDckM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0JBQWdCLG1CQUFtQjtBQUNuQzs7QUFFQSxzQkFBc0IsbUJBQW1CO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7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O0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZLFFBQVEsSUFBSSxRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDNXNDQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsK0NBQVM7O0FBRTVCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDTkEsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxjQUFjLG1CQUFPLENBQUMscURBQVk7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvQkEscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1CO0FBQ2hELHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQy9CQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsK0NBQVM7O0FBRTVCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDTkEsb0JBQW9CLG1CQUFPLENBQUMsaUVBQWtCO0FBQzlDLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFtQjtBQUNoRCxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQy9CQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsK0NBQVM7O0FBRTVCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDTkEsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsV0FBVyxtQkFBTyxDQUFDLCtDQUFTOztBQUU1QjtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ05BLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDMUJBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMxQkEsV0FBVyxtQkFBTyxDQUFDLCtDQUFTOztBQUU1QjtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ0xBLFdBQVcsbUJBQU8sQ0FBQywrQ0FBUzs7QUFFNUI7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNMQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsK0NBQVM7O0FBRTVCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE9BQU87QUFDbEIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN4QkEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLEdBQUc7QUFDZCxXQUFXLFVBQVU7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3JCQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxrQkFBa0IsbUJBQU8sQ0FBQywyREFBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLFNBQVM7QUFDcEI7QUFDQSxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDWEEsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELFNBQVMsbUJBQU8sQ0FBQyx5Q0FBTTs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbkJBLHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxTQUFTLG1CQUFPLENBQUMseUNBQU07O0FBRXZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBLFNBQVMsbUJBQU8sQ0FBQyx5Q0FBTTs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3BCQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxXQUFXLG1CQUFPLENBQUMsNkNBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNoQkEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsYUFBYSxtQkFBTyxDQUFDLGlEQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDaEJBLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFtQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3hCQSxZQUFZLG1CQUFPLENBQUMsaURBQVU7QUFDOUIsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLG9CQUFvQixtQkFBTyxDQUFDLGlFQUFrQjtBQUM5QyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLG1EQUFXO0FBQ2hDLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFtQjtBQUNoRCxxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDaEQsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELGNBQWMsbUJBQU8sQ0FBQyxtREFBVztBQUNqQyxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLCtDQUFTO0FBQzdCLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxZQUFZLG1CQUFPLENBQUMsK0NBQVM7QUFDN0IsV0FBVyxtQkFBTyxDQUFDLDZDQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxpREFBVTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3JLQSxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUM3QkEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFVBQVU7QUFDckIsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDYkEsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvQkEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3ZCQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxvQkFBb0IsbUJBQU8sQ0FBQyxpRUFBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3JDQSxvQkFBb0IsbUJBQU8sQ0FBQyxpRUFBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2ZBLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxXQUFXLG1CQUFPLENBQUMsNkNBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLFlBQVksbUJBQU8sQ0FBQyxpREFBVTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3ZCQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ25CQSxhQUFhLG1CQUFPLENBQUMsbURBQVc7QUFDaEMsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1COztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDYkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsY0FBYztBQUN6QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsY0FBYztBQUN6QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDWkEsb0JBQW9CLG1CQUFPLENBQUMsaUVBQWtCO0FBQzlDLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLG9CQUFvQixtQkFBTyxDQUFDLGlFQUFrQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbkJBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNqQkEsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELG1CQUFtQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBLFlBQVksbUJBQU8sQ0FBQyxpREFBVTtBQUM5QixrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxtREFBVztBQUNoQyxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLG1CQUFtQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbEZBLGFBQWEsbUJBQU8sQ0FBQyxtREFBVztBQUNoQyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLFlBQVksbUJBQU8sQ0FBQyxpREFBVTtBQUM5QixrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDWEEsaUJBQWlCLG1CQUFPLENBQUMseURBQWM7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDOUNBLGFBQWEsbUJBQU8sQ0FBQyxtREFBVztBQUNoQyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMzREEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLDBCQUEwQixtQkFBTyxDQUFDLDZFQUF3QjtBQUMxRCxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM5QkEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdCQSxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNiQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3JCQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCO0FBQzVDLDhCQUE4QixtQkFBTyxDQUFDLHFGQUE0Qjs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3JCQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsVUFBVSxtQkFBTyxDQUFDLDJDQUFPO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQywrQ0FBUztBQUM3QixZQUFZLG1CQUFPLENBQUMsaURBQVU7QUFDOUIseUJBQXlCLG1CQUFPLENBQUMsMkVBQXVCO0FBQ3hELDhCQUE4QixtQkFBTyxDQUFDLHFGQUE0QjtBQUNsRSxZQUFZLG1CQUFPLENBQUMsaURBQVU7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hDQSxZQUFZLG1CQUFPLENBQUMsaURBQVU7QUFDOUIsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCO0FBQ3BELGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxvQkFBb0IsbUJBQU8sQ0FBQyxpRUFBa0I7QUFDOUMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLGFBQWEsbUJBQU8sQ0FBQyxpREFBVTtBQUMvQixjQUFjLG1CQUFPLENBQUMscURBQVk7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7Ozs7Ozs7Ozs7QUN6Q0EsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCO0FBQ3BELGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxzQkFBc0IsbUJBQU8sQ0FBQyxxRUFBb0I7QUFDbEQsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELGtCQUFrQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtREFBVztBQUNqQyx3QkFBd0IsbUJBQU8sQ0FBQyx1RUFBcUI7QUFDckQsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3ZDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxvQkFBb0IsbUJBQU8sQ0FBQywrREFBaUI7QUFDN0MsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCO0FBQzNDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxvQkFBb0IsbUJBQU8sQ0FBQywrREFBaUI7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM3RkEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLDhCQUE4QjtBQUN6QyxXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGFBQWE7QUFDYixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7Ozs7Ozs7Ozs7O0FDaERBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLFlBQVksbUJBQU8sQ0FBQywrQ0FBUzs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOzs7Ozs7Ozs7OztBQ2xCQSxjQUFjLG1CQUFPLENBQUMscURBQVk7QUFDbEMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2JBLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNmQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsR0FBRztBQUNkLFdBQVcsU0FBUztBQUNwQjtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hCQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLGlEQUFVOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGNBQWM7QUFDekIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbERBLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDaEQsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOzs7Ozs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQkEsYUFBYSxtQkFBTyxDQUFDLG1EQUFXO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3BDQSxzQkFBc0IsbUJBQU8sQ0FBQyxxRUFBb0I7O0FBRWxEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNiQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsb0JBQW9CLG1CQUFPLENBQUMsaUVBQWtCO0FBQzlDLHdCQUF3QixtQkFBTyxDQUFDLHlFQUFzQjtBQUN0RCxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3ZFQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOzs7Ozs7Ozs7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ1pBLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDYkEsY0FBYyxtQkFBTyxDQUFDLG1EQUFXO0FBQ2pDLFlBQVksbUJBQU8sQ0FBQyxpREFBVTtBQUM5QixtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcEJBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUNmQSxXQUFXLG1CQUFPLENBQUMsK0NBQVM7O0FBRTVCO0FBQ0Esa0JBQWtCLEtBQTBCOztBQUU1QztBQUNBLGdDQUFnQyxRQUFhOztBQUU3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNsQ0EsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hCQSxhQUFhLG1CQUFPLENBQUMsbURBQVc7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLHVCQUF1QixtQkFBTyxDQUFDLHVFQUFxQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2ZBLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN4Q0EsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsb0JBQW9CO0FBQy9CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbkJBLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxzQkFBc0IsbUJBQU8sQ0FBQyxxRUFBb0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVEsVUFBVTtBQUM3QixXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdkNBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVEsVUFBVTtBQUM3QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVEsVUFBVTtBQUM3QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsV0FBVyxtQkFBTyxDQUFDLCtDQUFTOztBQUU1QjtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ0xBLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOzs7Ozs7Ozs7OztBQ3BDQSxrQkFBa0IsbUJBQU8sQ0FBQywyREFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN4QkEsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCO0FBQzVDLGtCQUFrQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3pDLFdBQVcsbUJBQU8sQ0FBQyw2Q0FBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDeEJBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFtQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM3QkEsVUFBVSxtQkFBTyxDQUFDLDZDQUFRO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQyw2Q0FBUTtBQUMzQixpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbEJBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxJQUFJO0FBQ0osQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUNWQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ25GQSxhQUFhLG1CQUFPLENBQUMsbURBQVc7QUFDaEMsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsU0FBUyxtQkFBTyxDQUFDLHlDQUFNO0FBQ3ZCLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDL0dBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN6RkEsY0FBYyxtQkFBTyxDQUFDLG1EQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNmQTtBQUNBLHdCQUF3QixxQkFBTSxnQkFBZ0IscUJBQU0sSUFBSSxxQkFBTSxzQkFBc0IscUJBQU07O0FBRTFGOzs7Ozs7Ozs7OztBQ0hBLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFtQjtBQUNoRCxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxXQUFXLG1CQUFPLENBQUMsNkNBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNmQSxxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDaEQsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxpREFBVTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDaEJBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pCQSx5QkFBeUIsbUJBQU8sQ0FBQywyRUFBdUI7QUFDeEQsV0FBVyxtQkFBTyxDQUFDLDZDQUFROztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3ZCQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDaEJBLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbEM7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNMQSxhQUFhLG1CQUFPLENBQUMsbURBQVc7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDN0NBLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxnQkFBZ0IsbUJBQU8sQ0FBQyx1REFBYTs7QUFFckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7Ozs7Ozs7Ozs7O0FDN0JBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxnQkFBZ0IsbUJBQU8sQ0FBQyx1REFBYTs7QUFFckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3hCQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsVUFBVSxtQkFBTyxDQUFDLDZDQUFRO0FBQzFCLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxVQUFVLG1CQUFPLENBQUMsNkNBQVE7QUFDMUIsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNaQSxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXO0FBQ2pDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLGlEQUFVOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDekJBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDaEJBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDN0JBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN0QkEsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDekJBLHVCQUF1QixtQkFBTyxDQUFDLHVFQUFxQjtBQUNwRCxvQkFBb0IsbUJBQU8sQ0FBQyxpRUFBa0I7QUFDOUMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxzQkFBc0IsbUJBQU8sQ0FBQyxxRUFBb0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDNUVBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLGFBQWEsbUJBQU8sQ0FBQyxtREFBVztBQUNoQyxrQkFBa0IsbUJBQU8sQ0FBQywyREFBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3hCQSxTQUFTLG1CQUFPLENBQUMseUNBQU07QUFDdkIsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7QUFDekMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdCQSxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNkQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pCQSxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNaQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2xDQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNsQkEsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2ZBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDekJBLFdBQVcsbUJBQU8sQ0FBQywrQ0FBUztBQUM1QixnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxVQUFVLG1CQUFPLENBQUMsNkNBQVE7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNwQkEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pCQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNmQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNmQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbkJBLGNBQWMsbUJBQU8sQ0FBQyxtREFBVzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3pCQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYzs7QUFFdEM7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNMQSxjQUFjLG1CQUFPLENBQUMscURBQVk7O0FBRWxDO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDbkJBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBLGtCQUFrQixLQUEwQjs7QUFFNUM7QUFDQSxnQ0FBZ0MsUUFBYTs7QUFFN0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUM3QkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2RBLFlBQVksbUJBQU8sQ0FBQyxpREFBVTs7QUFFOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQ0EsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxlQUFlLG1CQUFPLENBQUMsdURBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcENBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDYkEsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsVUFBVSxtQkFBTyxDQUFDLDZDQUFRO0FBQzFCLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNqQkEsb0JBQW9CLG1CQUFPLENBQUMsaUVBQWtCOztBQUU5QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEOzs7Ozs7Ozs7OztBQzFCQSxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLGVBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3pCQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxFQUFFO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0NBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUSxJQUFJLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQ0EsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUSxJQUFJLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZLFFBQVEsSUFBSSxRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN6QkEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLFNBQVMsbUJBQU8sQ0FBQyx5Q0FBTTtBQUN2QixxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDaEQsYUFBYSxtQkFBTyxDQUFDLGlEQUFVOztBQUUvQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsV0FBVztBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVEsSUFBSSxRQUFRLElBQUksUUFBUTtBQUNoRCxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUMvREEseUZBQXFDOzs7Ozs7Ozs7OztBQ0FyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcENBLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLDZDQUE2QztBQUNwRCxPQUFPO0FBQ1A7QUFDQTtBQUNBLGlDQUFpQyxtQkFBbUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDJCQUEyQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFdBQVc7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ25EQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxnQkFBZ0IsbUJBQU8sQ0FBQyx1REFBYTs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLE9BQU8sOENBQThDO0FBQ3JELE9BQU8sK0NBQStDO0FBQ3RELE9BQU87QUFDUDtBQUNBO0FBQ0EsK0JBQStCLG9CQUFvQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMEJBQTBCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDekNBLG9CQUFvQixtQkFBTyxDQUFDLGlFQUFrQjtBQUM5QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsZ0JBQWdCLG1CQUFPLENBQUMsdURBQWE7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxPQUFPLG9DQUFvQztBQUMzQyxPQUFPLG9DQUFvQztBQUMzQyxPQUFPO0FBQ1A7QUFDQTtBQUNBLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlDQUFpQztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdERBLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNyQkEsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDeENBLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLGlEQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN0Q0EsY0FBYyxtQkFBTyxDQUFDLHFEQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsY0FBYztBQUN6QixXQUFXLEdBQUc7QUFDZCxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBLGtCQUFrQixRQUFRLE9BQU8sVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hDQSxjQUFjLG1CQUFPLENBQUMscURBQVk7QUFDbEMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGNBQWM7QUFDekIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QiwwQkFBMEIsZ0JBQWdCLFFBQVEsR0FBRztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNsQ0EsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGNBQWM7QUFDekIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSwyQkFBMkIsZ0JBQWdCLFFBQVEsR0FBRztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNwQkEsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELG1CQUFtQixtQkFBTyxDQUFDLDZEQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1CQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLG1CQUFtQjtBQUNsRTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN6QkEsaUJBQWlCLG1CQUFPLENBQUMseURBQWM7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNoQ0Esa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7QUFDekMsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDaENBLFdBQVcsbUJBQU8sQ0FBQywrQ0FBUztBQUM1QixnQkFBZ0IsbUJBQU8sQ0FBQyx1REFBYTs7QUFFckM7QUFDQSxrQkFBa0IsS0FBMEI7O0FBRTVDO0FBQ0EsZ0NBQWdDLFFBQWE7O0FBRTdDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNyQ0EsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxtREFBVztBQUNoQyxrQkFBa0IsbUJBQU8sQ0FBQywyREFBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7QUFDekMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzVFQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbENBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDNUJBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdCQUFnQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdEQSxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBYztBQUN0QyxlQUFlLG1CQUFPLENBQUMsdURBQWE7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzFCQSxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7QUFDakMsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM3QkEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM1QkEsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCO0FBQ3BELGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDckJBLG9CQUFvQixtQkFBTyxDQUFDLGlFQUFrQjtBQUM5QyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNwQ0Esb0JBQW9CLG1CQUFPLENBQUMsaUVBQWtCO0FBQzlDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGtCQUFrQixtQkFBTyxDQUFDLDJEQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQkEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxjQUFjLG1CQUFPLENBQUMscURBQVk7QUFDbEMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxPQUFPLGtCQUFrQjtBQUN6QixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDcERBLHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsOEJBQThCO0FBQ2hELGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esb0NBQW9DLGVBQWU7QUFDbkQsV0FBVywyQkFBMkI7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsV0FBVywyQkFBMkI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzFDQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLG1EQUFXO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDNUJBLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUN4RUEsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxXQUFXO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVEsSUFBSSxRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUSxJQUFJLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRLGdCQUFnQixJQUFJLGdCQUFnQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOzs7Ozs7Ozs7OztBQ3RDQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLG1EQUFXO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDNUJBLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLG1EQUFXOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0Esb0JBQW9CLFFBQVEsSUFBSSxRQUFRO0FBQ3hDO0FBQ0Esa0NBQWtDLGFBQWE7QUFDL0MsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNoQkEsV0FBVyxtQkFBTyxDQUFDLCtDQUFTOztBQUU1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsc0JBQXNCO0FBQ2pDLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixDQUFDOztBQUVEOzs7Ozs7Ozs7OztBQ3hCQSxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsdUJBQXVCLG1CQUFPLENBQUMsdUVBQXFCO0FBQ3BELFlBQVksbUJBQU8sQ0FBQyxpREFBVTtBQUM5QixZQUFZLG1CQUFPLENBQUMsaURBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxPQUFPLE9BQU8sVUFBVTtBQUN4QixPQUFPLE9BQU87QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQy9CQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdDQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxpQkFBaUIsbUJBQU8sQ0FBQywyREFBZTtBQUN4QyxjQUFjLG1CQUFPLENBQUMsbURBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsY0FBYyx3QkFBd0I7QUFDdEM7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSLFdBQVcsOEJBQThCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDbERBLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxhQUFhLG1CQUFPLENBQUMsbURBQVc7QUFDaEMsa0JBQWtCLG1CQUFPLENBQUMsMkRBQWU7QUFDekMsZUFBZSxtQkFBTyxDQUFDLHFEQUFZO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlOztBQUV4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdDQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxxQkFBcUIsbUJBQU8sQ0FBQyxtRUFBbUI7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsMEJBQTBCO0FBQ3JDO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU87QUFDUDtBQUNBO0FBQ0Esa0NBQWtDLGdCQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakJBLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3pDQSxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNuQ0EsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxlQUFlLG1CQUFPLENBQUMscURBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvREEsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsYUFBYSxtQkFBTyxDQUFDLGlEQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsV0FBVztBQUNYO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUMvQkEsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWlCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxxREFBWTtBQUNuQyxpQkFBaUIsbUJBQU8sQ0FBQyx5REFBYztBQUN2QyxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCOztBQUUzQztBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsaUJBQWlCLHdCQUF3QjtBQUN6QztBQUNBLElBQUksSUFBSTtBQUNSLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNoRUEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGVBQWUsbUJBQU8sQ0FBQyx1REFBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsdUVBQXFCOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7Ozs7Ozs7Ozs7QUN6QkEsZUFBZSxtQkFBTyxDQUFDLHFEQUFZOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDM0JBLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQyw2Q0FBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDakNBLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxvQkFBb0IsbUJBQU8sQ0FBQyxpRUFBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYNEM7QUFDWTtBQUNoQjs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUksR0FBRyxHQUFHLGFBQWFILCtEQUFPLENBQUUsYUFBYUMscUVBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFQyx5REFBSyxFQUFFLFNBQVNDLEdBQUdBLENBQUM1UixFQUFFLEVBQUU2UixJQUFJLEVBQUU7RUFDaEcsSUFBSUMsR0FBRyxHQUFHLENBQUM7RUFDWCxPQUFPQSxHQUFHLEdBQUdELElBQUksQ0FBQ3hjLE1BQU0sRUFBRTtJQUN4QixJQUFJLENBQUMySyxFQUFFLENBQUM2UixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFDbEIsT0FBTyxLQUFLO0lBQ2Q7SUFDQUEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU8sSUFBSTtBQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ0gsK0RBQWVGLEdBQUc7Ozs7Ozs7Ozs7Ozs7QUN0QzBCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlJLE1BQU0sR0FBRyxhQUFhRCwrREFBTyxDQUFDLFNBQVNDLE1BQU1BLENBQUNDLEdBQUcsRUFBRTtFQUNyRCxPQUFPLFlBQVk7SUFDakIsT0FBT0EsR0FBRztFQUNaLENBQUM7QUFDSCxDQUFDLENBQUM7QUFDRiwrREFBZUQsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O0FDMUJ1QjtBQUNZO0FBQ2hCOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlHLEdBQUcsR0FBRyxhQUFhViwrREFBTyxDQUFFLGFBQWFDLHFFQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRVEseURBQUssRUFBRSxTQUFTQyxHQUFHQSxDQUFDblMsRUFBRSxFQUFFNlIsSUFBSSxFQUFFO0VBQ2hHLElBQUlDLEdBQUcsR0FBRyxDQUFDO0VBQ1gsT0FBT0EsR0FBRyxHQUFHRCxJQUFJLENBQUN4YyxNQUFNLEVBQUU7SUFDeEIsSUFBSTJLLEVBQUUsQ0FBQzZSLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNqQixPQUFPLElBQUk7SUFDYjtJQUNBQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBTyxLQUFLO0FBQ2QsQ0FBQyxDQUFDLENBQUM7QUFDSCwrREFBZUssR0FBRzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDMEI7QUFDQTtBQUNBO0FBQ2pCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUcsRUFBRSxHQUFHLGFBQWFiLCtEQUFPLENBQUMsU0FBU2EsRUFBRUEsQ0FBQ0MsTUFBTSxFQUFFQyxNQUFNLEVBQUU7RUFDeEQsT0FBTyxPQUFPQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxVQUFVLEdBQUdBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDRCxNQUFNLENBQUMsR0FBRyxPQUFPQSxNQUFNLENBQUNELEVBQUUsS0FBSyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0QsRUFBRSxDQUFDRSxNQUFNLENBQUMsR0FBRyxPQUFPRCxNQUFNLEtBQUssVUFBVSxHQUFHLFVBQVV6VixDQUFDLEVBQUU7SUFDN0wsT0FBT3lWLE1BQU0sQ0FBQ3pWLENBQUMsQ0FBQyxDQUFDMFYsTUFBTSxDQUFDMVYsQ0FBQyxDQUFDLENBQUM7RUFDN0IsQ0FBQyxHQUFHdVYsK0RBQU8sQ0FBQyxVQUFVSSxHQUFHLEVBQUVDLENBQUMsRUFBRTtJQUM1QixPQUFPTiwrREFBTyxDQUFDSyxHQUFHLEVBQUV4VixtREFBRyxDQUFDeVYsQ0FBQyxFQUFFRixNQUFNLENBQUMsQ0FBQztFQUNyQyxDQUFDLEVBQUUsRUFBRSxFQUFFRCxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVELEVBQUU7Ozs7Ozs7Ozs7Ozs7O0FDdEMyQjtBQUNBOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUssTUFBTSxHQUFHLGFBQWFsQiwrREFBTyxDQUFDLFNBQVNrQixNQUFNQSxDQUFDQyxFQUFFLEVBQUVmLElBQUksRUFBRTtFQUMxRCxPQUFPTywrREFBTyxDQUFDUCxJQUFJLEVBQUUsQ0FBQ2UsRUFBRSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVELE1BQU07Ozs7Ozs7Ozs7Ozs7O0FDMUJ1QjtBQUNMOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJSSxLQUFLLEdBQUcsYUFBYUYsK0RBQU8sQ0FBQyxTQUFTRSxLQUFLQSxDQUFDQyxJQUFJLEVBQUVmLEdBQUcsRUFBRWdCLEdBQUcsRUFBRTtFQUM5RCxPQUFPSCx5REFBUyxDQUFDLENBQUNFLElBQUksQ0FBQyxFQUFFZixHQUFHLEVBQUVnQixHQUFHLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVGLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCd0I7QUFDTjtBQUNZO0FBQ1I7QUFDWDs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUQsU0FBUyxHQUFHLGFBQWFELCtEQUFPLENBQUMsU0FBU0MsU0FBU0EsQ0FBQy9GLElBQUksRUFBRWtGLEdBQUcsRUFBRWdCLEdBQUcsRUFBRTtFQUN0RSxJQUFJbEcsSUFBSSxDQUFDMVgsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUNyQixPQUFPNGMsR0FBRztFQUNaO0VBQ0EsSUFBSUgsR0FBRyxHQUFHL0UsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUNqQixJQUFJQSxJQUFJLENBQUMxWCxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQ25CLElBQUlpZSxPQUFPLEdBQUcsQ0FBQ0QscURBQUssQ0FBQ0osR0FBRyxDQUFDLElBQUlDLDREQUFJLENBQUNwQixHQUFHLEVBQUVtQixHQUFHLENBQUMsSUFBSTFlLE9BQUEsQ0FBTzBlLEdBQUcsQ0FBQ25CLEdBQUcsQ0FBQyxNQUFLLFFBQVEsR0FBR21CLEdBQUcsQ0FBQ25CLEdBQUcsQ0FBQyxHQUFHcUIsa0VBQVUsQ0FBQ3BHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEhrRixHQUFHLEdBQUdhLFNBQVMsQ0FBQ3ZkLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzZILElBQUksRUFBRSxDQUFDLENBQUMsRUFBRWtGLEdBQUcsRUFBRXFCLE9BQU8sQ0FBQztFQUNwRTtFQUNBLE9BQU9GLDhEQUFNLENBQUN0QixHQUFHLEVBQUVHLEdBQUcsRUFBRWdCLEdBQUcsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFDRiwrREFBZUgsU0FBUzs7Ozs7Ozs7Ozs7Ozs7QUN6Q2tCO0FBQ0U7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTdkLElBQUksR0FBRyxhQUFhd2MsK0RBQU8sQ0FBQyxTQUFTeGMsSUFBSUEsQ0FBQytLLEVBQUUsRUFBRXlULE9BQU8sRUFBRTtFQUN6RCxPQUFPRCw4REFBTSxDQUFDeFQsRUFBRSxDQUFDM0ssTUFBTSxFQUFFLFlBQVk7SUFDbkMsT0FBTzJLLEVBQUUsQ0FBQzBULEtBQUssQ0FBQ0QsT0FBTyxFQUFFcmUsU0FBUyxDQUFDO0VBQ3JDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGLCtEQUFlSCxJQUFJOzs7Ozs7Ozs7Ozs7OztBQzlCdUI7QUFDRTs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTJlLEtBQUssR0FBRyxhQUFhN0IsK0RBQU8sQ0FBQyxTQUFTNkIsS0FBS0EsQ0FBQzdjLEtBQUssRUFBRTtFQUNyRCxPQUFPQSxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU9BLEtBQUssQ0FBQzZjLEtBQUssS0FBSyxVQUFVLEdBQUc3YyxLQUFLLENBQUM2YyxLQUFLLENBQUMsQ0FBQyxHQUFHRCw4REFBTSxDQUFDNWMsS0FBSyxFQUFFLElBQUksQ0FBQztBQUNqRyxDQUFDLENBQUM7QUFDRiwrREFBZTZjLEtBQUs7Ozs7Ozs7Ozs7Ozs7QUNqQ3dCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsVUFBVSxHQUFHLGFBQWE5QiwrREFBTyxDQUFDLFNBQVM4QixVQUFVQSxDQUFDQyxJQUFJLEVBQUU7RUFDOUQsT0FBTyxVQUFVQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtJQUNyQixPQUFPRixJQUFJLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUdGLElBQUksQ0FBQ0UsQ0FBQyxFQUFFRCxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUM3QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVGLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUJtQjtBQUNFO0FBQ007QUFDSjtBQUNYOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlRLE1BQU0sR0FBRyxhQUFhNUMsK0RBQU8sQ0FBQyxTQUFTNEMsTUFBTUEsQ0FBQ04sQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDdEQsSUFBSUMsZ0VBQVEsQ0FBQ0YsQ0FBQyxDQUFDLEVBQUU7SUFDZixJQUFJRSxnRUFBUSxDQUFDRCxDQUFDLENBQUMsRUFBRTtNQUNmLE9BQU9ELENBQUMsQ0FBQ00sTUFBTSxDQUFDTCxDQUFDLENBQUM7SUFDcEI7SUFDQSxNQUFNLElBQUk5YyxTQUFTLENBQUNrZCx3REFBUSxDQUFDSixDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztFQUN2RDtFQUNBLElBQUlHLGlFQUFTLENBQUNKLENBQUMsQ0FBQyxFQUFFO0lBQ2hCLElBQUlJLGlFQUFTLENBQUNILENBQUMsQ0FBQyxFQUFFO01BQ2hCLE9BQU9ELENBQUMsR0FBR0MsQ0FBQztJQUNkO0lBQ0EsTUFBTSxJQUFJOWMsU0FBUyxDQUFDa2Qsd0RBQVEsQ0FBQ0osQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7RUFDdkQ7RUFDQSxJQUFJRCxDQUFDLElBQUksSUFBSSxJQUFJRyxtRUFBVyxDQUFDSCxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFO0lBQ3RELE9BQU9BLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDQyxDQUFDLENBQUM7RUFDcEM7RUFDQSxJQUFJRCxDQUFDLElBQUksSUFBSSxJQUFJRyxtRUFBVyxDQUFDSCxDQUFDLENBQUNNLE1BQU0sQ0FBQyxFQUFFO0lBQ3RDLE9BQU9OLENBQUMsQ0FBQ00sTUFBTSxDQUFDTCxDQUFDLENBQUM7RUFDcEI7RUFDQSxNQUFNLElBQUk5YyxTQUFTLENBQUNrZCx3REFBUSxDQUFDTCxDQUFDLENBQUMsR0FBRyxpRUFBaUUsQ0FBQztBQUN0RyxDQUFDLENBQUM7QUFDRiwrREFBZU0sTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkR1QjtBQUNOO0FBQ0w7QUFDTjtBQUNJO0FBQ0U7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSU0sUUFBUSxHQUFHLGFBQWFsRCwrREFBTyxDQUFDLFNBQVNrRCxRQUFRQSxDQUFDQyxLQUFLLEVBQUVDLEdBQUcsRUFBRTtFQUNoRSxPQUFPTixzREFBTSxDQUFDRyxzREFBTSxDQUFDRiwrQ0FBRyxFQUFFLENBQUMsRUFBRUMscURBQUssQ0FBQyxRQUFRLEVBQUVJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWTtJQUM5RCxJQUFJQyxJQUFJLEdBQUcxZixTQUFTO0lBQ3BCLElBQUkyZixPQUFPLEdBQUcsSUFBSTtJQUNsQixPQUFPSCxLQUFLLENBQUNsQixLQUFLLENBQUNxQixPQUFPLEVBQUVULDREQUFJLENBQUMsVUFBVXRVLEVBQUUsRUFBRTtNQUM3QyxPQUFPQSxFQUFFLENBQUMwVCxLQUFLLENBQUNxQixPQUFPLEVBQUVELElBQUksQ0FBQztJQUNoQyxDQUFDLEVBQUVELEdBQUcsQ0FBQyxDQUFDO0VBQ1YsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0YsK0RBQWVGLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1Q21CO0FBQ0U7QUFDQTtBQUNBOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJSixNQUFNLEdBQUcsYUFBYTlDLCtEQUFPLENBQUMsU0FBUzhDLE1BQU1BLENBQUNsZixNQUFNLEVBQUUySyxFQUFFLEVBQUU7RUFDNUQsSUFBSTNLLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDaEIsT0FBTzBjLCtEQUFPLENBQUMvUixFQUFFLENBQUM7RUFDcEI7RUFDQSxPQUFPd1QsOERBQU0sQ0FBQ25lLE1BQU0sRUFBRTJmLCtEQUFPLENBQUMzZixNQUFNLEVBQUUsRUFBRSxFQUFFMkssRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBQ0YsK0RBQWV1VSxNQUFNOzs7Ozs7Ozs7Ozs7O0FDckR1Qjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlVLFNBQVMsR0FBRyxhQUFheEQsK0RBQU8sQ0FBQyxTQUFTd0QsU0FBU0EsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDNUQsT0FBT0EsQ0FBQyxJQUFJLElBQUksSUFBSUEsQ0FBQyxLQUFLQSxDQUFDLEdBQUdELENBQUMsR0FBR0MsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFDRiwrREFBZUYsU0FBUzs7Ozs7Ozs7Ozs7Ozs7QUM1Qm9CO0FBQ047O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJMWEsVUFBVSxHQUFHLGFBQWFrWCwrREFBTyxDQUFDLFNBQVNsWCxVQUFVQSxDQUFDOGEsS0FBSyxFQUFFQyxNQUFNLEVBQUU7RUFDdkUsSUFBSUMsR0FBRyxHQUFHLEVBQUU7RUFDWixJQUFJekQsR0FBRyxHQUFHLENBQUM7RUFDWCxJQUFJMEQsUUFBUSxHQUFHSCxLQUFLLENBQUNoZ0IsTUFBTTtFQUMzQixJQUFJb2dCLFNBQVMsR0FBR0gsTUFBTSxDQUFDamdCLE1BQU07RUFDN0IsSUFBSXFnQixXQUFXLEdBQUcsSUFBSU4sd0RBQUksQ0FBQyxDQUFDO0VBQzVCLEtBQUssSUFBSWxmLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VmLFNBQVMsRUFBRXZmLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDckN3ZixXQUFXLENBQUNuYyxHQUFHLENBQUMrYixNQUFNLENBQUNwZixDQUFDLENBQUMsQ0FBQztFQUM1QjtFQUNBLE9BQU80YixHQUFHLEdBQUcwRCxRQUFRLEVBQUU7SUFDckIsSUFBSUUsV0FBVyxDQUFDbmMsR0FBRyxDQUFDOGIsS0FBSyxDQUFDdkQsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUMvQnlELEdBQUcsQ0FBQ0EsR0FBRyxDQUFDbGdCLE1BQU0sQ0FBQyxHQUFHZ2dCLEtBQUssQ0FBQ3ZELEdBQUcsQ0FBQztJQUM5QjtJQUNBQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBT3lELEdBQUc7QUFDWixDQUFDLENBQUM7QUFDRiwrREFBZWhiLFVBQVU7Ozs7Ozs7Ozs7Ozs7O0FDeENtQjtBQUNIOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlxYixNQUFNLEdBQUcsYUFBYW5FLCtEQUFPLENBQUMsU0FBU21FLE1BQU1BLENBQUM1QyxJQUFJLEVBQUVDLEdBQUcsRUFBRTtFQUMzRCxPQUFPMEMsMERBQVUsQ0FBQyxDQUFDM0MsSUFBSSxDQUFDLEVBQUVDLEdBQUcsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFDRiwrREFBZTJDLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJ1QjtBQUNBO0FBQ007QUFDSjtBQUNmOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNFLG1CQUFtQkEsQ0FBQzlDLElBQUksRUFBRUMsR0FBRyxFQUFFO0VBQ3RDLElBQUlFLGtFQUFVLENBQUNILElBQUksQ0FBQyxJQUFJaUIsZ0VBQVEsQ0FBQ2hCLEdBQUcsQ0FBQyxFQUFFO0lBQ3JDLE9BQU8sRUFBRSxDQUFDb0IsTUFBTSxDQUFDcEIsR0FBRyxDQUFDO0VBQ3ZCO0VBQ0EsSUFBSXZLLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDZixLQUFLLElBQUlxTixDQUFDLElBQUk5QyxHQUFHLEVBQUU7SUFDakJ2SyxNQUFNLENBQUNxTixDQUFDLENBQUMsR0FBRzlDLEdBQUcsQ0FBQzhDLENBQUMsQ0FBQztFQUNwQjtFQUNBLE9BQU9yTixNQUFNO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJaU4sVUFBVSxHQUFHLGFBQWFsRSwrREFBTyxDQUFDLFNBQVNrRSxVQUFVQSxDQUFDNUksSUFBSSxFQUFFa0csR0FBRyxFQUFFO0VBQ25FLElBQUlBLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDZixPQUFPQSxHQUFHO0VBQ1o7RUFDQSxRQUFRbEcsSUFBSSxDQUFDMVgsTUFBTTtJQUNqQixLQUFLLENBQUM7TUFDSixPQUFPNGQsR0FBRztJQUNaLEtBQUssQ0FBQztNQUNKLE9BQU80QywrREFBTyxDQUFDOUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFa0csR0FBRyxDQUFDO0lBQzlCO01BQ0UsSUFBSStDLElBQUksR0FBR2pKLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDbEIsSUFBSWtKLElBQUksR0FBRzFnQixLQUFLLENBQUNvUixTQUFTLENBQUM0TSxLQUFLLENBQUNyTyxJQUFJLENBQUM2SCxJQUFJLEVBQUUsQ0FBQyxDQUFDO01BQzlDLElBQUlrRyxHQUFHLENBQUMrQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDckIsT0FBT0YsbUJBQW1CLENBQUNFLElBQUksRUFBRS9DLEdBQUcsQ0FBQztNQUN2QyxDQUFDLE1BQU07UUFDTCxPQUFPRixxREFBSyxDQUFDaUQsSUFBSSxFQUFFTCxVQUFVLENBQUNNLElBQUksRUFBRWhELEdBQUcsQ0FBQytDLElBQUksQ0FBQyxDQUFDLEVBQUUvQyxHQUFHLENBQUM7TUFDdEQ7RUFDSjtBQUNGLENBQUMsQ0FBQztBQUNGLCtEQUFlMEMsVUFBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakVtQjtBQUNVO0FBQ1I7QUFDRTtBQUNBO0FBQ1E7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSVUsS0FBSyxHQUFHLGFBQWF0RSwrREFBTyxDQUFDLFNBQVNzRSxLQUFLQSxDQUFDdlosQ0FBQyxFQUFFO0VBQ2pELE9BQU9BLENBQUMsSUFBSSxJQUFJLElBQUksT0FBT0EsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssVUFBVSxHQUFHQSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUdBLENBQUMsSUFBSSxJQUFJLElBQUlBLENBQUMsQ0FBQ3daLFdBQVcsSUFBSSxJQUFJLElBQUksT0FBT3haLENBQUMsQ0FBQ3daLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLFVBQVUsR0FBR3haLENBQUMsQ0FBQ3daLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBR3haLENBQUMsSUFBSSxJQUFJLElBQUksT0FBT0EsQ0FBQyxDQUFDdVosS0FBSyxLQUFLLFVBQVUsR0FBR3ZaLENBQUMsQ0FBQ3VaLEtBQUssQ0FBQyxDQUFDLEdBQUd2WixDQUFDLElBQUksSUFBSSxJQUFJQSxDQUFDLENBQUN3WixXQUFXLElBQUksSUFBSSxJQUFJLE9BQU94WixDQUFDLENBQUN3WixXQUFXLENBQUNELEtBQUssS0FBSyxVQUFVLEdBQUd2WixDQUFDLENBQUN3WixXQUFXLENBQUNELEtBQUssQ0FBQyxDQUFDLEdBQUdwQyxnRUFBUSxDQUFDblgsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHcVgsaUVBQVMsQ0FBQ3JYLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBR3FaLGlFQUFTLENBQUNyWixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR29aLG9FQUFZLENBQUNwWixDQUFDLENBQUMsR0FBRyxZQUFZO0lBQ3BlLE9BQU8xSCxTQUFTO0VBQ2xCLENBQUMsQ0FBQyxDQUFDLEdBQUdnaEIscUVBQWEsQ0FBQ3RaLENBQUMsQ0FBQyxHQUFHQSxDQUFDLENBQUN3WixXQUFXLENBQUNDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztFQUFBO0FBRTNELENBQUMsQ0FBQztBQUVGLCtEQUFlRixLQUFLOzs7Ozs7Ozs7Ozs7OztBQ3ZDd0I7QUFDQTs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJSSxNQUFNLEdBQUcsYUFBYWhGLCtEQUFPLENBQUMsU0FBU2dGLE1BQU1BLENBQUMxQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN0RCxPQUFPd0MsK0RBQU8sQ0FBQ3pDLENBQUMsRUFBRUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWV5QyxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7O0FDL0J1QjtBQUNFO0FBQ0U7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlDLE1BQU0sR0FBRyxhQUFhakYsK0RBQU8sQ0FBQyxTQUFTaUYsTUFBTUEsQ0FBQ0MsZUFBZSxFQUFFQyxNQUFNLEVBQUU7RUFDekUsSUFBSSxDQUFDVCxpRUFBUyxDQUFDUyxNQUFNLENBQUMsSUFBSSxDQUFDM0MsZ0VBQVEsQ0FBQzJDLE1BQU0sQ0FBQyxFQUFFO0lBQzNDLE9BQU9BLE1BQU07RUFDZjtFQUNBLElBQUlsTyxNQUFNLEdBQUdrTyxNQUFNLFlBQVlyaEIsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUMsSUFBSXNoQixjQUFjLEVBQUU5YSxHQUFHLEVBQUUrYSxJQUFJO0VBQzdCLEtBQUsvYSxHQUFHLElBQUk2YSxNQUFNLEVBQUU7SUFDbEJDLGNBQWMsR0FBR0YsZUFBZSxDQUFDNWEsR0FBRyxDQUFDO0lBQ3JDK2EsSUFBSSxHQUFBdmlCLE9BQUEsQ0FBVXNpQixjQUFjO0lBQzVCbk8sTUFBTSxDQUFDM00sR0FBRyxDQUFDLEdBQUcrYSxJQUFJLEtBQUssVUFBVSxHQUFHRCxjQUFjLENBQUNELE1BQU0sQ0FBQzdhLEdBQUcsQ0FBQyxDQUFDLEdBQUc4YSxjQUFjLElBQUlDLElBQUksS0FBSyxRQUFRLEdBQUdKLE1BQU0sQ0FBQ0csY0FBYyxFQUFFRCxNQUFNLENBQUM3YSxHQUFHLENBQUMsQ0FBQyxHQUFHNmEsTUFBTSxDQUFDN2EsR0FBRyxDQUFDO0VBQzNKO0VBQ0EsT0FBTzJNLE1BQU07QUFDZixDQUFDLENBQUM7QUFDRiwrREFBZWdPLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1Q2lDO0FBQ1Y7QUFDWTtBQUNaO0FBQ0k7QUFDRjtBQUNqQjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJL2UsTUFBTSxHQUFHLGFBQWE4WiwrREFBTyxDQUFFLGFBQWFDLHFFQUFhLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsRUFBRXVGLDREQUFRLEVBQUUsVUFBVW5ELElBQUksRUFBRW9ELFVBQVUsRUFBRTtFQUNySSxPQUFPZixpRUFBUyxDQUFDZSxVQUFVLENBQUMsR0FBR0gsb0VBQVksQ0FBQyxVQUFVdEUsR0FBRyxFQUFFMVcsR0FBRyxFQUFFO0lBQzlELElBQUkrWCxJQUFJLENBQUNvRCxVQUFVLENBQUNuYixHQUFHLENBQUMsQ0FBQyxFQUFFO01BQ3pCMFcsR0FBRyxDQUFDMVcsR0FBRyxDQUFDLEdBQUdtYixVQUFVLENBQUNuYixHQUFHLENBQUM7SUFDNUI7SUFDQSxPQUFPMFcsR0FBRztFQUNaLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTljLG9EQUFJLENBQUN1aEIsVUFBVSxDQUFDLENBQUM7RUFDeEI7RUFDQUYsK0RBQU8sQ0FBQ2xELElBQUksRUFBRW9ELFVBQVUsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUNILCtEQUFldmYsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O0FDOUN1QjtBQUNZO0FBQ2Q7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUl5ZixJQUFJLEdBQUcsYUFBYTNGLCtEQUFPLENBQUUsYUFBYUMscUVBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFeUYsMERBQU0sRUFBRSxTQUFTQyxJQUFJQSxDQUFDcFgsRUFBRSxFQUFFNlIsSUFBSSxFQUFFO0VBQ3BHLElBQUlDLEdBQUcsR0FBRyxDQUFDO0VBQ1gsSUFBSXVGLEdBQUcsR0FBR3hGLElBQUksQ0FBQ3hjLE1BQU07RUFDckIsT0FBT3ljLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQixJQUFJclgsRUFBRSxDQUFDNlIsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFO01BQ2pCLE9BQU9ELElBQUksQ0FBQ0MsR0FBRyxDQUFDO0lBQ2xCO0lBQ0FBLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7QUFDRixDQUFDLENBQUMsQ0FBQztBQUNILCtEQUFlc0YsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0FDdEN5QjtBQUNZO0FBQ0o7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUcsU0FBUyxHQUFHLGFBQWE5RiwrREFBTyxDQUFFLGFBQWFDLHFFQUFhLENBQUMsRUFBRSxFQUFFNEYsK0RBQVcsRUFBRSxTQUFTQyxTQUFTQSxDQUFDdlgsRUFBRSxFQUFFNlIsSUFBSSxFQUFFO0VBQzdHLElBQUlDLEdBQUcsR0FBRyxDQUFDO0VBQ1gsSUFBSXVGLEdBQUcsR0FBR3hGLElBQUksQ0FBQ3hjLE1BQU07RUFDckIsT0FBT3ljLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQixJQUFJclgsRUFBRSxDQUFDNlIsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFO01BQ2pCLE9BQU9BLEdBQUc7SUFDWjtJQUNBQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQztBQUNILCtEQUFleUYsU0FBUzs7Ozs7Ozs7Ozs7Ozs7QUNyQ29CO0FBQ0k7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxPQUFPLEdBQUcsYUFBYTFGLCtEQUFPLENBQUUsYUFBYXlGLGlFQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsK0RBQWVDLE9BQU87Ozs7Ozs7Ozs7Ozs7O0FDckJzQztBQUNoQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJaGlCLE9BQU8sR0FBRyxhQUFhZ2MsK0RBQU8sQ0FBRSxhQUFhaUcsdUVBQWUsQ0FBQyxTQUFTLEVBQUUsU0FBU2ppQixPQUFPQSxDQUFDdUssRUFBRSxFQUFFNlIsSUFBSSxFQUFFO0VBQ3JHLElBQUl3RixHQUFHLEdBQUd4RixJQUFJLENBQUN4YyxNQUFNO0VBQ3JCLElBQUl5YyxHQUFHLEdBQUcsQ0FBQztFQUNYLE9BQU9BLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQnJYLEVBQUUsQ0FBQzZSLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUM7SUFDYkEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU9ELElBQUk7QUFDYixDQUFDLENBQUMsQ0FBQztBQUNILCtEQUFlcGMsT0FBTzs7Ozs7Ozs7Ozs7Ozs7QUM5Q3NCO0FBQ2Y7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSWtpQixpQkFBaUIsR0FBRyxhQUFhbEcsK0RBQU8sQ0FBQyxTQUFTa0csaUJBQWlCQSxDQUFDM1gsRUFBRSxFQUFFaVQsR0FBRyxFQUFFO0VBQy9FLElBQUkyRSxPQUFPLEdBQUdqaUIsb0RBQUksQ0FBQ3NkLEdBQUcsQ0FBQztFQUN2QixJQUFJbkIsR0FBRyxHQUFHLENBQUM7RUFDWCxPQUFPQSxHQUFHLEdBQUc4RixPQUFPLENBQUN2aUIsTUFBTSxFQUFFO0lBQzNCLElBQUkwRyxHQUFHLEdBQUc2YixPQUFPLENBQUM5RixHQUFHLENBQUM7SUFDdEI5UixFQUFFLENBQUNpVCxHQUFHLENBQUNsWCxHQUFHLENBQUMsRUFBRUEsR0FBRyxFQUFFa1gsR0FBRyxDQUFDO0lBQ3RCbkIsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU9tQixHQUFHO0FBQ1osQ0FBQyxDQUFDO0FBQ0YsK0RBQWUwRSxpQkFBaUI7Ozs7Ozs7Ozs7Ozs7OztBQ25DNEI7QUFDaEI7QUFDUDs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlHLE9BQU8sR0FBRyxhQUFhckcsK0RBQU8sQ0FBRSxhQUFhaUcsdUVBQWUsQ0FBQyxTQUFTLEVBQUUsYUFBYUcsd0RBQVEsQ0FBQyxVQUFVcEYsR0FBRyxFQUFFdlYsSUFBSSxFQUFFO0VBQ3JIdVYsR0FBRyxDQUFDM2IsSUFBSSxDQUFDb0csSUFBSSxDQUFDO0VBQ2QsT0FBT3VWLEdBQUc7QUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNSLCtEQUFlcUYsT0FBTzs7Ozs7Ozs7Ozs7Ozs7QUNqRHNCO0FBQ1Q7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk5ZCxHQUFHLEdBQUcsYUFBYXlYLCtEQUFPLENBQUMsU0FBU3pYLEdBQUdBLENBQUNnWixJQUFJLEVBQUVDLEdBQUcsRUFBRTtFQUNyRCxPQUFPOEUsdURBQU8sQ0FBQyxDQUFDL0UsSUFBSSxDQUFDLEVBQUVDLEdBQUcsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFDRiwrREFBZWpaLEdBQUc7Ozs7Ozs7Ozs7Ozs7OztBQzlCMEI7QUFDTjtBQUNQOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJK2QsT0FBTyxHQUFHLGFBQWF0RywrREFBTyxDQUFDLFNBQVNzRyxPQUFPQSxDQUFDQyxLQUFLLEVBQUUvRSxHQUFHLEVBQUU7RUFDOUQsSUFBSStFLEtBQUssQ0FBQzNpQixNQUFNLEtBQUssQ0FBQyxJQUFJZ2UscURBQUssQ0FBQ0osR0FBRyxDQUFDLEVBQUU7SUFDcEMsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJaEIsR0FBRyxHQUFHZ0IsR0FBRztFQUNiLElBQUluQixHQUFHLEdBQUcsQ0FBQztFQUNYLE9BQU9BLEdBQUcsR0FBR2tHLEtBQUssQ0FBQzNpQixNQUFNLEVBQUU7SUFDekIsSUFBSSxDQUFDZ2UscURBQUssQ0FBQ3BCLEdBQUcsQ0FBQyxJQUFJaUIsNERBQUksQ0FBQzhFLEtBQUssQ0FBQ2xHLEdBQUcsQ0FBQyxFQUFFRyxHQUFHLENBQUMsRUFBRTtNQUN4Q0EsR0FBRyxHQUFHQSxHQUFHLENBQUMrRixLQUFLLENBQUNsRyxHQUFHLENBQUMsQ0FBQztNQUNyQkEsR0FBRyxJQUFJLENBQUM7SUFDVixDQUFDLE1BQU07TUFDTCxPQUFPLEtBQUs7SUFDZDtFQUNGO0VBQ0EsT0FBTyxJQUFJO0FBQ2IsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVpRyxPQUFPOzs7Ozs7Ozs7Ozs7OztBQ3pDc0I7QUFDSTs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRyxRQUFRLEdBQUcsYUFBYW5HLCtEQUFPLENBQUNrRyw2REFBUyxDQUFDO0FBQzlDLCtEQUFlQyxRQUFROzs7Ozs7Ozs7Ozs7OztBQ3ZCeUI7QUFDSjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxRQUFRLEdBQUcsYUFBYTNHLCtEQUFPLENBQUMwRyw2REFBUyxDQUFDO0FBQzlDLCtEQUFlQyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7QUMxQnFCO0FBQ0U7QUFDQTs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxPQUFPLEdBQUcsYUFBYTdHLCtEQUFPLENBQUMsU0FBUzZHLE9BQU9BLENBQUNqZSxNQUFNLEVBQUVrZSxFQUFFLEVBQUU7RUFDOUQsT0FBTyxPQUFPQSxFQUFFLENBQUNELE9BQU8sS0FBSyxVQUFVLElBQUksQ0FBQ3JFLGdFQUFRLENBQUNzRSxFQUFFLENBQUMsR0FBR0EsRUFBRSxDQUFDRCxPQUFPLENBQUNqZSxNQUFNLENBQUMsR0FBR2dlLGdFQUFRLENBQUNFLEVBQUUsRUFBRWxlLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDekcsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVpZSxPQUFPOzs7Ozs7Ozs7Ozs7O0FDMUJzQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxNQUFNLEdBQUcsYUFBYTNGLCtEQUFPLENBQUMsU0FBUzJGLE1BQU1BLENBQUMxRyxHQUFHLEVBQUUyRyxHQUFHLEVBQUU1RyxJQUFJLEVBQUU7RUFDaEVDLEdBQUcsR0FBR0EsR0FBRyxHQUFHRCxJQUFJLENBQUN4YyxNQUFNLElBQUl5YyxHQUFHLElBQUksQ0FBQyxHQUFHQSxHQUFHLEdBQUdELElBQUksQ0FBQ3hjLE1BQU07RUFDdkQsSUFBSXFULE1BQU0sR0FBR25ULEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzJNLElBQUksRUFBRSxDQUFDLENBQUM7RUFDaERuSixNQUFNLENBQUNVLE1BQU0sQ0FBQzBJLEdBQUcsRUFBRSxDQUFDLEVBQUUyRyxHQUFHLENBQUM7RUFDMUIsT0FBTy9QLE1BQU07QUFDZixDQUFDLENBQUM7QUFDRiwrREFBZThQLE1BQU07Ozs7Ozs7Ozs7Ozs7O0FDM0JrQjtBQUN2QyxJQUFJcEQsSUFBSSxHQUFHLGFBQWEsWUFBWTtFQUNsQyxTQUFTQSxJQUFJQSxDQUFBLEVBQUc7SUFDZDtJQUNBLElBQUksQ0FBQ3NELFVBQVUsR0FBRyxPQUFPcmdCLEdBQUcsS0FBSyxVQUFVLEdBQUcsSUFBSUEsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJO0lBQzlELElBQUksQ0FBQ3NnQixNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQXZELElBQUksQ0FBQ3pPLFNBQVMsQ0FBQ3BOLEdBQUcsR0FBRyxVQUFVMkQsSUFBSSxFQUFFO0lBQ25DLE9BQU8sQ0FBQzBiLFFBQVEsQ0FBQzFiLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0VBQ3BDLENBQUM7O0VBRUQ7RUFDQTtFQUNBO0VBQ0E7RUFDQWtZLElBQUksQ0FBQ3pPLFNBQVMsQ0FBQzNNLEdBQUcsR0FBRyxVQUFVa0QsSUFBSSxFQUFFO0lBQ25DLE9BQU8wYixRQUFRLENBQUMxYixJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztFQUNwQyxDQUFDOztFQUVEO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT0FBT2tZLElBQUk7QUFDYixDQUFDLENBQUMsQ0FBQztBQUNILFNBQVN3RCxRQUFRQSxDQUFDMWIsSUFBSSxFQUFFMmIsU0FBUyxFQUFFcmUsR0FBRyxFQUFFO0VBQ3RDLElBQUlzYyxJQUFJLEdBQUF2aUIsT0FBQSxDQUFVMkksSUFBSTtFQUN0QixJQUFJNGIsUUFBUSxFQUFFQyxPQUFPO0VBQ3JCLFFBQVFqQyxJQUFJO0lBQ1YsS0FBSyxRQUFRO0lBQ2IsS0FBSyxRQUFRO01BQ1g7TUFDQSxJQUFJNVosSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUdBLElBQUksS0FBSyxDQUFDOGIsUUFBUSxFQUFFO1FBQ3hDLElBQUl4ZSxHQUFHLENBQUNtZSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDcEIsT0FBTyxJQUFJO1FBQ2IsQ0FBQyxNQUFNO1VBQ0wsSUFBSUUsU0FBUyxFQUFFO1lBQ2JyZSxHQUFHLENBQUNtZSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSTtVQUN6QjtVQUNBLE9BQU8sS0FBSztRQUNkO01BQ0Y7TUFDQTtNQUNBLElBQUluZSxHQUFHLENBQUNrZSxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQzNCLElBQUlHLFNBQVMsRUFBRTtVQUNiQyxRQUFRLEdBQUd0ZSxHQUFHLENBQUNrZSxVQUFVLENBQUNqZSxJQUFJO1VBQzlCRCxHQUFHLENBQUNrZSxVQUFVLENBQUNuZixHQUFHLENBQUMyRCxJQUFJLENBQUM7VUFDeEI2YixPQUFPLEdBQUd2ZSxHQUFHLENBQUNrZSxVQUFVLENBQUNqZSxJQUFJO1VBQzdCLE9BQU9zZSxPQUFPLEtBQUtELFFBQVE7UUFDN0IsQ0FBQyxNQUFNO1VBQ0wsT0FBT3RlLEdBQUcsQ0FBQ2tlLFVBQVUsQ0FBQzFlLEdBQUcsQ0FBQ2tELElBQUksQ0FBQztRQUNqQztNQUNGLENBQUMsTUFBTTtRQUNMLElBQUksRUFBRTRaLElBQUksSUFBSXRjLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQyxFQUFFO1VBQ3pCLElBQUlFLFNBQVMsRUFBRTtZQUNicmUsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCdGMsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLENBQUM1WixJQUFJLENBQUMsR0FBRyxJQUFJO1VBQy9CO1VBQ0EsT0FBTyxLQUFLO1FBQ2QsQ0FBQyxNQUFNLElBQUlBLElBQUksSUFBSTFDLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxFQUFFO1VBQ25DLE9BQU8sSUFBSTtRQUNiLENBQUMsTUFBTTtVQUNMLElBQUkrQixTQUFTLEVBQUU7WUFDYnJlLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxDQUFDNVosSUFBSSxDQUFDLEdBQUcsSUFBSTtVQUMvQjtVQUNBLE9BQU8sS0FBSztRQUNkO01BQ0Y7SUFDRixLQUFLLFNBQVM7TUFDWjtNQUNBO01BQ0EsSUFBSTRaLElBQUksSUFBSXRjLEdBQUcsQ0FBQ21lLE1BQU0sRUFBRTtRQUN0QixJQUFJTSxJQUFJLEdBQUcvYixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSTFDLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxDQUFDbUMsSUFBSSxDQUFDLEVBQUU7VUFDMUIsT0FBTyxJQUFJO1FBQ2IsQ0FBQyxNQUFNO1VBQ0wsSUFBSUosU0FBUyxFQUFFO1lBQ2JyZSxHQUFHLENBQUNtZSxNQUFNLENBQUM3QixJQUFJLENBQUMsQ0FBQ21DLElBQUksQ0FBQyxHQUFHLElBQUk7VUFDL0I7VUFDQSxPQUFPLEtBQUs7UUFDZDtNQUNGLENBQUMsTUFBTTtRQUNMLElBQUlKLFNBQVMsRUFBRTtVQUNicmUsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLEdBQUc1WixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1FBQ3pEO1FBQ0EsT0FBTyxLQUFLO01BQ2Q7SUFDRixLQUFLLFVBQVU7TUFDYjtNQUNBLElBQUkxQyxHQUFHLENBQUNrZSxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQzNCLElBQUlHLFNBQVMsRUFBRTtVQUNiQyxRQUFRLEdBQUd0ZSxHQUFHLENBQUNrZSxVQUFVLENBQUNqZSxJQUFJO1VBQzlCRCxHQUFHLENBQUNrZSxVQUFVLENBQUNuZixHQUFHLENBQUMyRCxJQUFJLENBQUM7VUFDeEI2YixPQUFPLEdBQUd2ZSxHQUFHLENBQUNrZSxVQUFVLENBQUNqZSxJQUFJO1VBQzdCLE9BQU9zZSxPQUFPLEtBQUtELFFBQVE7UUFDN0IsQ0FBQyxNQUFNO1VBQ0wsT0FBT3RlLEdBQUcsQ0FBQ2tlLFVBQVUsQ0FBQzFlLEdBQUcsQ0FBQ2tELElBQUksQ0FBQztRQUNqQztNQUNGLENBQUMsTUFBTTtRQUNMLElBQUksRUFBRTRaLElBQUksSUFBSXRjLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQyxFQUFFO1VBQ3pCLElBQUlFLFNBQVMsRUFBRTtZQUNicmUsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQzVaLElBQUksQ0FBQztVQUMzQjtVQUNBLE9BQU8sS0FBSztRQUNkO1FBQ0EsSUFBSSxDQUFDaWIsd0RBQVMsQ0FBQ2piLElBQUksRUFBRTFDLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUU7VUFDdEMsSUFBSStCLFNBQVMsRUFBRTtZQUNicmUsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLENBQUNoZ0IsSUFBSSxDQUFDb0csSUFBSSxDQUFDO1VBQzdCO1VBQ0EsT0FBTyxLQUFLO1FBQ2Q7UUFDQSxPQUFPLElBQUk7TUFDYjtJQUNGLEtBQUssV0FBVztNQUNkLElBQUkxQyxHQUFHLENBQUNtZSxNQUFNLENBQUM3QixJQUFJLENBQUMsRUFBRTtRQUNwQixPQUFPLElBQUk7TUFDYixDQUFDLE1BQU07UUFDTCxJQUFJK0IsU0FBUyxFQUFFO1VBQ2JyZSxHQUFHLENBQUNtZSxNQUFNLENBQUM3QixJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3pCO1FBQ0EsT0FBTyxLQUFLO01BQ2Q7SUFDRixLQUFLLFFBQVE7TUFDWCxJQUFJNVosSUFBSSxLQUFLLElBQUksRUFBRTtRQUNqQixJQUFJLENBQUMxQyxHQUFHLENBQUNtZSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7VUFDdkIsSUFBSUUsU0FBUyxFQUFFO1lBQ2JyZSxHQUFHLENBQUNtZSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSTtVQUMzQjtVQUNBLE9BQU8sS0FBSztRQUNkO1FBQ0EsT0FBTyxJQUFJO01BQ2I7SUFDRjtJQUNBO01BQ0U7TUFDQTtNQUNBN0IsSUFBSSxHQUFHL2hCLE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQ3lOLFFBQVEsQ0FBQ2xQLElBQUksQ0FBQ2hJLElBQUksQ0FBQztNQUMzQyxJQUFJLEVBQUU0WixJQUFJLElBQUl0YyxHQUFHLENBQUNtZSxNQUFNLENBQUMsRUFBRTtRQUN6QixJQUFJRSxTQUFTLEVBQUU7VUFDYnJlLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUM1WixJQUFJLENBQUM7UUFDM0I7UUFDQSxPQUFPLEtBQUs7TUFDZDtNQUNBO01BQ0EsSUFBSSxDQUFDaWIsd0RBQVMsQ0FBQ2piLElBQUksRUFBRTFDLEdBQUcsQ0FBQ21lLE1BQU0sQ0FBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDdEMsSUFBSStCLFNBQVMsRUFBRTtVQUNicmUsR0FBRyxDQUFDbWUsTUFBTSxDQUFDN0IsSUFBSSxDQUFDLENBQUNoZ0IsSUFBSSxDQUFDb0csSUFBSSxDQUFDO1FBQzdCO1FBQ0EsT0FBTyxLQUFLO01BQ2Q7TUFDQSxPQUFPLElBQUk7RUFDZjtBQUNGOztBQUVBO0FBQ0EsK0RBQWVrWSxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7QUNyS0osU0FBUzVCLE1BQU1BLENBQUMwRixDQUFDLEVBQUVsWixFQUFFLEVBQUU7RUFDcEM7RUFDQSxRQUFRa1osQ0FBQztJQUNQLEtBQUssQ0FBQztNQUNKLE9BQU8sWUFBWTtRQUNqQixPQUFPbFosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRTtRQUNuQixPQUFPblosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFO1FBQ3ZCLE9BQU9wWixFQUFFLENBQUMwVCxLQUFLLENBQUMsSUFBSSxFQUFFdGUsU0FBUyxDQUFDO01BQ2xDLENBQUM7SUFDSCxLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUrakIsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUMzQixPQUFPclosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUMvQixPQUFPdFosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFO1FBQ25DLE9BQU92WixFQUFFLENBQUMwVCxLQUFLLENBQUMsSUFBSSxFQUFFdGUsU0FBUyxDQUFDO01BQ2xDLENBQUM7SUFDSCxLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUrakIsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUN2QyxPQUFPeFosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUMzQyxPQUFPelosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxDQUFDO01BQ0osT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFO1FBQy9DLE9BQU8xWixFQUFFLENBQUMwVCxLQUFLLENBQUMsSUFBSSxFQUFFdGUsU0FBUyxDQUFDO01BQ2xDLENBQUM7SUFDSCxLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUrakIsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUNuRCxPQUFPM1osRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0gsS0FBSyxFQUFFO01BQ0wsT0FBTyxVQUFVK2pCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTtRQUN2RCxPQUFPNVosRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztNQUNsQyxDQUFDO0lBQ0g7TUFDRSxNQUFNLElBQUl5a0IsS0FBSyxDQUFDLDZFQUE2RSxDQUFDO0VBQ2xHO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7OztBQ2xEZSxTQUFTQyxrQkFBa0JBLENBQUNDLElBQUksRUFBRTtFQUMvQyxJQUFJbEksSUFBSSxHQUFHLEVBQUU7RUFDYixJQUFJamIsSUFBSTtFQUNSLE9BQU8sQ0FBQyxDQUFDQSxJQUFJLEdBQUdtakIsSUFBSSxDQUFDbmpCLElBQUksQ0FBQyxDQUFDLEVBQUVDLElBQUksRUFBRTtJQUNqQ2diLElBQUksQ0FBQy9hLElBQUksQ0FBQ0YsSUFBSSxDQUFDRyxLQUFLLENBQUM7RUFDdkI7RUFDQSxPQUFPOGEsSUFBSTtBQUNiOzs7Ozs7Ozs7Ozs7Ozs7QUNQZSxTQUFTa0YsWUFBWUEsQ0FBQ2lELE9BQU8sRUFBRXZILEdBQUcsRUFBRVosSUFBSSxFQUFFO0VBQ3ZELElBQUkzSSxLQUFLLEdBQUcsQ0FBQztFQUNiLElBQUk3VCxNQUFNLEdBQUd3YyxJQUFJLENBQUN4YyxNQUFNO0VBQ3hCLE9BQU82VCxLQUFLLEdBQUc3VCxNQUFNLEVBQUU7SUFDckJvZCxHQUFHLEdBQUd1SCxPQUFPLENBQUN2SCxHQUFHLEVBQUVaLElBQUksQ0FBQzNJLEtBQUssQ0FBQyxDQUFDO0lBQy9CQSxLQUFLLElBQUksQ0FBQztFQUNaO0VBQ0EsT0FBT3VKLEdBQUc7QUFDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNScUM7QUFDSTs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU1csTUFBTUEsQ0FBQ0osSUFBSSxFQUFFZixHQUFHLEVBQUVnQixHQUFHLEVBQUU7RUFDN0MsSUFBSUUseURBQVUsQ0FBQ0gsSUFBSSxDQUFDLElBQUlpQix1REFBUSxDQUFDaEIsR0FBRyxDQUFDLEVBQUU7SUFDckMsSUFBSWhkLEdBQUcsR0FBRyxFQUFFLENBQUNvZSxNQUFNLENBQUNwQixHQUFHLENBQUM7SUFDeEJoZCxHQUFHLENBQUMrYyxJQUFJLENBQUMsR0FBR2YsR0FBRztJQUNmLE9BQU9oYyxHQUFHO0VBQ1o7RUFDQSxJQUFJeVMsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNmLEtBQUssSUFBSXFOLENBQUMsSUFBSTlDLEdBQUcsRUFBRTtJQUNqQnZLLE1BQU0sQ0FBQ3FOLENBQUMsQ0FBQyxHQUFHOUMsR0FBRyxDQUFDOEMsQ0FBQyxDQUFDO0VBQ3BCO0VBQ0FyTixNQUFNLENBQUNzSyxJQUFJLENBQUMsR0FBR2YsR0FBRztFQUNsQixPQUFPdkosTUFBTTtBQUNmOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0JxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTZ1AsZUFBZUEsQ0FBQ3VDLFVBQVUsRUFBRWphLEVBQUUsRUFBRTtFQUN0RCxPQUFPLFlBQVk7SUFDakIsSUFBSTNLLE1BQU0sR0FBR0QsU0FBUyxDQUFDQyxNQUFNO0lBQzdCLElBQUlBLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDaEIsT0FBTzJLLEVBQUUsQ0FBQyxDQUFDO0lBQ2I7SUFDQSxJQUFJaVQsR0FBRyxHQUFHN2QsU0FBUyxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE9BQU80ZSx1REFBUSxDQUFDaEIsR0FBRyxDQUFDLElBQUksT0FBT0EsR0FBRyxDQUFDZ0gsVUFBVSxDQUFDLEtBQUssVUFBVSxHQUFHamEsRUFBRSxDQUFDMFQsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQyxHQUFHNmQsR0FBRyxDQUFDZ0gsVUFBVSxDQUFDLENBQUN2RyxLQUFLLENBQUNULEdBQUcsRUFBRTFkLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzlQLFNBQVMsRUFBRSxDQUFDLEVBQUVDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5SyxDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCNkM7QUFDZjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVNzZSxNQUFNQSxDQUFDNWMsS0FBSyxFQUFFb2pCLElBQUksRUFBRWxkLEdBQUcsRUFBRTtFQUMvQ0EsR0FBRyxLQUFLQSxHQUFHLEdBQUcsSUFBSW1kLFVBQVUsQ0FBQyxDQUFDLENBQUM7O0VBRS9CO0VBQ0EsSUFBSUMsWUFBWSxDQUFDdGpCLEtBQUssQ0FBQyxFQUFFO0lBQ3ZCLE9BQU9BLEtBQUs7RUFDZDtFQUNBLElBQUl1akIsSUFBSSxHQUFHLFNBQVNBLElBQUlBLENBQUNDLFdBQVcsRUFBRTtJQUNwQztJQUNBLElBQUlDLFVBQVUsR0FBR3ZkLEdBQUcsQ0FBQ3dCLEdBQUcsQ0FBQzFILEtBQUssQ0FBQztJQUMvQixJQUFJeWpCLFVBQVUsRUFBRTtNQUNkLE9BQU9BLFVBQVU7SUFDbkI7SUFDQXZkLEdBQUcsQ0FBQ3pDLEdBQUcsQ0FBQ3pELEtBQUssRUFBRXdqQixXQUFXLENBQUM7SUFDM0IsS0FBSyxJQUFJeGUsR0FBRyxJQUFJaEYsS0FBSyxFQUFFO01BQ3JCLElBQUloQyxNQUFNLENBQUM0UixTQUFTLENBQUM4VCxjQUFjLENBQUN2VixJQUFJLENBQUNuTyxLQUFLLEVBQUVnRixHQUFHLENBQUMsRUFBRTtRQUNwRHdlLFdBQVcsQ0FBQ3hlLEdBQUcsQ0FBQyxHQUFHb2UsSUFBSSxHQUFHeEcsTUFBTSxDQUFDNWMsS0FBSyxDQUFDZ0YsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFa0IsR0FBRyxDQUFDLEdBQUdsRyxLQUFLLENBQUNnRixHQUFHLENBQUM7TUFDdEU7SUFDRjtJQUNBLE9BQU93ZSxXQUFXO0VBQ3BCLENBQUM7RUFDRCxRQUFRekQsb0RBQUksQ0FBQy9mLEtBQUssQ0FBQztJQUNqQixLQUFLLFFBQVE7TUFDWCxPQUFPdWpCLElBQUksQ0FBQ3ZsQixNQUFNLENBQUMybEIsTUFBTSxDQUFDM2xCLE1BQU0sQ0FBQzRsQixjQUFjLENBQUM1akIsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMxRCxLQUFLLE9BQU87TUFDVixPQUFPdWpCLElBQUksQ0FBQy9rQixLQUFLLENBQUN3QixLQUFLLENBQUMxQixNQUFNLENBQUMsQ0FBQztJQUNsQyxLQUFLLE1BQU07TUFDVCxPQUFPLElBQUl1bEIsSUFBSSxDQUFDN2pCLEtBQUssQ0FBQzhqQixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEtBQUssUUFBUTtNQUNYLE9BQU9YLDJEQUFZLENBQUNuakIsS0FBSyxDQUFDO0lBQzVCLEtBQUssV0FBVztJQUNoQixLQUFLLFlBQVk7SUFDakIsS0FBSyxtQkFBbUI7SUFDeEIsS0FBSyxZQUFZO0lBQ2pCLEtBQUssYUFBYTtJQUNsQixLQUFLLFlBQVk7SUFDakIsS0FBSyxhQUFhO0lBQ2xCLEtBQUssY0FBYztJQUNuQixLQUFLLGNBQWM7SUFDbkIsS0FBSyxlQUFlO0lBQ3BCLEtBQUssZ0JBQWdCO01BQ25CLE9BQU9BLEtBQUssQ0FBQ3djLEtBQUssQ0FBQyxDQUFDO0lBQ3RCO01BQ0UsT0FBT3hjLEtBQUs7RUFDaEI7QUFDRjtBQUNBLFNBQVNzakIsWUFBWUEsQ0FBQ1MsS0FBSyxFQUFFO0VBQzNCLElBQUloRSxJQUFJLEdBQUF2aUIsT0FBQSxDQUFVdW1CLEtBQUs7RUFDdkIsT0FBT0EsS0FBSyxJQUFJLElBQUksSUFBSWhFLElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxVQUFVO0FBQ2hFO0FBQ0EsSUFBSXNELFVBQVUsR0FBRyxhQUFhLFlBQVk7RUFDeEMsU0FBU0EsVUFBVUEsQ0FBQSxFQUFHO0lBQ3BCLElBQUksQ0FBQ25kLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLENBQUM1SCxNQUFNLEdBQUcsQ0FBQztFQUNqQjtFQUNBK2tCLFVBQVUsQ0FBQ3pULFNBQVMsQ0FBQ25NLEdBQUcsR0FBRyxVQUFVdUIsR0FBRyxFQUFFaEYsS0FBSyxFQUFFO0lBQy9DLElBQUlna0IsU0FBUyxHQUFHLElBQUksQ0FBQ0MsSUFBSSxDQUFDamYsR0FBRyxDQUFDO0lBQzlCLElBQUlrZixNQUFNLEdBQUcsSUFBSSxDQUFDaGUsR0FBRyxDQUFDOGQsU0FBUyxDQUFDO0lBQ2hDLElBQUksQ0FBQ0UsTUFBTSxFQUFFO01BQ1gsSUFBSSxDQUFDaGUsR0FBRyxDQUFDOGQsU0FBUyxDQUFDLEdBQUdFLE1BQU0sR0FBRyxFQUFFO0lBQ25DO0lBQ0FBLE1BQU0sQ0FBQ25rQixJQUFJLENBQUMsQ0FBQ2lGLEdBQUcsRUFBRWhGLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQzFCLE1BQU0sSUFBSSxDQUFDO0VBQ2xCLENBQUM7RUFDRCtrQixVQUFVLENBQUN6VCxTQUFTLENBQUNxVSxJQUFJLEdBQUcsVUFBVWpmLEdBQUcsRUFBRTtJQUN6QyxJQUFJZ2YsU0FBUyxHQUFHLEVBQUU7SUFDbEIsS0FBSyxJQUFJaGtCLEtBQUssSUFBSWdGLEdBQUcsRUFBRTtNQUNyQmdmLFNBQVMsQ0FBQ2prQixJQUFJLENBQUMvQixNQUFNLENBQUM0UixTQUFTLENBQUN5TixRQUFRLENBQUNsUCxJQUFJLENBQUNuSixHQUFHLENBQUNoRixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVEO0lBQ0EsT0FBT2drQixTQUFTLENBQUNHLElBQUksQ0FBQyxDQUFDO0VBQ3pCLENBQUM7RUFDRGQsVUFBVSxDQUFDelQsU0FBUyxDQUFDbEksR0FBRyxHQUFHLFVBQVUxQyxHQUFHLEVBQUU7SUFDeEM7QUFDSjtBQUNBO0FBQ0E7SUFDSSxJQUFJLElBQUksQ0FBQzFHLE1BQU0sSUFBSSxHQUFHLEVBQUU7TUFDdEIsS0FBSyxJQUFJMGdCLENBQUMsSUFBSSxJQUFJLENBQUM5WSxHQUFHLEVBQUU7UUFDdEIsSUFBSWdlLE1BQU0sR0FBRyxJQUFJLENBQUNoZSxHQUFHLENBQUM4WSxDQUFDLENBQUM7UUFDeEIsS0FBSyxJQUFJN2YsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHK2tCLE1BQU0sQ0FBQzVsQixNQUFNLEVBQUVhLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDekMsSUFBSWlsQixPQUFPLEdBQUdGLE1BQU0sQ0FBQy9rQixDQUFDLENBQUM7VUFDdkIsSUFBSWlsQixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUtwZixHQUFHLEVBQUU7WUFDdEIsT0FBT29mLE9BQU8sQ0FBQyxDQUFDLENBQUM7VUFDbkI7UUFDRjtNQUNGO01BQ0E7SUFDRjtJQUNBLElBQUlKLFNBQVMsR0FBRyxJQUFJLENBQUNDLElBQUksQ0FBQ2pmLEdBQUcsQ0FBQztJQUM5QixJQUFJa2YsTUFBTSxHQUFHLElBQUksQ0FBQ2hlLEdBQUcsQ0FBQzhkLFNBQVMsQ0FBQztJQUNoQyxJQUFJLENBQUNFLE1BQU0sRUFBRTtNQUNYO0lBQ0Y7SUFDQSxLQUFLLElBQUkva0IsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHK2tCLE1BQU0sQ0FBQzVsQixNQUFNLEVBQUVhLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDekMsSUFBSWlsQixPQUFPLEdBQUdGLE1BQU0sQ0FBQy9rQixDQUFDLENBQUM7TUFDdkIsSUFBSWlsQixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUtwZixHQUFHLEVBQUU7UUFDdEIsT0FBT29mLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDbkI7SUFDRjtFQUNGLENBQUM7RUFDRCxPQUFPZixVQUFVO0FBQ25CLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNoSFksU0FBU0YsWUFBWUEsQ0FBQ2tCLE9BQU8sRUFBRTtFQUM1QyxPQUFPLElBQUlDLE1BQU0sQ0FBQ0QsT0FBTyxDQUFDaGhCLE1BQU0sRUFBRWdoQixPQUFPLENBQUNFLEtBQUssR0FBR0YsT0FBTyxDQUFDRSxLQUFLLEdBQUcsQ0FBQ0YsT0FBTyxDQUFDRyxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBS0gsT0FBTyxDQUFDSSxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJSixPQUFPLENBQUNLLFNBQVMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUlMLE9BQU8sQ0FBQ00sTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSU4sT0FBTyxDQUFDTyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJUCxPQUFPLENBQUNRLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDOVA7Ozs7Ozs7Ozs7Ozs7OztBQ0ZlLFNBQVNDLFdBQVdBLENBQUNuSixDQUFDLEVBQUU7RUFDckMsT0FBTyxZQUFZO0lBQ2pCLE9BQU8sQ0FBQ0EsQ0FBQyxDQUFDZ0IsS0FBSyxDQUFDLElBQUksRUFBRXRlLFNBQVMsQ0FBQztFQUNsQyxDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTZ2QsT0FBT0EsQ0FBQzBKLElBQUksRUFBRUMsSUFBSSxFQUFFO0VBQzFDRCxJQUFJLEdBQUdBLElBQUksSUFBSSxFQUFFO0VBQ2pCQyxJQUFJLEdBQUdBLElBQUksSUFBSSxFQUFFO0VBQ2pCLElBQUlqSyxHQUFHO0VBQ1AsSUFBSWtLLElBQUksR0FBR0YsSUFBSSxDQUFDem1CLE1BQU07RUFDdEIsSUFBSTRtQixJQUFJLEdBQUdGLElBQUksQ0FBQzFtQixNQUFNO0VBQ3RCLElBQUlxVCxNQUFNLEdBQUcsRUFBRTtFQUNmb0osR0FBRyxHQUFHLENBQUM7RUFDUCxPQUFPQSxHQUFHLEdBQUdrSyxJQUFJLEVBQUU7SUFDakJ0VCxNQUFNLENBQUNBLE1BQU0sQ0FBQ3JULE1BQU0sQ0FBQyxHQUFHeW1CLElBQUksQ0FBQ2hLLEdBQUcsQ0FBQztJQUNqQ0EsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBQSxHQUFHLEdBQUcsQ0FBQztFQUNQLE9BQU9BLEdBQUcsR0FBR21LLElBQUksRUFBRTtJQUNqQnZULE1BQU0sQ0FBQ0EsTUFBTSxDQUFDclQsTUFBTSxDQUFDLEdBQUcwbUIsSUFBSSxDQUFDakssR0FBRyxDQUFDO0lBQ2pDQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBT3BKLE1BQU07QUFDZjs7Ozs7Ozs7Ozs7Ozs7OztBQzdCNkM7QUFDN0MsSUFBSXlULFdBQVcsR0FBRyxPQUFPMWxCLE1BQU0sS0FBSyxXQUFXLEdBQUdBLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHLFlBQVk7QUFDakUsU0FBUzBsQixhQUFhQSxDQUFDQyxXQUFXLEVBQUVDLFlBQVksRUFBRUMsY0FBYyxFQUFFO0VBQy9FLE9BQU8sU0FBU2xLLE9BQU9BLENBQUNtSyxFQUFFLEVBQUUvSixHQUFHLEVBQUVaLElBQUksRUFBRTtJQUNyQyxJQUFJcUssMkRBQVksQ0FBQ3JLLElBQUksQ0FBQyxFQUFFO01BQ3RCLE9BQU93SyxXQUFXLENBQUNHLEVBQUUsRUFBRS9KLEdBQUcsRUFBRVosSUFBSSxDQUFDO0lBQ25DO0lBQ0EsSUFBSUEsSUFBSSxJQUFJLElBQUksRUFBRTtNQUNoQixPQUFPWSxHQUFHO0lBQ1o7SUFDQSxJQUFJLE9BQU9aLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFVBQVUsRUFBRTtNQUNyRCxPQUFPeUssWUFBWSxDQUFDRSxFQUFFLEVBQUUvSixHQUFHLEVBQUVaLElBQUksRUFBRSxxQkFBcUIsQ0FBQztJQUMzRDtJQUNBLElBQUlBLElBQUksQ0FBQ3NLLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRTtNQUM3QixPQUFPSSxjQUFjLENBQUNDLEVBQUUsRUFBRS9KLEdBQUcsRUFBRVosSUFBSSxDQUFDc0ssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JEO0lBQ0EsSUFBSSxPQUFPdEssSUFBSSxDQUFDamIsSUFBSSxLQUFLLFVBQVUsRUFBRTtNQUNuQyxPQUFPMmxCLGNBQWMsQ0FBQ0MsRUFBRSxFQUFFL0osR0FBRyxFQUFFWixJQUFJLENBQUM7SUFDdEM7SUFDQSxJQUFJLE9BQU9BLElBQUksQ0FBQzZDLE1BQU0sS0FBSyxVQUFVLEVBQUU7TUFDckMsT0FBTzRILFlBQVksQ0FBQ0UsRUFBRSxFQUFFL0osR0FBRyxFQUFFWixJQUFJLEVBQUUsUUFBUSxDQUFDO0lBQzlDO0lBQ0EsTUFBTSxJQUFJM2EsU0FBUyxDQUFDLHdDQUF3QyxDQUFDO0VBQy9ELENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCaUQ7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTNmEsT0FBT0EsQ0FBQy9SLEVBQUUsRUFBRTtFQUNsQyxPQUFPLFNBQVMwYyxFQUFFQSxDQUFDM0ksQ0FBQyxFQUFFO0lBQ3BCLElBQUkzZSxTQUFTLENBQUNDLE1BQU0sS0FBSyxDQUFDLElBQUlvbkIsNkRBQWMsQ0FBQzFJLENBQUMsQ0FBQyxFQUFFO01BQy9DLE9BQU8ySSxFQUFFO0lBQ1gsQ0FBQyxNQUFNO01BQ0wsT0FBTzFjLEVBQUUsQ0FBQzBULEtBQUssQ0FBQyxJQUFJLEVBQUV0ZSxTQUFTLENBQUM7SUFDbEM7RUFDRixDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJtQztBQUNjOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU3FjLE9BQU9BLENBQUN6UixFQUFFLEVBQUU7RUFDbEMsT0FBTyxTQUFTMmMsRUFBRUEsQ0FBQzVJLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0lBQ3ZCLFFBQVE1ZSxTQUFTLENBQUNDLE1BQU07TUFDdEIsS0FBSyxDQUFDO1FBQ0osT0FBT3NuQixFQUFFO01BQ1gsS0FBSyxDQUFDO1FBQ0osT0FBT0YsNkRBQWMsQ0FBQzFJLENBQUMsQ0FBQyxHQUFHNEksRUFBRSxHQUFHNUssc0RBQU8sQ0FBQyxVQUFVNkssRUFBRSxFQUFFO1VBQ3BELE9BQU81YyxFQUFFLENBQUMrVCxDQUFDLEVBQUU2SSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDO01BQ0o7UUFDRSxPQUFPSCw2REFBYyxDQUFDMUksQ0FBQyxDQUFDLElBQUkwSSw2REFBYyxDQUFDekksQ0FBQyxDQUFDLEdBQUcySSxFQUFFLEdBQUdGLDZEQUFjLENBQUMxSSxDQUFDLENBQUMsR0FBR2hDLHNEQUFPLENBQUMsVUFBVThLLEVBQUUsRUFBRTtVQUM3RixPQUFPN2MsRUFBRSxDQUFDNmMsRUFBRSxFQUFFN0ksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxHQUFHeUksNkRBQWMsQ0FBQ3pJLENBQUMsQ0FBQyxHQUFHakMsc0RBQU8sQ0FBQyxVQUFVNkssRUFBRSxFQUFFO1VBQzdDLE9BQU81YyxFQUFFLENBQUMrVCxDQUFDLEVBQUU2SSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEdBQUc1YyxFQUFFLENBQUMrVCxDQUFDLEVBQUVDLENBQUMsQ0FBQztJQUNqQjtFQUNGLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUJtQztBQUNBO0FBQ2M7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTbkIsT0FBT0EsQ0FBQzdTLEVBQUUsRUFBRTtFQUNsQyxPQUFPLFNBQVM4YyxFQUFFQSxDQUFDL0ksQ0FBQyxFQUFFQyxDQUFDLEVBQUUrSSxDQUFDLEVBQUU7SUFDMUIsUUFBUTNuQixTQUFTLENBQUNDLE1BQU07TUFDdEIsS0FBSyxDQUFDO1FBQ0osT0FBT3luQixFQUFFO01BQ1gsS0FBSyxDQUFDO1FBQ0osT0FBT0wsNkRBQWMsQ0FBQzFJLENBQUMsQ0FBQyxHQUFHK0ksRUFBRSxHQUFHckwsc0RBQU8sQ0FBQyxVQUFVbUwsRUFBRSxFQUFFSSxFQUFFLEVBQUU7VUFDeEQsT0FBT2hkLEVBQUUsQ0FBQytULENBQUMsRUFBRTZJLEVBQUUsRUFBRUksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztNQUNKLEtBQUssQ0FBQztRQUNKLE9BQU9QLDZEQUFjLENBQUMxSSxDQUFDLENBQUMsSUFBSTBJLDZEQUFjLENBQUN6SSxDQUFDLENBQUMsR0FBRzhJLEVBQUUsR0FBR0wsNkRBQWMsQ0FBQzFJLENBQUMsQ0FBQyxHQUFHdEMsc0RBQU8sQ0FBQyxVQUFVb0wsRUFBRSxFQUFFRyxFQUFFLEVBQUU7VUFDakcsT0FBT2hkLEVBQUUsQ0FBQzZjLEVBQUUsRUFBRTdJLENBQUMsRUFBRWdKLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsR0FBR1AsNkRBQWMsQ0FBQ3pJLENBQUMsQ0FBQyxHQUFHdkMsc0RBQU8sQ0FBQyxVQUFVbUwsRUFBRSxFQUFFSSxFQUFFLEVBQUU7VUFDakQsT0FBT2hkLEVBQUUsQ0FBQytULENBQUMsRUFBRTZJLEVBQUUsRUFBRUksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxHQUFHakwsc0RBQU8sQ0FBQyxVQUFVaUwsRUFBRSxFQUFFO1VBQ3pCLE9BQU9oZCxFQUFFLENBQUMrVCxDQUFDLEVBQUVDLENBQUMsRUFBRWdKLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUM7TUFDSjtRQUNFLE9BQU9QLDZEQUFjLENBQUMxSSxDQUFDLENBQUMsSUFBSTBJLDZEQUFjLENBQUN6SSxDQUFDLENBQUMsSUFBSXlJLDZEQUFjLENBQUNNLENBQUMsQ0FBQyxHQUFHRCxFQUFFLEdBQUdMLDZEQUFjLENBQUMxSSxDQUFDLENBQUMsSUFBSTBJLDZEQUFjLENBQUN6SSxDQUFDLENBQUMsR0FBR3ZDLHNEQUFPLENBQUMsVUFBVW9MLEVBQUUsRUFBRUQsRUFBRSxFQUFFO1VBQzNJLE9BQU81YyxFQUFFLENBQUM2YyxFQUFFLEVBQUVELEVBQUUsRUFBRUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxHQUFHTiw2REFBYyxDQUFDMUksQ0FBQyxDQUFDLElBQUkwSSw2REFBYyxDQUFDTSxDQUFDLENBQUMsR0FBR3RMLHNEQUFPLENBQUMsVUFBVW9MLEVBQUUsRUFBRUcsRUFBRSxFQUFFO1VBQ3RFLE9BQU9oZCxFQUFFLENBQUM2YyxFQUFFLEVBQUU3SSxDQUFDLEVBQUVnSixFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLEdBQUdQLDZEQUFjLENBQUN6SSxDQUFDLENBQUMsSUFBSXlJLDZEQUFjLENBQUNNLENBQUMsQ0FBQyxHQUFHdEwsc0RBQU8sQ0FBQyxVQUFVbUwsRUFBRSxFQUFFSSxFQUFFLEVBQUU7VUFDdEUsT0FBT2hkLEVBQUUsQ0FBQytULENBQUMsRUFBRTZJLEVBQUUsRUFBRUksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxHQUFHUCw2REFBYyxDQUFDMUksQ0FBQyxDQUFDLEdBQUdoQyxzREFBTyxDQUFDLFVBQVU4SyxFQUFFLEVBQUU7VUFDN0MsT0FBTzdjLEVBQUUsQ0FBQzZjLEVBQUUsRUFBRTdJLENBQUMsRUFBRStJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsR0FBR04sNkRBQWMsQ0FBQ3pJLENBQUMsQ0FBQyxHQUFHakMsc0RBQU8sQ0FBQyxVQUFVNkssRUFBRSxFQUFFO1VBQzdDLE9BQU81YyxFQUFFLENBQUMrVCxDQUFDLEVBQUU2SSxFQUFFLEVBQUVHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsR0FBR04sNkRBQWMsQ0FBQ00sQ0FBQyxDQUFDLEdBQUdoTCxzREFBTyxDQUFDLFVBQVVpTCxFQUFFLEVBQUU7VUFDN0MsT0FBT2hkLEVBQUUsQ0FBQytULENBQUMsRUFBRUMsQ0FBQyxFQUFFZ0osRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxHQUFHaGQsRUFBRSxDQUFDK1QsQ0FBQyxFQUFFQyxDQUFDLEVBQUUrSSxDQUFDLENBQUM7SUFDcEI7RUFDRixDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0NpQztBQUNnQjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTL0gsT0FBT0EsQ0FBQzNmLE1BQU0sRUFBRTRuQixRQUFRLEVBQUVqZCxFQUFFLEVBQUU7RUFDcEQsT0FBTyxZQUFZO0lBQ2pCLElBQUlrZCxRQUFRLEdBQUcsRUFBRTtJQUNqQixJQUFJQyxPQUFPLEdBQUcsQ0FBQztJQUNmLElBQUl0ZixJQUFJLEdBQUd4SSxNQUFNO0lBQ2pCLElBQUkrbkIsV0FBVyxHQUFHLENBQUM7SUFDbkIsSUFBSUMsY0FBYyxHQUFHLEtBQUs7SUFDMUIsT0FBT0QsV0FBVyxHQUFHSCxRQUFRLENBQUM1bkIsTUFBTSxJQUFJOG5CLE9BQU8sR0FBRy9uQixTQUFTLENBQUNDLE1BQU0sRUFBRTtNQUNsRSxJQUFJcVQsTUFBTTtNQUNWLElBQUkwVSxXQUFXLEdBQUdILFFBQVEsQ0FBQzVuQixNQUFNLEtBQUssQ0FBQ29uQiw2REFBYyxDQUFDUSxRQUFRLENBQUNHLFdBQVcsQ0FBQyxDQUFDLElBQUlELE9BQU8sSUFBSS9uQixTQUFTLENBQUNDLE1BQU0sQ0FBQyxFQUFFO1FBQzVHcVQsTUFBTSxHQUFHdVUsUUFBUSxDQUFDRyxXQUFXLENBQUM7TUFDaEMsQ0FBQyxNQUFNO1FBQ0wxVSxNQUFNLEdBQUd0VCxTQUFTLENBQUMrbkIsT0FBTyxDQUFDO1FBQzNCQSxPQUFPLElBQUksQ0FBQztNQUNkO01BQ0FELFFBQVEsQ0FBQ0UsV0FBVyxDQUFDLEdBQUcxVSxNQUFNO01BQzlCLElBQUksQ0FBQytULDZEQUFjLENBQUMvVCxNQUFNLENBQUMsRUFBRTtRQUMzQjdLLElBQUksSUFBSSxDQUFDO01BQ1gsQ0FBQyxNQUFNO1FBQ0x3ZixjQUFjLEdBQUcsSUFBSTtNQUN2QjtNQUNBRCxXQUFXLElBQUksQ0FBQztJQUNsQjtJQUNBLE9BQU8sQ0FBQ0MsY0FBYyxJQUFJeGYsSUFBSSxJQUFJLENBQUMsR0FBR21DLEVBQUUsQ0FBQzBULEtBQUssQ0FBQyxJQUFJLEVBQUV3SixRQUFRLENBQUMsR0FBRzFKLHFEQUFNLENBQUMvRyxJQUFJLENBQUMrSCxHQUFHLENBQUMsQ0FBQyxFQUFFM1csSUFBSSxDQUFDLEVBQUVtWCxPQUFPLENBQUMzZixNQUFNLEVBQUU2bkIsUUFBUSxFQUFFbGQsRUFBRSxDQUFDLENBQUM7RUFDM0gsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDcUM7QUFDWTs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBUzBSLGFBQWFBLENBQUM2TCxXQUFXLEVBQUVDLGlCQUFpQixFQUFFeGQsRUFBRSxFQUFFO0VBQ3hFLE9BQU8sWUFBWTtJQUNqQixJQUFJNUssU0FBUyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzFCLE9BQU8ySyxFQUFFLENBQUMsQ0FBQztJQUNiO0lBQ0EsSUFBSWlULEdBQUcsR0FBRzdkLFNBQVMsQ0FBQ0EsU0FBUyxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQzRlLHVEQUFRLENBQUNoQixHQUFHLENBQUMsRUFBRTtNQUNsQixJQUFJbkIsR0FBRyxHQUFHLENBQUM7TUFDWCxPQUFPQSxHQUFHLEdBQUd5TCxXQUFXLENBQUNsb0IsTUFBTSxFQUFFO1FBQy9CLElBQUksT0FBTzRkLEdBQUcsQ0FBQ3NLLFdBQVcsQ0FBQ3pMLEdBQUcsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO1VBQy9DLE9BQU9tQixHQUFHLENBQUNzSyxXQUFXLENBQUN6TCxHQUFHLENBQUMsQ0FBQyxDQUFDNEIsS0FBSyxDQUFDVCxHQUFHLEVBQUUxZCxLQUFLLENBQUNvUixTQUFTLENBQUM0TSxLQUFLLENBQUNyTyxJQUFJLENBQUM5UCxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkY7UUFDQTBjLEdBQUcsSUFBSSxDQUFDO01BQ1Y7TUFDQSxJQUFJd0wsNkRBQWMsQ0FBQ3JLLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLElBQUl3SyxVQUFVLEdBQUdELGlCQUFpQixDQUFDOUosS0FBSyxDQUFDLElBQUksRUFBRW5lLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzlQLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixPQUFPcW9CLFVBQVUsQ0FBQ3hLLEdBQUcsQ0FBQztNQUN4QjtJQUNGO0lBQ0EsT0FBT2pULEVBQUUsQ0FBQzBULEtBQUssQ0FBQyxJQUFJLEVBQUV0ZSxTQUFTLENBQUM7RUFDbEMsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Q3lDO0FBQ0o7QUFDSDs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVN5Z0IsT0FBT0EsQ0FBQzdDLElBQUksRUFBRUMsR0FBRyxFQUFFO0VBQ3pDLElBQUlBLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDZixPQUFPQSxHQUFHO0VBQ1o7RUFDQSxJQUFJRSx5REFBVSxDQUFDSCxJQUFJLENBQUMsSUFBSWlCLHVEQUFRLENBQUNoQixHQUFHLENBQUMsRUFBRTtJQUNyQyxPQUFPeUssc0RBQU0sQ0FBQzFLLElBQUksRUFBRSxDQUFDLEVBQUVDLEdBQUcsQ0FBQztFQUM3QjtFQUNBLElBQUl2SyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsS0FBSyxJQUFJcU4sQ0FBQyxJQUFJOUMsR0FBRyxFQUFFO0lBQ2pCdkssTUFBTSxDQUFDcU4sQ0FBQyxDQUFDLEdBQUc5QyxHQUFHLENBQUM4QyxDQUFDLENBQUM7RUFDcEI7RUFDQSxPQUFPck4sTUFBTSxDQUFDc0ssSUFBSSxDQUFDO0VBQ25CLE9BQU90SyxNQUFNO0FBQ2Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJ5RDtBQUNWO0FBQ0E7QUFDbEI7QUFDVTtBQUNUO0FBQ0E7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVNvVixrQkFBa0JBLENBQUNDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sRUFBRTtFQUNoRSxJQUFJbkssQ0FBQyxHQUFHK0YsaUVBQWtCLENBQUNpRSxTQUFTLENBQUM7RUFDckMsSUFBSS9KLENBQUMsR0FBRzhGLGlFQUFrQixDQUFDa0UsU0FBUyxDQUFDO0VBQ3JDLFNBQVNHLEVBQUVBLENBQUN0QixFQUFFLEVBQUVELEVBQUUsRUFBRTtJQUNsQixPQUFPcEcsT0FBTyxDQUFDcUcsRUFBRSxFQUFFRCxFQUFFLEVBQUVxQixNQUFNLENBQUMxSyxLQUFLLENBQUMsQ0FBQyxFQUFFMkssTUFBTSxDQUFDM0ssS0FBSyxDQUFDLENBQUMsQ0FBQztFQUN4RDs7RUFFQTtFQUNBLE9BQU8sQ0FBQ29LLDREQUFhLENBQUMsVUFBVTNKLENBQUMsRUFBRW9LLEtBQUssRUFBRTtJQUN4QyxPQUFPLENBQUNULDREQUFhLENBQUNRLEVBQUUsRUFBRUMsS0FBSyxFQUFFcEssQ0FBQyxDQUFDO0VBQ3JDLENBQUMsRUFBRUEsQ0FBQyxFQUFFRCxDQUFDLENBQUM7QUFDVjtBQUNlLFNBQVN5QyxPQUFPQSxDQUFDekMsQ0FBQyxFQUFFQyxDQUFDLEVBQUVpSyxNQUFNLEVBQUVDLE1BQU0sRUFBRTtFQUNwRCxJQUFJTCx3REFBUyxDQUFDOUosQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRTtJQUNuQixPQUFPLElBQUk7RUFDYjtFQUNBLElBQUlxSyxLQUFLLEdBQUd2SCxvREFBSSxDQUFDL0MsQ0FBQyxDQUFDO0VBQ25CLElBQUlzSyxLQUFLLEtBQUt2SCxvREFBSSxDQUFDOUMsQ0FBQyxDQUFDLEVBQUU7SUFDckIsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJLE9BQU9ELENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFVBQVUsSUFBSSxPQUFPQyxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxVQUFVLEVBQUU7SUFDcEcsT0FBTyxPQUFPRCxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxVQUFVLElBQUlBLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDQyxDQUFDLENBQUMsSUFBSSxPQUFPQSxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxVQUFVLElBQUlBLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDRCxDQUFDLENBQUM7RUFDdks7RUFDQSxJQUFJLE9BQU9BLENBQUMsQ0FBQzBDLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBT3pDLENBQUMsQ0FBQ3lDLE1BQU0sS0FBSyxVQUFVLEVBQUU7SUFDcEUsT0FBTyxPQUFPMUMsQ0FBQyxDQUFDMEMsTUFBTSxLQUFLLFVBQVUsSUFBSTFDLENBQUMsQ0FBQzBDLE1BQU0sQ0FBQ3pDLENBQUMsQ0FBQyxJQUFJLE9BQU9BLENBQUMsQ0FBQ3lDLE1BQU0sS0FBSyxVQUFVLElBQUl6QyxDQUFDLENBQUN5QyxNQUFNLENBQUMxQyxDQUFDLENBQUM7RUFDdkc7RUFDQSxRQUFRc0ssS0FBSztJQUNYLEtBQUssV0FBVztJQUNoQixLQUFLLE9BQU87SUFDWixLQUFLLFFBQVE7TUFDWCxJQUFJLE9BQU90SyxDQUFDLENBQUN1QyxXQUFXLEtBQUssVUFBVSxJQUFJc0gsNERBQWEsQ0FBQzdKLENBQUMsQ0FBQ3VDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNyRixPQUFPdkMsQ0FBQyxLQUFLQyxDQUFDO01BQ2hCO01BQ0E7SUFDRixLQUFLLFNBQVM7SUFDZCxLQUFLLFFBQVE7SUFDYixLQUFLLFFBQVE7TUFDWCxJQUFJLEVBQUV6ZixPQUFBLENBQU93ZixDQUFDLE1BQUF4ZixPQUFBLENBQVl5ZixDQUFDLEtBQUk2Six3REFBUyxDQUFDOUosQ0FBQyxDQUFDOEcsT0FBTyxDQUFDLENBQUMsRUFBRTdHLENBQUMsQ0FBQzZHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25FLE9BQU8sS0FBSztNQUNkO01BQ0E7SUFDRixLQUFLLE1BQU07TUFDVCxJQUFJLENBQUNnRCx3REFBUyxDQUFDOUosQ0FBQyxDQUFDOEcsT0FBTyxDQUFDLENBQUMsRUFBRTdHLENBQUMsQ0FBQzZHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QyxPQUFPLEtBQUs7TUFDZDtNQUNBO0lBQ0YsS0FBSyxPQUFPO01BQ1YsT0FBTzlHLENBQUMsQ0FBQ3VLLElBQUksS0FBS3RLLENBQUMsQ0FBQ3NLLElBQUksSUFBSXZLLENBQUMsQ0FBQ3dLLE9BQU8sS0FBS3ZLLENBQUMsQ0FBQ3VLLE9BQU87SUFDckQsS0FBSyxRQUFRO01BQ1gsSUFBSSxFQUFFeEssQ0FBQyxDQUFDM1osTUFBTSxLQUFLNFosQ0FBQyxDQUFDNVosTUFBTSxJQUFJMlosQ0FBQyxDQUFDd0gsTUFBTSxLQUFLdkgsQ0FBQyxDQUFDdUgsTUFBTSxJQUFJeEgsQ0FBQyxDQUFDeUgsVUFBVSxLQUFLeEgsQ0FBQyxDQUFDd0gsVUFBVSxJQUFJekgsQ0FBQyxDQUFDMEgsU0FBUyxLQUFLekgsQ0FBQyxDQUFDeUgsU0FBUyxJQUFJMUgsQ0FBQyxDQUFDMkgsTUFBTSxLQUFLMUgsQ0FBQyxDQUFDMEgsTUFBTSxJQUFJM0gsQ0FBQyxDQUFDNEgsT0FBTyxLQUFLM0gsQ0FBQyxDQUFDMkgsT0FBTyxDQUFDLEVBQUU7UUFDekssT0FBTyxLQUFLO01BQ2Q7TUFDQTtFQUNKO0VBQ0EsSUFBSTdKLEdBQUcsR0FBR21NLE1BQU0sQ0FBQzVvQixNQUFNLEdBQUcsQ0FBQztFQUMzQixPQUFPeWMsR0FBRyxJQUFJLENBQUMsRUFBRTtJQUNmLElBQUltTSxNQUFNLENBQUNuTSxHQUFHLENBQUMsS0FBS2lDLENBQUMsRUFBRTtNQUNyQixPQUFPbUssTUFBTSxDQUFDcE0sR0FBRyxDQUFDLEtBQUtrQyxDQUFDO0lBQzFCO0lBQ0FsQyxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsUUFBUXVNLEtBQUs7SUFDWCxLQUFLLEtBQUs7TUFDUixJQUFJdEssQ0FBQyxDQUFDdFosSUFBSSxLQUFLdVosQ0FBQyxDQUFDdlosSUFBSSxFQUFFO1FBQ3JCLE9BQU8sS0FBSztNQUNkO01BQ0EsT0FBT3FqQixrQkFBa0IsQ0FBQy9KLENBQUMsQ0FBQ3lLLE9BQU8sQ0FBQyxDQUFDLEVBQUV4SyxDQUFDLENBQUN3SyxPQUFPLENBQUMsQ0FBQyxFQUFFUCxNQUFNLENBQUM1SixNQUFNLENBQUMsQ0FBQ04sQ0FBQyxDQUFDLENBQUMsRUFBRW1LLE1BQU0sQ0FBQzdKLE1BQU0sQ0FBQyxDQUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdGLEtBQUssS0FBSztNQUNSLElBQUlELENBQUMsQ0FBQ3RaLElBQUksS0FBS3VaLENBQUMsQ0FBQ3ZaLElBQUksRUFBRTtRQUNyQixPQUFPLEtBQUs7TUFDZDtNQUNBLE9BQU9xakIsa0JBQWtCLENBQUMvSixDQUFDLENBQUMwSyxNQUFNLENBQUMsQ0FBQyxFQUFFekssQ0FBQyxDQUFDeUssTUFBTSxDQUFDLENBQUMsRUFBRVIsTUFBTSxDQUFDNUosTUFBTSxDQUFDLENBQUNOLENBQUMsQ0FBQyxDQUFDLEVBQUVtSyxNQUFNLENBQUM3SixNQUFNLENBQUMsQ0FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRixLQUFLLFdBQVc7SUFDaEIsS0FBSyxPQUFPO0lBQ1osS0FBSyxRQUFRO0lBQ2IsS0FBSyxTQUFTO0lBQ2QsS0FBSyxRQUFRO0lBQ2IsS0FBSyxRQUFRO0lBQ2IsS0FBSyxNQUFNO0lBQ1gsS0FBSyxPQUFPO0lBQ1osS0FBSyxRQUFRO0lBQ2IsS0FBSyxXQUFXO0lBQ2hCLEtBQUssWUFBWTtJQUNqQixLQUFLLG1CQUFtQjtJQUN4QixLQUFLLFlBQVk7SUFDakIsS0FBSyxhQUFhO0lBQ2xCLEtBQUssWUFBWTtJQUNqQixLQUFLLGFBQWE7SUFDbEIsS0FBSyxjQUFjO0lBQ25CLEtBQUssY0FBYztJQUNuQixLQUFLLGFBQWE7TUFDaEI7SUFDRjtNQUNFO01BQ0EsT0FBTyxLQUFLO0VBQ2hCO0VBQ0EsSUFBSTBLLEtBQUssR0FBRy9vQixvREFBSSxDQUFDb2UsQ0FBQyxDQUFDO0VBQ25CLElBQUkySyxLQUFLLENBQUNycEIsTUFBTSxLQUFLTSxvREFBSSxDQUFDcWUsQ0FBQyxDQUFDLENBQUMzZSxNQUFNLEVBQUU7SUFDbkMsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJc3BCLGNBQWMsR0FBR1YsTUFBTSxDQUFDNUosTUFBTSxDQUFDLENBQUNOLENBQUMsQ0FBQyxDQUFDO0VBQ3ZDLElBQUk2SyxjQUFjLEdBQUdWLE1BQU0sQ0FBQzdKLE1BQU0sQ0FBQyxDQUFDTCxDQUFDLENBQUMsQ0FBQztFQUN2Q2xDLEdBQUcsR0FBRzRNLEtBQUssQ0FBQ3JwQixNQUFNLEdBQUcsQ0FBQztFQUN0QixPQUFPeWMsR0FBRyxJQUFJLENBQUMsRUFBRTtJQUNmLElBQUkvVixHQUFHLEdBQUcyaUIsS0FBSyxDQUFDNU0sR0FBRyxDQUFDO0lBQ3BCLElBQUksRUFBRW9CLG1EQUFJLENBQUNuWCxHQUFHLEVBQUVpWSxDQUFDLENBQUMsSUFBSXdDLE9BQU8sQ0FBQ3hDLENBQUMsQ0FBQ2pZLEdBQUcsQ0FBQyxFQUFFZ1ksQ0FBQyxDQUFDaFksR0FBRyxDQUFDLEVBQUU0aUIsY0FBYyxFQUFFQyxjQUFjLENBQUMsQ0FBQyxFQUFFO01BQzlFLE9BQU8sS0FBSztJQUNkO0lBQ0E5TSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBTyxJQUFJO0FBQ2I7Ozs7Ozs7Ozs7Ozs7OztBQ2xJZSxTQUFTa0YsT0FBT0EsQ0FBQ2hYLEVBQUUsRUFBRTZSLElBQUksRUFBRTtFQUN4QyxJQUFJQyxHQUFHLEdBQUcsQ0FBQztFQUNYLElBQUl1RixHQUFHLEdBQUd4RixJQUFJLENBQUN4YyxNQUFNO0VBQ3JCLElBQUlxVCxNQUFNLEdBQUcsRUFBRTtFQUNmLE9BQU9vSixHQUFHLEdBQUd1RixHQUFHLEVBQUU7SUFDaEIsSUFBSXJYLEVBQUUsQ0FBQzZSLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNqQnBKLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDclQsTUFBTSxDQUFDLEdBQUd3YyxJQUFJLENBQUNDLEdBQUcsQ0FBQztJQUNuQztJQUNBQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBT3BKLE1BQU07QUFDZjs7Ozs7Ozs7Ozs7Ozs7O0FDWGUsU0FBU2tWLGFBQWFBLENBQUNsTCxDQUFDLEVBQUU7RUFDdkM7RUFDQSxJQUFJbU0sS0FBSyxHQUFHQyxNQUFNLENBQUNwTSxDQUFDLENBQUMsQ0FBQ21NLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztFQUM5QyxPQUFPQSxLQUFLLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBR0EsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0Qzs7Ozs7Ozs7Ozs7Ozs7O0FDSmUsU0FBUzNMLElBQUlBLENBQUNGLElBQUksRUFBRUMsR0FBRyxFQUFFO0VBQ3RDLE9BQU9sZSxNQUFNLENBQUM0UixTQUFTLENBQUM4VCxjQUFjLENBQUN2VixJQUFJLENBQUMrTixHQUFHLEVBQUVELElBQUksQ0FBQztBQUN4RDs7Ozs7Ozs7Ozs7Ozs7O0FDRmUsU0FBU2lGLFNBQVNBLENBQUNuYixDQUFDLEVBQUU7RUFDbkMsT0FBT0EsQ0FBQztBQUNWOzs7Ozs7Ozs7Ozs7Ozs7O0FDRnFDO0FBQ3RCLFNBQVNxYixTQUFTQSxDQUFDcEUsQ0FBQyxFQUFFbEMsSUFBSSxFQUFFO0VBQ3pDLE9BQU93Ryx1REFBUSxDQUFDeEcsSUFBSSxFQUFFa0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbEM7Ozs7Ozs7Ozs7Ozs7OztBQ0hlLFNBQVM0SixhQUFhQSxDQUFDN0osSUFBSSxFQUFFaFgsQ0FBQyxFQUFFK1UsSUFBSSxFQUFFO0VBQ25ELElBQUlDLEdBQUcsR0FBRyxDQUFDO0VBQ1gsSUFBSXVGLEdBQUcsR0FBR3hGLElBQUksQ0FBQ3hjLE1BQU07RUFDckIsT0FBT3ljLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQixJQUFJdkQsSUFBSSxDQUFDaFgsQ0FBQyxFQUFFK1UsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFO01BQ3RCLE9BQU8sSUFBSTtJQUNiO0lBQ0FBLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7RUFDQSxPQUFPLEtBQUs7QUFDZDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWa0M7QUFDbkIsU0FBU3VHLFFBQVFBLENBQUN4RyxJQUFJLEVBQUVrQyxDQUFDLEVBQUVqQyxHQUFHLEVBQUU7RUFDN0MsSUFBSWlOLEdBQUcsRUFBRTdoQixJQUFJO0VBQ2I7RUFDQSxJQUFJLE9BQU8yVSxJQUFJLENBQUN5RyxPQUFPLEtBQUssVUFBVSxFQUFFO0lBQ3RDLFFBQUEvakIsT0FBQSxDQUFld2YsQ0FBQztNQUNkLEtBQUssUUFBUTtRQUNYLElBQUlBLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDWDtVQUNBZ0wsR0FBRyxHQUFHLENBQUMsR0FBR2hMLENBQUM7VUFDWCxPQUFPakMsR0FBRyxHQUFHRCxJQUFJLENBQUN4YyxNQUFNLEVBQUU7WUFDeEI2SCxJQUFJLEdBQUcyVSxJQUFJLENBQUNDLEdBQUcsQ0FBQztZQUNoQixJQUFJNVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUdBLElBQUksS0FBSzZoQixHQUFHLEVBQUU7Y0FDbEMsT0FBT2pOLEdBQUc7WUFDWjtZQUNBQSxHQUFHLElBQUksQ0FBQztVQUNWO1VBQ0EsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLE1BQU0sSUFBSWlDLENBQUMsS0FBS0EsQ0FBQyxFQUFFO1VBQ2xCO1VBQ0EsT0FBT2pDLEdBQUcsR0FBR0QsSUFBSSxDQUFDeGMsTUFBTSxFQUFFO1lBQ3hCNkgsSUFBSSxHQUFHMlUsSUFBSSxDQUFDQyxHQUFHLENBQUM7WUFDaEIsSUFBSSxPQUFPNVUsSUFBSSxLQUFLLFFBQVEsSUFBSUEsSUFBSSxLQUFLQSxJQUFJLEVBQUU7Y0FDN0MsT0FBTzRVLEdBQUc7WUFDWjtZQUNBQSxHQUFHLElBQUksQ0FBQztVQUNWO1VBQ0EsT0FBTyxDQUFDLENBQUM7UUFDWDtRQUNBO1FBQ0EsT0FBT0QsSUFBSSxDQUFDeUcsT0FBTyxDQUFDdkUsQ0FBQyxFQUFFakMsR0FBRyxDQUFDOztNQUU3QjtNQUNBLEtBQUssUUFBUTtNQUNiLEtBQUssU0FBUztNQUNkLEtBQUssVUFBVTtNQUNmLEtBQUssV0FBVztRQUNkLE9BQU9ELElBQUksQ0FBQ3lHLE9BQU8sQ0FBQ3ZFLENBQUMsRUFBRWpDLEdBQUcsQ0FBQztNQUM3QixLQUFLLFFBQVE7UUFDWCxJQUFJaUMsQ0FBQyxLQUFLLElBQUksRUFBRTtVQUNkO1VBQ0EsT0FBT2xDLElBQUksQ0FBQ3lHLE9BQU8sQ0FBQ3ZFLENBQUMsRUFBRWpDLEdBQUcsQ0FBQztRQUM3QjtJQUNKO0VBQ0Y7RUFDQTtFQUNBLE9BQU9BLEdBQUcsR0FBR0QsSUFBSSxDQUFDeGMsTUFBTSxFQUFFO0lBQ3hCLElBQUlvaEIsc0RBQU0sQ0FBQzVFLElBQUksQ0FBQ0MsR0FBRyxDQUFDLEVBQUVpQyxDQUFDLENBQUMsRUFBRTtNQUN4QixPQUFPakMsR0FBRztJQUNaO0lBQ0FBLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7RUFDQSxPQUFPLENBQUMsQ0FBQztBQUNYOzs7Ozs7Ozs7Ozs7O0FDckQ2QjtBQUM3QixJQUFJc0MsUUFBUSxHQUFHcmYsTUFBTSxDQUFDNFIsU0FBUyxDQUFDeU4sUUFBUTtBQUN4QyxJQUFJOEIsWUFBWSxHQUFHLGFBQWEsWUFBWTtFQUMxQyxPQUFPOUIsUUFBUSxDQUFDbFAsSUFBSSxDQUFDOVAsU0FBUyxDQUFDLEtBQUssb0JBQW9CLEdBQUcsU0FBUzhnQixZQUFZQSxDQUFDcFosQ0FBQyxFQUFFO0lBQ2xGLE9BQU9zWCxRQUFRLENBQUNsUCxJQUFJLENBQUNwSSxDQUFDLENBQUMsS0FBSyxvQkFBb0I7RUFDbEQsQ0FBQyxHQUFHLFNBQVNvWixZQUFZQSxDQUFDcFosQ0FBQyxFQUFFO0lBQzNCLE9BQU9vVyxtREFBSSxDQUFDLFFBQVEsRUFBRXBXLENBQUMsQ0FBQztFQUMxQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDSCwrREFBZW9aLFlBQVk7Ozs7Ozs7Ozs7OztBQ1QzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBZTNnQixLQUFLLENBQUMwQixPQUFPLElBQUksU0FBU2dkLFFBQVFBLENBQUNoQyxHQUFHLEVBQUU7RUFDckQsT0FBT0EsR0FBRyxJQUFJLElBQUksSUFBSUEsR0FBRyxDQUFDNWMsTUFBTSxJQUFJLENBQUMsSUFBSU4sTUFBTSxDQUFDNFIsU0FBUyxDQUFDeU4sUUFBUSxDQUFDbFAsSUFBSSxDQUFDK00sR0FBRyxDQUFDLEtBQUssZ0JBQWdCO0FBQ25HLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNka0M7QUFDRTtBQUNFOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJaUssWUFBWSxHQUFHLGFBQWFuSyxzREFBTyxDQUFDLFNBQVNpTixXQUFXQSxDQUFDbGlCLENBQUMsRUFBRTtFQUM5RCxJQUFJbVgsdURBQVEsQ0FBQ25YLENBQUMsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxJQUFJO0VBQ2I7RUFDQSxJQUFJLENBQUNBLENBQUMsRUFBRTtJQUNOLE9BQU8sS0FBSztFQUNkO0VBQ0EsSUFBSXZJLE9BQUEsQ0FBT3VJLENBQUMsTUFBSyxRQUFRLEVBQUU7SUFDekIsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJcVgsd0RBQVMsQ0FBQ3JYLENBQUMsQ0FBQyxFQUFFO0lBQ2hCLE9BQU8sS0FBSztFQUNkO0VBQ0EsSUFBSUEsQ0FBQyxDQUFDekgsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUNsQixPQUFPLElBQUk7RUFDYjtFQUNBLElBQUl5SCxDQUFDLENBQUN6SCxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQ2hCLE9BQU95SCxDQUFDLENBQUMyZCxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUkzZCxDQUFDLENBQUMyZCxjQUFjLENBQUMzZCxDQUFDLENBQUN6SCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQzlEO0VBQ0EsT0FBTyxLQUFLO0FBQ2QsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU2bUIsWUFBWTs7Ozs7Ozs7Ozs7Ozs7O0FDM0NaLFNBQVNoSSxXQUFXQSxDQUFDcFgsQ0FBQyxFQUFFO0VBQ3JDLElBQUlnYSxJQUFJLEdBQUcvaEIsTUFBTSxDQUFDNFIsU0FBUyxDQUFDeU4sUUFBUSxDQUFDbFAsSUFBSSxDQUFDcEksQ0FBQyxDQUFDO0VBQzVDLE9BQU9nYSxJQUFJLEtBQUssbUJBQW1CLElBQUlBLElBQUksS0FBSyx3QkFBd0IsSUFBSUEsSUFBSSxLQUFLLDRCQUE0QixJQUFJQSxJQUFJLEtBQUssaUNBQWlDO0FBQ2pLOzs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQWU5YixNQUFNLENBQUNpa0IsU0FBUyxJQUFJLFNBQVM5TCxVQUFVQSxDQUFDK0YsQ0FBQyxFQUFFO0VBQ3hELE9BQU9BLENBQUMsSUFBSSxDQUFDLEtBQUtBLENBQUM7QUFDckIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDVmMsU0FBUy9DLFNBQVNBLENBQUNyWixDQUFDLEVBQUU7RUFDbkMsT0FBTy9ILE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQ3lOLFFBQVEsQ0FBQ2xQLElBQUksQ0FBQ3BJLENBQUMsQ0FBQyxLQUFLLGlCQUFpQjtBQUNoRTs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZlLFNBQVMyZixjQUFjQSxDQUFDMUksQ0FBQyxFQUFFO0VBQ3hDLE9BQU9BLENBQUMsSUFBSSxJQUFJLElBQUl4ZixPQUFBLENBQU93ZixDQUFDLE1BQUssUUFBUSxJQUFJQSxDQUFDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxJQUFJO0FBQ3JGOzs7Ozs7Ozs7Ozs7Ozs7QUNGZSxTQUFTSSxTQUFTQSxDQUFDclgsQ0FBQyxFQUFFO0VBQ25DLE9BQU8vSCxNQUFNLENBQUM0UixTQUFTLENBQUN5TixRQUFRLENBQUNsUCxJQUFJLENBQUNwSSxDQUFDLENBQUMsS0FBSyxpQkFBaUI7QUFDaEU7Ozs7Ozs7Ozs7Ozs7OztBQ0ZlLFNBQVN3Z0IsY0FBY0EsQ0FBQ3JLLEdBQUcsRUFBRTtFQUMxQyxPQUFPQSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU9BLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFVBQVU7QUFDdEU7Ozs7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTbUQsYUFBYUEsQ0FBQ25FLEdBQUcsRUFBRTtFQUN6QyxJQUFJNkUsSUFBSSxHQUFHL2hCLE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQ3lOLFFBQVEsQ0FBQ2xQLElBQUksQ0FBQytNLEdBQUcsQ0FBQztFQUM5QyxPQUFPNkUsSUFBSSxLQUFLLDRCQUE0QixJQUFJQSxJQUFJLEtBQUssb0JBQW9CLElBQUlBLElBQUksS0FBSyxxQkFBcUIsSUFBSUEsSUFBSSxLQUFLLHFCQUFxQixJQUFJQSxJQUFJLEtBQUssc0JBQXNCLElBQUlBLElBQUksS0FBSyxxQkFBcUIsSUFBSUEsSUFBSSxLQUFLLHNCQUFzQixJQUFJQSxJQUFJLEtBQUssdUJBQXVCLElBQUlBLElBQUksS0FBSyx1QkFBdUIsSUFBSUEsSUFBSSxLQUFLLHdCQUF3QixJQUFJQSxJQUFJLEtBQUsseUJBQXlCO0FBQzlZOzs7Ozs7Ozs7Ozs7Ozs7O0FDakI2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU1UsU0FBU0EsQ0FBQzBILFNBQVMsRUFBRTtFQUMzQyxPQUFPLFNBQVNDLEtBQUtBLENBQUN0TixJQUFJLEVBQUU7SUFDMUIsSUFBSTlhLEtBQUssRUFBRXFvQixJQUFJLEVBQUV2UixDQUFDO0lBQ2xCLElBQUluRixNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUlvSixHQUFHLEdBQUcsQ0FBQztJQUNYLElBQUl1TixJQUFJLEdBQUd4TixJQUFJLENBQUN4YyxNQUFNO0lBQ3RCLE9BQU95YyxHQUFHLEdBQUd1TixJQUFJLEVBQUU7TUFDakIsSUFBSW5ELDJEQUFZLENBQUNySyxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDM0IvYSxLQUFLLEdBQUdtb0IsU0FBUyxHQUFHQyxLQUFLLENBQUN0TixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEdBQUdELElBQUksQ0FBQ0MsR0FBRyxDQUFDO1FBQ2hEakUsQ0FBQyxHQUFHLENBQUM7UUFDTHVSLElBQUksR0FBR3JvQixLQUFLLENBQUMxQixNQUFNO1FBQ25CLE9BQU93WSxDQUFDLEdBQUd1UixJQUFJLEVBQUU7VUFDZjFXLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDclQsTUFBTSxDQUFDLEdBQUcwQixLQUFLLENBQUM4VyxDQUFDLENBQUM7VUFDaENBLENBQUMsSUFBSSxDQUFDO1FBQ1I7TUFDRixDQUFDLE1BQU07UUFDTG5GLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDclQsTUFBTSxDQUFDLEdBQUd3YyxJQUFJLENBQUNDLEdBQUcsQ0FBQztNQUNuQztNQUNBQSxHQUFHLElBQUksQ0FBQztJQUNWO0lBQ0EsT0FBT3BKLE1BQU07RUFDZixDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztBQzlCZSxTQUFTNEwsSUFBSUEsQ0FBQ3RVLEVBQUUsRUFBRXNmLE9BQU8sRUFBRTtFQUN4QyxJQUFJeE4sR0FBRyxHQUFHLENBQUM7RUFDWCxJQUFJdUYsR0FBRyxHQUFHaUksT0FBTyxDQUFDanFCLE1BQU07RUFDeEIsSUFBSXFULE1BQU0sR0FBR25ULEtBQUssQ0FBQzhoQixHQUFHLENBQUM7RUFDdkIsT0FBT3ZGLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQjNPLE1BQU0sQ0FBQ29KLEdBQUcsQ0FBQyxHQUFHOVIsRUFBRSxDQUFDc2YsT0FBTyxDQUFDeE4sR0FBRyxDQUFDLENBQUM7SUFDOUJBLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7RUFDQSxPQUFPcEosTUFBTTtBQUNmOzs7Ozs7Ozs7Ozs7Ozs7O0FDVHVDO0FBQ3hCLFNBQVM2VyxJQUFJQSxDQUFDQyxNQUFNLEVBQUUzTixJQUFJLEVBQUU7RUFDekMsSUFBSUMsR0FBRyxHQUFHME4sTUFBTSxHQUFHLENBQUMsR0FBRzNOLElBQUksQ0FBQ3hjLE1BQU0sR0FBR21xQixNQUFNLEdBQUdBLE1BQU07RUFDcEQsT0FBT3JMLHdEQUFTLENBQUN0QyxJQUFJLENBQUMsR0FBR0EsSUFBSSxDQUFDNE4sTUFBTSxDQUFDM04sR0FBRyxDQUFDLEdBQUdELElBQUksQ0FBQ0MsR0FBRyxDQUFDO0FBQ3ZEOzs7Ozs7Ozs7Ozs7O0FDSjZCOztBQUU3QjtBQUNBLFNBQVM0TixhQUFhQSxDQUFDcmxCLE1BQU0sRUFBRTtFQUM3QixJQUFJQSxNQUFNLElBQUksSUFBSSxFQUFFO0lBQ2xCLE1BQU0sSUFBSW5ELFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQztFQUNuRTtFQUNBLElBQUl5b0IsTUFBTSxHQUFHNXFCLE1BQU0sQ0FBQ3NGLE1BQU0sQ0FBQztFQUMzQixJQUFJeVgsR0FBRyxHQUFHLENBQUM7RUFDWCxJQUFJemMsTUFBTSxHQUFHRCxTQUFTLENBQUNDLE1BQU07RUFDN0IsT0FBT3ljLEdBQUcsR0FBR3pjLE1BQU0sRUFBRTtJQUNuQixJQUFJK0UsTUFBTSxHQUFHaEYsU0FBUyxDQUFDMGMsR0FBRyxDQUFDO0lBQzNCLElBQUkxWCxNQUFNLElBQUksSUFBSSxFQUFFO01BQ2xCLEtBQUssSUFBSXdsQixPQUFPLElBQUl4bEIsTUFBTSxFQUFFO1FBQzFCLElBQUk4WSxtREFBSSxDQUFDME0sT0FBTyxFQUFFeGxCLE1BQU0sQ0FBQyxFQUFFO1VBQ3pCdWxCLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDLEdBQUd4bEIsTUFBTSxDQUFDd2xCLE9BQU8sQ0FBQztRQUNuQztNQUNGO0lBQ0Y7SUFDQTlOLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7RUFDQSxPQUFPNk4sTUFBTTtBQUNmO0FBQ0EsK0RBQWUsT0FBTzVxQixNQUFNLENBQUNDLE1BQU0sS0FBSyxVQUFVLEdBQUdELE1BQU0sQ0FBQ0MsTUFBTSxHQUFHMHFCLGFBQWE7Ozs7Ozs7Ozs7OztBQ3ZCbEY7QUFDQSxTQUFTN0IsU0FBU0EsQ0FBQzlKLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ3ZCO0VBQ0EsSUFBSUQsQ0FBQyxLQUFLQyxDQUFDLEVBQUU7SUFDWDtJQUNBO0lBQ0EsT0FBT0QsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUdBLENBQUMsS0FBSyxDQUFDLEdBQUdDLENBQUM7RUFDbkMsQ0FBQyxNQUFNO0lBQ0w7SUFDQSxPQUFPRCxDQUFDLEtBQUtBLENBQUMsSUFBSUMsQ0FBQyxLQUFLQSxDQUFDO0VBQzNCO0FBQ0Y7QUFDQSwrREFBZSxPQUFPamYsTUFBTSxDQUFDOHFCLEVBQUUsS0FBSyxVQUFVLEdBQUc5cUIsTUFBTSxDQUFDOHFCLEVBQUUsR0FBR2hDLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWjdCO0FBQ1o7QUFDZCxTQUFTN0YsS0FBS0EsQ0FBQzhILE1BQU0sRUFBRTdNLEdBQUcsRUFBRTtFQUN6QyxJQUFJaEIsR0FBRyxHQUFHZ0IsR0FBRztFQUNiLEtBQUssSUFBSS9jLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzRwQixNQUFNLENBQUN6cUIsTUFBTSxFQUFFYSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ3pDLElBQUkrYixHQUFHLElBQUksSUFBSSxFQUFFO01BQ2YsT0FBTzFiLFNBQVM7SUFDbEI7SUFDQSxJQUFJd2YsQ0FBQyxHQUFHK0osTUFBTSxDQUFDNXBCLENBQUMsQ0FBQztJQUNqQixJQUFJaWQseURBQVUsQ0FBQzRDLENBQUMsQ0FBQyxFQUFFO01BQ2pCOUQsR0FBRyxHQUFHc04sbURBQUksQ0FBQ3hKLENBQUMsRUFBRTlELEdBQUcsQ0FBQztJQUNwQixDQUFDLE1BQU07TUFDTEEsR0FBRyxHQUFHQSxHQUFHLENBQUM4RCxDQUFDLENBQUM7SUFDZDtFQUNGO0VBQ0EsT0FBTzlELEdBQUc7QUFDWjs7Ozs7Ozs7Ozs7Ozs7O0FDaEJlLFNBQVM4TixNQUFNQSxDQUFDdmhCLENBQUMsRUFBRTtFQUNoQyxJQUFJd2hCLE9BQU8sR0FBR3hoQixDQUFDLENBQUN5aEIsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztFQUFBLENBQzlEQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUNwSSxPQUFPLEdBQUcsR0FBR0QsT0FBTyxDQUFDQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUc7QUFDakQ7Ozs7Ozs7Ozs7Ozs7O0FDSjZDO0FBQ0U7QUFDL0MsU0FBU0MsZUFBZUEsQ0FBQ2xHLE9BQU8sRUFBRXZILEdBQUcsRUFBRXNILElBQUksRUFBRTtFQUMzQyxJQUFJdlUsSUFBSSxHQUFHdVUsSUFBSSxDQUFDbmpCLElBQUksQ0FBQyxDQUFDO0VBQ3RCLE9BQU8sQ0FBQzRPLElBQUksQ0FBQzNPLElBQUksRUFBRTtJQUNqQjRiLEdBQUcsR0FBR3VILE9BQU8sQ0FBQ3ZILEdBQUcsRUFBRWpOLElBQUksQ0FBQ3pPLEtBQUssQ0FBQztJQUM5QnlPLElBQUksR0FBR3VVLElBQUksQ0FBQ25qQixJQUFJLENBQUMsQ0FBQztFQUNwQjtFQUNBLE9BQU82YixHQUFHO0FBQ1o7QUFDQSxTQUFTME4sYUFBYUEsQ0FBQ25HLE9BQU8sRUFBRXZILEdBQUcsRUFBRVEsR0FBRyxFQUFFbU4sVUFBVSxFQUFFO0VBQ3BELE9BQU9uTixHQUFHLENBQUNtTixVQUFVLENBQUMsQ0FBQ3BHLE9BQU8sRUFBRXZILEdBQUcsQ0FBQztBQUN0QztBQUNBLElBQUlKLE9BQU8sR0FBRyxhQUFhK0osNERBQWEsQ0FBQ3JGLHVEQUFZLEVBQUVvSixhQUFhLEVBQUVELGVBQWUsQ0FBQztBQUN0RiwrREFBZTdOLE9BQU87Ozs7Ozs7Ozs7Ozs7OztBQ2RQLFNBQVNnTyxRQUFRQSxDQUFDdmpCLENBQUMsRUFBRTtFQUNsQyxPQUFPQSxDQUFDLElBQUlBLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHQSxDQUFDLEdBQUc7SUFDMUMsb0JBQW9CLEVBQUVBLENBQUM7SUFDdkIsc0JBQXNCLEVBQUU7RUFDMUIsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQSxJQUFJd2pCLEdBQUcsR0FBRyxTQUFTQSxHQUFHQSxDQUFDcEgsQ0FBQyxFQUFFO0VBQ3hCLE9BQU8sQ0FBQ0EsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJQSxDQUFDO0FBQ2hDLENBQUM7QUFDRCxJQUFJcUgsWUFBWSxHQUFHLE9BQU8zRixJQUFJLENBQUNqVSxTQUFTLENBQUM2WixXQUFXLEtBQUssVUFBVSxHQUFHLFNBQVNELFlBQVlBLENBQUNyTCxDQUFDLEVBQUU7RUFDN0YsT0FBT0EsQ0FBQyxDQUFDc0wsV0FBVyxDQUFDLENBQUM7QUFDeEIsQ0FBQyxHQUFHLFNBQVNELFlBQVlBLENBQUNyTCxDQUFDLEVBQUU7RUFDM0IsT0FBT0EsQ0FBQyxDQUFDdUwsY0FBYyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUdILEdBQUcsQ0FBQ3BMLENBQUMsQ0FBQ3dMLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHSixHQUFHLENBQUNwTCxDQUFDLENBQUN5TCxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHTCxHQUFHLENBQUNwTCxDQUFDLENBQUMwTCxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHTixHQUFHLENBQUNwTCxDQUFDLENBQUMyTCxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHUCxHQUFHLENBQUNwTCxDQUFDLENBQUM0TCxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM1TCxDQUFDLENBQUM2TCxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUN6TixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDeFAsQ0FBQztBQUNELCtEQUFlZ04sWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1hZO0FBQ1Y7QUFDSTtBQUNZO0FBQ2Y7QUFDSTtBQUNuQixTQUFTVyxTQUFTQSxDQUFDcGtCLENBQUMsRUFBRXFrQixJQUFJLEVBQUU7RUFDekMsSUFBSUMsS0FBSyxHQUFHLFNBQVNBLEtBQUtBLENBQUNwa0IsQ0FBQyxFQUFFO0lBQzVCLElBQUl1YixFQUFFLEdBQUc0SSxJQUFJLENBQUM5TSxNQUFNLENBQUMsQ0FBQ3ZYLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU9xYix3REFBUyxDQUFDbmIsQ0FBQyxFQUFFdWIsRUFBRSxDQUFDLEdBQUcsWUFBWSxHQUFHMkksU0FBUyxDQUFDbGtCLENBQUMsRUFBRXViLEVBQUUsQ0FBQztFQUMzRCxDQUFDOztFQUVEO0VBQ0EsSUFBSThJLFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFhcE8sR0FBRyxFQUFFdGQsSUFBSSxFQUFFO0lBQ2xDLE9BQU8yZSxtREFBSSxDQUFDLFVBQVUxZSxDQUFDLEVBQUU7TUFDdkIsT0FBT21xQixxREFBTSxDQUFDbnFCLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBR3dyQixLQUFLLENBQUNuTyxHQUFHLENBQUNyZCxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLEVBQUVELElBQUksQ0FBQzRkLEtBQUssQ0FBQyxDQUFDLENBQUMrTixJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLENBQUM7RUFDRCxRQUFRdnNCLE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQ3lOLFFBQVEsQ0FBQ2xQLElBQUksQ0FBQ3BJLENBQUMsQ0FBQztJQUN2QyxLQUFLLG9CQUFvQjtNQUN2QixPQUFPLG9DQUFvQyxHQUFHd1gsbURBQUksQ0FBQzhNLEtBQUssRUFBRXRrQixDQUFDLENBQUMsQ0FBQ29lLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJO0lBQ2hGLEtBQUssZ0JBQWdCO01BQ25CLE9BQU8sR0FBRyxHQUFHNUcsbURBQUksQ0FBQzhNLEtBQUssRUFBRXRrQixDQUFDLENBQUMsQ0FBQ3VYLE1BQU0sQ0FBQ2dOLFFBQVEsQ0FBQ3ZrQixDQUFDLEVBQUVta0Isc0RBQU0sQ0FBQyxVQUFVcnJCLENBQUMsRUFBRTtRQUNqRSxPQUFPLE9BQU8sQ0FBQzJyQixJQUFJLENBQUMzckIsQ0FBQyxDQUFDO01BQ3hCLENBQUMsRUFBRUQsb0RBQUksQ0FBQ21ILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDb2UsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7SUFDaEMsS0FBSyxrQkFBa0I7TUFDckIsT0FBTzNtQixPQUFBLENBQU91SSxDQUFDLE1BQUssUUFBUSxHQUFHLGNBQWMsR0FBR3NrQixLQUFLLENBQUN0a0IsQ0FBQyxDQUFDK2QsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRy9kLENBQUMsQ0FBQ3NYLFFBQVEsQ0FBQyxDQUFDO0lBQ3pGLEtBQUssZUFBZTtNQUNsQixPQUFPLFdBQVcsSUFBSXBTLEtBQUssQ0FBQ2xGLENBQUMsQ0FBQytkLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBR3VHLEtBQUssQ0FBQ0ksR0FBRyxDQUFDLEdBQUd6QixxREFBTSxDQUFDUSwyREFBWSxDQUFDempCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0lBQ3hGLEtBQUssY0FBYztNQUNqQixPQUFPLFVBQVUsR0FBR3NrQixLQUFLLENBQUM3ckIsS0FBSyxDQUFDZ2hCLElBQUksQ0FBQ3paLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztJQUNoRCxLQUFLLGVBQWU7TUFDbEIsT0FBTyxNQUFNO0lBQ2YsS0FBSyxpQkFBaUI7TUFDcEIsT0FBT3ZJLE9BQUEsQ0FBT3VJLENBQUMsTUFBSyxRQUFRLEdBQUcsYUFBYSxHQUFHc2tCLEtBQUssQ0FBQ3RrQixDQUFDLENBQUMrZCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRy9kLENBQUMsS0FBSyxDQUFDa2MsUUFBUSxHQUFHLElBQUksR0FBR2xjLENBQUMsQ0FBQ3NYLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDdkgsS0FBSyxjQUFjO01BQ2pCLE9BQU8sVUFBVSxHQUFHZ04sS0FBSyxDQUFDN3JCLEtBQUssQ0FBQ2doQixJQUFJLENBQUN6WixDQUFDLENBQUMsQ0FBQ3drQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztJQUN2RCxLQUFLLGlCQUFpQjtNQUNwQixPQUFPL3NCLE9BQUEsQ0FBT3VJLENBQUMsTUFBSyxRQUFRLEdBQUcsYUFBYSxHQUFHc2tCLEtBQUssQ0FBQ3RrQixDQUFDLENBQUMrZCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHa0YscURBQU0sQ0FBQ2pqQixDQUFDLENBQUM7SUFDckYsS0FBSyxvQkFBb0I7TUFDdkIsT0FBTyxXQUFXO0lBQ3BCO01BQ0UsSUFBSSxPQUFPQSxDQUFDLENBQUNzWCxRQUFRLEtBQUssVUFBVSxFQUFFO1FBQ3BDLElBQUlxTixJQUFJLEdBQUcza0IsQ0FBQyxDQUFDc1gsUUFBUSxDQUFDLENBQUM7UUFDdkIsSUFBSXFOLElBQUksS0FBSyxpQkFBaUIsRUFBRTtVQUM5QixPQUFPQSxJQUFJO1FBQ2I7TUFDRjtNQUNBLE9BQU8sR0FBRyxHQUFHSixRQUFRLENBQUN2a0IsQ0FBQyxFQUFFbkgsb0RBQUksQ0FBQ21ILENBQUMsQ0FBQyxDQUFDLENBQUNvZSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRztFQUN0RDtBQUNGOzs7Ozs7Ozs7Ozs7Ozs7QUNsRGUsU0FBU3dHLGFBQWFBLENBQUNsRixFQUFFLEVBQUUvSixHQUFHLEVBQUVaLElBQUksRUFBRTtFQUNuRCxJQUFJQyxHQUFHLEdBQUcsQ0FBQztFQUNYLElBQUl1RixHQUFHLEdBQUd4RixJQUFJLENBQUN4YyxNQUFNO0VBQ3JCLE9BQU95YyxHQUFHLEdBQUd1RixHQUFHLEVBQUU7SUFDaEI1RSxHQUFHLEdBQUcrSixFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQy9KLEdBQUcsRUFBRVosSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxJQUFJVyxHQUFHLElBQUlBLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO01BQ3RDQSxHQUFHLEdBQUdBLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztNQUMvQjtJQUNGO0lBQ0FYLEdBQUcsSUFBSSxDQUFDO0VBQ1Y7RUFDQSxPQUFPMEssRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMvSixHQUFHLENBQUM7QUFDdkM7Ozs7Ozs7Ozs7Ozs7OztBQ1orQztBQUNBO0FBQ2pCO0FBQzlCLFNBQVNrUCxnQkFBZ0JBLENBQUNuRixFQUFFLEVBQUUvSixHQUFHLEVBQUVzSCxJQUFJLEVBQUU7RUFDdkMsSUFBSXZVLElBQUksR0FBR3VVLElBQUksQ0FBQ25qQixJQUFJLENBQUMsQ0FBQztFQUN0QixPQUFPLENBQUM0TyxJQUFJLENBQUMzTyxJQUFJLEVBQUU7SUFDakI0YixHQUFHLEdBQUcrSixFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQy9KLEdBQUcsRUFBRWpOLElBQUksQ0FBQ3pPLEtBQUssQ0FBQztJQUM5QyxJQUFJMGIsR0FBRyxJQUFJQSxHQUFHLENBQUMsc0JBQXNCLENBQUMsRUFBRTtNQUN0Q0EsR0FBRyxHQUFHQSxHQUFHLENBQUMsb0JBQW9CLENBQUM7TUFDL0I7SUFDRjtJQUNBak4sSUFBSSxHQUFHdVUsSUFBSSxDQUFDbmpCLElBQUksQ0FBQyxDQUFDO0VBQ3BCO0VBQ0EsT0FBTzRsQixFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQy9KLEdBQUcsQ0FBQztBQUN2QztBQUNBLFNBQVNtUCxjQUFjQSxDQUFDcEYsRUFBRSxFQUFFL0osR0FBRyxFQUFFUSxHQUFHLEVBQUVtTixVQUFVLEVBQUU7RUFDaEQsT0FBTzVELEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDdkosR0FBRyxDQUFDbU4sVUFBVSxDQUFDLENBQUNuckIsb0RBQUksQ0FBQ3VuQixFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRUEsRUFBRSxDQUFDLEVBQUUvSixHQUFHLENBQUMsQ0FBQztBQUMzRjtBQUNBLElBQUlvUCxRQUFRLEdBQUcsYUFBYXpGLDREQUFhLENBQUNzRix3REFBYSxFQUFFRSxjQUFjLEVBQUVELGdCQUFnQixDQUFDO0FBQzFGLCtEQUFlRSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7OztBQ25CYztBQUNGO0FBQ25DLElBQUlFLElBQUksR0FBRyxhQUFhLFlBQVk7RUFDbEMsU0FBU0EsSUFBSUEsQ0FBQ3JQLENBQUMsRUFBRThKLEVBQUUsRUFBRTtJQUNuQixJQUFJLENBQUNBLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQzlKLENBQUMsR0FBR0EsQ0FBQztJQUNWLElBQUksQ0FBQ2QsR0FBRyxHQUFHLElBQUk7RUFDakI7RUFDQW1RLElBQUksQ0FBQ3BiLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHbWIsa0RBQU8sQ0FBQ0UsSUFBSTtFQUNsREQsSUFBSSxDQUFDcGIsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsVUFBVStCLE1BQU0sRUFBRTtJQUN4RCxJQUFJLElBQUksQ0FBQ2tKLEdBQUcsRUFBRTtNQUNabEosTUFBTSxHQUFHLElBQUksQ0FBQzhULEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOVQsTUFBTSxFQUFFLElBQUksQ0FBQztJQUNyRDtJQUNBLE9BQU8sSUFBSSxDQUFDOFQsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM5VCxNQUFNLENBQUM7RUFDL0MsQ0FBQztFQUNEcVosSUFBSSxDQUFDcGIsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsVUFBVStCLE1BQU0sRUFBRXVaLEtBQUssRUFBRTtJQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDdlAsQ0FBQyxDQUFDdVAsS0FBSyxDQUFDLEVBQUU7TUFDbEIsSUFBSSxDQUFDclEsR0FBRyxHQUFHLEtBQUs7TUFDaEJsSixNQUFNLEdBQUcyWCx1REFBUSxDQUFDLElBQUksQ0FBQzdELEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOVQsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hFO0lBQ0EsT0FBT0EsTUFBTTtFQUNmLENBQUM7RUFDRCxPQUFPcVosSUFBSTtBQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ1ksU0FBU3BRLEtBQUtBLENBQUNlLENBQUMsRUFBRTtFQUMvQixPQUFPLFVBQVU4SixFQUFFLEVBQUU7SUFDbkIsT0FBTyxJQUFJdUYsSUFBSSxDQUFDclAsQ0FBQyxFQUFFOEosRUFBRSxDQUFDO0VBQ3hCLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QnFDO0FBQ0Y7QUFDbkMsSUFBSTBGLElBQUksR0FBRyxhQUFhLFlBQVk7RUFDbEMsU0FBU0EsSUFBSUEsQ0FBQ3hQLENBQUMsRUFBRThKLEVBQUUsRUFBRTtJQUNuQixJQUFJLENBQUNBLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQzlKLENBQUMsR0FBR0EsQ0FBQztJQUNWLElBQUksQ0FBQ1AsR0FBRyxHQUFHLEtBQUs7RUFDbEI7RUFDQStQLElBQUksQ0FBQ3ZiLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHbWIsa0RBQU8sQ0FBQ0UsSUFBSTtFQUNsREUsSUFBSSxDQUFDdmIsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsVUFBVStCLE1BQU0sRUFBRTtJQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDeUosR0FBRyxFQUFFO01BQ2J6SixNQUFNLEdBQUcsSUFBSSxDQUFDOFQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUUsS0FBSyxDQUFDO0lBQ3REO0lBQ0EsT0FBTyxJQUFJLENBQUM4VCxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQzlULE1BQU0sQ0FBQztFQUMvQyxDQUFDO0VBQ0R3WixJQUFJLENBQUN2YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVK0IsTUFBTSxFQUFFdVosS0FBSyxFQUFFO0lBQzdELElBQUksSUFBSSxDQUFDdlAsQ0FBQyxDQUFDdVAsS0FBSyxDQUFDLEVBQUU7TUFDakIsSUFBSSxDQUFDOVAsR0FBRyxHQUFHLElBQUk7TUFDZnpKLE1BQU0sR0FBRzJYLHVEQUFRLENBQUMsSUFBSSxDQUFDN0QsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0Q7SUFDQSxPQUFPQSxNQUFNO0VBQ2YsQ0FBQztFQUNELE9BQU93WixJQUFJO0FBQ2IsQ0FBQyxDQUFDLENBQUM7QUFDWSxTQUFTaFEsS0FBS0EsQ0FBQ1EsQ0FBQyxFQUFFO0VBQy9CLE9BQU8sVUFBVThKLEVBQUUsRUFBRTtJQUNuQixPQUFPLElBQUkwRixJQUFJLENBQUN4UCxDQUFDLEVBQUU4SixFQUFFLENBQUM7RUFDeEIsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7QUM1QkEsK0RBQWU7RUFDYndGLElBQUksRUFBRSxTQUFOQSxJQUFJQSxDQUFBLEVBQWM7SUFDaEIsT0FBTyxJQUFJLENBQUN4RixFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0VBQ3ZDLENBQUM7RUFDRDlULE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFZQSxPQUFNLEVBQUU7SUFDeEIsT0FBTyxJQUFJLENBQUM4VCxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQzlULE9BQU0sQ0FBQztFQUMvQztBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQa0M7QUFDbkMsSUFBSXlaLE9BQU8sR0FBRyxhQUFhLFlBQVk7RUFDckMsU0FBU0EsT0FBT0EsQ0FBQ3pQLENBQUMsRUFBRThKLEVBQUUsRUFBRTtJQUN0QixJQUFJLENBQUNBLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQzlKLENBQUMsR0FBR0EsQ0FBQztFQUNaO0VBQ0F5UCxPQUFPLENBQUN4YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBR21iLGtEQUFPLENBQUNFLElBQUk7RUFDckRHLE9BQU8sQ0FBQ3hiLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHbWIsa0RBQU8sQ0FBQ3BaLE1BQU07RUFDekR5WixPQUFPLENBQUN4YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVK0IsTUFBTSxFQUFFdVosS0FBSyxFQUFFO0lBQ2hFLE9BQU8sSUFBSSxDQUFDdlAsQ0FBQyxDQUFDdVAsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDekYsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUV1WixLQUFLLENBQUMsR0FBR3ZaLE1BQU07RUFDN0UsQ0FBQztFQUNELE9BQU95WixPQUFPO0FBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ1ksU0FBU2xMLFFBQVFBLENBQUN2RSxDQUFDLEVBQUU7RUFDbEMsT0FBTyxVQUFVOEosRUFBRSxFQUFFO0lBQ25CLE9BQU8sSUFBSTJGLE9BQU8sQ0FBQ3pQLENBQUMsRUFBRThKLEVBQUUsQ0FBQztFQUMzQixDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakJxQztBQUNGO0FBQ25DLElBQUk0RixLQUFLLEdBQUcsYUFBYSxZQUFZO0VBQ25DLFNBQVNBLEtBQUtBLENBQUMxUCxDQUFDLEVBQUU4SixFQUFFLEVBQUU7SUFDcEIsSUFBSSxDQUFDQSxFQUFFLEdBQUdBLEVBQUU7SUFDWixJQUFJLENBQUM5SixDQUFDLEdBQUdBLENBQUM7SUFDVixJQUFJLENBQUMyUCxLQUFLLEdBQUcsS0FBSztFQUNwQjtFQUNBRCxLQUFLLENBQUN6YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBR21iLGtEQUFPLENBQUNFLElBQUk7RUFDbkRJLEtBQUssQ0FBQ3piLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLFVBQVUrQixNQUFNLEVBQUU7SUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQzJaLEtBQUssRUFBRTtNQUNmM1osTUFBTSxHQUFHLElBQUksQ0FBQzhULEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOVQsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZEO0lBQ0EsT0FBTyxJQUFJLENBQUM4VCxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQzlULE1BQU0sQ0FBQztFQUMvQyxDQUFDO0VBQ0QwWixLQUFLLENBQUN6YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVK0IsTUFBTSxFQUFFdVosS0FBSyxFQUFFO0lBQzlELElBQUksSUFBSSxDQUFDdlAsQ0FBQyxDQUFDdVAsS0FBSyxDQUFDLEVBQUU7TUFDakIsSUFBSSxDQUFDSSxLQUFLLEdBQUcsSUFBSTtNQUNqQjNaLE1BQU0sR0FBRzJYLHVEQUFRLENBQUMsSUFBSSxDQUFDN0QsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUV1WixLQUFLLENBQUMsQ0FBQztJQUNoRTtJQUNBLE9BQU92WixNQUFNO0VBQ2YsQ0FBQztFQUNELE9BQU8wWixLQUFLO0FBQ2QsQ0FBQyxDQUFDLENBQUM7QUFDWSxTQUFTakwsTUFBTUEsQ0FBQ3pFLENBQUMsRUFBRTtFQUNoQyxPQUFPLFVBQVU4SixFQUFFLEVBQUU7SUFDbkIsT0FBTyxJQUFJNEYsS0FBSyxDQUFDMVAsQ0FBQyxFQUFFOEosRUFBRSxDQUFDO0VBQ3pCLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QnFDO0FBQ0Y7QUFDbkMsSUFBSThGLFVBQVUsR0FBRyxhQUFhLFlBQVk7RUFDeEMsU0FBU0EsVUFBVUEsQ0FBQzVQLENBQUMsRUFBRThKLEVBQUUsRUFBRTtJQUN6QixJQUFJLENBQUNBLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQzlKLENBQUMsR0FBR0EsQ0FBQztJQUNWLElBQUksQ0FBQ1osR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksQ0FBQ3VRLEtBQUssR0FBRyxLQUFLO0VBQ3BCO0VBQ0FDLFVBQVUsQ0FBQzNiLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHbWIsa0RBQU8sQ0FBQ0UsSUFBSTtFQUN4RE0sVUFBVSxDQUFDM2IsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsVUFBVStCLE1BQU0sRUFBRTtJQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDMlosS0FBSyxFQUFFO01BQ2YzWixNQUFNLEdBQUcsSUFBSSxDQUFDOFQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQ7SUFDQSxPQUFPLElBQUksQ0FBQzhULEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOVQsTUFBTSxDQUFDO0VBQy9DLENBQUM7RUFDRDRaLFVBQVUsQ0FBQzNiLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFVBQVUrQixNQUFNLEVBQUV1WixLQUFLLEVBQUU7SUFDbkUsSUFBSSxDQUFDblEsR0FBRyxJQUFJLENBQUM7SUFDYixJQUFJLElBQUksQ0FBQ1ksQ0FBQyxDQUFDdVAsS0FBSyxDQUFDLEVBQUU7TUFDakIsSUFBSSxDQUFDSSxLQUFLLEdBQUcsSUFBSTtNQUNqQjNaLE1BQU0sR0FBRzJYLHVEQUFRLENBQUMsSUFBSSxDQUFDN0QsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUUsSUFBSSxDQUFDb0osR0FBRyxDQUFDLENBQUM7SUFDbkU7SUFDQSxPQUFPcEosTUFBTTtFQUNmLENBQUM7RUFDRCxPQUFPNFosVUFBVTtBQUNuQixDQUFDLENBQUMsQ0FBQztBQUNZLFNBQVNoTCxXQUFXQSxDQUFDNUUsQ0FBQyxFQUFFO0VBQ3JDLE9BQU8sVUFBVThKLEVBQUUsRUFBRTtJQUNuQixPQUFPLElBQUk4RixVQUFVLENBQUM1UCxDQUFDLEVBQUU4SixFQUFFLENBQUM7RUFDOUIsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7O0FDOUJtQztBQUNuQyxJQUFJK0YsSUFBSSxHQUFHLGFBQWEsWUFBWTtFQUNsQyxTQUFTQSxJQUFJQSxDQUFDN1AsQ0FBQyxFQUFFOEosRUFBRSxFQUFFO0lBQ25CLElBQUksQ0FBQ0EsRUFBRSxHQUFHQSxFQUFFO0lBQ1osSUFBSSxDQUFDOUosQ0FBQyxHQUFHQSxDQUFDO0VBQ1o7RUFDQTZQLElBQUksQ0FBQzViLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHbWIsa0RBQU8sQ0FBQ0UsSUFBSTtFQUNsRE8sSUFBSSxDQUFDNWIsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUdtYixrREFBTyxDQUFDcFosTUFBTTtFQUN0RDZaLElBQUksQ0FBQzViLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFVBQVUrQixNQUFNLEVBQUV1WixLQUFLLEVBQUU7SUFDN0QsT0FBTyxJQUFJLENBQUN6RixFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQzlULE1BQU0sRUFBRSxJQUFJLENBQUNnSyxDQUFDLENBQUN1UCxLQUFLLENBQUMsQ0FBQztFQUM1RCxDQUFDO0VBQ0QsT0FBT00sSUFBSTtBQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ0gsSUFBSUMsS0FBSyxHQUFHLFNBQVNBLEtBQUtBLENBQUM5UCxDQUFDLEVBQUU7RUFDNUIsT0FBTyxVQUFVOEosRUFBRSxFQUFFO0lBQ25CLE9BQU8sSUFBSStGLElBQUksQ0FBQzdQLENBQUMsRUFBRThKLEVBQUUsQ0FBQztFQUN4QixDQUFDO0FBQ0gsQ0FBQztBQUNELCtEQUFlZ0csS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJhO0FBQ0o7QUFDTTtBQUNuQyxJQUFJQyxTQUFTLEdBQUcsYUFBYSxZQUFZO0VBQ3ZDLFNBQVNBLFNBQVNBLENBQUNDLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxLQUFLLEVBQUVwRyxFQUFFLEVBQUU7SUFDL0MsSUFBSSxDQUFDa0csT0FBTyxHQUFHQSxPQUFPO0lBQ3RCLElBQUksQ0FBQ0MsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQSxLQUFLO0lBQ2xCLElBQUksQ0FBQ3BHLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQ3FHLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDbEI7RUFDQUosU0FBUyxDQUFDOWIsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUdtYixrREFBTyxDQUFDRSxJQUFJO0VBQ3ZEUyxTQUFTLENBQUM5YixTQUFTLENBQUMscUJBQXFCLENBQUMsR0FBRyxVQUFVK0IsTUFBTSxFQUFFO0lBQzdELElBQUkzTSxHQUFHO0lBQ1AsS0FBS0EsR0FBRyxJQUFJLElBQUksQ0FBQzhtQixNQUFNLEVBQUU7TUFDdkIsSUFBSTNQLG1EQUFJLENBQUNuWCxHQUFHLEVBQUUsSUFBSSxDQUFDOG1CLE1BQU0sQ0FBQyxFQUFFO1FBQzFCbmEsTUFBTSxHQUFHLElBQUksQ0FBQzhULEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOVQsTUFBTSxFQUFFLElBQUksQ0FBQ21hLE1BQU0sQ0FBQzltQixHQUFHLENBQUMsQ0FBQztRQUMvRCxJQUFJMk0sTUFBTSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7VUFDbENBLE1BQU0sR0FBR0EsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1VBQ3JDO1FBQ0Y7TUFDRjtJQUNGO0lBQ0EsSUFBSSxDQUFDbWEsTUFBTSxHQUFHLElBQUk7SUFDbEIsT0FBTyxJQUFJLENBQUNyRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQzlULE1BQU0sQ0FBQztFQUMvQyxDQUFDO0VBQ0QrWixTQUFTLENBQUM5YixTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVK0IsTUFBTSxFQUFFdVosS0FBSyxFQUFFO0lBQ2xFLElBQUlsbUIsR0FBRyxHQUFHLElBQUksQ0FBQzZtQixLQUFLLENBQUNYLEtBQUssQ0FBQztJQUMzQixJQUFJLENBQUNZLE1BQU0sQ0FBQzltQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM4bUIsTUFBTSxDQUFDOW1CLEdBQUcsQ0FBQyxJQUFJLENBQUNBLEdBQUcsRUFBRTRYLHFEQUFNLENBQUMsSUFBSSxDQUFDZ1AsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLElBQUksQ0FBQ0UsTUFBTSxDQUFDOW1CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzJtQixPQUFPLENBQUMsSUFBSSxDQUFDRyxNQUFNLENBQUM5bUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVrbUIsS0FBSyxDQUFDO0lBQzlELE9BQU92WixNQUFNO0VBQ2YsQ0FBQztFQUNELE9BQU8rWixTQUFTO0FBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ1ksU0FBU0ssVUFBVUEsQ0FBQ0osT0FBTyxFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRTtFQUMzRCxPQUFPLFVBQVVwRyxFQUFFLEVBQUU7SUFDbkIsT0FBTyxJQUFJaUcsU0FBUyxDQUFDQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsS0FBSyxFQUFFcEcsRUFBRSxDQUFDO0VBQ3BELENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0Q3FDO0FBQ0Y7QUFDbkMsSUFBSXVHLEtBQUssR0FBRyxhQUFhLFlBQVk7RUFDbkMsU0FBU0EsS0FBS0EsQ0FBQzdKLENBQUMsRUFBRXNELEVBQUUsRUFBRTtJQUNwQixJQUFJLENBQUNBLEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQ3RELENBQUMsR0FBR0EsQ0FBQztJQUNWLElBQUksQ0FBQ2hqQixDQUFDLEdBQUcsQ0FBQztFQUNaO0VBQ0E2c0IsS0FBSyxDQUFDcGMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUdtYixrREFBTyxDQUFDRSxJQUFJO0VBQ25EZSxLQUFLLENBQUNwYyxTQUFTLENBQUMscUJBQXFCLENBQUMsR0FBR21iLGtEQUFPLENBQUNwWixNQUFNO0VBQ3ZEcWEsS0FBSyxDQUFDcGMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsVUFBVStCLE1BQU0sRUFBRXVaLEtBQUssRUFBRTtJQUM5RCxJQUFJLENBQUMvckIsQ0FBQyxJQUFJLENBQUM7SUFDWCxJQUFJOHNCLEdBQUcsR0FBRyxJQUFJLENBQUM5SixDQUFDLEtBQUssQ0FBQyxHQUFHeFEsTUFBTSxHQUFHLElBQUksQ0FBQzhULEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOVQsTUFBTSxFQUFFdVosS0FBSyxDQUFDO0lBQzdFLE9BQU8sSUFBSSxDQUFDL0ksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUNoakIsQ0FBQyxJQUFJLElBQUksQ0FBQ2dqQixDQUFDLEdBQUdtSCx1REFBUSxDQUFDMkMsR0FBRyxDQUFDLEdBQUdBLEdBQUc7RUFDOUQsQ0FBQztFQUNELE9BQU9ELEtBQUs7QUFDZCxDQUFDLENBQUMsQ0FBQztBQUNZLFNBQVNFLE1BQU1BLENBQUMvSixDQUFDLEVBQUU7RUFDaEMsT0FBTyxVQUFVc0QsRUFBRSxFQUFFO0lBQ25CLE9BQU8sSUFBSXVHLEtBQUssQ0FBQzdKLENBQUMsRUFBRXNELEVBQUUsQ0FBQztFQUN6QixDQUFDO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckI2QjtBQUNNO0FBQ25DLElBQUkwRyxPQUFPLEdBQUcsYUFBYSxZQUFZO0VBQ3JDLFNBQVNBLE9BQU9BLENBQUN4USxDQUFDLEVBQUU4SixFQUFFLEVBQUU7SUFDdEIsSUFBSSxDQUFDQSxFQUFFLEdBQUdBLEVBQUU7SUFDWixJQUFJLENBQUM5SixDQUFDLEdBQUdBLENBQUM7SUFDVixJQUFJLENBQUNsWSxHQUFHLEdBQUcsSUFBSTRhLCtDQUFJLENBQUMsQ0FBQztFQUN2QjtFQUNBOE4sT0FBTyxDQUFDdmMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUdtYixrREFBTyxDQUFDRSxJQUFJO0VBQ3JEa0IsT0FBTyxDQUFDdmMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUdtYixrREFBTyxDQUFDcFosTUFBTTtFQUN6RHdhLE9BQU8sQ0FBQ3ZjLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFVBQVUrQixNQUFNLEVBQUV1WixLQUFLLEVBQUU7SUFDaEUsT0FBTyxJQUFJLENBQUN6bkIsR0FBRyxDQUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQ21aLENBQUMsQ0FBQ3VQLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDekYsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM5VCxNQUFNLEVBQUV1WixLQUFLLENBQUMsR0FBR3ZaLE1BQU07RUFDM0YsQ0FBQztFQUNELE9BQU93YSxPQUFPO0FBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ1ksU0FBU0MsUUFBUUEsQ0FBQ3pRLENBQUMsRUFBRTtFQUNsQyxPQUFPLFVBQVU4SixFQUFFLEVBQUU7SUFDbkIsT0FBTyxJQUFJMEcsT0FBTyxDQUFDeFEsQ0FBQyxFQUFFOEosRUFBRSxDQUFDO0VBQzNCLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBLElBQUk0RyxLQUFLLEdBQUcsYUFBYSxZQUFZO0VBQ25DLFNBQVNBLEtBQUtBLENBQUNwakIsRUFBRSxFQUFFO0lBQ2pCLElBQUksQ0FBQzBTLENBQUMsR0FBRzFTLEVBQUU7RUFDYjtFQUNBb2pCLEtBQUssQ0FBQ3pjLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFlBQVk7SUFDakQsTUFBTSxJQUFJa1QsS0FBSyxDQUFDLCtCQUErQixDQUFDO0VBQ2xELENBQUM7RUFDRHVKLEtBQUssQ0FBQ3pjLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLFVBQVU4TCxHQUFHLEVBQUU7SUFDdEQsT0FBT0EsR0FBRztFQUNaLENBQUM7RUFDRDJRLEtBQUssQ0FBQ3pjLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFVBQVU4TCxHQUFHLEVBQUUzVixDQUFDLEVBQUU7SUFDdkQsT0FBTyxJQUFJLENBQUM0VixDQUFDLENBQUNELEdBQUcsRUFBRTNWLENBQUMsQ0FBQztFQUN2QixDQUFDO0VBQ0QsT0FBT3NtQixLQUFLO0FBQ2QsQ0FBQyxDQUFDLENBQUM7QUFDWSxTQUFTQyxNQUFNQSxDQUFDcmpCLEVBQUUsRUFBRTtFQUNqQyxPQUFPLElBQUlvakIsS0FBSyxDQUFDcGpCLEVBQUUsQ0FBQztBQUN0Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCNEM7QUFDQTtBQUNOO0FBQ1Q7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJM0csWUFBWSxHQUFHLGFBQWFvWSwrREFBTyxDQUFDLFNBQVNwWSxZQUFZQSxDQUFDa3FCLEtBQUssRUFBRUMsS0FBSyxFQUFFO0VBQzFFLElBQUlDLE1BQU0sR0FBRyxJQUFJck8sd0RBQUksQ0FBQyxDQUFDO0VBQ3ZCLEtBQUssSUFBSWxmLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3F0QixLQUFLLENBQUNsdUIsTUFBTSxFQUFFYSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ3hDdXRCLE1BQU0sQ0FBQ2xxQixHQUFHLENBQUNncUIsS0FBSyxDQUFDcnRCLENBQUMsQ0FBQyxDQUFDO0VBQ3RCO0VBQ0EsT0FBT290QixvREFBSSxDQUFDdE0sK0RBQU8sQ0FBQ3lNLE1BQU0sQ0FBQ3pwQixHQUFHLENBQUMvRSxJQUFJLENBQUN3dUIsTUFBTSxDQUFDLEVBQUVELEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUMsQ0FBQztBQUNGLCtEQUFlbnFCLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3QmlCO0FBQ1E7QUFDbkI7QUFDSTs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSXFxQixPQUFPLEdBQUcsYUFBYWpTLCtEQUFPLENBQUMsU0FBU2lTLE9BQU9BLENBQUNDLEtBQUssRUFBRUMsTUFBTSxFQUFFO0VBQ2pFLE9BQU9yUCxzREFBTSxDQUFDb1AsS0FBSyxHQUFHLENBQUMsRUFBRSxZQUFZO0lBQ25DLElBQUl0cEIsTUFBTSxHQUFHakYsU0FBUyxDQUFDdXVCLEtBQUssQ0FBQztJQUM3QixJQUFJdHBCLE1BQU0sSUFBSSxJQUFJLElBQUk2WixtRUFBVyxDQUFDN1osTUFBTSxDQUFDdXBCLE1BQU0sQ0FBQyxDQUFDLEVBQUU7TUFDakQsT0FBT3ZwQixNQUFNLENBQUN1cEIsTUFBTSxDQUFDLENBQUNsUSxLQUFLLENBQUNyWixNQUFNLEVBQUU5RSxLQUFLLENBQUNvUixTQUFTLENBQUM0TSxLQUFLLENBQUNyTyxJQUFJLENBQUM5UCxTQUFTLEVBQUUsQ0FBQyxFQUFFdXVCLEtBQUssQ0FBQyxDQUFDO0lBQ3RGO0lBQ0EsTUFBTSxJQUFJenNCLFNBQVMsQ0FBQ2tkLHdEQUFRLENBQUMvWixNQUFNLENBQUMsR0FBRyxpQ0FBaUMsR0FBR3VwQixNQUFNLEdBQUcsR0FBRyxDQUFDO0VBQzFGLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGLCtEQUFlRixPQUFPOzs7Ozs7Ozs7Ozs7OztBQ3hEc0I7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk3RCxFQUFFLEdBQUcsYUFBYXBPLCtEQUFPLENBQUMsU0FBU29PLEVBQUVBLENBQUNnRSxJQUFJLEVBQUU1UixHQUFHLEVBQUU7RUFDbkQsT0FBT0EsR0FBRyxZQUFZNFIsSUFBSSxJQUFJNVIsR0FBRyxJQUFJLElBQUksS0FBS0EsR0FBRyxDQUFDcUUsV0FBVyxLQUFLdU4sSUFBSSxJQUFJQSxJQUFJLENBQUN2RixJQUFJLEtBQUssUUFBUSxJQUFJL3BCLE9BQUEsQ0FBTzBkLEdBQUcsTUFBSyxRQUFRLENBQUM7QUFDOUgsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU0TixFQUFFOzs7Ozs7Ozs7Ozs7Ozs7QUM3QjJCO0FBQ2I7QUFDRTs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJaUUsT0FBTyxHQUFHLGFBQWEvUiwrREFBTyxDQUFDLFNBQVMrUixPQUFPQSxDQUFDaG5CLENBQUMsRUFBRTtFQUNyRCxPQUFPQSxDQUFDLElBQUksSUFBSSxJQUFJMlosc0RBQU0sQ0FBQzNaLENBQUMsRUFBRXVaLHFEQUFLLENBQUN2WixDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUM7QUFDRiwrREFBZWduQixPQUFPOzs7Ozs7Ozs7Ozs7O0FDN0JzQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUl6USxLQUFLLEdBQUcsYUFBYXRCLCtEQUFPLENBQUMsU0FBU3NCLEtBQUtBLENBQUN2VyxDQUFDLEVBQUU7RUFDakQsT0FBT0EsQ0FBQyxJQUFJLElBQUk7QUFDbEIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWV1VyxLQUFLOzs7Ozs7Ozs7Ozs7O0FDdEJlOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk2SCxJQUFJLEdBQUcsYUFBYXdJLHVEQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUMxQywrREFBZXhJLElBQUk7Ozs7Ozs7Ozs7Ozs7O0FDdEJ5QjtBQUNQOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTZJLElBQUksR0FBRyxhQUFhaFMsK0RBQU8sQ0FBQyxTQUFTZ1MsSUFBSUEsQ0FBQ2xQLEdBQUcsRUFBRTtFQUNqRCxPQUFPRix3REFBUSxDQUFDLFlBQVk7SUFDMUIsT0FBT3BmLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzlQLFNBQVMsRUFBRSxDQUFDLENBQUM7RUFDakQsQ0FBQyxFQUFFeWYsR0FBRyxDQUFDO0FBQ1QsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVrUCxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7QUN6QnlCO0FBQ047QUFDZ0I7O0FBRXREO0FBQ0EsSUFBSUMsVUFBVSxHQUFHLEVBQUUsYUFBYTtFQUM5QjVQLFFBQVEsRUFBRTtBQUNaLENBQUMsQ0FBQzZQLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztBQUNsQyxJQUFJQyxrQkFBa0IsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztBQUM1STtBQUNBLElBQUlDLGNBQWMsR0FBRyxhQUFhLFlBQVk7RUFDNUMsWUFBWTs7RUFFWixPQUFPL3VCLFNBQVMsQ0FBQzZ1QixvQkFBb0IsQ0FBQyxRQUFRLENBQUM7QUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDSCxJQUFJRyxRQUFRLEdBQUcsU0FBU0EsUUFBUUEsQ0FBQ3ZTLElBQUksRUFBRTNVLElBQUksRUFBRTtFQUMzQyxJQUFJNFUsR0FBRyxHQUFHLENBQUM7RUFDWCxPQUFPQSxHQUFHLEdBQUdELElBQUksQ0FBQ3hjLE1BQU0sRUFBRTtJQUN4QixJQUFJd2MsSUFBSSxDQUFDQyxHQUFHLENBQUMsS0FBSzVVLElBQUksRUFBRTtNQUN0QixPQUFPLElBQUk7SUFDYjtJQUNBNFUsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU8sS0FBSztBQUNkLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSW5jLElBQUksR0FBRyxPQUFPWixNQUFNLENBQUNZLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQ3d1QixjQUFjLEdBQUcsYUFBYXBTLCtEQUFPLENBQUMsU0FBU3BjLElBQUlBLENBQUNzZCxHQUFHLEVBQUU7RUFDeEcsT0FBT2xlLE1BQU0sQ0FBQ2tlLEdBQUcsQ0FBQyxLQUFLQSxHQUFHLEdBQUcsRUFBRSxHQUFHbGUsTUFBTSxDQUFDWSxJQUFJLENBQUNzZCxHQUFHLENBQUM7QUFDcEQsQ0FBQyxDQUFDLEdBQUcsYUFBYWxCLCtEQUFPLENBQUMsU0FBU3BjLElBQUlBLENBQUNzZCxHQUFHLEVBQUU7RUFDM0MsSUFBSWxlLE1BQU0sQ0FBQ2tlLEdBQUcsQ0FBQyxLQUFLQSxHQUFHLEVBQUU7SUFDdkIsT0FBTyxFQUFFO0VBQ1g7RUFDQSxJQUFJRCxJQUFJLEVBQUVxUixJQUFJO0VBQ2QsSUFBSUMsRUFBRSxHQUFHLEVBQUU7RUFDWCxJQUFJQyxlQUFlLEdBQUdKLGNBQWMsSUFBSWpPLG9FQUFZLENBQUNqRCxHQUFHLENBQUM7RUFDekQsS0FBS0QsSUFBSSxJQUFJQyxHQUFHLEVBQUU7SUFDaEIsSUFBSUMsNERBQUksQ0FBQ0YsSUFBSSxFQUFFQyxHQUFHLENBQUMsS0FBSyxDQUFDc1IsZUFBZSxJQUFJdlIsSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFO01BQzlEc1IsRUFBRSxDQUFDQSxFQUFFLENBQUNqdkIsTUFBTSxDQUFDLEdBQUcyZCxJQUFJO0lBQ3RCO0VBQ0Y7RUFDQSxJQUFJZ1IsVUFBVSxFQUFFO0lBQ2RLLElBQUksR0FBR0gsa0JBQWtCLENBQUM3dUIsTUFBTSxHQUFHLENBQUM7SUFDcEMsT0FBT2d2QixJQUFJLElBQUksQ0FBQyxFQUFFO01BQ2hCclIsSUFBSSxHQUFHa1Isa0JBQWtCLENBQUNHLElBQUksQ0FBQztNQUMvQixJQUFJblIsNERBQUksQ0FBQ0YsSUFBSSxFQUFFQyxHQUFHLENBQUMsSUFBSSxDQUFDbVIsUUFBUSxDQUFDRSxFQUFFLEVBQUV0UixJQUFJLENBQUMsRUFBRTtRQUMxQ3NSLEVBQUUsQ0FBQ0EsRUFBRSxDQUFDanZCLE1BQU0sQ0FBQyxHQUFHMmQsSUFBSTtNQUN0QjtNQUNBcVIsSUFBSSxJQUFJLENBQUM7SUFDWDtFQUNGO0VBQ0EsT0FBT0MsRUFBRTtBQUNYLENBQUMsQ0FBQztBQUNGLCtEQUFlM3VCLElBQUk7Ozs7Ozs7Ozs7Ozs7O0FDdEV5QjtBQUNqQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk2dUIsSUFBSSxHQUFHLGFBQWEvUywrREFBTyxDQUFDLFNBQVMrUyxJQUFJQSxDQUFDQyxNQUFNLEVBQUVDLE1BQU0sRUFBRTtFQUM1RCxPQUFPLFVBQVVDLFdBQVcsRUFBRTtJQUM1QixPQUFPLFVBQVV0cUIsTUFBTSxFQUFFO01BQ3ZCLE9BQU80QyxtREFBRyxDQUFDLFVBQVUybkIsS0FBSyxFQUFFO1FBQzFCLE9BQU9GLE1BQU0sQ0FBQ0UsS0FBSyxFQUFFdnFCLE1BQU0sQ0FBQztNQUM5QixDQUFDLEVBQUVzcUIsV0FBVyxDQUFDRixNQUFNLENBQUNwcUIsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0VBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQztBQUNGLCtEQUFlbXFCLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQ3lCO0FBQ0w7QUFDVjtBQUNXOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSUssUUFBUSxHQUFHLGFBQWE5UywrREFBTyxDQUFDLFNBQVM4UyxRQUFRQSxDQUFDOU8sQ0FBQyxFQUFFO0VBQ3ZELE9BQU95TyxvREFBSSxDQUFDLFVBQVV2UyxHQUFHLEVBQUU7SUFDekIsT0FBTytGLDZEQUFLLENBQUNqQyxDQUFDLEVBQUU5RCxHQUFHLENBQUM7RUFDdEIsQ0FBQyxFQUFFYSx5REFBUyxDQUFDaUQsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU4TyxRQUFROzs7Ozs7Ozs7Ozs7O0FDbkNxQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsRUFBRSxHQUFHLGFBQWFyVCwrREFBTyxDQUFDLFNBQVNxVCxFQUFFQSxDQUFDL1EsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDOUMsT0FBT0QsQ0FBQyxHQUFHQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU4USxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUJxQztBQUNWO0FBQ1k7QUFDbEI7QUFDRTtBQUNQO0FBQ0o7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJN25CLEdBQUcsR0FBRyxhQUFhd1UsK0RBQU8sQ0FBRSxhQUFhQyxxRUFBYSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEVBQUU4USx5REFBSyxFQUFFLFNBQVN2bEIsR0FBR0EsQ0FBQytDLEVBQUUsRUFBRXNmLE9BQU8sRUFBRTtFQUN2SCxRQUFRdnFCLE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQ3lOLFFBQVEsQ0FBQ2xQLElBQUksQ0FBQ29hLE9BQU8sQ0FBQztJQUM3QyxLQUFLLG1CQUFtQjtNQUN0QixPQUFPL0ssc0RBQU0sQ0FBQytLLE9BQU8sQ0FBQ2pxQixNQUFNLEVBQUUsWUFBWTtRQUN4QyxPQUFPMkssRUFBRSxDQUFDa0YsSUFBSSxDQUFDLElBQUksRUFBRW9hLE9BQU8sQ0FBQzVMLEtBQUssQ0FBQyxJQUFJLEVBQUV0ZSxTQUFTLENBQUMsQ0FBQztNQUN0RCxDQUFDLENBQUM7SUFDSixLQUFLLGlCQUFpQjtNQUNwQixPQUFPMmhCLG9FQUFZLENBQUMsVUFBVXRFLEdBQUcsRUFBRTFXLEdBQUcsRUFBRTtRQUN0QzBXLEdBQUcsQ0FBQzFXLEdBQUcsQ0FBQyxHQUFHaUUsRUFBRSxDQUFDc2YsT0FBTyxDQUFDdmpCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE9BQU8wVyxHQUFHO01BQ1osQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFOWMsb0RBQUksQ0FBQzJwQixPQUFPLENBQUMsQ0FBQztJQUN2QjtNQUNFLE9BQU9oTCw0REFBSSxDQUFDdFUsRUFBRSxFQUFFc2YsT0FBTyxDQUFDO0VBQzVCO0FBQ0YsQ0FBQyxDQUFDLENBQUM7QUFDSCwrREFBZXJpQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7QUMxRG9DO0FBQ1Y7QUFDZjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSThuQixhQUFhLEdBQUcsYUFBYXRULCtEQUFPLENBQUMsU0FBU3NULGFBQWFBLENBQUMva0IsRUFBRSxFQUFFaVQsR0FBRyxFQUFFO0VBQ3ZFLE9BQU84RCxvRUFBWSxDQUFDLFVBQVV0RSxHQUFHLEVBQUUxVyxHQUFHLEVBQUU7SUFDdEMwVyxHQUFHLENBQUMxVyxHQUFHLENBQUMsR0FBR2lFLEVBQUUsQ0FBQ2lULEdBQUcsQ0FBQ2xYLEdBQUcsQ0FBQyxFQUFFQSxHQUFHLEVBQUVrWCxHQUFHLENBQUM7SUFDakMsT0FBT1IsR0FBRztFQUNaLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTljLG9EQUFJLENBQUNzZCxHQUFHLENBQUMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFDRiwrREFBZThSLGFBQWE7Ozs7Ozs7Ozs7Ozs7OztBQy9CZ0I7QUFDUDs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUl2USxHQUFHLEdBQUcsYUFBYS9DLCtEQUFPLENBQUMsU0FBUytDLEdBQUdBLENBQUNULENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ2hELElBQUlELENBQUMsS0FBS0MsQ0FBQyxFQUFFO0lBQ1gsT0FBT0EsQ0FBQztFQUNWO0VBQ0EsU0FBU2dSLE9BQU9BLENBQUNsb0IsQ0FBQyxFQUFFRSxDQUFDLEVBQUU7SUFDckIsSUFBSUYsQ0FBQyxHQUFHRSxDQUFDLEtBQUtBLENBQUMsR0FBR0YsQ0FBQyxFQUFFO01BQ25CLE9BQU9FLENBQUMsR0FBR0YsQ0FBQyxHQUFHRSxDQUFDLEdBQUdGLENBQUM7SUFDdEI7SUFDQSxPQUFPdkcsU0FBUztFQUNsQjtFQUNBLElBQUkwdUIsVUFBVSxHQUFHRCxPQUFPLENBQUNqUixDQUFDLEVBQUVDLENBQUMsQ0FBQztFQUM5QixJQUFJaVIsVUFBVSxLQUFLMXVCLFNBQVMsRUFBRTtJQUM1QixPQUFPMHVCLFVBQVU7RUFDbkI7RUFDQSxJQUFJQyxTQUFTLEdBQUdGLE9BQU8sQ0FBQXp3QixPQUFBLENBQVF3ZixDQUFDLEdBQUF4ZixPQUFBLENBQVN5ZixDQUFDLEVBQUM7RUFDM0MsSUFBSWtSLFNBQVMsS0FBSzN1QixTQUFTLEVBQUU7SUFDM0IsT0FBTzJ1QixTQUFTLEtBQUEzd0IsT0FBQSxDQUFZd2YsQ0FBQyxJQUFHQSxDQUFDLEdBQUdDLENBQUM7RUFDdkM7RUFDQSxJQUFJbVIsT0FBTyxHQUFHL1Esd0RBQVEsQ0FBQ0wsQ0FBQyxDQUFDO0VBQ3pCLElBQUlxUixnQkFBZ0IsR0FBR0osT0FBTyxDQUFDRyxPQUFPLEVBQUUvUSx3REFBUSxDQUFDSixDQUFDLENBQUMsQ0FBQztFQUNwRCxJQUFJb1IsZ0JBQWdCLEtBQUs3dUIsU0FBUyxFQUFFO0lBQ2xDLE9BQU82dUIsZ0JBQWdCLEtBQUtELE9BQU8sR0FBR3BSLENBQUMsR0FBR0MsQ0FBQztFQUM3QztFQUNBLE9BQU9BLENBQUM7QUFDVixDQUFDLENBQUM7QUFDRiwrREFBZVEsR0FBRzs7Ozs7Ozs7Ozs7Ozs7O0FDN0N3QjtBQUNFO0FBQ047O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJNlEsV0FBVyxHQUFHLGFBQWE1VCwrREFBTyxDQUFDLFNBQVM0VCxXQUFXQSxDQUFDQyxNQUFNLEVBQUV0bEIsRUFBRSxFQUFFO0VBQ3RFLElBQUl1bEIsS0FBSyxHQUFHLENBQUMsQ0FBQztFQUNkLE9BQU8vUiw4REFBTSxDQUFDeFQsRUFBRSxDQUFDM0ssTUFBTSxFQUFFLFlBQVk7SUFDbkMsSUFBSTBHLEdBQUcsR0FBR3VwQixNQUFNLENBQUM1UixLQUFLLENBQUMsSUFBSSxFQUFFdGUsU0FBUyxDQUFDO0lBQ3ZDLElBQUksQ0FBQzhkLDREQUFJLENBQUNuWCxHQUFHLEVBQUV3cEIsS0FBSyxDQUFDLEVBQUU7TUFDckJBLEtBQUssQ0FBQ3hwQixHQUFHLENBQUMsR0FBR2lFLEVBQUUsQ0FBQzBULEtBQUssQ0FBQyxJQUFJLEVBQUV0ZSxTQUFTLENBQUM7SUFDeEM7SUFDQSxPQUFPbXdCLEtBQUssQ0FBQ3hwQixHQUFHLENBQUM7RUFDbkIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0YsK0RBQWVzcEIsV0FBVzs7Ozs7Ozs7Ozs7Ozs7QUNwRGtCO0FBQ1M7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlJLGNBQWMsR0FBRyxhQUFhaFUsK0RBQU8sQ0FBQyxTQUFTZ1UsY0FBY0EsQ0FBQ0MsSUFBSSxFQUFFQyxJQUFJLEVBQUU7RUFDNUUsT0FBT0gsZ0VBQWdCLENBQUMsVUFBVTV2QixDQUFDLEVBQUVnd0IsSUFBSSxFQUFFQyxJQUFJLEVBQUU7SUFDL0MsT0FBT0EsSUFBSTtFQUNiLENBQUMsRUFBRUgsSUFBSSxFQUFFQyxJQUFJLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVGLGNBQWM7Ozs7Ozs7Ozs7Ozs7OztBQzdCZTtBQUNJO0FBQ0g7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUQsZ0JBQWdCLEdBQUcsYUFBYTNTLCtEQUFPLENBQUMsU0FBUzJTLGdCQUFnQkEsQ0FBQ3hsQixFQUFFLEVBQUUwbEIsSUFBSSxFQUFFQyxJQUFJLEVBQUU7RUFDcEYsT0FBT0csNERBQVksQ0FBQyxVQUFVbHdCLENBQUMsRUFBRWd3QixJQUFJLEVBQUVDLElBQUksRUFBRTtJQUMzQyxJQUFJMVAsaUVBQVMsQ0FBQ3lQLElBQUksQ0FBQyxJQUFJelAsaUVBQVMsQ0FBQzBQLElBQUksQ0FBQyxFQUFFO01BQ3RDLE9BQU9MLGdCQUFnQixDQUFDeGxCLEVBQUUsRUFBRTRsQixJQUFJLEVBQUVDLElBQUksQ0FBQztJQUN6QyxDQUFDLE1BQU07TUFDTCxPQUFPN2xCLEVBQUUsQ0FBQ3BLLENBQUMsRUFBRWd3QixJQUFJLEVBQUVDLElBQUksQ0FBQztJQUMxQjtFQUNGLENBQUMsRUFBRUgsSUFBSSxFQUFFQyxJQUFJLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVILGdCQUFnQjs7Ozs7Ozs7Ozs7Ozs7QUN6Q3lCO0FBQ1o7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJTyxTQUFTLEdBQUcsYUFBYXRVLCtEQUFPLENBQUMsU0FBU3NVLFNBQVNBLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQzVELE9BQU92RyxxRUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFdUcsQ0FBQyxFQUFFRCxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVELFNBQVM7Ozs7Ozs7Ozs7Ozs7O0FDN0JnQztBQUNaOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUcsVUFBVSxHQUFHLGFBQWF6VSwrREFBTyxDQUFDLFNBQVN5VSxVQUFVQSxDQUFDRixDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUM5RCxPQUFPdkcscUVBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRXNHLENBQUMsRUFBRUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUNGLCtEQUFlQyxVQUFVOzs7Ozs7Ozs7Ozs7OztBQzdCbUI7QUFDQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlDLFNBQVMsR0FBRyxhQUFhdFQsK0RBQU8sQ0FBQyxTQUFTc1QsU0FBU0EsQ0FBQ25tQixFQUFFLEVBQUVnbUIsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEUsT0FBT0gsNERBQVksQ0FBQyxVQUFVaHhCLENBQUMsRUFBRXN4QixFQUFFLEVBQUVDLEVBQUUsRUFBRTtJQUN2QyxPQUFPcm1CLEVBQUUsQ0FBQ29tQixFQUFFLEVBQUVDLEVBQUUsQ0FBQztFQUNuQixDQUFDLEVBQUVMLENBQUMsRUFBRUMsQ0FBQyxDQUFDO0FBQ1YsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVFLFNBQVM7Ozs7Ozs7Ozs7Ozs7O0FDL0JvQjtBQUNOOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlMLFlBQVksR0FBRyxhQUFhalQsK0RBQU8sQ0FBQyxTQUFTaVQsWUFBWUEsQ0FBQzlsQixFQUFFLEVBQUVnbUIsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDdEUsSUFBSXZkLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJOVMsQ0FBQztFQUNMb3dCLENBQUMsR0FBR0EsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNYQyxDQUFDLEdBQUdBLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDWCxLQUFLcndCLENBQUMsSUFBSW93QixDQUFDLEVBQUU7SUFDWCxJQUFJOVMsNERBQUksQ0FBQ3RkLENBQUMsRUFBRW93QixDQUFDLENBQUMsRUFBRTtNQUNkdGQsTUFBTSxDQUFDOVMsQ0FBQyxDQUFDLEdBQUdzZCw0REFBSSxDQUFDdGQsQ0FBQyxFQUFFcXdCLENBQUMsQ0FBQyxHQUFHam1CLEVBQUUsQ0FBQ3BLLENBQUMsRUFBRW93QixDQUFDLENBQUNwd0IsQ0FBQyxDQUFDLEVBQUVxd0IsQ0FBQyxDQUFDcndCLENBQUMsQ0FBQyxDQUFDLEdBQUdvd0IsQ0FBQyxDQUFDcHdCLENBQUMsQ0FBQztJQUNuRDtFQUNGO0VBQ0EsS0FBS0EsQ0FBQyxJQUFJcXdCLENBQUMsRUFBRTtJQUNYLElBQUkvUyw0REFBSSxDQUFDdGQsQ0FBQyxFQUFFcXdCLENBQUMsQ0FBQyxJQUFJLENBQUMvUyw0REFBSSxDQUFDdGQsQ0FBQyxFQUFFOFMsTUFBTSxDQUFDLEVBQUU7TUFDbENBLE1BQU0sQ0FBQzlTLENBQUMsQ0FBQyxHQUFHcXdCLENBQUMsQ0FBQ3J3QixDQUFDLENBQUM7SUFDbEI7RUFDRjtFQUNBLE9BQU84UyxNQUFNO0FBQ2YsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVvZCxZQUFZOzs7Ozs7Ozs7Ozs7O0FDN0NpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJUSxJQUFJLEdBQUcsYUFBYTdVLCtEQUFPLENBQUMsU0FBUzZVLElBQUlBLENBQUNDLEtBQUssRUFBRXRULEdBQUcsRUFBRTtFQUN4RCxJQUFJdkssTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUlRLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFJNEksR0FBRyxHQUFHLENBQUM7RUFDWCxJQUFJdUYsR0FBRyxHQUFHa1AsS0FBSyxDQUFDbHhCLE1BQU07RUFDdEIsT0FBT3ljLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQm5PLEtBQUssQ0FBQ3FkLEtBQUssQ0FBQ3pVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNyQkEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLEtBQUssSUFBSWtCLElBQUksSUFBSUMsR0FBRyxFQUFFO0lBQ3BCLElBQUksQ0FBQy9KLEtBQUssQ0FBQ3VSLGNBQWMsQ0FBQ3pILElBQUksQ0FBQyxFQUFFO01BQy9CdEssTUFBTSxDQUFDc0ssSUFBSSxDQUFDLEdBQUdDLEdBQUcsQ0FBQ0QsSUFBSSxDQUFDO0lBQzFCO0VBQ0Y7RUFDQSxPQUFPdEssTUFBTTtBQUNmLENBQUMsQ0FBQztBQUNGLCtEQUFlNGQsSUFBSTs7Ozs7Ozs7Ozs7Ozs7QUNsQ3VCO0FBQ0U7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUUsSUFBSSxHQUFHLGFBQWF6VSwrREFBTyxDQUFDLFNBQVN5VSxJQUFJQSxDQUFDeG1CLEVBQUUsRUFBRTtFQUNoRCxJQUFJeW1CLE1BQU0sR0FBRyxLQUFLO0VBQ2xCLElBQUkvZCxNQUFNO0VBQ1YsT0FBTzhLLDhEQUFNLENBQUN4VCxFQUFFLENBQUMzSyxNQUFNLEVBQUUsWUFBWTtJQUNuQyxJQUFJb3hCLE1BQU0sRUFBRTtNQUNWLE9BQU8vZCxNQUFNO0lBQ2Y7SUFDQStkLE1BQU0sR0FBRyxJQUFJO0lBQ2IvZCxNQUFNLEdBQUcxSSxFQUFFLENBQUMwVCxLQUFLLENBQUMsSUFBSSxFQUFFdGUsU0FBUyxDQUFDO0lBQ2xDLE9BQU9zVCxNQUFNO0VBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBQ0YsK0RBQWU4ZCxJQUFJOzs7Ozs7Ozs7Ozs7O0FDbEN5Qjs7QUFFNUM7QUFDQTtBQUNBLElBQUlFLFNBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFhNXBCLENBQUMsRUFBRTtFQUMxQixPQUFPO0lBQ0wvRixLQUFLLEVBQUUrRixDQUFDO0lBQ1JHLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFZeVYsQ0FBQyxFQUFFO01BQ2hCLE9BQU9nVSxTQUFRLENBQUNoVSxDQUFDLENBQUM1VixDQUFDLENBQUMsQ0FBQztJQUN2QjtFQUNGLENBQUM7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTZwQixJQUFJLEdBQUcsYUFBYTlULCtEQUFPLENBQUMsU0FBUzhULElBQUlBLENBQUNuQyxJQUFJLEVBQUU5UixDQUFDLEVBQUU1VixDQUFDLEVBQUU7RUFDeEQ7RUFDQTtFQUNBO0VBQ0EsT0FBTzBuQixJQUFJLENBQUMsVUFBVXhuQixDQUFDLEVBQUU7SUFDdkIsT0FBTzBwQixTQUFRLENBQUNoVSxDQUFDLENBQUMxVixDQUFDLENBQUMsQ0FBQztFQUN2QixDQUFDLENBQUMsQ0FBQ0YsQ0FBQyxDQUFDLENBQUMvRixLQUFLO0FBQ2IsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU0dkIsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0FDM0NjO0FBQ0o7QUFDSTs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsU0FBUyxHQUFHLGFBQWE3QyxvREFBSSxDQUFDLENBQUNwc0Isa0RBQU0sRUFBRXNwQixrREFBTSxDQUFDLENBQUM7QUFDbkQsK0RBQWUyRixTQUFTOzs7Ozs7Ozs7Ozs7OztBQzdCb0I7QUFDSjs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk3WixJQUFJLEdBQUcsYUFBYTBFLCtEQUFPLENBQUN1Ryx5REFBSyxDQUFDO0FBQ3RDLCtEQUFlakwsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0FDN0J5QjtBQUNKO0FBQ0Q7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSThaLE1BQU0sR0FBRyxhQUFhaFUsK0RBQU8sQ0FBQyxTQUFTZ1UsTUFBTUEsQ0FBQzNSLENBQUMsRUFBRWEsQ0FBQyxFQUFFOUMsR0FBRyxFQUFFO0VBQzNELE9BQU9nQyx5REFBUyxDQUFDQyxDQUFDLEVBQUU4Qyw2REFBSyxDQUFDakMsQ0FBQyxFQUFFOUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBQ0YsK0RBQWU0VCxNQUFNOzs7Ozs7Ozs7Ozs7O0FDMUJ1Qjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsSUFBSSxHQUFHLGFBQWFyViwrREFBTyxDQUFDLFNBQVNxVixJQUFJQSxDQUFDUCxLQUFLLEVBQUV0VCxHQUFHLEVBQUU7RUFDeEQsSUFBSXZLLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJb0osR0FBRyxHQUFHLENBQUM7RUFDWCxPQUFPQSxHQUFHLEdBQUd5VSxLQUFLLENBQUNseEIsTUFBTSxFQUFFO0lBQ3pCLElBQUlreEIsS0FBSyxDQUFDelUsR0FBRyxDQUFDLElBQUltQixHQUFHLEVBQUU7TUFDckJ2SyxNQUFNLENBQUM2ZCxLQUFLLENBQUN6VSxHQUFHLENBQUMsQ0FBQyxHQUFHbUIsR0FBRyxDQUFDc1QsS0FBSyxDQUFDelUsR0FBRyxDQUFDLENBQUM7SUFDdEM7SUFDQUEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU9wSixNQUFNO0FBQ2YsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVvZSxJQUFJOzs7Ozs7Ozs7Ozs7O0FDL0J5Qjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlDLE1BQU0sR0FBRyxhQUFhdFYsK0RBQU8sQ0FBQyxTQUFTc1YsTUFBTUEsQ0FBQ3hGLElBQUksRUFBRXRPLEdBQUcsRUFBRTtFQUMzRCxJQUFJdkssTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNmLEtBQUssSUFBSXNLLElBQUksSUFBSUMsR0FBRyxFQUFFO0lBQ3BCLElBQUlzTyxJQUFJLENBQUN0TyxHQUFHLENBQUNELElBQUksQ0FBQyxFQUFFQSxJQUFJLEVBQUVDLEdBQUcsQ0FBQyxFQUFFO01BQzlCdkssTUFBTSxDQUFDc0ssSUFBSSxDQUFDLEdBQUdDLEdBQUcsQ0FBQ0QsSUFBSSxDQUFDO0lBQzFCO0VBQ0Y7RUFDQSxPQUFPdEssTUFBTTtBQUNmLENBQUMsQ0FBQztBQUNGLCtEQUFlcWUsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O0FDL0J1QjtBQUNqQjtBQUNFOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJdFMsS0FBSyxHQUFHLGFBQWFoRCwrREFBTyxDQUFDLFNBQVNnRCxLQUFLQSxDQUFDc0IsQ0FBQyxFQUFFbEUsSUFBSSxFQUFFO0VBQ3ZELE9BQU81VSxtREFBRyxDQUFDK1Ysb0RBQUksQ0FBQytDLENBQUMsQ0FBQyxFQUFFbEUsSUFBSSxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQUNGLCtEQUFlNEMsS0FBSzs7Ozs7Ozs7Ozs7Ozs7QUNsQ3dCO0FBQ0E7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJdVMsT0FBTyxHQUFHLGFBQWF2ViwrREFBTyxDQUFDLFNBQVN1VixPQUFPQSxDQUFDcFUsRUFBRSxFQUFFZixJQUFJLEVBQUU7RUFDNUQsT0FBT08sK0RBQU8sQ0FBQyxDQUFDUSxFQUFFLENBQUMsRUFBRWYsSUFBSSxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQUNGLCtEQUFlbVYsT0FBTzs7Ozs7Ozs7Ozs7Ozs7O0FDdkJzQjtBQUNNO0FBQ1o7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJaFUsSUFBSSxHQUFHLGFBQWF2QiwrREFBTyxDQUFDLFNBQVN1QixJQUFJQSxDQUFDK0MsQ0FBQyxFQUFFOUMsR0FBRyxFQUFFO0VBQ3BELElBQUlBLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDZjtFQUNGO0VBQ0EsT0FBT0Usa0VBQVUsQ0FBQzRDLENBQUMsQ0FBQyxHQUFHd0osNERBQUksQ0FBQ3hKLENBQUMsRUFBRTlDLEdBQUcsQ0FBQyxHQUFHQSxHQUFHLENBQUM4QyxDQUFDLENBQUM7QUFDOUMsQ0FBQyxDQUFDO0FBQ0YsK0RBQWUvQyxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7QUNoQ3lCO0FBQ2Y7QUFDSTs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSWlVLE1BQU0sR0FBRyxhQUFhcFUsK0RBQU8sQ0FBQyxTQUFTb1UsTUFBTUEsQ0FBQ2hWLEdBQUcsRUFBRXFNLElBQUksRUFBRXJMLEdBQUcsRUFBRTtFQUNoRSxPQUFPd0Qsc0RBQU0sQ0FBQ3hFLEdBQUcsRUFBRWUsb0RBQUksQ0FBQ3NMLElBQUksRUFBRXJMLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUNGLCtEQUFlZ1UsTUFBTTs7Ozs7Ozs7Ozs7Ozs7QUNsQ3VCO0FBQ2Y7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUkvZ0IsS0FBSyxHQUFHLGFBQWF1TCwrREFBTyxDQUFDLFNBQVN2TCxLQUFLQSxDQUFDZ2hCLEVBQUUsRUFBRWpVLEdBQUcsRUFBRTtFQUN2RCxPQUFPaVUsRUFBRSxDQUFDanFCLEdBQUcsQ0FBQyxVQUFVOFksQ0FBQyxFQUFFO0lBQ3pCLE9BQU8vQyxvREFBSSxDQUFDK0MsQ0FBQyxFQUFFOUMsR0FBRyxDQUFDO0VBQ3JCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGLCtEQUFlL00sS0FBSzs7Ozs7Ozs7Ozs7Ozs7O0FDN0J3QjtBQUNFO0FBQ0o7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSXdPLE1BQU0sR0FBRyxhQUFhN0IsK0RBQU8sQ0FBQyxVQUFVMkosRUFBRSxFQUFFL0osR0FBRyxFQUFFWixJQUFJLEVBQUU7RUFDekQsT0FBT2dRLGdFQUFRLENBQUMsT0FBT3JGLEVBQUUsS0FBSyxVQUFVLEdBQUc2Ryw4REFBTSxDQUFDN0csRUFBRSxDQUFDLEdBQUdBLEVBQUUsRUFBRS9KLEdBQUcsRUFBRVosSUFBSSxDQUFDO0FBQ3hFLENBQUMsQ0FBQztBQUNGLCtEQUFlNkMsTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRHFCO0FBQ0U7QUFDWTtBQUNsQjtBQUNRO0FBQ0E7QUFDSTtBQUNSOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSW1ELFFBQVEsR0FBRyxhQUFhN0MsK0RBQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWF0RCxxRUFBYSxDQUFDLEVBQUUsRUFBRW9SLDhEQUFVLEVBQUUsU0FBU2pMLFFBQVFBLENBQUM2SyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsS0FBSyxFQUFFL1EsSUFBSSxFQUFFO0VBQ3RJLElBQUkySyxFQUFFLEdBQUc2Ryw4REFBTSxDQUFDLFVBQVU1USxHQUFHLEVBQUVnRyxHQUFHLEVBQUU7SUFDbEMsSUFBSTFjLEdBQUcsR0FBRzZtQixLQUFLLENBQUNuSyxHQUFHLENBQUM7SUFDcEIsSUFBSTFoQixLQUFLLEdBQUcyckIsT0FBTyxDQUFDeFAsNERBQUksQ0FBQ25YLEdBQUcsRUFBRTBXLEdBQUcsQ0FBQyxHQUFHQSxHQUFHLENBQUMxVyxHQUFHLENBQUMsR0FBRzRYLDhEQUFNLENBQUNnUCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUVsSyxHQUFHLENBQUM7SUFDN0UsSUFBSTFoQixLQUFLLElBQUlBLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO01BQzFDLE9BQU9zcEIsZ0VBQVEsQ0FBQzVOLEdBQUcsQ0FBQztJQUN0QjtJQUNBQSxHQUFHLENBQUMxVyxHQUFHLENBQUMsR0FBR2hGLEtBQUs7SUFDaEIsT0FBTzBiLEdBQUc7RUFDWixDQUFDLENBQUM7RUFDRixPQUFPb1AsZ0VBQVEsQ0FBQ3JGLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTNLLElBQUksQ0FBQztBQUMvQixDQUFDLENBQUMsQ0FBQztBQUNILCtEQUFlZ0csUUFBUTs7Ozs7Ozs7Ozs7Ozs7O0FDakU2QjtBQUNSO0FBQ1g7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlvSixNQUFNLEdBQUcsYUFBYXhQLCtEQUFPLENBQUMsU0FBU3dQLE1BQU1BLENBQUNuTixJQUFJLEVBQUVvRCxVQUFVLEVBQUU7RUFDbEUsT0FBT3ZmLHNEQUFNLENBQUNra0IsbUVBQVcsQ0FBQy9ILElBQUksQ0FBQyxFQUFFb0QsVUFBVSxDQUFDO0FBQzlDLENBQUMsQ0FBQztBQUNGLCtEQUFlK0osTUFBTTs7Ozs7Ozs7Ozs7OztBQy9CdUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJdkQsTUFBTSxHQUFHLGFBQWE3SywrREFBTyxDQUFDLFNBQVM2SyxNQUFNQSxDQUFDeUosS0FBSyxFQUFFeHVCLEtBQUssRUFBRWtaLElBQUksRUFBRTtFQUNwRSxJQUFJbkosTUFBTSxHQUFHblQsS0FBSyxDQUFDb1IsU0FBUyxDQUFDNE0sS0FBSyxDQUFDck8sSUFBSSxDQUFDMk0sSUFBSSxFQUFFLENBQUMsQ0FBQztFQUNoRG5KLE1BQU0sQ0FBQ1UsTUFBTSxDQUFDK2QsS0FBSyxFQUFFeHVCLEtBQUssQ0FBQztFQUMzQixPQUFPK1AsTUFBTTtBQUNmLENBQUMsQ0FBQztBQUNGLCtEQUFlZ1YsTUFBTTs7Ozs7Ozs7Ozs7Ozs7QUMzQnVCO0FBQ0k7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUkwSixPQUFPLEdBQUcsYUFBYXJWLCtEQUFPLENBQUMsU0FBU3FWLE9BQU9BLENBQUN2VixJQUFJLEVBQUU7RUFDeEQsT0FBT3NDLGlFQUFTLENBQUN0QyxJQUFJLENBQUMsR0FBR0EsSUFBSSxDQUFDd1YsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDbE0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHM2xCLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzJNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQ3VWLE9BQU8sQ0FBQyxDQUFDO0FBQzVHLENBQUMsQ0FBQztBQUNGLCtEQUFlQSxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7QUM5QnNCO0FBQ1g7QUFDSjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJNXNCLEdBQUcsR0FBRyxhQUFhcVksK0RBQU8sQ0FBQyxTQUFTclksR0FBR0EsQ0FBQ2dxQixJQUFJLEVBQUVyUCxDQUFDLEVBQUVyWSxDQUFDLEVBQUU7RUFDdEQsT0FBTzZwQixvREFBSSxDQUFDbkMsSUFBSSxFQUFFeFMsc0RBQU0sQ0FBQ21ELENBQUMsQ0FBQyxFQUFFclksQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQztBQUNGLCtEQUFldEMsR0FBRzs7Ozs7Ozs7Ozs7Ozs7QUM3QjBDO0FBQ2hCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJK1ksS0FBSyxHQUFHLGFBQWFWLCtEQUFPLENBQUUsYUFBYTZFLHVFQUFlLENBQUMsT0FBTyxFQUFFLFNBQVNuRSxLQUFLQSxDQUFDK1QsU0FBUyxFQUFFQyxPQUFPLEVBQUUxVixJQUFJLEVBQUU7RUFDL0csT0FBT3RjLEtBQUssQ0FBQ29SLFNBQVMsQ0FBQzRNLEtBQUssQ0FBQ3JPLElBQUksQ0FBQzJNLElBQUksRUFBRXlWLFNBQVMsRUFBRUMsT0FBTyxDQUFDO0FBQzdELENBQUMsQ0FBQyxDQUFDO0FBQ0gsK0RBQWVoVSxLQUFLOzs7Ozs7Ozs7Ozs7O0FDOUJ3Qjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSStOLElBQUksR0FBRyxhQUFhN1AsK0RBQU8sQ0FBQyxTQUFTNlAsSUFBSUEsQ0FBQ3pOLFVBQVUsRUFBRWhDLElBQUksRUFBRTtFQUM5RCxPQUFPdGMsS0FBSyxDQUFDb1IsU0FBUyxDQUFDNE0sS0FBSyxDQUFDck8sSUFBSSxDQUFDMk0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDeVAsSUFBSSxDQUFDek4sVUFBVSxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUNGLCtEQUFleU4sSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0FDMUJ5QjtBQUNYO0FBQ0o7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSW1HLFVBQVUsR0FBRyxhQUFhaFcsK0RBQU8sQ0FBQyxVQUFVaVcsTUFBTSxFQUFFN1YsSUFBSSxFQUFFO0VBQzVELE9BQU80RSxzREFBTSxDQUFDK1Esb0RBQUksQ0FBQ0UsTUFBTSxDQUFDcnlCLE1BQU0sRUFBRXdjLElBQUksQ0FBQyxFQUFFNlYsTUFBTSxDQUFDO0FBQ2xELENBQUMsQ0FBQztBQUNGLCtEQUFlRCxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0JtQjtBQUNZO0FBQ2Q7QUFDWDs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRCxJQUFJLEdBQUcsYUFBYS9WLCtEQUFPLENBQUUsYUFBYUMscUVBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFdVIsMERBQU0sRUFBRSxTQUFTdUUsSUFBSUEsQ0FBQ3RPLENBQUMsRUFBRVgsRUFBRSxFQUFFO0VBQ2pHLE9BQU9oRixxREFBSyxDQUFDLENBQUMsRUFBRTJGLENBQUMsR0FBRyxDQUFDLEdBQUdGLFFBQVEsR0FBR0UsQ0FBQyxFQUFFWCxFQUFFLENBQUM7QUFDM0MsQ0FBQyxDQUFDLENBQUM7QUFDSCwrREFBZWlQLElBQUk7Ozs7Ozs7Ozs7Ozs7O0FDbkR5QjtBQUNOOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRyxPQUFPLEdBQUcsYUFBYTVWLCtEQUFPLENBQUMsU0FBUzRWLE9BQU9BLENBQUMxVSxHQUFHLEVBQUU7RUFDdkQsSUFBSTJVLEtBQUssR0FBRyxFQUFFO0VBQ2QsS0FBSyxJQUFJNVUsSUFBSSxJQUFJQyxHQUFHLEVBQUU7SUFDcEIsSUFBSUMsNERBQUksQ0FBQ0YsSUFBSSxFQUFFQyxHQUFHLENBQUMsRUFBRTtNQUNuQjJVLEtBQUssQ0FBQ0EsS0FBSyxDQUFDdnlCLE1BQU0sQ0FBQyxHQUFHLENBQUMyZCxJQUFJLEVBQUVDLEdBQUcsQ0FBQ0QsSUFBSSxDQUFDLENBQUM7SUFDekM7RUFDRjtFQUNBLE9BQU80VSxLQUFLO0FBQ2QsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVELE9BQU87Ozs7Ozs7Ozs7Ozs7O0FDOUJzQjtBQUNJOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJdlQsUUFBUSxHQUFHLGFBQWFyQywrREFBTyxDQUFDLFNBQVNxQyxRQUFRQSxDQUFDbkMsR0FBRyxFQUFFO0VBQ3pELE9BQU9pUCxpRUFBUyxDQUFDalAsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFDRiwrREFBZW1DLFFBQVE7Ozs7Ozs7Ozs7Ozs7QUMxQ3FCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJMEMsSUFBSSxHQUFHLGFBQWEvRSwrREFBTyxDQUFDLFNBQVMrRSxJQUFJQSxDQUFDN0UsR0FBRyxFQUFFO0VBQ2pELE9BQU9BLEdBQUcsS0FBSyxJQUFJLEdBQUcsTUFBTSxHQUFHQSxHQUFHLEtBQUsxYixTQUFTLEdBQUcsV0FBVyxHQUFHeEIsTUFBTSxDQUFDNFIsU0FBUyxDQUFDeU4sUUFBUSxDQUFDbFAsSUFBSSxDQUFDK00sR0FBRyxDQUFDLENBQUNzQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25ILENBQUMsQ0FBQztBQUNGLCtEQUFldUQsSUFBSTs7Ozs7Ozs7Ozs7Ozs7QUNoQ2tCO0FBQ0o7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJd00sSUFBSSxHQUFHLGFBQWF1RSxzREFBTSxDQUFDM1Asb0RBQVEsQ0FBQztBQUN4QywrREFBZW9MLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQm1CO0FBQ007QUFDWTtBQUNWOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSXVFLE1BQU0sR0FBRyxhQUFhcFcsK0RBQU8sQ0FBRSxhQUFhQyxxRUFBYSxDQUFDLEVBQUUsRUFBRXlSLDREQUFRLEVBQUUsVUFBVW5qQixFQUFFLEVBQUU2UixJQUFJLEVBQUU7RUFDOUYsSUFBSXJYLEdBQUcsR0FBRyxJQUFJNGEsd0RBQUksQ0FBQyxDQUFDO0VBQ3BCLElBQUkxTSxNQUFNLEdBQUcsRUFBRTtFQUNmLElBQUlvSixHQUFHLEdBQUcsQ0FBQztFQUNYLElBQUlnVyxXQUFXLEVBQUU1cUIsSUFBSTtFQUNyQixPQUFPNFUsR0FBRyxHQUFHRCxJQUFJLENBQUN4YyxNQUFNLEVBQUU7SUFDeEI2SCxJQUFJLEdBQUcyVSxJQUFJLENBQUNDLEdBQUcsQ0FBQztJQUNoQmdXLFdBQVcsR0FBRzluQixFQUFFLENBQUM5QyxJQUFJLENBQUM7SUFDdEIsSUFBSTFDLEdBQUcsQ0FBQ2pCLEdBQUcsQ0FBQ3V1QixXQUFXLENBQUMsRUFBRTtNQUN4QnBmLE1BQU0sQ0FBQzVSLElBQUksQ0FBQ29HLElBQUksQ0FBQztJQUNuQjtJQUNBNFUsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU9wSixNQUFNO0FBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDSCwrREFBZW1mLE1BQU07Ozs7Ozs7Ozs7Ozs7O0FDeEN1QjtBQUNmOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSXBKLE1BQU0sR0FBRyxhQUFhMU0sK0RBQU8sQ0FBQyxTQUFTME0sTUFBTUEsQ0FBQ3hMLEdBQUcsRUFBRTtFQUNyRCxJQUFJL00sS0FBSyxHQUFHdlEsb0RBQUksQ0FBQ3NkLEdBQUcsQ0FBQztFQUNyQixJQUFJb0UsR0FBRyxHQUFHblIsS0FBSyxDQUFDN1EsTUFBTTtFQUN0QixJQUFJMHlCLElBQUksR0FBRyxFQUFFO0VBQ2IsSUFBSWpXLEdBQUcsR0FBRyxDQUFDO0VBQ1gsT0FBT0EsR0FBRyxHQUFHdUYsR0FBRyxFQUFFO0lBQ2hCMFEsSUFBSSxDQUFDalcsR0FBRyxDQUFDLEdBQUdtQixHQUFHLENBQUMvTSxLQUFLLENBQUM0TCxHQUFHLENBQUMsQ0FBQztJQUMzQkEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU9pVyxJQUFJO0FBQ2IsQ0FBQyxDQUFDO0FBQ0YsK0RBQWV0SixNQUFNOzs7Ozs7Ozs7Ozs7O0FDL0J1Qjs7QUFFNUM7QUFDQSxJQUFJdUosS0FBSyxHQUFHLFNBQVJBLEtBQUtBLENBQWFsckIsQ0FBQyxFQUFFO0VBQ3ZCLE9BQU87SUFDTC9GLEtBQUssRUFBRStGLENBQUM7SUFDUixrQkFBa0IsRUFBRSxTQUFwQm1yQixlQUFrQkEsQ0FBQSxFQUFjO01BQzlCLE9BQU8sSUFBSTtJQUNiO0VBQ0YsQ0FBQztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsSUFBSSxHQUFHLGFBQWF6VywrREFBTyxDQUFDLFNBQVN5VyxJQUFJQSxDQUFDMUQsSUFBSSxFQUFFMW5CLENBQUMsRUFBRTtFQUNyRDtFQUNBO0VBQ0EsT0FBTzBuQixJQUFJLENBQUN3RCxLQUFLLENBQUMsQ0FBQ2xyQixDQUFDLENBQUMsQ0FBQy9GLEtBQUs7QUFDN0IsQ0FBQyxDQUFDO0FBQ0YsK0RBQWVteEIsSUFBSTs7Ozs7Ozs7Ozs7OztBQ3RDeUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUMsR0FBRyxHQUFHLGFBQWExVywrREFBTyxDQUFDLFNBQVMwVyxHQUFHQSxDQUFDcFUsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEQsSUFBSXFELEdBQUcsR0FBRzVLLElBQUksQ0FBQ3lELEdBQUcsQ0FBQzZELENBQUMsQ0FBQzFlLE1BQU0sRUFBRTJlLENBQUMsQ0FBQzNlLE1BQU0sQ0FBQztFQUN0QyxJQUFJK3lCLEVBQUUsR0FBRzd5QixLQUFLLENBQUM4aEIsR0FBRyxDQUFDO0VBQ25CLElBQUl2RixHQUFHLEdBQUcsQ0FBQztFQUNYLE9BQU9BLEdBQUcsR0FBR3VGLEdBQUcsRUFBRTtJQUNoQitRLEVBQUUsQ0FBQ3RXLEdBQUcsQ0FBQyxHQUFHLENBQUNpQyxDQUFDLENBQUNqQyxHQUFHLENBQUMsRUFBRWtDLENBQUMsQ0FBQ2xDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCQSxHQUFHLElBQUksQ0FBQztFQUNWO0VBQ0EsT0FBT3NXLEVBQUU7QUFDWCxDQUFDLENBQUM7QUFDRiwrREFBZUQsR0FBRzs7Ozs7Ozs7Ozs7OztBQy9CMEI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxNQUFNLEdBQUcsYUFBYTVXLCtEQUFPLENBQUMsU0FBUzRXLE1BQU1BLENBQUMxeUIsSUFBSSxFQUFFOG9CLE1BQU0sRUFBRTtFQUM5RCxJQUFJM00sR0FBRyxHQUFHLENBQUM7RUFDWCxJQUFJdUYsR0FBRyxHQUFHNUssSUFBSSxDQUFDeUQsR0FBRyxDQUFDdmEsSUFBSSxDQUFDTixNQUFNLEVBQUVvcEIsTUFBTSxDQUFDcHBCLE1BQU0sQ0FBQztFQUM5QyxJQUFJa2dCLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDWixPQUFPekQsR0FBRyxHQUFHdUYsR0FBRyxFQUFFO0lBQ2hCOUIsR0FBRyxDQUFDNWYsSUFBSSxDQUFDbWMsR0FBRyxDQUFDLENBQUMsR0FBRzJNLE1BQU0sQ0FBQzNNLEdBQUcsQ0FBQztJQUM1QkEsR0FBRyxJQUFJLENBQUM7RUFDVjtFQUNBLE9BQU95RCxHQUFHO0FBQ1osQ0FBQyxDQUFDO0FBQ0YsK0RBQWU4UyxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0JkO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQm9EO0FBQ2dCO0FBQ0Y7O0FBRWxFLDJDQUEyQyxnQ0FBZ0Msb0NBQW9DLG9EQUFvRCw2REFBNkQsaUVBQWlFLHNDQUFzQzs7QUFFdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELGlGQUFlLDZCQUE2QixvS0FBb0ssbUZBQW1GLEtBQUs7O0FBRXpjO0FBQ1A7QUFDTztBQUNvQjtBQUNyRCxxQkFBcUIsOENBQWM7QUFDbkMsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsNENBQUs7O0FBRW5CLGlCQUFpQix5REFBTztBQUN4QixrQkFBa0IsZ0ZBQWM7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSx5REFBTztBQUNuQixTQUFTLGdEQUFTO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHlCQUF5QixzQkFBc0I7QUFDMUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIseUVBQU87O0FBRTFCLG9CQUFvQix5RUFBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBLG1HQUFtRyxhQUFhO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQSx1R0FBdUcsZUFBZTtBQUN0SDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVHQUF1RyxlQUFlO0FBQ3RIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0EsdUdBQXVHLGVBQWU7QUFDdEg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQSx1R0FBdUcsZUFBZTtBQUN0SDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUDs7QUFFQTtBQUNBLDZGQUE2RixlQUFlO0FBQzVHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU0sU0FBUyx5RUFBTztBQUN0QixnREFBZ0Q7QUFDaEQsTUFBTTtBQUNOLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsR0FBRyxJQUFJO0FBQ1A7QUFDTyxvQkFBb0IsbURBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUDtBQUNBOztBQUVBLDZGQUE2RixlQUFlO0FBQzVHO0FBQ0E7O0FBRUEsU0FBUyxtREFBSztBQUNkLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsZ0ZBQWM7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGNBQWMsbUNBQU07QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkMsWUFBWTtBQUN2RDtBQUNBLE9BQU87QUFDUDs7QUFFQSx5Q0FBeUMsWUFBWTtBQUNyRDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hSQSxJQUFRQyxDQUFBLEdBQThEQywwREFBaEU7RUFBVXZDLENBQUEsR0FBc0R1Qyx5REFBaEU7RUFBaUIvcEIsQ0FBQSxHQUErQytwQiwwREFBaEU7RUFBeUJ4VSxDQUFBLEdBQXVDd1UsMERBQWhFO0VBQWlDcnlCLENBQUEsR0FBK0JxeUIsd0RBQWhFO0VBQXVDdEMsQ0FBQSxHQUF5QnNDLDZEQUFoRTtFQUFrRHhMLENBQUEsR0FBY3dMLHVEQUFoRTtFQUF1RE0sQ0FBQSxHQUFTTix3REFBaEU7RUFFWXJULENBQUEsR0FBRztJQUluQnpkLEVBQUEsRUFBSTZ3QixDQUFBO0lBTUpTLFNBQUEsRUFBV1QsQ0FBQTtJQU1YVSxLQUFBLEVBQU8vQyxDQUFBLENBQVUsQ0FBQ3FDLENBQUEsRUFBUTlwQixDQUFBO0lBZ0IxQnlxQixRQUFBLEVBQVVoRCxDQUFBLENBQVUsQ0FBQ0QsQ0FBQSxFQUFPakosQ0FBQTtJQW9CNUJtTSxVQUFBLEVBQVlqRCxDQUFBLENBQVUsQ0FBQ0QsQ0FBQSxFQUFPakosQ0FBQTtJQXFDOUIzYyxNQUFBLEVBQVE2bEIsQ0FBQSxDQUFVLENBQUN6bkIsQ0FBQSxFQUFRdWUsQ0FBQTtJQU8zQm9NLEdBQUEsRUFBS2xELENBQUEsQ0FBVSxDQUFDem5CLENBQUEsRUFBUXVlLENBQUE7SUFPeEJxTSxJQUFBLEVBQU1yVixDQUFBO0lBT05zVixjQUFBLEVBQWdCbnpCLENBQUE7SUFPaEJvekIsa0JBQUEsRUFBb0JwekIsQ0FBQTtJQU9wQnF6QixPQUFBLEVBQVN4VixDQUFBO0lBT1R5VixPQUFBLEVBQVN6VixDQUFBO0lBT1QwVixjQUFBLEVBQWdCdnpCLENBQUE7SUFPaEJ3ekIsa0JBQUEsRUFBb0J4ekIsQ0FBQTtJQU9wQnl6QixtQkFBQSxFQUFxQnp6QixDQUFBO0lBUXJCMHpCLGFBQUEsRUFBZTF6QixDQUFBO0lBT2YyekIsUUFBQSxFQUFVM3pCLENBQUE7SUFPVjR6QixlQUFBLEVBQWlCNXpCLENBQUE7SUFPakJ1SSxHQUFBLEVBQUtvcUIsQ0FBQTtJQU1Ma0IsTUFBQSxFQUFRbEIsQ0FBQTtJQU9SbUIsSUFBQSxFQUFNbkIsQ0FBQTtJQU1OcHpCLE9BQUEsRUFBU296QixDQUFBO0lBUVQ5d0IsRUFBQSxFQUFJOHdCLENBQUE7SUFPSm9CLFFBQUEsRUFBVS96QixDQUFBO0lBT1ZnMEIsWUFBQSxFQUFjaDBCLENBQUE7SUFPZGkwQixtQkFBQSxFQUFxQmowQixDQUFBO0lBT3JCazBCLGlCQUFBLEVBQW1CbDBCLENBQUE7SUFPbkJtMEIsVUFBQSxFQUFZbjBCLENBQUE7SUFRWm8wQixpQkFBQSxFQUFtQnZXLENBQUE7SUFXbkJ3VyxnQkFBQSxFQUFrQnhXLENBQUE7SUFPbEJ5VyxVQUFBLEVBQVl2RSxDQUFBLENBQVUsQ0FBQ3FDLENBQUEsRUFBUTlwQixDQUFBO0VBQUE7RUMzUXBCdVgsQ0FBQSxHQUFpQixTQUFqQkEsRUFBa0I1YixDQUFBLEVBQUdvdUIsQ0FBQTtJQUNoQyxJQVBrQixVQUFDcHVCLENBQUEsRUFBR291QixDQUFBO01BQUEsT0FBVyxRQUFMcHVCLENBQUEsSUFBa0IsUUFBTG91QixDQUFBO0lBQUEsRUFPekJwdUIsQ0FBQSxFQUFHb3VCLENBQUEsTUFBYSxRQUFMcHVCLENBQUEsSUFBa0IsUUFBTG91QixDQUFBLEdBQ3RDLFFBQ0Q7SUFFRCxJQUFJcHVCLENBQUEsS0FBTW91QixDQUFBLEVBRVIsUUFDRDtJQUdELElBQWlCLFlBQUFoMEIsT0FBQSxDQUFBNEYsQ0FBQSxLQUF5QixZQUFBNUYsT0FBQSxDQUFBZzBCLENBQUEsR0FDeEMsT0FBUXB1QixDQUFBLEtBQUtvdUIsQ0FBQTtJQUdmLElBQUFyUCxDQUFBLEdBQWNua0IsTUFBQSxDQUFPWSxJQUFBLENBQUt3RSxDQUFBO01BQ3BCbXVCLENBQUEsR0FBUXZ6QixNQUFBLENBQU9ZLElBQUEsQ0FBSzR5QixDQUFBO01BQ1Z2QyxDQUFBLEdBQUksU0FBSkEsRUFBSTlNLENBQUE7UUFBQSxPQUFRL2UsQ0FBQSxDQUFFK2UsQ0FBQSxNQUFTcVAsQ0FBQSxDQUFFclAsQ0FBQTtNQUFBO0lBRXpDLE9BQUlBLENBQUEsQ0FBTTdqQixNQUFBLEtBQVdpekIsQ0FBQSxDQUFNanpCLE1BQUEsT0FJdkI2akIsQ0FBQSxDQUFNdVIsSUFBQSxDQUFLekUsQ0FBQSxNQUFlc0MsQ0FBQSxDQUFNbUMsSUFBQSxDQUFLekUsQ0FBQTtFQUFBO0VDN0IzQjBFLENBQUEsR0FBRyxTQUFIQSxFQUFJdndCLENBQUEsRUFBS291QixDQUFBO0lBQUEsT0FBZ0IsUUFBUHB1QixDQUFBLEdBQWNBLENBQUEsQ0FBSW91QixDQUFBLElBQU87RUFBQTtFQzJCOUN2ckIsQ0FBQSxHQUFXO0lBQ3RCZ3RCLElBQUEsRUFBTWpVLENBQUE7SUFDTnRYLEdBQUEsRUFBQWlzQixDQUFBO0lBQ0FYLE1BQUEsRUQ1QnFCLFNDNEJyQkEsT0Q1QnFCNXZCLENBQUE7TUFBQSxPQUFRQSxDQUFBO0lBQUE7SUM2QjdCMUUsT0FBQSxFRDNCcUIsU0MyQnJCQSxRRDNCc0IwRSxDQUFBLEVBQUtvdUIsQ0FBQTtNQUFBLE9BQWFwdUIsQ0FBQSxDQUFJMUUsT0FBQSxDQUFROHlCLENBQUE7SUFBQTtJQzRCcERVLFFBQUEsRUEzQnNCLENBQ3RCO01BQUUvbkIsSUFBQSxFQUFNO1FBQUV6SixFQUFBLEVBQUk7UUFBS2t6QixLQUFBLEVBQU87TUFBQTtJQUFBLEdBQzFCO01BQUV6cEIsSUFBQSxFQUFNO1FBQUV6SixFQUFBLEVBQUk7UUFBS2t6QixLQUFBLEVBQU87TUFBQTtJQUFBLEdBQzFCO01BQUV6cEIsSUFBQSxFQUFNO1FBQUV6SixFQUFBLEVBQUk7UUFBSzJDLE1BQUEsRUFBUTtRQUFLQyxNQUFBLEVBQVE7TUFBQTtJQUFBO0lBeUJ4QzZ1QixVQUFBLEVBdEJ3QixDQUN4QjtNQUNFMEIsUUFBQSxFQUFVO01BQ1Y1QixLQUFBLEVBQU87UUFDTDJCLEtBQUEsRUFBTztNQUFBO0lBQUE7SUFtQlh2QixJQUFBLEVBZGtCO0lBZWxCRCxHQUFBLEVBYmlCO01BQ2pCcnNCLENBQUEsRUFBRztNQUNIRSxDQUFBLEVBQUc7SUFBQTtFQUFBO0VDckJDTixDQUFBLEdBQWMsU0FBZEEsRUFBZXZDLENBQUEsRUFBT291QixDQUFBLEVBQU9yUCxDQUFBLEVBQU1vUCxDQUFBO0lBQUEsT0FDdkNwUCxDQUFBLENBQUt3UixDQUFBLENBQU12d0IsQ0FBQSxFQUFPbXVCLENBQUEsR0FBTW9DLENBQUEsQ0FBTW5DLENBQUEsRUFBT0QsQ0FBQTtFQUFBO0VBRXJCdFUsQ0FBQSxHQUFHLFNBQUhBLEVBQUk3WixDQUFBLEVBQUlvdUIsQ0FBQSxFQUFPclAsQ0FBQSxFQUFPb1AsQ0FBQSxFQUFNdEMsQ0FBQSxFQUFReG5CLENBQUEsRUFBS3VWLENBQUE7SUFDekQ1WixDQUFBLENBQUcwd0IsS0FBQSxDQUFNO01BQUEsQ0FLTHZDLENBQUEsS0FBU3ZTLENBQUEsSUFDVHJaLENBQUEsQ0FBWTZyQixDQUFBLEVBQU9yUCxDQUFBLEVBQU9vUCxDQUFBLEVBQU0sZ0JBRWhDeHJCLENBQUEsQ0FDRTNDLENBQUEsRUFDQXV3QixDQUFBLENBQU1uQyxDQUFBLEVBQU8sYUFDYm1DLENBQUEsQ0FBTXhSLENBQUEsRUFBTyxhQUNiOE0sQ0FBQSxFQUNBeG5CLENBQUEsRUFDQXVWLENBQUEsRUFDQXVVLENBQUEsR0FJQTVyQixDQUFBLENBQVk2ckIsQ0FBQSxFQUFPclAsQ0FBQSxFQUFPb1AsQ0FBQSxFQUFNLGlCQUNsQ3dDLENBQUEsQ0FDRTN3QixDQUFBLEVBQ0F1d0IsQ0FBQSxDQUFNbkMsQ0FBQSxFQUFPLGVBQ2JtQyxDQUFBLENBQU14UixDQUFBLEVBQU8sZUFDYjhNLENBQUEsR0FJSixDQUVFLFFBQ0EsV0FDQSxXQUNBLGtCQUNBLHNCQUNBLE9BQ0Esa0JBQ0Esc0JBQ0EsdUJBQ0EsaUJBQ0EsWUFDQSxtQkFDQXZ3QixPQUFBLENBQVMsVUFBQStJLENBQUE7UUFDTDlCLENBQUEsQ0FBWTZyQixDQUFBLEVBQU9yUCxDQUFBLEVBQU9vUCxDQUFBLEVBQU05cEIsQ0FBQSxLQUNsQ2tVLENBQUEsQ0FBVXZZLENBQUEsRUFBSXFFLENBQUEsRUFBS2tzQixDQUFBLENBQU1uQyxDQUFBLEVBQU8vcEIsQ0FBQSxHQUFNa3NCLENBQUEsQ0FBTXhSLENBQUEsRUFBTzFhLENBQUEsR0FBTXduQixDQUFBLENBQzFEO01BQUEsRUFFSjtJQUFBLElBRUd0cEIsQ0FBQSxDQUFZNnJCLENBQUEsRUFBT3JQLENBQUEsRUFBT29QLENBQUEsRUFBTSxhQUNsQ3lDLENBQUEsQ0FBWTV3QixDQUFBLEVBQUl1d0IsQ0FBQSxDQUFNbkMsQ0FBQSxFQUFPLFdBQVdtQyxDQUFBLENBQU14UixDQUFBLEVBQU8sV0FBVzhNLENBQUEsQ0FDakU7RUFBQTtFQUdZdFQsQ0FBQSxHQUFHLFNBQUhBLEVBQUl2WSxDQUFBLEVBQUlvdUIsQ0FBQSxFQUFLclAsQ0FBQSxFQUFNb1AsQ0FBQSxFQUFNdEMsQ0FBQTtJQUN0QzdyQixDQUFBLENBQUdvdUIsQ0FBQSxFQUFLdkMsQ0FBQSxDQUFPc0MsQ0FBQTtFQUFBO0VBQUF5QyxDQUFBLEdBR0csU0FISEEsRUFHSTV3QixDQUFBLEVBQUlvdUIsQ0FBQSxFQUFTclAsQ0FBQSxFQUFTb1AsQ0FBQTtJQUN6QyxJQUFBdEMsQ0FBQSxHQUFtQnNDLENBQUEsQ0FBT3BQLENBQUE7SUFFUixRQUFkOE0sQ0FBQSxJQUNGN3JCLENBQUEsQ0FBR2lHLE1BQUEsQ0FBTzRsQixDQUFBLEVBQVlqZSxHQUFBLEVBQ3ZCO0VBQUE7RUFBQStpQixDQUFBLEdBR2dCLFNBSGhCQSxFQUdpQjN3QixDQUFBLEVBQUlvdUIsQ0FBQSxFQUFRclAsQ0FBQSxFQUFRb1AsQ0FBQTtJQUN0QyxJQUFBdEMsQ0FBQSxHQUFjN3JCLENBQUEsQ0FBRzZ1QixLQUFBO0lBRUosUUFBVGhELENBQUEsSUFJSkEsQ0FBQSxDQUFNZ0YsUUFBQSxDQUFTMUMsQ0FBQSxDQUFPcFAsQ0FBQSxHQUFTK1IsTUFBQSxFQUEvQjtFQUFBO0VBQUFudUIsQ0FBQSxHQUdvQixTQUhwQkEsRUFHcUIzQyxDQUFBLEVBQUlvdUIsQ0FBQSxFQUFPclAsQ0FBQSxFQUFPb1AsQ0FBQSxFQUFRdEMsQ0FBQSxFQUFLeG5CLENBQUEsRUFBU3VWLENBQUE7SUFDN0QsSUFBQTdkLENBQUEsR0FBYztNQUNSK3ZCLENBQUEsR0FBTzlyQixDQUFBLENBQUduQixVQUFBO01BQUErakIsQ0FBQSxHQUNBO01BQ1Y4TCxDQUFBLEdBQVc7TUFDWDNULENBQUEsR0FBVyxDQUFqQjtNQUlNYSxDQUFBLEdBQVMsU0FBVEEsRUFBUzViLENBQUE7UUFBQSxPQUFRNnJCLENBQUEsQ0FBSUEsQ0FBQSxDQUFJN3JCLENBQUEsRUFBSyxTQUFTO01BQUE7SUFFN0NxRSxDQUFBLENBQVEwYSxDQUFBLEVBQVEsVUFBQS9lLENBQUE7TUFDZCxJQUFRb3VCLENBQUEsR0FBR3hTLENBQUEsQ0FBTTViLENBQUE7TUFFakIrYSxDQUFBLENBQVNxVCxDQUFBLElBQU1wdUIsQ0FBQTtJQUFBLElBR0osUUFBVG91QixDQUFBLElBQ0YvcEIsQ0FBQSxDQUFRK3BCLENBQUEsRUFBUSxVQUFBQSxDQUFBO01BQ2QsSUFBTXJQLENBQUEsR0FBS25ELENBQUEsQ0FBTXdTLENBQUE7TUFFakJNLENBQUEsQ0FBUzNQLENBQUEsSUFBTXFQLENBQUEsRUFkQyxVQUFBcHVCLENBQUE7UUFBQSxPQUF1QixRQUFoQithLENBQUEsQ0FBUy9hLENBQUE7TUFBQSxFQWdCaEIrZSxDQUFBLEtBQ2QrTSxDQUFBLENBQUs5c0IsS0FBQSxDQUFNZ0IsQ0FBQSxDQUFHOEIsY0FBQSxDQUFlaWQsQ0FBQSxFQUM5QjtJQUFBLElBSUwxYSxDQUFBLENBQVEwYSxDQUFBLEVBQVEsVUFBQS9lLENBQUE7TUFDZCxJQUFBb3VCLENBQUEsR0FBV3hTLENBQUEsQ0FBTTViLENBQUE7UUFDWCtlLENBQUEsR0F2QlMsVUFBQS9lLENBQUE7VUFBQSxPQUFPMHVCLENBQUEsQ0FBUzF1QixDQUFBO1FBQUEsRUF1QlZvdUIsQ0FBQTtNQXpCSCxXQUFBcHVCLENBQUE7UUFBQSxPQUF1QixRQUFoQjB1QixDQUFBLENBQVMxdUIsQ0FBQTtNQUFBLEdBMkJuQm91QixDQUFBLElBQ2J4TCxDQUFBLENBQVFqbUIsSUFBQSxDQUFLO1FBQUVvMEIsSUFBQSxFQUFBaFMsQ0FBQTtRQUFNL0ksSUFBQSxFQUFBaFc7TUFBQSxLQUVyQmpFLENBQUEsQ0FBTVksSUFBQSxDQUFLd3hCLENBQUEsQ0FBT251QixDQUFBLEVBQ25CO0lBQUEsSUFHQzhyQixDQUFBLENBQUs1d0IsTUFBQSxHQUFTLEtBQ2hCOEUsQ0FBQSxDQUFHdWpCLE1BQUEsQ0FBT3VJLENBQUEsR0FHUi92QixDQUFBLENBQU1iLE1BQUEsR0FBUyxLQUNqQjhFLENBQUEsQ0FBR1osR0FBQSxDQUFJckQsQ0FBQSxHQUdUNm1CLENBQUEsQ0FBUXRuQixPQUFBLENBQVEsVUFBQW9HLElBQUE7TUFBQSxJQUFHMHNCLENBQUEsR0FBQTFzQixJQUFBLENBQUFxdkIsSUFBQTtRQUFNaFMsQ0FBQSxHQUFBcmQsSUFBQSxDQUFBc1UsSUFBQTtNQUFBLE9BQ3ZCZ2IsQ0FBQSxDQUFhaHhCLENBQUEsRUFBSW91QixDQUFBLEVBQU1yUCxDQUFBLEVBQU1vUCxDQUFBLEVBQVF0QyxDQUFBLEVBQUtqUyxDQUFBO0lBQUEsRUFFN0M7RUFBQTtFQUFBb1gsQ0FBQSxHQUVvQixTQUZwQkEsRUFFcUJoeEIsQ0FBQSxFQUFJb3VCLENBQUEsRUFBTXJQLENBQUEsRUFBTW9QLENBQUEsRUFBUXRDLENBQUEsRUFBS3huQixDQUFBO0lBQ2pELElBQVF1VixDQUFBLEdBQUdpUyxDQUFBLENBQUlBLENBQUEsQ0FBSTlNLENBQUEsRUFBTSxTQUFTO01BQzVCaGpCLENBQUEsR0FBUWlFLENBQUEsQ0FBRzhCLGNBQUEsQ0FBZThYLENBQUE7TUFDckJrUyxDQUFBLEdBQUc7SUFDRyxDQUNmLFFBQ0EsWUFDQSxZQUNBLGNBQ0EsVUFDQSxhQUNBLFdBR094d0IsT0FBQSxDQUFTLFVBQUEwRSxDQUFBO01BQ2hCLElBQUE0WixDQUFBLEdBQWNpUyxDQUFBLENBQUk5TSxDQUFBLEVBQU0vZSxDQUFBO01BRXBCcUUsQ0FBQSxDQUFLdVYsQ0FBQSxFQUFPaVMsQ0FBQSxDQUFJdUMsQ0FBQSxFQUFNcHVCLENBQUEsT0FDeEI4ckIsQ0FBQSxDQUFNOXJCLENBQUEsSUFBT211QixDQUFBLENBQU92VSxDQUFBLEVBQ3JCO0lBQUE7SUFHSCxJQUFNZ0osQ0FBQSxHQUFXaUosQ0FBQSxDQUFJOU0sQ0FBQSxFQUFNO0lBQ3ZCMWEsQ0FBQSxDQUFLdWUsQ0FBQSxFQUFVaUosQ0FBQSxDQUFJdUMsQ0FBQSxFQUFNLGVBQzNCcnlCLENBQUEsQ0FBTWsxQixPQUFBLENBQVE5QyxDQUFBLENBQU92TCxDQUFBLElBR25CaG9CLE1BQUEsQ0FBT1ksSUFBQSxDQUFLc3dCLENBQUEsRUFBTzV3QixNQUFBLEdBQVMsS0FDOUJhLENBQUEsQ0FBTW0xQixJQUFBLENBQUtwRixDQUFBLENBQ1o7RUFBQTtBQUFBLElDM0pZM3BCLENBQUEsMEJBQUFndkIsWUFBQTtFQTZCYixTQUFBaHZCLEVBQVlpc0IsQ0FBQTtJQUFBLElBQUFnRCxLQUFBO0lBQUEza0IsZUFBQSxPQUFBdEssQ0FBQTtJQUNWaXZCLEtBQUEsR0FBQUMsVUFBQSxPQUFBbHZCLENBQUEsR0FBTWlzQixDQUFBLElBQ05nRCxLQUFBLENBQUtFLFdBQUEsR0FBYyxzQkFDbkJGLEtBQUEsQ0FBS0csWUFBQSxHQUFldnhCLHNEQUFNLEVBQzNCO0lBQUEsT0FBQW94QixLQUFBO0VBQUE7RUFFREssU0FBQSxDQUFBdHZCLENBQUEsRUFBQWd2QixZQUFBO0VBQUEsT0FBQXRsQixZQUFBLENBQUExSixDQUFBO0lBQUFQLEdBQUE7SUFBQWhGLEtBQUEsV0FBQTgwQixrQkFBQTtNQUNRLElBQUExeEIsQ0FBQSxHQUFZLEtBQUt1eEIsWUFBQSxDQUFheGUsT0FBQTtRQUFBNGUsV0FBQSxHQVloQyxLQUFLNWxCLEtBQUE7UUFUUHFpQixDQUFBLEdBQUF1RCxXQUFBLENBREl2USxNQUFBO1FBRUorTSxDQUFBLEdBQUF3RCxXQUFBLENBRkk3QixRQUFBO1FBR0pqRSxDQUFBLEdBQUE4RixXQUFBLENBSEk1QixZQUFBO1FBSUoxckIsQ0FBQSxHQUFBc3RCLFdBQUEsQ0FKSTNCLG1CQUFBO1FBS0pwVyxDQUFBLEdBQUErWCxXQUFBLENBTEkxQixpQkFBQTtRQU1KbDBCLENBQUEsR0FBQTQxQixXQUFBLENBTkl6QixVQUFBO1FBT0pwRSxDQUFBLEdBQUE2RixXQUFBLENBUEl4QixpQkFBQTtRQVFKdk4sQ0FBQSxHQUFBK08sV0FBQSxDQVJJdkIsZ0JBQUE7UUFTSjFCLENBQUEsR0FBQWlELFdBQUEsQ0FUSXRCLFVBQUE7UUFZRXRWLENBQUEsR0FBSSxLQUFLNlcsR0FBQSxHQUFNLElBQUk3UyxpREFBQSxDQUFVO1VBQ25DOFMsU0FBQSxFQUFBN3hCLENBQUE7VUFDQTh2QixRQUFBLEVBQUEzQixDQUFBO1VBQ0E0QixZQUFBLEVBQUFsRSxDQUFBO1VBQ0FtRSxtQkFBQSxFQUFBM3JCLENBQUE7VUFDQTRyQixpQkFBQSxFQUFBclcsQ0FBQTtVQUNBc1csVUFBQSxFQUFBbjBCLENBQUE7VUFDQW8wQixpQkFBQSxFQUFBckUsQ0FBQTtVQUNBc0UsZ0JBQUEsRUFBQXhOLENBQUE7VUFDQXlOLFVBQUEsRUFBQTNCO1FBQUE7TUFHRU4sQ0FBQSxLQUNGMEQsTUFBQSxDQUFPMUQsQ0FBQSxJQUFVclQsQ0FBQSxHQUduQixLQUFLZ1gsZUFBQSxDQUFnQixNQUFNLEtBQUtobUIsS0FBQSxDQUNqQztJQUFBO0VBRUQ7SUFBQW5LLEdBQUE7SUFBQWhGLEtBQUEsV0FBQW0xQixnQkFBZ0IveEIsQ0FBQSxFQUFXb3VCLENBQUE7TUFDakIsSUFBQXJQLENBQUEsR0FBRyxLQUFLNlMsR0FBQTtRQUNSekQsQ0FBQSxHQUErQkMsQ0FBQSxDQUFqQ3lCLElBQUE7UUFBUWhFLENBQUEsR0FBeUJ1QyxDQUFBLENBQWpDd0IsTUFBQTtRQUFnQnZyQixDQUFBLEdBQWlCK3BCLENBQUEsQ0FBakM5cEIsR0FBQTtRQUFxQnNWLENBQUEsR0FBWXdVLENBQUEsQ0FBakM5eUIsT0FBQTtNQUVOdWUsQ0FBQSxDQUFNa0YsQ0FBQSxFQUFJL2UsQ0FBQSxFQUFXb3VCLENBQUEsRUFBVUQsQ0FBQSxFQUFNdEMsQ0FBQSxFQUFReG5CLENBQUEsRUFBS3VWLENBQUEsR0FFL0IsUUFBZndVLENBQUEsQ0FBU3h3QixFQUFBLElBQ1h3d0IsQ0FBQSxDQUFTeHdCLEVBQUEsQ0FBR21oQixDQUFBLENBRWY7SUFBQTtFQUVEO0lBQUFuZCxHQUFBO0lBQUFoRixLQUFBLFdBQUFvMUIsbUJBQW1CaHlCLENBQUE7TUFDakIsS0FBSyt4QixlQUFBLENBQWdCL3hCLENBQUEsRUFBVyxLQUFLK0wsS0FBQSxDQUN0QztJQUFBO0VBRUQ7SUFBQW5LLEdBQUE7SUFBQWhGLEtBQUEsV0FBQXExQixxQkFBQTtNQUNFLEtBQUtMLEdBQUEsQ0FBSU0sT0FBQSxFQUNWO0lBQUE7RUFFRDtJQUFBdHdCLEdBQUE7SUFBQWhGLEtBQUEsV0FBQXUxQixPQUFBO01BQ0UsSUFBQUMsWUFBQSxHQUFpQyxLQUFLcm1CLEtBQUE7UUFBOUJxaUIsQ0FBQSxHQUFBZ0UsWUFBQSxDQUFGOTBCLEVBQUE7UUFBTXloQixDQUFBLEdBQUFxVCxZQUFBLENBQU54RCxTQUFBO1FBQWlCVCxDQUFBLEdBQUFpRSxZQUFBLENBQWpCdkQsS0FBQTtNQUVOLE9BQVk3dUIsMERBQUMsQ0FBYyxPQUFPO1FBQ2hDc3lCLEdBQUEsRUFBSyxLQUFLZixZQUFBO1FBQ1ZqMEIsRUFBQSxFQUFBOHdCLENBQUE7UUFDQVEsU0FBQSxFQUFBN1AsQ0FBQTtRQUNBOFAsS0FBQSxFQUFBVjtNQUFBLEVBRUg7SUFBQTtFQUFBO0lBQUF2c0IsR0FBQTtJQUFBMEMsR0FBQSxFQWpHbUQsU0FBQUEsSUFBQTtNQUVsRCxPQUNEeVcsQ0FBQTtJQUFBO0VBRVU7SUFBQW5aLEdBQUE7SUFBQTBDLEdBQUEsV0FBQUEsSUFBQTtNQUNULE9BQ0R6QixDQUFBO0lBQUE7RUFFdUI7SUFBQWpCLEdBQUE7SUFBQWhGLEtBQUEsV0FBQTIxQixrQkFBQ3Z5QixDQUFBO01BR3ZCLElBRm1DLFFBQW5CQSxDQUFBLENBQVM5RSxNQUFBLEVBR3ZCLE9BQUE4RSxDQUFBO01BQ0s7UUFDTCxJQUFNb3VCLEVBQUEsR0FBaUJwdUIsQ0FBQSxDQUFuQjVDLEtBQUE7VUFBUzJoQixFQUFBLEdBQVUvZSxDQUFBLENBQW5CeUYsS0FBQTtRQVVKLE9BUmEsUUFBVDJvQixFQUFBLEtBQ0ZBLEVBQUEsR0FBUSxLQUdHLFFBQVRyUCxFQUFBLEtBQ0ZBLEVBQUEsR0FBUSxLQUdIcVAsRUFBQSxDQUFNbFUsTUFBQSxDQUFPNkUsRUFBQSxDQUNyQjtNQUFBO0lBQ0Y7RUFFRDtBQUFBLEVBN0JtRC9lLHdEQUFDOzs7Ozs7Ozs7Ozs7QUNWdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7OztBQUliLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osWUFBWTtBQUNaLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixtQkFBbUI7QUFDbkIsd0JBQXdCO0FBQ3hCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsaUJBQWlCO0FBQ2pCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsMEJBQTBCO0FBQzFCLGNBQWM7QUFDZCxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7OztBQ3BMYTs7QUFFYixJQUFJLEtBQXFDLEVBQUU7QUFBQSxFQUUxQyxDQUFDO0FBQ0YsRUFBRSxnSUFBeUQ7QUFDM0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTnNEO0FBQ2M7QUFDTjtBQUNvQjtBQUMxQjtBQUNrQztBQUN0QjtBQUNBOztBQUVwRSxpQ0FBaUMsNkRBQTZELHlDQUF5QyxZQUFZLGlGQUFlLG1CQUFtQixpQ0FBaUMsZ0JBQWdCLGlGQUFlLG9CQUFvQiwyREFBMkQsT0FBTyx5Q0FBeUMsT0FBTyw0RkFBMEI7O0FBRXJaLHVDQUF1Qyx3RUFBd0UsMENBQTBDLDhDQUE4QyxNQUFNLDRFQUE0RSxJQUFJLGVBQWUsWUFBWTs7QUFFOVI7QUFDUztBQUNDOztBQUVwQztBQUNBLEVBQUUsMkVBQVM7O0FBRVg7O0FBRUE7QUFDQTs7QUFFQSxJQUFJLGlGQUFlOztBQUVuQjs7QUFFQSxJQUFJLGlGQUFlLENBQUMsd0ZBQXNCO0FBQzFDO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsOEVBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELDBEQUFtQiwwR0FBMEcsMERBQW1CLFFBQVEsMEVBQVEsR0FBRztBQUNuTjtBQUNBLE9BQU8sZ0JBQWdCLDBEQUFtQixDQUFDLG1EQUFTO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQyxDQUFDLHdEQUFlOztBQUVqQixpRkFBZTtBQUNmLFdBQVcsd0RBQWM7QUFDekIsUUFBUSwwREFBZ0I7QUFDeEIsTUFBTSwwREFBZ0I7QUFDdEIsb0JBQW9CLHdEQUFjO0FBQ2xDLFlBQVksMERBQWdCO0FBQzVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZFcUQ7QUFDZ0M7QUFDdEY7QUFDMEI7QUFDUztBQUNXOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMEZBQXdCOztBQUV0QyxzQkFBc0IsMERBQW1CLENBQUMsdURBQWMsRUFBRSwwRUFBUSxHQUFHO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxRQUFRLHlEQUFlO0FBQ3ZCO0FBQ0EsK0RBQWUsYUFBYTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5QjBCO0FBQzVCO0FBQ1M7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwREFBbUIsUUFBUSwwRUFBUSxHQUFHO0FBQzVEO0FBQ0EsR0FBRyxnQkFBZ0IsMERBQW1CLDJIQUEySCwwREFBbUI7QUFDcEw7O0FBRUE7QUFDQSxXQUFXLHdEQUFjO0FBQ3pCLGNBQWMsdURBQWU7QUFDN0IsWUFBWSx3REFBYztBQUMxQixZQUFZLDBEQUFnQjtBQUM1QixXQUFXLHdEQUFjO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQWUsU0FBUzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCOEI7O0FBRXRELHlEQUF5RCxpRkFBaUYsV0FBVyx3SEFBd0gsZ0JBQWdCLFdBQVcseUJBQXlCLFNBQVMsd0JBQXdCLDRCQUE0QixjQUFjLFNBQVMsK0JBQStCLHNCQUFzQixXQUFXLFlBQVksZ0tBQWdLLGtEQUFrRCxTQUFTLGtCQUFrQixrQkFBa0Isb0JBQW9CLHNCQUFzQiw4QkFBOEIsY0FBYyx1QkFBdUIsZUFBZSxZQUFZLG9CQUFvQixNQUFNLDJEQUEyRCxVQUFVOztBQUV2OEIsa0RBQWtELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7O0FBRTdTLHVDQUF1Qyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7O0FBRS9JO0FBQ29COztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLDhCQUE4QjtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLDBFQUFRLEdBQUc7O0FBRXpCLHNCQUFzQiwwREFBbUIsQ0FBQyx1REFBYyxFQUFFLDBFQUFRLEdBQUc7QUFDckU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLCtEQUFlLGdCQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RHFDO0FBQ047QUFDb0I7QUFDMUI7QUFDa0M7QUFDdEI7QUFDQTtBQUNNO0FBQ3BCOztBQUV0RCwyQ0FBMkMsZ0NBQWdDLG9DQUFvQyxvREFBb0QsNkRBQTZELGlFQUFpRSxzQ0FBc0M7O0FBRXZVLGlDQUFpQyxnQkFBZ0Isc0JBQXNCLE9BQU8sdURBQXVELDZEQUE2RCxpRkFBZSw2QkFBNkIsb0tBQW9LLG1GQUFtRixLQUFLOztBQUUxZSxpQ0FBaUMsNkRBQTZELHlDQUF5QyxZQUFZLGlGQUFlLG1CQUFtQixpQ0FBaUMsZ0JBQWdCLGlGQUFlLG9CQUFvQiwyREFBMkQsT0FBTyx5Q0FBeUMsT0FBTyw0RkFBMEI7O0FBRXJaLHVDQUF1Qyx3RUFBd0UsMENBQTBDLDhDQUE4QyxNQUFNLDRFQUE0RSxJQUFJLGVBQWUsWUFBWTs7QUFFOVI7QUFDUztBQUNDO0FBQ3NCO0FBQ3hCO0FBQ0U7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGtFQUFvQjtBQUN0QjtBQUNBLG9DQUFvQywwREFBbUIsQ0FBQyxtREFBUyxFQUFFLDBFQUFRLEdBQUc7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywwREFBbUIsQ0FBQyxrREFBUSxFQUFFLDBFQUFRLEdBQUc7QUFDN0U7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9GQUFrQjtBQUNoRDtBQUNBLGlDQUFpQyxvRkFBa0I7QUFDbkQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSwyRUFBUzs7QUFFWDs7QUFFQTtBQUNBOztBQUVBLElBQUksaUZBQWU7O0FBRW5COztBQUVBLElBQUksaUZBQWUsQ0FBQyx3RkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUEsRUFBRSw4RUFBWTtBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2SEFBNkgsaUJBQWlCO0FBQzlJO0FBQ0EsT0FBTztBQUNQLGtDQUFrQywwREFBbUI7QUFDckQ7QUFDQTtBQUNBLHFDQUFxQywwREFBbUIsNkVBQTZFLDBEQUFtQiwwR0FBMEcsMERBQW1CLDZGQUE2RiwwREFBbUIsQ0FBQyxtREFBUztBQUMvWTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sZ0JBQWdCLDBEQUFtQixVQUFVLDBFQUFRLEdBQUc7QUFDL0Q7QUFDQSxPQUFPLDJEQUEyRCwwREFBbUIsU0FBUywwRUFBUSxHQUFHO0FBQ3pHO0FBQ0EsT0FBTyxxQ0FBcUMsMERBQW1CO0FBQy9EO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsQ0FBQyx3REFBZTs7QUFFakIsaUZBQWU7QUFDZixpQkFBaUIseURBQWM7QUFDL0IscUJBQXFCLHdEQUFhO0FBQ2xDLFlBQVksMkRBQWdCO0FBQzVCLFFBQVEsd0RBQWE7QUFDckIsWUFBWSx5REFBYztBQUMxQixvQkFBb0IseURBQWM7QUFDbEMsV0FBVyx5REFBYztBQUN6QixtQkFBbUIsMkRBQWdCO0FBQ25DLFdBQVcsMERBQWlCLENBQUMsNERBQW1CLEVBQUUsMkRBQWdCLEVBQUUsMkRBQWdCO0FBQ3BGLGlCQUFpQix5REFBYztBQUMvQixvQkFBb0IseURBQWM7QUFDbEMsU0FBUywyREFBZ0I7QUFDekIsa0JBQWtCLDREQUFtQixFQUFFLHlEQUFjLEVBQUUseURBQWM7QUFDckUsY0FBYyx5REFBYztBQUM1QixjQUFjLHlEQUFjO0FBQzVCLENBQUM7O0FBRUQsaUZBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaExxRDtBQUNjO0FBQ2tCO0FBQ3RGOztBQUVBLDJDQUEyQyxnQ0FBZ0Msb0NBQW9DLG9EQUFvRCw2REFBNkQsaUVBQWlFLHNDQUFzQzs7QUFFdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELGlGQUFlLDZCQUE2QixvS0FBb0ssbUZBQW1GLEtBQUs7O0FBRWhkO0FBQ1M7QUFDSDtBQUNjO0FBQ0Y7QUFDTTtBQUNOOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSwwRkFBd0I7O0FBRXJDLGtEQUFrRCxvREFBTztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0UsNkJBQTZCO0FBQ2pHO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsdURBQWM7O0FBRTVEO0FBQ0EsMEJBQTBCLDBEQUFtQixDQUFDLHNEQUFhOztBQUUzRDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMseURBQWdCOztBQUU5RDtBQUNBLDBCQUEwQiwwREFBbUIsQ0FBQyxzREFBYSxFQUFFLDBFQUFRLEdBQUc7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLDBCQUEwQiwwREFBbUIsQ0FBQyxzREFBYTs7QUFFM0Q7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsc0RBQWEsRUFBRSwwRUFBUSxHQUFHO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsc0RBQWEsRUFBRSwwRUFBUSxHQUFHO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsc0RBQWEsRUFBRSwwRUFBUSxHQUFHO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsc0RBQWEsRUFBRSwwRUFBUSxHQUFHO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLDBCQUEwQiwwREFBbUIsQ0FBQyxzREFBYSxFQUFFLDBFQUFRLEdBQUc7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLDBCQUEwQiwwREFBbUIsQ0FBQyxzREFBYTs7QUFFM0Q7QUFDQSwwQkFBMEIsMERBQW1CLENBQUMsc0RBQWEsRUFBRSwwRUFBUSxHQUFHO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHdEQUFjO0FBQy9CLFdBQVcseURBQWlCLENBQUMsMkRBQW1CLEVBQUUsMERBQWdCLEVBQUUsMERBQWdCO0FBQ3BGLGlCQUFpQix3REFBYztBQUMvQixXQUFXLHdEQUFjO0FBQ3pCLFNBQVMsdURBQWE7QUFDdEIsaUJBQWlCLHdEQUFjO0FBQy9CLGdCQUFnQix3REFBYztBQUM5QjtBQUNBLCtEQUFlLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5SCtCO0FBQ2dDO0FBQ3RGO0FBQzBCO0FBQ1M7QUFDVzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMEZBQXdCOztBQUV0QyxzQkFBc0IsMERBQW1CLENBQUMsdURBQWMsRUFBRSwwRUFBUSxHQUFHO0FBQ3JFO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLFFBQVEsMERBQWdCO0FBQ3hCLFlBQVksMERBQWdCO0FBQzVCO0FBQ0EsK0RBQWUsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQzZDO0FBQ2hEO0FBQ1M7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLHNCQUFzQiwwREFBbUIseURBQXlELDBEQUFtQiw2SEFBNkgsMERBQW1CLGlIQUFpSCxvRkFBa0I7QUFDeFk7O0FBRUE7QUFDQSxZQUFZLDBEQUFnQjtBQUM1QixXQUFXLHdEQUFjO0FBQ3pCLGlCQUFpQix3REFBYztBQUMvQixXQUFXLHlEQUFpQixDQUFDLDJEQUFtQixFQUFFLDBEQUFnQixFQUFFLDBEQUFnQjtBQUNwRixpQkFBaUIsd0RBQWM7QUFDL0IsU0FBUyx1REFBYTtBQUN0QixlQUFlLHdEQUFjO0FBQzdCO0FBQ0EsK0RBQWUsYUFBYTs7Ozs7Ozs7Ozs7Ozs7O0FDM0J3Qzs7QUFFcEUsMkNBQTJDLGdDQUFnQyxvQ0FBb0Msb0RBQW9ELDZEQUE2RCxpRUFBaUUsc0NBQXNDOztBQUV2VSxpQ0FBaUMsZ0JBQWdCLHNCQUFzQixPQUFPLHVEQUF1RCw2REFBNkQsaUZBQWUsNkJBQTZCLG9LQUFvSyxtRkFBbUYsS0FBSzs7QUFFcmI7QUFDVjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFlBQVk7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFlBQVk7QUFDekQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsbUVBQWE7QUFDMUMsaUJBQWlCLHlEQUFTO0FBQzFCLENBQUM7QUFDRCwrREFBZSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TXFDOztBQUUxRSx5REFBeUQsaUZBQWlGLFdBQVcsd0hBQXdILGdCQUFnQixXQUFXLHlCQUF5QixTQUFTLHdCQUF3Qiw0QkFBNEIsY0FBYyxTQUFTLCtCQUErQixzQkFBc0IsV0FBVyxZQUFZLGdLQUFnSyxrREFBa0QsU0FBUyxrQkFBa0Isa0JBQWtCLG9CQUFvQixzQkFBc0IsOEJBQThCLGNBQWMsdUJBQXVCLGVBQWUsWUFBWSxvQkFBb0IsTUFBTSwyREFBMkQsVUFBVTs7QUFFdjhCLGtEQUFrRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNEOztBQUU3Uyx1Q0FBdUMsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUV6SztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLDhCQUE4QjtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QyxvRkFBa0IsV0FBVyxvRkFBa0I7QUFDeEYsSUFBSTtBQUNKLHVFQUF1RSxvRkFBa0IseUNBQXlDLG9GQUFrQiwyQ0FBMkMsb0ZBQWtCO0FBQ2pOOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwS3NEO0FBQ2dDO0FBQ2xCO0FBQ047QUFDTjtBQUNrQztBQUN0QjtBQUNBO0FBQ0Y7QUFDbEU7O0FBRUEsaUNBQWlDLDZEQUE2RCx5Q0FBeUMsWUFBWSxpRkFBZSxtQkFBbUIsaUNBQWlDLGdCQUFnQixpRkFBZSxvQkFBb0IsMkRBQTJELE9BQU8seUNBQXlDLE9BQU8sNEZBQTBCOztBQUVyWix1Q0FBdUMsd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSw0RUFBNEUsSUFBSSxlQUFlLFlBQVk7O0FBRXhULDJDQUEyQyxnQ0FBZ0Msb0NBQW9DLG9EQUFvRCw2REFBNkQsaUVBQWlFLHNDQUFzQzs7QUFFdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELGlGQUFlLDZCQUE2QixvS0FBb0ssbUZBQW1GLEtBQUs7O0FBRTFlO0FBQ0E7QUFDQTtBQUNBO0FBQzBCO0FBQ1M7QUFDRDtBQUM0QjtBQUNYOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLDBEQUFtQjtBQUN6Qzs7QUFFQTtBQUNBLGNBQWMsZ0ZBQWM7QUFDNUI7O0FBRUEsc0JBQXNCLDBEQUFtQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtGQUErRixhQUFhO0FBQzVHO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLGtFQUFXO0FBQ3ZCOztBQUVBO0FBQ0EsYUFBYSxvRUFBc0I7QUFDbkM7QUFDQTs7QUFFTztBQUNQLEVBQUUsMkVBQVM7O0FBRVg7O0FBRUE7QUFDQTs7QUFFQSxJQUFJLGlGQUFlOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLDhFQUFZO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwwRkFBd0I7O0FBRXpDO0FBQ0EsMEJBQTBCLDBEQUFtQixxQ0FBcUMsMERBQW1CLENBQUMsa0RBQVEsRUFBRSwwRUFBUSxHQUFHO0FBQzNIO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsQ0FBQyx3REFBZTs7QUFFakIsaUZBQWU7QUFDZixRQUFRLHdEQUFhO0FBQ3JCLFlBQVkseURBQWM7QUFDMUIsU0FBUyw0REFBbUIsRUFBRSwyREFBZ0IsRUFBRSwyREFBZ0I7QUFDaEUsZUFBZSx5REFBYztBQUM3QixXQUFXLDBEQUFpQixDQUFDLDREQUFtQixFQUFFLDJEQUFnQixFQUFFLDJEQUFnQjtBQUNwRixvQkFBb0IseURBQWM7QUFDbEMsa0JBQWtCLDREQUFtQixFQUFFLHlEQUFjLEVBQUUseURBQWM7QUFDckUsQ0FBQzs7QUFFRCxpRkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDN0xjO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2JBLCtEQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQnFDO0FBQy9CLElBQU0yeUIsaUJBQWlCLEdBQUcsYUFBYUQsb0RBQWEsQ0FBQyxJQUFJLENBQUM7QUFFakUsSUFBSUUsSUFBcUMsRUFBRTtFQUN6Q0QsaUJBQWlCLENBQUNyQixXQUFXLEdBQUcsWUFBWTtBQUM5QztBQUVBLCtEQUFlcUIsaUJBQWlCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1BPO0FBQ087QUFDYTtBQUNvQjtBQUUvRSxTQUFTUSxRQUFRQSxDQUFBenhCLElBQUEsRUFLZDtFQUFBLElBSkQweEIsS0FBSyxHQUFBMXhCLElBQUEsQ0FBTDB4QixLQUFLO0lBQ0x4WSxPQUFPLEdBQUFsWixJQUFBLENBQVBrWixPQUFPO0lBQ1BoVyxRQUFRLEdBQUFsRCxJQUFBLENBQVJrRCxRQUFRO0lBQ1J5dUIsV0FBVyxHQUFBM3hCLElBQUEsQ0FBWDJ4QixXQUFXO0VBRVgsSUFBTUMsWUFBWSxHQUFHTiw4Q0FBTyxDQUFDLFlBQU07SUFDakMsSUFBTU8sWUFBWSxHQUFHTix1RUFBa0IsQ0FBQ0csS0FBSyxDQUFDO0lBQzlDLE9BQU87TUFDTEEsS0FBSztNQUNMRyxZQUFZO01BQ1pDLGNBQWMsRUFBRUgsV0FBVyxHQUFHO1FBQUEsT0FBTUEsV0FBVztNQUFBLElBQUdqM0I7SUFDcEQsQ0FBQztFQUNILENBQUMsRUFBRSxDQUFDZzNCLEtBQUssRUFBRUMsV0FBVyxDQUFDLENBQUM7RUFDeEIsSUFBTUksYUFBYSxHQUFHVCw4Q0FBTyxDQUFDO0lBQUEsT0FBTUksS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQztFQUFBLEdBQUUsQ0FBQ04sS0FBSyxDQUFDLENBQUM7RUFDOURGLDJGQUF5QixDQUFDLFlBQU07SUFDOUIsSUFDRUssWUFBWSxHQUNWRCxZQUFZLENBRGRDLFlBQVk7SUFFZEEsWUFBWSxDQUFDSSxhQUFhLEdBQUdKLFlBQVksQ0FBQ0ssZ0JBQWdCO0lBQzFETCxZQUFZLENBQUNNLFlBQVksQ0FBQyxDQUFDO0lBRTNCLElBQUlKLGFBQWEsS0FBS0wsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQyxFQUFFO01BQ3RDSCxZQUFZLENBQUNLLGdCQUFnQixDQUFDLENBQUM7SUFDakM7SUFFQSxPQUFPLFlBQU07TUFDWEwsWUFBWSxDQUFDTyxjQUFjLENBQUMsQ0FBQztNQUM3QlAsWUFBWSxDQUFDSSxhQUFhLEdBQUd2M0IsU0FBUztJQUN4QyxDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUNrM0IsWUFBWSxFQUFFRyxhQUFhLENBQUMsQ0FBQztFQUNqQyxJQUFNTSxPQUFPLEdBQUduWixPQUFPLElBQUkrWCx1REFBaUIsQ0FBQyxDQUFDOztFQUU5QyxPQUFPLGFBQWFJLDBEQUFtQixDQUFDZ0IsT0FBTyxDQUFDWixRQUFRLEVBQUU7SUFDeER2MkIsS0FBSyxFQUFFMDJCO0VBQ1QsQ0FBQyxFQUFFMXVCLFFBQVEsQ0FBQztBQUNkO0FBRUEsK0RBQWV1dUIsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0NtQztBQUMwQztBQUNwRyxJQUFNZSxTQUFTLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQzs7QUFFNUM7QUFDbUQ7QUFDUTtBQUNNO0FBQ0Q7QUFDVTtBQUNOO0FBQ1Y7QUFDQztBQUNvQjtBQUM5QjtBQUNWO0FBQ087QUFDaUI7QUFDL0QsSUFBSWEsb0JBQW9CLEdBQUdELHdFQUFjO0FBQ2xDLElBQU1FLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUdudkIsRUFBRSxFQUFJO0VBQ3JDa3ZCLG9CQUFvQixHQUFHbHZCLEVBQUU7QUFDM0IsQ0FBQyxDQUFDLENBQUM7O0FBRUgsSUFBTW92QixXQUFXLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLElBQU1DLHFCQUFxQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUM7O0FBRUEsSUFBTUMsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFrQkEsQ0FBR0MsSUFBSSxFQUFJO0VBQ2pDLElBQUk7SUFDRixPQUFPQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0YsSUFBSSxDQUFDO0VBQzdCLENBQUMsQ0FBQyxPQUFPdjRCLEdBQUcsRUFBRTtJQUNaLE9BQU84bkIsTUFBTSxDQUFDeVEsSUFBSSxDQUFDO0VBQ3JCO0FBQ0YsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNHLGlDQUFpQ0EsQ0FBQ0MsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFlBQVksRUFBRTtFQUMvRXhDLDRGQUF5QixDQUFDO0lBQUEsT0FBTXNDLFVBQVUsQ0FBQWpjLEtBQUEsU0FBQW9jLGtCQUFBLENBQUlGLFVBQVUsRUFBQztFQUFBLEdBQUVDLFlBQVksQ0FBQztBQUMxRSxDQUFDLENBQUM7O0FBR0YsU0FBU0UsbUJBQW1CQSxDQUFDQyxnQkFBZ0IsRUFBRUMsY0FBYyxFQUFFQyxpQkFBaUIsRUFBRUMsWUFBWTtBQUFFO0FBQ2hHQyx5QkFBeUIsRUFBRXJDLGdCQUFnQixFQUFFO0VBQzNDO0VBQ0FpQyxnQkFBZ0IsQ0FBQzlpQixPQUFPLEdBQUdpakIsWUFBWTtFQUN2Q0QsaUJBQWlCLENBQUNoakIsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDOztFQUVuQyxJQUFJa2pCLHlCQUF5QixDQUFDbGpCLE9BQU8sRUFBRTtJQUNyQ2tqQix5QkFBeUIsQ0FBQ2xqQixPQUFPLEdBQUcsSUFBSTtJQUN4QzZnQixnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3BCO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7O0FBR0EsU0FBU3NDLGdCQUFnQkEsQ0FBQ0Msd0JBQXdCLEVBQUUvQyxLQUFLLEVBQUVHLFlBQVksRUFBRTZDLGtCQUFrQixFQUFFUCxnQkFBZ0IsRUFBRUMsY0FBYyxFQUFFQyxpQkFBaUIsRUFBRU0sU0FBUyxFQUFFSix5QkFBeUIsRUFBRXJDLGdCQUFnQjtBQUFFO0FBQzFNMEMsMkJBQTJCLEVBQUU7RUFDM0I7RUFDQSxJQUFJLENBQUNILHdCQUF3QixFQUFFLE9BQU8sWUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVoRCxJQUFJSSxjQUFjLEdBQUcsS0FBSztFQUMxQixJQUFJQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7O0VBRTVCLElBQU1DLGVBQWUsR0FBRyxTQUFsQkEsZUFBZUEsQ0FBQSxFQUFTO0lBQzVCLElBQUlGLGNBQWMsSUFBSSxDQUFDRixTQUFTLENBQUN0akIsT0FBTyxFQUFFO01BQ3hDO01BQ0E7TUFDQTtJQUNGLENBQUMsQ0FBQzs7SUFHRixJQUFNMmpCLGdCQUFnQixHQUFHdEQsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQztJQUN6QyxJQUFJaUQsYUFBYSxFQUFFQyxLQUFLO0lBRXhCLElBQUk7TUFDRjtNQUNBO01BQ0FELGFBQWEsR0FBR1Asa0JBQWtCLENBQUNNLGdCQUFnQixFQUFFYixnQkFBZ0IsQ0FBQzlpQixPQUFPLENBQUM7SUFDaEYsQ0FBQyxDQUFDLE9BQU8vUyxDQUFDLEVBQUU7TUFDVjQyQixLQUFLLEdBQUc1MkIsQ0FBQztNQUNUdzJCLGVBQWUsR0FBR3gyQixDQUFDO0lBQ3JCO0lBRUEsSUFBSSxDQUFDNDJCLEtBQUssRUFBRTtNQUNWSixlQUFlLEdBQUcsSUFBSTtJQUN4QixDQUFDLENBQUM7O0lBR0YsSUFBSUcsYUFBYSxLQUFLYixjQUFjLENBQUMvaUIsT0FBTyxFQUFFO01BQzVDLElBQUksQ0FBQ2dqQixpQkFBaUIsQ0FBQ2hqQixPQUFPLEVBQUU7UUFDOUI2Z0IsZ0JBQWdCLENBQUMsQ0FBQztNQUNwQjtJQUNGLENBQUMsTUFBTTtNQUNMO01BQ0E7TUFDQTtNQUNBO01BQ0FrQyxjQUFjLENBQUMvaUIsT0FBTyxHQUFHNGpCLGFBQWE7TUFDdENWLHlCQUF5QixDQUFDbGpCLE9BQU8sR0FBRzRqQixhQUFhO01BQ2pEWixpQkFBaUIsQ0FBQ2hqQixPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7TUFDbEM7O01BRUF1akIsMkJBQTJCLENBQUMsQ0FBQztJQUMvQjtFQUNGLENBQUMsQ0FBQyxDQUFDOztFQUdIL0MsWUFBWSxDQUFDSSxhQUFhLEdBQUc4QyxlQUFlO0VBQzVDbEQsWUFBWSxDQUFDTSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDN0I7O0VBRUE0QyxlQUFlLENBQUMsQ0FBQztFQUVqQixJQUFNSSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFBLEVBQVM7SUFDL0JOLGNBQWMsR0FBRyxJQUFJO0lBQ3JCaEQsWUFBWSxDQUFDTyxjQUFjLENBQUMsQ0FBQztJQUM3QlAsWUFBWSxDQUFDSSxhQUFhLEdBQUcsSUFBSTtJQUVqQyxJQUFJNkMsZUFBZSxFQUFFO01BQ25CO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxNQUFNQSxlQUFlO0lBQ3ZCO0VBQ0YsQ0FBQztFQUVELE9BQU9LLGtCQUFrQjtBQUMzQixDQUFDLENBQUM7O0FBR0YsSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBQTtFQUFBLE9BQVM3QixXQUFXO0FBQUE7QUFFMUMsU0FBUzhCLFdBQVdBLENBQUNuZCxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN6QixPQUFPRCxDQUFDLEtBQUtDLENBQUM7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBR0EsSUFBSW1kLGtDQUFrQyxHQUFHLEtBQUs7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTQyxPQUFPQSxDQUFDQyxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEVBWXhEO0VBQUEsSUFBQTExQixJQUFBLEdBQUF6RyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFKLENBQUMsQ0FBQztJQVRKbzhCLElBQUksR0FBQTMxQixJQUFBLENBQUoyMUIsSUFBSTtJQUFBQyxtQkFBQSxHQUFBNTFCLElBQUEsQ0FDSjYxQixjQUFjO0lBQWRBLGNBQWMsR0FBQUQsbUJBQUEsY0FBR1AsV0FBVyxHQUFBTyxtQkFBQTtJQUFBRSxxQkFBQSxHQUFBOTFCLElBQUEsQ0FDNUIrMUIsZ0JBQWdCO0lBQWhCQSxnQkFBZ0IsR0FBQUQscUJBQUEsY0FBRzVDLDREQUFZLEdBQUE0QyxxQkFBQTtJQUFBRSxxQkFBQSxHQUFBaDJCLElBQUEsQ0FDL0JpMkIsa0JBQWtCO0lBQWxCQSxrQkFBa0IsR0FBQUQscUJBQUEsY0FBRzlDLDREQUFZLEdBQUE4QyxxQkFBQTtJQUFBRSxxQkFBQSxHQUFBbDJCLElBQUEsQ0FDakNtMkIsbUJBQW1CO0lBQW5CQSxtQkFBbUIsR0FBQUQscUJBQUEsY0FBR2hELDREQUFZLEdBQUFnRCxxQkFBQTtJQUFBRSxlQUFBLEdBQUFwMkIsSUFBQSxDQUVsQ3EyQixVQUFVO0lBQVZBLFVBQVUsR0FBQUQsZUFBQSxjQUFHLEtBQUssR0FBQUEsZUFBQTtJQUFBRSxZQUFBLEdBQUF0MkIsSUFBQSxDQUVsQmtaLE9BQU87SUFBUEEsT0FBTyxHQUFBb2QsWUFBQSxjQUFHckYsd0RBQWlCLEdBQUFxRixZQUFBO0VBRTNCLElBQUlwRixJQUFxQyxFQUFFO0lBQ3pDLElBQUl5RSxJQUFJLEtBQUtqN0IsU0FBUyxJQUFJLENBQUM0NkIsa0NBQWtDLEVBQUU7TUFDN0RBLGtDQUFrQyxHQUFHLElBQUk7TUFDekNuQywyREFBTyxDQUFDLHlGQUF5RixDQUFDO0lBQ3BHO0VBQ0Y7RUFFQSxJQUFNZCxPQUFPLEdBQUduWixPQUFPO0VBQ3ZCLElBQU1xZCxtQkFBbUIsR0FBR3ZELGdGQUFzQixDQUFDd0MsZUFBZSxDQUFDO0VBQ25FLElBQU1nQixzQkFBc0IsR0FBR3pELHNGQUF5QixDQUFDMEMsa0JBQWtCLENBQUM7RUFDNUUsSUFBTWdCLGNBQWMsR0FBR3hELHNFQUFpQixDQUFDeUMsVUFBVSxDQUFDO0VBQ3BELElBQU1qQix3QkFBd0IsR0FBR2lDLE9BQU8sQ0FBQ2xCLGVBQWUsQ0FBQztFQUV6RCxJQUFNbUIsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFHQyxnQkFBZ0IsRUFBSTtJQUMxQyxJQUFJMUYsS0FBcUMsSUFBSSxDQUFDMEIsNERBQWtCLENBQUNnRSxnQkFBZ0IsQ0FBQyxFQUFFO01BQ2xGLE1BQU0sSUFBSTVZLEtBQUssb0ZBQUF4RixNQUFBLENBQW9GaWIsa0JBQWtCLENBQUNtRCxnQkFBZ0IsQ0FBQyxDQUFFLENBQUM7SUFDNUk7SUFFQSxJQUFNQyxvQkFBb0IsR0FBR0QsZ0JBQWdCLENBQUNoSCxXQUFXLElBQUlnSCxnQkFBZ0IsQ0FBQ25VLElBQUksSUFBSSxXQUFXO0lBQ2pHLElBQU1tTixXQUFXLGNBQUFwWCxNQUFBLENBQWNxZSxvQkFBb0IsTUFBRztJQUN0RCxJQUFNQyxzQkFBc0IsR0FBRztNQUM3QnJDLHdCQUF3QjtNQUN4QjdFLFdBQVc7TUFDWGlILG9CQUFvQjtNQUNwQkQsZ0JBQWdCO01BQ2hCO01BQ0FMLG1CQUFtQjtNQUNuQjtNQUNBQyxzQkFBc0I7TUFDdEJDLGNBQWM7TUFDZFosY0FBYztNQUNkSSxrQkFBa0I7TUFDbEJGLGdCQUFnQjtNQUNoQkk7SUFDRixDQUFDO0lBRUQsU0FBU1ksZUFBZUEsQ0FBQzFzQixLQUFLLEVBQUU7TUFDOUIsSUFBQTJzQixRQUFBLEdBQTZEMUYsOENBQU8sQ0FBQyxZQUFNO1VBQ3pFO1VBQ0E7VUFDQTtVQUNNLElBQ0oyRixzQkFBc0IsR0FDcEI1c0IsS0FBSyxDQURQNHNCLHNCQUFzQjtZQUVsQjNDLFlBQVksR0FBRy9CLG1HQUE2QixDQUFDbG9CLEtBQUssRUFBRW1vQixTQUFTLENBQUM7VUFFcEUsT0FBTyxDQUFDbm9CLEtBQUssQ0FBQzZPLE9BQU8sRUFBRStkLHNCQUFzQixFQUFFM0MsWUFBWSxDQUFDO1FBQzlELENBQUMsRUFBRSxDQUFDanFCLEtBQUssQ0FBQyxDQUFDO1FBQUE2c0IsU0FBQSxHQUFBaDlCLGNBQUEsQ0FBQTg4QixRQUFBO1FBVkpHLFlBQVksR0FBQUQsU0FBQTtRQUFFRCxzQkFBc0IsR0FBQUMsU0FBQTtRQUFFNUMsWUFBWSxHQUFBNEMsU0FBQTtNQVd6RCxJQUFNRSxZQUFZLEdBQUc5Riw4Q0FBTyxDQUFDLFlBQU07UUFDakM7UUFDQTtRQUNBLE9BQU82RixZQUFZLElBQUlBLFlBQVksQ0FBQ0UsUUFBUTtRQUFJO1FBQ2hEeEUsMkRBQWlCLENBQUUsYUFBYXhCLDBEQUFtQixDQUFDOEYsWUFBWSxDQUFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBR0YsWUFBWSxHQUFHOUUsT0FBTztNQUM1RyxDQUFDLEVBQUUsQ0FBQzhFLFlBQVksRUFBRTlFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFN0IsSUFBTVQsWUFBWSxHQUFHYyxpREFBVSxDQUFDMEUsWUFBWSxDQUFDLENBQUMsQ0FBQztNQUMvQztNQUNBOztNQUVBLElBQU1FLHFCQUFxQixHQUFHWixPQUFPLENBQUNyc0IsS0FBSyxDQUFDcW5CLEtBQUssQ0FBQyxJQUFJZ0YsT0FBTyxDQUFDcnNCLEtBQUssQ0FBQ3FuQixLQUFLLENBQUNNLFFBQVEsQ0FBQyxJQUFJMEUsT0FBTyxDQUFDcnNCLEtBQUssQ0FBQ3FuQixLQUFLLENBQUM2RixRQUFRLENBQUM7TUFDcEgsSUFBTUMsdUJBQXVCLEdBQUdkLE9BQU8sQ0FBQzlFLFlBQVksQ0FBQyxJQUFJOEUsT0FBTyxDQUFDOUUsWUFBWSxDQUFDRixLQUFLLENBQUM7TUFFcEYsSUFBSVIsS0FBcUMsSUFBSSxDQUFDb0cscUJBQXFCLElBQUksQ0FBQ0UsdUJBQXVCLEVBQUU7UUFDL0YsTUFBTSxJQUFJeFosS0FBSyxDQUFDLHFEQUFBeEYsTUFBQSxDQUFrRG9YLFdBQVcseURBQXFELGlGQUFpRixnQ0FBQXBYLE1BQUEsQ0FBZ0NvWCxXQUFXLHlCQUFzQixDQUFDO01BQ3ZSLENBQUMsQ0FBQzs7TUFHRixJQUFNOEIsS0FBSyxHQUFHNEYscUJBQXFCLEdBQUdqdEIsS0FBSyxDQUFDcW5CLEtBQUssR0FBR0UsWUFBWSxDQUFDRixLQUFLO01BQ3RFLElBQU1JLGNBQWMsR0FBRzBGLHVCQUF1QixHQUFHNUYsWUFBWSxDQUFDRSxjQUFjLEdBQUdKLEtBQUssQ0FBQ00sUUFBUTtNQUM3RixJQUFNMEMsa0JBQWtCLEdBQUdwRCw4Q0FBTyxDQUFDLFlBQU07UUFDdkM7UUFDQTtRQUNBLE9BQU93QixvRUFBc0IsQ0FBQ3BCLEtBQUssQ0FBQzZGLFFBQVEsRUFBRVQsc0JBQXNCLENBQUM7TUFDdkUsQ0FBQyxFQUFFLENBQUNwRixLQUFLLENBQUMsQ0FBQztNQUNYLElBQUErRixTQUFBLEdBQXlDbkcsOENBQU8sQ0FBQyxZQUFNO1VBQ3JELElBQUksQ0FBQ21ELHdCQUF3QixFQUFFLE9BQU9qQixxQkFBcUIsQ0FBQyxDQUFDO1VBQzdEOztVQUVBLElBQU0zQixZQUFZLEdBQUdOLHVFQUFrQixDQUFDRyxLQUFLLEVBQUU0RixxQkFBcUIsR0FBRzU4QixTQUFTLEdBQUdrM0IsWUFBWSxDQUFDQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1VBQy9HO1VBQ0E7VUFDQTs7VUFFQSxJQUFNSyxnQkFBZ0IsR0FBR0wsWUFBWSxDQUFDSyxnQkFBZ0IsQ0FBQzk0QixJQUFJLENBQUN5NEIsWUFBWSxDQUFDO1VBQ3pFLE9BQU8sQ0FBQ0EsWUFBWSxFQUFFSyxnQkFBZ0IsQ0FBQztRQUN6QyxDQUFDLEVBQUUsQ0FBQ1IsS0FBSyxFQUFFNEYscUJBQXFCLEVBQUUxRixZQUFZLENBQUMsQ0FBQztRQUFBOEYsU0FBQSxHQUFBeDlCLGNBQUEsQ0FBQXU5QixTQUFBO1FBWHpDNUYsWUFBWSxHQUFBNkYsU0FBQTtRQUFFeEYsZ0JBQWdCLEdBQUF3RixTQUFBLElBV1ksQ0FBQztNQUNsRDs7TUFFQSxJQUFNQyxzQkFBc0IsR0FBR3JHLDhDQUFPLENBQUMsWUFBTTtRQUMzQyxJQUFJZ0cscUJBQXFCLEVBQUU7VUFDekI7VUFDQTtVQUNBO1VBQ0EsT0FBTzFGLFlBQVk7UUFDckIsQ0FBQyxDQUFDO1FBQ0Y7O1FBR0EsT0FBT1UsOEVBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRVYsWUFBWSxFQUFFO1VBQ2hDQztRQUNGLENBQUMsQ0FBQztNQUNKLENBQUMsRUFBRSxDQUFDeUYscUJBQXFCLEVBQUUxRixZQUFZLEVBQUVDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFekQsSUFBTXVDLGNBQWMsR0FBR3pCLDZDQUFNLENBQUMsQ0FBQztNQUMvQixJQUFNd0IsZ0JBQWdCLEdBQUd4Qiw2Q0FBTSxDQUFDMkIsWUFBWSxDQUFDO01BQzdDLElBQU1DLHlCQUF5QixHQUFHNUIsNkNBQU0sQ0FBQyxDQUFDO01BQzFDLElBQU0wQixpQkFBaUIsR0FBRzFCLDZDQUFNLENBQUMsS0FBSyxDQUFDO01BQ3ZDLElBQU1pRixvQkFBb0IsR0FBR2pGLDZDQUFNLENBQUMsS0FBSyxDQUFDO01BQzFDLElBQU1nQyxTQUFTLEdBQUdoQyw2Q0FBTSxDQUFDLEtBQUssQ0FBQztNQUMvQixJQUFNa0YsK0JBQStCLEdBQUdsRiw2Q0FBTSxDQUFDLENBQUM7TUFDaERuQiw0RkFBeUIsQ0FBQyxZQUFNO1FBQzlCbUQsU0FBUyxDQUFDdGpCLE9BQU8sR0FBRyxJQUFJO1FBQ3hCLE9BQU8sWUFBTTtVQUNYc2pCLFNBQVMsQ0FBQ3RqQixPQUFPLEdBQUcsS0FBSztRQUMzQixDQUFDO01BQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQztNQUNOLElBQU15bUIsd0JBQXdCLEdBQUd4Ryw4Q0FBTyxDQUFDLFlBQU07UUFDN0MsSUFBTXZDLFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFBLEVBQVM7VUFDckI7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsSUFBSXdGLHlCQUF5QixDQUFDbGpCLE9BQU8sSUFBSWlqQixZQUFZLEtBQUtILGdCQUFnQixDQUFDOWlCLE9BQU8sRUFBRTtZQUNsRixPQUFPa2pCLHlCQUF5QixDQUFDbGpCLE9BQU87VUFDMUMsQ0FBQyxDQUFDO1VBQ0Y7VUFDQTtVQUNBOztVQUdBLE9BQU9xakIsa0JBQWtCLENBQUNoRCxLQUFLLENBQUNNLFFBQVEsQ0FBQyxDQUFDLEVBQUVzQyxZQUFZLENBQUM7UUFDM0QsQ0FBQztRQUVELE9BQU92RixRQUFRO01BQ2pCLENBQUMsRUFBRSxDQUFDMkMsS0FBSyxFQUFFNEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzNCO01BQ0E7O01BRUEsSUFBTXlELGlCQUFpQixHQUFHekcsOENBQU8sQ0FBQyxZQUFNO1FBQ3RDLElBQU0wRyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBR0MsYUFBYSxFQUFJO1VBQ2pDLElBQUksQ0FBQ3BHLFlBQVksRUFBRTtZQUNqQixPQUFPLFlBQU0sQ0FBQyxDQUFDO1VBQ2pCO1VBRUEsT0FBTzJDLGdCQUFnQixDQUFDQyx3QkFBd0IsRUFBRS9DLEtBQUssRUFBRUcsWUFBWTtVQUFFO1VBQ3ZFNkMsa0JBQWtCLEVBQUVQLGdCQUFnQixFQUFFQyxjQUFjLEVBQUVDLGlCQUFpQixFQUFFTSxTQUFTLEVBQUVKLHlCQUF5QixFQUFFckMsZ0JBQWdCLEVBQUUrRixhQUFhLENBQUM7UUFDakosQ0FBQztRQUVELE9BQU9ELFNBQVM7TUFDbEIsQ0FBQyxFQUFFLENBQUNuRyxZQUFZLENBQUMsQ0FBQztNQUNsQmdDLGlDQUFpQyxDQUFDSyxtQkFBbUIsRUFBRSxDQUFDQyxnQkFBZ0IsRUFBRUMsY0FBYyxFQUFFQyxpQkFBaUIsRUFBRUMsWUFBWSxFQUFFQyx5QkFBeUIsRUFBRXJDLGdCQUFnQixDQUFDLENBQUM7TUFDeEssSUFBSWdHLGdCQUFnQjtNQUVwQixJQUFJO1FBQ0ZBLGdCQUFnQixHQUFHN0Usb0JBQW9CO1FBQUU7UUFDekMwRSxpQkFBaUI7UUFBRTtRQUNuQjtRQUNBRCx3QkFBd0IsRUFBRWhHLGNBQWMsR0FBRztVQUFBLE9BQU00QyxrQkFBa0IsQ0FBQzVDLGNBQWMsQ0FBQyxDQUFDLEVBQUV3QyxZQUFZLENBQUM7UUFBQSxJQUFHd0Qsd0JBQXdCLENBQUM7TUFDakksQ0FBQyxDQUFDLE9BQU8zOEIsR0FBRyxFQUFFO1FBQ1osSUFBSTA4QiwrQkFBK0IsQ0FBQ3htQixPQUFPLEVBQUU7VUFDM0M7VUFDQWxXLEdBQUcsQ0FBQ3VuQixPQUFPLGdFQUFBbEssTUFBQSxDQUFnRXFmLCtCQUErQixDQUFDeG1CLE9BQU8sQ0FBQzhtQixLQUFLLFNBQU07UUFDaEk7UUFFQSxNQUFNaDlCLEdBQUc7TUFDWDtNQUVBcTJCLDRGQUF5QixDQUFDLFlBQU07UUFDOUJxRywrQkFBK0IsQ0FBQ3htQixPQUFPLEdBQUczVyxTQUFTO1FBQ25ENjVCLHlCQUF5QixDQUFDbGpCLE9BQU8sR0FBRzNXLFNBQVM7UUFDN0MwNUIsY0FBYyxDQUFDL2lCLE9BQU8sR0FBRzZtQixnQkFBZ0I7TUFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNKOztNQUVBLElBQU1FLHdCQUF3QixHQUFHOUcsOENBQU8sQ0FBQyxZQUFNO1FBQzdDLFFBQ0U7VUFDQTtVQUNBRCwwREFBbUIsQ0FBQ3VGLGdCQUFnQixFQUFFdEUsOEVBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTRGLGdCQUFnQixFQUFFO1lBQ25FdEgsR0FBRyxFQUFFcUc7VUFDUCxDQUFDLENBQUM7UUFBQztNQUVQLENBQUMsRUFBRSxDQUFDQSxzQkFBc0IsRUFBRUwsZ0JBQWdCLEVBQUVzQixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsRTs7TUFFQSxJQUFNRyxhQUFhLEdBQUcvRyw4Q0FBTyxDQUFDLFlBQU07UUFDbEMsSUFBSW1ELHdCQUF3QixFQUFFO1VBQzVCO1VBQ0E7VUFDQTtVQUNBLE9BQU8sYUFBYXBELDBEQUFtQixDQUFDK0YsWUFBWSxDQUFDM0YsUUFBUSxFQUFFO1lBQzdEdjJCLEtBQUssRUFBRXk4QjtVQUNULENBQUMsRUFBRVMsd0JBQXdCLENBQUM7UUFDOUI7UUFFQSxPQUFPQSx3QkFBd0I7TUFDakMsQ0FBQyxFQUFFLENBQUNoQixZQUFZLEVBQUVnQix3QkFBd0IsRUFBRVQsc0JBQXNCLENBQUMsQ0FBQztNQUNwRSxPQUFPVSxhQUFhO0lBQ3RCO0lBRUEsSUFBTUMsUUFBUSxHQUFHakgsaURBQVUsQ0FBQzBGLGVBQWUsQ0FBQzs7SUFFNUM7SUFDQSxJQUFNeUIsT0FBTyxHQUFHRixRQUFRO0lBQ3hCRSxPQUFPLENBQUM1QixnQkFBZ0IsR0FBR0EsZ0JBQWdCO0lBQzNDNEIsT0FBTyxDQUFDNUksV0FBVyxHQUFHbUgsZUFBZSxDQUFDbkgsV0FBVyxHQUFHQSxXQUFXO0lBRS9ELElBQUl5RyxVQUFVLEVBQUU7TUFDZCxJQUFNb0MsVUFBVSxHQUFHcEgsdURBQWdCLENBQUMsU0FBU3FILGlCQUFpQkEsQ0FBQ3J1QixLQUFLLEVBQUV1bUIsR0FBRyxFQUFFO1FBQ3pFO1FBQ0EsT0FBTyxhQUFhUywwREFBbUIsQ0FBQ21ILE9BQU8sRUFBRWxHLDhFQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUVqb0IsS0FBSyxFQUFFO1VBQ25FNHNCLHNCQUFzQixFQUFFckc7UUFDMUIsQ0FBQyxDQUFDLENBQUM7TUFDTCxDQUFDLENBQUM7TUFFRixJQUFNK0gsU0FBUyxHQUFHRixVQUFVO01BQzVCRSxTQUFTLENBQUMvSSxXQUFXLEdBQUdBLFdBQVc7TUFDbkMrSSxTQUFTLENBQUMvQixnQkFBZ0IsR0FBR0EsZ0JBQWdCO01BQzdDLE9BQU9uRSw4REFBWSxDQUFDa0csU0FBUyxFQUFFL0IsZ0JBQWdCLENBQUM7SUFDbEQ7SUFFQSxPQUFPbkUsOERBQVksQ0FBQytGLE9BQU8sRUFBRTVCLGdCQUFnQixDQUFDO0VBQ2hELENBQUM7RUFFRCxPQUFPRCxlQUFlO0FBQ3hCO0FBRUEsK0RBQWVwQixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0FDelpmLFNBQVNxRCx1QkFBdUJBLENBQUNDLEdBQUcsRUFBRXBXLElBQUksRUFBRTtFQUNqRCxPQUFPLFVBQUM4VSxRQUFRLEVBQUV2NEIsT0FBTyxFQUFLO0lBQzVCLE1BQU0sSUFBSWdmLEtBQUssMEJBQUF4RixNQUFBLENBQUE5ZixPQUFBLENBQWlDbWdDLEdBQUcsWUFBQXJnQixNQUFBLENBQVFpSyxJQUFJLDBDQUFBakssTUFBQSxDQUF1Q3haLE9BQU8sQ0FBQzYzQixvQkFBb0IsTUFBRyxDQUFDO0VBQ3hJLENBQUM7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0o2RDtBQUNpQjtBQUNoQjtBQUN2RCxTQUFTOUQseUJBQXlCQSxDQUFDMEMsa0JBQWtCLEVBQUU7RUFDNUQsT0FBT0Esa0JBQWtCLElBQUkvOEIsT0FBQSxDQUFPKzhCLGtCQUFrQixNQUFLLFFBQVEsR0FBR3NELHVFQUFzQixDQUFDLFVBQUF4QixRQUFRO0lBQUE7TUFBSTtNQUN6R3VCLHFFQUFrQixDQUFDckQsa0JBQWtCLEVBQUU4QixRQUFRO0lBQUM7RUFBQSxFQUFDLEdBQUcsQ0FBQzlCLGtCQUFrQixHQUFHc0QsdUVBQXNCLENBQUMsVUFBQXhCLFFBQVE7SUFBQSxPQUFLO01BQzVHQTtJQUNGLENBQUM7RUFBQSxDQUFDLENBQUMsR0FBRyxPQUFPOUIsa0JBQWtCLEtBQUssVUFBVTtFQUFHO0VBQ2pEdUQsbUVBQWtCLENBQUN2RCxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHbUQsMkVBQXVCLENBQUNuRCxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQztBQUNsSTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUOEU7QUFDaEI7QUFDdkQsU0FBU3pDLHNCQUFzQkEsQ0FBQ3dDLGVBQWUsRUFBRTtFQUN0RCxPQUFPLENBQUNBLGVBQWUsR0FBR3VELHVFQUFzQixDQUFDO0lBQUEsT0FBTyxDQUFDLENBQUM7RUFBQSxDQUFDLENBQUMsR0FBRyxPQUFPdkQsZUFBZSxLQUFLLFVBQVU7RUFBRztFQUN2R3dELG1FQUFrQixDQUFDeEQsZUFBZSxFQUFFLGlCQUFpQixDQUFDLEdBQUdvRCwyRUFBdUIsQ0FBQ3BELGVBQWUsRUFBRSxpQkFBaUIsQ0FBQztBQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMMEQ7QUFDQztBQUNHO0FBQ3ZELFNBQVMwRCxpQkFBaUJBLENBQUNDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLEVBQUU7RUFDckU7RUFDQSxPQUFPL0csOEVBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRStHLFFBQVEsRUFBRUYsVUFBVSxFQUFFQyxhQUFhLENBQUM7QUFDMUQ7QUFDTyxTQUFTRSxrQkFBa0JBLENBQUM1RCxVQUFVLEVBQUU7RUFDN0MsT0FBTyxTQUFTNkQsbUJBQW1CQSxDQUFDaEMsUUFBUSxFQUFBdjNCLElBQUEsRUFHekM7SUFBQSxJQUZENHZCLFdBQVcsR0FBQTV2QixJQUFBLENBQVg0dkIsV0FBVztNQUNYdUcsbUJBQW1CLEdBQUFuMkIsSUFBQSxDQUFuQm0yQixtQkFBbUI7SUFFbkIsSUFBSXFELFVBQVUsR0FBRyxLQUFLO0lBQ3RCLElBQUlDLFdBQVc7SUFDZixPQUFPLFNBQVNDLGVBQWVBLENBQUNQLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLEVBQUU7TUFDbkUsSUFBTU0sZUFBZSxHQUFHakUsVUFBVSxDQUFDeUQsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQztNQUV2RSxJQUFJRyxVQUFVLEVBQUU7UUFDZCxJQUFJLENBQUNyRCxtQkFBbUIsQ0FBQ3dELGVBQWUsRUFBRUYsV0FBVyxDQUFDLEVBQUVBLFdBQVcsR0FBR0UsZUFBZTtNQUN2RixDQUFDLE1BQU07UUFDTEgsVUFBVSxHQUFHLElBQUk7UUFDakJDLFdBQVcsR0FBR0UsZUFBZTtRQUM3QixJQUFJekksSUFBcUMsRUFBRStILG9FQUFpQixDQUFDUSxXQUFXLEVBQUU3SixXQUFXLEVBQUUsWUFBWSxDQUFDO01BQ3RHO01BRUEsT0FBTzZKLFdBQVc7SUFDcEIsQ0FBQztFQUNILENBQUM7QUFDSDtBQUNPLFNBQVN4RyxpQkFBaUJBLENBQUN5QyxVQUFVLEVBQUU7RUFDNUMsT0FBTyxDQUFDQSxVQUFVLEdBQUc7SUFBQSxPQUFNd0QsaUJBQWlCO0VBQUEsSUFBRyxPQUFPeEQsVUFBVSxLQUFLLFVBQVUsR0FBRzRELGtCQUFrQixDQUFDNUQsVUFBVSxDQUFDLEdBQUdrRCwyRUFBdUIsQ0FBQ2xELFVBQVUsRUFBRSxZQUFZLENBQUM7QUFDdEs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9Cb0c7QUFDcEcsSUFBTWxELFNBQVMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDO0FBQy9CO0FBQy9DLFNBQVNxSCw2QkFBNkJBLENBQUNyRSxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEVBQUU2QixRQUFRLEVBQUF0M0IsS0FBQSxFQUlwRztFQUFBLElBSEQ0MUIsY0FBYyxHQUFBNTFCLEtBQUEsQ0FBZDQxQixjQUFjO0lBQ2RFLGdCQUFnQixHQUFBOTFCLEtBQUEsQ0FBaEI4MUIsZ0JBQWdCO0lBQ2hCRSxrQkFBa0IsR0FBQWgyQixLQUFBLENBQWxCZzJCLGtCQUFrQjtFQUVsQixJQUFJNkQsaUJBQWlCLEdBQUcsS0FBSztFQUM3QixJQUFJQyxLQUFLO0VBQ1QsSUFBSVYsUUFBUTtFQUNaLElBQUlGLFVBQVU7RUFDZCxJQUFJQyxhQUFhO0VBQ2pCLElBQUlLLFdBQVc7RUFFZixTQUFTTyxlQUFlQSxDQUFDQyxVQUFVLEVBQUVDLGFBQWEsRUFBRTtJQUNsREgsS0FBSyxHQUFHRSxVQUFVO0lBQ2xCWixRQUFRLEdBQUdhLGFBQWE7SUFDeEJmLFVBQVUsR0FBRzNELGVBQWUsQ0FBQ3VFLEtBQUssRUFBRVYsUUFBUSxDQUFDO0lBQzdDRCxhQUFhLEdBQUczRCxrQkFBa0IsQ0FBQzhCLFFBQVEsRUFBRThCLFFBQVEsQ0FBQztJQUN0REksV0FBVyxHQUFHL0QsVUFBVSxDQUFDeUQsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQztJQUM3RFMsaUJBQWlCLEdBQUcsSUFBSTtJQUN4QixPQUFPTCxXQUFXO0VBQ3BCO0VBRUEsU0FBU1UseUJBQXlCQSxDQUFBLEVBQUc7SUFDbkNoQixVQUFVLEdBQUczRCxlQUFlLENBQUN1RSxLQUFLLEVBQUVWLFFBQVEsQ0FBQztJQUM3QyxJQUFJNUQsa0JBQWtCLENBQUMyRSxpQkFBaUIsRUFBRWhCLGFBQWEsR0FBRzNELGtCQUFrQixDQUFDOEIsUUFBUSxFQUFFOEIsUUFBUSxDQUFDO0lBQ2hHSSxXQUFXLEdBQUcvRCxVQUFVLENBQUN5RCxVQUFVLEVBQUVDLGFBQWEsRUFBRUMsUUFBUSxDQUFDO0lBQzdELE9BQU9JLFdBQVc7RUFDcEI7RUFFQSxTQUFTWSxjQUFjQSxDQUFBLEVBQUc7SUFDeEIsSUFBSTdFLGVBQWUsQ0FBQzRFLGlCQUFpQixFQUFFakIsVUFBVSxHQUFHM0QsZUFBZSxDQUFDdUUsS0FBSyxFQUFFVixRQUFRLENBQUM7SUFDcEYsSUFBSTVELGtCQUFrQixDQUFDMkUsaUJBQWlCLEVBQUVoQixhQUFhLEdBQUczRCxrQkFBa0IsQ0FBQzhCLFFBQVEsRUFBRThCLFFBQVEsQ0FBQztJQUNoR0ksV0FBVyxHQUFHL0QsVUFBVSxDQUFDeUQsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQztJQUM3RCxPQUFPSSxXQUFXO0VBQ3BCO0VBRUEsU0FBU2EsY0FBY0EsQ0FBQSxFQUFHO0lBQ3hCLElBQU1DLGNBQWMsR0FBRy9FLGVBQWUsQ0FBQ3VFLEtBQUssRUFBRVYsUUFBUSxDQUFDO0lBQ3ZELElBQU1tQixpQkFBaUIsR0FBRyxDQUFDdkUsa0JBQWtCLENBQUNzRSxjQUFjLEVBQUVwQixVQUFVLENBQUM7SUFDekVBLFVBQVUsR0FBR29CLGNBQWM7SUFDM0IsSUFBSUMsaUJBQWlCLEVBQUVmLFdBQVcsR0FBRy9ELFVBQVUsQ0FBQ3lELFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLENBQUM7SUFDcEYsT0FBT0ksV0FBVztFQUNwQjtFQUVBLFNBQVNnQixxQkFBcUJBLENBQUNDLFNBQVMsRUFBRUMsWUFBWSxFQUFFO0lBQ3RELElBQU1DLFlBQVksR0FBRyxDQUFDN0UsZ0JBQWdCLENBQUM0RSxZQUFZLEVBQUV0QixRQUFRLENBQUM7SUFDOUQsSUFBTXdCLFlBQVksR0FBRyxDQUFDaEYsY0FBYyxDQUFDNkUsU0FBUyxFQUFFWCxLQUFLLEVBQUVZLFlBQVksRUFBRXRCLFFBQVEsQ0FBQztJQUM5RVUsS0FBSyxHQUFHVyxTQUFTO0lBQ2pCckIsUUFBUSxHQUFHc0IsWUFBWTtJQUN2QixJQUFJQyxZQUFZLElBQUlDLFlBQVksRUFBRSxPQUFPVix5QkFBeUIsQ0FBQyxDQUFDO0lBQ3BFLElBQUlTLFlBQVksRUFBRSxPQUFPUCxjQUFjLENBQUMsQ0FBQztJQUN6QyxJQUFJUSxZQUFZLEVBQUUsT0FBT1AsY0FBYyxDQUFDLENBQUM7SUFDekMsT0FBT2IsV0FBVztFQUNwQjtFQUVBLE9BQU8sU0FBU3FCLHNCQUFzQkEsQ0FBQ0osU0FBUyxFQUFFQyxZQUFZLEVBQUU7SUFDOUQsT0FBT2IsaUJBQWlCLEdBQUdXLHFCQUFxQixDQUFDQyxTQUFTLEVBQUVDLFlBQVksQ0FBQyxHQUFHWCxlQUFlLENBQUNVLFNBQVMsRUFBRUMsWUFBWSxDQUFDO0VBQ3RILENBQUM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU0kseUJBQXlCQSxDQUFDeEQsUUFBUSxFQUFFdjNCLElBQUksRUFBRTtFQUNoRSxJQUNFdTJCLG1CQUFtQixHQUdqQnYyQixJQUFJLENBSE51MkIsbUJBQW1CO0lBQ25CQyxzQkFBc0IsR0FFcEJ4MkIsSUFBSSxDQUZOdzJCLHNCQUFzQjtJQUN0QkMsY0FBYyxHQUNaejJCLElBQUksQ0FETnkyQixjQUFjO0lBRVp6M0IsT0FBTyxHQUFHdXpCLG1HQUE2QixDQUFDdnlCLElBQUksRUFBRXd5QixTQUFTLENBQUM7RUFFNUQsSUFBTWdELGVBQWUsR0FBR2UsbUJBQW1CLENBQUNnQixRQUFRLEVBQUV2NEIsT0FBTyxDQUFDO0VBQzlELElBQU15MkIsa0JBQWtCLEdBQUdlLHNCQUFzQixDQUFDZSxRQUFRLEVBQUV2NEIsT0FBTyxDQUFDO0VBQ3BFLElBQU0wMkIsVUFBVSxHQUFHZSxjQUFjLENBQUNjLFFBQVEsRUFBRXY0QixPQUFPLENBQUM7RUFFcEQsSUFBSWt5QixJQUFxQyxFQUFFO0lBQ3pDMEksK0RBQWtCLENBQUNwRSxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLENBQUM7RUFDckU7RUFFQSxPQUFPbUUsNkJBQTZCLENBQUNyRSxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEVBQUU2QixRQUFRLEVBQUV2NEIsT0FBTyxDQUFDO0FBQzFHOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkZ1QztBQUV2QyxTQUFTZzhCLE1BQU1BLENBQUNqTSxRQUFRLEVBQUV4SyxVQUFVLEVBQUU7RUFDcEMsSUFBSSxDQUFDd0ssUUFBUSxFQUFFO0lBQ2IsTUFBTSxJQUFJL1EsS0FBSyx5QkFBQXhGLE1BQUEsQ0FBeUIrTCxVQUFVLGlCQUFjLENBQUM7RUFDbkUsQ0FBQyxNQUFNLElBQUlBLFVBQVUsS0FBSyxpQkFBaUIsSUFBSUEsVUFBVSxLQUFLLG9CQUFvQixFQUFFO0lBQ2xGLElBQUksQ0FBQ3JyQixNQUFNLENBQUM0UixTQUFTLENBQUM4VCxjQUFjLENBQUN2VixJQUFJLENBQUMwbEIsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEVBQUU7TUFDeEVvRSwwREFBTyxxQkFBQTNhLE1BQUEsQ0FBcUIrTCxVQUFVLCtEQUE0RCxDQUFDO0lBQ3JHO0VBQ0Y7QUFDRjtBQUVlLFNBQVNxVixrQkFBa0JBLENBQUNwRSxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEVBQUU7RUFDMUZzRixNQUFNLENBQUN4RixlQUFlLEVBQUUsaUJBQWlCLENBQUM7RUFDMUN3RixNQUFNLENBQUN2RixrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQztFQUNoRHVGLE1BQU0sQ0FBQ3RGLFVBQVUsRUFBRSxZQUFZLENBQUM7QUFDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCMkQ7QUFDcEQsU0FBU3FELHNCQUFzQkE7QUFBRTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBa0MsV0FBVyxFQUFFO0VBQ1gsT0FBTyxTQUFTQyxvQkFBb0JBLENBQUMzRCxRQUFRLEVBQUU7SUFDN0MsSUFBTTRELFFBQVEsR0FBR0YsV0FBVyxDQUFDMUQsUUFBUSxDQUFDO0lBRXRDLFNBQVM2RCxnQkFBZ0JBLENBQUEsRUFBRztNQUMxQixPQUFPRCxRQUFRO0lBQ2pCO0lBRUFDLGdCQUFnQixDQUFDaEIsaUJBQWlCLEdBQUcsS0FBSztJQUMxQyxPQUFPZ0IsZ0JBQWdCO0VBQ3pCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTQyxvQkFBb0JBLENBQUNDLFVBQVUsRUFBRTtFQUMvQyxPQUFPQSxVQUFVLENBQUNsQixpQkFBaUIsR0FBRzFELE9BQU8sQ0FBQzRFLFVBQVUsQ0FBQ2xCLGlCQUFpQixDQUFDLEdBQUdrQixVQUFVLENBQUM5aEMsTUFBTSxLQUFLLENBQUM7QUFDdkcsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTdy9CLGtCQUFrQkEsQ0FBQ3NDLFVBQVUsRUFBRS9XLFVBQVUsRUFBRTtFQUN6RCxPQUFPLFNBQVNnWCxpQkFBaUJBLENBQUNoRSxRQUFRLEVBQUF2M0IsSUFBQSxFQUV2QztJQUFBLElBREQ0dkIsV0FBVyxHQUFBNXZCLElBQUEsQ0FBWDR2QixXQUFXO0lBRVgsSUFBTTRMLEtBQUssR0FBRyxTQUFTQyxlQUFlQSxDQUFDQyxlQUFlLEVBQUVyQyxRQUFRLEVBQUU7TUFDaEUsT0FBT21DLEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHb0IsS0FBSyxDQUFDRixVQUFVLENBQUNJLGVBQWUsRUFBRXJDLFFBQVEsQ0FBQyxHQUFHbUMsS0FBSyxDQUFDRixVQUFVLENBQUNJLGVBQWUsRUFBRWhoQyxTQUFTLENBQUM7SUFDN0gsQ0FBQyxDQUFDLENBQUM7O0lBR0g4Z0MsS0FBSyxDQUFDcEIsaUJBQWlCLEdBQUcsSUFBSTtJQUU5Qm9CLEtBQUssQ0FBQ0YsVUFBVSxHQUFHLFNBQVNLLHNCQUFzQkEsQ0FBQ0QsZUFBZSxFQUFFckMsUUFBUSxFQUFFO01BQzVFbUMsS0FBSyxDQUFDRixVQUFVLEdBQUdBLFVBQVU7TUFDN0JFLEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHaUIsb0JBQW9CLENBQUNDLFVBQVUsQ0FBQztNQUMxRCxJQUFJanhCLEtBQUssR0FBR214QixLQUFLLENBQUNFLGVBQWUsRUFBRXJDLFFBQVEsQ0FBQztNQUU1QyxJQUFJLE9BQU9odkIsS0FBSyxLQUFLLFVBQVUsRUFBRTtRQUMvQm14QixLQUFLLENBQUNGLFVBQVUsR0FBR2p4QixLQUFLO1FBQ3hCbXhCLEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHaUIsb0JBQW9CLENBQUNoeEIsS0FBSyxDQUFDO1FBQ3JEQSxLQUFLLEdBQUdteEIsS0FBSyxDQUFDRSxlQUFlLEVBQUVyQyxRQUFRLENBQUM7TUFDMUM7TUFFQSxJQUFJbkksSUFBcUMsRUFBRStILG9FQUFpQixDQUFDNXVCLEtBQUssRUFBRXVsQixXQUFXLEVBQUVyTCxVQUFVLENBQUM7TUFDNUYsT0FBT2xhLEtBQUs7SUFDZCxDQUFDO0lBRUQsT0FBT214QixLQUFLO0VBQ2QsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JFNkM7QUFDRjtBQUNjO0FBQ2E7QUFDQTtBQUNUO0FBQ2I7QUFDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQa0M7QUFDZ0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNLLGtCQUFrQkEsQ0FBQSxFQUE4QjtFQUFBLElBQTdCM2lCLE9BQU8sR0FBQTNmLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcwM0Isa0VBQWlCO0VBQzVELElBQU0rSyxRQUFRO0VBQUc7RUFDakI5aUIsT0FBTyxLQUFLK1gsa0VBQWlCLEdBQUdpTCwrQ0FBZSxHQUFHRCwwREFBZSxDQUFDL2lCLE9BQU8sQ0FBQztFQUMxRSxPQUFPLFNBQVMwaUIsV0FBV0EsQ0FBQSxFQUFHO0lBQzVCLElBQU1sSyxLQUFLLEdBQUdzSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRTFCLE9BQU90SyxLQUFLLENBQUM2RixRQUFRO0VBQ3ZCLENBQUM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxJQUFNcUUsV0FBVyxHQUFHLGFBQWFDLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hDekI7QUFDdUI7O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU00sZUFBZUEsQ0FBQSxFQUFHO0VBQ2hDLElBQU12SyxZQUFZLEdBQUdjLGlEQUFVLENBQUN6QixrRUFBaUIsQ0FBQztFQUVsRCxJQUFJQyxLQUFxQyxJQUFJLENBQUNVLFlBQVksRUFBRTtJQUMxRCxNQUFNLElBQUk1VCxLQUFLLENBQUMsa0dBQWtHLENBQUM7RUFDckg7RUFFQSxPQUFPNFQsWUFBWTtBQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCa0Q7QUFDNEI7QUFDcEI7QUFDSztBQUMvRCxJQUFJMEssZ0NBQWdDLEdBQUdsSix1RUFBYztBQUM5QyxJQUFNbUoscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBR3A0QixFQUFFLEVBQUk7RUFDekNtNEIsZ0NBQWdDLEdBQUduNEIsRUFBRTtBQUN2QyxDQUFDO0FBRUQsSUFBTXE0QixXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSXRrQixDQUFDLEVBQUVDLENBQUM7RUFBQSxPQUFLRCxDQUFDLEtBQUtDLENBQUM7QUFBQTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR08sU0FBUzRqQixrQkFBa0JBLENBQUEsRUFBOEI7RUFBQSxJQUE3QjdpQixPQUFPLEdBQUEzZixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHMDNCLGtFQUFpQjtFQUM1RCxJQUFNa0wsZUFBZSxHQUFHampCLE9BQU8sS0FBSytYLGtFQUFpQixHQUFHb0wsNkRBQXNCLEdBQUc7SUFBQSxPQUFNM0osaURBQVUsQ0FBQ3haLE9BQU8sQ0FBQztFQUFBO0VBQzFHLE9BQU8sU0FBUzRpQixXQUFXQSxDQUFDL00sUUFBUSxFQUE0QjtJQUFBLElBQTFCME4sVUFBVSxHQUFBbGpDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUdpakMsV0FBVztJQUM1RCxJQUFJdEwsSUFBcUMsRUFBRTtNQUN6QyxJQUFJLENBQUNuQyxRQUFRLEVBQUU7UUFDYixNQUFNLElBQUkvUSxLQUFLLDBDQUEwQyxDQUFDO01BQzVEO01BRUEsSUFBSSxPQUFPK1EsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUNsQyxNQUFNLElBQUkvUSxLQUFLLHdEQUF3RCxDQUFDO01BQzFFO01BRUEsSUFBSSxPQUFPeWUsVUFBVSxLQUFLLFVBQVUsRUFBRTtRQUNwQyxNQUFNLElBQUl6ZSxLQUFLLGtFQUFrRSxDQUFDO01BQ3BGO0lBQ0Y7SUFFQSxJQUFBMGUsZ0JBQUEsR0FJSVAsZUFBZSxDQUFDLENBQUM7TUFIbkJ6SyxLQUFLLEdBQUFnTCxnQkFBQSxDQUFMaEwsS0FBSztNQUNMRyxZQUFZLEdBQUE2SyxnQkFBQSxDQUFaN0ssWUFBWTtNQUNaQyxjQUFjLEdBQUE0SyxnQkFBQSxDQUFkNUssY0FBYztJQUVoQixJQUFNNkssYUFBYSxHQUFHTCxnQ0FBZ0MsQ0FBQ3pLLFlBQVksQ0FBQytLLFlBQVksRUFBRWxMLEtBQUssQ0FBQ00sUUFBUSxFQUFFRixjQUFjLElBQUlKLEtBQUssQ0FBQ00sUUFBUSxFQUFFakQsUUFBUSxFQUFFME4sVUFBVSxDQUFDO0lBQ3pKTCxvREFBYSxDQUFDTyxhQUFhLENBQUM7SUFDNUIsT0FBT0EsYUFBYTtFQUN0QixDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLElBQU1iLFdBQVcsR0FBRyxhQUFhQyxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JFekI7QUFDdUI7QUFDb0I7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNFLGVBQWVBLENBQUEsRUFBOEI7RUFBQSxJQUE3Qi9pQixPQUFPLEdBQUEzZixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHMDNCLGtFQUFpQjtFQUN6RCxJQUFNa0wsZUFBZTtFQUFHO0VBQ3hCampCLE9BQU8sS0FBSytYLGtFQUFpQixHQUFHb0wsNkRBQXNCLEdBQUc7SUFBQSxPQUFNM0osaURBQVUsQ0FBQ3haLE9BQU8sQ0FBQztFQUFBO0VBQ2xGLE9BQU8sU0FBUzhpQixRQUFRQSxDQUFBLEVBQUc7SUFDekIsSUFBQVUsZ0JBQUEsR0FFSVAsZUFBZSxDQUFDLENBQUM7TUFEbkJ6SyxLQUFLLEdBQUFnTCxnQkFBQSxDQUFMaEwsS0FBSyxDQUNlLENBQUM7O0lBRXZCLE9BQU9BLEtBQUs7RUFDZCxDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sSUFBTXNLLFFBQVEsR0FBRyxhQUFhQyxlQUFlLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQ3REO0FBQ0E7QUFDQTtBQUNvRTtBQUMwQjtBQUNmO0FBQ3RDO0FBQ21CO0FBQ0g7QUFDekRNLHlFQUFxQixDQUFDRCx3R0FBZ0MsQ0FBQztBQUN2RGhKLHNFQUFpQixDQUFDRCw4RUFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDekM7O0FBRUF5SixzREFBUSxDQUFDOU4sK0VBQUssQ0FBQztBQUNFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRWRrQixDQUFDO0FBQ3BDO0FBQ0E7O0FBRUEsU0FBU2dPLHdCQUF3QkEsQ0FBQSxFQUFHO0VBQ2xDLElBQU1oTyxLQUFLLEdBQUcrTixnREFBUSxDQUFDLENBQUM7RUFDeEIsSUFBSXZqQixLQUFLLEdBQUcsSUFBSTtFQUNoQixJQUFJeWpCLElBQUksR0FBRyxJQUFJO0VBQ2YsT0FBTztJQUNMQyxLQUFLQSxDQUFBLEVBQUc7TUFDTjFqQixLQUFLLEdBQUcsSUFBSTtNQUNaeWpCLElBQUksR0FBRyxJQUFJO0lBQ2IsQ0FBQztJQUVERSxNQUFNQSxDQUFBLEVBQUc7TUFDUG5PLEtBQUssQ0FBQyxZQUFNO1FBQ1YsSUFBSW9PLFFBQVEsR0FBRzVqQixLQUFLO1FBRXBCLE9BQU80akIsUUFBUSxFQUFFO1VBQ2ZBLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7VUFDbkJELFFBQVEsR0FBR0EsUUFBUSxDQUFDcmlDLElBQUk7UUFDMUI7TUFDRixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ2SCxHQUFHQSxDQUFBLEVBQUc7TUFDSixJQUFJMDZCLFNBQVMsR0FBRyxFQUFFO01BQ2xCLElBQUlGLFFBQVEsR0FBRzVqQixLQUFLO01BRXBCLE9BQU80akIsUUFBUSxFQUFFO1FBQ2ZFLFNBQVMsQ0FBQ3JpQyxJQUFJLENBQUNtaUMsUUFBUSxDQUFDO1FBQ3hCQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ3JpQyxJQUFJO01BQzFCO01BRUEsT0FBT3VpQyxTQUFTO0lBQ2xCLENBQUM7SUFFRHRGLFNBQVNBLENBQUNxRixRQUFRLEVBQUU7TUFDbEIsSUFBSUUsWUFBWSxHQUFHLElBQUk7TUFDdkIsSUFBSUgsUUFBUSxHQUFHSCxJQUFJLEdBQUc7UUFDcEJJLFFBQVE7UUFDUnRpQyxJQUFJLEVBQUUsSUFBSTtRQUNWeWlDLElBQUksRUFBRVA7TUFDUixDQUFDO01BRUQsSUFBSUcsUUFBUSxDQUFDSSxJQUFJLEVBQUU7UUFDakJKLFFBQVEsQ0FBQ0ksSUFBSSxDQUFDemlDLElBQUksR0FBR3FpQyxRQUFRO01BQy9CLENBQUMsTUFBTTtRQUNMNWpCLEtBQUssR0FBRzRqQixRQUFRO01BQ2xCO01BRUEsT0FBTyxTQUFTSyxXQUFXQSxDQUFBLEVBQUc7UUFDNUIsSUFBSSxDQUFDRixZQUFZLElBQUkvakIsS0FBSyxLQUFLLElBQUksRUFBRTtRQUNyQytqQixZQUFZLEdBQUcsS0FBSztRQUVwQixJQUFJSCxRQUFRLENBQUNyaUMsSUFBSSxFQUFFO1VBQ2pCcWlDLFFBQVEsQ0FBQ3JpQyxJQUFJLENBQUN5aUMsSUFBSSxHQUFHSixRQUFRLENBQUNJLElBQUk7UUFDcEMsQ0FBQyxNQUFNO1VBQ0xQLElBQUksR0FBR0csUUFBUSxDQUFDSSxJQUFJO1FBQ3RCO1FBRUEsSUFBSUosUUFBUSxDQUFDSSxJQUFJLEVBQUU7VUFDakJKLFFBQVEsQ0FBQ0ksSUFBSSxDQUFDemlDLElBQUksR0FBR3FpQyxRQUFRLENBQUNyaUMsSUFBSTtRQUNwQyxDQUFDLE1BQU07VUFDTHllLEtBQUssR0FBRzRqQixRQUFRLENBQUNyaUMsSUFBSTtRQUN2QjtNQUNGLENBQUM7SUFDSDtFQUVGLENBQUM7QUFDSDtBQUVBLElBQU0yaUMsYUFBYSxHQUFHO0VBQ3BCUCxNQUFNQSxDQUFBLEVBQUcsQ0FBQyxDQUFDO0VBRVh2NkIsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUE7SUFBQSxPQUFRLEVBQUU7RUFBQTtBQUNmLENBQUM7QUFDTSxTQUFTMnVCLGtCQUFrQkEsQ0FBQ0csS0FBSyxFQUFFaU0sU0FBUyxFQUFFO0VBQ25ELElBQUlGLFdBQVc7RUFDZixJQUFJSCxTQUFTLEdBQUdJLGFBQWE7RUFFN0IsU0FBU2QsWUFBWUEsQ0FBQ1EsUUFBUSxFQUFFO0lBQzlCakwsWUFBWSxDQUFDLENBQUM7SUFDZCxPQUFPbUwsU0FBUyxDQUFDdEYsU0FBUyxDQUFDb0YsUUFBUSxDQUFDO0VBQ3RDO0VBRUEsU0FBU2xMLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQzFCb0wsU0FBUyxDQUFDSCxNQUFNLENBQUMsQ0FBQztFQUNwQjtFQUVBLFNBQVNTLG1CQUFtQkEsQ0FBQSxFQUFHO0lBQzdCLElBQUkvTCxZQUFZLENBQUNJLGFBQWEsRUFBRTtNQUM5QkosWUFBWSxDQUFDSSxhQUFhLENBQUMsQ0FBQztJQUM5QjtFQUNGO0VBRUEsU0FBU3NMLFlBQVlBLENBQUEsRUFBRztJQUN0QixPQUFPN0csT0FBTyxDQUFDK0csV0FBVyxDQUFDO0VBQzdCO0VBRUEsU0FBU3RMLFlBQVlBLENBQUEsRUFBRztJQUN0QixJQUFJLENBQUNzTCxXQUFXLEVBQUU7TUFDaEJBLFdBQVcsR0FBR0UsU0FBUyxHQUFHQSxTQUFTLENBQUNmLFlBQVksQ0FBQ2dCLG1CQUFtQixDQUFDLEdBQUdsTSxLQUFLLENBQUNzRyxTQUFTLENBQUM0RixtQkFBbUIsQ0FBQztNQUM1R04sU0FBUyxHQUFHTix3QkFBd0IsQ0FBQyxDQUFDO0lBQ3hDO0VBQ0Y7RUFFQSxTQUFTNUssY0FBY0EsQ0FBQSxFQUFHO0lBQ3hCLElBQUlxTCxXQUFXLEVBQUU7TUFDZkEsV0FBVyxDQUFDLENBQUM7TUFDYkEsV0FBVyxHQUFHL2lDLFNBQVM7TUFDdkI0aUMsU0FBUyxDQUFDSixLQUFLLENBQUMsQ0FBQztNQUNqQkksU0FBUyxHQUFHSSxhQUFhO0lBQzNCO0VBQ0Y7RUFFQSxJQUFNN0wsWUFBWSxHQUFHO0lBQ25CK0ssWUFBWTtJQUNaMUssZ0JBQWdCO0lBQ2hCMEwsbUJBQW1CO0lBQ25CTCxZQUFZO0lBQ1pwTCxZQUFZO0lBQ1pDLGNBQWM7SUFDZHlMLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFBO01BQUEsT0FBUVAsU0FBUztJQUFBO0VBQy9CLENBQUM7RUFDRCxPQUFPekwsWUFBWTtBQUNyQjs7Ozs7Ozs7Ozs7Ozs7OztBQzlIQTtBQUNBLFNBQVNpTSxnQkFBZ0JBLENBQUNULFFBQVEsRUFBRTtFQUNsQ0EsUUFBUSxDQUFDLENBQUM7QUFDWjtBQUVBLElBQUlyTyxLQUFLLEdBQUc4TyxnQkFBZ0IsQ0FBQyxDQUFDOztBQUV2QixJQUFNaEIsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUdpQixRQUFRO0VBQUEsT0FBSS9PLEtBQUssR0FBRytPLFFBQVE7QUFBQSxFQUFDLENBQUM7O0FBRS9DLElBQU1oQixRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBQTtFQUFBLE9BQVMvTixLQUFLO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztBQ1RwQixTQUFTOEosa0JBQWtCQSxDQUFDa0YsY0FBYyxFQUFFekcsUUFBUSxFQUFFO0VBQ25FLElBQU0wRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7RUFBQyxJQUFBaGhDLEtBQUEsWUFBQUEsTUFBQSxFQUVHO0lBQ2hDLElBQU1paEMsYUFBYSxHQUFHRixjQUFjLENBQUM5OUIsR0FBRyxDQUFDO0lBRXpDLElBQUksT0FBT2crQixhQUFhLEtBQUssVUFBVSxFQUFFO01BQ3ZDRCxtQkFBbUIsQ0FBQy85QixHQUFHLENBQUMsR0FBRztRQUFBLE9BQWFxM0IsUUFBUSxDQUFDMkcsYUFBYSxDQUFBcm1CLEtBQUEsU0FBQXRlLFNBQVEsQ0FBQyxDQUFDO01BQUE7SUFDMUU7RUFDRixDQUFDO0VBTkQsS0FBSyxJQUFNMkcsR0FBRyxJQUFJODlCLGNBQWM7SUFBQS9nQyxLQUFBO0VBQUE7RUFRaEMsT0FBT2doQyxtQkFBbUI7QUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVNFLGFBQWFBLENBQUMvbUIsR0FBRyxFQUFFO0VBQ3pDLElBQUkxZSxPQUFBLENBQU8wZSxHQUFHLE1BQUssUUFBUSxJQUFJQSxHQUFHLEtBQUssSUFBSSxFQUFFLE9BQU8sS0FBSztFQUN6RCxJQUFJZ25CLEtBQUssR0FBR2xsQyxNQUFNLENBQUM0bEIsY0FBYyxDQUFDMUgsR0FBRyxDQUFDO0VBQ3RDLElBQUlnbkIsS0FBSyxLQUFLLElBQUksRUFBRSxPQUFPLElBQUk7RUFDL0IsSUFBSUMsU0FBUyxHQUFHRCxLQUFLO0VBRXJCLE9BQU9sbEMsTUFBTSxDQUFDNGxCLGNBQWMsQ0FBQ3VmLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNoREEsU0FBUyxHQUFHbmxDLE1BQU0sQ0FBQzRsQixjQUFjLENBQUN1ZixTQUFTLENBQUM7RUFDOUM7RUFFQSxPQUFPRCxLQUFLLEtBQUtDLFNBQVM7QUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRWZBLFNBQVNyYSxFQUFFQSxDQUFDL2lCLENBQUMsRUFBRUUsQ0FBQyxFQUFFO0VBQ2hCLElBQUlGLENBQUMsS0FBS0UsQ0FBQyxFQUFFO0lBQ1gsT0FBT0YsQ0FBQyxLQUFLLENBQUMsSUFBSUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUdGLENBQUMsS0FBSyxDQUFDLEdBQUdFLENBQUM7RUFDOUMsQ0FBQyxNQUFNO0lBQ0wsT0FBT0YsQ0FBQyxLQUFLQSxDQUFDLElBQUlFLENBQUMsS0FBS0EsQ0FBQztFQUMzQjtBQUNGO0FBRWUsU0FBUyt4QixZQUFZQSxDQUFDb0wsSUFBSSxFQUFFQyxJQUFJLEVBQUU7RUFDL0MsSUFBSXZhLEVBQUUsQ0FBQ3NhLElBQUksRUFBRUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJO0VBRS9CLElBQUk3bEMsT0FBQSxDQUFPNGxDLElBQUksTUFBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUFJLElBQUk1bEMsT0FBQSxDQUFPNmxDLElBQUksTUFBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUFJLEVBQUU7SUFDMUYsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxJQUFNMWIsS0FBSyxHQUFHM3BCLE1BQU0sQ0FBQ1ksSUFBSSxDQUFDd2tDLElBQUksQ0FBQztFQUMvQixJQUFNRSxLQUFLLEdBQUd0bEMsTUFBTSxDQUFDWSxJQUFJLENBQUN5a0MsSUFBSSxDQUFDO0VBQy9CLElBQUkxYixLQUFLLENBQUNycEIsTUFBTSxLQUFLZ2xDLEtBQUssQ0FBQ2hsQyxNQUFNLEVBQUUsT0FBTyxLQUFLO0VBRS9DLEtBQUssSUFBSWEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHd29CLEtBQUssQ0FBQ3JwQixNQUFNLEVBQUVhLENBQUMsRUFBRSxFQUFFO0lBQ3JDLElBQUksQ0FBQ25CLE1BQU0sQ0FBQzRSLFNBQVMsQ0FBQzhULGNBQWMsQ0FBQ3ZWLElBQUksQ0FBQ2sxQixJQUFJLEVBQUUxYixLQUFLLENBQUN4b0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDMnBCLEVBQUUsQ0FBQ3NhLElBQUksQ0FBQ3piLEtBQUssQ0FBQ3hvQixDQUFDLENBQUMsQ0FBQyxFQUFFa2tDLElBQUksQ0FBQzFiLEtBQUssQ0FBQ3hvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDaEcsT0FBTyxLQUFLO0lBQ2Q7RUFDRjtFQUVBLE9BQU8sSUFBSTtBQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQm1ELENBQUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxJQUFNc2tDLFNBQVMsR0FBRyxDQUFDLEVBQUUsT0FBT3ZPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBT0EsTUFBTSxDQUFDd08sUUFBUSxLQUFLLFdBQVcsSUFBSSxPQUFPeE8sTUFBTSxDQUFDd08sUUFBUSxDQUFDak8sYUFBYSxLQUFLLFdBQVcsQ0FBQztBQUNySixJQUFNYSx5QkFBeUIsR0FBR21OLFNBQVMsR0FBR0Qsa0RBQWUsR0FBR0QsNENBQVM7Ozs7Ozs7Ozs7Ozs7OztBQ1h6RSxJQUFNckwsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFBLEVBQVM7RUFDbEMsTUFBTSxJQUFJcFYsS0FBSyxDQUFDLHVCQUF1QixDQUFDO0FBQzFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRjJDO0FBQ1o7QUFDakIsU0FBU2liLGlCQUFpQkEsQ0FBQy85QixLQUFLLEVBQUUwMEIsV0FBVyxFQUFFckwsVUFBVSxFQUFFO0VBQ3hFLElBQUksQ0FBQzRaLDBEQUFhLENBQUNqakMsS0FBSyxDQUFDLEVBQUU7SUFDekJpNEIsb0RBQU8sSUFBQTNhLE1BQUEsQ0FBSStMLFVBQVUsWUFBQS9MLE1BQUEsQ0FBU29YLFdBQVcsb0RBQUFwWCxNQUFBLENBQWlEdGQsS0FBSyxNQUFHLENBQUM7RUFDckc7QUFDRjs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU2k0QixPQUFPQSxDQUFDelEsT0FBTyxFQUFFO0VBQ3ZDO0VBQ0EsSUFBSSxPQUFPalQsT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPQSxPQUFPLENBQUN5bEIsS0FBSyxLQUFLLFVBQVUsRUFBRTtJQUN6RXpsQixPQUFPLENBQUN5bEIsS0FBSyxDQUFDeFMsT0FBTyxDQUFDO0VBQ3hCO0VBQ0E7O0VBR0EsSUFBSTtJQUNGO0lBQ0E7SUFDQTtJQUNBLE1BQU0sSUFBSTFFLEtBQUssQ0FBQzBFLE9BQU8sQ0FBQztJQUN4QjtFQUNGLENBQUMsQ0FBQyxPQUFPcGtCLENBQUMsRUFBRSxDQUFDO0VBQ2I7QUFFRjs7Ozs7Ozs7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUFBLFNBQUE1RixRQUFBK3pCLENBQUEsc0NBQUEvekIsT0FBQSx3QkFBQWtDLE1BQUEsdUJBQUFBLE1BQUEsQ0FBQUMsUUFBQSxhQUFBNHhCLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQTd4QixNQUFBLElBQUE2eEIsQ0FBQSxDQUFBaFMsV0FBQSxLQUFBN2YsTUFBQSxJQUFBNnhCLENBQUEsS0FBQTd4QixNQUFBLENBQUFrUSxTQUFBLHFCQUFBMmhCLENBQUEsS0FBQS96QixPQUFBLENBQUErekIsQ0FBQTtBQUViLElBQUl5RSxJQUFxQyxFQUFFO0VBQ3pDLENBQUMsWUFBVztJQUNkLFlBQVk7O0lBRVo7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJMk4sa0JBQWtCLEdBQUdqa0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxlQUFlLENBQUM7SUFDcEQsSUFBSUMsaUJBQWlCLEdBQUdua0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFDbEQsSUFBSUUsbUJBQW1CLEdBQUdwa0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJRyxzQkFBc0IsR0FBR3JrQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0lBQzVELElBQUlJLG1CQUFtQixHQUFHdGtDLE1BQU0sQ0FBQ2trQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDdEQsSUFBSUssbUJBQW1CLEdBQUd2a0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJTSxrQkFBa0IsR0FBR3hrQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLGVBQWUsQ0FBQztJQUNwRCxJQUFJTyx5QkFBeUIsR0FBR3prQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLHNCQUFzQixDQUFDO0lBQ2xFLElBQUlRLHNCQUFzQixHQUFHMWtDLE1BQU0sQ0FBQ2trQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDNUQsSUFBSVMsbUJBQW1CLEdBQUcza0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJVSx3QkFBd0IsR0FBRzVrQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLHFCQUFxQixDQUFDO0lBQ2hFLElBQUlXLGVBQWUsR0FBRzdrQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUM5QyxJQUFJWSxlQUFlLEdBQUc5a0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxZQUFZLENBQUM7SUFDOUMsSUFBSWEsb0JBQW9CLEdBQUcva0MsTUFBTSxDQUFDa2tDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQzs7SUFFeEQ7O0lBRUEsSUFBSWMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzVCLElBQUlDLGtCQUFrQixHQUFHLEtBQUs7SUFDOUIsSUFBSUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLENBQUM7O0lBRXJDLElBQUlDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2hDO0lBQ0E7O0lBRUEsSUFBSUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUM7O0lBRWhDLElBQUlDLHNCQUFzQjtJQUUxQjtNQUNFQSxzQkFBc0IsR0FBR3JsQyxNQUFNLENBQUNra0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0lBQy9EO0lBRUEsU0FBU2xNLGtCQUFrQkEsQ0FBQzNYLElBQUksRUFBRTtNQUNoQyxJQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUksT0FBT0EsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUMxRCxPQUFPLElBQUk7TUFDYixDQUFDLENBQUM7O01BR0YsSUFBSUEsSUFBSSxLQUFLK2pCLG1CQUFtQixJQUFJL2pCLElBQUksS0FBS2lrQixtQkFBbUIsSUFBSWMsa0JBQWtCLElBQUsva0IsSUFBSSxLQUFLZ2tCLHNCQUFzQixJQUFJaGtCLElBQUksS0FBS3NrQixtQkFBbUIsSUFBSXRrQixJQUFJLEtBQUt1a0Isd0JBQXdCLElBQUlPLGtCQUFrQixJQUFLOWtCLElBQUksS0FBSzBrQixvQkFBb0IsSUFBSUMsY0FBYyxJQUFLQyxrQkFBa0IsSUFBS0MsdUJBQXVCLEVBQUc7UUFDN1QsT0FBTyxJQUFJO01BQ2I7TUFFQSxJQUFJcG5DLE9BQUEsQ0FBT3VpQixJQUFJLE1BQUssUUFBUSxJQUFJQSxJQUFJLEtBQUssSUFBSSxFQUFFO1FBQzdDLElBQUlBLElBQUksQ0FBQ2lsQixRQUFRLEtBQUtSLGVBQWUsSUFBSXprQixJQUFJLENBQUNpbEIsUUFBUSxLQUFLVCxlQUFlLElBQUl4a0IsSUFBSSxDQUFDaWxCLFFBQVEsS0FBS2YsbUJBQW1CLElBQUlsa0IsSUFBSSxDQUFDaWxCLFFBQVEsS0FBS2Qsa0JBQWtCLElBQUlua0IsSUFBSSxDQUFDaWxCLFFBQVEsS0FBS1osc0JBQXNCO1FBQUk7UUFDM007UUFDQTtRQUNBO1FBQ0Fya0IsSUFBSSxDQUFDaWxCLFFBQVEsS0FBS0Qsc0JBQXNCLElBQUlobEIsSUFBSSxDQUFDa2xCLFdBQVcsS0FBS3psQyxTQUFTLEVBQUU7VUFDMUUsT0FBTyxJQUFJO1FBQ2I7TUFDRjtNQUVBLE9BQU8sS0FBSztJQUNkO0lBRUEsU0FBUzBsQyxNQUFNQSxDQUFDcmxCLE1BQU0sRUFBRTtNQUN0QixJQUFJcmlCLE9BQUEsQ0FBT3FpQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxFQUFFO1FBQ2pELElBQUltbEIsUUFBUSxHQUFHbmxCLE1BQU0sQ0FBQ21sQixRQUFRO1FBRTlCLFFBQVFBLFFBQVE7VUFDZCxLQUFLckIsa0JBQWtCO1lBQ3JCLElBQUk1akIsSUFBSSxHQUFHRixNQUFNLENBQUNFLElBQUk7WUFFdEIsUUFBUUEsSUFBSTtjQUNWLEtBQUsrakIsbUJBQW1CO2NBQ3hCLEtBQUtFLG1CQUFtQjtjQUN4QixLQUFLRCxzQkFBc0I7Y0FDM0IsS0FBS00sbUJBQW1CO2NBQ3hCLEtBQUtDLHdCQUF3QjtnQkFDM0IsT0FBT3ZrQixJQUFJO2NBRWI7Z0JBQ0UsSUFBSW9sQixZQUFZLEdBQUdwbEIsSUFBSSxJQUFJQSxJQUFJLENBQUNpbEIsUUFBUTtnQkFFeEMsUUFBUUcsWUFBWTtrQkFDbEIsS0FBS2hCLHlCQUF5QjtrQkFDOUIsS0FBS0Qsa0JBQWtCO2tCQUN2QixLQUFLRSxzQkFBc0I7a0JBQzNCLEtBQUtJLGVBQWU7a0JBQ3BCLEtBQUtELGVBQWU7a0JBQ3BCLEtBQUtOLG1CQUFtQjtvQkFDdEIsT0FBT2tCLFlBQVk7a0JBRXJCO29CQUNFLE9BQU9ILFFBQVE7Z0JBQ25CO1lBRUo7VUFFRixLQUFLbkIsaUJBQWlCO1lBQ3BCLE9BQU9tQixRQUFRO1FBQ25CO01BQ0Y7TUFFQSxPQUFPeGxDLFNBQVM7SUFDbEI7SUFDQSxJQUFJNGxDLGVBQWUsR0FBR2xCLGtCQUFrQjtJQUN4QyxJQUFJbUIsZUFBZSxHQUFHcEIsbUJBQW1CO0lBQ3pDLElBQUlxQixPQUFPLEdBQUczQixrQkFBa0I7SUFDaEMsSUFBSTRCLFVBQVUsR0FBR25CLHNCQUFzQjtJQUN2QyxJQUFJb0IsUUFBUSxHQUFHMUIsbUJBQW1CO0lBQ2xDLElBQUkyQixJQUFJLEdBQUdqQixlQUFlO0lBQzFCLElBQUlrQixJQUFJLEdBQUduQixlQUFlO0lBQzFCLElBQUlvQixNQUFNLEdBQUc5QixpQkFBaUI7SUFDOUIsSUFBSStCLFFBQVEsR0FBRzVCLG1CQUFtQjtJQUNsQyxJQUFJNkIsVUFBVSxHQUFHOUIsc0JBQXNCO0lBQ3ZDLElBQUkrQixRQUFRLEdBQUd6QixtQkFBbUI7SUFDbEMsSUFBSTBCLFlBQVksR0FBR3pCLHdCQUF3QjtJQUMzQyxJQUFJMEIsbUNBQW1DLEdBQUcsS0FBSztJQUMvQyxJQUFJQyx3Q0FBd0MsR0FBRyxLQUFLLENBQUMsQ0FBQzs7SUFFdEQsU0FBU0MsV0FBV0EsQ0FBQ3JtQixNQUFNLEVBQUU7TUFDM0I7UUFDRSxJQUFJLENBQUNtbUIsbUNBQW1DLEVBQUU7VUFDeENBLG1DQUFtQyxHQUFHLElBQUksQ0FBQyxDQUFDOztVQUU1Q3p4QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsdURBQXVELEdBQUcsbUNBQW1DLENBQUM7UUFDaEg7TUFDRjtNQUVBLE9BQU8sS0FBSztJQUNkO0lBQ0EsU0FBUzR4QixnQkFBZ0JBLENBQUN0bUIsTUFBTSxFQUFFO01BQ2hDO1FBQ0UsSUFBSSxDQUFDb21CLHdDQUF3QyxFQUFFO1VBQzdDQSx3Q0FBd0MsR0FBRyxJQUFJLENBQUMsQ0FBQzs7VUFFakQxeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLDREQUE0RCxHQUFHLG1DQUFtQyxDQUFDO1FBQ3JIO01BQ0Y7TUFFQSxPQUFPLEtBQUs7SUFDZDtJQUNBLFNBQVNvakIsaUJBQWlCQSxDQUFDOVgsTUFBTSxFQUFFO01BQ2pDLE9BQU9xbEIsTUFBTSxDQUFDcmxCLE1BQU0sQ0FBQyxLQUFLcWtCLGtCQUFrQjtJQUM5QztJQUNBLFNBQVNrQyxpQkFBaUJBLENBQUN2bUIsTUFBTSxFQUFFO01BQ2pDLE9BQU9xbEIsTUFBTSxDQUFDcmxCLE1BQU0sQ0FBQyxLQUFLb2tCLG1CQUFtQjtJQUMvQztJQUNBLFNBQVNvQyxTQUFTQSxDQUFDeG1CLE1BQU0sRUFBRTtNQUN6QixPQUFPcmlCLE9BQUEsQ0FBT3FpQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxJQUFJQSxNQUFNLENBQUNtbEIsUUFBUSxLQUFLckIsa0JBQWtCO0lBQ2hHO0lBQ0EsU0FBUzJDLFlBQVlBLENBQUN6bUIsTUFBTSxFQUFFO01BQzVCLE9BQU9xbEIsTUFBTSxDQUFDcmxCLE1BQU0sQ0FBQyxLQUFLdWtCLHNCQUFzQjtJQUNsRDtJQUNBLFNBQVNtQyxVQUFVQSxDQUFDMW1CLE1BQU0sRUFBRTtNQUMxQixPQUFPcWxCLE1BQU0sQ0FBQ3JsQixNQUFNLENBQUMsS0FBS2lrQixtQkFBbUI7SUFDL0M7SUFDQSxTQUFTMEMsTUFBTUEsQ0FBQzNtQixNQUFNLEVBQUU7TUFDdEIsT0FBT3FsQixNQUFNLENBQUNybEIsTUFBTSxDQUFDLEtBQUsya0IsZUFBZTtJQUMzQztJQUNBLFNBQVNpQyxNQUFNQSxDQUFDNW1CLE1BQU0sRUFBRTtNQUN0QixPQUFPcWxCLE1BQU0sQ0FBQ3JsQixNQUFNLENBQUMsS0FBSzBrQixlQUFlO0lBQzNDO0lBQ0EsU0FBU21DLFFBQVFBLENBQUM3bUIsTUFBTSxFQUFFO01BQ3hCLE9BQU9xbEIsTUFBTSxDQUFDcmxCLE1BQU0sQ0FBQyxLQUFLZ2tCLGlCQUFpQjtJQUM3QztJQUNBLFNBQVM4QyxVQUFVQSxDQUFDOW1CLE1BQU0sRUFBRTtNQUMxQixPQUFPcWxCLE1BQU0sQ0FBQ3JsQixNQUFNLENBQUMsS0FBS21rQixtQkFBbUI7SUFDL0M7SUFDQSxTQUFTNEMsWUFBWUEsQ0FBQy9tQixNQUFNLEVBQUU7TUFDNUIsT0FBT3FsQixNQUFNLENBQUNybEIsTUFBTSxDQUFDLEtBQUtra0Isc0JBQXNCO0lBQ2xEO0lBQ0EsU0FBUzhDLFVBQVVBLENBQUNobkIsTUFBTSxFQUFFO01BQzFCLE9BQU9xbEIsTUFBTSxDQUFDcmxCLE1BQU0sQ0FBQyxLQUFLd2tCLG1CQUFtQjtJQUMvQztJQUNBLFNBQVN5QyxjQUFjQSxDQUFDam5CLE1BQU0sRUFBRTtNQUM5QixPQUFPcWxCLE1BQU0sQ0FBQ3JsQixNQUFNLENBQUMsS0FBS3lrQix3QkFBd0I7SUFDcEQ7SUFFQS9tQyx1QkFBdUIsR0FBRzZuQyxlQUFlO0lBQ3pDN25DLHVCQUF1QixHQUFHOG5DLGVBQWU7SUFDekM5bkMsZUFBZSxHQUFHK25DLE9BQU87SUFDekIvbkMsa0JBQWtCLEdBQUdnb0MsVUFBVTtJQUMvQmhvQyxnQkFBZ0IsR0FBR2lvQyxRQUFRO0lBQzNCam9DLFlBQVksR0FBR2tvQyxJQUFJO0lBQ25CbG9DLFlBQVksR0FBR21vQyxJQUFJO0lBQ25Cbm9DLGNBQWMsR0FBR29vQyxNQUFNO0lBQ3ZCcG9DLGdCQUFnQixHQUFHcW9DLFFBQVE7SUFDM0Jyb0Msa0JBQWtCLEdBQUdzb0MsVUFBVTtJQUMvQnRvQyxnQkFBZ0IsR0FBR3VvQyxRQUFRO0lBQzNCdm9DLG9CQUFvQixHQUFHd29DLFlBQVk7SUFDbkN4b0MsbUJBQW1CLEdBQUcyb0MsV0FBVztJQUNqQzNvQyx3QkFBd0IsR0FBRzRvQyxnQkFBZ0I7SUFDM0M1b0MseUJBQXlCLEdBQUdvNkIsaUJBQWlCO0lBQzdDcDZCLHlCQUF5QixHQUFHNm9DLGlCQUFpQjtJQUM3QzdvQyxpQkFBaUIsR0FBRzhvQyxTQUFTO0lBQzdCOW9DLG9CQUFvQixHQUFHK29DLFlBQVk7SUFDbkMvb0Msa0JBQWtCLEdBQUdncEMsVUFBVTtJQUMvQmhwQyxjQUFjLEdBQUdpcEMsTUFBTTtJQUN2QmpwQyxjQUFjLEdBQUdrcEMsTUFBTTtJQUN2QmxwQyxnQkFBZ0IsR0FBR21wQyxRQUFRO0lBQzNCbnBDLGtCQUFrQixHQUFHb3BDLFVBQVU7SUFDL0JwcEMsb0JBQW9CLEdBQUdxcEMsWUFBWTtJQUNuQ3JwQyxrQkFBa0IsR0FBR3NwQyxVQUFVO0lBQy9CdHBDLHNCQUFzQixHQUFHdXBDLGNBQWM7SUFDdkN2cEMsMEJBQTBCLEdBQUdtNkIsa0JBQWtCO0lBQy9DbjZCLGNBQWMsR0FBRzJuQyxNQUFNO0VBQ3JCLENBQUMsRUFBRSxDQUFDO0FBQ047Ozs7Ozs7Ozs7O0FDNU5hOztBQUViLElBQUlsUCxLQUFxQyxFQUFFO0FBQUEsRUFFMUMsTUFBTTtFQUNMdjRCLHlKQUF5RDtBQUMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOa0M7QUFDVTtBQUNKO0FBQ0o7QUFDckI7QUFDZjtBQUNBLHFCQUFxQix1REFBUTtBQUM3Qjs7QUFFQSxFQUFFLGdEQUFTLENBQUMsNkRBQVUsb0JBQW9CLHlEQUFNO0FBQ2hELDRCQUE0Qix5REFBTSx1Q0FBdUMsdURBQVEsR0FBRyx1REFBUTtBQUM1RiwyRkFBMkYsYUFBYTtBQUN4RztBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsNkRBQVU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5Q0EsK0RBQWdCO0FBQ2hCO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7O0FDRkQsK0RBQWdCO0FBQ2hCO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7O0FDRkQsK0RBQWdCO0FBQ2hCO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7O0FDRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBLCtEQUFlLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQmlEOztBQUVyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQ0FBbUM7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLE1BQXFDLEdBQUcsQ0FBeUI7QUFDckY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQXlCO0FBQ3ZGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUF5QjtBQUNyRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjs7O0FBR0E7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQXlCO0FBQ3ZGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGVBQWUsVUFBVTtBQUN6Qjs7O0FBR0E7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQXlCO0FBQ3ZGOztBQUVBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBeUI7QUFDdkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsTUFBcUMsR0FBRyxDQUF5QjtBQUN6Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQXlCO0FBQ3ZGOztBQUVBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBeUI7QUFDdkY7O0FBRUE7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUF5QjtBQUN2Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBMEI7QUFDeEY7O0FBRUEsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsTUFBcUMsR0FBRyxDQUEwQjtBQUM1Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYTs7QUFFakI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBMEI7QUFDeEY7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxzQkFBc0IsTUFBcUMsR0FBRyxDQUEwQjtBQUN4RjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQix3QkFBd0I7QUFDMUM7O0FBRUEsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxREFBcUQ7QUFDckQ7O0FBRUE7O0FBRUEsTUFBTSxJQUFxQztBQUMzQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxJQUFxQztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQiw4QkFBOEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixNQUFxQyxHQUFHLENBQTBCO0FBQzFGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUEwQjtBQUN0Rjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsYUFBYTtBQUNwRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsVUFBVTtBQUN2Qjs7QUFFQTtBQUNBLDZFQUE2RSxhQUFhO0FBQzFGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLE1BQXFDLEdBQUcsQ0FBMEI7QUFDMUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLGFBQWEsb0ZBQWEsQ0FBQyxvRkFBYSxHQUFHLFlBQVk7QUFDdkQ7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVvSjs7Ozs7Ozs7Ozs7O0FDaHNCdkk7O0FBRWIsaUJBQWlCLG1CQUFPLENBQUMsb0ZBQWE7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0MsU0FBUztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JhOztBQUViO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsNkJBQTZCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ25GYTs7QUFFYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDakNhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVGE7O0FBRWI7QUFDQTtBQUNBLGNBQWMsS0FBd0MsR0FBRyxzQkFBaUIsR0FBRyxDQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVGE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDNURhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbUJBQU8sQ0FBQyxvQkFBTzs7QUFFckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHLGVBQWU7QUFDaEg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUixrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsS0FBSztBQUNyRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGtDQUFrQztBQUNsQztBQUNBOzs7QUFHQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbUJBQU8sQ0FBQyxvQkFBTztBQUNyQyxXQUFXLG1CQUFPLENBQUMsMEZBQThCOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7O0FDcEthOztBQUViLElBQUksS0FBcUMsRUFBRTtBQUFBLEVBRTFDLENBQUM7QUFDRixFQUFFLHdMQUE4RTtBQUNoRjs7Ozs7Ozs7Ozs7O0FDTmE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFO0FBQUEsRUFFMUMsQ0FBQztBQUNGLEVBQUUsb05BQTRGO0FBQzlGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkNMQSx1S0FBQTJGLENBQUEsRUFBQW91QixDQUFBLEVBQUF0QyxDQUFBLHdCQUFBeHZCLE1BQUEsR0FBQUEsTUFBQSxPQUFBeWlCLENBQUEsR0FBQStNLENBQUEsQ0FBQXZ2QixRQUFBLGtCQUFBNHhCLENBQUEsR0FBQXJDLENBQUEsQ0FBQTZYLFdBQUEsOEJBQUE1bkMsRUFBQSt2QixDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLEVBQUFweUIsQ0FBQSxRQUFBNm1CLENBQUEsR0FBQTdELENBQUEsSUFBQUEsQ0FBQSxDQUFBdlMsU0FBQSxZQUFBbzNCLFNBQUEsR0FBQTdrQixDQUFBLEdBQUE2a0IsU0FBQSxFQUFBbFYsQ0FBQSxHQUFBOXpCLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFxQyxDQUFBLENBQUFwVyxTQUFBLFVBQUFxM0IsbUJBQUEsQ0FBQW5WLENBQUEsdUJBQUE1QyxDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLFFBQUFweUIsQ0FBQSxFQUFBNm1CLENBQUEsRUFBQThMLENBQUEsRUFBQW5XLENBQUEsTUFBQXFELENBQUEsR0FBQXVTLENBQUEsUUFBQXRyQixDQUFBLE9BQUFpaEMsQ0FBQSxLQUFBbG9CLENBQUEsS0FBQW1ELENBQUEsS0FBQS9ELENBQUEsRUFBQWhiLENBQUEsRUFBQTRaLENBQUEsRUFBQW1CLENBQUEsRUFBQXhDLENBQUEsRUFBQXdDLENBQUEsQ0FBQWpnQixJQUFBLENBQUFrRixDQUFBLE1BQUErYSxDQUFBLFdBQUFBLEVBQUFxVCxDQUFBLEVBQUF0QyxDQUFBLFdBQUEvdkIsQ0FBQSxHQUFBcXlCLENBQUEsRUFBQXhMLENBQUEsTUFBQThMLENBQUEsR0FBQTF1QixDQUFBLEVBQUE4akMsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQStNLENBQUEsRUFBQWxTLENBQUEsZ0JBQUFtQixFQUFBK1EsQ0FBQSxFQUFBL00sQ0FBQSxTQUFBNkQsQ0FBQSxHQUFBa0osQ0FBQSxFQUFBNEMsQ0FBQSxHQUFBM1AsQ0FBQSxFQUFBcVAsQ0FBQSxPQUFBdnJCLENBQUEsSUFBQTBWLENBQUEsS0FBQTRWLENBQUEsSUFBQUMsQ0FBQSxHQUFBeFMsQ0FBQSxDQUFBMWdCLE1BQUEsRUFBQWt6QixDQUFBLFVBQUFELENBQUEsRUFBQXB5QixDQUFBLEdBQUE2ZixDQUFBLENBQUF3UyxDQUFBLEdBQUFyVCxDQUFBLEdBQUErb0IsQ0FBQSxDQUFBbG9CLENBQUEsRUFBQWlRLENBQUEsR0FBQTl2QixDQUFBLEtBQUErdkIsQ0FBQSxRQUFBcUMsQ0FBQSxHQUFBdEMsQ0FBQSxLQUFBOU0sQ0FBQSxNQUFBMlAsQ0FBQSxHQUFBM3lCLENBQUEsRUFBQTZtQixDQUFBLEdBQUE3bUIsQ0FBQSxZQUFBNm1CLENBQUEsV0FBQTdtQixDQUFBLE1BQUFBLENBQUEsTUFBQWlFLENBQUEsSUFBQWpFLENBQUEsT0FBQWdmLENBQUEsTUFBQW9ULENBQUEsR0FBQXJDLENBQUEsUUFBQS9RLENBQUEsR0FBQWhmLENBQUEsUUFBQTZtQixDQUFBLE1BQUFraEIsQ0FBQSxDQUFBOW9CLENBQUEsR0FBQStELENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBaGpCLENBQUEsT0FBQWdmLENBQUEsR0FBQThRLENBQUEsS0FBQXNDLENBQUEsR0FBQXJDLENBQUEsUUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxJQUFBQSxDQUFBLEdBQUE4TSxDQUFBLE1BQUE5dkIsQ0FBQSxNQUFBK3ZCLENBQUEsRUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxFQUFBK2tCLENBQUEsQ0FBQS9rQixDQUFBLEdBQUE4TSxDQUFBLEVBQUFqSixDQUFBLGNBQUF1TCxDQUFBLElBQUFyQyxDQUFBLGFBQUFsUyxDQUFBLFFBQUEvVyxDQUFBLE9BQUFrYyxDQUFBLHFCQUFBb1AsQ0FBQSxFQUFBdlMsQ0FBQSxFQUFBaVEsQ0FBQSxRQUFBdFQsQ0FBQSxZQUFBeGIsU0FBQSx1Q0FBQThGLENBQUEsVUFBQStZLENBQUEsSUFBQWIsQ0FBQSxDQUFBYSxDQUFBLEVBQUFpUSxDQUFBLEdBQUFqSixDQUFBLEdBQUFoSCxDQUFBLEVBQUE4UyxDQUFBLEdBQUE3QyxDQUFBLEdBQUF1QyxDQUFBLEdBQUF4TCxDQUFBLE9BQUE1aUIsQ0FBQSxHQUFBMHVCLENBQUEsTUFBQTdyQixDQUFBLEtBQUE5RyxDQUFBLEtBQUE2bUIsQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQWtoQixDQUFBLENBQUEva0IsQ0FBQSxRQUFBaEUsQ0FBQSxDQUFBNkgsQ0FBQSxFQUFBOEwsQ0FBQSxLQUFBb1YsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQTJQLENBQUEsR0FBQW9WLENBQUEsQ0FBQTlvQixDQUFBLEdBQUEwVCxDQUFBLGFBQUFuVyxDQUFBLE1BQUF4YyxDQUFBLFFBQUE2bUIsQ0FBQSxLQUFBdUwsQ0FBQSxZQUFBQyxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBb3lCLENBQUEsV0FBQUMsQ0FBQSxHQUFBQSxDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxFQUFBMnlCLENBQUEsVUFBQTN4QixTQUFBLDJDQUFBcXhCLENBQUEsQ0FBQTF4QixJQUFBLFNBQUEweEIsQ0FBQSxFQUFBTSxDQUFBLEdBQUFOLENBQUEsQ0FBQXh4QixLQUFBLEVBQUFnbUIsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUF3TCxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBMEcsTUFBQSxLQUFBMnJCLENBQUEsQ0FBQXJqQixJQUFBLENBQUFoUCxDQUFBLEdBQUE2bUIsQ0FBQSxTQUFBOEwsQ0FBQSxHQUFBM3hCLFNBQUEsdUNBQUFveEIsQ0FBQSxnQkFBQXZMLENBQUEsT0FBQTdtQixDQUFBLEdBQUFpRSxDQUFBLGNBQUFvdUIsQ0FBQSxJQUFBdnJCLENBQUEsR0FBQWloQyxDQUFBLENBQUEva0IsQ0FBQSxRQUFBMlAsQ0FBQSxHQUFBNUMsQ0FBQSxDQUFBL2dCLElBQUEsQ0FBQWdVLENBQUEsRUFBQStrQixDQUFBLE9BQUFscUIsQ0FBQSxrQkFBQXdVLENBQUEsSUFBQXJ5QixDQUFBLEdBQUFpRSxDQUFBLEVBQUE0aUIsQ0FBQSxNQUFBOEwsQ0FBQSxHQUFBTixDQUFBLGNBQUE3VixDQUFBLG1CQUFBM2IsS0FBQSxFQUFBd3hCLENBQUEsRUFBQTF4QixJQUFBLEVBQUFtRyxDQUFBLFNBQUFpcEIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTJ5QixDQUFBLFFBQUE5VSxDQUFBLGdCQUFBZ3FCLFVBQUEsY0FBQUcsa0JBQUEsY0FBQUMsMkJBQUEsS0FBQTVWLENBQUEsR0FBQXh6QixNQUFBLENBQUE0bEIsY0FBQSxNQUFBb0MsQ0FBQSxNQUFBN0QsQ0FBQSxJQUFBcVAsQ0FBQSxDQUFBQSxDQUFBLElBQUFyUCxDQUFBLFNBQUE4a0IsbUJBQUEsQ0FBQXpWLENBQUEsT0FBQXJQLENBQUEsaUNBQUFxUCxDQUFBLEdBQUFNLENBQUEsR0FBQXNWLDBCQUFBLENBQUF4M0IsU0FBQSxHQUFBbzNCLFNBQUEsQ0FBQXAzQixTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxZQUFBckssRUFBQXZZLENBQUEsV0FBQXBGLE1BQUEsQ0FBQXFwQyxjQUFBLEdBQUFycEMsTUFBQSxDQUFBcXBDLGNBQUEsQ0FBQWprQyxDQUFBLEVBQUFna0MsMEJBQUEsS0FBQWhrQyxDQUFBLENBQUFra0MsU0FBQSxHQUFBRiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBN2pDLENBQUEsRUFBQW11QixDQUFBLHlCQUFBbnVCLENBQUEsQ0FBQXdNLFNBQUEsR0FBQTVSLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFtTyxDQUFBLEdBQUExdUIsQ0FBQSxXQUFBK2pDLGlCQUFBLENBQUF2M0IsU0FBQSxHQUFBdzNCLDBCQUFBLEVBQUFILG1CQUFBLENBQUFuVixDQUFBLGlCQUFBc1YsMEJBQUEsR0FBQUgsbUJBQUEsQ0FBQUcsMEJBQUEsaUJBQUFELGlCQUFBLEdBQUFBLGlCQUFBLENBQUF6UyxXQUFBLHdCQUFBdVMsbUJBQUEsQ0FBQUcsMEJBQUEsRUFBQTdWLENBQUEsd0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxHQUFBbVYsbUJBQUEsQ0FBQW5WLENBQUEsRUFBQVAsQ0FBQSxnQkFBQTBWLG1CQUFBLENBQUFuVixDQUFBLEVBQUEzUCxDQUFBLGlDQUFBOGtCLG1CQUFBLENBQUFuVixDQUFBLDhEQUFBeVYsWUFBQSxZQUFBQSxhQUFBLGFBQUFoaUMsQ0FBQSxFQUFBcEcsQ0FBQSxFQUFBdzBCLENBQUEsRUFBQWhZLENBQUE7QUFBQSxTQUFBc3JCLG9CQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBLFFBQUFyeUIsQ0FBQSxHQUFBbkIsTUFBQSxDQUFBd1IsY0FBQSxRQUFBclEsQ0FBQSx1QkFBQWlFLENBQUEsSUFBQWpFLENBQUEsUUFBQThuQyxtQkFBQSxZQUFBTyxtQkFBQXBrQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBdEMsQ0FBQSxFQUFBL3ZCLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsQ0FBQSxFQUFBOHJCLENBQUEsSUFBQWx2QixLQUFBLEVBQUFtaUIsQ0FBQSxFQUFBOVMsVUFBQSxHQUFBbWlCLENBQUEsRUFBQWxpQixZQUFBLEdBQUFraUIsQ0FBQSxFQUFBamlCLFFBQUEsR0FBQWlpQixDQUFBLE1BQUFwdUIsQ0FBQSxDQUFBOHJCLENBQUEsSUFBQS9NLENBQUEsWUFBQW9QLENBQUEsWUFBQUEsRUFBQXJDLENBQUEsRUFBQS9NLENBQUEsSUFBQThrQixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLFlBQUE5ckIsQ0FBQSxnQkFBQXFrQyxPQUFBLENBQUF2WSxDQUFBLEVBQUEvTSxDQUFBLEVBQUEvZSxDQUFBLFVBQUFtdUIsQ0FBQSxhQUFBQSxDQUFBLGNBQUFBLENBQUEsb0JBQUEwVixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBO0FBQUEsU0FBQWtXLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFBQSxTQUFBL29DLGVBQUFrd0IsQ0FBQSxFQUFBOXJCLENBQUEsV0FBQTZrQyxlQUFBLENBQUEvWSxDQUFBLEtBQUFnWixxQkFBQSxDQUFBaFosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQStrQywyQkFBQSxDQUFBalosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQWdsQyxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUFqb0MsU0FBQTtBQUFBLFNBQUFnb0MsNEJBQUFqWixDQUFBLEVBQUFsUyxDQUFBLFFBQUFrUyxDQUFBLDJCQUFBQSxDQUFBLFNBQUFtWixpQkFBQSxDQUFBblosQ0FBQSxFQUFBbFMsQ0FBQSxPQUFBd1UsQ0FBQSxNQUFBblUsUUFBQSxDQUFBbFAsSUFBQSxDQUFBK2dCLENBQUEsRUFBQTFTLEtBQUEsNkJBQUFnVixDQUFBLElBQUF0QyxDQUFBLENBQUEzUCxXQUFBLEtBQUFpUyxDQUFBLEdBQUF0QyxDQUFBLENBQUEzUCxXQUFBLENBQUFnSSxJQUFBLGFBQUFpSyxDQUFBLGNBQUFBLENBQUEsR0FBQWh6QixLQUFBLENBQUFnaEIsSUFBQSxDQUFBMFAsQ0FBQSxvQkFBQXNDLENBQUEsK0NBQUFoSCxJQUFBLENBQUFnSCxDQUFBLElBQUE2VyxpQkFBQSxDQUFBblosQ0FBQSxFQUFBbFMsQ0FBQTtBQUFBLFNBQUFxckIsa0JBQUFuWixDQUFBLEVBQUFsUyxDQUFBLGFBQUFBLENBQUEsSUFBQUEsQ0FBQSxHQUFBa1MsQ0FBQSxDQUFBNXdCLE1BQUEsTUFBQTBlLENBQUEsR0FBQWtTLENBQUEsQ0FBQTV3QixNQUFBLFlBQUE4RSxDQUFBLE1BQUErZSxDQUFBLEdBQUEzakIsS0FBQSxDQUFBd2UsQ0FBQSxHQUFBNVosQ0FBQSxHQUFBNFosQ0FBQSxFQUFBNVosQ0FBQSxJQUFBK2UsQ0FBQSxDQUFBL2UsQ0FBQSxJQUFBOHJCLENBQUEsQ0FBQTlyQixDQUFBLFVBQUErZSxDQUFBO0FBQUEsU0FBQStsQixzQkFBQWhaLENBQUEsRUFBQUQsQ0FBQSxRQUFBdUMsQ0FBQSxXQUFBdEMsQ0FBQSxnQ0FBQXh2QixNQUFBLElBQUF3dkIsQ0FBQSxDQUFBeHZCLE1BQUEsQ0FBQUMsUUFBQSxLQUFBdXZCLENBQUEsNEJBQUFzQyxDQUFBLFFBQUFwdUIsQ0FBQSxFQUFBK2UsQ0FBQSxFQUFBaGpCLENBQUEsRUFBQTJ5QixDQUFBLEVBQUE5VSxDQUFBLE9BQUFyQixDQUFBLE9BQUE0VixDQUFBLGlCQUFBcHlCLENBQUEsSUFBQXF5QixDQUFBLEdBQUFBLENBQUEsQ0FBQXJqQixJQUFBLENBQUErZ0IsQ0FBQSxHQUFBcnZCLElBQUEsUUFBQW92QixDQUFBLFFBQUFqeEIsTUFBQSxDQUFBd3pCLENBQUEsTUFBQUEsQ0FBQSxVQUFBN1YsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBdlksQ0FBQSxHQUFBakUsQ0FBQSxDQUFBZ1AsSUFBQSxDQUFBcWpCLENBQUEsR0FBQTF4QixJQUFBLE1BQUFrZCxDQUFBLENBQUFqZCxJQUFBLENBQUFxRCxDQUFBLENBQUFwRCxLQUFBLEdBQUFnZCxDQUFBLENBQUExZSxNQUFBLEtBQUEyd0IsQ0FBQSxHQUFBdFQsQ0FBQSxpQkFBQXVULENBQUEsSUFBQXFDLENBQUEsT0FBQXBQLENBQUEsR0FBQStNLENBQUEseUJBQUF2VCxDQUFBLFlBQUE2VixDQUFBLENBQUEzckIsTUFBQSxLQUFBaXNCLENBQUEsR0FBQU4sQ0FBQSxDQUFBM3JCLE1BQUEsSUFBQTdILE1BQUEsQ0FBQTh6QixDQUFBLE1BQUFBLENBQUEsMkJBQUFQLENBQUEsUUFBQXBQLENBQUEsYUFBQW5GLENBQUE7QUFBQSxTQUFBaXJCLGdCQUFBL1ksQ0FBQSxRQUFBMXdCLEtBQUEsQ0FBQTBCLE9BQUEsQ0FBQWd2QixDQUFBLFVBQUFBLENBQUE7QUFEMkM7QUFDSDtBQUNpQjtBQUV0QjtBQUM4QztBQVE5RDtBQUMwQjtBQUNRO0FBQ2hCO0FBQ1E7QUFDRTtBQUNFO0FBQ0o7QUFDYjtBQUNvQjtBQUNKOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTXVhLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUd0NkIsS0FBSyxFQUFJO0VBQ2xDLElBQ0l1NkIsWUFBWSxHQU1adjZCLEtBQUssQ0FOTHU2QixZQUFZO0lBQ1pDLE1BQU0sR0FLTng2QixLQUFLLENBTEx3NkIsTUFBTTtJQUNOQyxtQkFBbUIsR0FJbkJ6NkIsS0FBSyxDQUpMeTZCLG1CQUFtQjtJQUNuQjVQLEtBQUssR0FHTDdxQixLQUFLLENBSEw2cUIsS0FBSztJQUNMNlAsYUFBYSxHQUViMTZCLEtBQUssQ0FGTDA2QixhQUFhO0lBQ2J4Z0MsTUFBTSxHQUNOOEYsS0FBSyxDQURMOUYsTUFBTTtFQUdWLElBQUF5Z0MsU0FBQSxHQUF3Q3hCLCtDQUFRLENBQUMsS0FBSyxDQUFDO0lBQUF5QixVQUFBLEdBQUEvcUMsY0FBQSxDQUFBOHFDLFNBQUE7SUFBaERFLFlBQVksR0FBQUQsVUFBQTtJQUFFRSxlQUFlLEdBQUFGLFVBQUE7RUFFcEMsSUFBTUcsTUFBTSxHQUFHelMsNkNBQU0sQ0FBQyxJQUFJLENBQUM7RUFDM0IsSUFBSSxDQUFDeVMsTUFBTSxDQUFDL3pCLE9BQU8sRUFBRTtJQUNqQit6QixNQUFNLENBQUMvekIsT0FBTyxHQUFHLElBQUkreUIsd0RBQVksQ0FBQyxDQUFDO0VBQ3ZDO0VBQ0EsSUFBTWlCLFlBQVksR0FBRzFTLDZDQUFNLENBQUMsS0FBSyxDQUFDO0VBRWxDOEwsZ0RBQVMsQ0FBQzZHLFdBQVcsQ0FBQ2xzQyxJQUFJLENBQUMsSUFBSSxFQUFFaVIsS0FBSyxFQUFFKzZCLE1BQU0sRUFBRUQsZUFBZSxDQUFDLENBQUM7RUFFakUxRyxnREFBUyxDQUFDLFlBQU07SUFDWixJQUFJNEcsWUFBWSxDQUFDaDBCLE9BQU8sRUFBRTtNQUN0QjJ4QixpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQUMsU0FBQTBXLFFBQUE7UUFBQSxPQUFBOUMsWUFBQSxHQUFBaGlDLENBQUEsV0FBQStrQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO1lBQUE7Y0FDR2dvQixZQUFZLENBQUNoMEIsT0FBTyxHQUFHLEtBQUs7Y0FBQ20wQixRQUFBLENBQUFub0IsQ0FBQTtjQUFBLE9BQ3ZCbW5CLHdEQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUE7Y0FDYlksTUFBTSxDQUFDL3pCLE9BQU8sQ0FBQ28wQixJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUM7Y0FBQSxPQUFBRCxRQUFBLENBQUF0dEIsQ0FBQTtVQUFBO1FBQUEsR0FBQXF0QixPQUFBO01BQUEsQ0FDbkMsR0FBRSxDQUFDO0lBQ1I7RUFDSixDQUFDLENBQUM7RUFFRjlHLGdEQUFTLENBQUMsWUFBTTtJQUNaLElBQUlvRyxNQUFNLENBQUNhLGFBQWEsRUFBRTtNQUN0QnRWLE1BQU0sQ0FBQ3VWLGdCQUFnQixNQUFBbnRCLE1BQUEsQ0FBTXFzQixNQUFNLENBQUNlLHdCQUF3Qiw2REFBMEQ7SUFDMUgsQ0FBQyxNQUFNO01BQ0h4VixNQUFNLENBQUN1VixnQkFBZ0IsR0FBR2QsTUFBTSxDQUFDZ0IsWUFBWTtJQUNqRDtFQUNKLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFJQyxPQUFPO0VBQ1gsSUFDSWYsYUFBYSxDQUFDZ0IsTUFBTSxJQUNwQixDQUFDeHBCLGtEQUFRLENBQUN3b0IsYUFBYSxDQUFDZ0IsTUFBTSxFQUFFLENBQUN4Qix5REFBTSxDQUFDeUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQ3pEO0lBQ0UsSUFBSW5CLE1BQU0sQ0FBQ29CLEVBQUUsRUFBRTtNQUNYSCxPQUFPLGdCQUNIelUsMERBQUE7UUFDSTZVLHVCQUF1QixFQUFFO1VBQUNDLE1BQU0sRUFBRXBCLGFBQWEsQ0FBQ2U7UUFBTztNQUFFLENBQ3ZELENBQ1Q7SUFDTCxDQUFDLE1BQU07TUFDSEEsT0FBTyxnQkFBR3pVLDBEQUFBO1FBQUtuRSxTQUFTLEVBQUM7TUFBYSxHQUFDLHNCQUF5QixDQUFDO0lBQ3JFO0VBQ0osQ0FBQyxNQUFNLElBQ0hnWSxZQUFZLElBQ1hKLG1CQUFtQixDQUFDaUIsTUFBTSxJQUN2QixDQUFDeHBCLGtEQUFRLENBQUN1b0IsbUJBQW1CLENBQUNpQixNQUFNLEVBQUUsQ0FBQ3hCLHlEQUFNLENBQUN5QixFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUUsRUFDcEU7SUFDRSxJQUFJbkIsTUFBTSxDQUFDb0IsRUFBRSxFQUFFO01BQ1hILE9BQU8sZ0JBQ0h6VSwwREFBQTtRQUNJNlUsdUJBQXVCLEVBQUU7VUFDckJDLE1BQU0sRUFBRXJCLG1CQUFtQixDQUFDZ0I7UUFDaEM7TUFBRSxDQUNBLENBQ1Q7SUFDTCxDQUFDLE1BQU07TUFDSEEsT0FBTyxnQkFDSHpVLDBEQUFBO1FBQUtuRSxTQUFTLEVBQUM7TUFBYSxHQUFDLDRCQUErQixDQUMvRDtJQUNMO0VBQ0osQ0FBQyxNQUFNLElBQUkwWCxZQUFZLEtBQUtOLGlFQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7SUFDakRlLFlBQVksQ0FBQ2gwQixPQUFPLEdBQUcsSUFBSTtJQUUzQnkwQixPQUFPLGdCQUNIelUsMERBQUEsQ0FBQUEsdURBQUEsUUFDSzMzQixLQUFLLENBQUMwQixPQUFPLENBQUNtSixNQUFNLENBQUMsR0FDbEJBLE1BQU0sQ0FBQ25ELEdBQUcsQ0FBQyxVQUFDOGYsQ0FBQyxFQUFFN21CLENBQUM7TUFBQSxPQUNab3FDLCtEQUFpQixDQUFDdmpCLENBQUMsQ0FBQyxHQUNoQkEsQ0FBQyxnQkFFRG1RLDBEQUFBLENBQUNxVCw2REFBVztRQUNSMEIsa0JBQWtCLEVBQUVsUixLQUFNO1FBQzFCbVIsYUFBYSxFQUFFLENBQUNoc0MsQ0FBQyxDQUFFO1FBQ25CNkYsR0FBRyxFQUFFN0Y7TUFBRSxDQUNWLENBQ0o7SUFBQSxDQUNMLENBQUMsZ0JBRURnM0IsMERBQUEsQ0FBQ3FULDZEQUFXO01BQ1IwQixrQkFBa0IsRUFBRWxSLEtBQU07TUFDMUJtUixhQUFhLEVBQUU7SUFBRyxDQUNyQixDQUVQLENBQ0w7RUFDTCxDQUFDLE1BQU07SUFDSFAsT0FBTyxnQkFBR3pVLDBEQUFBO01BQUtuRSxTQUFTLEVBQUM7SUFBZSxHQUFDLFlBQWUsQ0FBQztFQUM3RDtFQUVBLE9BQU8yWCxNQUFNLElBQUlBLE1BQU0sQ0FBQ29CLEVBQUUsS0FBSyxJQUFJLGdCQUMvQjVVLDBEQUFBLENBQUNxUyxvRkFBb0IsUUFBRW9DLE9BQThCLENBQUMsR0FFdERBLE9BQ0g7QUFDTCxDQUFDO0FBRUQsU0FBU1IsV0FBV0EsQ0FBQ2o3QixLQUFLLEVBQUUrNkIsTUFBTSxFQUFFRCxlQUFlLEVBQUU7RUFDakQsSUFDSVAsWUFBWSxHQVFadjZCLEtBQUssQ0FSTHU2QixZQUFZO0lBQ1pFLG1CQUFtQixHQU9uQno2QixLQUFLLENBUEx5NkIsbUJBQW1CO0lBQ25Cdk4sUUFBUSxHQU1SbHRCLEtBQUssQ0FOTGt0QixRQUFRO0lBQ1JyQyxLQUFLLEdBS0w3cUIsS0FBSyxDQUxMNnFCLEtBQUs7SUFDTG9SLE1BQU0sR0FJTmo4QixLQUFLLENBSkxpOEIsTUFBTTtJQUNOQyxLQUFLLEdBR0xsOEIsS0FBSyxDQUhMazhCLEtBQUs7SUFDTGhpQyxNQUFNLEdBRU44RixLQUFLLENBRkw5RixNQUFNO0lBQ053Z0MsYUFBYSxHQUNiMTZCLEtBQUssQ0FETDA2QixhQUFhO0VBR2pCL1Ysa0RBQUssQ0FBQyxZQUFNO0lBQ1IsSUFBSS9HLGtEQUFPLENBQUM4YyxhQUFhLENBQUMsRUFBRTtNQUN4QixJQUFJLE9BQU93QixLQUFLLENBQUNDLFVBQVUsS0FBSyxVQUFVLEVBQUU7UUFDeENELEtBQUssQ0FBQ0MsVUFBVSxDQUFDLENBQUM7TUFDdEI7TUFDQWpQLFFBQVEsQ0FBQzRNLHdEQUFRLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM5RCxDQUFDLE1BQU0sSUFBSVksYUFBYSxDQUFDZ0IsTUFBTSxLQUFLeEIseURBQU0sQ0FBQ3lCLEVBQUUsRUFBRTtNQUMzQyxJQUFJL2Qsa0RBQU8sQ0FBQzFqQixNQUFNLENBQUMsRUFBRTtRQUNqQixJQUFJLE9BQU9naUMsS0FBSyxDQUFDRSxXQUFXLEtBQUssVUFBVSxFQUFFO1VBQ3pDRixLQUFLLENBQUNFLFdBQVcsQ0FBQzFCLGFBQWEsQ0FBQ2UsT0FBTyxDQUFDO1FBQzVDO1FBQ0EsSUFBTVksV0FBVyxHQUFHckMsOERBQWdCLENBQ2hDVSxhQUFhLENBQUNlLE9BQU8sRUFDckJ2TyxRQUNKLENBQUM7UUFDREEsUUFBUSxDQUNKd00sa0RBQVEsQ0FDSkUsNERBQVksQ0FBQ3lDLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFdEIsTUFBTSxDQUFDL3pCLE9BQU8sQ0FDdEQsQ0FDSixDQUFDO1FBQ0RrbUIsUUFBUSxDQUFDeU0sbURBQVMsQ0FBQzBDLFdBQVcsQ0FBQyxDQUFDO01BQ3BDO0lBQ0o7SUFFQSxJQUFJemUsa0RBQU8sQ0FBQzZjLG1CQUFtQixDQUFDLEVBQUU7TUFDOUJ2TixRQUFRLENBQ0o0TSx3REFBUSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FDL0QsQ0FBQztJQUNMLENBQUMsTUFBTSxJQUNIVyxtQkFBbUIsQ0FBQ2lCLE1BQU0sS0FBS3hCLHlEQUFNLENBQUN5QixFQUFFLEtBQ3ZDL2Qsa0RBQU8sQ0FBQ3FlLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNLLEtBQUssQ0FBQyxFQUNuQztNQUNFcFAsUUFBUSxDQUNKdU0sbURBQVMsQ0FDTEksb0VBQWEsQ0FDVFksbUJBQW1CLENBQUNnQixPQUFPLEVBQzNCbkMsdURBQWEsQ0FBQ3BNLFFBQVEsQ0FDMUIsQ0FDSixDQUNKLENBQUM7SUFDTDtJQUVBO0lBQ0k7SUFDQXVOLG1CQUFtQixDQUFDaUIsTUFBTSxLQUFLeEIseURBQU0sQ0FBQ3lCLEVBQUUsSUFDeEMsQ0FBQy9kLGtEQUFPLENBQUNxZSxNQUFNLENBQUM7SUFDaEI7SUFDQXZCLGFBQWEsQ0FBQ2dCLE1BQU0sS0FBS3hCLHlEQUFNLENBQUN5QixFQUFFLElBQ2xDLENBQUMvZCxrREFBTyxDQUFDMWpCLE1BQU0sQ0FBQztJQUNoQjtJQUNBcWdDLFlBQVksS0FBS04saUVBQVcsQ0FBQyxTQUFTLENBQUMsRUFDekM7TUFDRSxJQUFJc0MsUUFBUSxHQUFHLEtBQUs7TUFDcEIsSUFBSTtRQUNBclAsUUFBUSxDQUFDcU0sK0RBQXFCLENBQUNELHVEQUFhLENBQUNwTSxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQzVELENBQUMsQ0FBQyxPQUFPcDhCLEdBQUcsRUFBRTtRQUNWO1FBQ0E7UUFDQSxJQUFJLENBQUMrNUIsS0FBSyxDQUFDMlIsUUFBUSxDQUFDcnRDLE1BQU0sSUFBSSxDQUFDMDdCLEtBQUssQ0FBQzRSLE9BQU8sQ0FBQ3R0QyxNQUFNLEVBQUU7VUFDakQrOUIsUUFBUSxDQUFDc00saURBQU8sQ0FBQztZQUFDNW9CLElBQUksRUFBRSxTQUFTO1lBQUVpYSxLQUFLLEVBQUUvNUI7VUFBRyxDQUFDLENBQUMsQ0FBQztRQUNwRDtRQUNBeXJDLFFBQVEsR0FBRyxJQUFJO01BQ25CLENBQUMsU0FBUztRQUNOekIsZUFBZSxDQUFDeUIsUUFBUSxDQUFDO01BQzdCO0lBQ0o7RUFDSixDQUFDLENBQUM7QUFDTjtBQUVBakMsb0JBQW9CLENBQUNvQyxTQUFTLEdBQUc7RUFDN0JuQyxZQUFZLEVBQUVuQix1REFBZSxDQUFDLENBQzFCYSxpRUFBVyxDQUFDLFNBQVMsQ0FBQyxFQUN0QkEsaUVBQVcsQ0FBQyxVQUFVLENBQUMsRUFDdkJBLGlFQUFXLENBQUMsV0FBVyxDQUFDLENBQzNCLENBQUM7RUFDRi9NLFFBQVEsRUFBRWtNLHdEQUFjO0VBQ3hCcUIsbUJBQW1CLEVBQUVyQiwwREFBZ0I7RUFDckM2QyxNQUFNLEVBQUU3QywwREFBZ0I7RUFDeEI4QyxLQUFLLEVBQUU5QywwREFBZ0I7RUFDdkJzQixhQUFhLEVBQUV0QiwwREFBZ0I7RUFDL0JsL0IsTUFBTSxFQUFFay9CLHVEQUFhO0VBQ3JCd0QsT0FBTyxFQUFFeEQsdURBQWE7RUFDdEJ2TyxLQUFLLEVBQUV1TywwREFBZ0I7RUFDdkJvQixNQUFNLEVBQUVwQiwwREFBZ0Ixb0I7QUFDNUIsQ0FBQztBQUVELElBQU1tc0IsU0FBUyxHQUFHM1Isb0RBQU87QUFDckI7QUFDQSxVQUFBd0UsS0FBSztFQUFBLE9BQUs7SUFDTjZLLFlBQVksRUFBRTdLLEtBQUssQ0FBQzZLLFlBQVk7SUFDaENFLG1CQUFtQixFQUFFL0ssS0FBSyxDQUFDK0ssbUJBQW1CO0lBQzlDeUIsS0FBSyxFQUFFeE0sS0FBSyxDQUFDd00sS0FBSztJQUNsQnhCLGFBQWEsRUFBRWhMLEtBQUssQ0FBQ2dMLGFBQWE7SUFDbEN4Z0MsTUFBTSxFQUFFdzFCLEtBQUssQ0FBQ3gxQixNQUFNO0lBQ3BCK2hDLE1BQU0sRUFBRXZNLEtBQUssQ0FBQ3VNLE1BQU07SUFDcEJXLE9BQU8sRUFBRWxOLEtBQUssQ0FBQ2tOLE9BQU87SUFDdEIvUixLQUFLLEVBQUU2RSxLQUFLLENBQUM3RSxLQUFLO0lBQ2xCMlAsTUFBTSxFQUFFOUssS0FBSyxDQUFDOEs7RUFDbEIsQ0FBQztBQUFBLENBQUMsRUFDRixVQUFBdE4sUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDb04sb0JBQW9CLENBQUM7QUFFdkIsK0RBQWV1QyxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxUFk7QUFDVjtBQUNTO0FBQ2U7QUFDSTtBQUNBO0FBQ0U7QUFDaEI7QUFDWTtBQUNGO0FBQUEsSUFFNUNRLHVCQUF1QiwwQkFBQUMsZ0JBQUE7RUFDekIsU0FBQUQsd0JBQVlyOUIsS0FBSyxFQUFFO0lBQUEsSUFBQXFsQixLQUFBO0lBQUEza0IsZUFBQSxPQUFBMjhCLHVCQUFBO0lBQ2ZoWSxLQUFBLEdBQUFDLFVBQUEsT0FBQStYLHVCQUFBLEdBQU1yOUIsS0FBSztJQUNYLElBQ0lBLEtBQUssQ0FBQ2s4QixLQUFLLENBQUNDLFVBQVUsS0FBSyxJQUFJLElBQy9CbjhCLEtBQUssQ0FBQ2s4QixLQUFLLENBQUNFLFdBQVcsS0FBSyxJQUFJLElBQ2hDcDhCLEtBQUssQ0FBQ2s4QixLQUFLLENBQUNxQixXQUFXLEtBQUssSUFBSSxJQUNoQ3Y5QixLQUFLLENBQUNrOEIsS0FBSyxDQUFDc0IsWUFBWSxLQUFLLElBQUksSUFDakN4OUIsS0FBSyxDQUFDazhCLEtBQUssQ0FBQ3VCLGlCQUFpQixLQUFLLElBQUksSUFDdEN6OUIsS0FBSyxDQUFDazhCLEtBQUssQ0FBQ3dCLG1CQUFtQixLQUFLLElBQUksRUFDMUM7TUFDRSxJQUFJeEIsS0FBSyxHQUFHbDhCLEtBQUssQ0FBQ2s4QixLQUFLO01BRXZCLElBQUlBLEtBQUssQ0FBQ3dCLG1CQUFtQixFQUFFO1FBQzNCeEIsS0FBSyxHQUFBeUIsYUFBQSxDQUFBQSxhQUFBLEtBQ0V6QixLQUFLO1VBQ1J3QixtQkFBbUIsRUFBRXZlLGlEQUFXLENBQzVCbk4sOENBQVEsRUFDUmtxQixLQUFLLENBQUN3QixtQkFDVjtRQUFDLEVBQ0o7TUFDTDtNQUVBMTlCLEtBQUssQ0FBQ2t0QixRQUFRLENBQUNpUSx3REFBUSxDQUFDakIsS0FBSyxDQUFDLENBQUM7SUFDbkM7SUFBQyxPQUFBN1csS0FBQTtFQUNMO0VBQUNLLFNBQUEsQ0FBQTJYLHVCQUFBLEVBQUFDLGdCQUFBO0VBQUEsT0FBQXg5QixZQUFBLENBQUF1OUIsdUJBQUE7SUFBQXhuQyxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQStzQyx5QkFBeUJBLENBQUEsRUFBRztNQUN4QixJQUFPMVEsUUFBUSxHQUFJLElBQUksQ0FBQ2x0QixLQUFLLENBQXRCa3RCLFFBQVE7TUFDZixJQUFNc04sTUFBTSxHQUFHMEMsbURBQWdCLENBQUMsQ0FBQzs7TUFFakM7TUFDQTFDLE1BQU0sQ0FBQ3FELEtBQUssR0FBRztRQUNYQyxXQUFXLEVBQUUsYUFBYTtRQUMxQkMsT0FBTyxFQUFFO1VBQ0xDLE1BQU0sRUFBRSxrQkFBa0I7VUFDMUIsY0FBYyxFQUFFO1FBQ3BCO01BQ0osQ0FBQztNQUVEOVEsUUFBUSxDQUFDa1EseURBQVMsQ0FBQzVDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CO0VBQUM7SUFBQTNrQyxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQXUxQixNQUFNQSxDQUFBLEVBQUc7TUFDTCxJQUFPb1UsTUFBTSxHQUFJLElBQUksQ0FBQ3g2QixLQUFLLENBQXBCdzZCLE1BQU07TUFDYixJQUFJNXBCLGtEQUFJLENBQUM0cEIsTUFBTSxDQUFDLEtBQUssTUFBTSxFQUFFO1FBQ3pCLG9CQUFPeFQsMERBQUE7VUFBS25FLFNBQVMsRUFBQztRQUFlLEdBQUMsWUFBZSxDQUFDO01BQzFEO01BQ0EsSUFBT29iLGNBQWMsR0FBSXpELE1BQU0sQ0FBeEJ5RCxjQUFjO01BQ3JCLG9CQUNJalgsMERBQUEsQ0FBQ0EsdURBQWMsUUFDVmlYLGNBQWMsZ0JBQUdqWCwwREFBQSxDQUFDZ1csc0VBQU8sTUFBRSxDQUFDLEdBQUcsSUFBSSxlQUNwQ2hXLDBEQUFBLENBQUM4Viw0REFBYSxNQUFFLENBQUMsZUFDakI5ViwwREFBQSxDQUFDK1Ysc0VBQU8sTUFBRSxDQUFDLGVBQ1gvViwwREFBQSxDQUFDaVcsdUVBQVEsTUFBRSxDQUNDLENBQUM7SUFFekI7RUFBQztBQUFBLEVBekRpQ2pXLHdEQUFlO0FBNERyRHFXLHVCQUF1QixDQUFDWCxTQUFTLEdBQUc7RUFDaENSLEtBQUssRUFBRTlDLDBEQUFnQjtFQUN2QmxNLFFBQVEsRUFBRWtNLHdEQUFjO0VBQ3hCb0IsTUFBTSxFQUFFcEIsMERBQWdCMW9CO0FBQzVCLENBQUM7QUFFRCxJQUFNd3RCLFlBQVksR0FBR2hULG9EQUFPLENBQ3hCLFVBQUF3RSxLQUFLO0VBQUEsT0FBSztJQUNOa04sT0FBTyxFQUFFbE4sS0FBSyxDQUFDa04sT0FBTztJQUN0QnBDLE1BQU0sRUFBRTlLLEtBQUssQ0FBQzhLO0VBQ2xCLENBQUM7QUFBQSxDQUFDLEVBQ0YsVUFBQXROLFFBQVE7RUFBQSxPQUFLO0lBQUNBO0VBQVEsQ0FBQztBQUFBLENBQzNCLENBQUMsQ0FBQ21RLHVCQUF1QixDQUFDO0FBRTFCLCtEQUFlYSxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZRO0FBQ0s7QUFDRDtBQUNYO0FBQ29CO0FBQ2hELElBQU1FLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBem9DLElBQUEsRUFPVDtFQUFBLElBQUEwb0MsVUFBQSxHQUFBMW9DLElBQUEsQ0FQZXVtQyxLQUFLO0lBQUxBLEtBQUssR0FBQW1DLFVBQUEsY0FBRztNQUMzQmxDLFVBQVUsRUFBRSxJQUFJO01BQ2hCQyxXQUFXLEVBQUUsSUFBSTtNQUNqQm1CLFdBQVcsRUFBRSxJQUFJO01BQ2pCQyxZQUFZLEVBQUUsSUFBSTtNQUNsQkMsaUJBQWlCLEVBQUUsSUFBSTtNQUN2QkMsbUJBQW1CLEVBQUU7SUFDekIsQ0FBQyxHQUFBVyxVQUFBO0VBQ0csSUFBQTFELFNBQUEsR0FBb0J4QiwrQ0FBUSxDQUFDO01BQUEsT0FBTSxJQUFJZ0YsOENBQUssQ0FBQyxDQUFDO0lBQUEsRUFBQztJQUFBdkQsVUFBQSxHQUFBL3FDLGNBQUEsQ0FBQThxQyxTQUFBO0lBQXRDdFQsS0FBSyxHQUFBdVQsVUFBQSxJQUFMdlQsS0FBSztFQUNkLG9CQUFRTCwwREFBbUIsQ0FBQ0ksaURBQVEsRUFBRTtJQUFFQyxLQUFLLEVBQUVBO0VBQU0sQ0FBQyxlQUNsREwsMERBQW1CLENBQUNrWCwyREFBWSxFQUFFO0lBQUVoQyxLQUFLLEVBQUVBO0VBQU0sQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUNEa0MsV0FBVyxDQUFDMUIsU0FBUyxHQUFHO0VBQ3BCUixLQUFLLEVBQUU5Qyx1REFBZSxDQUFDO0lBQ25CK0MsVUFBVSxFQUFFL0Msd0RBQWM7SUFDMUJnRCxXQUFXLEVBQUVoRCx3REFBYztJQUMzQm1FLFdBQVcsRUFBRW5FLHdEQUFjO0lBQzNCb0UsWUFBWSxFQUFFcEUsd0RBQWM7SUFDNUJxRSxpQkFBaUIsRUFBRXJFLHdEQUFjO0lBQ2pDc0UsbUJBQW1CLEVBQUV0RSx3REFBY3hXO0VBQ3ZDLENBQUM7QUFDTCxDQUFDO0FBQ0QsK0RBQWV3YixXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQkE7QUFDTztBQUVhO0FBRTNCO0FBQUEsSUFFYkksWUFBWSxnQkFBQTErQixZQUFBLENBQ2QsU0FBQTArQixhQUFZdEMsS0FBSyxFQUFFO0VBQUF4N0IsZUFBQSxPQUFBODlCLFlBQUE7RUFDZjtFQUNBLElBQU0xWSxTQUFTLEdBQUd5TyxRQUFRLENBQUN4K0IsY0FBYyxDQUFDLG1CQUFtQixDQUFDO0VBRTlELElBQUl3b0MsNkRBQW1CLEVBQUU7SUFDckIsSUFBTXJ3QyxJQUFJLEdBQUdxd0MsMkRBQW1CLENBQUN6WSxTQUFTLENBQUM7SUFDM0M1M0IsSUFBSSxDQUFDazRCLE1BQU0sY0FBQ1ksMERBQUEsQ0FBQ29YLDBEQUFXO01BQUNsQyxLQUFLLEVBQUVBO0lBQU0sQ0FBRSxDQUFDLENBQUM7RUFDOUMsQ0FBQyxNQUFNO0lBQ0hxQyx1REFBZSxjQUFDdlgsMERBQUEsQ0FBQ29YLDBEQUFXO01BQUNsQyxLQUFLLEVBQUVBO0lBQU0sQ0FBRSxDQUFDLEVBQUVwVyxTQUFTLENBQUM7RUFDN0Q7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQjBDO0FBQUEsSUFDMUI0WSxhQUFhLGdCQUFBNStCLFlBQUEsQ0FJOUIsU0FBQTQrQixjQUFZclgsTUFBSyxFQUFFO0VBQUEsSUFBQWhDLEtBQUE7RUFBQTNrQixlQUFBLE9BQUFnK0IsYUFBQTtFQUFBQyxlQUFBO0VBQUFBLGVBQUE7RUFBQUEsZUFBQSxxQkFETixFQUFFO0VBQUFBLGVBQUEsa0JBSUwsVUFBQ0MsUUFBUSxFQUFFamlCLE1BQU0sRUFBSztJQUM1QixJQUFJLE9BQU9paUIsUUFBUSxLQUFLLFVBQVUsRUFBRTtNQUNoQyxJQUFJLENBQUN2dkMsS0FBSyxDQUFDMEIsT0FBTyxDQUFDNHJCLE1BQU0sQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sSUFBSWhKLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztNQUM5QztNQUNBMFIsS0FBSSxDQUFDaHlCLEdBQUcsQ0FBQ3VyQyxRQUFRLEVBQUVqaUIsTUFBTSxDQUFDO01BQzFCLE9BQU87UUFBQSxPQUFNMEksS0FBSSxDQUFDN04sTUFBTSxDQUFDb25CLFFBQVEsQ0FBQztNQUFBO0lBQ3RDO0lBQ0F2WixLQUFJLENBQUNoeUIsR0FBRyxDQUFDdXJDLFFBQVEsQ0FBQ0EsUUFBUSxFQUFFQSxRQUFRLENBQUNqaUIsTUFBTSxDQUFDO0lBQzVDLE9BQU87TUFBQSxPQUFNMEksS0FBSSxDQUFDN04sTUFBTSxDQUFDb25CLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDO0lBQUE7RUFDL0MsQ0FBQztFQUFBRCxlQUFBLG1CQUNVLFVBQUN0WCxLQUFLLEVBQUs7SUFDbEJoQyxLQUFJLENBQUN3WixZQUFZLENBQUMsQ0FBQztJQUNuQnhaLEtBQUksQ0FBQ3laLFFBQVEsQ0FBQ3pYLEtBQUssQ0FBQztFQUN4QixDQUFDO0VBQUFzWCxlQUFBLHVCQUNjO0lBQUEsSUFBQUksa0JBQUE7SUFBQSxRQUFBQSxrQkFBQSxHQUFNMVosS0FBSSxDQUFDMlosWUFBWSxjQUFBRCxrQkFBQSx1QkFBakJBLGtCQUFBLENBQUEvL0IsSUFBQSxDQUFBcW1CLEtBQW9CLENBQUM7RUFBQTtFQUFBc1osZUFBQSxtQkFDL0IsVUFBQ3RYLEtBQUssRUFBSztJQUNsQmhDLEtBQUksQ0FBQzRaLE1BQU0sR0FBRzVYLEtBQUs7SUFDbkIsSUFBSUEsS0FBSyxFQUFFO01BQ1BoQyxLQUFJLENBQUMyWixZQUFZLEdBQUczWCxLQUFLLENBQUNzRyxTQUFTLENBQUN0SSxLQUFJLENBQUN5TixNQUFNLENBQUM7SUFDcEQ7SUFDQXpOLEtBQUksQ0FBQzZaLFVBQVUsQ0FBQzN2QyxPQUFPLENBQUMsVUFBQTZ5QixDQUFDLEVBQUk7TUFDekJBLENBQUMsQ0FBQytjLFNBQVMsR0FBRyxJQUFJO0lBQ3RCLENBQUMsQ0FBQztFQUNOLENBQUM7RUFBQVIsZUFBQSxjQUNLLFVBQUNDLFFBQVEsRUFBRWppQixNQUFNO0lBQUEsT0FBSzBJLEtBQUksQ0FBQzZaLFVBQVUsQ0FBQ3R1QyxJQUFJLENBQUM7TUFDN0N3dUMsVUFBVSxFQUFFcm9DLGlEQUFHLENBQUMsVUFBQThZLENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUNzUixLQUFLLENBQUMsR0FBRyxDQUFDO01BQUEsR0FBRXhFLE1BQU0sQ0FBQztNQUMxQ3dpQixTQUFTLEVBQUUsSUFBSTtNQUNmUCxRQUFRO01BQ1JTLFNBQVMsRUFBRTtJQUNmLENBQUMsQ0FBQztFQUFBO0VBQUFWLGVBQUEsaUJBQ08sWUFBTTtJQUNYLElBQU10WCxLQUFLLEdBQUdoQyxLQUFJLENBQUM0WixNQUFNO0lBQ3pCLElBQUksQ0FBQzVYLEtBQUssRUFBRTtNQUNSO0lBQ0o7SUFDQSxJQUFNcUksS0FBSyxHQUFHckksS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQztJQUM5QixJQUFNMFgsU0FBUyxHQUFHNXRDLGlEQUFNLENBQUMsVUFBQTJ3QixDQUFDO01BQUEsT0FBSSxDQUFDQSxDQUFDLENBQUNpZCxTQUFTLElBQ3RDcHpCLGlEQUFHLENBQUMsVUFBQWpjLENBQUM7UUFBQSxPQUFJNlcsaURBQUksQ0FBQzdXLENBQUMsRUFBRTAvQixLQUFLLENBQUMsS0FBSzdvQixpREFBSSxDQUFDN1csQ0FBQyxFQUFFb3lCLENBQUMsQ0FBQytjLFNBQVMsQ0FBQztNQUFBLEdBQUUvYyxDQUFDLENBQUNnZCxVQUFVLENBQUM7SUFBQSxHQUFFL1osS0FBSSxDQUFDNlosVUFBVSxDQUFDO0lBQ3JGRyxTQUFTLENBQUM5dkMsT0FBTyxDQUFDLFVBQUE2eUIsQ0FBQyxFQUFJO01BQ25CQSxDQUFDLENBQUNpZCxTQUFTLEdBQUcsSUFBSTtJQUN0QixDQUFDLENBQUM7SUFDRkEsU0FBUyxDQUFDOXZDLE9BQU8sQ0FBQyxVQUFBNnlCLENBQUMsRUFBSTtNQUNuQkEsQ0FBQyxDQUFDK2MsU0FBUyxHQUFHOVgsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQztNQUM5QnZGLENBQUMsQ0FBQ3djLFFBQVEsQ0FBQ3ZYLEtBQUssQ0FBQztNQUNqQmpGLENBQUMsQ0FBQ2lkLFNBQVMsR0FBRyxLQUFLO0lBQ3ZCLENBQUMsQ0FBQztFQUNOLENBQUM7RUFBQVYsZUFBQSxpQkFDUSxVQUFDQyxRQUFRO0lBQUEsT0FBS3ZaLEtBQUksQ0FBQzZaLFVBQVUsQ0FBQ2g4QixNQUFNLENBQUNtaUIsS0FBSSxDQUFDNlosVUFBVSxDQUFDN3RCLFNBQVMsQ0FBQyxVQUFBK1EsQ0FBQztNQUFBLE9BQUl3YyxRQUFRLEtBQUt4YyxDQUFDLENBQUN3YyxRQUFRO0lBQUEsR0FBRXZaLEtBQUksQ0FBQzZaLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUFBO0VBbER0SCxJQUFJLENBQUNKLFFBQVEsQ0FBQ3pYLE1BQUssQ0FBQztBQUN4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ05MLHVLQUFBcHpCLENBQUEsRUFBQW91QixDQUFBLEVBQUF0QyxDQUFBLHdCQUFBeHZCLE1BQUEsR0FBQUEsTUFBQSxPQUFBeWlCLENBQUEsR0FBQStNLENBQUEsQ0FBQXZ2QixRQUFBLGtCQUFBNHhCLENBQUEsR0FBQXJDLENBQUEsQ0FBQTZYLFdBQUEsOEJBQUE1bkMsRUFBQSt2QixDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLEVBQUFweUIsQ0FBQSxRQUFBNm1CLENBQUEsR0FBQTdELENBQUEsSUFBQUEsQ0FBQSxDQUFBdlMsU0FBQSxZQUFBbzNCLFNBQUEsR0FBQTdrQixDQUFBLEdBQUE2a0IsU0FBQSxFQUFBbFYsQ0FBQSxHQUFBOXpCLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFxQyxDQUFBLENBQUFwVyxTQUFBLFVBQUFxM0IsbUJBQUEsQ0FBQW5WLENBQUEsdUJBQUE1QyxDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLFFBQUFweUIsQ0FBQSxFQUFBNm1CLENBQUEsRUFBQThMLENBQUEsRUFBQW5XLENBQUEsTUFBQXFELENBQUEsR0FBQXVTLENBQUEsUUFBQXRyQixDQUFBLE9BQUFpaEMsQ0FBQSxLQUFBbG9CLENBQUEsS0FBQW1ELENBQUEsS0FBQS9ELENBQUEsRUFBQWhiLENBQUEsRUFBQTRaLENBQUEsRUFBQW1CLENBQUEsRUFBQXhDLENBQUEsRUFBQXdDLENBQUEsQ0FBQWpnQixJQUFBLENBQUFrRixDQUFBLE1BQUErYSxDQUFBLFdBQUFBLEVBQUFxVCxDQUFBLEVBQUF0QyxDQUFBLFdBQUEvdkIsQ0FBQSxHQUFBcXlCLENBQUEsRUFBQXhMLENBQUEsTUFBQThMLENBQUEsR0FBQTF1QixDQUFBLEVBQUE4akMsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQStNLENBQUEsRUFBQWxTLENBQUEsZ0JBQUFtQixFQUFBK1EsQ0FBQSxFQUFBL00sQ0FBQSxTQUFBNkQsQ0FBQSxHQUFBa0osQ0FBQSxFQUFBNEMsQ0FBQSxHQUFBM1AsQ0FBQSxFQUFBcVAsQ0FBQSxPQUFBdnJCLENBQUEsSUFBQTBWLENBQUEsS0FBQTRWLENBQUEsSUFBQUMsQ0FBQSxHQUFBeFMsQ0FBQSxDQUFBMWdCLE1BQUEsRUFBQWt6QixDQUFBLFVBQUFELENBQUEsRUFBQXB5QixDQUFBLEdBQUE2ZixDQUFBLENBQUF3UyxDQUFBLEdBQUFyVCxDQUFBLEdBQUErb0IsQ0FBQSxDQUFBbG9CLENBQUEsRUFBQWlRLENBQUEsR0FBQTl2QixDQUFBLEtBQUErdkIsQ0FBQSxRQUFBcUMsQ0FBQSxHQUFBdEMsQ0FBQSxLQUFBOU0sQ0FBQSxNQUFBMlAsQ0FBQSxHQUFBM3lCLENBQUEsRUFBQTZtQixDQUFBLEdBQUE3bUIsQ0FBQSxZQUFBNm1CLENBQUEsV0FBQTdtQixDQUFBLE1BQUFBLENBQUEsTUFBQWlFLENBQUEsSUFBQWpFLENBQUEsT0FBQWdmLENBQUEsTUFBQW9ULENBQUEsR0FBQXJDLENBQUEsUUFBQS9RLENBQUEsR0FBQWhmLENBQUEsUUFBQTZtQixDQUFBLE1BQUFraEIsQ0FBQSxDQUFBOW9CLENBQUEsR0FBQStELENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBaGpCLENBQUEsT0FBQWdmLENBQUEsR0FBQThRLENBQUEsS0FBQXNDLENBQUEsR0FBQXJDLENBQUEsUUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxJQUFBQSxDQUFBLEdBQUE4TSxDQUFBLE1BQUE5dkIsQ0FBQSxNQUFBK3ZCLENBQUEsRUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxFQUFBK2tCLENBQUEsQ0FBQS9rQixDQUFBLEdBQUE4TSxDQUFBLEVBQUFqSixDQUFBLGNBQUF1TCxDQUFBLElBQUFyQyxDQUFBLGFBQUFsUyxDQUFBLFFBQUEvVyxDQUFBLE9BQUFrYyxDQUFBLHFCQUFBb1AsQ0FBQSxFQUFBdlMsQ0FBQSxFQUFBaVEsQ0FBQSxRQUFBdFQsQ0FBQSxZQUFBeGIsU0FBQSx1Q0FBQThGLENBQUEsVUFBQStZLENBQUEsSUFBQWIsQ0FBQSxDQUFBYSxDQUFBLEVBQUFpUSxDQUFBLEdBQUFqSixDQUFBLEdBQUFoSCxDQUFBLEVBQUE4UyxDQUFBLEdBQUE3QyxDQUFBLEdBQUF1QyxDQUFBLEdBQUF4TCxDQUFBLE9BQUE1aUIsQ0FBQSxHQUFBMHVCLENBQUEsTUFBQTdyQixDQUFBLEtBQUE5RyxDQUFBLEtBQUE2bUIsQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQWtoQixDQUFBLENBQUEva0IsQ0FBQSxRQUFBaEUsQ0FBQSxDQUFBNkgsQ0FBQSxFQUFBOEwsQ0FBQSxLQUFBb1YsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQTJQLENBQUEsR0FBQW9WLENBQUEsQ0FBQTlvQixDQUFBLEdBQUEwVCxDQUFBLGFBQUFuVyxDQUFBLE1BQUF4YyxDQUFBLFFBQUE2bUIsQ0FBQSxLQUFBdUwsQ0FBQSxZQUFBQyxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBb3lCLENBQUEsV0FBQUMsQ0FBQSxHQUFBQSxDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxFQUFBMnlCLENBQUEsVUFBQTN4QixTQUFBLDJDQUFBcXhCLENBQUEsQ0FBQTF4QixJQUFBLFNBQUEweEIsQ0FBQSxFQUFBTSxDQUFBLEdBQUFOLENBQUEsQ0FBQXh4QixLQUFBLEVBQUFnbUIsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUF3TCxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBMEcsTUFBQSxLQUFBMnJCLENBQUEsQ0FBQXJqQixJQUFBLENBQUFoUCxDQUFBLEdBQUE2bUIsQ0FBQSxTQUFBOEwsQ0FBQSxHQUFBM3hCLFNBQUEsdUNBQUFveEIsQ0FBQSxnQkFBQXZMLENBQUEsT0FBQTdtQixDQUFBLEdBQUFpRSxDQUFBLGNBQUFvdUIsQ0FBQSxJQUFBdnJCLENBQUEsR0FBQWloQyxDQUFBLENBQUEva0IsQ0FBQSxRQUFBMlAsQ0FBQSxHQUFBNUMsQ0FBQSxDQUFBL2dCLElBQUEsQ0FBQWdVLENBQUEsRUFBQStrQixDQUFBLE9BQUFscUIsQ0FBQSxrQkFBQXdVLENBQUEsSUFBQXJ5QixDQUFBLEdBQUFpRSxDQUFBLEVBQUE0aUIsQ0FBQSxNQUFBOEwsQ0FBQSxHQUFBTixDQUFBLGNBQUE3VixDQUFBLG1CQUFBM2IsS0FBQSxFQUFBd3hCLENBQUEsRUFBQTF4QixJQUFBLEVBQUFtRyxDQUFBLFNBQUFpcEIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTJ5QixDQUFBLFFBQUE5VSxDQUFBLGdCQUFBZ3FCLFVBQUEsY0FBQUcsa0JBQUEsY0FBQUMsMkJBQUEsS0FBQTVWLENBQUEsR0FBQXh6QixNQUFBLENBQUE0bEIsY0FBQSxNQUFBb0MsQ0FBQSxNQUFBN0QsQ0FBQSxJQUFBcVAsQ0FBQSxDQUFBQSxDQUFBLElBQUFyUCxDQUFBLFNBQUE4a0IsbUJBQUEsQ0FBQXpWLENBQUEsT0FBQXJQLENBQUEsaUNBQUFxUCxDQUFBLEdBQUFNLENBQUEsR0FBQXNWLDBCQUFBLENBQUF4M0IsU0FBQSxHQUFBbzNCLFNBQUEsQ0FBQXAzQixTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxZQUFBckssRUFBQXZZLENBQUEsV0FBQXBGLE1BQUEsQ0FBQXFwQyxjQUFBLEdBQUFycEMsTUFBQSxDQUFBcXBDLGNBQUEsQ0FBQWprQyxDQUFBLEVBQUFna0MsMEJBQUEsS0FBQWhrQyxDQUFBLENBQUFra0MsU0FBQSxHQUFBRiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBN2pDLENBQUEsRUFBQW11QixDQUFBLHlCQUFBbnVCLENBQUEsQ0FBQXdNLFNBQUEsR0FBQTVSLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFtTyxDQUFBLEdBQUExdUIsQ0FBQSxXQUFBK2pDLGlCQUFBLENBQUF2M0IsU0FBQSxHQUFBdzNCLDBCQUFBLEVBQUFILG1CQUFBLENBQUFuVixDQUFBLGlCQUFBc1YsMEJBQUEsR0FBQUgsbUJBQUEsQ0FBQUcsMEJBQUEsaUJBQUFELGlCQUFBLEdBQUFBLGlCQUFBLENBQUF6UyxXQUFBLHdCQUFBdVMsbUJBQUEsQ0FBQUcsMEJBQUEsRUFBQTdWLENBQUEsd0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxHQUFBbVYsbUJBQUEsQ0FBQW5WLENBQUEsRUFBQVAsQ0FBQSxnQkFBQTBWLG1CQUFBLENBQUFuVixDQUFBLEVBQUEzUCxDQUFBLGlDQUFBOGtCLG1CQUFBLENBQUFuVixDQUFBLDhEQUFBeVYsWUFBQSxZQUFBQSxhQUFBLGFBQUFoaUMsQ0FBQSxFQUFBcEcsQ0FBQSxFQUFBdzBCLENBQUEsRUFBQWhZLENBQUE7QUFBQSxTQUFBc3JCLG9CQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBLFFBQUFyeUIsQ0FBQSxHQUFBbkIsTUFBQSxDQUFBd1IsY0FBQSxRQUFBclEsQ0FBQSx1QkFBQWlFLENBQUEsSUFBQWpFLENBQUEsUUFBQThuQyxtQkFBQSxZQUFBTyxtQkFBQXBrQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBdEMsQ0FBQSxFQUFBL3ZCLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsQ0FBQSxFQUFBOHJCLENBQUEsSUFBQWx2QixLQUFBLEVBQUFtaUIsQ0FBQSxFQUFBOVMsVUFBQSxHQUFBbWlCLENBQUEsRUFBQWxpQixZQUFBLEdBQUFraUIsQ0FBQSxFQUFBamlCLFFBQUEsR0FBQWlpQixDQUFBLE1BQUFwdUIsQ0FBQSxDQUFBOHJCLENBQUEsSUFBQS9NLENBQUEsWUFBQW9QLENBQUEsWUFBQUEsRUFBQXJDLENBQUEsRUFBQS9NLENBQUEsSUFBQThrQixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLFlBQUE5ckIsQ0FBQSxnQkFBQXFrQyxPQUFBLENBQUF2WSxDQUFBLEVBQUEvTSxDQUFBLEVBQUEvZSxDQUFBLFVBQUFtdUIsQ0FBQSxhQUFBQSxDQUFBLGNBQUFBLENBQUEsb0JBQUEwVixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBO0FBQUEsU0FBQWtXLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFEMkM7QUFDZ0M7QUFDM0M7QUFDYTtBQUNzQjs7QUFFbkU7QUFDQSxJQUFNZ0gsY0FBYyxHQUFHdGYsaURBQUksQ0FBQ2xiLE9BQU8sQ0FBQ3k2QixJQUFJLENBQUM7QUFFekMsU0FBU0MsR0FBR0EsQ0FBQ2o1QixJQUFJLEVBQUVrNUIsV0FBVyxFQUFFO0VBQzVCLE9BQU9sQyxLQUFLLENBQ1JoM0IsSUFBSSxFQUNKMFksaURBQWMsQ0FBQ3dnQixXQUFXLEVBQUU7SUFDeEJyaUIsTUFBTSxFQUFFLEtBQUs7SUFDYnFnQixPQUFPLEVBQUV1Qix1REFBYSxDQUFDO0VBQzNCLENBQUMsQ0FDTCxDQUFDO0FBQ0w7QUFFQSxTQUFTVSxJQUFJQSxDQUFDbjVCLElBQUksRUFBRWs1QixXQUFXLEVBQWE7RUFBQSxJQUFYRSxJQUFJLEdBQUEvd0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRyxDQUFDLENBQUM7RUFDdEMsT0FBTzJ1QyxLQUFLLENBQ1JoM0IsSUFBSSxFQUNKMFksaURBQWMsQ0FBQ3dnQixXQUFXLEVBQUU7SUFDeEJyaUIsTUFBTSxFQUFFLE1BQU07SUFDZHFnQixPQUFPLEVBQUV1Qix1REFBYSxDQUFDLENBQUM7SUFDeEJXLElBQUksRUFBRUEsSUFBSSxHQUFHM1csSUFBSSxDQUFDQyxTQUFTLENBQUMwVyxJQUFJLENBQUMsR0FBRztFQUN4QyxDQUFDLENBQ0wsQ0FBQztBQUNMO0FBRUEsSUFBTUMsT0FBTyxHQUFHO0VBQUNKLEdBQUc7RUFBRUU7QUFBSSxDQUFDO0FBRVosU0FBU2xHLFFBQVFBLENBQUNxRyxRQUFRLEVBQUV6aUIsTUFBTSxFQUFFMkosS0FBSyxFQUFFOTFCLEVBQUUsRUFBRTB1QyxJQUFJLEVBQUU7RUFDaEU7SUFBQSxJQUFBdHFDLElBQUEsR0FBQWdqQyxpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQU8sU0FBQTBXLFFBQU9oTyxRQUFRLEVBQUV2RixRQUFRO01BQUEsSUFBQXlZLFNBQUEsRUFBQTVGLE1BQUEsRUFBQTBCLEtBQUEsRUFBQW1FLFVBQUEsRUFBQUMsR0FBQSxFQU1uQkMsbUJBQW1CLEVBQUFDLEdBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMsV0FBQSxFQUFBbkYsT0FBQSxFQUFBcGpCLE9BQUEsRUFBQXdvQixFQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBMUksWUFBQSxHQUFBaGlDLENBQUEsV0FBQStrQyxRQUFBO1FBQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO1VBQUE7WUFBbkJ1dEIsbUJBQW1CLFlBQUFRLHFCQUFDQyxTQUFTLEVBQUU7Y0FDcEMsSUFBSXJaLFFBQVEsQ0FBQyxDQUFDLENBQUNrRCxLQUFLLENBQUNvVyxnQkFBZ0IsS0FBS0QsU0FBUyxFQUFFO2dCQUNqRDlULFFBQVEsQ0FBQztrQkFDTHRjLElBQUksRUFBRSx1QkFBdUI7a0JBQzdCc3dCLE9BQU8sRUFBRUY7Z0JBQ2IsQ0FBQyxDQUFDO2NBQ047WUFDSixDQUFDO1lBQUFaLFNBQUEsR0FacUJ6WSxRQUFRLENBQUMsQ0FBQyxFQUEzQjZTLE1BQU0sR0FBQTRGLFNBQUEsQ0FBTjVGLE1BQU0sRUFBRTBCLEtBQUssR0FBQWtFLFNBQUEsQ0FBTGxFLEtBQUs7WUFDZG1FLFVBQVUsR0FBRyxJQUFJO1lBRWZDLEdBQUcsTUFBQW55QixNQUFBLENBQU1zeEIsK0NBQU8sQ0FBQ2pGLE1BQU0sQ0FBQyxFQUFBcnNCLE1BQUEsQ0FBR2d5QixRQUFRO1lBV3pDalQsUUFBUSxDQUFDO2NBQ0x0YyxJQUFJLEVBQUV5VyxLQUFLO2NBQ1g2WixPQUFPLEVBQUU7Z0JBQUMzdkMsRUFBRTtnQkFBRW1xQyxNQUFNLEVBQUU7Y0FBUztZQUNuQyxDQUFDLENBQUM7WUFBQ1AsUUFBQSxDQUFBdHJCLENBQUE7WUFJVTR3QixLQUFLLEdBQUcsQ0FBQztVQUFBO1lBQUEsTUFBRUEsS0FBSyxJQUFJZix3REFBZ0I7Y0FBQXZFLFFBQUEsQ0FBQW5vQixDQUFBO2NBQUE7WUFBQTtZQUFBbW9CLFFBQUEsQ0FBQXRyQixDQUFBO1lBQUFzckIsUUFBQSxDQUFBbm9CLENBQUE7WUFBQSxPQUV6Qmt0QixPQUFPLENBQUN4aUIsTUFBTSxDQUFDLENBQUM0aUIsR0FBRyxFQUFFOUYsTUFBTSxDQUFDcUQsS0FBSyxFQUFFb0MsSUFBSSxDQUFDO1VBQUE7WUFBcERPLEdBQUcsR0FBQXJGLFFBQUEsQ0FBQWxzQixDQUFBO1lBQUFrc0IsUUFBQSxDQUFBbm9CLENBQUE7WUFBQTtVQUFBO1lBQUFtb0IsUUFBQSxDQUFBdHJCLENBQUE7WUFBQWd4QixFQUFBLEdBQUExRixRQUFBLENBQUFsc0IsQ0FBQTtZQUVIO1lBQ0E7WUFDQTtZQUNBO1lBQ0E3SixPQUFPLENBQUNDLEdBQUcsQ0FBQyxhQUFhLEVBQUVtN0IsR0FBRyxDQUFDO1lBQy9CRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFBQyxPQUFBcEYsUUFBQSxDQUFBdHRCLENBQUE7VUFBQTtZQUFBLE1BSzNCMnlCLEdBQUcsQ0FBQzlFLE1BQU0sS0FBS3hCLHdEQUFNLENBQUNpSCxZQUFZLElBQ2xDWCxHQUFHLENBQUM5RSxNQUFNLEtBQUt4Qix3REFBTSxDQUFDa0gsV0FBVztjQUFBakcsUUFBQSxDQUFBbm9CLENBQUE7Y0FBQTtZQUFBO1lBQUEsS0FFN0JrcEIsS0FBSyxDQUFDd0IsbUJBQW1CO2NBQUF2QyxRQUFBLENBQUFub0IsQ0FBQTtjQUFBO1lBQUE7WUFBQW1vQixRQUFBLENBQUFub0IsQ0FBQTtZQUFBLE9BQ053dEIsR0FBRyxDQUFDYSxJQUFJLENBQUMsQ0FBQztVQUFBO1lBQXZCcEIsS0FBSSxHQUFBOUUsUUFBQSxDQUFBbHNCLENBQUE7WUFBQSxLQUNOZ3hCLEtBQUksQ0FBQy90QixRQUFRLENBQUN5dEIscUVBQW1CLENBQUM7Y0FBQXhFLFFBQUEsQ0FBQW5vQixDQUFBO2NBQUE7WUFBQTtZQUFBbW9CLFFBQUEsQ0FBQW5vQixDQUFBO1lBQUEsT0FDYmtwQixLQUFLLENBQUN3QixtQkFBbUIsQ0FDMUNsRCxNQUFNLENBQUNxRCxLQUFLLENBQUNFLE9BQU8sQ0FBQ3VELGFBQWEsQ0FBQ0MsTUFBTSxDQUNyQyxTQUFTLENBQUNweUMsTUFDZCxDQUNKLENBQUM7VUFBQTtZQUpLd3hDLE1BQU0sR0FBQXhGLFFBQUEsQ0FBQWxzQixDQUFBO1lBQUEsS0FLUjB4QixNQUFNO2NBQUF4RixRQUFBLENBQUFub0IsQ0FBQTtjQUFBO1lBQUE7WUFDTnF0QixVQUFVLEdBQUc7Y0FDVGlCLGFBQWEsWUFBQW56QixNQUFBLENBQVl3eUIsTUFBTTtZQUNuQyxDQUFDO1lBRURuRyxNQUFNLEdBQUdqYixpREFBYyxDQUFDaWIsTUFBTSxFQUFFO2NBQzVCcUQsS0FBSyxFQUFFO2dCQUNIRSxPQUFPLEVBQUVzQztjQUNiO1lBQ0osQ0FBQyxDQUFDO1lBQUMsT0FBQWxGLFFBQUEsQ0FBQXR0QixDQUFBO1VBQUE7WUFBQSxPQUFBc3RCLFFBQUEsQ0FBQXR0QixDQUFBO1VBQUE7WUFsQ3dCNHlCLEtBQUssRUFBRTtZQUFBdEYsUUFBQSxDQUFBbm9CLENBQUE7WUFBQTtVQUFBO1lBNENoRDR0QixXQUFXLEdBQUdKLEdBQUcsQ0FBQ3pDLE9BQU8sQ0FBQ3hsQyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBRW5ELElBQUk4bkMsVUFBVSxFQUFFO2NBQ1puVCxRQUFRLENBQUNzUyx3REFBYyxDQUFDYSxVQUFVLENBQUMsQ0FBQztZQUN4QztZQUNBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUN0QkssV0FBVyxJQUFJQSxXQUFXLENBQUN4dUIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2NBQUErb0IsUUFBQSxDQUFBbm9CLENBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQW1vQixRQUFBLENBQUF0dEIsQ0FBQSxJQUN0RDJ5QixHQUFHLENBQUNyYixJQUFJLENBQUMsQ0FBQyxDQUFDdVQsSUFBSSxDQUFDLFVBQUF2VCxJQUFJLEVBQUk7Y0FDM0IrSCxRQUFRLENBQUM7Z0JBQ0x0YyxJQUFJLEVBQUV5VyxLQUFLO2dCQUNYNlosT0FBTyxFQUFFO2tCQUNMeEYsTUFBTSxFQUFFOEUsR0FBRyxDQUFDOUUsTUFBTTtrQkFDbEJELE9BQU8sRUFBRXRXLElBQUk7a0JBQ2I1ekI7Z0JBQ0o7Y0FDSixDQUFDLENBQUM7Y0FDRixPQUFPNHpCLElBQUk7WUFDZixDQUFDLENBQUM7VUFBQTtZQUFBZ1csUUFBQSxDQUFBbm9CLENBQUE7WUFBQSxPQUVnQnd0QixHQUFHLENBQUNhLElBQUksQ0FBQyxDQUFDO1VBQUE7WUFBMUI1RixPQUFPLEdBQUFOLFFBQUEsQ0FBQWxzQixDQUFBO1lBQ2Iyd0IsY0FBYyxDQUNWLDREQUNKLENBQUM7WUFBQyxPQUFBekUsUUFBQSxDQUFBdHRCLENBQUEsSUFDS3FmLFFBQVEsQ0FBQztjQUNadGMsSUFBSSxFQUFFeVcsS0FBSztjQUNYNlosT0FBTyxFQUFFO2dCQUNMM3ZDLEVBQUU7Z0JBQ0ZtcUMsTUFBTSxFQUFFOEUsR0FBRyxDQUFDOUUsTUFBTTtnQkFDbEJEO2NBQ0o7WUFDSixDQUFDLENBQUM7VUFBQTtZQUFBTixRQUFBLENBQUF0ckIsQ0FBQTtZQUFBaXhCLEdBQUEsR0FBQTNGLFFBQUEsQ0FBQWxzQixDQUFBO1lBRUlvSixPQUFPLEdBQUcsdUJBQXVCLEdBQUc4bkIsUUFBUTtZQUNsRFosMERBQWdCLENBQUF1QixHQUFBLEVBQU16b0IsT0FBTyxFQUFFNlUsUUFBUSxDQUFDO1VBQUM7WUFBQSxPQUFBaU8sUUFBQSxDQUFBdHRCLENBQUE7UUFBQTtNQUFBLEdBQUFxdEIsT0FBQTtJQUFBLENBRWhEO0lBQUEsaUJBQUFzRyxFQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBOXJDLElBQUEsQ0FBQTZYLEtBQUEsT0FBQXRlLFNBQUE7SUFBQTtFQUFBO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ3RJQSx1S0FBQStFLENBQUEsRUFBQW91QixDQUFBLEVBQUF0QyxDQUFBLHdCQUFBeHZCLE1BQUEsR0FBQUEsTUFBQSxPQUFBeWlCLENBQUEsR0FBQStNLENBQUEsQ0FBQXZ2QixRQUFBLGtCQUFBNHhCLENBQUEsR0FBQXJDLENBQUEsQ0FBQTZYLFdBQUEsOEJBQUE1bkMsRUFBQSt2QixDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLEVBQUFweUIsQ0FBQSxRQUFBNm1CLENBQUEsR0FBQTdELENBQUEsSUFBQUEsQ0FBQSxDQUFBdlMsU0FBQSxZQUFBbzNCLFNBQUEsR0FBQTdrQixDQUFBLEdBQUE2a0IsU0FBQSxFQUFBbFYsQ0FBQSxHQUFBOXpCLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFxQyxDQUFBLENBQUFwVyxTQUFBLFVBQUFxM0IsbUJBQUEsQ0FBQW5WLENBQUEsdUJBQUE1QyxDQUFBLEVBQUEvTSxDQUFBLEVBQUFvUCxDQUFBLFFBQUFweUIsQ0FBQSxFQUFBNm1CLENBQUEsRUFBQThMLENBQUEsRUFBQW5XLENBQUEsTUFBQXFELENBQUEsR0FBQXVTLENBQUEsUUFBQXRyQixDQUFBLE9BQUFpaEMsQ0FBQSxLQUFBbG9CLENBQUEsS0FBQW1ELENBQUEsS0FBQS9ELENBQUEsRUFBQWhiLENBQUEsRUFBQTRaLENBQUEsRUFBQW1CLENBQUEsRUFBQXhDLENBQUEsRUFBQXdDLENBQUEsQ0FBQWpnQixJQUFBLENBQUFrRixDQUFBLE1BQUErYSxDQUFBLFdBQUFBLEVBQUFxVCxDQUFBLEVBQUF0QyxDQUFBLFdBQUEvdkIsQ0FBQSxHQUFBcXlCLENBQUEsRUFBQXhMLENBQUEsTUFBQThMLENBQUEsR0FBQTF1QixDQUFBLEVBQUE4akMsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQStNLENBQUEsRUFBQWxTLENBQUEsZ0JBQUFtQixFQUFBK1EsQ0FBQSxFQUFBL00sQ0FBQSxTQUFBNkQsQ0FBQSxHQUFBa0osQ0FBQSxFQUFBNEMsQ0FBQSxHQUFBM1AsQ0FBQSxFQUFBcVAsQ0FBQSxPQUFBdnJCLENBQUEsSUFBQTBWLENBQUEsS0FBQTRWLENBQUEsSUFBQUMsQ0FBQSxHQUFBeFMsQ0FBQSxDQUFBMWdCLE1BQUEsRUFBQWt6QixDQUFBLFVBQUFELENBQUEsRUFBQXB5QixDQUFBLEdBQUE2ZixDQUFBLENBQUF3UyxDQUFBLEdBQUFyVCxDQUFBLEdBQUErb0IsQ0FBQSxDQUFBbG9CLENBQUEsRUFBQWlRLENBQUEsR0FBQTl2QixDQUFBLEtBQUErdkIsQ0FBQSxRQUFBcUMsQ0FBQSxHQUFBdEMsQ0FBQSxLQUFBOU0sQ0FBQSxNQUFBMlAsQ0FBQSxHQUFBM3lCLENBQUEsRUFBQTZtQixDQUFBLEdBQUE3bUIsQ0FBQSxZQUFBNm1CLENBQUEsV0FBQTdtQixDQUFBLE1BQUFBLENBQUEsTUFBQWlFLENBQUEsSUFBQWpFLENBQUEsT0FBQWdmLENBQUEsTUFBQW9ULENBQUEsR0FBQXJDLENBQUEsUUFBQS9RLENBQUEsR0FBQWhmLENBQUEsUUFBQTZtQixDQUFBLE1BQUFraEIsQ0FBQSxDQUFBOW9CLENBQUEsR0FBQStELENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBaGpCLENBQUEsT0FBQWdmLENBQUEsR0FBQThRLENBQUEsS0FBQXNDLENBQUEsR0FBQXJDLENBQUEsUUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxJQUFBQSxDQUFBLEdBQUE4TSxDQUFBLE1BQUE5dkIsQ0FBQSxNQUFBK3ZCLENBQUEsRUFBQS92QixDQUFBLE1BQUFnakIsQ0FBQSxFQUFBK2tCLENBQUEsQ0FBQS9rQixDQUFBLEdBQUE4TSxDQUFBLEVBQUFqSixDQUFBLGNBQUF1TCxDQUFBLElBQUFyQyxDQUFBLGFBQUFsUyxDQUFBLFFBQUEvVyxDQUFBLE9BQUFrYyxDQUFBLHFCQUFBb1AsQ0FBQSxFQUFBdlMsQ0FBQSxFQUFBaVEsQ0FBQSxRQUFBdFQsQ0FBQSxZQUFBeGIsU0FBQSx1Q0FBQThGLENBQUEsVUFBQStZLENBQUEsSUFBQWIsQ0FBQSxDQUFBYSxDQUFBLEVBQUFpUSxDQUFBLEdBQUFqSixDQUFBLEdBQUFoSCxDQUFBLEVBQUE4UyxDQUFBLEdBQUE3QyxDQUFBLEdBQUF1QyxDQUFBLEdBQUF4TCxDQUFBLE9BQUE1aUIsQ0FBQSxHQUFBMHVCLENBQUEsTUFBQTdyQixDQUFBLEtBQUE5RyxDQUFBLEtBQUE2bUIsQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQWtoQixDQUFBLENBQUEva0IsQ0FBQSxRQUFBaEUsQ0FBQSxDQUFBNkgsQ0FBQSxFQUFBOEwsQ0FBQSxLQUFBb1YsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQTJQLENBQUEsR0FBQW9WLENBQUEsQ0FBQTlvQixDQUFBLEdBQUEwVCxDQUFBLGFBQUFuVyxDQUFBLE1BQUF4YyxDQUFBLFFBQUE2bUIsQ0FBQSxLQUFBdUwsQ0FBQSxZQUFBQyxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBb3lCLENBQUEsV0FBQUMsQ0FBQSxHQUFBQSxDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxFQUFBMnlCLENBQUEsVUFBQTN4QixTQUFBLDJDQUFBcXhCLENBQUEsQ0FBQTF4QixJQUFBLFNBQUEweEIsQ0FBQSxFQUFBTSxDQUFBLEdBQUFOLENBQUEsQ0FBQXh4QixLQUFBLEVBQUFnbUIsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUF3TCxDQUFBLEdBQUFyeUIsQ0FBQSxDQUFBMEcsTUFBQSxLQUFBMnJCLENBQUEsQ0FBQXJqQixJQUFBLENBQUFoUCxDQUFBLEdBQUE2bUIsQ0FBQSxTQUFBOEwsQ0FBQSxHQUFBM3hCLFNBQUEsdUNBQUFveEIsQ0FBQSxnQkFBQXZMLENBQUEsT0FBQTdtQixDQUFBLEdBQUFpRSxDQUFBLGNBQUFvdUIsQ0FBQSxJQUFBdnJCLENBQUEsR0FBQWloQyxDQUFBLENBQUEva0IsQ0FBQSxRQUFBMlAsQ0FBQSxHQUFBNUMsQ0FBQSxDQUFBL2dCLElBQUEsQ0FBQWdVLENBQUEsRUFBQStrQixDQUFBLE9BQUFscUIsQ0FBQSxrQkFBQXdVLENBQUEsSUFBQXJ5QixDQUFBLEdBQUFpRSxDQUFBLEVBQUE0aUIsQ0FBQSxNQUFBOEwsQ0FBQSxHQUFBTixDQUFBLGNBQUE3VixDQUFBLG1CQUFBM2IsS0FBQSxFQUFBd3hCLENBQUEsRUFBQTF4QixJQUFBLEVBQUFtRyxDQUFBLFNBQUFpcEIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTJ5QixDQUFBLFFBQUE5VSxDQUFBLGdCQUFBZ3FCLFVBQUEsY0FBQUcsa0JBQUEsY0FBQUMsMkJBQUEsS0FBQTVWLENBQUEsR0FBQXh6QixNQUFBLENBQUE0bEIsY0FBQSxNQUFBb0MsQ0FBQSxNQUFBN0QsQ0FBQSxJQUFBcVAsQ0FBQSxDQUFBQSxDQUFBLElBQUFyUCxDQUFBLFNBQUE4a0IsbUJBQUEsQ0FBQXpWLENBQUEsT0FBQXJQLENBQUEsaUNBQUFxUCxDQUFBLEdBQUFNLENBQUEsR0FBQXNWLDBCQUFBLENBQUF4M0IsU0FBQSxHQUFBbzNCLFNBQUEsQ0FBQXAzQixTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxZQUFBckssRUFBQXZZLENBQUEsV0FBQXBGLE1BQUEsQ0FBQXFwQyxjQUFBLEdBQUFycEMsTUFBQSxDQUFBcXBDLGNBQUEsQ0FBQWprQyxDQUFBLEVBQUFna0MsMEJBQUEsS0FBQWhrQyxDQUFBLENBQUFra0MsU0FBQSxHQUFBRiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBN2pDLENBQUEsRUFBQW11QixDQUFBLHlCQUFBbnVCLENBQUEsQ0FBQXdNLFNBQUEsR0FBQTVSLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFtTyxDQUFBLEdBQUExdUIsQ0FBQSxXQUFBK2pDLGlCQUFBLENBQUF2M0IsU0FBQSxHQUFBdzNCLDBCQUFBLEVBQUFILG1CQUFBLENBQUFuVixDQUFBLGlCQUFBc1YsMEJBQUEsR0FBQUgsbUJBQUEsQ0FBQUcsMEJBQUEsaUJBQUFELGlCQUFBLEdBQUFBLGlCQUFBLENBQUF6UyxXQUFBLHdCQUFBdVMsbUJBQUEsQ0FBQUcsMEJBQUEsRUFBQTdWLENBQUEsd0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxHQUFBbVYsbUJBQUEsQ0FBQW5WLENBQUEsRUFBQVAsQ0FBQSxnQkFBQTBWLG1CQUFBLENBQUFuVixDQUFBLEVBQUEzUCxDQUFBLGlDQUFBOGtCLG1CQUFBLENBQUFuVixDQUFBLDhEQUFBeVYsWUFBQSxZQUFBQSxhQUFBLGFBQUFoaUMsQ0FBQSxFQUFBcEcsQ0FBQSxFQUFBdzBCLENBQUEsRUFBQWhZLENBQUE7QUFBQSxTQUFBc3JCLG9CQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBLFFBQUFyeUIsQ0FBQSxHQUFBbkIsTUFBQSxDQUFBd1IsY0FBQSxRQUFBclEsQ0FBQSx1QkFBQWlFLENBQUEsSUFBQWpFLENBQUEsUUFBQThuQyxtQkFBQSxZQUFBTyxtQkFBQXBrQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBdEMsQ0FBQSxFQUFBL3ZCLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsQ0FBQSxFQUFBOHJCLENBQUEsSUFBQWx2QixLQUFBLEVBQUFtaUIsQ0FBQSxFQUFBOVMsVUFBQSxHQUFBbWlCLENBQUEsRUFBQWxpQixZQUFBLEdBQUFraUIsQ0FBQSxFQUFBamlCLFFBQUEsR0FBQWlpQixDQUFBLE1BQUFwdUIsQ0FBQSxDQUFBOHJCLENBQUEsSUFBQS9NLENBQUEsWUFBQW9QLENBQUEsWUFBQUEsRUFBQXJDLENBQUEsRUFBQS9NLENBQUEsSUFBQThrQixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLFlBQUE5ckIsQ0FBQSxnQkFBQXFrQyxPQUFBLENBQUF2WSxDQUFBLEVBQUEvTSxDQUFBLEVBQUEvZSxDQUFBLFVBQUFtdUIsQ0FBQSxhQUFBQSxDQUFBLGNBQUFBLENBQUEsb0JBQUEwVixtQkFBQSxDQUFBN2pDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBO0FBQUEsU0FBQWtXLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFBQSxTQUFBaFAsbUJBQUE3SixDQUFBLFdBQUEyaEIsa0JBQUEsQ0FBQTNoQixDQUFBLEtBQUE0aEIsZ0JBQUEsQ0FBQTVoQixDQUFBLEtBQUFpWiwyQkFBQSxDQUFBalosQ0FBQSxLQUFBNmhCLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQTV3QyxTQUFBO0FBQUEsU0FBQTJ3QyxpQkFBQTVoQixDQUFBLDhCQUFBeHZCLE1BQUEsWUFBQXd2QixDQUFBLENBQUF4dkIsTUFBQSxDQUFBQyxRQUFBLGFBQUF1dkIsQ0FBQSx1QkFBQTF3QixLQUFBLENBQUFnaEIsSUFBQSxDQUFBMFAsQ0FBQTtBQUFBLFNBQUEyaEIsbUJBQUEzaEIsQ0FBQSxRQUFBMXdCLEtBQUEsQ0FBQTBCLE9BQUEsQ0FBQWd2QixDQUFBLFVBQUFtWixpQkFBQSxDQUFBblosQ0FBQTtBQUFBLFNBQUFsd0IsZUFBQWt3QixDQUFBLEVBQUE5ckIsQ0FBQSxXQUFBNmtDLGVBQUEsQ0FBQS9ZLENBQUEsS0FBQWdaLHFCQUFBLENBQUFoWixDQUFBLEVBQUE5ckIsQ0FBQSxLQUFBK2tDLDJCQUFBLENBQUFqWixDQUFBLEVBQUE5ckIsQ0FBQSxLQUFBZ2xDLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQWpvQyxTQUFBO0FBQUEsU0FBQWdvQyw0QkFBQWpaLENBQUEsRUFBQWxTLENBQUEsUUFBQWtTLENBQUEsMkJBQUFBLENBQUEsU0FBQW1aLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBLE9BQUF3VSxDQUFBLE1BQUFuVSxRQUFBLENBQUFsUCxJQUFBLENBQUErZ0IsQ0FBQSxFQUFBMVMsS0FBQSw2QkFBQWdWLENBQUEsSUFBQXRDLENBQUEsQ0FBQTNQLFdBQUEsS0FBQWlTLENBQUEsR0FBQXRDLENBQUEsQ0FBQTNQLFdBQUEsQ0FBQWdJLElBQUEsYUFBQWlLLENBQUEsY0FBQUEsQ0FBQSxHQUFBaHpCLEtBQUEsQ0FBQWdoQixJQUFBLENBQUEwUCxDQUFBLG9CQUFBc0MsQ0FBQSwrQ0FBQWhILElBQUEsQ0FBQWdILENBQUEsSUFBQTZXLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBO0FBQUEsU0FBQXFyQixrQkFBQW5aLENBQUEsRUFBQWxTLENBQUEsYUFBQUEsQ0FBQSxJQUFBQSxDQUFBLEdBQUFrUyxDQUFBLENBQUE1d0IsTUFBQSxNQUFBMGUsQ0FBQSxHQUFBa1MsQ0FBQSxDQUFBNXdCLE1BQUEsWUFBQThFLENBQUEsTUFBQStlLENBQUEsR0FBQTNqQixLQUFBLENBQUF3ZSxDQUFBLEdBQUE1WixDQUFBLEdBQUE0WixDQUFBLEVBQUE1WixDQUFBLElBQUErZSxDQUFBLENBQUEvZSxDQUFBLElBQUE4ckIsQ0FBQSxDQUFBOXJCLENBQUEsVUFBQStlLENBQUE7QUFBQSxTQUFBK2xCLHNCQUFBaFosQ0FBQSxFQUFBRCxDQUFBLFFBQUF1QyxDQUFBLFdBQUF0QyxDQUFBLGdDQUFBeHZCLE1BQUEsSUFBQXd2QixDQUFBLENBQUF4dkIsTUFBQSxDQUFBQyxRQUFBLEtBQUF1dkIsQ0FBQSw0QkFBQXNDLENBQUEsUUFBQXB1QixDQUFBLEVBQUErZSxDQUFBLEVBQUFoakIsQ0FBQSxFQUFBMnlCLENBQUEsRUFBQTlVLENBQUEsT0FBQXJCLENBQUEsT0FBQTRWLENBQUEsaUJBQUFweUIsQ0FBQSxJQUFBcXlCLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQStnQixDQUFBLEdBQUFydkIsSUFBQSxRQUFBb3ZCLENBQUEsUUFBQWp4QixNQUFBLENBQUF3ekIsQ0FBQSxNQUFBQSxDQUFBLFVBQUE3VixDQUFBLHVCQUFBQSxDQUFBLElBQUF2WSxDQUFBLEdBQUFqRSxDQUFBLENBQUFnUCxJQUFBLENBQUFxakIsQ0FBQSxHQUFBMXhCLElBQUEsTUFBQWtkLENBQUEsQ0FBQWpkLElBQUEsQ0FBQXFELENBQUEsQ0FBQXBELEtBQUEsR0FBQWdkLENBQUEsQ0FBQTFlLE1BQUEsS0FBQTJ3QixDQUFBLEdBQUF0VCxDQUFBLGlCQUFBdVQsQ0FBQSxJQUFBcUMsQ0FBQSxPQUFBcFAsQ0FBQSxHQUFBK00sQ0FBQSx5QkFBQXZULENBQUEsWUFBQTZWLENBQUEsQ0FBQTNyQixNQUFBLEtBQUFpc0IsQ0FBQSxHQUFBTixDQUFBLENBQUEzckIsTUFBQSxJQUFBN0gsTUFBQSxDQUFBOHpCLENBQUEsTUFBQUEsQ0FBQSwyQkFBQVAsQ0FBQSxRQUFBcFAsQ0FBQSxhQUFBbkYsQ0FBQTtBQUFBLFNBQUFpckIsZ0JBQUEvWSxDQUFBLFFBQUExd0IsS0FBQSxDQUFBMEIsT0FBQSxDQUFBZ3ZCLENBQUEsVUFBQUEsQ0FBQTtBQUFBLFNBQUE4aEIsUUFBQTV0QyxDQUFBLEVBQUE4ckIsQ0FBQSxRQUFBc0MsQ0FBQSxHQUFBeHpCLE1BQUEsQ0FBQVksSUFBQSxDQUFBd0UsQ0FBQSxPQUFBcEYsTUFBQSxDQUFBaXpDLHFCQUFBLFFBQUExZixDQUFBLEdBQUF2ekIsTUFBQSxDQUFBaXpDLHFCQUFBLENBQUE3dEMsQ0FBQSxHQUFBOHJCLENBQUEsS0FBQXFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBM3dCLE1BQUEsV0FBQXN1QixDQUFBLFdBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUE5dEMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQTdmLFVBQUEsT0FBQW1pQixDQUFBLENBQUF6eEIsSUFBQSxDQUFBNGMsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUE7QUFBQSxTQUFBc2IsY0FBQTFwQyxDQUFBLGFBQUE4ckIsQ0FBQSxNQUFBQSxDQUFBLEdBQUE3d0IsU0FBQSxDQUFBQyxNQUFBLEVBQUE0d0IsQ0FBQSxVQUFBc0MsQ0FBQSxXQUFBbnpCLFNBQUEsQ0FBQTZ3QixDQUFBLElBQUE3d0IsU0FBQSxDQUFBNndCLENBQUEsUUFBQUEsQ0FBQSxPQUFBOGhCLE9BQUEsQ0FBQWh6QyxNQUFBLENBQUF3ekIsQ0FBQSxPQUFBOXlCLE9BQUEsV0FBQXd3QixDQUFBLElBQUE0ZSxlQUFBLENBQUExcUMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXNDLENBQUEsQ0FBQXRDLENBQUEsU0FBQWx4QixNQUFBLENBQUFtekMseUJBQUEsR0FBQW56QyxNQUFBLENBQUFrUixnQkFBQSxDQUFBOUwsQ0FBQSxFQUFBcEYsTUFBQSxDQUFBbXpDLHlCQUFBLENBQUEzZixDQUFBLEtBQUF3ZixPQUFBLENBQUFoekMsTUFBQSxDQUFBd3pCLENBQUEsR0FBQTl5QixPQUFBLFdBQUF3d0IsQ0FBQSxJQUFBbHhCLE1BQUEsQ0FBQXdSLGNBQUEsQ0FBQXBNLENBQUEsRUFBQThyQixDQUFBLEVBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUExZixDQUFBLEVBQUF0QyxDQUFBLGlCQUFBOXJCLENBQUE7QUFBQSxTQUFBMHFDLGdCQUFBMXFDLENBQUEsRUFBQThyQixDQUFBLEVBQUFzQyxDQUFBLFlBQUF0QyxDQUFBLEdBQUFraUIsY0FBQSxDQUFBbGlCLENBQUEsTUFBQTlyQixDQUFBLEdBQUFwRixNQUFBLENBQUF3UixjQUFBLENBQUFwTSxDQUFBLEVBQUE4ckIsQ0FBQSxJQUFBbHZCLEtBQUEsRUFBQXd4QixDQUFBLEVBQUFuaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQW5NLENBQUEsQ0FBQThyQixDQUFBLElBQUFzQyxDQUFBLEVBQUFwdUIsQ0FBQTtBQUFBLFNBQUFndUMsZUFBQTVmLENBQUEsUUFBQXJ5QixDQUFBLEdBQUFreUMsWUFBQSxDQUFBN2YsQ0FBQSxnQ0FBQWgwQixPQUFBLENBQUEyQixDQUFBLElBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFreUMsYUFBQTdmLENBQUEsRUFBQXRDLENBQUEsb0JBQUExeEIsT0FBQSxDQUFBZzBCLENBQUEsTUFBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFwdUIsQ0FBQSxHQUFBb3VCLENBQUEsQ0FBQTl4QixNQUFBLENBQUE0eEMsV0FBQSxrQkFBQWx1QyxDQUFBLFFBQUFqRSxDQUFBLEdBQUFpRSxDQUFBLENBQUErSyxJQUFBLENBQUFxakIsQ0FBQSxFQUFBdEMsQ0FBQSxnQ0FBQTF4QixPQUFBLENBQUEyQixDQUFBLFVBQUFBLENBQUEsWUFBQWdCLFNBQUEseUVBQUErdUIsQ0FBQSxHQUFBbkgsTUFBQSxHQUFBOWpCLE1BQUEsRUFBQXV0QixDQUFBO0FBRHFJO0FBQ2hFO0FBQ3RCO0FBQ3lDO0FBQ1Q7QUFDN0M7QUFDZTtBQUNKO0FBQ0Q7QUFDVztBQUNSO0FBQ2I7QUFDMEI7QUFDWDtBQUNGO0FBQ0E7QUFDSDtBQUNyQyxJQUFNZ2hCLG1CQUFtQixHQUFHWiwwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQ2tCLFVBQVUsQ0FBQztBQUN2RSxJQUFNQyxxQkFBcUIsR0FBR2QsMERBQVksQ0FBQ0osNEVBQTJCLENBQUNtQixZQUFZLENBQUM7QUFDcEYsSUFBTUMsb0JBQW9CLEdBQUdoQiwwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQ3NCLFdBQVcsQ0FBQztBQUN6RSxJQUFNQyxxQkFBcUIsR0FBR2xCLDBEQUFZLENBQUNMLG1FQUFrQixDQUFDd0IsWUFBWSxDQUFDO0FBQzNFLElBQU1DLHVCQUF1QixHQUFHcEIsMERBQVksQ0FBQ0wsbUVBQWtCLENBQUMwQixjQUFjLENBQUM7QUFDL0UsSUFBTUMscUJBQXFCLEdBQUd0QiwwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQzRCLFlBQVksQ0FBQztBQUMzRSxJQUFNQyxrQkFBa0IsR0FBR3hCLDBEQUFZLENBQUNMLG1FQUFrQixDQUFDOEIsU0FBUyxDQUFDO0FBQ3JFLElBQU1DLG1CQUFtQixHQUFHMUIsMERBQVksQ0FBQ0wsbUVBQWtCLENBQUNnQyxVQUFVLENBQUM7QUFDdkUsSUFBTUMsdUJBQXVCLEdBQUc1QiwwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQ2tDLGNBQWMsQ0FBQztBQUMvRSxJQUFNQyxzQkFBc0IsR0FBRzlCLDBEQUFZLENBQUNMLG1FQUFrQixDQUFDb0MsYUFBYSxDQUFDO0FBQzdFLElBQU1DLHdCQUF3QixHQUFHaEMsMERBQVksQ0FBQ0wsbUVBQWtCLENBQUNzQyxlQUFlLENBQUM7QUFDakYsSUFBTUMsMEJBQTBCLEdBQUdsQywwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQ3dDLGlCQUFpQixDQUFDO0FBQ3JGLElBQU1DLHdCQUF3QixHQUFHcEMsMERBQVksQ0FBQ0wsbUVBQWtCLENBQUMwQyxlQUFlLENBQUM7QUFDakYsSUFBTUMscUJBQXFCLEdBQUd0QywwREFBWSxDQUFDTCxtRUFBa0IsQ0FBQzRDLFlBQVksQ0FBQztBQUMzRSxJQUFNQyxzQkFBc0IsR0FBR3hDLDBEQUFZLENBQUNMLG1FQUFrQixDQUFDOEMsYUFBYSxDQUFDO0FBQzdFLElBQU1DLGtCQUFrQixHQUFHMUMsMERBQVksQ0FBQ0osNEVBQTJCLENBQUMrQyxTQUFTLENBQUM7QUFDckYsSUFBTUMsbUJBQW1CLEdBQUc1QywwREFBWSxDQUFDLHVCQUF1QixDQUFDO0FBQ2pFLElBQU02QyxjQUFjLEdBQUc3QywwREFBWSxDQUFDLGtCQUFrQixDQUFDO0FBQ3ZELElBQU04QyxpQkFBaUIsR0FBRzlDLDBEQUFZLENBQUMscUJBQXFCLENBQUM7QUFDN0QsSUFBTStDLHNCQUFzQixHQUFHL0MsMERBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUNwRSxTQUFTZ0QsZ0JBQWdCQSxDQUFDQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtFQUM5RCxJQUFJQyxHQUFHLEdBQUcsRUFBRTtFQUNaLElBQUl6RCw0REFBYSxDQUFDc0QsSUFBSSxDQUFDLEVBQUU7SUFDckIsT0FBTyxDQUFDRCxPQUFPLEVBQUVJLEdBQUcsQ0FBQztFQUN6QjtFQUNBLElBQUlKLE9BQU8sQ0FBQ3gyQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ3RCLElBQUksQ0FBQ3cyQyxPQUFPLENBQUN4MkMsTUFBTSxFQUFFO01BQ2pCLElBQUl5MkMsSUFBSSxDQUFDSSxjQUFjLEVBQUU7UUFDckJMLE9BQU8sR0FBRyxDQUFBaEksYUFBQSxDQUFBQSxhQUFBLEtBQU1pSSxJQUFJO1VBQUUvMEMsS0FBSyxFQUFFO1FBQUksR0FBRztRQUNwQ2sxQyxHQUFHLEdBQUcsRUFBRTtNQUNaLENBQUMsTUFDSTtRQUNELElBQU1FLEtBQUssR0FBRyxPQUFPTCxJQUFJLENBQUNyMEMsRUFBRSxLQUFLLFFBQVE7UUFDekN3MEMsR0FBRyxHQUNDLHVDQUF1QyxHQUNuQ0QsT0FBTyxHQUNQLGlEQUFpRCxJQUNoREcsS0FBSyxHQUNBLEdBQUcsR0FBR0wsSUFBSSxDQUFDcjBDLEVBQUUsR0FBRyxHQUFHLEdBQ25CKzNCLElBQUksQ0FBQ0MsU0FBUyxDQUFDcWMsSUFBSSxDQUFDcjBDLEVBQUUsQ0FBQyxJQUNwQnMwQyxPQUFPLEdBQUcscUJBQXFCLEdBQUdBLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUN6RCx3QkFBd0IsR0FDeEJELElBQUksQ0FBQ00sUUFBUSxJQUNaRCxLQUFLLEdBQ0EsZ0RBQWdELEdBQzlDeDJDLGtEQUFJLENBQUNpMkMsS0FBSyxDQUFDUyxJQUFJLENBQUMsQ0FBQ254QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQzNCLEdBQUcsR0FDTCwyREFBMkQsQ0FBQztNQUM5RTtJQUNKLENBQUMsTUFDSTtNQUNEK3dCLEdBQUcsR0FDQyxzQ0FBc0MsR0FDbENELE9BQU8sR0FDUCw0REFBNEQsR0FDNUR4YyxJQUFJLENBQUNDLFNBQVMsQ0FBQ3FjLElBQUksQ0FBQ3IwQyxFQUFFLENBQUMsSUFDdEJzMEMsT0FBTyxHQUFHLHFCQUFxQixHQUFHQSxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQ2hELHdCQUF3QixHQUN4QkQsSUFBSSxDQUFDTSxRQUFRLEdBQ2IsK0JBQStCLEdBQy9CNWMsSUFBSSxDQUFDQyxTQUFTLENBQUN4eUIsa0RBQUcsQ0FBQzZwQixrREFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUra0IsT0FBTyxDQUFDLENBQUM7SUFDbEU7RUFDSjtFQUNBLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxTQUFTSyxRQUFRQSxDQUFDVixLQUFLLEVBQUV4ckMsTUFBTSxFQUFFbXNDLEVBQUUsRUFBRUMsS0FBSyxFQUFFUixPQUFPLEVBQTJCO0VBQUEsSUFBekJTLGVBQWUsR0FBQXIzQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLEtBQUs7RUFDeEUsSUFBTXF2QixNQUFNLEdBQUd1bkIsT0FBTyxLQUFLLE9BQU8sR0FBR08sRUFBRSxDQUFDRyxTQUFTLEdBQUdILEVBQUUsQ0FBQzFlLFFBQVE7RUFDL0QsSUFBTThlLE1BQU0sR0FBRyxFQUFFO0VBQ2pCLElBQUlDLGdCQUFnQixHQUFHLENBQUM7RUFDeEIsSUFBTUMsU0FBUyxHQUFHcG9CLE1BQU0sQ0FBQ21uQixLQUFLLENBQUMsQ0FBQzN1QyxHQUFHLENBQUMsVUFBQzZ2QyxTQUFTLEVBQUU1MkMsQ0FBQyxFQUFLO0lBQ2xELElBQUE2MkMsaUJBQUEsR0FBNkJwQixnQkFBZ0IsQ0FBQ0MsS0FBSyxFQUFFa0IsU0FBUyxDQUFDN3ZDLEdBQUcsQ0FBQyxVQUFBcEIsSUFBQTtRQUFBLElBQUdwRSxFQUFFLEdBQUFvRSxJQUFBLENBQUZwRSxFQUFFO1VBQUUyMEMsUUFBUSxHQUFBdndDLElBQUEsQ0FBUnV3QyxRQUFRO1VBQVFZLEtBQUssR0FBQW54QyxJQUFBLENBQVhrUixJQUFJO1FBQUEsT0FBZTtVQUNuR3RWLEVBQUU7VUFDRjIwQyxRQUFRO1VBQ1JyMUMsS0FBSyxFQUFFZ1csa0RBQUksSUFBQXNILE1BQUEsQ0FBQXliLGtCQUFBLENBQUtrZCxLQUFLLElBQUUsT0FBTyxFQUFFWixRQUFRLElBQUdoc0MsTUFBTTtRQUNyRCxDQUFDO01BQUEsQ0FBQyxDQUFDLEVBQUVvc0MsS0FBSyxDQUFDdDJDLENBQUMsQ0FBQyxFQUFFcTJDLEVBQUUsQ0FBQ1IsT0FBTyxFQUFFQyxPQUFPLENBQUM7TUFBQWlCLGtCQUFBLEdBQUFsM0MsY0FBQSxDQUFBZzNDLGlCQUFBO01BSjVCbHFCLE1BQU0sR0FBQW9xQixrQkFBQTtNQUFFQyxVQUFVLEdBQUFELGtCQUFBO0lBS3pCLElBQUl6RSw0REFBYSxDQUFDZ0UsS0FBSyxDQUFDdDJDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzJzQixNQUFNLENBQUN4dEIsTUFBTSxFQUFFO01BQzNDdTNDLGdCQUFnQixFQUFFO0lBQ3RCO0lBQ0EsSUFBSU0sVUFBVSxFQUFFO01BQ1pQLE1BQU0sQ0FBQzcxQyxJQUFJLENBQUNvMkMsVUFBVSxDQUFDO0lBQzNCO0lBQ0EsT0FBT3JxQixNQUFNO0VBQ2pCLENBQUMsQ0FBQztFQUNGLElBQUk4cEIsTUFBTSxDQUFDdDNDLE1BQU0sRUFBRTtJQUNmLElBQUlvM0MsZUFBZSxJQUNmRSxNQUFNLENBQUN0M0MsTUFBTSxHQUFHdTNDLGdCQUFnQixLQUFLQyxTQUFTLENBQUN4M0MsTUFBTSxFQUFFO01BQ3ZEO01BQ0E7TUFDQTtNQUNBO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTgzQyxNQUFNLENBQUNSLE1BQU0sRUFBRWYsS0FBSyxDQUFDO0VBQ3pCO0VBQ0EsT0FBT2lCLFNBQVM7QUFDcEI7QUFDQSxTQUFTTSxNQUFNQSxDQUFDUixNQUFNLEVBQUVmLEtBQUssRUFBRTtFQUMzQixJQUFNNTBDLEdBQUcsR0FBRzIxQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUkzMUMsR0FBRyxDQUFDc2hCLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtJQUNwQztJQUNBO0lBQ0E7SUFDQWhOLE9BQU8sQ0FBQ3lsQixLQUFLLENBQUM2YSxLQUFLLENBQUN3QixJQUFJLENBQUM7RUFDN0I7RUFDQSxNQUFNLElBQUlDLGNBQWMsQ0FBQ3IyQyxHQUFHLENBQUM7QUFDakM7QUFDQSxJQUFNczJDLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFJcnJCLEtBQUs7RUFBQSxPQUFLMXNCLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQ2dyQixLQUFLLENBQUMsR0FBR3hOLGtEQUFLLENBQUMsT0FBTyxFQUFFd04sS0FBSyxDQUFDLEdBQUdBLEtBQUssQ0FBQ2xyQixLQUFLO0FBQUE7QUFDckYsSUFBTXcyQyxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSXg1QixDQUFDLEVBQUVDLENBQUM7RUFBQSxPQUFLemUsS0FBSyxDQUFDMEIsT0FBTyxDQUFDOGMsQ0FBQyxDQUFDLEdBQUdvVSxrREFBRyxDQUFDcFUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUNELENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUM7QUFBQTtBQUNwRSxTQUFTdzVCLGVBQWVBLENBQUNwQixRQUFRLEVBQUU7RUFDL0IsT0FBT0EsUUFBUSxDQUFDL2tCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakM7QUFBQyxTQUNjb21CLGdCQUFnQkEsQ0FBQS9GLEVBQUEsRUFBQUMsR0FBQSxFQUFBK0YsR0FBQSxFQUFBQyxHQUFBO0VBQUEsT0FBQUMsaUJBQUEsQ0FBQWw2QixLQUFBLE9BQUF0ZSxTQUFBO0FBQUE7QUFBQSxTQUFBdzRDLGtCQUFBO0VBQUFBLGlCQUFBLEdBQUEvTyxpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQS9CLFNBQUFtakIsU0FBZ0N6YSxRQUFRLEVBQUUwYSxtQkFBbUIsRUFBRXBOLE1BQU0sRUFBRTBHLE9BQU87SUFBQSxJQUFBMkcsRUFBQSxFQUFBbHJCLE1BQUEsRUFBQW1yQixPQUFBLEVBQUFwWSxLQUFBLEVBQUFxWSxXQUFBLEVBQUFDLFNBQUEsRUFBQUMsU0FBQSxFQUFBemxDLE1BQUEsRUFBQWs1QixNQUFBLEVBQUF3TSxhQUFBLEVBQUFDLFlBQUEsRUFBQUMsU0FBQSxFQUFBQyxhQUFBLEVBQUF6NUIsSUFBQSxFQUFBMDVCLFdBQUEsRUFBQUMsU0FBQSxFQUFBQyxTQUFBLEVBQUFDLEdBQUE7SUFBQSxPQUFBclEsWUFBQSxHQUFBaGlDLENBQUEsV0FBQXN5QyxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQTExQixDQUFBO1FBQUE7VUFDcEU2MEIsRUFBRSxHQUFJOWhCLE1BQU0sQ0FBQzRpQixlQUFlLEdBQzlCNWlCLE1BQU0sQ0FBQzRpQixlQUFlLElBQUksQ0FBQyxDQUFDO1VBQ2hDLElBQUksQ0FBQ2QsRUFBRSxDQUFDZSxTQUFTLEVBQUU7WUFDZi81QyxNQUFNLENBQUN3UixjQUFjLENBQUN3bkMsRUFBRSxFQUFFLFdBQVcsRUFBRTtjQUNuQ2gzQyxLQUFLLEVBQUU7Z0JBQUVnNEMsV0FBVyxFQUFFO2NBQXdDLENBQUM7Y0FDL0R6b0MsUUFBUSxFQUFFO1lBQ2QsQ0FBQyxDQUFDO1lBQ0Z2UixNQUFNLENBQUN3UixjQUFjLENBQUN3bkMsRUFBRSxFQUFFLGVBQWUsRUFBRTtjQUN2Q2gzQyxLQUFLLEVBQUU7Z0JBQUVnNEMsV0FBVyxFQUFFO2NBQXlDLENBQUM7Y0FDaEV6b0MsUUFBUSxFQUFFO1lBQ2QsQ0FBQyxDQUFDO1VBQ047VUFDUXVjLE1BQU0sR0FBcUJ1a0IsT0FBTyxDQUFsQ3ZrQixNQUFNLEVBQUVtckIsT0FBTyxHQUFZNUcsT0FBTyxDQUExQjRHLE9BQU8sRUFBRXBZLEtBQUssR0FBS3dSLE9BQU8sQ0FBakJ4UixLQUFLO1VBQ3hCcVksV0FBVyxHQUFHcnpCLElBQUksQ0FBQ28wQixHQUFHLENBQUMsQ0FBQztVQUN4QmQsU0FBUyxHQUFHZSxZQUFZLENBQUNwc0IsTUFBTSxDQUFDO1VBQ2hDc3JCLFNBQVMsR0FBR2MsWUFBWSxDQUFDclosS0FBSyxDQUFDO1VBQy9CbHRCLE1BQU0sR0FBRyxDQUFDLENBQUM7VUFDYms1QixNQUFNLEdBQUd4Qix3REFBTSxDQUFDeUIsRUFBRTtVQUFBK00sU0FBQSxDQUFBNzRCLENBQUE7VUFFVnU0QixTQUFTLEdBQW9CUixtQkFBbUIsQ0FBaERRLFNBQVMsRUFBRUMsYUFBYSxHQUFLVCxtQkFBbUIsQ0FBckNTLGFBQWE7VUFDNUJ6NUIsSUFBSSxHQUFHK04sTUFBTSxDQUFDNWxCLEdBQUcsQ0FBQ3F3QyxPQUFPLENBQUM7VUFDOUIsSUFBSTFYLEtBQUssRUFBRTtZQUNQOWdCLElBQUksR0FBR1Qsa0RBQU0sQ0FBQ1MsSUFBSSxFQUFFOGdCLEtBQUssQ0FBQzM0QixHQUFHLENBQUNxd0MsT0FBTyxDQUFDLENBQUM7VUFDM0M7VUFDQTtVQUNBUyxFQUFFLENBQUNtQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7VUFDeEJuQixFQUFFLENBQUNtQixnQkFBZ0IsQ0FBQzNKLFNBQVMsR0FBRzZCLE9BQU8sQ0FBQytILGNBQWMsQ0FBQ2x5QyxHQUFHLENBQUMsVUFBQW15QyxPQUFPO1lBQUEsT0FBSztjQUNuRUEsT0FBTyxFQUFFQSxPQUFPO2NBQ2hCcjRDLEtBQUssRUFBRW0zQyxTQUFTLENBQUNrQixPQUFPO1lBQzVCLENBQUM7VUFBQSxDQUFDLENBQUM7VUFDSHJCLEVBQUUsQ0FBQ21CLGdCQUFnQixDQUFDRyxZQUFZLEdBQUdDLGNBQWMsQ0FBQ2xJLE9BQU8sQ0FBQytILGNBQWMsQ0FBQztVQUN6RXBCLEVBQUUsQ0FBQ21CLGdCQUFnQixDQUFDSyxXQUFXLEdBQUcxc0IsTUFBTTtVQUN4Q2tyQixFQUFFLENBQUNtQixnQkFBZ0IsQ0FBQ3JzQixNQUFNLEdBQUdxckIsU0FBUztVQUN0Q0gsRUFBRSxDQUFDbUIsZ0JBQWdCLENBQUNNLFdBQVcsR0FBRzVaLEtBQUs7VUFDdkNtWSxFQUFFLENBQUNtQixnQkFBZ0IsQ0FBQ08sTUFBTSxHQUFHdEIsU0FBUztVQUN0Q0osRUFBRSxDQUFDbUIsZ0JBQWdCLENBQUNRLFlBQVksR0FBRzFCLE9BQU87VUFDdENRLFdBQVcsR0FBRyxDQUFBSixhQUFBLEdBQUFMLEVBQUUsQ0FBQ08sU0FBUyxDQUFDLEVBQUNDLGFBQWEsQ0FBQyxDQUFBNzZCLEtBQUEsQ0FBQTA2QixhQUFBLEVBQUF0ZSxrQkFBQSxDQUFJaGIsSUFBSSxFQUFDO1VBQ3ZELE9BQU9pNUIsRUFBRSxDQUFDbUIsZ0JBQWdCO1VBQUMsTUFDdkIsU0FBQWIsWUFBQSxHQUFPRyxXQUFXLGNBQUFILFlBQUEsdUJBQVhBLFlBQUEsQ0FBYXpQLElBQUksTUFBSyxVQUFVO1lBQUFnUSxTQUFBLENBQUExMUIsQ0FBQTtZQUFBO1VBQUE7VUFBQTAxQixTQUFBLENBQUExMUIsQ0FBQTtVQUFBLE9BQ25CczFCLFdBQVc7UUFBQTtVQUEvQkEsV0FBVyxHQUFBSSxTQUFBLENBQUF6NUIsQ0FBQTtRQUFBO1VBRWYsSUFBSTY0QixPQUFPLEVBQUU7WUFDVFQsVUFBVSxDQUFDUyxPQUFPLEVBQUVRLFdBQVcsQ0FBQyxDQUFDLzRDLE9BQU8sQ0FBQyxVQUFBazZDLE1BQUEsRUFBa0I7Y0FBQSxJQUFBQyxNQUFBLEdBQUE3NUMsY0FBQSxDQUFBNDVDLE1BQUE7Z0JBQWhCRSxJQUFJLEdBQUFELE1BQUE7Z0JBQUVFLElBQUksR0FBQUYsTUFBQTtjQUNqRHJDLFVBQVUsQ0FBQ3NDLElBQUksRUFBRUMsSUFBSSxDQUFDLENBQUNyNkMsT0FBTyxDQUFDLFVBQUFzNkMsTUFBQSxFQUFvQjtnQkFBQSxJQUFBQyxNQUFBLEdBQUFqNkMsY0FBQSxDQUFBZzZDLE1BQUE7a0JBQWxCRSxLQUFLLEdBQUFELE1BQUE7a0JBQUVFLEtBQUssR0FBQUYsTUFBQTtnQkFDekMsSUFBUXY0QyxFQUFFLEdBQWV3NEMsS0FBSyxDQUF0Qng0QyxFQUFFO2tCQUFFMjBDLFFBQVEsR0FBSzZELEtBQUssQ0FBbEI3RCxRQUFRO2dCQUNwQixJQUFNK0QsS0FBSyxHQUFHMUgsMERBQVcsQ0FBQ2h4QyxFQUFFLENBQUM7Z0JBQzdCLElBQU0yNEMsU0FBUyxHQUFJMW5DLE1BQU0sQ0FBQ3luQyxLQUFLLENBQUMsR0FBR3puQyxNQUFNLENBQUN5bkMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFFO2dCQUN2RCxJQUFJRCxLQUFLLEtBQUtuQyxFQUFFLENBQUNlLFNBQVMsRUFBRTtrQkFDeEJzQixTQUFTLENBQUM1QyxlQUFlLENBQUNwQixRQUFRLENBQUMsQ0FBQyxHQUFHOEQsS0FBSztnQkFDaEQ7Y0FDSixDQUFDLENBQUM7WUFDTixDQUFDLENBQUM7VUFDTjtVQUFDdEIsU0FBQSxDQUFBMTFCLENBQUE7VUFBQTtRQUFBO1VBQUEwMUIsU0FBQSxDQUFBNzRCLENBQUE7VUFBQTQ0QixHQUFBLEdBQUFDLFNBQUEsQ0FBQXo1QixDQUFBO1VBQUEsTUFHR3c1QixHQUFBLEtBQU1aLEVBQUUsQ0FBQ3NDLGFBQWE7WUFBQXpCLFNBQUEsQ0FBQTExQixDQUFBO1lBQUE7VUFBQTtVQUN0QjBvQixNQUFNLEdBQUd4Qix3REFBTSxDQUFDa1EsY0FBYztVQUFDMUIsU0FBQSxDQUFBMTFCLENBQUE7VUFBQTtRQUFBO1VBRy9CMG9CLE1BQU0sR0FBR3hCLHdEQUFNLENBQUNtUSxnQkFBZ0I7VUFBQyxNQUFBNUIsR0FBQTtRQUFBO1VBQUFDLFNBQUEsQ0FBQTc0QixDQUFBO1VBS3JDLE9BQU9nNEIsRUFBRSxDQUFDbUIsZ0JBQWdCO1VBQzFCO1VBQ01ULFNBQVMsR0FBRzd6QixJQUFJLENBQUNvMEIsR0FBRyxDQUFDLENBQUMsR0FBR2YsV0FBVztVQUNwQ1MsU0FBUyxHQUFHO1lBQ2Q4QixhQUFhLEVBQUUvQixTQUFTO1lBQ3hCZ0MsYUFBYSxFQUFFaEMsU0FBUztZQUN4QmlDLGFBQWEsRUFBRSxDQUFDO1lBQ2hCQyxlQUFlLEVBQUU7VUFDckIsQ0FBQztVQUNELElBQUlqUSxNQUFNLENBQUNvQixFQUFFLEVBQUU7WUFDWDFPLFFBQVEsQ0FBQ21ZLG1CQUFtQixDQUFDO2NBQ3pCOXpDLEVBQUUsRUFBRTJ2QyxPQUFPLENBQUN6bkIsTUFBTTtjQUNsQml4QixLQUFLLEVBQUVsQyxTQUFTO2NBQ2hCOU0sTUFBTTtjQUNObDVCLE1BQU07Y0FDTm1hLE1BQU07Y0FDTitTO1lBQ0osQ0FBQyxDQUFDLENBQUM7VUFDUDtVQUFDLE9BQUFnWixTQUFBLENBQUFsOEIsQ0FBQTtRQUFBO1VBQUEsT0FBQWs4QixTQUFBLENBQUE3NkIsQ0FBQSxJQUVFckwsTUFBTTtNQUFBO0lBQUEsR0FBQW1sQyxRQUFBO0VBQUEsQ0FDaEI7RUFBQSxPQUFBRCxpQkFBQSxDQUFBbDZCLEtBQUEsT0FBQXRlLFNBQUE7QUFBQTtBQUNELFNBQVN5N0MsZUFBZUEsQ0FBQ0MsWUFBWSxFQUFFNXFDLEtBQUssRUFBRXFtQyxFQUFFLEVBQUU7RUFDOUMsT0FBTyxVQUFVblosUUFBUSxFQUFFdkYsUUFBUSxFQUFFO0lBQ2pDLElBQUF5WSxTQUFBLEdBQTBCelksUUFBUSxDQUFDLENBQUM7TUFBNUIrZCxLQUFLLEdBQUF0RixTQUFBLENBQUxzRixLQUFLO01BQUVsTCxNQUFNLEdBQUE0RixTQUFBLENBQU41RixNQUFNO0lBQ3JCLElBQU13QixhQUFhLEdBQUc4RywrQ0FBTyxDQUFDNEMsS0FBSyxFQUFFa0YsWUFBWSxDQUFDO0lBQ2xELElBQUksQ0FBQzVPLGFBQWEsRUFBRTtNQUNoQixJQUFJLENBQUN4QixNQUFNLENBQUNxUSw0QkFBNEIsRUFBRTtRQUN0Q3ZSLGdEQUFhLENBQUNwTSxRQUFRLENBQUMsQ0FBQywwQ0FBMEMsRUFBRSxDQUNoRSwyREFBMkQscUJBQUEvZSxNQUFBLENBQ3pDbzBCLDBEQUFXLENBQUNxSSxZQUFZLENBQUMsU0FDM0Msb0RBQW9ELEtBQUF6OEIsTUFBQSxDQUNqRGs0QixFQUFFLENBQUM1c0IsTUFBTSxHQUNaLDRDQUE0QyxFQUM1QyxzQ0FBc0MsQ0FDekMsQ0FBQztNQUNOO01BQ0E7TUFDQTtNQUNBO01BQ0E7SUFDSjtJQUNBeVQsUUFBUSxDQUFDeVYsOENBQVcsQ0FBQztNQUNqQjNpQyxLQUFLO01BQ0w4cUMsUUFBUSxFQUFFOU8sYUFBYTtNQUN2QitPLFVBQVUsRUFBRTtJQUNoQixDQUFDLENBQUMsQ0FBQztJQUNIN2QsUUFBUSxDQUFDd1Ysa0RBQWUsQ0FBQztNQUFFbnhDLEVBQUUsRUFBRXE1QyxZQUFZO01BQUU1cUM7SUFBTSxDQUFDLENBQUMsQ0FBQztFQUMxRCxDQUFDO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNnckMsVUFBVUEsQ0FBQ2xELE9BQU8sRUFBRXpCLEVBQUUsRUFBRTtFQUM3QixPQUFPLFVBQVVuWixRQUFRLEVBQUV2RixRQUFRLEVBQUU7SUFDakNsRyxrREFBTyxDQUFDcW1CLE9BQU8sQ0FBQyxDQUNYdDVCLE1BQU0sQ0FBQyxVQUFDakMsR0FBRyxFQUFBM1csS0FBQSxFQUFlNUYsQ0FBQyxFQUFLO01BQUEsSUFBQWk3QyxLQUFBLEdBQUFwN0MsY0FBQSxDQUFBK0YsS0FBQTtRQUFsQnJFLEVBQUUsR0FBQTA1QyxLQUFBO1FBQUVwNkMsS0FBSyxHQUFBbzZDLEtBQUE7TUFDeEIsSUFBSUMsV0FBVyxHQUFHMzVDLEVBQUU7UUFBRTQ1QyxRQUFRO1FBQUVDLFdBQVcsR0FBRyxFQUFFO01BQ2hELElBQUk3NUMsRUFBRSxDQUFDZ3dCLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFBLElBQUE4cEIsV0FBQSxHQUNNcEksNkRBQVUsQ0FBQzF4QyxFQUFFLENBQUM7UUFBQSxJQUFBKzVDLFlBQUEsR0FBQXo3QyxjQUFBLENBQUF3N0MsV0FBQTtRQUF2Q0gsV0FBVyxHQUFBSSxZQUFBO1FBQUVILFFBQVEsR0FBQUcsWUFBQTtRQUN0QkYsV0FBVyxHQUFHbEksNkRBQVUsQ0FBQ2dJLFdBQVcsRUFBRTdFLEVBQUUsRUFBRXIyQyxDQUFDLEVBQUUyM0IsUUFBUSxDQUFDO01BQzFELENBQUMsTUFDSSxJQUFJcDJCLEVBQUUsQ0FBQzJnQixRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFBQSxJQUFBcTVCLFNBQUEsR0FDR2g2QyxFQUFFLENBQUM0dkIsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUFBLElBQUFxcUIsVUFBQSxHQUFBMzdDLGNBQUEsQ0FBQTA3QyxTQUFBO1FBQXRDTCxXQUFXLEdBQUFNLFVBQUE7UUFBRUwsUUFBUSxHQUFBSyxVQUFBO01BQzFCO01BQ0EsSUFBTXhyQyxLQUFLLEdBQUdtckMsUUFBUSxHQUFHO1FBQUUsQ0FBQ0EsUUFBUSxHQUFHdDZDO01BQU0sQ0FBQyxHQUFHQSxLQUFLO01BQ3RELElBQUl1NkMsV0FBVyxDQUFDajhDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDMUJvZCxHQUFHLENBQUMzYixJQUFJLENBQUMsQ0FBQ3M2QyxXQUFXLEVBQUVsckMsS0FBSyxDQUFDLENBQUM7TUFDbEMsQ0FBQyxNQUNJLElBQUlvckMsV0FBVyxDQUFDajhDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0JvZCxHQUFHLENBQUMzYixJQUFJLENBQUMsQ0FBQ3c2QyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUVwckMsS0FBSyxDQUFDLENBQUM7TUFDckMsQ0FBQyxNQUNJO1FBQ0RvckMsV0FBVyxDQUFDNzdDLE9BQU8sQ0FBQyxVQUFDazhDLEdBQUcsRUFBSztVQUN6QmwvQixHQUFHLENBQUMzYixJQUFJLENBQUMsQ0FBQzY2QyxHQUFHLEVBQUV6ckMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDO01BQ047TUFDQSxPQUFPdU0sR0FBRztJQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDRGhkLE9BQU8sQ0FBQyxVQUFBbThDLEtBQUEsRUFBbUI7TUFBQSxJQUFBQyxLQUFBLEdBQUE5N0MsY0FBQSxDQUFBNjdDLEtBQUE7UUFBakJuNkMsRUFBRSxHQUFBbzZDLEtBQUE7UUFBRWhHLE9BQU8sR0FBQWdHLEtBQUE7TUFDdEJ6ZSxRQUFRLENBQUN5ZCxlQUFlLENBQUNwNUMsRUFBRSxFQUFFbzBDLE9BQU8sRUFBRVUsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0VBQ04sQ0FBQztBQUNMO0FBQ0EsU0FBU3VGLGdCQUFnQkEsQ0FBQzFlLFFBQVEsRUFBRWdQLEtBQUssRUFBRTFCLE1BQU0sRUFBRTBHLE9BQU8sRUFBRTJLLFVBQVUsRUFBRUMsY0FBYyxFQUFFbmtCLFFBQVEsRUFBRW9rQixPQUFPLEVBQUU7RUFDdkcsSUFBSTdQLEtBQUssQ0FBQ3FCLFdBQVcsRUFBRTtJQUNuQnJCLEtBQUssQ0FBQ3FCLFdBQVcsQ0FBQzJELE9BQU8sQ0FBQztFQUM5QjtFQUNBLElBQU02RyxXQUFXLEdBQUdyekIsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLElBQU03SSxJQUFJLEdBQUczVyxJQUFJLENBQUNDLFNBQVMsQ0FBQzJYLE9BQU8sQ0FBQztFQUNwQyxJQUFJOEssUUFBUTtFQUNaLElBQUlDLEdBQUc7RUFDUCxJQUFJQyxVQUFVO0VBQ2QsSUFBSUMsZUFBZTtFQUNuQixJQUFJQyxRQUFRLEdBQUdOLGNBQWM7RUFDN0IsSUFBSUMsT0FBTyxFQUFFO0lBQ1Q3ZSxRQUFRLENBQUM4ZCxVQUFVLENBQUNlLE9BQU8sQ0FBQ0EsT0FBTyxFQUFFN0ssT0FBTyxDQUFDLENBQUM7SUFDOUNnTCxVQUFVLEdBQUdILE9BQU8sQ0FBQ0csVUFBVTtFQUNuQztFQUNBLElBQU1HLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBQSxFQUFTO0lBQ3hCLElBQU10TyxPQUFPLEdBQUd1QixnREFBYSxDQUFDLENBQUM7SUFDL0IsSUFBSWdCLEdBQUcsTUFBQW55QixNQUFBLENBQU1zeEIsK0NBQU8sQ0FBQ2pGLE1BQU0sQ0FBQywyQkFBd0I7SUFDcEQsSUFBSThSLE9BQU8sR0FBR3JNLElBQUk7SUFDbEIsSUFBTXNNLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJbjBCLElBQUksRUFBRXZuQixLQUFLLEVBQUs7TUFDNUIsSUFBSTI3QyxLQUFLLEdBQUcsR0FBRztNQUNmLElBQUlsTSxHQUFHLENBQUNwdUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ25CczZCLEtBQUssR0FBRyxHQUFHO01BQ2Y7TUFDQWxNLEdBQUcsTUFBQW55QixNQUFBLENBQU1teUIsR0FBRyxFQUFBbnlCLE1BQUEsQ0FBR3ErQixLQUFLLEVBQUFyK0IsTUFBQSxDQUFHaUssSUFBSSxPQUFBakssTUFBQSxDQUFJdGQsS0FBSyxDQUFFO0lBQzFDLENBQUM7SUFDRCxJQUFJbTdDLFFBQVEsSUFBSUMsR0FBRyxFQUFFO01BQ2pCLElBQUlELFFBQVEsRUFDUk8sTUFBTSxDQUFDLFVBQVUsRUFBRVAsUUFBUSxDQUFDO01BQ2hDLElBQUlDLEdBQUcsRUFDSE0sTUFBTSxDQUFDLEtBQUssRUFBRU4sR0FBRyxDQUFDO01BQ3RCO01BQ0EsSUFBTVEsT0FBTyxHQUFHbmpCLElBQUksQ0FBQ29qQixLQUFLLENBQUNKLE9BQU8sQ0FBQztNQUNuQyxLQUFLLElBQUl0OEMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeThDLE9BQU8sQ0FBQzl2QixNQUFNLENBQUN4dEIsTUFBTSxFQUFFYSxDQUFDLEVBQUUsRUFBRTtRQUM1Q3k4QyxPQUFPLENBQUM5dkIsTUFBTSxDQUFDM3NCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUk7TUFDckM7TUFDQSxLQUFLLElBQUlBLEVBQUMsR0FBRyxDQUFDLEVBQUVBLEVBQUMsR0FBRyxDQUFDLENBQUF5OEMsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUvYyxLQUFLLEtBQUksRUFBRSxFQUFFdmdDLE1BQU0sRUFBRWEsRUFBQyxFQUFFLEVBQUU7UUFDcER5OEMsT0FBTyxDQUFDL2MsS0FBSyxDQUFDMS9CLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUk7TUFDcEM7TUFDQXM4QyxPQUFPLEdBQUdoakIsSUFBSSxDQUFDQyxTQUFTLENBQUNrakIsT0FBTyxDQUFDO0lBQ3JDO0lBQ0EsSUFBSUwsUUFBUSxFQUFFO01BQ1ZBLFFBQVEsQ0FBQzc4QyxPQUFPLENBQUMsVUFBQW85QyxLQUFBO1FBQUEsSUFBQUMsS0FBQSxHQUFBLzhDLGNBQUEsQ0FBQTg4QyxLQUFBO1VBQUU5MkMsR0FBRyxHQUFBKzJDLEtBQUE7VUFBRS83QyxLQUFLLEdBQUErN0MsS0FBQTtRQUFBLE9BQU1MLE1BQU0sQ0FBQzEyQyxHQUFHLEVBQUVoRixLQUFLLENBQUM7TUFBQSxFQUFDO01BQ3REdTdDLFFBQVEsR0FBR0EsUUFBUSxDQUFDMzZDLE1BQU0sQ0FBQyxVQUFBbzdDLEtBQUE7UUFBQSxJQUFBQyxLQUFBLEdBQUFqOUMsY0FBQSxDQUFBZzlDLEtBQUE7VUFBRWorQyxDQUFDLEdBQUFrK0MsS0FBQTtVQUFFQyxFQUFFLEdBQUFELEtBQUE7VUFBRUUsTUFBTSxHQUFBRixLQUFBO1FBQUEsT0FBTSxDQUFDRSxNQUFNO01BQUEsRUFBQztJQUM1RDtJQUNBLE9BQU9uUCxLQUFLLENBQUN5QyxHQUFHLEVBQUUvZ0Isa0RBQWMsQ0FBQ2liLE1BQU0sQ0FBQ3FELEtBQUssRUFBRTtNQUMzQ25nQixNQUFNLEVBQUUsTUFBTTtNQUNkcWdCLE9BQU87TUFDUGtDLElBQUksRUFBRXFNO0lBQ1YsQ0FBQyxDQUFDLENBQUM7RUFDUCxDQUFDO0VBQ0QsT0FBTyxJQUFJOVQsT0FBTyxDQUFDLFVBQUNDLE9BQU8sRUFBRTFkLE1BQU0sRUFBSztJQUNwQyxJQUFNa3lCLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFJek0sR0FBRyxFQUFLO01BQzFCLElBQVE5RSxNQUFNLEdBQUs4RSxHQUFHLENBQWQ5RSxNQUFNO01BQ2QsSUFBSXVRLEdBQUcsRUFBRTtRQUNMLElBQU1pQixXQUFXLEdBQUd2bEIsUUFBUSxDQUFDLENBQUMsQ0FBQ3dsQixZQUFZLENBQUNsQixHQUFHLENBQUM7UUFDaEQsSUFBSWlCLFdBQVcsYUFBWEEsV0FBVyxlQUFYQSxXQUFXLENBQUVFLFFBQVEsRUFBRTtVQUN2QmxnQixRQUFRLENBQUNxWSxpQkFBaUIsQ0FBQztZQUFFOEgsS0FBSyxFQUFFcEI7VUFBSSxDQUFDLENBQUMsQ0FBQztVQUMzQyxPQUFPeFQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCO01BQ0o7TUFDQSxTQUFTNlUsYUFBYUEsQ0FBQzlxQyxNQUFNLEVBQUU7UUFDM0IsSUFBSWc0QixNQUFNLENBQUNvQixFQUFFLEVBQUU7VUFDWDtVQUNBLElBQU00TSxTQUFTLEdBQUc7WUFDZDhCLGFBQWEsRUFBRSxDQUFDO1lBQ2hCQyxhQUFhLEVBQUU3MUIsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDLEdBQUdmLFdBQVc7WUFDdkN5QyxhQUFhLEVBQUV2SyxJQUFJLENBQUM5d0MsTUFBTTtZQUMxQnM3QyxlQUFlLEVBQUUzMUMsTUFBTSxDQUFDMHJDLEdBQUcsQ0FBQ3pDLE9BQU8sQ0FBQ3hsQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7VUFDN0QsQ0FBQztVQUNELElBQU1nMUMsYUFBYSxHQUFHL00sR0FBRyxDQUFDekMsT0FBTyxDQUFDeGxDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFO1VBQzVEZzFDLGFBQWEsQ0FBQ3BzQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM1eEIsT0FBTyxDQUFDLFVBQUNpK0MsTUFBTSxFQUFLO1lBQ3pDLElBQU1wMUIsSUFBSSxHQUFHbzFCLE1BQU0sQ0FBQ3JzQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQU1zc0IsR0FBRyxHQUFHRCxNQUFNLENBQUM3MEIsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxJQUFJODBCLEdBQUcsRUFBRTtjQUNMakYsU0FBUyxDQUFDcHdCLElBQUksQ0FBQyxHQUFHdGpCLE1BQU0sQ0FBQzI0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUNwZ0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDO1VBQ0osQ0FBQyxDQUFDO1VBQ0Y2ZixRQUFRLENBQUNtWSxtQkFBbUIsQ0FBQztZQUN6Qjl6QyxFQUFFLEVBQUUydkMsT0FBTyxDQUFDem5CLE1BQU07WUFDbEJpeEIsS0FBSyxFQUFFbEMsU0FBUztZQUNoQjlNLE1BQU07WUFDTmw1QixNQUFNO1lBQ05tYSxNQUFNLEVBQUV1a0IsT0FBTyxDQUFDdmtCLE1BQU07WUFDdEIrUyxLQUFLLEVBQUV3UixPQUFPLENBQUN4UjtVQUNuQixDQUFDLENBQUMsQ0FBQztRQUNQO01BQ0o7TUFDQSxJQUFNZ2UsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUkxeUMsSUFBSSxFQUFLO1FBQ3pCLElBQVEyeUMsS0FBSyxHQUFlM3lDLElBQUksQ0FBeEIyeUMsS0FBSztVQUFFQyxRQUFRLEdBQUs1eUMsSUFBSSxDQUFqQjR5QyxRQUFRO1FBQ3ZCLElBQUkxUixLQUFLLENBQUNzQixZQUFZLEVBQUU7VUFDcEJ0QixLQUFLLENBQUNzQixZQUFZLENBQUMwRCxPQUFPLEVBQUUwTSxRQUFRLENBQUM7UUFDekM7UUFDQSxJQUFJcHJDLE1BQU07UUFDVixJQUFJbXJDLEtBQUssRUFBRTtVQUNQbnJDLE1BQU0sR0FBR29yQyxRQUFRO1FBQ3JCLENBQUMsTUFDSTtVQUNELElBQVFuMEIsTUFBTSxHQUFLeW5CLE9BQU8sQ0FBbEJ6bkIsTUFBTTtVQUNkLElBQU1sb0IsRUFBRSxHQUFHa29CLE1BQU0sQ0FBQzhuQixNQUFNLENBQUMsQ0FBQyxFQUFFOW5CLE1BQU0sQ0FBQ28wQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7VUFDcERyckMsTUFBTSxHQUFHO1lBQUUsQ0FBQ2pSLEVBQUUsR0FBR3E4QyxRQUFRLENBQUM1dEM7VUFBTSxDQUFDO1FBQ3JDO1FBQ0FzdEMsYUFBYSxDQUFDOXFDLE1BQU0sQ0FBQztRQUNyQmkyQixPQUFPLENBQUNqMkIsTUFBTSxDQUFDO01BQ25CLENBQUM7TUFDRCxJQUFNc3JDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7UUFDdEIsSUFBSTdCLEdBQUcsRUFBRTtVQUNML2UsUUFBUSxDQUFDcVksaUJBQWlCLENBQUM7WUFBRThILEtBQUssRUFBRXBCO1VBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0M7UUFDQSxJQUFJQyxVQUFVLEVBQUU7VUFDWmhmLFFBQVEsQ0FBQzhkLFVBQVUsQ0FBQ2tCLFVBQVUsRUFBRWhMLE9BQU8sQ0FBQyxDQUFDO1FBQzdDO1FBQ0EsSUFBSWlMLGVBQWUsRUFBRTtVQUNqQmpmLFFBQVEsQ0FBQzhkLFVBQVUsQ0FBQ21CLGVBQWUsRUFBRWpMLE9BQU8sQ0FBQyxDQUFDO1FBQ2xEO01BQ0osQ0FBQztNQUNELElBQUl4RixNQUFNLEtBQUt4Qix3REFBTSxDQUFDeUIsRUFBRSxFQUFFO1FBQ3RCNkUsR0FBRyxDQUFDcmIsSUFBSSxDQUFDLENBQUMsQ0FBQ3VULElBQUksQ0FBQyxVQUFDMTlCLElBQUksRUFBSztVQUN0QixJQUFJLENBQUNneEMsUUFBUSxJQUFJaHhDLElBQUksQ0FBQ2d4QyxRQUFRLEVBQUU7WUFDNUJBLFFBQVEsR0FBR2h4QyxJQUFJLENBQUNneEMsUUFBUTtVQUM1QjtVQUNBLElBQUksQ0FBQ0MsR0FBRyxJQUFJanhDLElBQUksQ0FBQ2l4QyxHQUFHLEVBQUU7WUFDbEIsSUFBTThCLE9BQU8sR0FBRztjQUNaVixLQUFLLEVBQUVyeUMsSUFBSSxDQUFDaXhDLEdBQUc7Y0FDZkQsUUFBUSxFQUFFaHhDLElBQUksQ0FBQ2d4QyxRQUFRO2NBQ3ZCZ0MsWUFBWSxFQUFFaHpDLElBQUksQ0FBQ2l6QyxNQUFNO2NBQ3pCOUIsZUFBZSxFQUFFbnhDLElBQUksQ0FBQ214QyxlQUFlO2NBQ3JDMXlCLE1BQU0sRUFBRTZQLElBQUksQ0FBQ0MsU0FBUyxDQUFDMlgsT0FBTyxDQUFDNEcsT0FBTztZQUMxQyxDQUFDO1lBQ0Q1YSxRQUFRLENBQUNvWSxjQUFjLENBQUN5SSxPQUFPLENBQUMsQ0FBQztZQUNqQzlCLEdBQUcsR0FBR2p4QyxJQUFJLENBQUNpeEMsR0FBRztVQUNsQjtVQUNBLElBQUlqeEMsSUFBSSxDQUFDZ3dDLFVBQVUsRUFBRTtZQUNqQjlkLFFBQVEsQ0FBQzhkLFVBQVUsQ0FBQ2h3QyxJQUFJLENBQUNnd0MsVUFBVSxFQUFFOUosT0FBTyxDQUFDLENBQUM7VUFDbEQ7VUFDQSxJQUFJbG1DLElBQUksQ0FBQ2t6QyxRQUFRLEVBQUU7WUFDZmhoQixRQUFRLENBQUM4ZCxVQUFVLENBQUNod0MsSUFBSSxDQUFDa3pDLFFBQVEsRUFBRWhOLE9BQU8sQ0FBQyxDQUFDO1VBQ2hEO1VBQ0EsSUFBSSxDQUFDaUwsZUFBZSxJQUFJbnhDLElBQUksQ0FBQ214QyxlQUFlLEVBQUU7WUFDMUNBLGVBQWUsR0FBR254QyxJQUFJLENBQUNteEMsZUFBZTtVQUMxQztVQUNBLElBQUksQ0FBQ04sVUFBVSxJQUFJN3dDLElBQUksQ0FBQzR5QyxRQUFRLEtBQUt2OUMsU0FBUyxFQUFFO1lBQzVDLElBQUkySyxJQUFJLENBQUNtekMsSUFBSSxFQUFFO2NBQ1gzVixPQUFPLENBQUM5c0IsR0FBRyxDQUFDMVEsSUFBSSxDQUFDbXpDLElBQUksQ0FBQ3AzQyxHQUFHLENBQUNpc0MseURBQVcsQ0FBQyxDQUFDLENBQUN0SyxJQUFJLENBQUMsWUFBTTtnQkFDL0NvVixXQUFXLENBQUMsQ0FBQztnQkFDYkosVUFBVSxDQUFDMXlDLElBQUksQ0FBQztjQUNwQixDQUFDLENBQUM7WUFDTixDQUFDLE1BQ0k7Y0FDRDh5QyxXQUFXLENBQUMsQ0FBQztjQUNiSixVQUFVLENBQUMxeUMsSUFBSSxDQUFDO1lBQ3BCO1VBQ0osQ0FBQyxNQUNJO1lBQ0Q7WUFDQW96QyxVQUFVLENBQUNDLE1BQU0sRUFBRXhDLFVBQVUsQ0FBQ3lDLFFBQVEsS0FBS2orQyxTQUFTLEdBQzlDdzdDLFVBQVUsQ0FBQ3lDLFFBQVEsR0FDbkIsR0FBRyxDQUFDO1VBQ2Q7UUFDSixDQUFDLENBQUM7TUFDTixDQUFDLE1BQ0ksSUFBSTVTLE1BQU0sS0FBS3hCLHdEQUFNLENBQUNrUSxjQUFjLEVBQUU7UUFDdkMwRCxXQUFXLENBQUMsQ0FBQztRQUNiUixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakI3VSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDZixDQUFDLE1BQ0k7UUFDRHFWLFdBQVcsQ0FBQyxDQUFDO1FBQ2IveUIsTUFBTSxDQUFDeWxCLEdBQUcsQ0FBQztNQUNmO0lBQ0osQ0FBQztJQUNELElBQU0rTixXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQSxFQUFTO01BQ3RCLElBQUkvVCxNQUFNLENBQUNvQixFQUFFLEVBQUU7UUFDWDFPLFFBQVEsQ0FBQ21ZLG1CQUFtQixDQUFDO1VBQ3pCOXpDLEVBQUUsRUFBRTJ2QyxPQUFPLENBQUN6bkIsTUFBTTtVQUNsQmlpQixNQUFNLEVBQUV4Qix3REFBTSxDQUFDc1UsV0FBVztVQUMxQmhzQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1VBQ1ZtYSxNQUFNLEVBQUV1a0IsT0FBTyxDQUFDdmtCLE1BQU07VUFDdEIrUyxLQUFLLEVBQUV3UixPQUFPLENBQUN4UjtRQUNuQixDQUFDLENBQUMsQ0FBQztNQUNQO01BQ0EzVSxNQUFNLENBQUMsSUFBSXBILEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxJQUFNMDZCLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFBLEVBQVM7TUFDakJoQyxhQUFhLENBQUMsQ0FBQyxDQUFDM1QsSUFBSSxDQUFDdVUsWUFBWSxFQUFFc0IsV0FBVyxDQUFDO0lBQ25ELENBQUM7SUFDREYsTUFBTSxDQUFDLENBQUM7RUFDWixDQUFDLENBQUM7QUFDTjtBQUNBLFNBQVN0RixZQUFZQSxDQUFDTSxXQUFXLEVBQUU7RUFDL0I7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQUksQ0FBQ0EsV0FBVyxFQUFFO0lBQ2QsT0FBTyxDQUFDLENBQUM7RUFDYjtFQUNBLElBQU0xc0IsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNqQixLQUFLLElBQUkzc0IsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHcTVDLFdBQVcsQ0FBQ2w2QyxNQUFNLEVBQUVhLENBQUMsRUFBRSxFQUFFO0lBQ3pDLElBQUlYLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQ3M0QyxXQUFXLENBQUNyNUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUMvQixJQUFNeStDLE9BQU8sR0FBR3BGLFdBQVcsQ0FBQ3I1QyxDQUFDLENBQUM7TUFDOUIsS0FBSyxJQUFJMCtDLEVBQUUsR0FBRyxDQUFDLEVBQUVBLEVBQUUsR0FBR0QsT0FBTyxDQUFDdC9DLE1BQU0sRUFBRXUvQyxFQUFFLEVBQUUsRUFBRTtRQUFBLElBQUFDLGlCQUFBO1FBQ3hDLElBQU1DLE1BQU0sTUFBQXpnQyxNQUFBLENBQU1vMEIsMERBQVcsQ0FBQ2tNLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDLENBQUNuOUMsRUFBRSxDQUFDLE9BQUE0YyxNQUFBLENBQUlzZ0MsT0FBTyxDQUFDQyxFQUFFLENBQUMsQ0FBQ3hJLFFBQVEsQ0FBRTtRQUN2RXZwQixNQUFNLENBQUNpeUIsTUFBTSxDQUFDLElBQUFELGlCQUFBLEdBQUdGLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDLENBQUM3OUMsS0FBSyxjQUFBODlDLGlCQUFBLGNBQUFBLGlCQUFBLEdBQUksSUFBSTtNQUM5QztJQUNKLENBQUMsTUFDSTtNQUFBLElBQUFFLG9CQUFBO01BQ0QsSUFBTUQsT0FBTSxNQUFBemdDLE1BQUEsQ0FBTW8wQiwwREFBVyxDQUFDOEcsV0FBVyxDQUFDcjVDLENBQUMsQ0FBQyxDQUFDdUIsRUFBRSxDQUFDLE9BQUE0YyxNQUFBLENBQUlrN0IsV0FBVyxDQUFDcjVDLENBQUMsQ0FBQyxDQUFDazJDLFFBQVEsQ0FBRTtNQUM3RXZwQixNQUFNLENBQUNpeUIsT0FBTSxDQUFDLElBQUFDLG9CQUFBLEdBQUd4RixXQUFXLENBQUNyNUMsQ0FBQyxDQUFDLENBQUNhLEtBQUssY0FBQWcrQyxvQkFBQSxjQUFBQSxvQkFBQSxHQUFJLElBQUk7SUFDakQ7RUFDSjtFQUNBLE9BQU9seUIsTUFBTTtBQUNqQjtBQUNBLFNBQVN5c0IsY0FBY0EsQ0FBQy9KLFNBQVMsRUFBRTtFQUMvQjtFQUNBO0VBQ0EsSUFBSUEsU0FBUyxJQUFJQSxTQUFTLENBQUNsd0MsTUFBTSxFQUFFO0lBQy9CLElBQU0yL0MsSUFBSSxHQUFHelAsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6QixJQUFJNkwsV0FBVztJQUNmLElBQUk0RCxJQUFJLENBQUN2dEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ3RCMnBCLFdBQVcsR0FBRzVoQixJQUFJLENBQUNvakIsS0FBSyxDQUFDb0MsSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFRCxJQUFJLENBQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQyxNQUNJO01BQ0QzQyxXQUFXLEdBQUc0RCxJQUFJLENBQUMzdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQztJQUNBLE9BQU8rcEIsV0FBVztFQUN0QjtBQUNKO0FBQ08sU0FBUzhELGVBQWVBLENBQUMzSSxFQUFFLEVBQUU3TCxNQUFNLEVBQUUwQixLQUFLLEVBQUV3SixLQUFLLEVBQUV4ckMsTUFBTSxFQUFBKzBDLEtBQUEsRUFBa0IvaEIsUUFBUSxFQUFFdkYsUUFBUSxFQUFFO0VBQUEsSUFBbEN1bkIsVUFBVSxHQUFBRCxLQUFBLENBQVZDLFVBQVU7RUFDMUUsSUFBQUMsWUFBQSxHQUFvRjlJLEVBQUUsQ0FBQ3JULFFBQVE7SUFBdkZ2WixNQUFNLEdBQUEwMUIsWUFBQSxDQUFOMTFCLE1BQU07SUFBRWtELE1BQU0sR0FBQXd5QixZQUFBLENBQU54eUIsTUFBTTtJQUFFK1MsS0FBSyxHQUFBeWYsWUFBQSxDQUFMemYsS0FBSztJQUFFa1ksbUJBQW1CLEdBQUF1SCxZQUFBLENBQW5CdkgsbUJBQW1CO0lBQUVpRSxVQUFVLEdBQUFzRCxZQUFBLENBQVZ0RCxVQUFVO0lBQUV1RCxlQUFlLEdBQUFELFlBQUEsQ0FBZkMsZUFBZTtFQUMvRSxJQUFJO0lBQ0EsSUFBTUMsTUFBTSxHQUFHakosUUFBUSxDQUFDVixLQUFLLEVBQUV4ckMsTUFBTSxFQUFFbXNDLEVBQUUsRUFBRTFwQixNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQztJQUNqRTtJQUNBLElBQUkweUIsTUFBTSxLQUFLLElBQUksRUFBRTtNQUNqQixPQUFBMVIsYUFBQSxDQUFBQSxhQUFBLEtBQ08wSSxFQUFFO1FBQ0xpSixnQkFBZ0IsRUFBRTtNQUFJO0lBRTlCO0lBQ0EsSUFBTXhILE9BQU8sR0FBRyxFQUFFO0lBQ2xCLElBQU15SCxZQUFZLEdBQUcsRUFBRTtJQUN2QkwsVUFBVSxDQUFDMy9DLE9BQU8sQ0FBQyxVQUFDOGYsR0FBRyxFQUFFcmYsQ0FBQyxFQUFLO01BQzNCLElBQUF3L0Msa0JBQUEsR0FBcUIvSixnQkFBZ0IsQ0FBQ0MsS0FBSyxFQUFFM3VDLGtEQUFHLENBQUM2cEIsa0RBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFdlIsR0FBRyxDQUFDLEVBQUVnM0IsRUFBRSxDQUFDclQsUUFBUSxDQUFDOFUsT0FBTyxDQUFDOTNDLENBQUMsQ0FBQyxFQUFFcTJDLEVBQUUsQ0FBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUFBNEosa0JBQUEsR0FBQTUvQyxjQUFBLENBQUEyL0Msa0JBQUE7UUFBdkg3RixJQUFJLEdBQUE4RixrQkFBQTtRQUFFQyxJQUFJLEdBQUFELGtCQUFBO01BQ2pCM0gsT0FBTyxDQUFDbDNDLElBQUksQ0FBQys0QyxJQUFJLENBQUM7TUFDbEIsSUFBSStGLElBQUksRUFBRTtRQUNOSCxZQUFZLENBQUMzK0MsSUFBSSxDQUFDOCtDLElBQUksQ0FBQztNQUMzQjtJQUNKLENBQUMsQ0FBQztJQUNGLElBQUlILFlBQVksQ0FBQ3BnRCxNQUFNLEVBQUU7TUFDckIsSUFBSW9pQixrREFBTyxDQUFDODlCLE1BQU0sQ0FBQyxDQUFDbGdELE1BQU0sRUFBRTtRQUN4QjgzQyxNQUFNLENBQUNzSSxZQUFZLEVBQUU3SixLQUFLLENBQUM7TUFDL0I7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLE9BQUEvSCxhQUFBLENBQUFBLGFBQUEsS0FDTzBJLEVBQUU7UUFDTGlKLGdCQUFnQixFQUFFO01BQUk7SUFFOUI7SUFDQSxJQUFNSyxTQUFTO01BQUEsSUFBQUMsS0FBQSxHQUFBalgsaUJBQUEsY0FBQVAsWUFBQSxHQUFBNVQsQ0FBQSxDQUFHLFNBQUEwVyxRQUFBO1FBQUEsSUFBQTJVLGNBQUEsRUFBQTVHLGNBQUEsRUFBQTZHLHFCQUFBLEVBQUE1TyxPQUFBLEVBQUFsbUMsSUFBQSxFQUFBKzBDLFNBQUEsRUFBQTFQLFVBQUEsRUFBQTJQLFNBQUEsRUFBQWxFLGNBQUEsRUFBQW1FLFVBQUEsRUFBQXI5QyxLQUFBLEVBQUFzOUMsSUFBQSxFQUFBelAsS0FBQSxFQUFBSyxHQUFBLEVBQUFxUCxHQUFBO1FBQUEsT0FBQS9YLFlBQUEsR0FBQWhpQyxDQUFBLFdBQUFnNkMsU0FBQTtVQUFBLGtCQUFBQSxTQUFBLENBQUFwOUIsQ0FBQTtZQUFBO2NBQ1I2OEIsY0FBYyxHQUFHL0gsT0FBTyxDQUFDL3dDLEdBQUcsQ0FBQyxVQUFBc1ksR0FBRztnQkFBQSxJQUFBZ2hDLGFBQUE7Z0JBQUEsT0FBSztrQkFDdkN4cEMsSUFBSSxFQUFFaThCLCtDQUFPLENBQUM0QyxLQUFLLEVBQUVyMkIsR0FBRyxDQUFDOWQsRUFBRSxDQUFDO2tCQUM1QjIwQyxRQUFRLEdBQUFtSyxhQUFBLEdBQUVoaEMsR0FBRyxDQUFDNjJCLFFBQVEsY0FBQW1LLGFBQUEsdUJBQVpBLGFBQUEsQ0FBY2x2QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2tCQUNyQzV2QixFQUFFLEVBQUU4ZCxHQUFHLENBQUM5ZDtnQkFDWixDQUFDO2NBQUEsQ0FBQyxDQUFDO2NBQ0gyN0IsUUFBUSxDQUFDa1csa0RBQU8sQ0FBQ3lNLGNBQWMsQ0FBQyxDQUFDO2NBQUNPLFNBQUEsQ0FBQXZnQyxDQUFBO2NBRXhCbzVCLGNBQWMsR0FBR3g1QyxrREFBSSxDQUFDNDJDLEVBQUUsQ0FBQzRDLGNBQWMsQ0FBQztjQUN4QzZHLHFCQUFxQixHQUFHN0csY0FBYyxDQUFDbHlDLEdBQUcsQ0FBQyxVQUFBdTVDLE1BQU0sRUFBSTtnQkFDdkQsSUFBSUEsTUFBTSxDQUFDL3VCLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtrQkFDeEIsT0FBTzBoQiw2REFBVSxDQUFDcU4sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQztnQkFDQSxPQUFPQSxNQUFNO2NBQ2pCLENBQUMsQ0FBQztjQUNJcFAsT0FBTyxHQUFHO2dCQUNaem5CLE1BQU07Z0JBQ05xdUIsT0FBTyxFQUFFdEYsZ0VBQWlCLENBQUMvb0IsTUFBTSxDQUFDLEdBQUdxdUIsT0FBTyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RG5yQixNQUFNLEVBQUUweUIsTUFBTTtnQkFDZHBHLGNBQWM7Z0JBQ2Q2RyxxQkFBcUI7Z0JBQ3JCcGdCLEtBQUssRUFBRTJXLEVBQUUsQ0FBQ3JULFFBQVEsQ0FBQ3RELEtBQUssQ0FBQ3ZnQyxNQUFNLEdBQ3pCaTNDLFFBQVEsQ0FBQ1YsS0FBSyxFQUFFeHJDLE1BQU0sRUFBRW1zQyxFQUFFLEVBQUUzVyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQzNDci9CO2NBQ1YsQ0FBQztjQUFBLEtBQ0d1M0MsbUJBQW1CO2dCQUFBd0ksU0FBQSxDQUFBcDlCLENBQUE7Z0JBQUE7Y0FBQTtjQUFBbzlCLFNBQUEsQ0FBQXZnQyxDQUFBO2NBQUF1Z0MsU0FBQSxDQUFBcDlCLENBQUE7Y0FBQSxPQUVJdTBCLGdCQUFnQixDQUFDcmEsUUFBUSxFQUFFMGEsbUJBQW1CLEVBQUVwTixNQUFNLEVBQUUwRyxPQUFPLENBQUM7WUFBQTtjQUE3RWxtQyxJQUFJLEdBQUFvMUMsU0FBQSxDQUFBbmhDLENBQUE7Y0FBQSxPQUFBbWhDLFNBQUEsQ0FBQXZpQyxDQUFBLElBQ0g7Z0JBQUU3UyxJQUFJO2dCQUFFa21DO2NBQVEsQ0FBQztZQUFBO2NBQUFrUCxTQUFBLENBQUF2Z0MsQ0FBQTtjQUFBaXhCLEdBQUEsR0FBQXNQLFNBQUEsQ0FBQW5oQyxDQUFBO2NBQUEsT0FBQW1oQyxTQUFBLENBQUF2aUMsQ0FBQSxJQUdqQjtnQkFBRWdkLEtBQUssRUFBQWlXLEdBQUE7Z0JBQUVJO2NBQVEsQ0FBQztZQUFBO2NBRzdCNk8sU0FBUyxHQUFHdlYsTUFBTTtjQUNsQjZGLFVBQVUsR0FBRyxJQUFJO2NBRWZ5TCxjQUFjLEdBQUcsRUFBRTtjQUNuQm1FLFVBQVUsR0FBRzNtQixJQUFJLENBQUNDLFNBQVMsQ0FBQzJYLE9BQU8sQ0FBQzRHLE9BQU8sQ0FBQztjQUNsRHZ2QixrREFBTSxDQUFDb1AsUUFBUSxDQUFDLENBQUMsQ0FBQ3dsQixZQUFZLENBQUMsQ0FBQzU5QyxPQUFPLENBQUMsVUFBQzA4QyxHQUFHLEVBQUs7Z0JBQzdDLElBQUlnRSxVQUFVLEtBQUtoRSxHQUFHLENBQUN4eUIsTUFBTSxFQUFFO2tCQUMzQjtrQkFDQTtrQkFDQTtrQkFDQXF5QixjQUFjLENBQUNsN0MsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFcTdDLEdBQUcsQ0FBQ29CLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztrQkFDaERuZ0IsUUFBUSxDQUFDc1ksc0JBQXNCLENBQUM7b0JBQUU2SCxLQUFLLEVBQUVwQixHQUFHLENBQUNvQjtrQkFBTSxDQUFDLENBQUMsQ0FBQztnQkFDMUQ7Z0JBQ0EsSUFBSSxDQUFDcEIsR0FBRyxDQUFDK0IsWUFBWSxFQUFFO2tCQUNuQjtnQkFDSjtnQkFDQSxJQUFNdUMsS0FBSyxHQUFHcDlDLGtEQUFZLENBQUM4NEMsR0FBRyxDQUFDK0IsWUFBWSxFQUFFM0gsRUFBRSxDQUFDclQsUUFBUSxDQUFDclcsTUFBTSxDQUFDO2dCQUNoRSxJQUFJNHpCLEtBQUssQ0FBQ3BoRCxNQUFNLEVBQUU7a0JBQ2QyOEMsY0FBYyxDQUFDbDdDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRXE3QyxHQUFHLENBQUNvQixLQUFLLENBQUMsQ0FBQztrQkFDN0MsSUFBSXBCLEdBQUcsQ0FBQ0UsZUFBZSxFQUFFO29CQUNyQmpmLFFBQVEsQ0FBQzhkLFVBQVUsQ0FBQ2lCLEdBQUcsQ0FBQ0UsZUFBZSxFQUFFakwsT0FBTyxDQUFDLENBQUM7a0JBQ3REO2dCQUNKO2NBQ0osQ0FBQyxDQUFDO2NBQUN0dUMsS0FBQSxnQkFBQXdsQyxZQUFBLEdBQUE1VCxDQUFBLFVBQUE1eEIsTUFBQTtnQkFBQSxJQUFBNDlDLEtBQUEsRUFBQUMsYUFBQSxFQUFBeFEsSUFBQSxFQUFBeVEsTUFBQSxFQUFBL1AsTUFBQSxFQUFBRSxFQUFBO2dCQUFBLE9BQUF6SSxZQUFBLEdBQUFoaUMsQ0FBQSxXQUFBK2tDLFFBQUE7a0JBQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO29CQUFBO3NCQUFBbW9CLFFBQUEsQ0FBQXRyQixDQUFBO3NCQUFBc3JCLFFBQUEsQ0FBQW5vQixDQUFBO3NCQUFBLE9BR3NCNDRCLGdCQUFnQixDQUFDMWUsUUFBUSxFQUFFZ1AsS0FBSyxFQUFFNlQsU0FBUyxFQUFFN08sT0FBTyxFQUFFMkssVUFBVSxFQUFFQyxjQUFjLENBQUMzOEMsTUFBTSxHQUFHMjhDLGNBQWMsR0FBR3o3QyxTQUFTLEVBQUVzM0IsUUFBUSxFQUFFMGUsRUFBRSxDQUFDclQsUUFBUSxDQUFDK1ksT0FBTyxDQUFDO29CQUFBO3NCQUFqSy93QyxLQUFJLEdBQUFtZ0MsUUFBQSxDQUFBbHNCLENBQUE7c0JBQ1IsSUFBSW94QixVQUFVLEVBQUU7d0JBQ1puVCxRQUFRLENBQUNzUyxpREFBYyxDQUFDYSxVQUFVLENBQUMsQ0FBQztzQkFDeEM7c0JBQ0E7c0JBQ01vUSxhQUFhLEdBQUc5b0IsUUFBUSxDQUFDLENBQUMsQ0FBQ3p0QixNQUFNO3NCQUN2Q3FYLGtEQUFPLENBQUN1MkIsT0FBTyxDQUFDLENBQUN2NEMsT0FBTyxDQUFDLFVBQUM4ZixHQUFHLEVBQUs7d0JBQzlCLElBQU04N0IsUUFBUSxHQUFHN0QsZUFBZSxDQUFDajRCLEdBQUcsQ0FBQzYyQixRQUFRLENBQUM7d0JBQzlDLElBQU15SyxVQUFVLEdBQUc3TiwrQ0FBTyxDQUFDNEMsS0FBSyxFQUFFcjJCLEdBQUcsQ0FBQzlkLEVBQUUsQ0FBQzt3QkFDekMsSUFBTXEvQyxhQUFhLEdBQUcvcEMsa0RBQUksQ0FBQzhwQyxVQUFVLENBQUN4aUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFZzlCLFFBQVEsQ0FBQyxDQUFDLEVBQUVzRixhQUFhLENBQUM7d0JBQ2pGLElBQU1JLFFBQVEsR0FBRyxDQUFDdE8sMERBQVcsQ0FBQ2x6QixHQUFHLENBQUM5ZCxFQUFFLENBQUMsRUFBRTQ1QyxRQUFRLENBQUM7d0JBQ2hELElBQU0yRixXQUFXLEdBQUdqcUMsa0RBQUksQ0FBQ2dxQyxRQUFRLEVBQUU3MUMsS0FBSSxDQUFDO3dCQUN4QyxJQUFJNm5DLCtDQUFPLENBQUNpTyxXQUFXLENBQUMsRUFBRTswQkFDdEIsSUFBSUYsYUFBYSxLQUFLdmdELFNBQVMsRUFBRTs0QkFDN0IsTUFBTSxJQUFJc2pCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQzswQkFDN0M7MEJBQ0EzWSxLQUFJLEdBQUc0UixrREFBUyxDQUFDaWtDLFFBQVEsRUFBRWpPLG1EQUFXLENBQUNnTyxhQUFhLEVBQUVFLFdBQVcsQ0FBQyxFQUFFOTFDLEtBQUksQ0FBQzt3QkFDN0U7c0JBQ0osQ0FBQyxDQUFDO3NCQUNGLElBQUlvMEMsZUFBZSxFQUFFO3dCQUNqQmhCLFVBQVUsQ0FBQzswQkFBQSxPQUFNbGhCLFFBQVEsQ0FBQzZWLHlFQUFtQixDQUFDLENBQUMsQ0FBQzt3QkFBQSxHQUFFLENBQUMsQ0FBQztzQkFDeEQ7c0JBQUMsT0FBQTVILFFBQUEsQ0FBQXR0QixDQUFBO3dCQUFBb0IsQ0FBQSxFQUNNOzBCQUFFalUsSUFBSSxFQUFKQSxLQUFJOzBCQUFFa21DO3dCQUFRO3NCQUFDO29CQUFBO3NCQUFBL0YsUUFBQSxDQUFBdHJCLENBQUE7c0JBQUFneEIsRUFBQSxHQUFBMUYsUUFBQSxDQUFBbHNCLENBQUE7c0JBR3hCK2dDLFNBQVMsR0FBQW5QLEVBQU07c0JBQUMsTUFDWkosS0FBSyxJQUFJZix3REFBZ0IsS0FDeEJtQixFQUFBLENBQUluRixNQUFNLEtBQUt4Qix3REFBTSxDQUFDaUgsWUFBWSxJQUMvQk4sRUFBQSxDQUFJbkYsTUFBTSxLQUFLeEIsd0RBQU0sQ0FBQ2tILFdBQVcsQ0FBQzt3QkFBQWpHLFFBQUEsQ0FBQW5vQixDQUFBO3dCQUFBO3NCQUFBO3NCQUFBbW9CLFFBQUEsQ0FBQW5vQixDQUFBO3NCQUFBLE9BQ25CNnRCLEVBQUEsQ0FBSVEsSUFBSSxDQUFDLENBQUM7b0JBQUE7c0JBQXZCcEIsSUFBSSxHQUFBOUUsUUFBQSxDQUFBbHNCLENBQUE7c0JBQUEsS0FDTmd4QixJQUFJLENBQUMvdEIsUUFBUSxDQUFDeXRCLHFFQUFtQixDQUFDO3dCQUFBeEUsUUFBQSxDQUFBbm9CLENBQUE7d0JBQUE7c0JBQUE7c0JBQUEsTUFDOUJrcEIsS0FBSyxDQUFDd0IsbUJBQW1CLEtBQUssSUFBSTt3QkFBQXZDLFFBQUEsQ0FBQW5vQixDQUFBO3dCQUFBO3NCQUFBO3NCQUM5QjA5QixNQUFNLEdBQUcsSUFBSTtzQkFDakIsSUFBSWxXLE1BQU0sQ0FBQ3FELEtBQUssQ0FBQ0UsT0FBTyxDQUFDdUQsYUFBYSxFQUFFO3dCQUNwQ29QLE1BQU0sR0FDRmxXLE1BQU0sQ0FBQ3FELEtBQUssQ0FBQ0UsT0FBTyxDQUFDdUQsYUFBYSxDQUFDQyxNQUFNLENBQUMsU0FBUyxDQUFDcHlDLE1BQU0sQ0FBQztzQkFDbkU7c0JBQUNnc0MsUUFBQSxDQUFBbm9CLENBQUE7c0JBQUEsT0FDb0JrcEIsS0FBSyxDQUFDd0IsbUJBQW1CLENBQUNnVCxNQUFNLENBQUM7b0JBQUE7c0JBQWhEL1AsTUFBTSxHQUFBeEYsUUFBQSxDQUFBbHNCLENBQUE7c0JBQUEsS0FDUjB4QixNQUFNO3dCQUFBeEYsUUFBQSxDQUFBbm9CLENBQUE7d0JBQUE7c0JBQUE7c0JBQ05xdEIsVUFBVSxHQUFHO3dCQUNUaUIsYUFBYSxZQUFBbnpCLE1BQUEsQ0FBWXd5QixNQUFNO3NCQUNuQyxDQUFDO3NCQUNEb1AsU0FBUyxHQUFHeHdCLGtEQUFjLENBQUNpYixNQUFNLEVBQUU7d0JBQy9CcUQsS0FBSyxFQUFFOzBCQUNIRSxPQUFPLEVBQUVzQzt3QkFDYjtzQkFDSixDQUFDLENBQUM7c0JBQUMsT0FBQWxGLFFBQUEsQ0FBQXR0QixDQUFBO29CQUFBO3NCQUFBLE9BQUFzdEIsUUFBQSxDQUFBdHRCLENBQUE7a0JBQUE7Z0JBQUEsR0FBQWpiLEtBQUE7Y0FBQTtjQWhEbEI2dEMsS0FBSyxHQUFHLENBQUM7WUFBQTtjQUFBLE1BQUVBLEtBQUssSUFBSWYsd0RBQWdCO2dCQUFBMFEsU0FBQSxDQUFBcDlCLENBQUE7Z0JBQUE7Y0FBQTtjQUFBLE9BQUFvOUIsU0FBQSxDQUFBcGhDLENBQUEsQ0FBQStoQyxrQkFBQSxDQUFBbitDLEtBQUE7WUFBQTtjQUFBczlDLElBQUEsR0FBQUUsU0FBQSxDQUFBbmhDLENBQUE7Y0FBQSxNQUFBaWhDLElBQUE7Z0JBQUFFLFNBQUEsQ0FBQXA5QixDQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBbzlCLFNBQUEsQ0FBQXZpQyxDQUFBO1lBQUE7Y0FBQSxNQUFBcWlDLElBQUE7Z0JBQUFFLFNBQUEsQ0FBQXA5QixDQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBbzlCLFNBQUEsQ0FBQXZpQyxDQUFBO1lBQUE7Y0FBQSxLQUFBcWlDLElBQUE7Z0JBQUFFLFNBQUEsQ0FBQXA5QixDQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBbzlCLFNBQUEsQ0FBQXZpQyxDQUFBLElBQUFxaUMsSUFBQSxDQUFBamhDLENBQUE7WUFBQTtjQUFFd3hCLEtBQUssRUFBRTtjQUFBMlAsU0FBQSxDQUFBcDlCLENBQUE7Y0FBQTtZQUFBO2NBQUEsT0FBQW85QixTQUFBLENBQUF2aUMsQ0FBQSxJQTBEL0M7Z0JBQUVnZCxLQUFLLEVBQUVtbEIsU0FBUztnQkFBRTlPLE9BQU8sRUFBRTtjQUFLLENBQUM7WUFBQTtjQUFBa1AsU0FBQSxDQUFBdmdDLENBQUE7Y0FBQXNnQyxHQUFBLEdBQUFDLFNBQUEsQ0FBQW5oQyxDQUFBO2NBQUEsT0FBQW1oQyxTQUFBLENBQUF2aUMsQ0FBQSxJQUduQztnQkFBRWdkLEtBQUssRUFBQXNsQixHQUFBO2dCQUFFalAsT0FBTyxFQUFFO2NBQUssQ0FBQztZQUFBO2NBQUFrUCxTQUFBLENBQUF2Z0MsQ0FBQTtjQUcvQnFkLFFBQVEsQ0FBQ2lXLGlEQUFNLENBQUMwTSxjQUFjLENBQUMsQ0FBQztjQUFDLE9BQUFPLFNBQUEsQ0FBQTVqQyxDQUFBO1lBQUE7Y0FBQSxPQUFBNGpDLFNBQUEsQ0FBQXZpQyxDQUFBO1VBQUE7UUFBQSxHQUFBcXRCLE9BQUE7TUFBQSxDQUV4QztNQUFBLGdCQTVIS3lVLFNBQVNBLENBQUE7UUFBQSxPQUFBQyxLQUFBLENBQUFwaUMsS0FBQSxPQUFBdGUsU0FBQTtNQUFBO0lBQUEsR0E0SGQ7SUFDRCxJQUFNOGhELEtBQUssR0FBQXJULGFBQUEsQ0FBQUEsYUFBQSxLQUNKMEksRUFBRTtNQUNMaUosZ0JBQWdCLEVBQUVLLFNBQVMsQ0FBQztJQUFDLEVBQ2hDO0lBQ0QsT0FBT3FCLEtBQUs7RUFDaEIsQ0FBQyxDQUNELE9BQU9ubUIsS0FBSyxFQUFFO0lBQ1YsT0FBQThTLGFBQUEsQ0FBQUEsYUFBQSxLQUNPMEksRUFBRTtNQUNMaUosZ0JBQWdCLEVBQUU7UUFBRXprQixLQUFLO1FBQUVxVyxPQUFPLEVBQUU7TUFBSztJQUFDO0VBRWxEO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzcUJBLElBQU0rUCxVQUFVLEdBQUc7RUFDZkMsY0FBYyxFQUFFLENBQUM7RUFDakJDLGlCQUFpQixFQUFFLENBQUM7RUFDcEJDLFVBQVUsRUFBRSxDQUFDO0VBQ2JDLFNBQVMsRUFBRSxDQUFDO0VBQ1pDLFVBQVUsRUFBRSxDQUFDO0VBQ2JDLGlCQUFpQixFQUFFLENBQUM7RUFDcEJDLFVBQVUsRUFBRSxDQUFDO0VBQ2JDLGdCQUFnQixFQUFFLENBQUM7RUFDbkJDLFFBQVEsRUFBRSxDQUFDO0VBQ1hDLFNBQVMsRUFBRSxDQUFDO0VBQ1pDLGdCQUFnQixFQUFFLENBQUM7RUFDbkJDLGdCQUFnQixFQUFFO0FBQ3RCLENBQUM7QUFFTSxJQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBR0MsTUFBTSxFQUFJO0VBQy9CLElBQUlkLFVBQVUsQ0FBQ2MsTUFBTSxDQUFDLEVBQUU7SUFDcEIsT0FBT0EsTUFBTTtFQUNqQjtFQUNBLE1BQU0sSUFBSXArQixLQUFLLElBQUF4RixNQUFBLENBQUk0akMsTUFBTSxxQkFBa0IsQ0FBQztBQUNoRCxDQUFDO0FBRU0sSUFBTXJTLGdCQUFnQixHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJTO0FBQ0g7QUF5QnhCO0FBVVk7QUFDbUI7QUFFVjtBQUVEOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNOEMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBR21RLFNBQVM7RUFBQSxPQUFJQSxTQUFTLENBQUNweEIsVUFBVSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXhFLElBQU1xeEIsR0FBRyxHQUFHO0VBQUNDLElBQUksRUFBRSxLQUFLO0VBQUVsRixLQUFLLEVBQUU7QUFBQyxDQUFDO0FBQ25DLElBQU1tRixLQUFLLEdBQUc7RUFBQ0QsSUFBSSxFQUFFO0FBQU8sQ0FBQztBQUM3QixJQUFNRSxVQUFVLEdBQUc7RUFBQ0YsSUFBSSxFQUFFLFlBQVk7RUFBRWxGLEtBQUssRUFBRSxDQUFDO0VBQUVxRixNQUFNLEVBQUU7QUFBQyxDQUFDO0FBQzVELElBQU1DLFNBQVMsR0FBRztFQUFDTCxHQUFHO0VBQUVFLEtBQUs7RUFBRUM7QUFBVSxDQUFDO0FBQzFDLElBQU1HLGdCQUFnQixHQUFHO0VBQ3JCQyxNQUFNLEVBQUU7SUFBQ1AsR0FBRztJQUFFRTtFQUFLLENBQUM7RUFDcEJNLEtBQUssRUFBRUgsU0FBUztFQUNoQkksS0FBSyxFQUFFSjtBQUNYLENBQUM7QUFDRCxJQUFNSyxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBRXhELElBQU1DLGNBQWMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUMsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUd2SixLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDMW9CLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFBQTs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNreUIsZUFBZUEsQ0FBQ3hKLEtBQUssRUFBRTtFQUM1QixPQUFPbHpDLGlEQUFHLENBQ04sVUFBQWdWLEdBQUc7SUFBQSxPQUFLMWMsS0FBSyxDQUFDMEIsT0FBTyxDQUFDZ2IsR0FBRyxDQUFDLElBQUlrbkMsU0FBUyxDQUFDbG5DLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLQSxHQUFHO0VBQUEsR0FDdkR1ZCxJQUFJLENBQUNvakIsS0FBSyxDQUFDekMsS0FBSyxDQUNwQixDQUFDO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU3lKLG9CQUFvQkEsQ0FBQ0MsZUFBZSxFQUFFO0VBQzNDLE9BQU9BLGVBQWUsQ0FBQ3BTLE1BQU0sQ0FBQyxDQUFDLEVBQUVvUyxlQUFlLENBQUN4a0QsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDZ3lCLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDN0U7QUFFTyxTQUFTeXlCLGNBQWNBLENBQUNqQixTQUFTLEVBQUU7RUFDdEM7RUFDQTtFQUNBLElBQU1rQixNQUFNLEdBQUdsQixTQUFTLENBQUM5RSxXQUFXLENBQUMsR0FBRyxDQUFDO0VBQ3pDLElBQU01RCxLQUFLLEdBQUcwSSxTQUFTLENBQUNwUixNQUFNLENBQUMsQ0FBQyxFQUFFc1MsTUFBTSxDQUFDO0VBQ3pDLE9BQU87SUFDSHRpRCxFQUFFLEVBQUV1aUQsZUFBZSxDQUFDN0osS0FBSyxDQUFDO0lBQzFCL0QsUUFBUSxFQUFFeU0sU0FBUyxDQUFDcFIsTUFBTSxDQUFDc1MsTUFBTSxHQUFHLENBQUM7RUFDekMsQ0FBQztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGVBQWVBLENBQUM3SixLQUFLLEVBQUU7RUFDbkMsT0FBT3VKLFlBQVksQ0FBQ3ZKLEtBQUssQ0FBQyxHQUFHd0osZUFBZSxDQUFDeEosS0FBSyxDQUFDLEdBQUdBLEtBQUs7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBUzFILFdBQVdBLENBQUNoeEMsRUFBRSxFQUFFO0VBQzVCLElBQUlsRCxPQUFBLENBQU9rRCxFQUFFLE1BQUssUUFBUSxFQUFFO0lBQ3hCLE9BQU9BLEVBQUU7RUFDYjtFQUNBLElBQU13aUQsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUc5a0MsQ0FBQztJQUFBLE9BQUtBLENBQUMsSUFBSUEsQ0FBQyxDQUFDNGpDLElBQUksSUFBS3ZwQixJQUFJLENBQUNDLFNBQVMsQ0FBQ3RhLENBQUMsQ0FBQztFQUFBO0VBQzVELElBQU0ra0MsS0FBSyxHQUFHbmxELE1BQU0sQ0FBQ1ksSUFBSSxDQUFDOEIsRUFBRSxDQUFDLENBQ3hCNnBCLElBQUksQ0FBQyxDQUFDLENBQ05ya0IsR0FBRyxDQUFDLFVBQUFySCxDQUFDO0lBQUEsT0FBSTQ1QixJQUFJLENBQUNDLFNBQVMsQ0FBQzc1QixDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUdxa0QsWUFBWSxDQUFDeGlELEVBQUUsQ0FBQzdCLENBQUMsQ0FBQyxDQUFDO0VBQUEsRUFBQztFQUM1RCxPQUFPLEdBQUcsR0FBR3NrRCxLQUFLLENBQUNoL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUc7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNpL0IsU0FBU0EsQ0FBQ3BtQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUNyQixJQUFNb21DLFVBQVUsR0FBR2pDLHFEQUFTLENBQUNua0MsQ0FBQyxDQUFDO0VBQy9CLElBQUlta0MscURBQVMsQ0FBQ3BrQyxDQUFDLENBQUMsRUFBRTtJQUNkLElBQUlxbUMsVUFBVSxFQUFFO01BQ1osSUFBTUMsRUFBRSxHQUFHci9DLE1BQU0sQ0FBQytZLENBQUMsQ0FBQztNQUNwQixJQUFNdW1DLEVBQUUsR0FBR3QvQyxNQUFNLENBQUNnWixDQUFDLENBQUM7TUFDcEIsT0FBT3FtQyxFQUFFLEdBQUdDLEVBQUUsR0FBRyxDQUFDLEdBQUdELEVBQUUsR0FBR0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDekM7SUFDQSxPQUFPLENBQUMsQ0FBQztFQUNiO0VBQ0EsSUFBSUYsVUFBVSxFQUFFO0lBQ1osT0FBTyxDQUFDO0VBQ1o7RUFDQSxJQUFNRyxPQUFPLEdBQUcsT0FBT3htQyxDQUFDLEtBQUssU0FBUztFQUN0QyxJQUFJd21DLE9BQU8sTUFBTSxPQUFPdm1DLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtJQUN0QyxPQUFPdW1DLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQzNCO0VBQ0EsT0FBT3htQyxDQUFDLEdBQUdDLENBQUMsR0FBRyxDQUFDLEdBQUdELENBQUMsR0FBR0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBTXdtQyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBR3JsQyxDQUFDO0VBQUEsT0FBS2dqQyxxREFBUyxDQUFDaGpDLENBQUMsQ0FBQyxHQUFHQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFBQSxDQUFDO0FBQ2pELElBQU1zbEMsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUd0bEMsQ0FBQztFQUFBLE9BQUssT0FBT0EsQ0FBQyxLQUFLLFFBQVEsR0FBR0EsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQUEsQ0FBQztBQUU3RCxTQUFTdWxDLE1BQU1BLENBQUNDLE1BQU0sRUFBRWxqRCxFQUFFLEVBQUV1YixJQUFJLEVBQUU0bkMsVUFBVSxFQUFFO0VBQzFDLElBQU1DLEtBQUssR0FBSUYsTUFBTSxDQUFDbGpELEVBQUUsQ0FBQyxHQUFHa2pELE1BQU0sQ0FBQ2xqRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUU7RUFDN0MsSUFBTXFqRCxTQUFTLEdBQUlELEtBQUssQ0FBQzduQyxJQUFJLENBQUMsR0FBRzZuQyxLQUFLLENBQUM3bkMsSUFBSSxDQUFDLElBQUksRUFBRztFQUNuRDhuQyxTQUFTLENBQUNoa0QsSUFBSSxDQUFDOGpELFVBQVUsQ0FBQztBQUM5QjtBQUVBLFNBQVNHLFVBQVVBLENBQUNKLE1BQU0sRUFBRUssTUFBTSxFQUFFaG9DLElBQUksRUFBRTRuQyxVQUFVLEVBQUU7RUFDbEQsSUFBTWpsRCxJQUFJLEdBQUdaLE1BQU0sQ0FBQ1ksSUFBSSxDQUFDcWxELE1BQU0sQ0FBQyxDQUFDMTVCLElBQUksQ0FBQyxDQUFDO0VBQ3ZDLElBQU0yNUIsTUFBTSxHQUFHdGxELElBQUksQ0FBQ3VsQixJQUFJLENBQUMsR0FBRyxDQUFDO0VBQzdCLElBQU11RCxNQUFNLEdBQUd2WSxpREFBSyxDQUFDdlEsSUFBSSxFQUFFcWxELE1BQU0sQ0FBQztFQUNsQyxJQUFNRSxZQUFZLEdBQUlQLE1BQU0sQ0FBQ00sTUFBTSxDQUFDLEdBQUdOLE1BQU0sQ0FBQ00sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFFO0VBQzVELElBQU1FLGFBQWEsR0FBSUQsWUFBWSxDQUFDbG9DLElBQUksQ0FBQyxHQUFHa29DLFlBQVksQ0FBQ2xvQyxJQUFJLENBQUMsSUFBSSxFQUFHO0VBQ3JFLElBQUlvb0MsUUFBUSxHQUFHLEtBQUs7RUFDcEIsS0FBSyxJQUFJbGxELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2lsRCxhQUFhLENBQUM5bEQsTUFBTSxFQUFFYSxDQUFDLEVBQUUsRUFBRTtJQUMzQyxJQUFJdWdCLGlEQUFNLENBQUNnSSxNQUFNLEVBQUUwOEIsYUFBYSxDQUFDamxELENBQUMsQ0FBQyxDQUFDdW9CLE1BQU0sQ0FBQyxFQUFFO01BQ3pDMjhCLFFBQVEsR0FBR0QsYUFBYSxDQUFDamxELENBQUMsQ0FBQztNQUMzQjtJQUNKO0VBQ0o7RUFDQSxJQUFJLENBQUNrbEQsUUFBUSxFQUFFO0lBQ1hBLFFBQVEsR0FBRztNQUFDemxELElBQUk7TUFBRThvQixNQUFNO01BQUVxOEIsU0FBUyxFQUFFO0lBQUUsQ0FBQztJQUN4Q0ssYUFBYSxDQUFDcmtELElBQUksQ0FBQ3NrRCxRQUFRLENBQUM7RUFDaEM7RUFDQUEsUUFBUSxDQUFDTixTQUFTLENBQUNoa0QsSUFBSSxDQUFDOGpELFVBQVUsQ0FBQztBQUN2QztBQUVBLFNBQVNTLG9CQUFvQkEsQ0FBQ0Msa0JBQWtCLEVBQUU5YixhQUFhLEVBQUU7RUFDN0QsSUFBTStiLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBTUMsT0FBTyxHQUFHLEVBQUU7RUFFbEJGLGtCQUFrQixDQUFDN2xELE9BQU8sQ0FBQyxVQUFBZ21ELEdBQUcsRUFBSTtJQUM5QixJQUFPNTRCLE1BQU0sR0FBb0I0NEIsR0FBRyxDQUE3QjU0QixNQUFNO01BQUVtckIsT0FBTyxHQUFXeU4sR0FBRyxDQUFyQnpOLE9BQU87TUFBRXBZLEtBQUssR0FBSTZsQixHQUFHLENBQVo3bEIsS0FBSztJQUM3QixJQUFJOGxCLFVBQVUsR0FBRyxJQUFJO0lBQ3JCLElBQUkxTixPQUFPLENBQUMzNEMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDMjRDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ3YyQyxFQUFFLElBQUksQ0FBQ3UyQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM1QixRQUFRLEVBQUU7TUFDaEVzUCxVQUFVLEdBQUcsS0FBSztJQUN0QjtJQUVBLElBQU0xbEMsSUFBSSxHQUNOLG9DQUFvQyxHQUNwQ2c0QixPQUFPLENBQUMvd0MsR0FBRyxDQUFDbTdDLDhEQUFnQixDQUFDLENBQUNsOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUU5QyxJQUFJLENBQUMySCxNQUFNLENBQUN4dEIsTUFBTSxFQUFFO01BQ2hCbXFDLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUMxQ3hwQixJQUFJLEVBQ0osZ0NBQWdDLEVBQ2hDLHFEQUFxRCxFQUNyRCxFQUFFLEVBQ0Ysa0RBQWtELEVBQ2xELHFEQUFxRCxDQUN4RCxDQUFDO0lBQ047SUFFQSxJQUFNODFCLElBQUksR0FBRyxDQUNULENBQUNrQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQ25CLENBQUNuckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUNqQixDQUFDK1MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUNuQjtJQUNEa1csSUFBSSxDQUFDcjJDLE9BQU8sQ0FBQyxVQUFBb0csSUFBQSxFQUFpQjtNQUFBLElBQUFDLEtBQUEsR0FBQS9GLGNBQUEsQ0FBQThGLElBQUE7UUFBZmlaLElBQUksR0FBQWhaLEtBQUE7UUFBRTYvQyxHQUFHLEdBQUE3L0MsS0FBQTtNQUNwQixJQUFJNi9DLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQ0QsVUFBVSxFQUFFO1FBQ2pDO1FBQ0E7UUFDQTtRQUNBO01BQ0o7TUFFQSxJQUFJLENBQUNubUQsS0FBSyxDQUFDMEIsT0FBTyxDQUFDNmQsSUFBSSxDQUFDLEVBQUU7UUFDdEIwcUIsYUFBYSxhQUFBbnJCLE1BQUEsQ0FBYXNuQyxHQUFHLDJCQUF3QixDQUNqRDNsQyxJQUFJLFNBQUEzQixNQUFBLENBQ0dzbkMsR0FBRyxvQkFDVm5zQixJQUFJLENBQUNDLFNBQVMsQ0FBQzNhLElBQUksQ0FBQyxFQUNwQiwyQkFBMkIsQ0FDOUIsQ0FBQztNQUNOO01BQ0FBLElBQUksQ0FBQ3JmLE9BQU8sQ0FBQyxVQUFDbW1ELE1BQU0sRUFBRTFsRCxDQUFDLEVBQUs7UUFDeEIybEQsV0FBVyxDQUFDRCxNQUFNLEVBQUU1bEMsSUFBSSxFQUFFMmxDLEdBQUcsRUFBRXpsRCxDQUFDLEVBQUVzcEMsYUFBYSxDQUFDO01BQ3BELENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGLElBQUlrYyxVQUFVLEVBQUU7TUFDWkksb0JBQW9CLENBQ2hCOU4sT0FBTyxFQUNQaDRCLElBQUksRUFDSndwQixhQUFhLEVBQ2IrYixPQUFPLEVBQ1BDLE9BQ0osQ0FBQztNQUNETyx1QkFBdUIsQ0FDbkIvTixPQUFPLEVBQ1BuckIsTUFBTSxFQUNOK1MsS0FBSyxFQUNMNWYsSUFBSSxFQUNKd3BCLGFBQ0osQ0FBQztJQUNMO0VBQ0osQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTcWMsV0FBV0EsQ0FBQTFLLEtBQUEsRUFBaUJuN0IsSUFBSSxFQUFFMmxDLEdBQUcsRUFBRXpsRCxDQUFDLEVBQUVzcEMsYUFBYSxFQUFFO0VBQUEsSUFBNUMvbkMsRUFBRSxHQUFBMDVDLEtBQUEsQ0FBRjE1QyxFQUFFO0lBQUUyMEMsUUFBUSxHQUFBK0UsS0FBQSxDQUFSL0UsUUFBUTtFQUM5QixJQUFJLE9BQU9BLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQ0EsUUFBUSxFQUFFO0lBQzNDNU0sYUFBYSxDQUFDLHlCQUF5QixFQUFFLENBQ3JDeHBCLElBQUksS0FBQTNCLE1BQUEsQ0FDRHNuQyxHQUFHLE9BQUF0bkMsTUFBQSxDQUFJbmUsQ0FBQyxtQkFBQW1lLE1BQUEsQ0FBZ0JtYixJQUFJLENBQUNDLFNBQVMsQ0FBQzJjLFFBQVEsQ0FBQyxHQUNuRCxzREFBc0QsQ0FDekQsQ0FBQztFQUNOO0VBRUEsSUFBSTczQyxPQUFBLENBQU9rRCxFQUFFLE1BQUssUUFBUSxFQUFFO0lBQ3hCLElBQUlxc0IsaURBQU8sQ0FBQ3JzQixFQUFFLENBQUMsRUFBRTtNQUNiK25DLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUN0Q3hwQixJQUFJLEtBQUEzQixNQUFBLENBQ0RzbkMsR0FBRyxPQUFBdG5DLE1BQUEsQ0FBSW5lLENBQUMsZ0JBQ1gsNkNBQTZDLENBQ2hELENBQUM7SUFDTjtJQUVBeWhCLGtEQUFpQixDQUFDLFVBQUN4QyxDQUFDLEVBQUV2ZixDQUFDLEVBQUs7TUFDeEIsSUFBSSxDQUFDQSxDQUFDLEVBQUU7UUFDSjRwQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsQ0FDeEN4cEIsSUFBSSxLQUFBM0IsTUFBQSxDQUNEc25DLEdBQUcsT0FBQXRuQyxNQUFBLENBQUluZSxDQUFDLHFCQUFBbWUsTUFBQSxDQUFpQnplLENBQUMsU0FDN0IsaUNBQWlDLENBQ3BDLENBQUM7TUFDTjtNQUVBLElBQUlyQixPQUFBLENBQU80Z0IsQ0FBQyxNQUFLLFFBQVEsSUFBSUEsQ0FBQyxDQUFDNGpDLElBQUksRUFBRTtRQUNqQyxJQUFJSyxnQkFBZ0IsQ0FBQ3VDLEdBQUcsQ0FBQyxDQUFDeG1DLENBQUMsQ0FBQzRqQyxJQUFJLENBQUMsS0FBSzVqQyxDQUFDLEVBQUU7VUFDckNxcUIsYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQ3hDeHBCLElBQUksS0FBQTNCLE1BQUEsQ0FDRHNuQyxHQUFHLE9BQUF0bkMsTUFBQSxDQUFJbmUsQ0FBQyxhQUFBbWUsTUFBQSxDQUFTemUsQ0FBQyxZQUFBeWUsTUFBQSxDQUFRYyxDQUFDLENBQUM0akMsSUFBSSw0QkFBQTFrQyxNQUFBLENBQ1ZzbkMsR0FBRyxhQUM1QmhtRCxrREFBSSxDQUFDeWpELGdCQUFnQixDQUFDdUMsR0FBRyxDQUFDLENBQUMsQ0FBQ3pnQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3pDLENBQUM7UUFDTjtNQUNKLENBQUMsTUFBTSxJQUFJLENBQUM5QyxrREFBUSxDQUFBN2pCLE9BQUEsQ0FBUTRnQixDQUFDLEdBQUVxa0MsZ0JBQWdCLENBQUMsRUFBRTtRQUM5Q2hhLGFBQWEsQ0FBQyw0QkFBNEIsRUFBRSxDQUN4Q3hwQixJQUFJLEtBQUEzQixNQUFBLENBQ0RzbkMsR0FBRyxPQUFBdG5DLE1BQUEsQ0FBSW5lLENBQUMsYUFBQW1lLE1BQUEsQ0FBU3plLENBQUMsWUFBQXllLE1BQUEsQ0FBUW1iLElBQUksQ0FBQ0MsU0FBUyxDQUFDdGEsQ0FBQyxDQUFDLEdBQzlDLHNEQUFzRCxFQUN0RCxxQ0FBcUMsRUFDckNxa0MsZ0JBQWdCLENBQUN0K0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO01BQ047SUFDSixDQUFDLEVBQUV6akIsRUFBRSxDQUFDO0VBQ1YsQ0FBQyxNQUFNLElBQUksT0FBT0EsRUFBRSxLQUFLLFFBQVEsRUFBRTtJQUMvQixJQUFJLENBQUNBLEVBQUUsRUFBRTtNQUNMK25DLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUN0Q3hwQixJQUFJLEtBQUEzQixNQUFBLENBQ0RzbkMsR0FBRyxPQUFBdG5DLE1BQUEsQ0FBSW5lLENBQUMsZUFBQW1lLE1BQUEsQ0FBVzVjLEVBQUUsU0FDeEIsNkNBQTZDLENBQ2hELENBQUM7SUFDTjtJQUNBLElBQU11a0QsWUFBWSxHQUFHdkMsY0FBYyxDQUFDOWhELE1BQU0sQ0FBQyxVQUFBb2xCLENBQUM7TUFBQSxPQUFJM0Usa0RBQVEsQ0FBQzJFLENBQUMsRUFBRXRsQixFQUFFLENBQUM7SUFBQSxFQUFDO0lBQ2hFLElBQUl1a0QsWUFBWSxDQUFDM21ELE1BQU0sRUFBRTtNQUNyQm1xQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsQ0FDeEN4cEIsSUFBSSxLQUFBM0IsTUFBQSxDQUNEc25DLEdBQUcsT0FBQXRuQyxNQUFBLENBQUluZSxDQUFDLGNBQUFtZSxNQUFBLENBQVc1YyxFQUFFLHVCQUFBNGMsTUFBQSxDQUNUMm5DLFlBQVksQ0FBQzlnQyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUMzQyxDQUFDO0lBQ047RUFDSixDQUFDLE1BQU07SUFDSHNrQixhQUFhLENBQUMsd0JBQXdCLEVBQUUsQ0FDcEN4cEIsSUFBSSxLQUFBM0IsTUFBQSxDQUNEc25DLEdBQUcsT0FBQXRuQyxNQUFBLENBQUluZSxDQUFDLGFBQUFtZSxNQUFBLENBQVVtYixJQUFJLENBQUNDLFNBQVMsQ0FBQ2g0QixFQUFFLENBQUMsR0FDdkMscURBQXFELENBQ3hELENBQUM7RUFDTjtBQUNKO0FBRUEsU0FBU3FrRCxvQkFBb0JBLENBQUM5TixPQUFPLEVBQUVoNEIsSUFBSSxFQUFFd3BCLGFBQWEsRUFBRStiLE9BQU8sRUFBRUMsT0FBTyxFQUFFO0VBQzFFLElBQU1TLGFBQWEsR0FBRyxDQUFDLENBQUM7RUFDeEIsSUFBTUMsYUFBYSxHQUFHLEVBQUU7RUFDeEJsTyxPQUFPLENBQUN2NEMsT0FBTyxDQUFDLFVBQUFtOEMsS0FBQSxFQUFpQjE3QyxDQUFDLEVBQUs7SUFBQSxJQUFyQnVCLEVBQUUsR0FBQW02QyxLQUFBLENBQUZuNkMsRUFBRTtNQUFFMjBDLFFBQVEsR0FBQXdGLEtBQUEsQ0FBUnhGLFFBQVE7SUFDMUIsSUFBSSxPQUFPMzBDLEVBQUUsS0FBSyxRQUFRLEVBQUU7TUFDeEIsSUFBTW1rRCxNQUFNLEdBQUd4RCxrRUFBZ0IsQ0FBQztRQUFDM2dELEVBQUU7UUFBRTIwQztNQUFRLENBQUMsQ0FBQztNQUMvQyxJQUFJNlAsYUFBYSxDQUFDTCxNQUFNLENBQUMsRUFBRTtRQUN2QnBjLGFBQWEsQ0FBQyw0QkFBNEIsRUFBRSxDQUN4Q3hwQixJQUFJLFlBQUEzQixNQUFBLENBQ01uZSxDQUFDLFFBQUFtZSxNQUFBLENBQUt1bkMsTUFBTSx5Q0FDekIsQ0FBQztNQUNOLENBQUMsTUFBTSxJQUFJTCxPQUFPLENBQUNLLE1BQU0sQ0FBQyxFQUFFO1FBQ3hCcGMsYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQ3hDeHBCLElBQUksWUFBQTNCLE1BQUEsQ0FDTW5lLENBQUMsUUFBQW1lLE1BQUEsQ0FBS3VuQyxNQUFNLDJCQUN0QixnREFBZ0QsRUFDaEQsZ0RBQWdELEVBQ2hELG1EQUFtRCxFQUNuRCxnREFBZ0QsQ0FDbkQsQ0FBQztNQUNOLENBQUMsTUFBTTtRQUNISyxhQUFhLENBQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUM7TUFDN0I7SUFDSixDQUFDLE1BQU07TUFDSCxJQUFNTyxLQUFLLEdBQUc7UUFBQzFrRCxFQUFFO1FBQUUyMEM7TUFBUSxDQUFDO01BQzVCLElBQU1nUSxXQUFXLEdBQUdDLGVBQWUsQ0FBQ0YsS0FBSyxFQUFFRCxhQUFhLENBQUM7TUFDekQsSUFBTUksWUFBWSxHQUFHRixXQUFXLElBQUlDLGVBQWUsQ0FBQ0YsS0FBSyxFQUFFWCxPQUFPLENBQUM7TUFDbkUsSUFBSVksV0FBVyxJQUFJRSxZQUFZLEVBQUU7UUFDN0IsSUFBTVYsT0FBTSxHQUFHeEQsa0VBQWdCLENBQUMrRCxLQUFLLENBQUM7UUFDdEMsSUFBTUksT0FBTyxHQUFHbkUsa0VBQWdCLENBQUNnRSxXQUFXLElBQUlFLFlBQVksQ0FBQztRQUM3RDljLGFBQWEsQ0FBQyx1Q0FBdUMsRUFBRSxDQUNuRHhwQixJQUFJLFlBQUEzQixNQUFBLENBQ01uZSxDQUFDLFFBQUFtZSxNQUFBLENBQUt1bkMsT0FBTSxvQ0FBQXZuQyxNQUFBLENBQ01rb0MsT0FBTyxtQkFBQWxvQyxNQUFBLENBQ3hCK25DLFdBQVcsR0FBRyxNQUFNLEdBQUcsYUFBYSxnQkFDbEQsQ0FBQztNQUNOLENBQUMsTUFBTTtRQUNIRixhQUFhLENBQUNwbEQsSUFBSSxDQUFDcWxELEtBQUssQ0FBQztNQUM3QjtJQUNKO0VBQ0osQ0FBQyxDQUFDO0VBQ0Z4bUQsa0RBQUksQ0FBQ3NtRCxhQUFhLENBQUMsQ0FBQ3htRCxPQUFPLENBQUMsVUFBQUcsQ0FBQyxFQUFJO0lBQzdCMmxELE9BQU8sQ0FBQzNsRCxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQ2xCLENBQUMsQ0FBQztFQUNGc21ELGFBQWEsQ0FBQ3ptRCxPQUFPLENBQUMsVUFBQTBtRCxLQUFLLEVBQUk7SUFDM0JYLE9BQU8sQ0FBQzFrRCxJQUFJLENBQUNxbEQsS0FBSyxDQUFDO0VBQ3ZCLENBQUMsQ0FBQztBQUNOO0FBRUEsU0FBU0ssaUJBQWlCQSxDQUFDam5DLEdBQUcsRUFBRXNOLE1BQU0sRUFBRTtFQUNwQyxJQUFXNDVCLEtBQUssR0FBdUJsbkMsR0FBRyxDQUFuQzlkLEVBQUU7SUFBbUJpbEQsT0FBTyxHQUFJbm5DLEdBQUcsQ0FBeEI2MkIsUUFBUTtFQUMxQixPQUFPdnBCLE1BQU0sQ0FBQzRILElBQUksQ0FBQyxVQUFBa3lCLEdBQUcsRUFBSTtJQUN0QixJQUFXQyxJQUFJLEdBQXNCRCxHQUFHLENBQWpDbGxELEVBQUU7TUFBa0JvbEQsTUFBTSxHQUFJRixHQUFHLENBQXZCdlEsUUFBUTtJQUN6QixJQUFJc1EsT0FBTyxLQUFLRyxNQUFNLElBQUl0b0QsT0FBQSxDQUFPa29ELEtBQUssTUFBQWxvRCxPQUFBLENBQVlxb0QsSUFBSSxHQUFFO01BQ3BELE9BQU8sS0FBSztJQUNoQjtJQUNBLElBQUksT0FBT0gsS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUMzQixJQUFJQSxLQUFLLEtBQUtHLElBQUksRUFBRTtRQUNoQixPQUFPLElBQUk7TUFDZjtJQUNKLENBQUMsTUFBTSxJQUFJUCxlQUFlLENBQUNNLEdBQUcsRUFBRSxDQUFDcG5DLEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFDcEMsT0FBTyxJQUFJO0lBQ2Y7SUFDQSxPQUFPLEtBQUs7RUFDaEIsQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTd21DLHVCQUF1QkEsQ0FBQy9OLE9BQU8sRUFBRW5yQixNQUFNLEVBQUUrUyxLQUFLLEVBQUU1ZixJQUFJLEVBQUV3cEIsYUFBYSxFQUFFO0VBQzFFLElBQUFzZCxpQkFBQSxHQUFtQ0MsZ0JBQWdCLENBQy9DL08sT0FBTyxDQUFDMzRDLE1BQU0sR0FBRzI0QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUN2MkMsRUFBRSxHQUFHbEIsU0FDckMsQ0FBQztJQUZpQnltRCxhQUFhLEdBQUFGLGlCQUFBLENBQXhCRyxTQUFTO0VBR2hCalAsT0FBTyxDQUFDdjRDLE9BQU8sQ0FBQyxVQUFDOGYsR0FBRyxFQUFFcmYsQ0FBQyxFQUFLO0lBQ3hCLElBQUlBLENBQUMsSUFBSSxDQUFDdWdCLGlEQUFNLENBQUNzbUMsZ0JBQWdCLENBQUN4bkMsR0FBRyxDQUFDOWQsRUFBRSxDQUFDLENBQUN3bEQsU0FBUyxFQUFFRCxhQUFhLENBQUMsRUFBRTtNQUNqRXhkLGFBQWEsQ0FBQywrQ0FBK0MsRUFBRSxDQUMzRHhwQixJQUFJLFlBQUEzQixNQUFBLENBQ01uZSxDQUFDLFFBQUFtZSxNQUFBLENBQUsrakMsa0VBQWdCLENBQUM3aUMsR0FBRyxDQUFDLFFBQ3JDLG1EQUFtRCxlQUFBbEIsTUFBQSxDQUN0QytqQyxrRUFBZ0IsQ0FBQ3BLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUN6QywyREFBMkQsRUFDM0QsMkNBQTJDLENBQzlDLENBQUM7SUFDTjtFQUNKLENBQUMsQ0FBQztFQUNGLENBQ0ksQ0FBQ25yQixNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQ2pCLENBQUMrUyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQ25CLENBQUNuZ0MsT0FBTyxDQUFDLFVBQUFvOEMsS0FBQSxFQUFpQjtJQUFBLElBQUFnQixLQUFBLEdBQUE5OEMsY0FBQSxDQUFBODdDLEtBQUE7TUFBZi84QixJQUFJLEdBQUErOUIsS0FBQTtNQUFFOEksR0FBRyxHQUFBOUksS0FBQTtJQUNqQi85QixJQUFJLENBQUNyZixPQUFPLENBQUMsVUFBQ2kvQixHQUFHLEVBQUV4K0IsQ0FBQyxFQUFLO01BQ3JCLElBQUFnbkQsa0JBQUEsR0FBb0NILGdCQUFnQixDQUFDcm9CLEdBQUcsQ0FBQ2o5QixFQUFFLENBQUM7UUFBckR3bEQsU0FBUyxHQUFBQyxrQkFBQSxDQUFURCxTQUFTO1FBQUVFLGNBQWMsR0FBQUQsa0JBQUEsQ0FBZEMsY0FBYztNQUNoQyxJQUFNQyxlQUFlLEdBQUdILFNBQVMsQ0FBQzVvQyxNQUFNLENBQUM4b0MsY0FBYyxDQUFDO01BQ3hELElBQU1uekIsSUFBSSxHQUFHenZCLGtEQUFVLENBQUM2aUQsZUFBZSxFQUFFSixhQUFhLENBQUM7TUFDdkQsSUFBSWh6QixJQUFJLENBQUMzMEIsTUFBTSxFQUFFO1FBQ2IyMEIsSUFBSSxDQUFDMUksSUFBSSxDQUFDLENBQUM7UUFDWGtlLGFBQWEsQ0FBQyw4Q0FBOEMsRUFBRSxDQUMxRHhwQixJQUFJLEtBQUEzQixNQUFBLENBQ0RzbkMsR0FBRyxPQUFBdG5DLE1BQUEsQ0FBSW5lLENBQUMsUUFBQW1lLE1BQUEsQ0FBSytqQyxrRUFBZ0IsQ0FBQzFqQixHQUFHLENBQUMsNkNBQUFyZ0IsTUFBQSxDQUNBMlYsSUFBSSxDQUFDOU8sSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBQTdHLE1BQUEsQ0FDakMrakMsa0VBQWdCLENBQUNwSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFDL0MseURBQXlELEVBQ3pELDJEQUEyRCxFQUMzRCw4QkFBOEIsQ0FDakMsQ0FBQztNQUNOO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQyxDQUFDO0FBQ047QUFFQSxJQUFNcVAsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFBdkssS0FBQSxFQUFlO0VBQUEsSUFBQUMsS0FBQSxHQUFBaDlDLGNBQUEsQ0FBQSs4QyxLQUFBO0lBQVYvK0IsQ0FBQyxHQUFBZy9CLEtBQUE7SUFBRS8rQixDQUFDLEdBQUErK0IsS0FBQTtFQUN4QixJQUFNdUssS0FBSyxHQUFHdnBDLENBQUMsSUFBSUEsQ0FBQyxDQUFDZ2xDLElBQUk7RUFDekIsSUFBTXdFLEtBQUssR0FBR3ZwQyxDQUFDLElBQUlBLENBQUMsQ0FBQytrQyxJQUFJO0VBQ3pCLElBQUl1RSxLQUFLLElBQUlDLEtBQUssRUFBRTtJQUNoQjtJQUNBLE9BQU8sRUFDRnhwQyxDQUFDLEtBQUtpbEMsS0FBSyxJQUFJaGxDLENBQUMsS0FBS2lsQyxVQUFVLElBQy9CbGxDLENBQUMsS0FBS2tsQyxVQUFVLElBQUlqbEMsQ0FBQyxLQUFLZ2xDLEtBQU0sQ0FDcEM7RUFDTDtFQUNBLE9BQU9qbEMsQ0FBQyxLQUFLQyxDQUFDLElBQUlzcEMsS0FBSyxJQUFJQyxLQUFLO0FBQ3BDLENBQUM7QUFFRCxTQUFTbEIsZUFBZUEsQ0FBQXJKLEtBQUEsRUFBaUI1RixJQUFJLEVBQUU7RUFBQSxJQUFyQjMxQyxFQUFFLEdBQUF1N0MsS0FBQSxDQUFGdjdDLEVBQUU7SUFBRTIwQyxRQUFRLEdBQUE0RyxLQUFBLENBQVI1RyxRQUFRO0VBQ2xDLElBQU1vUixNQUFNLEdBQUc3bkQsa0RBQUksQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDNnBCLElBQUksQ0FBQyxDQUFDO0VBQzlCLElBQU1tOEIsTUFBTSxHQUFHdjNDLGlEQUFLLENBQUNzM0MsTUFBTSxFQUFFL2xELEVBQUUsQ0FBQztFQUFDLElBQUFpRSxTQUFBLEdBQUFnaUQsMEJBQUEsQ0FDZnRRLElBQUk7SUFBQXh4QyxLQUFBO0VBQUE7SUFBdEIsS0FBQUYsU0FBQSxDQUFBOEMsQ0FBQSxNQUFBNUMsS0FBQSxHQUFBRixTQUFBLENBQUF3ZCxDQUFBLElBQUFyaUIsSUFBQSxHQUF3QjtNQUFBLElBQWJvYyxHQUFHLEdBQUFyWCxLQUFBLENBQUE3RSxLQUFBO01BQ1YsSUFBVzRtRCxHQUFHLEdBQXlCMXFDLEdBQUcsQ0FBbkN4YixFQUFFO1FBQWlCbW1ELFNBQVMsR0FBSTNxQyxHQUFHLENBQTFCbTVCLFFBQVE7TUFDeEIsSUFDSXdSLFNBQVMsS0FBS3hSLFFBQVEsSUFDdEIsT0FBT3VSLEdBQUcsS0FBSyxRQUFRLElBQ3ZCbG5DLGlEQUFNLENBQUM5Z0Isa0RBQUksQ0FBQ2dvRCxHQUFHLENBQUMsQ0FBQ3I4QixJQUFJLENBQUMsQ0FBQyxFQUFFazhCLE1BQU0sQ0FBQyxJQUNoQzVyQyxrREFBRyxDQUFDeXJDLGFBQWEsRUFBRWwxQixrREFBRyxDQUFDczFCLE1BQU0sRUFBRXYzQyxpREFBSyxDQUFDczNDLE1BQU0sRUFBRUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNyRDtRQUNFLE9BQU8xcUMsR0FBRztNQUNkO0lBQ0o7RUFBQyxTQUFBamMsR0FBQTtJQUFBMEUsU0FBQSxDQUFBdkIsQ0FBQSxDQUFBbkQsR0FBQTtFQUFBO0lBQUEwRSxTQUFBLENBQUFnWCxDQUFBO0VBQUE7RUFDRCxPQUFPLEtBQUs7QUFDaEI7QUFFTyxTQUFTbXJDLHlCQUF5QkEsQ0FBQ0MsTUFBTSxFQUFFdGUsYUFBYSxFQUFFO0VBQzdELElBQU9rQixNQUFNLEdBQTRDb2QsTUFBTSxDQUF4RHBkLE1BQU07SUFBRXlCLE1BQU0sR0FBb0MyYixNQUFNLENBQWhEM2IsTUFBTTtJQUFVNGIsT0FBTyxHQUFtQkQsTUFBTSxDQUF4QzE5QyxNQUFNO0lBQWtCNDlDLE1BQU0sR0FBSUYsTUFBTSxDQUF2QmxTLEtBQUs7RUFDN0MsSUFBTXFTLFdBQVcsR0FBRyxDQUFDdmQsTUFBTSxDQUFDcVEsNEJBQTRCO0VBQ3hELElBQUkzd0MsTUFBTSxFQUFFd3JDLEtBQUs7RUFDakIsSUFBSXFTLFdBQVcsSUFBSXZkLE1BQU0sQ0FBQ3dkLGlCQUFpQixFQUFFO0lBQ3pDOTlDLE1BQU0sR0FBR3NnQyxNQUFNLENBQUN3ZCxpQkFBaUI7SUFDakN0UyxLQUFLLEdBQUc5TCxvREFBWSxDQUFDMS9CLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFNDlDLE1BQU0sQ0FBQy9jLE1BQU0sQ0FBQztFQUN6RCxDQUFDLE1BQU07SUFDSDdnQyxNQUFNLEdBQUcyOUMsT0FBTztJQUNoQm5TLEtBQUssR0FBR29TLE1BQU07RUFDbEI7RUFDQSxJQUFPRyxTQUFTLEdBQTZDaGMsTUFBTSxDQUE1RGdjLFNBQVM7SUFBRUMsUUFBUSxHQUFtQ2pjLE1BQU0sQ0FBakRpYyxRQUFRO0lBQUVDLGNBQWMsR0FBbUJsYyxNQUFNLENBQXZDa2MsY0FBYztJQUFFQyxhQUFhLEdBQUluYyxNQUFNLENBQXZCbWMsYUFBYTtFQUV6RCxTQUFTcm9DLElBQUlBLENBQUM2a0MsU0FBUyxFQUFFO0lBQ3JCLE9BQ0ksd0RBQXdELEdBQ3hEQSxTQUFTLENBQ0o3OUMsR0FBRyxDQUFDLFVBQUFrNEMsS0FBQTtNQUFBLElBQUVuSCxPQUFPLEdBQUFtSCxLQUFBLENBQVBuSCxPQUFPO01BQUEsT0FBTUEsT0FBTyxDQUFDL3dDLEdBQUcsQ0FBQ203Qyw4REFBZ0IsQ0FBQyxDQUFDbDlCLElBQUksQ0FBQyxJQUFJLENBQUM7SUFBQSxFQUFDLENBQzVEQSxJQUFJLENBQUMsTUFBTSxDQUFDO0VBRXpCO0VBRUEsU0FBU3FqQyxTQUFTQSxDQUFDOW1ELEVBQUUsRUFBRWtrRCxHQUFHLEVBQUViLFNBQVMsRUFBRTtJQUNuQ3RiLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxxQ0FBQW5yQixNQUFBLENBQ0FzbkMsR0FBRyxpQ0FBQXRuQyxNQUFBLENBQ2pDbzBCLFdBQVcsQ0FBQ2h4QyxFQUFFLENBQUMsU0FDckIscURBQXFELEVBQ3JELEVBQUUsRUFDRix1REFBdUQsRUFDdkQsd0RBQXdELEVBQ3hELDZEQUE2RCxFQUM3RCxzQ0FBc0MsRUFDdEN3ZSxJQUFJLENBQUM2a0MsU0FBUyxDQUFDLENBQ2xCLENBQUM7RUFDTjtFQUVBLFNBQVMwRCxZQUFZQSxDQUFDL21ELEVBQUUsRUFBRWduRCxNQUFNLEVBQUVDLE9BQU8sRUFBRS9DLEdBQUcsRUFBRWIsU0FBUyxFQUFFO0lBQ3ZELElBQU05bkMsSUFBSSxHQUFHMHJDLE9BQU8sQ0FBQ3IzQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQU0xZSxTQUFTLEdBQUdvRSxrREFBSSxDQUFDMHhDLE1BQU0sRUFBRXIrQyxNQUFNLENBQUM7SUFDdEMsSUFBTSthLE9BQU8sR0FBR3k5QixpREFBUSxDQUFDamEsT0FBTyxDQUFDaDJCLFNBQVMsQ0FBQzs7SUFFM0M7SUFDQSxJQUFJd1MsT0FBTyxJQUFJQSxPQUFPLENBQUN5bkIsU0FBUyxJQUFJLENBQUN6bkIsT0FBTyxDQUFDeW5CLFNBQVMsQ0FBQzV2QixJQUFJLENBQUMsRUFBRTtNQUMxRDtNQUNBLEtBQUssSUFBTXErQixRQUFRLElBQUlsMkIsT0FBTyxDQUFDeW5CLFNBQVMsRUFBRTtRQUN0QyxJQUFNOUosSUFBSSxHQUFHdVksUUFBUSxDQUFDaDhDLE1BQU0sR0FBRyxDQUFDO1FBQ2hDLElBQ0lnOEMsUUFBUSxDQUFDNXhCLE1BQU0sQ0FBQ3FaLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFDN0I5bEIsSUFBSSxDQUFDeTBCLE1BQU0sQ0FBQyxDQUFDLEVBQUUzTyxJQUFJLENBQUMsS0FBS3VZLFFBQVEsQ0FBQzVKLE1BQU0sQ0FBQyxDQUFDLEVBQUUzTyxJQUFJLENBQUMsRUFDbkQ7VUFDRTtRQUNKO01BQ0o7TUFDQSxJQUFPaGlCLElBQUksR0FBZW5PLFNBQVMsQ0FBNUJtTyxJQUFJO1FBQUV3M0IsU0FBUyxHQUFJM2xDLFNBQVMsQ0FBdEIybEMsU0FBUztNQUN0QjlPLGFBQWEsQ0FBQyxpQ0FBaUMsRUFBRSxlQUFBbnJCLE1BQUEsQ0FDaENyQixJQUFJLDBDQUFBcUIsTUFBQSxDQUNabWIsSUFBSSxDQUFDQyxTQUFTLENBQUNoNEIsRUFBRSxDQUFDLG9CQUFBNGMsTUFBQSxDQUNOc25DLEdBQUcsd0RBQUF0bkMsTUFBQSxDQUNRaTZCLFNBQVMsT0FBQWo2QixNQUFBLENBQUl5QyxJQUFJLGlCQUM3QyxzREFBc0QsRUFDdERiLElBQUksQ0FBQzZrQyxTQUFTLENBQUMsQ0FDbEIsQ0FBQztJQUNOO0VBQ0o7RUFFQSxTQUFTNkQscUJBQXFCQSxDQUFDbG5ELEVBQUUsRUFBRTIwQyxRQUFRLEVBQUV1UCxHQUFHLEVBQUViLFNBQVMsRUFBRTtJQUN6RHBDLDZEQUFXLENBQUMsQ0FBQyxDQUFDOU0sS0FBSyxDQUFDLENBQUM7TUFBQ24wQyxFQUFFO01BQUUyMEM7SUFBUSxDQUFDLENBQUMsQ0FBQzMyQyxPQUFPLENBQUMsVUFBQWdtRCxHQUFHLEVBQUk7TUFDaEQsSUFBV21ELFVBQVUsR0FBa0JuRCxHQUFHLENBQW5DaGtELEVBQUU7UUFBb0JnbkQsTUFBTSxHQUFJaEQsR0FBRyxDQUFuQjF1QyxJQUFJO01BQzNCeXhDLFlBQVksQ0FBQ0ksVUFBVSxFQUFFSCxNQUFNLEVBQUVyUyxRQUFRLEVBQUV1UCxHQUFHLEVBQUViLFNBQVMsQ0FBQztJQUM5RCxDQUFDLENBQUM7RUFDTjtFQUVBLElBQU0rRCwwQkFBMEIsR0FBRyxDQUFDLENBQUM7RUFFckMsU0FBU0MsYUFBYUEsQ0FBQzVsQixRQUFRLEVBQUU7SUFDN0IsSUFBT3RELEtBQUssR0FBWXNELFFBQVEsQ0FBekJ0RCxLQUFLO01BQUVqVyxNQUFNLEdBQUl1WixRQUFRLENBQWxCdlosTUFBTTs7SUFFcEI7SUFDQSxJQUFJay9CLDBCQUEwQixDQUFDbC9CLE1BQU0sQ0FBQyxFQUFFO01BQ3BDO0lBQ0o7SUFDQWsvQiwwQkFBMEIsQ0FBQ2wvQixNQUFNLENBQUMsR0FBRyxDQUFDO0lBRXRDLElBQU1nOEIsR0FBRyxHQUFHLE9BQU87SUFFbkIvbEIsS0FBSyxDQUFDbmdDLE9BQU8sQ0FBQyxVQUFBcWdELEtBQUEsRUFBb0I7TUFBQSxJQUFsQnIrQyxFQUFFLEdBQUFxK0MsS0FBQSxDQUFGcitDLEVBQUU7UUFBRTIwQyxRQUFRLEdBQUEwSixLQUFBLENBQVIxSixRQUFRO01BQ3hCLElBQUksT0FBTzMwQyxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQ3hCLElBQU1nbkQsTUFBTSxHQUFHelYsK0NBQU8sQ0FBQzRDLEtBQUssRUFBRW4wQyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDZ25ELE1BQU0sRUFBRTtVQUNULElBQUlSLFdBQVcsRUFBRTtZQUNiTSxTQUFTLENBQUM5bUQsRUFBRSxFQUFFa2tELEdBQUcsRUFBRSxDQUFDemlCLFFBQVEsQ0FBQyxDQUFDO1VBQ2xDO1FBQ0osQ0FBQyxNQUFNO1VBQ0hzbEIsWUFBWSxDQUFDL21ELEVBQUUsRUFBRWduRCxNQUFNLEVBQUVyUyxRQUFRLEVBQUV1UCxHQUFHLEVBQUUsQ0FBQ3ppQixRQUFRLENBQUMsQ0FBQztRQUN2RDtNQUNKO01BQ0E7TUFDQTtNQUFBLEtBQ0ssSUFBSSxDQUFDNy9CLGtEQUFZLENBQUMsQ0FBQzIvQyxLQUFLLEVBQUVDLFVBQVUsQ0FBQyxFQUFFeDZCLGtEQUFNLENBQUNobkIsRUFBRSxDQUFDLENBQUMsQ0FBQ3BDLE1BQU0sRUFBRTtRQUM1RHNwRCxxQkFBcUIsQ0FBQ2xuRCxFQUFFLEVBQUUyMEMsUUFBUSxFQUFFdVAsR0FBRyxFQUFFLENBQUN6aUIsUUFBUSxDQUFDLENBQUM7TUFDeEQ7SUFDSixDQUFDLENBQUM7RUFDTjtFQUVBLFNBQVM2bEIsV0FBV0EsQ0FBQzloRCxHQUFHLEVBQUUwK0MsR0FBRyxFQUFFcUQsT0FBTyxFQUFFO0lBQ3BDLEtBQUssSUFBTXZuRCxFQUFFLElBQUl3RixHQUFHLEVBQUU7TUFDbEIsSUFBTTR1QyxPQUFPLEdBQUc1dUMsR0FBRyxDQUFDeEYsRUFBRSxDQUFDO01BQ3ZCLElBQU1nbkQsTUFBTSxHQUFHelYsK0NBQU8sQ0FBQzRDLEtBQUssRUFBRW4wQyxFQUFFLENBQUM7TUFDakMsSUFBSSxDQUFDZ25ELE1BQU0sRUFBRTtRQUNULElBQUlSLFdBQVcsRUFBRTtVQUNiTSxTQUFTLENBQUM5bUQsRUFBRSxFQUFFa2tELEdBQUcsRUFBRWxrQyxrREFBTyxDQUFDZ0gsa0RBQU0sQ0FBQ290QixPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hEO01BQ0osQ0FBQyxNQUFNO1FBQ0gsS0FBSyxJQUFNTyxRQUFRLElBQUlQLE9BQU8sRUFBRTtVQUM1QixJQUFNaVAsU0FBUyxHQUFHalAsT0FBTyxDQUFDTyxRQUFRLENBQUM7VUFDbkNvUyxZQUFZLENBQUMvbUQsRUFBRSxFQUFFZ25ELE1BQU0sRUFBRXJTLFFBQVEsRUFBRXVQLEdBQUcsRUFBRWIsU0FBUyxDQUFDO1VBQ2xELElBQUlrRSxPQUFPLEVBQUU7WUFDVDtZQUNBO1lBQ0FsRSxTQUFTLENBQUNybEQsT0FBTyxDQUFDcXBELGFBQWEsQ0FBQztVQUNwQztRQUNKO01BQ0o7SUFDSjtFQUNKO0VBRUFDLFdBQVcsQ0FBQ1osU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7RUFDdENZLFdBQVcsQ0FBQ1gsUUFBUSxFQUFFLE9BQU8sQ0FBQztFQUU5QixTQUFTYSxnQkFBZ0JBLENBQUNDLFFBQVEsRUFBRXZELEdBQUcsRUFBRXFELE9BQU8sRUFBRTtJQUM5QyxLQUFLLElBQU0vRCxNQUFNLElBQUlpRSxRQUFRLEVBQUU7TUFDM0IsSUFBTUMsV0FBVyxHQUFHRCxRQUFRLENBQUNqRSxNQUFNLENBQUM7TUFBQyxJQUFBbmlELEtBQUEsWUFBQUEsTUFBQXN6QyxRQUFBLEVBQ0Q7UUFDaEMrUyxXQUFXLENBQUMvUyxRQUFRLENBQUMsQ0FBQzMyQyxPQUFPLENBQUMsVUFBQWs2QyxNQUFBLEVBQStCO1VBQUEsSUFBN0JoNkMsSUFBSSxHQUFBZzZDLE1BQUEsQ0FBSmg2QyxJQUFJO1lBQUU4b0IsTUFBTSxHQUFBa3hCLE1BQUEsQ0FBTmx4QixNQUFNO1lBQUVxOEIsU0FBUyxHQUFBbkwsTUFBQSxDQUFUbUwsU0FBUztVQUNuRCxJQUFNcmpELEVBQUUsR0FBRzR3QixrREFBTSxDQUFDMXlCLElBQUksRUFBRThvQixNQUFNLENBQUM7VUFDL0JrZ0MscUJBQXFCLENBQUNsbkQsRUFBRSxFQUFFMjBDLFFBQVEsRUFBRXVQLEdBQUcsRUFBRWIsU0FBUyxDQUFDO1VBQ25ELElBQUlrRSxPQUFPLEVBQUU7WUFDVGxFLFNBQVMsQ0FBQ3JsRCxPQUFPLENBQUNxcEQsYUFBYSxDQUFDO1VBQ3BDO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQztNQVJELEtBQUssSUFBTTFTLFFBQVEsSUFBSStTLFdBQVc7UUFBQXJtRCxLQUFBLENBQUFzekMsUUFBQTtNQUFBO0lBU3RDO0VBQ0o7RUFFQTZTLGdCQUFnQixDQUFDWixjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztFQUNoRFksZ0JBQWdCLENBQUNYLGFBQWEsRUFBRSxPQUFPLENBQUM7QUFDNUM7QUFFTyxTQUFTdmUsYUFBYUEsQ0FBQ2xRLFlBQVksRUFBRTJQLGFBQWEsRUFBRTtFQUN2RDtFQUNBLElBQU00ZixVQUFVLEdBQUcsSUFBSWxILHNEQUFRLENBQUMsQ0FBQztFQUVqQyxJQUFNbUgsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0VBRS9CLElBQU1DLE1BQU0sR0FBR3JpRCxpREFBRyxDQUFDeVosa0RBQU0sQ0FBQztJQUFDamYsRUFBRSxFQUFFdWlEO0VBQWUsQ0FBQyxDQUFDLENBQUM7RUFDakQsSUFBTXNCLGtCQUFrQixHQUFHcitDLGlEQUFHLENBQUMsVUFBQXcrQyxHQUFHLEVBQUk7SUFDbEMsSUFBTzk3QixNQUFNLEdBQWU4N0IsR0FBRyxDQUF4Qjk3QixNQUFNO01BQUU0L0IsU0FBUyxHQUFJOUQsR0FBRyxDQUFoQjhELFNBQVM7SUFDeEIsSUFBTWhxQyxHQUFHLEdBQUdtQixrREFBTSxDQUFDO01BQUNtTSxNQUFNLEVBQUV5OEIsTUFBTTtNQUFFMXBCLEtBQUssRUFBRTBwQjtJQUFNLENBQUMsRUFBRTdELEdBQUcsQ0FBQztJQUN4RCxJQUFJOEQsU0FBUyxFQUFFO01BQ1g7TUFDQWhxQyxHQUFHLENBQUN5NEIsT0FBTyxHQUFHLEVBQUU7TUFDaEJ6NEIsR0FBRyxDQUFDaXFDLFFBQVEsR0FBRyxJQUFJO0lBQ3ZCLENBQUMsTUFBTTtNQUNIanFDLEdBQUcsQ0FBQ3k0QixPQUFPLEdBQUcvd0MsaURBQUcsQ0FDYixVQUFBNHlDLElBQUk7UUFBQSxPQUFJOThCLGtEQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSttQyxjQUFjLENBQUNqSyxJQUFJLENBQUMsQ0FBQztNQUFBLEdBQ2hEbkgsaUJBQWlCLENBQUMvb0IsTUFBTSxDQUFDLEdBQ25CaTZCLG9CQUFvQixDQUFDajZCLE1BQU0sQ0FBQyxHQUM1QixDQUFDQSxNQUFNLENBQ2pCLENBQUM7SUFDTDtJQUVBLE9BQU9wSyxHQUFHO0VBQ2QsQ0FBQyxFQUFFc2EsWUFBWSxDQUFDO0VBRWhCLElBQUk0UyxRQUFRLEdBQUcsS0FBSztFQUNwQixJQUFNZ2QsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUlsaEMsT0FBTyxFQUFFbWhDLEtBQUssRUFBSztJQUNsQ2pkLFFBQVEsR0FBRyxJQUFJO0lBQ2ZqRCxhQUFhLENBQUNqaEIsT0FBTyxFQUFFbWhDLEtBQUssQ0FBQztFQUNqQyxDQUFDO0VBQ0RyRSxvQkFBb0IsQ0FBQ0Msa0JBQWtCLEVBQUVtRSxTQUFTLENBQUM7O0VBRW5EO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksSUFBTXRCLFNBQVMsR0FBRyxDQUFDLENBQUM7RUFDcEIsSUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUNuQixJQUFNQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLElBQU1DLGFBQWEsR0FBRyxDQUFDLENBQUM7RUFFeEIsSUFBTXFCLFdBQVcsR0FBRztJQUNoQkMsVUFBVSxFQUFFUixVQUFVO0lBQ3RCakIsU0FBUztJQUNUQyxRQUFRO0lBQ1JDLGNBQWM7SUFDZEMsYUFBYTtJQUNieEQsU0FBUyxFQUFFUTtFQUNmLENBQUM7RUFFRCxJQUFJN1ksUUFBUSxFQUFFO0lBQ1Y7SUFDQTtJQUNBLE9BQU9rZCxXQUFXO0VBQ3RCO0VBRUFyRSxrQkFBa0IsQ0FBQzdsRCxPQUFPLENBQUMsVUFBQW1sRCxVQUFVLEVBQUk7SUFDckMsSUFBTzVNLE9BQU8sR0FBWTRNLFVBQVUsQ0FBN0I1TSxPQUFPO01BQUVuckIsTUFBTSxHQUFJKzNCLFVBQVUsQ0FBcEIvM0IsTUFBTTtJQUV0Qm1yQixPQUFPLENBQUMzNUIsTUFBTSxDQUFDd08sTUFBTSxDQUFDLENBQUNwdEIsT0FBTyxDQUFDLFVBQUF5SCxJQUFJLEVBQUk7TUFDbkMsSUFBT3pGLEVBQUUsR0FBSXlGLElBQUksQ0FBVnpGLEVBQUU7TUFDVCxJQUFJbEQsT0FBQSxDQUFPa0QsRUFBRSxNQUFLLFFBQVEsRUFBRTtRQUN4QmtnQixrREFBaUIsQ0FBQyxVQUFDMUYsR0FBRyxFQUFFbFcsR0FBRyxFQUFLO1VBQzVCLElBQUksQ0FBQ3NqRCxvQkFBb0IsQ0FBQ3RqRCxHQUFHLENBQUMsRUFBRTtZQUM1QnNqRCxvQkFBb0IsQ0FBQ3RqRCxHQUFHLENBQUMsR0FBRztjQUN4QjhqRCxLQUFLLEVBQUUsRUFBRTtjQUNUM0csTUFBTSxFQUFFO1lBQ1osQ0FBQztVQUNMO1VBQ0EsSUFBTTRHLGVBQWUsR0FBR1Qsb0JBQW9CLENBQUN0akQsR0FBRyxDQUFDO1VBQ2pELElBQUlrVyxHQUFHLElBQUlBLEdBQUcsQ0FBQzhtQyxJQUFJLEVBQUU7WUFDakIsSUFBSTltQyxHQUFHLENBQUNpbkMsTUFBTSxFQUFFO2NBQ1o0RyxlQUFlLENBQUM1RyxNQUFNLElBQUksQ0FBQztZQUMvQjtVQUNKLENBQUMsTUFBTSxJQUFJNEcsZUFBZSxDQUFDRCxLQUFLLENBQUN2bkMsT0FBTyxDQUFDckcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbEQ2dEMsZUFBZSxDQUFDRCxLQUFLLENBQUMvb0QsSUFBSSxDQUFDbWIsR0FBRyxDQUFDO1VBQ25DO1FBQ0osQ0FBQyxFQUFFeGEsRUFBRSxDQUFDO01BQ1Y7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDLENBQUM7RUFFRmtnQixrREFBaUIsQ0FBQyxVQUFBbW9DLGVBQWUsRUFBSTtJQUNqQyxJQUFPRCxLQUFLLEdBQVlDLGVBQWUsQ0FBaENELEtBQUs7TUFBRTNHLE1BQU0sR0FBSTRHLGVBQWUsQ0FBekI1RyxNQUFNO0lBQ3BCLElBQU1ueEIsSUFBSSxHQUFHODNCLEtBQUssQ0FBQ3RzQyxLQUFLLENBQUMsQ0FBQyxDQUFDK04sSUFBSSxDQUFDNjRCLFNBQVMsQ0FBQztJQUMxQyxJQUFJakIsTUFBTSxFQUFFO01BQ1IsS0FBSyxJQUFJaGpELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2dqRCxNQUFNLEVBQUVoakQsQ0FBQyxFQUFFLEVBQUU7UUFDN0IsSUFBSTJwRCxLQUFLLENBQUN4cUQsTUFBTSxFQUFFO1VBQ2QweUIsSUFBSSxDQUFDM2UsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQ294QyxTQUFTLENBQUN6eUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUN2Q0EsSUFBSSxDQUFDanhCLElBQUksQ0FBQzJqRCxRQUFRLENBQUMxeUIsSUFBSSxDQUFDQSxJQUFJLENBQUMxeUIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxNQUFNO1VBQ0gweUIsSUFBSSxDQUFDanhCLElBQUksQ0FBQ1osQ0FBQyxDQUFDO1FBQ2hCO01BQ0o7SUFDSixDQUFDLE1BQU0sSUFBSSxDQUFDMnBELEtBQUssQ0FBQ3hxRCxNQUFNLEVBQUU7TUFDdEI7TUFDQTB5QixJQUFJLENBQUNqeEIsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoQjtJQUNBZ3BELGVBQWUsQ0FBQy8zQixJQUFJLEdBQUdBLElBQUk7RUFDL0IsQ0FBQyxFQUFFczNCLG9CQUFvQixDQUFDO0VBRXhCLFNBQVNVLFVBQVVBLENBQUMvRSxNQUFNLEVBQUVnRixVQUFVLEVBQUU7SUFDcEMsSUFBSUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakJ0b0Msa0RBQWlCLENBQUMsVUFBQzFGLEdBQUcsRUFBRWxXLEdBQUcsRUFBSztNQUM1QixJQUFNbWtELFFBQVEsR0FBR2Isb0JBQW9CLENBQUN0akQsR0FBRyxDQUFDLENBQUNnc0IsSUFBSTtNQUMvQyxJQUFNbzRCLFdBQVcsR0FBR0QsUUFBUSxDQUFDNW5DLE9BQU8sQ0FBQzBuQyxVQUFVLENBQUNqa0QsR0FBRyxDQUFDLENBQUM7TUFDckQsSUFBSXFrRCxPQUFPLEdBQUcsQ0FBQ251QyxHQUFHLENBQUM7TUFDbkIsSUFBSUEsR0FBRyxJQUFJQSxHQUFHLENBQUM4bUMsSUFBSSxFQUFFO1FBQ2pCLElBQUk5bUMsR0FBRyxLQUFLZ25DLFVBQVUsRUFBRTtVQUNwQixJQUFJa0gsV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQkMsT0FBTyxHQUFHRixRQUFRLENBQUMzc0MsS0FBSyxDQUFDLENBQUMsRUFBRTRzQyxXQUFXLENBQUM7VUFDNUMsQ0FBQyxNQUFNO1lBQ0g7WUFDQUMsT0FBTyxHQUFHLEVBQUU7VUFDaEI7UUFDSixDQUFDLE1BQU07VUFDSDtVQUNBO1VBQ0E7VUFDQUEsT0FBTyxHQUNIRCxXQUFXLEtBQUssQ0FBQyxDQUFDLElBQUlsdUMsR0FBRyxLQUFLNm1DLEdBQUcsR0FDM0JvSCxRQUFRLEdBQ1IsQ0FBQ0YsVUFBVSxDQUFDamtELEdBQUcsQ0FBQyxDQUFDO1FBQy9CO01BQ0o7TUFDQTtNQUNBO01BQ0Fra0QsTUFBTSxHQUFHM3RDLGtEQUFFLENBQUNBLGtEQUFFLENBQUMsQ0FBQ1Msa0RBQUssQ0FBQ2hYLEdBQUcsQ0FBQyxDQUFDLEVBQUVxa0QsT0FBTyxDQUFDLEVBQUVILE1BQU0sQ0FBQztJQUNsRCxDQUFDLEVBQUVqRixNQUFNLENBQUM7SUFDVixPQUFPaUYsTUFBTTtFQUNqQjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBRUksSUFBTUksU0FBUyxHQUFHLFVBQVU7RUFDNUIsSUFBTUMsZ0JBQWdCLEdBQUcsRUFBRTtFQUMzQixJQUFNQyxJQUFJLEdBQUcsRUFBRTtFQUNmLElBQU1DLEtBQUssR0FBRyxFQUFFO0VBRWhCLFNBQVNDLGVBQWVBLENBQUNDLFFBQVEsRUFBRUMsU0FBUyxFQUFvQjtJQUFBLElBQWxCQyxTQUFTLEdBQUF4ckQsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRyxJQUFJO0lBQzFEZ3FELFVBQVUsQ0FBQ3lCLE9BQU8sQ0FBQ0gsUUFBUSxDQUFDO0lBQzVCdEIsVUFBVSxDQUFDMEIsYUFBYSxDQUFDSixRQUFRLEVBQUVDLFNBQVMsQ0FBQztJQUM3QztJQUNBLElBQUlDLFNBQVMsRUFBRTtNQUNYTCxJQUFJLENBQUNBLElBQUksQ0FBQ2xyRCxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUM0cEQsUUFBUSxDQUFDO01BQ3BDRixLQUFLLENBQUNBLEtBQUssQ0FBQ25yRCxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUM2cEQsU0FBUyxDQUFDO0lBQzNDO0VBQ0o7RUFFQXJGLGtCQUFrQixDQUFDN2xELE9BQU8sQ0FBQyxVQUFBbWxELFVBQVUsRUFBSTtJQUNyQyxJQUFPNU0sT0FBTyxHQUFZNE0sVUFBVSxDQUE3QjVNLE9BQU87TUFBRW5yQixNQUFNLEdBQUkrM0IsVUFBVSxDQUFwQi8zQixNQUFNOztJQUV0QjtJQUNBMDlCLElBQUksQ0FBQ3pwRCxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2IwcEQsS0FBSyxDQUFDMXBELElBQUksQ0FBQyxFQUFFLENBQUM7SUFFZCxTQUFTaXFELGdCQUFnQkEsQ0FBQ2YsVUFBVSxFQUFFVyxTQUFTLEVBQUU7TUFDN0N2QixVQUFVLENBQUN5QixPQUFPLENBQUNGLFNBQVMsQ0FBQztNQUM3Qjk5QixNQUFNLENBQUNwdEIsT0FBTyxDQUFDLFVBQUF1ckQsS0FBSyxFQUFJO1FBQ3BCLElBQVdwRSxJQUFJLEdBQWNvRSxLQUFLLENBQTNCdnBELEVBQUU7VUFBUTIwQyxRQUFRLEdBQUk0VSxLQUFLLENBQWpCNVUsUUFBUTtRQUN6QixJQUFJNzNDLE9BQUEsQ0FBT3FvRCxJQUFJLE1BQUssUUFBUSxFQUFFO1VBQzFCLElBQU1xRSxRQUFRLEdBQUdsQixVQUFVLENBQUNuRCxJQUFJLEVBQUVvRCxVQUFVLENBQUM7VUFDN0NpQixRQUFRLENBQUN4ckQsT0FBTyxDQUFDLFVBQUFnQyxFQUFFLEVBQUk7WUFDbkJncEQsZUFBZSxDQUNYckksa0VBQWdCLENBQUM7Y0FBQzNnRCxFQUFFO2NBQUUyMEM7WUFBUSxDQUFDLENBQUMsRUFDaEN1VSxTQUNKLENBQUM7VUFDTCxDQUFDLENBQUM7UUFDTixDQUFDLE1BQU07VUFDSEYsZUFBZSxDQUFDckksa0VBQWdCLENBQUM0SSxLQUFLLENBQUMsRUFBRUwsU0FBUyxDQUFDO1FBQ3ZEO01BQ0osQ0FBQyxDQUFDO0lBQ047O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUFPLGtCQUFBLEdBQW9CbkUsZ0JBQWdCLENBQ2hDL08sT0FBTyxDQUFDMzRDLE1BQU0sR0FBRzI0QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUN2MkMsRUFBRSxHQUFHbEIsU0FDckMsQ0FBQztNQUZNMG1ELFNBQVMsR0FBQWlFLGtCQUFBLENBQVRqRSxTQUFTO0lBR2hCLElBQU1rRSxpQkFBaUIsR0FBRzVwQyxrREFBUyxDQUFDLFVBQUErUSxDQUFDO01BQUEsT0FBSSxDQUFDa2dCLGFBQWEsQ0FBQ2xnQixDQUFDLENBQUM3d0IsRUFBRSxDQUFDO0lBQUEsR0FBRXUyQyxPQUFPLENBQUM7SUFDdkUsSUFBTW9ULGVBQWUsR0FBR2w3QixrREFBVSxDQUM5QjtNQUFDKzJCLFNBQVM7TUFBRWtFLGlCQUFpQjtNQUFFblQ7SUFBTyxDQUFDLEVBQ3ZDNE0sVUFDSixDQUFDO0lBRUQ1TSxPQUFPLENBQUN2NEMsT0FBTyxDQUFDLFVBQUFrckQsU0FBUyxFQUFJO01BQ3pCLElBQVdsRSxLQUFLLEdBQWNrRSxTQUFTLENBQWhDbHBELEVBQUU7UUFBUzIwQyxRQUFRLEdBQUl1VSxTQUFTLENBQXJCdlUsUUFBUTtNQUMxQjtNQUNBLElBQU1pVixTQUFTLEdBQUc3RSxpQkFBaUIsQ0FBQ21FLFNBQVMsRUFBRTk5QixNQUFNLENBQUM7TUFDdEQsSUFBSXR1QixPQUFBLENBQU9rb0QsS0FBSyxNQUFLLFFBQVEsRUFBRTtRQUMzQixJQUFNNkUsU0FBUyxHQUFHdkIsVUFBVSxDQUFDdEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDNkUsU0FBUyxDQUFDN3JELE9BQU8sQ0FBQyxVQUFBZ0MsRUFBRSxFQUFJO1VBQ3BCLElBQU04cEQsYUFBYSxHQUFHO1lBQUM5cEQsRUFBRTtZQUFFMjBDO1VBQVEsQ0FBQztVQUNwQyxJQUFJb1YsU0FBUyxHQUFHcEosa0VBQWdCLENBQUNtSixhQUFhLENBQUM7VUFDL0M7VUFDQSxJQUFJRixTQUFTLEVBQUU7WUFDWGYsZ0JBQWdCLENBQUN4cEQsSUFBSSxDQUFDeXFELGFBQWEsQ0FBQztZQUNwQ0MsU0FBUyxJQUFJbkIsU0FBUztVQUMxQjtVQUNBVSxnQkFBZ0IsQ0FBQ3RwRCxFQUFFLEVBQUUrcEQsU0FBUyxDQUFDO1FBQ25DLENBQUMsQ0FBQztRQUNGekcsVUFBVSxDQUFDc0QsY0FBYyxFQUFFNUIsS0FBSyxFQUFFclEsUUFBUSxFQUFFZ1YsZUFBZSxDQUFDO01BQ2hFLENBQUMsTUFBTTtRQUNILElBQUlJLFNBQVMsR0FBR3BKLGtFQUFnQixDQUFDdUksU0FBUyxDQUFDO1FBQzNDO1FBQ0EsSUFBSVUsU0FBUyxFQUFFO1VBQ1hmLGdCQUFnQixDQUFDeHBELElBQUksQ0FBQzZwRCxTQUFTLENBQUM7VUFDaENhLFNBQVMsSUFBSW5CLFNBQVM7UUFDMUI7UUFDQVUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUVTLFNBQVMsQ0FBQztRQUMvQjlHLE1BQU0sQ0FBQ3lELFNBQVMsRUFBRTFCLEtBQUssRUFBRXJRLFFBQVEsRUFBRWdWLGVBQWUsQ0FBQztNQUN2RDtJQUNKLENBQUMsQ0FBQztJQUVGditCLE1BQU0sQ0FBQ3B0QixPQUFPLENBQUMsVUFBQWdzRCxXQUFXLEVBQUk7TUFDMUIsSUFBVzdFLElBQUksR0FBc0I2RSxXQUFXLENBQXpDaHFELEVBQUU7UUFBa0JvbEQsTUFBTSxHQUFJNEUsV0FBVyxDQUEvQnJWLFFBQVE7TUFDekIsSUFBSTczQyxPQUFBLENBQU9xb0QsSUFBSSxNQUFLLFFBQVEsRUFBRTtRQUMxQjdCLFVBQVUsQ0FBQ3VELGFBQWEsRUFBRTFCLElBQUksRUFBRUMsTUFBTSxFQUFFdUUsZUFBZSxDQUFDO01BQzVELENBQUMsTUFBTTtRQUNIMUcsTUFBTSxDQUFDMEQsUUFBUSxFQUFFeEIsSUFBSSxFQUFFQyxNQUFNLEVBQUV1RSxlQUFlLENBQUM7TUFDbkQ7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDLENBQUM7O0VBRUY7RUFDQWQsZ0JBQWdCLENBQUM3cUQsT0FBTyxDQUFDLFVBQUFpc0QsYUFBYSxFQUFJO0lBQ3RDLElBQU1DLFlBQVksR0FBR3ZKLGtFQUFnQixDQUFDc0osYUFBYSxDQUFDO0lBQ3BELElBQU1FLE9BQU8sR0FBR0QsWUFBWSxDQUFDdHRDLE1BQU0sQ0FBQ2dzQyxTQUFTLENBQUM7SUFDOUMsS0FBSyxJQUFJd0IsR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBRyxHQUFHdEIsSUFBSSxDQUFDbHJELE1BQU0sRUFBRXdzRCxHQUFHLEVBQUUsRUFBRTtNQUN4QztNQUNBLElBQUl0QixJQUFJLENBQUNzQixHQUFHLENBQUMsQ0FBQ3AzQixJQUFJLENBQUMsVUFBQXEzQixNQUFNO1FBQUEsT0FBSUEsTUFBTSxLQUFLSCxZQUFZO01BQUEsRUFBQyxFQUFFO1FBQ25EO0FBQ2hCO0FBQ0E7UUFDZ0IsSUFBSSxDQUFDbkIsS0FBSyxDQUFDcUIsR0FBRyxDQUFDLENBQUNwM0IsSUFBSSxDQUFDLFVBQUFzM0IsT0FBTztVQUFBLE9BQUlBLE9BQU8sS0FBS0gsT0FBTztRQUFBLEVBQUMsRUFBRTtVQUNsRHBCLEtBQUssQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDcHNELE9BQU8sQ0FBQyxVQUFBc3NELE9BQU8sRUFBSTtZQUMxQnRCLGVBQWUsQ0FBQ21CLE9BQU8sRUFBRUcsT0FBTyxFQUFFLEtBQUssQ0FBQztVQUM1QyxDQUFDLENBQUM7UUFDTjtNQUNKO0lBQ0o7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPcEMsV0FBVztBQUN0QjtBQUVBLFNBQVM1QyxnQkFBZ0JBLENBQUN0bEQsRUFBRSxFQUFFO0VBQzFCLElBQU13bEQsU0FBUyxHQUFHLEVBQUU7RUFDcEIsSUFBTUUsY0FBYyxHQUFHLEVBQUU7RUFDekIsSUFBSTVvRCxPQUFBLENBQU9rRCxFQUFFLE1BQUssUUFBUSxFQUFFO0lBQ3hCa2dCLGtEQUFpQixDQUFDLFVBQUMxRixHQUFHLEVBQUVsVyxHQUFHLEVBQUs7TUFDNUIsSUFBSWtXLEdBQUcsS0FBSyttQyxLQUFLLEVBQUU7UUFDZmlFLFNBQVMsQ0FBQ25tRCxJQUFJLENBQUNpRixHQUFHLENBQUM7TUFDdkIsQ0FBQyxNQUFNLElBQUlrVyxHQUFHLEtBQUtnbkMsVUFBVSxFQUFFO1FBQzNCa0UsY0FBYyxDQUFDcm1ELElBQUksQ0FBQ2lGLEdBQUcsQ0FBQztNQUM1QjtJQUNKLENBQUMsRUFBRXRFLEVBQUUsQ0FBQztJQUNOd2xELFNBQVMsQ0FBQzM3QixJQUFJLENBQUMsQ0FBQztJQUNoQjY3QixjQUFjLENBQUM3N0IsSUFBSSxDQUFDLENBQUM7RUFDekI7RUFDQSxPQUFPO0lBQUMyN0IsU0FBUztJQUFFRTtFQUFjLENBQUM7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM2RSxPQUFPQSxDQUNuQnJzRCxJQUFJLEVBQ0pveUIsSUFBSSxFQUNKazZCLFdBQVcsRUFDWEMsT0FBTyxFQUNQQyxPQUFPLEVBQ1BDLGNBQWMsRUFDaEI7RUFDRSxLQUFLLElBQUlsc0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHUCxJQUFJLENBQUNOLE1BQU0sRUFBRWEsQ0FBQyxFQUFFLEVBQUU7SUFDbEMsSUFBTStiLEdBQUcsR0FBRzhWLElBQUksQ0FBQzd4QixDQUFDLENBQUM7SUFDbkIsSUFBTW1zRCxVQUFVLEdBQUdKLFdBQVcsQ0FBQy9yRCxDQUFDLENBQUM7SUFDakMsSUFBSW1zRCxVQUFVLENBQUN0SixJQUFJLEVBQUU7TUFDakI7TUFDQTtNQUNBLElBQUltSixPQUFPLElBQUlHLFVBQVUsS0FBS3ZKLEdBQUcsRUFBRTtRQUMvQixJQUFNd0osUUFBUSxHQUFHSixPQUFPLENBQUM1cEMsT0FBTyxDQUFDM2lCLElBQUksQ0FBQ08sQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBTXFzRCxhQUFhLEdBQUdILGNBQWMsQ0FBQ0UsUUFBUSxDQUFDO1FBQzlDO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSUQsVUFBVSxLQUFLcEosVUFBVSxJQUFJc0osYUFBYSxLQUFLdEosVUFBVSxFQUFFO1VBQzNELE1BQU0sSUFBSXAvQixLQUFLLENBQ1gsNEJBQTRCLEdBQ3hCMlYsSUFBSSxDQUFDQyxTQUFTLENBQUM7WUFDWDk1QixJQUFJO1lBQ0pzc0QsV0FBVztZQUNYbDZCLElBQUk7WUFDSm02QixPQUFPO1lBQ1BFLGNBQWM7WUFDZEQ7VUFDSixDQUFDLENBQ1QsQ0FBQztRQUNMO1FBQ0EsSUFDSWhJLFNBQVMsQ0FBQ2xvQyxHQUFHLEVBQUVrd0MsT0FBTyxDQUFDRyxRQUFRLENBQUMsQ0FBQyxNQUNoQ0QsVUFBVSxLQUFLcEosVUFBVSxHQUNwQixDQUFDLENBQUMsR0FDRnNKLGFBQWEsS0FBS3RKLFVBQVUsR0FDNUIsQ0FBQyxHQUNELENBQUMsQ0FBQyxFQUNWO1VBQ0UsT0FBTyxLQUFLO1FBQ2hCO01BQ0o7SUFDSixDQUFDLE1BQU0sSUFBSWhuQyxHQUFHLEtBQUtvd0MsVUFBVSxFQUFFO01BQzNCLE9BQU8sS0FBSztJQUNoQjtFQUNKO0VBQ0EsT0FBTyxJQUFJO0FBQ2Y7QUFFQSxTQUFTRyxVQUFVQSxDQUFDUCxXQUFXLEVBQUVsNkIsSUFBSSxFQUFFO0VBQ25DLElBQU0wNkIsT0FBTyxHQUFHLEVBQUU7RUFDbEIsS0FBSyxJQUFJdnNELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRytyRCxXQUFXLENBQUM1c0QsTUFBTSxFQUFFYSxDQUFDLEVBQUUsRUFBRTtJQUN6QyxJQUFJK3JELFdBQVcsQ0FBQy9yRCxDQUFDLENBQUMsS0FBSzhpRCxLQUFLLEVBQUU7TUFDMUJ5SixPQUFPLENBQUMzckQsSUFBSSxDQUFDaXhCLElBQUksQ0FBQzd4QixDQUFDLENBQUMsQ0FBQztJQUN6QjtFQUNKO0VBQ0EsT0FBT3VzRCxPQUFPLENBQUNwdEQsTUFBTSxHQUFHbTZCLElBQUksQ0FBQ0MsU0FBUyxDQUFDZ3pCLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTamEsYUFBYUEsQ0FBQW9ILE1BQUEsRUFBTztFQUFBLElBQUxuNEMsRUFBRSxHQUFBbTRDLE1BQUEsQ0FBRm40QyxFQUFFO0VBQzdCLE9BQU9sRCxPQUFBLENBQU9rRCxFQUFFLE1BQUssUUFBUSxJQUFJMGEsa0RBQUcsQ0FBQyxVQUFBZ0QsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQzArQixLQUFLO0VBQUEsR0FBRXAxQixrREFBTSxDQUFDaG5CLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTaXJELG1CQUFtQkEsQ0FBQ3ZnQixNQUFNLEVBQUV5SixLQUFLLEVBQUVuMEMsRUFBRSxFQUFFdWIsSUFBSSxFQUFFO0VBQ2xELElBQUkyckIsT0FBTztFQUNYLElBQUl6RixRQUFRO0VBQ1osSUFBSTZTLE9BQU8sR0FBRyxFQUFFO0VBQ2hCLElBQUksT0FBT3QwQyxFQUFFLEtBQUssUUFBUSxFQUFFO0lBQ3hCO0lBQ0EsSUFBTXFqRCxTQUFTLEdBQUcsQ0FBQzNZLE1BQU0sQ0FBQ2djLFNBQVMsQ0FBQzFtRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRXViLElBQUksQ0FBQztJQUNwRCxJQUFJOG5DLFNBQVMsRUFBRTtNQUNYNWhCLFFBQVEsR0FBRzRoQixTQUFTLENBQUMsQ0FBQyxDQUFDO01BQ3ZCbmMsT0FBTyxHQUFHK1osNkRBQVcsQ0FBQyxDQUFDO0lBQzNCO0VBQ0osQ0FBQyxNQUFNO0lBQ0g7SUFDQSxJQUFNL2lELEtBQUksR0FBR1osTUFBTSxDQUFDWSxJQUFJLENBQUM4QixFQUFFLENBQUMsQ0FBQzZwQixJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFNeUcsSUFBSSxHQUFHN2hCLGlEQUFLLENBQUN2USxLQUFJLEVBQUU4QixFQUFFLENBQUM7SUFDNUIsSUFBTXdqRCxNQUFNLEdBQUd0bEQsS0FBSSxDQUFDdWxCLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDN0IsSUFBTWdrQyxRQUFRLEdBQUcsQ0FBQy9jLE1BQU0sQ0FBQ2tjLGNBQWMsQ0FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFam9DLElBQUksQ0FBQztJQUM1RCxJQUFJa3NDLFFBQVEsRUFBRTtNQUNWLEtBQUssSUFBSWhwRCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdncEQsUUFBUSxDQUFDN3BELE1BQU0sRUFBRWEsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBTStyRCxXQUFXLEdBQUcvQyxRQUFRLENBQUNocEQsQ0FBQyxDQUFDLENBQUN1b0IsTUFBTTtRQUN0QyxJQUFJdWpDLE9BQU8sQ0FBQ3JzRCxLQUFJLEVBQUVveUIsSUFBSSxFQUFFazZCLFdBQVcsQ0FBQyxFQUFFO1VBQ2xDL29CLFFBQVEsR0FBR2dtQixRQUFRLENBQUNocEQsQ0FBQyxDQUFDLENBQUM0a0QsU0FBUyxDQUFDLENBQUMsQ0FBQztVQUNuQ25jLE9BQU8sR0FBRytaLDZEQUFXLENBQUMvaUQsS0FBSSxFQUFFb3lCLElBQUksRUFBRWs2QixXQUFXLENBQUM7VUFDOUNsVyxPQUFPLEdBQUd5VyxVQUFVLENBQUNQLFdBQVcsRUFBRWw2QixJQUFJLENBQUM7VUFDdkM7UUFDSjtNQUNKO0lBQ0o7RUFDSjtFQUNBLElBQUksQ0FBQzRXLE9BQU8sRUFBRTtJQUNWLE9BQU8sS0FBSztFQUNoQjtFQUVBLE9BQU84WixzRUFBb0IsQ0FBQ3ZmLFFBQVEsRUFBRXlGLE9BQU8sRUFBRW9OLE9BQU8sQ0FBQztBQUMzRDtBQUVBLFNBQVM0VyxzQkFBc0JBLENBQUN6cEIsUUFBUSxFQUFFMHBCLFVBQVUsRUFBRUMsSUFBSSxFQUFFSixPQUFPLEVBQUU7RUFDakUsSUFBTUssUUFBUSxHQUFHL3RELE1BQU0sQ0FBQ1ksSUFBSSxDQUFDaXRELFVBQVUsQ0FBQ25yRCxFQUFFLENBQUMsQ0FBQzZwQixJQUFJLENBQUMsQ0FBQztFQUNsRCxJQUFNeWhDLGVBQWUsR0FBRzc4QyxpREFBSyxDQUFDNDhDLFFBQVEsRUFBRUYsVUFBVSxDQUFDbnJELEVBQUUsQ0FBQztFQUN0RCxJQUFNdXJELFVBQVUsR0FBRyxDQUFDLENBQUM7RUFDckJILElBQUksQ0FBQ3B0RCxPQUFPLENBQUMsVUFBQXM2QyxNQUFBLEVBQWlCO0lBQUEsSUFBWDBNLEtBQUssR0FBQTFNLE1BQUEsQ0FBVHQ0QyxFQUFFO0lBQ2IsSUFBTXdyRCxPQUFPLEdBQUcvOEMsaURBQUssQ0FBQzQ4QyxRQUFRLEVBQUVyRyxLQUFLLENBQUM7SUFDdEMsSUFBTXlHLFFBQVEsR0FBR3pLLHNFQUFvQixDQUNqQ3ZmLFFBQVEsRUFDUndmLDZEQUFXLENBQUNvSyxRQUFRLEVBQUVHLE9BQU8sRUFBRUYsZUFBZSxDQUFDLEVBQy9DUCxVQUFVLENBQUNPLGVBQWUsRUFBRUUsT0FBTyxDQUN2QyxDQUFDO0lBQ0QsSUFBT0UsVUFBVSxHQUFJRCxRQUFRLENBQXRCQyxVQUFVO0lBQ2pCLElBQUksQ0FBQ0gsVUFBVSxDQUFDRyxVQUFVLENBQUMsRUFBRTtNQUN6QlYsT0FBTyxDQUFDM3JELElBQUksQ0FBQ29zRCxRQUFRLENBQUM7TUFDdEJGLFVBQVUsQ0FBQ0csVUFBVSxDQUFDLEdBQUcsSUFBSTtJQUNqQztFQUNKLENBQUMsQ0FBQztBQUNOO0FBRU8sU0FBU0MseUJBQXlCQSxDQUFDemtCLE9BQU8sRUFBRWlOLEtBQUssRUFBRTZXLE9BQU8sRUFBRTtFQUMvRCxPQUFPLFVBQUF2cEIsUUFBUSxFQUFJO0lBQ2YsSUFBTytqQixTQUFTLEdBQWdDL2pCLFFBQVEsQ0FBakQrakIsU0FBUztNQUFFa0UsaUJBQWlCLEdBQWFqb0IsUUFBUSxDQUF0Q2lvQixpQkFBaUI7TUFBRW5ULE9BQU8sR0FBSTlVLFFBQVEsQ0FBbkI4VSxPQUFPO0lBQzVDLElBQUlpUCxTQUFTLENBQUM1bkQsTUFBTSxFQUFFO01BQ2xCLElBQU1ndUQsZ0JBQWdCLEdBQUdyVixPQUFPLENBQUNtVCxpQkFBaUIsQ0FBQztNQUNuRCxJQUFJa0MsZ0JBQWdCLEVBQUU7UUFDbEJWLHNCQUFzQixDQUNsQnpwQixRQUFRLEVBQ1JtcUIsZ0JBQWdCLEVBQ2hCMWtCLE9BQU8sQ0FBQ2lOLEtBQUssQ0FBQyxDQUFDeVgsZ0JBQWdCLENBQUMsRUFDaENaLE9BQ0osQ0FBQztNQUNMLENBQUMsTUFBTTtRQUNIO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO1FBQ2dCLElBQU1hLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDbEJ0VixPQUFPLENBQUN2NEMsT0FBTyxDQUFDLFVBQUFtdEQsVUFBVSxFQUFJO1VBQzFCLElBQU1XLE1BQU0sR0FBRzVrQixPQUFPLENBQUNpTixLQUFLLENBQUMsQ0FBQ2dYLFVBQVUsQ0FBQyxDQUFDanJELE1BQU0sQ0FBQyxVQUFBekIsQ0FBQyxFQUFJO1lBQ2xELElBQU1zdEQsUUFBUSxHQUFHaDBCLElBQUksQ0FBQ0MsU0FBUyxDQUFDdnBCLGlEQUFLLENBQUMrMkMsU0FBUyxFQUFFL21ELENBQUMsQ0FBQ3VCLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQzZyRCxPQUFPLENBQUNFLFFBQVEsQ0FBQyxFQUFFO2NBQ3BCRixPQUFPLENBQUNFLFFBQVEsQ0FBQyxHQUFHLENBQUM7Y0FDckIsT0FBTyxJQUFJO1lBQ2Y7WUFDQSxPQUFPLEtBQUs7VUFDaEIsQ0FBQyxDQUFDO1VBQ0ZiLHNCQUFzQixDQUNsQnpwQixRQUFRLEVBQ1IwcEIsVUFBVSxFQUNWVyxNQUFNLEVBQ05kLE9BQ0osQ0FBQztRQUNMLENBQUMsQ0FBQztNQUNOO0lBQ0osQ0FBQyxNQUFNO01BQ0gsSUFBTWxXLEVBQUUsR0FBR2tNLHNFQUFvQixDQUFDdmYsUUFBUSxFQUFFeUYsT0FBTyxFQUFFLEVBQUUsQ0FBQztNQUN0RDhqQixPQUFPLENBQUMzckQsSUFBSSxDQUFDeTFDLEVBQUUsQ0FBQztJQUNwQjtFQUNKLENBQUM7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTa1gsY0FBY0EsQ0FBQ2hzRCxFQUFFLEVBQUVpc0QsUUFBUSxFQUFFdmhCLE1BQU0sRUFBRTtFQUNqRCxJQUFJLEVBQUUxcUMsRUFBRSxJQUFJMHFDLE1BQU0sSUFBSXVoQixRQUFRLENBQUNydUQsTUFBTSxDQUFDLEVBQUU7SUFDcEMsT0FBTyxFQUFFO0VBQ2I7RUFFQSxJQUFJLE9BQU9vQyxFQUFFLEtBQUssUUFBUSxFQUFFO0lBQ3hCLElBQU1vckIsTUFBTSxHQUFHc2YsTUFBTSxDQUFDaWMsUUFBUSxDQUFDM21ELEVBQUUsQ0FBQztJQUNsQyxPQUFPb3JCLE1BQU0sR0FBRzZnQyxRQUFRLENBQUMvckQsTUFBTSxDQUFDLFVBQUFnc0QsT0FBTztNQUFBLE9BQUk5Z0MsTUFBTSxDQUFDOGdDLE9BQU8sQ0FBQztJQUFBLEVBQUMsR0FBRyxFQUFFO0VBQ3BFO0VBRUEsSUFBTWh1RCxJQUFJLEdBQUdaLE1BQU0sQ0FBQ1ksSUFBSSxDQUFDOEIsRUFBRSxDQUFDLENBQUM2cEIsSUFBSSxDQUFDLENBQUM7RUFDbkMsSUFBTXlHLElBQUksR0FBRzdoQixpREFBSyxDQUFDdlEsSUFBSSxFQUFFOEIsRUFBRSxDQUFDO0VBQzVCLElBQU13akQsTUFBTSxHQUFHdGxELElBQUksQ0FBQ3VsQixJQUFJLENBQUMsR0FBRyxDQUFDO0VBQzdCLElBQU1pa0MsV0FBVyxHQUFHaGQsTUFBTSxDQUFDbWMsYUFBYSxDQUFDckQsTUFBTSxDQUFDO0VBQ2hELElBQUksQ0FBQ2tFLFdBQVcsRUFBRTtJQUNkLE9BQU8sRUFBRTtFQUNiO0VBQ0EsT0FBT3VFLFFBQVEsQ0FBQy9yRCxNQUFNLENBQUMsVUFBQXFiLElBQUksRUFBSTtJQUMzQixJQUFNa3NDLFFBQVEsR0FBR0MsV0FBVyxDQUFDbnNDLElBQUksQ0FBQztJQUNsQyxPQUNJa3NDLFFBQVEsSUFDUkEsUUFBUSxDQUFDejBCLElBQUksQ0FBQyxVQUFBclAsT0FBTztNQUFBLE9BQUk0bUMsT0FBTyxDQUFDcnNELElBQUksRUFBRW95QixJQUFJLEVBQUUzTSxPQUFPLENBQUNxRCxNQUFNLENBQUM7SUFBQSxFQUFDO0VBRXJFLENBQUMsQ0FBQztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU21sQyw0QkFBNEJBLENBQUN6aEIsTUFBTSxFQUFFeUosS0FBSyxFQUFFaVksV0FBVyxFQUFFQyxJQUFJLEVBQUU7RUFDM0UsSUFBT0MsV0FBVyxHQUFpREQsSUFBSSxDQUFoRUMsV0FBVztJQUFFQyxzQkFBc0IsR0FBeUJGLElBQUksQ0FBbkRFLHNCQUFzQjtJQUFFQyxRQUFRLEdBQWVILElBQUksQ0FBM0JHLFFBQVE7SUFBRUMsU0FBUyxHQUFJSixJQUFJLENBQWpCSSxTQUFTO0VBQy9ELElBQU1sQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQU1sSSxTQUFTLEdBQUcsRUFBRTtFQUVwQixTQUFTcUosV0FBV0EsQ0FBQ2pyQixRQUFRLEVBQUU7SUFDM0IsSUFBSUEsUUFBUSxFQUFFO01BQ1YsSUFBTWtyQixVQUFVLEdBQUdwQixVQUFVLENBQUM5cEIsUUFBUSxDQUFDaXFCLFVBQVUsQ0FBQztNQUNsRCxJQUFJaUIsVUFBVSxLQUFLN3RELFNBQVMsRUFBRTtRQUMxQixJQUFNOHRELE9BQU8sR0FBR3ZKLFNBQVMsQ0FBQ3NKLFVBQVUsQ0FBQztRQUNyQ0MsT0FBTyxDQUFDbFYsY0FBYyxHQUFHcUosMERBQVEsQ0FDN0I2TCxPQUFPLENBQUNsVixjQUFjLEVBQ3RCalcsUUFBUSxDQUFDaVcsY0FDYixDQUFDO1FBQ0QsSUFBSWpXLFFBQVEsQ0FBQ29yQixXQUFXLEVBQUU7VUFDdEJELE9BQU8sQ0FBQ0MsV0FBVyxHQUFHLElBQUk7UUFDOUI7TUFDSixDQUFDLE1BQU07UUFDSHRCLFVBQVUsQ0FBQzlwQixRQUFRLENBQUNpcUIsVUFBVSxDQUFDLEdBQUdySSxTQUFTLENBQUN6bEQsTUFBTTtRQUNsRHlsRCxTQUFTLENBQUNoa0QsSUFBSSxDQUFDb2lDLFFBQVEsQ0FBQztNQUM1QjtJQUNKO0VBQ0o7RUFFQSxTQUFTcXJCLGtCQUFrQkEsQ0FBQ3BVLEtBQUssRUFBRTtJQUMvQixPQUFPLFVBQUE1RCxFQUFFO01BQUEsT0FDTEEsRUFBRSxDQUFDRyxTQUFTLENBQUNkLEtBQUssQ0FBQyxDQUFDbmhCLElBQUksQ0FBQyxVQUFBKzVCLEdBQUcsRUFBSTtRQUM1QixJQUNJanZELEtBQUssQ0FBQzBCLE9BQU8sQ0FBQ3V0RCxHQUFHLENBQUMsSUFDbEJBLEdBQUcsQ0FBQy81QixJQUFJLENBQUMsVUFBQWc2QixJQUFJO1VBQUEsT0FBSWhjLFdBQVcsQ0FBQ2djLElBQUksQ0FBQ2h0RCxFQUFFLENBQUMsS0FBSzA0QyxLQUFLO1FBQUEsRUFBQyxFQUNsRDtVQUNFO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQSxJQUFJMTRCLGtEQUFPLENBQUM4MEIsRUFBRSxDQUFDbVksVUFBVSxDQUFDVCxRQUFRLENBQUMsQ0FBQyxDQUFDNXVELE1BQU0sRUFBRTtZQUN6Q2szQyxFQUFFLENBQUMrWCxXQUFXLEdBQUcsSUFBSTtZQUNyQi9YLEVBQUUsQ0FBQzRDLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDdEJnVixXQUFXLENBQUM1WCxFQUFFLENBQUM7VUFDbkI7VUFDQSxPQUFPLElBQUk7UUFDZjtRQUNBLE9BQU8sS0FBSztNQUNoQixDQUFDLENBQUM7SUFBQTtFQUNWO0VBRUEsU0FBU29ZLFdBQVdBLENBQUNsdEQsRUFBRSxFQUFFbXRELGNBQWMsRUFBRUMsYUFBYSxFQUFFO0lBQ3BELElBQUlELGNBQWMsRUFBRTtNQUNoQixLQUFLLElBQU14WSxRQUFRLElBQUl3WSxjQUFjLEVBQUU7UUFDbkMsSUFBTXJZLEVBQUUsR0FBR21XLG1CQUFtQixDQUFDdmdCLE1BQU0sRUFBRXlKLEtBQUssRUFBRW4wQyxFQUFFLEVBQUUyMEMsUUFBUSxDQUFDO1FBQzNELElBQUlHLEVBQUUsRUFBRTtVQUNKO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsSUFBSSxDQUFDQSxFQUFFLENBQUNyVCxRQUFRLENBQUM0ckIsb0JBQW9CLEVBQUU7WUFDbkN2WSxFQUFFLENBQUMrWCxXQUFXLEdBQUcsSUFBSTtZQUNyQkgsV0FBVyxDQUFDNVgsRUFBRSxDQUFDO1VBQ25CO1FBQ0o7TUFDSjtJQUNKO0lBQ0EsSUFBSSxDQUFDd1gsV0FBVyxJQUFJYyxhQUFhLEVBQUU7TUFDL0IsSUFBTUUsZ0JBQWdCLEdBQUdmLHNCQUFzQixHQUN6Q08sa0JBQWtCLENBQUM5YixXQUFXLENBQUNoeEMsRUFBRSxDQUFDLENBQUMsR0FDbkMwc0QsV0FBVztNQUNqQixJQUFJYSxrQkFBa0IsR0FBR0QsZ0JBQWdCO01BQ3pDLElBQUliLFNBQVMsRUFBRTtRQUNYYyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFHelksRUFBRSxFQUFJO1VBQ3ZCLElBQ0ksQ0FBQzM2QixrREFBRyxDQUNBNlYsa0RBQVUsQ0FBQ3k4QixTQUFTLENBQUMsRUFDckJ6dkMsa0RBQUssQ0FBQyxNQUFNLEVBQUVnRCxrREFBTyxDQUFDODBCLEVBQUUsQ0FBQ21ZLFVBQVUsQ0FBQzlZLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUMsRUFDSDtZQUNFbVosZ0JBQWdCLENBQUN4WSxFQUFFLENBQUM7VUFDeEI7UUFDSixDQUFDO01BQ0w7TUFDQSxLQUFLLElBQU1ILFNBQVEsSUFBSXlZLGFBQWEsRUFBRTtRQUNsQ3hNLHFFQUFtQixDQUNmbFcsTUFBTSxFQUNOeUosS0FBSyxFQUNMbjBDLEVBQUUsRUFDRjIwQyxTQUFRLEVBQ1JtTSxzREFDSixDQUFDLENBQUM5aUQsT0FBTyxDQUFDdXZELGtCQUFrQixDQUFDO01BQ2pDO0lBQ0o7RUFDSjtFQUVBck0sbURBQVcsQ0FBQ2tMLFdBQVcsRUFBRSxVQUFBN2tELEtBQUssRUFBSTtJQUM5QixJQUFNdkgsRUFBRSxHQUFHc1Ysa0RBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRS9OLEtBQUssQ0FBQztJQUN2QyxJQUFJdkgsRUFBRSxFQUFFO01BQ0osSUFBSSxPQUFPQSxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUN1c0Qsc0JBQXNCLEVBQUU7UUFDbkRXLFdBQVcsQ0FBQ2x0RCxFQUFFLEVBQUUwcUMsTUFBTSxDQUFDZ2MsU0FBUyxDQUFDMW1ELEVBQUUsQ0FBQyxFQUFFMHFDLE1BQU0sQ0FBQ2ljLFFBQVEsQ0FBQzNtRCxFQUFFLENBQUMsQ0FBQztNQUM5RCxDQUFDLE1BQU07UUFDSCxJQUFNd2pELE1BQU0sR0FBR2xtRCxNQUFNLENBQUNZLElBQUksQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDNnBCLElBQUksQ0FBQyxDQUFDLENBQUNwRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9DeXBDLFdBQVcsQ0FDUGx0RCxFQUFFLEVBQ0YsQ0FBQ3VzRCxzQkFBc0IsSUFBSTdoQixNQUFNLENBQUNrYyxjQUFjLENBQUNwRCxNQUFNLENBQUMsRUFDeEQ5WSxNQUFNLENBQUNtYyxhQUFhLENBQUNyRCxNQUFNLENBQy9CLENBQUM7TUFDTDtJQUNKO0VBQ0osQ0FBQyxDQUFDO0VBRUYsT0FBT2grQyxpREFBRyxDQUNOLFVBQUFzdkMsRUFBRTtJQUFBLE9BQUExSSxhQUFBLENBQUFBLGFBQUEsS0FDSzBJLEVBQUU7TUFDTDBZLFFBQVEsRUFBRTNNLDZEQUFXLENBQUNuVyxNQUFNLEVBQUV5SixLQUFLLEVBQUVXLEVBQUU7SUFBQztFQUFBLENBQzFDLEVBQ0Z1TyxTQUNKLENBQUM7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3d0N1SjtBQUNUO0FBQzVHO0FBQzNCLElBQU1vSyxNQUFNLEdBQUcsQ0FBQztBQUNoQixJQUFNM00sUUFBUSxHQUFHLENBQUM7QUFDbEIsSUFBTUMsUUFBUSxHQUFHcnlCLGlEQUFTLENBQUMxWixJQUFJLENBQUMrSCxHQUFHLENBQUM7QUFDcEMsSUFBTTRqQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBdjhDLElBQUE7RUFBQSxJQUFNcEUsRUFBRSxHQUFBb0UsSUFBQSxDQUFGcEUsRUFBRTtJQUFFMjBDLFFBQVEsR0FBQXZ3QyxJQUFBLENBQVJ1d0MsUUFBUTtFQUFBLFVBQUEvM0IsTUFBQSxDQUFVbzBCLDBEQUFXLENBQUNoeEMsRUFBRSxDQUFDLE9BQUE0YyxNQUFBLENBQUkrM0IsUUFBUTtBQUFBLENBQUU7QUFDL0UsU0FBU2lNLG1CQUFtQkEsQ0FBQ2xXLE1BQU0sRUFBRXlKLEtBQUssRUFBRW4wQyxFQUFFLEVBQUV1YixJQUFJLEVBQUVteUMsVUFBVSxFQUF1QjtFQUFBLElBQXJCQyxZQUFZLEdBQUFod0QsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRyxJQUFJO0VBQ3hGLElBQU1xdEQsT0FBTyxHQUFHLEVBQUU7RUFDbEIsSUFBTTVKLFNBQVMsR0FBR1QsZ0JBQWdCLENBQUM7SUFBRTNnRCxFQUFFO0lBQUUyMEMsUUFBUSxFQUFFcDVCO0VBQUssQ0FBQyxDQUFDO0VBQzFELElBQUksT0FBT3ZiLEVBQUUsS0FBSyxRQUFRLEVBQUU7SUFDeEI7SUFDQSxJQUFNcWpELFNBQVMsR0FBRyxDQUFDM1ksTUFBTSxDQUFDaWMsUUFBUSxDQUFDM21ELEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFdWIsSUFBSSxDQUFDO0lBQ25ELElBQUksQ0FBQzhuQyxTQUFTLEVBQUU7TUFDWixPQUFPLEVBQUU7SUFDYjtJQUNBQSxTQUFTLENBQUNybEQsT0FBTyxDQUFDMnRELHdFQUF5QixDQUFDMUssV0FBVyxDQUFDLENBQUMsRUFBRTlNLEtBQUssRUFBRTZXLE9BQU8sQ0FBQyxDQUFDO0VBQy9FLENBQUMsTUFDSTtJQUNEO0lBQ0EsSUFBTTRDLEtBQUssR0FBR3R3RCxNQUFNLENBQUNZLElBQUksQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDNnBCLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQU15RyxJQUFJLEdBQUc3aEIsaURBQUssQ0FBQ20vQyxLQUFLLEVBQUU1dEQsRUFBRSxDQUFDO0lBQzdCLElBQU13akQsTUFBTSxHQUFHb0ssS0FBSyxDQUFDbnFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDOUIsSUFBTWdrQyxRQUFRLEdBQUcsQ0FBQy9jLE1BQU0sQ0FBQ21jLGFBQWEsQ0FBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFam9DLElBQUksQ0FBQztJQUMzRCxJQUFJLENBQUNrc0MsUUFBUSxFQUFFO01BQ1gsT0FBTyxFQUFFO0lBQ2I7SUFDQUEsUUFBUSxDQUFDenBELE9BQU8sQ0FBQyxVQUFBMmxCLE9BQU8sRUFBSTtNQUN4QixJQUFJNG1DLHNEQUFPLENBQUNxRCxLQUFLLEVBQUV0OUIsSUFBSSxFQUFFM00sT0FBTyxDQUFDcUQsTUFBTSxDQUFDLEVBQUU7UUFDdENyRCxPQUFPLENBQUMwL0IsU0FBUyxDQUFDcmxELE9BQU8sQ0FBQzJ0RCx3RUFBeUIsQ0FBQzFLLFdBQVcsQ0FBQzJNLEtBQUssRUFBRXQ5QixJQUFJLEVBQUUzTSxPQUFPLENBQUNxRCxNQUFNLENBQUMsRUFBRW10QixLQUFLLEVBQUU2VyxPQUFPLENBQUMsQ0FBQztNQUNsSDtJQUNKLENBQUMsQ0FBQztFQUNOO0VBQ0FBLE9BQU8sQ0FBQ2h0RCxPQUFPLENBQUMsVUFBQW9wQixLQUFLLEVBQUk7SUFDckJBLEtBQUssQ0FBQ3N3QixjQUFjLENBQUMwSixTQUFTLENBQUMsR0FBR3NNLFVBQVUsSUFBSUQsTUFBTTtJQUN0RCxJQUFJRSxZQUFZLEVBQUU7TUFDZHZtQyxLQUFLLENBQUNvbUMsUUFBUSxHQUFHM00sV0FBVyxDQUFDblcsTUFBTSxFQUFFeUosS0FBSyxFQUFFL3NCLEtBQUssQ0FBQztJQUN0RDtFQUNKLENBQUMsQ0FBQztFQUNGLE9BQU80akMsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbkssV0FBV0EsQ0FBQ25XLE1BQU0sRUFBRXlKLEtBQUssRUFBRTFTLFFBQVEsRUFBRTtFQUNqRCxJQUFJNGhCLFNBQVMsR0FBRyxDQUFDNWhCLFFBQVEsQ0FBQztFQUMxQixJQUFNb3NCLGNBQWMsR0FBRyxDQUFDLENBQUM7RUFDekIsSUFBTUMsWUFBWSxHQUFHLENBQUMsQ0FBQztFQUN2QixJQUFNTixRQUFRLEdBQUcsRUFBRTtFQUNuQixPQUFPbkssU0FBUyxDQUFDemxELE1BQU0sRUFBRTtJQUNyQnlsRCxTQUFTLEdBQUduakQsaURBQU0sQ0FBQyxVQUFBb2xCLENBQUMsRUFBSTtNQUNwQixJQUFNeW9DLE9BQU8sR0FBR0QsWUFBWSxDQUFDeG9DLENBQUMsQ0FBQ29tQyxVQUFVLENBQUM7TUFDMUNvQyxZQUFZLENBQUN4b0MsQ0FBQyxDQUFDb21DLFVBQVUsQ0FBQyxHQUFHLElBQUk7TUFDakMsT0FBT3FDLE9BQU87SUFDbEIsQ0FBQyxFQUFFMUssU0FBUyxDQUFDO0lBQ2IsSUFBTTlNLE9BQU8sR0FBR3IyQyxpREFBTSxDQUFDLFVBQUEyd0IsQ0FBQztNQUFBLE9BQUksQ0FBQ2c5QixjQUFjLENBQUNsTixnQkFBZ0IsQ0FBQzl2QixDQUFDLENBQUMsQ0FBQztJQUFBLEdBQUU3USxpREFBTyxDQUFDeGEsaURBQUcsQ0FBQyxVQUFBc3ZDLEVBQUU7TUFBQSxPQUFJOTBCLGlEQUFPLENBQUM4MEIsRUFBRSxDQUFDbVksVUFBVSxDQUFDOVksS0FBSyxDQUFDLENBQUM7SUFBQSxHQUFFa1AsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvSDlNLE9BQU8sQ0FBQ3Y0QyxPQUFPLENBQUMsVUFBQTZ5QixDQUFDO01BQUEsT0FBS2c5QixjQUFjLENBQUNsTixnQkFBZ0IsQ0FBQzl2QixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7SUFBQSxDQUFDLENBQUM7SUFDbEV3eUIsU0FBUyxHQUFHcmpDLGlEQUFPLENBQUN4YSxpREFBRyxDQUFDLFVBQUFuQixLQUFBO01BQUEsSUFBR3JFLEVBQUUsR0FBQXFFLEtBQUEsQ0FBRnJFLEVBQUU7UUFBRTIwQyxRQUFRLEdBQUF0d0MsS0FBQSxDQUFSc3dDLFFBQVE7TUFBQSxPQUFPaU0sbUJBQW1CLENBQUNsVyxNQUFNLEVBQUV5SixLQUFLLEVBQUVuMEMsRUFBRSxFQUFFMjBDLFFBQVEsRUFBRW1NLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFBQSxHQUFFdkssT0FBTyxDQUFDLENBQUM7SUFDMUgsSUFBSThNLFNBQVMsQ0FBQ3psRCxNQUFNLEVBQUU7TUFDbEI0dkQsUUFBUSxDQUFDbnVELElBQUksQ0FBQ2drRCxTQUFTLENBQUN6bEQsTUFBTSxDQUFDO0lBQ25DO0VBQ0o7RUFDQTR2RCxRQUFRLENBQUNRLE9BQU8sQ0FBQ1IsUUFBUSxDQUFDNXZELE1BQU0sQ0FBQztFQUNqQyxPQUFPNEgsaURBQUcsQ0FBQyxVQUFBL0csQ0FBQztJQUFBLE9BQUl1VyxJQUFJLENBQUN5RCxHQUFHLENBQUNoYSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUNrZSxRQUFRLENBQUMsRUFBRSxDQUFDO0VBQUEsR0FBRTZ3QyxRQUFRLENBQUMsQ0FBQy9wQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BFO0FBQ08sU0FBU3dxQyxrQ0FBa0NBLENBQUN2akIsTUFBTSxFQUFFeUosS0FBSyxFQUFFMVMsUUFBUSxFQUFFO0VBQ3hFLElBQUk0aEIsU0FBUyxHQUFHLENBQUM1aEIsUUFBUSxDQUFDO0VBQzFCLElBQUlvc0IsY0FBYyxHQUFHLENBQUMsQ0FBQztFQUN2QjtFQUNBLE9BQU94SyxTQUFTLENBQUN6bEQsTUFBTSxFQUFFO0lBQ3JCO0lBQ0EsSUFBTTI0QyxPQUFPLEdBQUdyMkMsaURBQU0sQ0FBQyxVQUFBMndCLENBQUM7TUFBQSxPQUFJLENBQUNnOUIsY0FBYyxDQUFDbE4sZ0JBQWdCLENBQUM5dkIsQ0FBQyxDQUFDLENBQUM7SUFBQSxHQUFFN1EsaURBQU8sQ0FBQ3hhLGlEQUFHLENBQUMsVUFBQXN2QyxFQUFFO01BQUEsT0FBSTkwQixpREFBTyxDQUFDODBCLEVBQUUsQ0FBQ21ZLFVBQVUsQ0FBQzlZLEtBQUssQ0FBQyxDQUFDO0lBQUEsR0FBRWtQLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0h3SyxjQUFjLEdBQUc1d0MsaURBQU0sQ0FBQyxVQUFDOHdDLE9BQU8sRUFBRWw5QixDQUFDO01BQUEsT0FBS3ZWLGlEQUFLLENBQUNxbEMsZ0JBQWdCLENBQUM5dkIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFazlCLE9BQU8sQ0FBQztJQUFBLEdBQUVGLGNBQWMsRUFBRXRYLE9BQU8sQ0FBQztJQUMzRzhNLFNBQVMsR0FBR3JqQyxpREFBTyxDQUFDeGEsaURBQUcsQ0FBQyxVQUFBazBDLEtBQUE7TUFBQSxJQUFHMTVDLEVBQUUsR0FBQTA1QyxLQUFBLENBQUYxNUMsRUFBRTtRQUFFMjBDLFFBQVEsR0FBQStFLEtBQUEsQ0FBUi9FLFFBQVE7TUFBQSxPQUFPaU0sbUJBQW1CLENBQUNsVyxNQUFNLEVBQUV5SixLQUFLLEVBQUVuMEMsRUFBRSxFQUFFMjBDLFFBQVEsRUFBRW1NLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFBQSxHQUFFdkssT0FBTyxDQUFDLENBQUM7RUFDOUg7RUFDQSxPQUFPc1gsY0FBYztBQUN6QjtBQUNPLElBQU1LLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUkvWixLQUFLLEVBQUVnYSxVQUFVLEVBQTBDO0VBQUEsSUFBeEM5SyxTQUFTLEdBQUExbEQsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBR3d3RCxVQUFVO0VBQUEsSUFBRXpqQixNQUFNLEdBQUEvc0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRyxDQUFDLENBQUM7RUFDcEY7RUFDQSxJQUFJLENBQUN3d0QsVUFBVSxDQUFDdndELE1BQU0sRUFBRTtJQUNwQixPQUFPLEVBQUU7RUFDYjtFQUNBO0VBQ0EsSUFBTTI0QyxPQUFPLEdBQUcvd0MsaURBQUcsQ0FBQ203QyxnQkFBZ0IsRUFBRTFqQyxpREFBTSxDQUFDLFVBQUM0VCxDQUFDLEVBQUVpa0IsRUFBRTtJQUFBLE9BQUtsNEIsaURBQU0sQ0FBQ2lVLENBQUMsRUFBRTdRLGlEQUFPLENBQUM4MEIsRUFBRSxDQUFDbVksVUFBVSxDQUFDOVksS0FBSyxDQUFDLENBQUMsQ0FBQztFQUFBLEdBQUUsRUFBRSxFQUFFa1AsU0FBUyxDQUFDLENBQUM7RUFDakg7RUFDQSxJQUFJK0ssVUFBVSxHQUFHLENBQUMsQ0FBQztFQUNuQjdYLE9BQU8sQ0FBQ3Y0QyxPQUFPLENBQUMsVUFBQWtxQixNQUFNO0lBQUEsT0FBS2ttQyxVQUFVLENBQUNsbUMsTUFBTSxDQUFDLEdBQUcsSUFBSTtFQUFBLENBQUMsQ0FBQztFQUN0RDtFQUNBO0VBQ0EsSUFBSTVxQixNQUFNLENBQUNZLElBQUksQ0FBQ3dzQyxNQUFNLENBQUMsQ0FBQzlzQyxNQUFNLEVBQUU7SUFDNUI7SUFDQSxJQUFNeXdELGlCQUFpQixHQUFHcnVDLGlEQUFPLENBQUN4YSxpREFBRyxDQUFDLFVBQUFzdkMsRUFBRTtNQUFBLE9BQUltWixrQ0FBa0MsQ0FBQ3ZqQixNQUFNLEVBQUV5SixLQUFLLEVBQUVXLEVBQUUsQ0FBQztJQUFBLEdBQUV1TyxTQUFTLENBQUMsQ0FBQztJQUM5RztJQUNBO0lBQ0EsSUFBSWdMLGlCQUFpQixDQUFDendELE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDOUJ3d0QsVUFBVSxHQUFHOXdELE1BQU0sQ0FBQ0MsTUFBTSxDQUFBMGUsS0FBQSxDQUFiM2UsTUFBTSxHQUFRK3dELGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFBenhDLE1BQUEsQ0FBQXliLGtCQUFBLENBQUtnMkIsaUJBQWlCLEdBQUM7SUFDMUU7RUFDSjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFNQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJbGpDLE1BQU0sRUFBRW1yQixPQUFPO0lBQUEsT0FBS25yQixNQUFNLENBQUNsckIsTUFBTSxDQUFDLFVBQUFzcUIsS0FBSztNQUFBLE9BQUksQ0FBQytyQixPQUFPLENBQUN2akIsSUFBSSxDQUFDLFVBQUE5SyxNQUFNO1FBQUEsT0FBSXk0QixnQkFBZ0IsQ0FBQ24yQixLQUFLLENBQUMsS0FBS20yQixnQkFBZ0IsQ0FBQ3o0QixNQUFNLENBQUM7TUFBQSxFQUFDO0lBQUEsRUFBQztFQUFBO0VBQ3RKO0VBQ0E7RUFDQSxPQUFPaG9CLGlEQUFNLENBQUMsVUFBQTQwQyxFQUFFO0lBQUEsT0FBSTM2QixrREFBRyxDQUFDLFVBQUFvMEMsR0FBRztNQUFBLE9BQUksQ0FBQ0gsVUFBVSxDQUFDek4sZ0JBQWdCLENBQUM0TixHQUFHLENBQUMsQ0FBQztJQUFBLEdBQUVELG1CQUFtQixDQUFDdHVDLGlEQUFPLENBQUM4MEIsRUFBRSxDQUFDRyxTQUFTLENBQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUVuMEIsaURBQU8sQ0FBQzgwQixFQUFFLENBQUNtWSxVQUFVLENBQUM5WSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFBQSxHQUFFZ2EsVUFBVSxDQUFDO0FBQ3JLLENBQUM7QUFDTSxJQUFNSyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJOWpCLE1BQU0sRUFBRXlKLEtBQUssRUFBRXhyQyxNQUFNLEVBQUV2RixPQUFPLEVBQUs7RUFDbEUsSUFBSXFyRCxVQUFVLEdBQUcsRUFBRTtFQUNuQixJQUFJcEwsU0FBUyxHQUFHOEksMkVBQTRCLENBQUN6aEIsTUFBTSxFQUFFeUosS0FBSyxFQUFFeHJDLE1BQU0sRUFBRXZGLE9BQU8sQ0FBQztFQUM1RTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFHSSxPQUFPLElBQUksRUFBRTtJQUNUO0lBQ0EsSUFBQXNyRCxVQUFBLEdBQTZCdi9CLGtEQUFTLENBQUMsVUFBQWdyQixLQUFBO1FBQUEsSUFBZS91QixNQUFNLEdBQUErdUIsS0FBQSxDQUFsQjFZLFFBQVEsQ0FBSXJXLE1BQU07VUFBSTZwQixTQUFTLEdBQUFrRixLQUFBLENBQVRsRixTQUFTO1FBQUEsT0FBTzk2QixrREFBRyxDQUFDNDJCLHdEQUFhLEVBQUUzbEIsTUFBTSxDQUFDLElBQ3RHLENBQUNpQixrREFBTyxDQUFDdnBCLGtEQUFVLENBQUMwQyxpREFBRyxDQUFDbTdDLGdCQUFnQixFQUFFM2dDLGlEQUFPLENBQUNpMUIsU0FBUyxDQUFDZCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUVzYSxVQUFVLENBQUMsQ0FBQztNQUFBLEdBQUVwTCxTQUFTLENBQUM7TUFBQXNMLFdBQUEsR0FBQXJ3RCxjQUFBLENBQUFvd0QsVUFBQTtNQUQzRkUsUUFBUSxHQUFBRCxXQUFBO01BQUVFLFFBQVEsR0FBQUYsV0FBQTtJQUV6QjtJQUNBLElBQUksQ0FBQ0UsUUFBUSxDQUFDanhELE1BQU0sRUFBRTtNQUNsQjtJQUNKO0lBQ0F5bEQsU0FBUyxHQUFHdUwsUUFBUTtJQUNwQjtJQUNBSCxVQUFVLEdBQUc3eEMsaURBQU0sQ0FBQzZ4QyxVQUFVLEVBQUVqcEQsaURBQUcsQ0FBQ203QyxnQkFBZ0IsRUFBRTNnQyxpREFBTyxDQUFDeGEsaURBQUcsQ0FBQyxVQUFBNDBDLEtBQUE7TUFBQSxJQUFHNlMsVUFBVSxHQUFBN1MsS0FBQSxDQUFWNlMsVUFBVTtNQUFBLE9BQU9BLFVBQVUsQ0FBQzlZLEtBQUssQ0FBQztJQUFBLEdBQUUwYSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekg7RUFDQSxJQUFJenJELE9BQU8sQ0FBQzByRCxVQUFVLEVBQUU7SUFDcEIsSUFBSUMsTUFBTSxHQUFHejVDLGtEQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUzTSxNQUFNLENBQUM7SUFDMUMsSUFBSW9tRCxNQUFNLEVBQUU7TUFDUkEsTUFBTSxHQUFHL2QsMERBQVcsQ0FBQytkLE1BQU0sQ0FBQztNQUM1QjtNQUNBMUwsU0FBUyxHQUFHQSxTQUFTLENBQUNuakQsTUFBTSxDQUFDLFVBQUE0MEMsRUFBRTtRQUFBLE9BQUlBLEVBQUUsQ0FBQ3JULFFBQVEsQ0FBQ3JXLE1BQU0sQ0FBQ25PLE1BQU0sQ0FBQyxVQUFDckYsUUFBUSxFQUFFNFMsS0FBSztVQUFBLE9BQUs1UyxRQUFRLElBQ3JGbzVCLDBEQUFXLENBQUN4bUIsS0FBSyxDQUFDeHFCLEVBQUUsQ0FBQyxJQUFJK3VELE1BQU0sSUFDNUIzckQsT0FBTyxDQUFDMHJELFVBQVUsQ0FBQ251QyxRQUFRLENBQUM2SixLQUFLLENBQUNtcUIsUUFBUSxDQUFFO1FBQUEsR0FBRSxLQUFLLENBQUM7TUFBQSxFQUFDO0lBQ2pFO0VBQ0o7RUFDQTtBQUNKO0FBQ0E7RUFDSSxJQUFNcWEsY0FBYyxHQUFHaDZDLElBQUksQ0FBQ0UsTUFBTSxDQUFDLENBQUMsQ0FBQ3lILFFBQVEsQ0FBQyxFQUFFLENBQUM7RUFDakQsT0FBT25YLGlEQUFHLENBQUMsVUFBQXN2QyxFQUFFO0lBQUEsT0FBQTFJLGFBQUEsQ0FBQUEsYUFBQSxLQUFVMEksRUFBRTtNQUFFa2E7SUFBYztFQUFBLENBQUcsRUFBRTNMLFNBQVMsQ0FBQztBQUM1RCxDQUFDO0FBQ00sSUFBTTRMLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUE3VCxLQUFBO0VBQUEsSUFBTTlHLE9BQU8sR0FBQThHLEtBQUEsQ0FBUDlHLE9BQU87SUFBQTRhLGNBQUEsR0FBQTlULEtBQUEsQ0FBRTNaLFFBQVE7SUFBSXJXLE1BQU0sR0FBQThqQyxjQUFBLENBQU45akMsTUFBTTtJQUFFbXJCLE9BQU8sR0FBQTJZLGNBQUEsQ0FBUDNZLE9BQU87SUFBRXBZLEtBQUssR0FBQSt3QixjQUFBLENBQUwvd0IsS0FBSztFQUFBLE9BQVN2aEIsaURBQU0sQ0FBQ3BYLGlEQUFHLENBQUNtN0MsZ0JBQWdCLEtBQUEvakMsTUFBQSxDQUFBeWIsa0JBQUEsQ0FBTWpOLE1BQU0sR0FBQWlOLGtCQUFBLENBQUtrZSxPQUFPLEdBQUFsZSxrQkFBQSxDQUFLOEYsS0FBSyxFQUFDLENBQUMsRUFBRXJnQyxLQUFLLENBQUMwQixPQUFPLENBQUM4MEMsT0FBTyxDQUFDLEdBQUdBLE9BQU8sR0FBR0EsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQ0EsT0FBTyxDQUFDLENBQUMsQ0FBQzd3QixJQUFJLENBQUMsR0FBRyxDQUFDO0FBQUE7QUFDak8sU0FBUzByQyxnQkFBZ0JBLENBQUNudkQsRUFBRSxFQUFFb3ZELFVBQVUsRUFBRTFrQixNQUFNLEVBQUV5SixLQUFLLEVBQUU7RUFDNUQsT0FBT24wQixpREFBTyxDQUFDeGEsaURBQUcsQ0FBQyxVQUFBbzBDLFFBQVE7SUFBQSxPQUFJZ0gsbUJBQW1CLENBQUNsVyxNQUFNLEVBQUV5SixLQUFLLEVBQUVuMEMsRUFBRSxFQUFFNDVDLFFBQVEsQ0FBQztFQUFBLEdBQUUxN0Msa0RBQUksQ0FBQ2t4RCxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTXBPLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUl2ZixRQUFRLEVBQUV5RixPQUFPLEVBQUVvTixPQUFPO0VBQUEsT0FBTTtJQUNqRTdTLFFBQVE7SUFDUjZTLE9BQU87SUFDUG9YLFVBQVUsRUFBRWpxQixRQUFRLENBQUN2WixNQUFNLEdBQUdvc0IsT0FBTztJQUNyQzJZLFVBQVUsRUFBRSxTQUFaQSxVQUFVQSxDQUFFOVksS0FBSztNQUFBLE9BQUkxUyxRQUFRLENBQUM4VSxPQUFPLENBQUMvd0MsR0FBRyxDQUFDMGhDLE9BQU8sQ0FBQ2lOLEtBQUssQ0FBQyxDQUFDO0lBQUE7SUFDekRjLFNBQVMsRUFBRSxTQUFYQSxTQUFTQSxDQUFFZCxLQUFLO01BQUEsT0FBSTFTLFFBQVEsQ0FBQ3JXLE1BQU0sQ0FBQzVsQixHQUFHLENBQUMwaEMsT0FBTyxDQUFDaU4sS0FBSyxDQUFDLENBQUM7SUFBQTtJQUN2RC9kLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFFK2QsS0FBSztNQUFBLE9BQUkxUyxRQUFRLENBQUN0RCxLQUFLLENBQUMzNEIsR0FBRyxDQUFDMGhDLE9BQU8sQ0FBQ2lOLEtBQUssQ0FBQyxDQUFDO0lBQUE7SUFDckR1RCxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCbVYsV0FBVyxFQUFFO0VBQ2pCLENBQUM7QUFBQSxDQUFDO0FBQ0ssU0FBU3dDLGNBQWNBLENBQUNoTSxTQUFTLEVBQUVsUCxLQUFLLEVBQUU7RUFDN0MsSUFBQW1iLFdBQUEsR0FBb0JuZ0Msa0RBQVMsQ0FBQyxVQUFBa3NCLEtBQUE7TUFBQSxJQUFHNFIsVUFBVSxHQUFBNVIsS0FBQSxDQUFWNFIsVUFBVTtRQUFjMVcsT0FBTyxHQUFBOEUsS0FBQSxDQUFuQjVaLFFBQVEsQ0FBSThVLE9BQU87TUFBQSxPQUFTdjJCLGlEQUFPLENBQUNpdEMsVUFBVSxDQUFDOVksS0FBSyxDQUFDLENBQUMsQ0FBQ3YyQyxNQUFNLEtBQUsyNEMsT0FBTyxDQUFDMzRDLE1BQU07SUFBQSxHQUFFeWxELFNBQVMsQ0FBQztJQUFBa00sV0FBQSxHQUFBanhELGNBQUEsQ0FBQWd4RCxXQUFBO0lBQWhJRSxPQUFPLEdBQUFELFdBQUE7RUFDaEIsSUFBQUUsV0FBQSxHQUFxQnRnQyxrREFBUyxDQUFDLFVBQUFtc0IsS0FBQTtNQUFBLElBQUcyUixVQUFVLEdBQUEzUixLQUFBLENBQVYyUixVQUFVO01BQUEsT0FBTyxDQUFDanRDLGlEQUFPLENBQUNpdEMsVUFBVSxDQUFDOVksS0FBSyxDQUFDLENBQUMsQ0FBQ3YyQyxNQUFNO0lBQUEsR0FBRTR4RCxPQUFPLENBQUM7SUFBQUUsV0FBQSxHQUFBcHhELGNBQUEsQ0FBQW14RCxXQUFBO0lBQXRGRSxRQUFRLEdBQUFELFdBQUE7RUFDakIsSUFBTUUsS0FBSyxHQUFHcHFELGlEQUFHLENBQUMsVUFBQXN2QyxFQUFFO0lBQUEsT0FBSXg1QixpREFBSyxDQUFDLGdCQUFnQixFQUFFZ1Usa0RBQU0sQ0FBQyxVQUFDanlCLENBQUMsRUFBRTBoRCxNQUFNO01BQUEsT0FBS3hOLCtDQUFPLENBQUM0QyxLQUFLLEVBQUVrTyw2REFBYyxDQUFDdEQsTUFBTSxDQUFDLENBQUMvK0MsRUFBRSxDQUFDO0lBQUEsR0FBRTgwQyxFQUFFLENBQUM0QyxjQUFjLENBQUMsRUFBRTVDLEVBQUUsQ0FBQztFQUFBLEdBQUU2YSxRQUFRLENBQUM7RUFDbkosT0FBTztJQUNIQyxLQUFLO0lBQ0xKO0VBQ0osQ0FBQztBQUNMO0FBQ08sU0FBU3ZPLFdBQVdBLENBQUN3SixPQUFPLEVBQUVDLE9BQU8sRUFBRUMsY0FBYyxFQUFFO0VBQzFELE9BQU8sVUFBQ3hXLEtBQUs7SUFBQSxPQUFLLFVBQUFvSCxLQUFBLEVBQWlDO01BQUEsSUFBMUJzVSxTQUFTLEdBQUF0VSxLQUFBLENBQWJ2N0MsRUFBRTtRQUFhMjBDLFFBQVEsR0FBQTRHLEtBQUEsQ0FBUjVHLFFBQVE7TUFDeEMsSUFBSSxPQUFPa2IsU0FBUyxLQUFLLFFBQVEsRUFBRTtRQUMvQixJQUFNdjZDLEtBQUksR0FBR2k4QiwrQ0FBTyxDQUFDNEMsS0FBSyxFQUFFMGIsU0FBUyxDQUFDO1FBQ3RDLE9BQU92NkMsS0FBSSxHQUFHLENBQUM7VUFBRXRWLEVBQUUsRUFBRTZ2RCxTQUFTO1VBQUVsYixRQUFRO1VBQUVyL0IsSUFBSSxFQUFKQTtRQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUU7TUFDMUQ7TUFDQSxJQUFNczRDLEtBQUssR0FBR3R3RCxNQUFNLENBQUNZLElBQUksQ0FBQzJ4RCxTQUFTLENBQUMsQ0FBQ2htQyxJQUFJLENBQUMsQ0FBQztNQUMzQyxJQUFNMmdDLFdBQVcsR0FBRy83QyxpREFBSyxDQUFDbS9DLEtBQUssRUFBRWlDLFNBQVMsQ0FBQztNQUMzQyxJQUFNck0sTUFBTSxHQUFHb0ssS0FBSyxDQUFDbnFDLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDOUIsSUFBTXFzQyxRQUFRLEdBQUczYixLQUFLLENBQUN3QixJQUFJLENBQUM2TixNQUFNLENBQUM7TUFDbkMsSUFBSSxDQUFDc00sUUFBUSxFQUFFO1FBQ1gsT0FBTyxFQUFFO01BQ2I7TUFDQSxJQUFNNytDLE1BQU0sR0FBRyxFQUFFO01BQ2pCNitDLFFBQVEsQ0FBQzl4RCxPQUFPLENBQUMsVUFBQTAvQyxLQUFBLEVBQTRCO1FBQUEsSUFBakJwdEIsSUFBSSxHQUFBb3RCLEtBQUEsQ0FBWjEyQixNQUFNO1VBQVExUixJQUFJLEdBQUFvb0MsS0FBQSxDQUFKcG9DLElBQUk7UUFDbEMsSUFBSWkxQyxzREFBTyxDQUFDcUQsS0FBSyxFQUFFdDlCLElBQUksRUFBRWs2QixXQUFXLEVBQUVDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxjQUFjLENBQUMsRUFBRTtVQUNyRTE1QyxNQUFNLENBQUM1UixJQUFJLENBQUM7WUFBRVcsRUFBRSxFQUFFNHdCLGtEQUFNLENBQUNnOUIsS0FBSyxFQUFFdDlCLElBQUksQ0FBQztZQUFFcWtCLFFBQVE7WUFBRXIvQjtVQUFLLENBQUMsQ0FBQztRQUM1RDtNQUNKLENBQUMsQ0FBQztNQUNGLE9BQU9yRSxNQUFNO0lBQ2pCLENBQUM7RUFBQTtBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkN6TUEsdUtBQUF2TyxDQUFBLEVBQUFvdUIsQ0FBQSxFQUFBdEMsQ0FBQSx3QkFBQXh2QixNQUFBLEdBQUFBLE1BQUEsT0FBQXlpQixDQUFBLEdBQUErTSxDQUFBLENBQUF2dkIsUUFBQSxrQkFBQTR4QixDQUFBLEdBQUFyQyxDQUFBLENBQUE2WCxXQUFBLDhCQUFBNW5DLEVBQUErdkIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTZtQixDQUFBLEdBQUE3RCxDQUFBLElBQUFBLENBQUEsQ0FBQXZTLFNBQUEsWUFBQW8zQixTQUFBLEdBQUE3a0IsQ0FBQSxHQUFBNmtCLFNBQUEsRUFBQWxWLENBQUEsR0FBQTl6QixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxDQUFBcFcsU0FBQSxVQUFBcTNCLG1CQUFBLENBQUFuVixDQUFBLHVCQUFBNUMsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxRQUFBcHlCLENBQUEsRUFBQTZtQixDQUFBLEVBQUE4TCxDQUFBLEVBQUFuVyxDQUFBLE1BQUFxRCxDQUFBLEdBQUF1UyxDQUFBLFFBQUF0ckIsQ0FBQSxPQUFBaWhDLENBQUEsS0FBQWxvQixDQUFBLEtBQUFtRCxDQUFBLEtBQUEvRCxDQUFBLEVBQUFoYixDQUFBLEVBQUE0WixDQUFBLEVBQUFtQixDQUFBLEVBQUF4QyxDQUFBLEVBQUF3QyxDQUFBLENBQUFqZ0IsSUFBQSxDQUFBa0YsQ0FBQSxNQUFBK2EsQ0FBQSxXQUFBQSxFQUFBcVQsQ0FBQSxFQUFBdEMsQ0FBQSxXQUFBL3ZCLENBQUEsR0FBQXF5QixDQUFBLEVBQUF4TCxDQUFBLE1BQUE4TCxDQUFBLEdBQUExdUIsQ0FBQSxFQUFBOGpDLENBQUEsQ0FBQS9rQixDQUFBLEdBQUErTSxDQUFBLEVBQUFsUyxDQUFBLGdCQUFBbUIsRUFBQStRLENBQUEsRUFBQS9NLENBQUEsU0FBQTZELENBQUEsR0FBQWtKLENBQUEsRUFBQTRDLENBQUEsR0FBQTNQLENBQUEsRUFBQXFQLENBQUEsT0FBQXZyQixDQUFBLElBQUEwVixDQUFBLEtBQUE0VixDQUFBLElBQUFDLENBQUEsR0FBQXhTLENBQUEsQ0FBQTFnQixNQUFBLEVBQUFrekIsQ0FBQSxVQUFBRCxDQUFBLEVBQUFweUIsQ0FBQSxHQUFBNmYsQ0FBQSxDQUFBd1MsQ0FBQSxHQUFBclQsQ0FBQSxHQUFBK29CLENBQUEsQ0FBQWxvQixDQUFBLEVBQUFpUSxDQUFBLEdBQUE5dkIsQ0FBQSxLQUFBK3ZCLENBQUEsUUFBQXFDLENBQUEsR0FBQXRDLENBQUEsS0FBQTlNLENBQUEsTUFBQTJQLENBQUEsR0FBQTN5QixDQUFBLEVBQUE2bUIsQ0FBQSxHQUFBN21CLENBQUEsWUFBQTZtQixDQUFBLFdBQUE3bUIsQ0FBQSxNQUFBQSxDQUFBLE1BQUFpRSxDQUFBLElBQUFqRSxDQUFBLE9BQUFnZixDQUFBLE1BQUFvVCxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvUSxDQUFBLEdBQUFoZixDQUFBLFFBQUE2bUIsQ0FBQSxNQUFBa2hCLENBQUEsQ0FBQTlvQixDQUFBLEdBQUErRCxDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQWhqQixDQUFBLE9BQUFnZixDQUFBLEdBQUE4USxDQUFBLEtBQUFzQyxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsSUFBQUEsQ0FBQSxHQUFBOE0sQ0FBQSxNQUFBOXZCLENBQUEsTUFBQSt2QixDQUFBLEVBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBOE0sQ0FBQSxFQUFBakosQ0FBQSxjQUFBdUwsQ0FBQSxJQUFBckMsQ0FBQSxhQUFBbFMsQ0FBQSxRQUFBL1csQ0FBQSxPQUFBa2MsQ0FBQSxxQkFBQW9QLENBQUEsRUFBQXZTLENBQUEsRUFBQWlRLENBQUEsUUFBQXRULENBQUEsWUFBQXhiLFNBQUEsdUNBQUE4RixDQUFBLFVBQUErWSxDQUFBLElBQUFiLENBQUEsQ0FBQWEsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBakosQ0FBQSxHQUFBaEgsQ0FBQSxFQUFBOFMsQ0FBQSxHQUFBN0MsQ0FBQSxHQUFBdUMsQ0FBQSxHQUFBeEwsQ0FBQSxPQUFBNWlCLENBQUEsR0FBQTB1QixDQUFBLE1BQUE3ckIsQ0FBQSxLQUFBOUcsQ0FBQSxLQUFBNm1CLENBQUEsR0FBQUEsQ0FBQSxRQUFBQSxDQUFBLFNBQUFraEIsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQWhFLENBQUEsQ0FBQTZILENBQUEsRUFBQThMLENBQUEsS0FBQW9WLENBQUEsQ0FBQS9rQixDQUFBLEdBQUEyUCxDQUFBLEdBQUFvVixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBMFQsQ0FBQSxhQUFBblcsQ0FBQSxNQUFBeGMsQ0FBQSxRQUFBNm1CLENBQUEsS0FBQXVMLENBQUEsWUFBQUMsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQW95QixDQUFBLFdBQUFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsRUFBQTJ5QixDQUFBLFVBQUEzeEIsU0FBQSwyQ0FBQXF4QixDQUFBLENBQUExeEIsSUFBQSxTQUFBMHhCLENBQUEsRUFBQU0sQ0FBQSxHQUFBTixDQUFBLENBQUF4eEIsS0FBQSxFQUFBZ21CLENBQUEsU0FBQUEsQ0FBQSxvQkFBQUEsQ0FBQSxLQUFBd0wsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQTBHLE1BQUEsS0FBQTJyQixDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxHQUFBNm1CLENBQUEsU0FBQThMLENBQUEsR0FBQTN4QixTQUFBLHVDQUFBb3hCLENBQUEsZ0JBQUF2TCxDQUFBLE9BQUE3bUIsQ0FBQSxHQUFBaUUsQ0FBQSxjQUFBb3VCLENBQUEsSUFBQXZyQixDQUFBLEdBQUFpaEMsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQTJQLENBQUEsR0FBQTVDLENBQUEsQ0FBQS9nQixJQUFBLENBQUFnVSxDQUFBLEVBQUEra0IsQ0FBQSxPQUFBbHFCLENBQUEsa0JBQUF3VSxDQUFBLElBQUFyeUIsQ0FBQSxHQUFBaUUsQ0FBQSxFQUFBNGlCLENBQUEsTUFBQThMLENBQUEsR0FBQU4sQ0FBQSxjQUFBN1YsQ0FBQSxtQkFBQTNiLEtBQUEsRUFBQXd4QixDQUFBLEVBQUExeEIsSUFBQSxFQUFBbUcsQ0FBQSxTQUFBaXBCLENBQUEsRUFBQXFDLENBQUEsRUFBQXB5QixDQUFBLFFBQUEyeUIsQ0FBQSxRQUFBOVUsQ0FBQSxnQkFBQWdxQixVQUFBLGNBQUFHLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE1VixDQUFBLEdBQUF4ekIsTUFBQSxDQUFBNGxCLGNBQUEsTUFBQW9DLENBQUEsTUFBQTdELENBQUEsSUFBQXFQLENBQUEsQ0FBQUEsQ0FBQSxJQUFBclAsQ0FBQSxTQUFBOGtCLG1CQUFBLENBQUF6VixDQUFBLE9BQUFyUCxDQUFBLGlDQUFBcVAsQ0FBQSxHQUFBTSxDQUFBLEdBQUFzViwwQkFBQSxDQUFBeDNCLFNBQUEsR0FBQW8zQixTQUFBLENBQUFwM0IsU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsWUFBQXJLLEVBQUF2WSxDQUFBLFdBQUFwRixNQUFBLENBQUFxcEMsY0FBQSxHQUFBcnBDLE1BQUEsQ0FBQXFwQyxjQUFBLENBQUFqa0MsQ0FBQSxFQUFBZ2tDLDBCQUFBLEtBQUFoa0MsQ0FBQSxDQUFBa2tDLFNBQUEsR0FBQUYsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUFtdUIsQ0FBQSx5QkFBQW51QixDQUFBLENBQUF3TSxTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBbU8sQ0FBQSxHQUFBMXVCLENBQUEsV0FBQStqQyxpQkFBQSxDQUFBdjNCLFNBQUEsR0FBQXczQiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBblYsQ0FBQSxpQkFBQXNWLDBCQUFBLEdBQUFILG1CQUFBLENBQUFHLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBelMsV0FBQSx3QkFBQXVTLG1CQUFBLENBQUFHLDBCQUFBLEVBQUE3VixDQUFBLHdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsR0FBQW1WLG1CQUFBLENBQUFuVixDQUFBLEVBQUFQLENBQUEsZ0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBM1AsQ0FBQSxpQ0FBQThrQixtQkFBQSxDQUFBblYsQ0FBQSw4REFBQXlWLFlBQUEsWUFBQUEsYUFBQSxhQUFBaGlDLENBQUEsRUFBQXBHLENBQUEsRUFBQXcwQixDQUFBLEVBQUFoWSxDQUFBO0FBQUEsU0FBQXNyQixvQkFBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBcnlCLENBQUEsR0FBQW5CLE1BQUEsQ0FBQXdSLGNBQUEsUUFBQXJRLENBQUEsdUJBQUFpRSxDQUFBLElBQUFqRSxDQUFBLFFBQUE4bkMsbUJBQUEsWUFBQU8sbUJBQUFwa0MsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXRDLENBQUEsRUFBQS92QixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLENBQUEsRUFBQThyQixDQUFBLElBQUFsdkIsS0FBQSxFQUFBbWlCLENBQUEsRUFBQTlTLFVBQUEsR0FBQW1pQixDQUFBLEVBQUFsaUIsWUFBQSxHQUFBa2lCLENBQUEsRUFBQWppQixRQUFBLEdBQUFpaUIsQ0FBQSxNQUFBcHVCLENBQUEsQ0FBQThyQixDQUFBLElBQUEvTSxDQUFBLFlBQUFvUCxDQUFBLFlBQUFBLEVBQUFyQyxDQUFBLEVBQUEvTSxDQUFBLElBQUE4a0IsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxZQUFBOXJCLENBQUEsZ0JBQUFxa0MsT0FBQSxDQUFBdlksQ0FBQSxFQUFBL00sQ0FBQSxFQUFBL2UsQ0FBQSxVQUFBbXVCLENBQUEsYUFBQUEsQ0FBQSxjQUFBQSxDQUFBLG9CQUFBMFYsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQTtBQUFBLFNBQUFrVyxtQkFBQXZsQixDQUFBLEVBQUFxUCxDQUFBLEVBQUFwdUIsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXFDLENBQUEsRUFBQXZVLENBQUEsRUFBQWdKLENBQUEsY0FBQTdtQixDQUFBLEdBQUFnakIsQ0FBQSxDQUFBbkYsQ0FBQSxFQUFBZ0osQ0FBQSxHQUFBOEwsQ0FBQSxHQUFBM3lCLENBQUEsQ0FBQWEsS0FBQSxXQUFBbWlCLENBQUEsZ0JBQUEvZSxDQUFBLENBQUErZSxDQUFBLEtBQUFoakIsQ0FBQSxDQUFBVyxJQUFBLEdBQUEweEIsQ0FBQSxDQUFBTSxDQUFBLElBQUE2VixPQUFBLENBQUFDLE9BQUEsQ0FBQTlWLENBQUEsRUFBQStWLElBQUEsQ0FBQTNZLENBQUEsRUFBQXFDLENBQUE7QUFBQSxTQUFBdVcsa0JBQUEzbEIsQ0FBQSw2QkFBQXFQLENBQUEsU0FBQXB1QixDQUFBLEdBQUEvRSxTQUFBLGFBQUFzcEMsT0FBQSxXQUFBelksQ0FBQSxFQUFBcUMsQ0FBQSxRQUFBdlUsQ0FBQSxHQUFBbUYsQ0FBQSxDQUFBeEYsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBcHVCLENBQUEsWUFBQTJrQyxNQUFBNWxCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxVQUFBN2xCLENBQUEsY0FBQTZsQixPQUFBN2xCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxXQUFBN2xCLENBQUEsS0FBQTRsQixLQUFBO0FBRGlDO0FBQ1U7QUFDTztBQUNBO0FBQ1o7QUFDVjtBQUM2QjtBQUNjO0FBQ3pCO0FBQ0Y7QUFFckMsSUFBTVksT0FBTyxHQUFHaUoseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkQsSUFBTTBQLGVBQWUsR0FBRy9lLHlEQUFZLENBQUNxUCxxREFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDcEUsSUFBTTFVLFNBQVMsR0FBR3FGLHlEQUFZLENBQUNxUCxxREFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3ZELElBQU10UyxjQUFjLEdBQUdpRCx5REFBWSxDQUFDcVAscURBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ2xFLElBQU1yWSxTQUFTLEdBQUdnSix5REFBWSxDQUFDcVAscURBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN2RCxJQUFNM1UsUUFBUSxHQUFHc0YseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDckQsSUFBTW5ZLFNBQVMsR0FBRzhJLHlEQUFZLENBQUNxUCxxREFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3ZELElBQU1wWSxRQUFRLEdBQUcrSSx5REFBWSxDQUFDcVAscURBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRCxJQUFNMlAsZUFBZSxHQUFHaGYseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNwRSxJQUFNNFAsZUFBZSxHQUFHamYseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNuRSxJQUFNNlAsZUFBZSxHQUFHbGYseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUVuRSxJQUFNOFAsWUFBWSxHQUFHbmYseURBQVksQ0FBQ3FQLHFEQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUU5RCxTQUFTblAsV0FBV0EsQ0FBQ3pCLE9BQU8sRUFBRTtFQUNqQyxPQUFPLFVBQUNoVSxRQUFRLEVBQUV2RixRQUFRLEVBQUs7SUFDM0IsSUFBTWxsQixTQUFTLEdBQUdvRSxpREFBSSxDQUFDcTZCLE9BQU8sQ0FBQzRKLFFBQVEsRUFBRW5qQixRQUFRLENBQUMsQ0FBQyxDQUFDenRCLE1BQU0sQ0FBQztJQUMzRHFuRCwwREFBWSxDQUFDOStDLFNBQVMsRUFBRXkrQixPQUFPLENBQUNsaEMsS0FBSyxFQUFFa3RCLFFBQVEsQ0FBQztJQUNoREEsUUFBUSxDQUFDMDBCLFlBQVksQ0FBQzFnQixPQUFPLENBQUMsQ0FBQztFQUNuQyxDQUFDO0FBQ0w7QUFFTyxJQUFNMmdCLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUczZ0IsT0FBTztFQUFBLE9BQUksVUFBQ2hVLFFBQVEsRUFBRXZGLFFBQVEsRUFBSztJQUNuRSxJQUFBeVksU0FBQSxHQUFnQnpZLFFBQVEsQ0FBQyxDQUFDO01BQW5CK2QsS0FBSyxHQUFBdEYsU0FBQSxDQUFMc0YsS0FBSztJQUNaeFksUUFBUSxDQUFDdzBCLGVBQWUsQ0FBQ3hnQixPQUFPLENBQUMsQ0FBQztJQUNsQ2hVLFFBQVEsQ0FDSndNLFFBQVEsQ0FBQ0Usb0RBQVksQ0FBQ3NILE9BQU8sQ0FBQ3orQixTQUFTLEVBQUV5K0IsT0FBTyxDQUFDbEYsYUFBYSxFQUFFMEosS0FBSyxDQUFDLENBQzFFLENBQUM7RUFDTCxDQUFDO0FBQUE7QUFFTSxJQUFNcE0sYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFHcE0sUUFBUTtFQUFBLE9BQUksVUFBQzdVLE9BQU8sRUFBRW1oQyxLQUFLO0lBQUEsT0FDcER0c0IsUUFBUSxDQUNKc00sT0FBTyxDQUFDO01BQ0o1b0IsSUFBSSxFQUFFLFNBQVM7TUFDZmlhLEtBQUssRUFBRTtRQUFDeFMsT0FBTztRQUFFeXBDLElBQUksRUFBRXRJLEtBQUssQ0FBQ3hrQyxJQUFJLENBQUMsSUFBSTtNQUFDO0lBQzNDLENBQUMsQ0FDTCxDQUFDO0VBQUE7QUFBQTtBQUVFLFNBQVN1a0IscUJBQXFCQSxDQUFBLEVBQUc7RUFDcEMsT0FBTyxVQUFVck0sUUFBUSxFQUFFdkYsUUFBUSxFQUFFO0lBQ2pDZ3dCLHdFQUF5QixDQUFDaHdCLFFBQVEsQ0FBQyxDQUFDLEVBQUUyUixhQUFhLENBQUNwTSxRQUFRLENBQUMsQ0FBQztJQUM5RDYwQixtQkFBbUIsQ0FBQzcwQixRQUFRLEVBQUV2RixRQUFRLENBQUM7SUFDdkN1RixRQUFRLENBQUNzMEIsZUFBZSxDQUFDdm5CLGdFQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztFQUN0RCxDQUFDO0FBQ0w7O0FBRUE7QUFDQSxJQUFNMkYsY0FBYyxHQUFHdGYsa0RBQUksQ0FBQ2xiLE9BQU8sQ0FBQ3k2QixJQUFJLENBQUM7QUFFbEMsU0FBU1AsYUFBYUEsQ0FBQSxFQUFHO0VBQzVCLElBQUk7SUFDQSxPQUFPO01BQ0gsYUFBYSxFQUFFZ2lCLHlDQUFZLENBQUMvc0IsUUFBUSxDQUFDK3NCLE1BQU0sQ0FBQyxDQUFDVTtJQUNqRCxDQUFDO0VBQ0wsQ0FBQyxDQUFDLE9BQU8vdEQsQ0FBQyxFQUFFO0lBQ1IyckMsY0FBYyxDQUFDM3JDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsQ0FBQztFQUNiO0FBQ0o7QUFFQSxTQUFTOHRELG1CQUFtQkEsQ0FBQzcwQixRQUFRLEVBQUV2RixRQUFRLEVBQUU7RUFDN0MsSUFBQXM2QixVQUFBLEdBQWdDdDZCLFFBQVEsQ0FBQyxDQUFDO0lBQW5Dc1UsTUFBTSxHQUFBZ21CLFVBQUEsQ0FBTmhtQixNQUFNO0lBQUV5SixLQUFLLEdBQUF1YyxVQUFBLENBQUx2YyxLQUFLO0lBQUV4ckMsTUFBTSxHQUFBK25ELFVBQUEsQ0FBTi9uRCxNQUFNOztFQUU1QjtFQUNBLElBQUk7SUFDQStoQyxNQUFNLENBQUN5ZCxVQUFVLENBQUN3SSxZQUFZLENBQUMsQ0FBQztFQUNwQyxDQUFDLENBQUMsT0FBT3B4RCxHQUFHLEVBQUU7SUFDVm84QixRQUFRLENBQ0pzTSxPQUFPLENBQUM7TUFDSjVvQixJQUFJLEVBQUUsU0FBUztNQUNmaWEsS0FBSyxFQUFFO1FBQ0h4UyxPQUFPLEVBQUUsdUJBQXVCO1FBQ2hDeXBDLElBQUksRUFBRWh4RCxHQUFHLENBQUNvZCxRQUFRLENBQUM7TUFDdkI7SUFDSixDQUFDLENBQ0wsQ0FBQztFQUNMO0VBRUFnZixRQUFRLENBQ0o2VyxpRUFBcUIsQ0FDakJnYyxvRUFBa0IsQ0FBQzlqQixNQUFNLEVBQUV5SixLQUFLLEVBQUV4ckMsTUFBTSxFQUFFO0lBQ3RDMmpELFdBQVcsRUFBRTtFQUNqQixDQUFDLENBQ0wsQ0FDSixDQUFDO0FBQ0w7QUFFTyxJQUFNc0UsSUFBSSxHQUFHQyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQ2hDLElBQU1DLElBQUksR0FBR0QsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUNoQyxJQUFNRSxNQUFNLEdBQUdGLFdBQVcsQ0FBQyxRQUFRLENBQUM7QUFFM0MsU0FBU0EsV0FBV0EsQ0FBQ25ELFVBQVUsRUFBRTtFQUM3QixPQUFPLFVBQVUveEIsUUFBUSxFQUFFdkYsUUFBUSxFQUFFO0lBQ2pDLElBQUE0NkIsVUFBQSxHQUF5QjU2QixRQUFRLENBQUMsQ0FBQztNQUE1QmlWLE9BQU8sR0FBQTJsQixVQUFBLENBQVAzbEIsT0FBTztNQUFFOEksS0FBSyxHQUFBNmMsVUFBQSxDQUFMN2MsS0FBSztJQUNyQnhZLFFBQVEsQ0FBQ3VWLHlEQUFZLENBQUN3YyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBQXRwRCxJQUFBLEdBQ0ksQ0FBQ3NwRCxVQUFVLEtBQUssTUFBTSxHQUNoQnJpQixPQUFPLENBQUM0bEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUNqQjVsQixPQUFPLENBQUM2bEIsSUFBSSxDQUFDN2xCLE9BQU8sQ0FBQzZsQixJQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztNQUgvQ29DLEVBQUUsR0FBQW9FLElBQUEsQ0FBRnBFLEVBQUU7TUFBRXlPLEtBQUssR0FBQXJLLElBQUEsQ0FBTHFLLEtBQUs7SUFJaEIsSUFBSXpPLEVBQUUsRUFBRTtNQUNKO01BQ0EyN0IsUUFBUSxDQUNKdVYseURBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdCcUksUUFBUSxFQUFFaEksK0NBQU8sQ0FBQzRDLEtBQUssRUFBRW4wQyxFQUFFLENBQUM7UUFDNUJ5TztNQUNKLENBQUMsQ0FDTCxDQUFDO01BRURrdEIsUUFBUSxDQUFDd1YsZUFBZSxDQUFDO1FBQUNueEMsRUFBRTtRQUFFeU87TUFBSyxDQUFDLENBQUMsQ0FBQztJQUMxQztFQUNKLENBQUM7QUFDTDtBQUVPLFNBQVMwaUMsZUFBZUEsQ0FBQTlzQyxLQUFBLEVBQWM7RUFBQSxJQUFackUsRUFBRSxHQUFBcUUsS0FBQSxDQUFGckUsRUFBRTtJQUFFeU8sS0FBSyxHQUFBcEssS0FBQSxDQUFMb0ssS0FBSztFQUN0QztJQUFBLElBQUFpckMsS0FBQSxHQUFBdFMsaUJBQUEsY0FBQVAsWUFBQSxHQUFBNVQsQ0FBQSxDQUFPLFNBQUEwVyxRQUFnQmhPLFFBQVEsRUFBRXZGLFFBQVE7TUFBQSxJQUFBKzZCLFVBQUEsRUFBQXptQixNQUFBLEVBQUF5SixLQUFBO01BQUEsT0FBQXROLFlBQUEsR0FBQWhpQyxDQUFBLFdBQUEra0MsUUFBQTtRQUFBLGtCQUFBQSxRQUFBLENBQUFub0IsQ0FBQTtVQUFBO1lBQUEwdkMsVUFBQSxHQUNiLzZCLFFBQVEsQ0FBQyxDQUFDLEVBQTNCc1UsTUFBTSxHQUFBeW1CLFVBQUEsQ0FBTnptQixNQUFNLEVBQUV5SixLQUFLLEdBQUFnZCxVQUFBLENBQUxoZCxLQUFLO1lBQ3BCeFksUUFBUSxDQUNKNlcsaUVBQXFCLENBQUMyYyxrRUFBZ0IsQ0FBQ252RCxFQUFFLEVBQUV5TyxLQUFLLEVBQUVpOEIsTUFBTSxFQUFFeUosS0FBSyxDQUFDLENBQ3BFLENBQUM7VUFBQztZQUFBLE9BQUF2SyxRQUFBLENBQUF0dEIsQ0FBQTtRQUFBO01BQUEsR0FBQXF0QixPQUFBO0lBQUEsQ0FDTDtJQUFBLGlCQUFBc0csRUFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQXdKLEtBQUEsQ0FBQXo5QixLQUFBLE9BQUF0ZSxTQUFBO0lBQUE7RUFBQTtBQUNMO0FBRU8sU0FBU3F3QyxnQkFBZ0JBLENBQUN6dUMsR0FBRyxFQUFFdW5CLE9BQU8sRUFBRTZVLFFBQVEsRUFBRTtFQUNyRDtFQUNBLElBQUlwOEIsR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQ3V3QyxJQUFJLEtBQUssVUFBVSxFQUFFO0lBQ3ZDdndDLEdBQUcsQ0FBQ3V3QyxJQUFJLENBQUMsQ0FBQyxDQUFDM0ksSUFBSSxDQUFDLFVBQUEySSxJQUFJLEVBQUk7TUFDcEIsSUFBTXhXLEtBQUssR0FBRztRQUFDeFMsT0FBTztRQUFFeXBDLElBQUksRUFBRXpnQjtNQUFJLENBQUM7TUFDbkNuVSxRQUFRLENBQUNzTSxPQUFPLENBQUM7UUFBQzVvQixJQUFJLEVBQUUsU0FBUztRQUFFaWE7TUFBSyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7RUFDTixDQUFDLE1BQU07SUFDSCxJQUFNQSxLQUFLLEdBQUcvNUIsR0FBRyxZQUFZNmlCLEtBQUssR0FBRzdpQixHQUFHLEdBQUc7TUFBQ3VuQixPQUFPO01BQUV5cEMsSUFBSSxFQUFFaHhEO0lBQUcsQ0FBQztJQUMvRG84QixRQUFRLENBQUNzTSxPQUFPLENBQUM7TUFBQzVvQixJQUFJLEVBQUUsU0FBUztNQUFFaWE7SUFBSyxDQUFDLENBQUMsQ0FBQztFQUMvQztBQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoSjJCO0FBQzRCO0FBRXBCO0FBQ0g7QUFDVztBQUUzQywrREFBZSxVQUFDM3dCLE1BQU0sRUFBRXdyQyxLQUFLLEVBQUVrZCxPQUFPLEVBQUs7RUFDdkMsSUFBSSxDQUFDQSxPQUFPLENBQUN6ekQsTUFBTSxFQUFFO0lBQ2pCLE9BQU8sSUFBSTtFQUNmO0VBQ0EsSUFBTTB6RCxRQUFRLEdBQUcsRUFBRTtFQUVuQixJQUFPOW5CLE1BQU0sR0FBSTJLLEtBQUssQ0FBZjNLLE1BQU07RUFDYixJQUFNK25CLFFBQVEsR0FBRyxJQUFJdHFCLE9BQU8sQ0FBQyxVQUFBdXFCLGVBQWUsRUFBSTtJQUM1Q2hvQixNQUFNLENBQUN6YSxJQUFJLENBQUMsVUFBVSxFQUFFeWlDLGVBQWUsQ0FBQztFQUM1QyxDQUFDLENBQUM7RUFFRkgsT0FBTyxDQUFDcnpELE9BQU8sQ0FBQyxVQUFBZ0MsRUFBRSxFQUFJO0lBQ2xCLElBQU15eEQsUUFBUSxHQUFHbGdCLCtDQUFPLENBQUM0QyxLQUFLLEVBQUVuMEMsRUFBRSxDQUFDO0lBQ25DLElBQUksQ0FBQ3l4RCxRQUFRLEVBQUU7TUFDWDtJQUNKO0lBRUEsSUFBTTd1RCxNQUFNLEdBQUcwUyxpREFBSSxDQUFDbThDLFFBQVEsRUFBRTlvRCxNQUFNLENBQUM7SUFDckMsSUFBSSxDQUFDL0YsTUFBTSxFQUFFO01BQ1Q7SUFDSjtJQUVBLElBQU1zTyxTQUFTLEdBQUdpd0MsaURBQVEsQ0FBQ2phLE9BQU8sQ0FBQ3RrQyxNQUFNLENBQUM7SUFDMUMsSUFBTXVOLEtBQUssR0FBR2loRCx1RUFBTyxDQUFDbGdELFNBQVMsQ0FBQztJQUVoQyxJQUFJZixLQUFLLElBQUksT0FBT0EsS0FBSyxDQUFDZzNCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDM0NtcUIsUUFBUSxDQUFDanlELElBQUksQ0FDVDRuQyxPQUFPLENBQUN5cUIsSUFBSSxDQUFDLENBQ1R2aEQsS0FBSyxFQUNMb2hELFFBQVEsQ0FBQ3BxQixJQUFJLENBQ1Q7UUFBQSxPQUFNbkUsUUFBUSxDQUFDeCtCLGNBQWMsQ0FBQ3dzQywwREFBVyxDQUFDaHhDLEVBQUUsQ0FBQyxDQUFDLElBQUltUSxLQUFLO01BQUEsQ0FDM0QsQ0FBQyxDQUNKLENBQ0wsQ0FBQztJQUNMO0VBQ0osQ0FBQyxDQUFDO0VBRUYsT0FBT21oRCxRQUFRLENBQUMxekQsTUFBTSxHQUFHcXBDLE9BQU8sQ0FBQzlzQixHQUFHLENBQUNtM0MsUUFBUSxDQUFDLEdBQUcsSUFBSTtBQUN6RCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdDNEM7QUFDZTtBQUNyRCxJQUFNTSxZQUFZLEdBQUcxZ0IseURBQVksQ0FBQ3lnQixvRUFBbUIsQ0FBQy93RCxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRnBCO0FBQ3RDLElBQU1peEMsT0FBTyxHQUFHWCx5REFBWSxDQUFDLFNBQVMsQ0FBQztBQUN2QyxJQUFNVSxNQUFNLEdBQUdWLHlEQUFZLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRjBFO0FBQy9HLFNBQVNJLE9BQU9BLENBQUM5MUIsR0FBRyxFQUFFO0VBQ3pCLE9BQU9qWixpREFBRyxDQUFDLHFCQUFxQixFQUFFaVosR0FBRyxDQUFDO0FBQzFDO0FBQ0EsU0FBU3EyQyxnQkFBZ0JBLENBQUN2eUQsS0FBSyxFQUFFc1ksUUFBUSxFQUFFO0VBQ3ZDLElBQUl3USxpREFBRSxDQUFDN2tCLE1BQU0sRUFBRWpFLEtBQUssQ0FBQyxJQUFJQSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0lBQ2hDLE9BQU9zWSxRQUFRLENBQUNoYSxNQUFNLEdBQUcwQixLQUFLO0VBQ2xDO0VBQ0EsT0FBT0EsS0FBSztBQUNoQjtBQUNBLFNBQVN3eUQsZUFBZUEsQ0FBQ0MsUUFBUSxFQUFFdjJDLEdBQUcsRUFBRTtFQUNwQyxJQUFNL0YsT0FBTyxHQUFHLEVBQUU7RUFDbEIsS0FBSyxJQUFJaFgsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHc3pELFFBQVEsQ0FBQ24wRCxNQUFNLEVBQUVhLENBQUMsRUFBRSxFQUFFO0lBQ3RDLElBQU1hLEtBQUssR0FBR3V5RCxnQkFBZ0IsQ0FBQ0UsUUFBUSxDQUFDdHpELENBQUMsQ0FBQyxFQUFFNlcsaURBQUksQ0FBQ0csT0FBTyxFQUFFK0YsR0FBRyxDQUFDLENBQUM7SUFDL0QvRixPQUFPLENBQUNwVyxJQUFJLENBQUNDLEtBQUssQ0FBQztFQUN2QjtFQUNBLE9BQU9tVyxPQUFPO0FBQ2xCO0FBQ0EsSUFBTXU4QyxhQUFhLEdBQUc7RUFDbEJDLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFHcjZDLFFBQVEsRUFBRXM2QyxjQUFjLEVBQUs7SUFDbEMsSUFBUUMsTUFBTSxHQUFlRCxjQUFjLENBQW5DQyxNQUFNO01BQUVKLFFBQVEsR0FBS0csY0FBYyxDQUEzQkgsUUFBUTtJQUN4QixPQUFPMTJDLGlEQUFTLENBQUMwMkMsUUFBUSxFQUFFSSxNQUFNLENBQUM3eUQsS0FBSyxFQUFFc1ksUUFBUSxDQUFDO0VBQ3RELENBQUM7RUFDRHc2QyxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBR3g2QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ2pDLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFBM2xCLGFBQUEsQ0FBQUEsYUFBQSxLQUNqQ3hLLElBQUksR0FDSnN3QixjQUFjLENBQUNDLE1BQU0sQ0FBQzd5RCxLQUFLLEdBQy9Cc1ksUUFBUSxDQUFDO0VBQ2hCLENBQUM7RUFDRHk2QyxNQUFNLEVBQUUsU0FBUkEsTUFBTUEsQ0FBR3o2QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ2xDLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFbjFDLGlEQUFNLENBQUNnbEIsSUFBSSxFQUFFc3dCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDN3lELEtBQUssQ0FBQyxFQUFFc1ksUUFBUSxDQUFDO0VBQ2xHLENBQUM7RUFDRDA2QyxNQUFNLEVBQUUsU0FBUkEsTUFBTUEsQ0FBRzE2QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ2xDLE9BQU9oMEMsaURBQVUsQ0FBQ2cwQyxjQUFjLENBQUNILFFBQVEsRUFBRW42QyxRQUFRLENBQUM7RUFDeEQsQ0FBQztFQUNEMjZDLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFHMzZDLFFBQVEsRUFBRXM2QyxjQUFjLEVBQUs7SUFDbEMsSUFBTXR3QixJQUFJLEdBQUd0c0IsaURBQUksQ0FBQzQ4QyxjQUFjLENBQUNILFFBQVEsRUFBRW42QyxRQUFRLENBQUM7SUFDcEQsT0FBT3lELGlEQUFTLENBQUM2MkMsY0FBYyxDQUFDSCxRQUFRLEVBQUVoeEMsaURBQU0sQ0FBQzh3QyxnQkFBZ0IsQ0FBQ0ssY0FBYyxDQUFDQyxNQUFNLENBQUMxZ0QsS0FBSyxFQUFFbXdCLElBQUksQ0FBQyxFQUFFc3dCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDN3lELEtBQUssRUFBRXNpQyxJQUFJLENBQUMsRUFBRWhxQixRQUFRLENBQUM7RUFDdkosQ0FBQztFQUNENDZDLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFHNTZDLFFBQVEsRUFBRXM2QyxjQUFjLEVBQUs7SUFDbEMsSUFBTXR3QixJQUFJLEdBQUd0c0IsaURBQUksQ0FBQzQ4QyxjQUFjLENBQUNILFFBQVEsRUFBRW42QyxRQUFRLENBQUM7SUFDcEQsT0FBT3lELGlEQUFTLENBQUM2MkMsY0FBYyxDQUFDSCxRQUFRLEVBQUU3MkMsaURBQU0sQ0FBQ2czQyxjQUFjLENBQUNDLE1BQU0sQ0FBQzd5RCxLQUFLLEVBQUVzaUMsSUFBSSxDQUFDLEVBQUVocUIsUUFBUSxDQUFDO0VBQ2xHLENBQUM7RUFDRDY2QyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRzc2QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ25DLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFeGlDLGlEQUFPLENBQUMyaUMsY0FBYyxDQUFDQyxNQUFNLENBQUM3eUQsS0FBSyxFQUFFc2lDLElBQUksQ0FBQyxFQUFFaHFCLFFBQVEsQ0FBQztFQUNuRyxDQUFDO0VBQ0Q4NkMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUc5NkMsUUFBUSxFQUFFczZDLGNBQWMsRUFBSztJQUMvQixJQUFNdHdCLElBQUksR0FBR3RzQixpREFBSSxDQUFDNDhDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFbjZDLFFBQVEsQ0FBQztJQUNwRCxPQUFPeUQsaURBQVMsQ0FBQzYyQyxjQUFjLENBQUNILFFBQVEsRUFBRW53QixJQUFJLEdBQUdzd0IsY0FBYyxDQUFDQyxNQUFNLENBQUM3eUQsS0FBSyxFQUFFc1ksUUFBUSxDQUFDO0VBQzNGLENBQUM7RUFDRCs2QyxHQUFHLEVBQUUsU0FBTEEsR0FBR0EsQ0FBRy82QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQy9CLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFbndCLElBQUksR0FBR3N3QixjQUFjLENBQUNDLE1BQU0sQ0FBQzd5RCxLQUFLLEVBQUVzWSxRQUFRLENBQUM7RUFDM0YsQ0FBQztFQUNEZzdDLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHaDdDLFFBQVEsRUFBRXM2QyxjQUFjLEVBQUs7SUFDL0IsSUFBTXR3QixJQUFJLEdBQUd0c0IsaURBQUksQ0FBQzQ4QyxjQUFjLENBQUNILFFBQVEsRUFBRW42QyxRQUFRLENBQUM7SUFDcEQsT0FBT3lELGlEQUFTLENBQUM2MkMsY0FBYyxDQUFDSCxRQUFRLEVBQUVud0IsSUFBSSxHQUFHc3dCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDN3lELEtBQUssRUFBRXNZLFFBQVEsQ0FBQztFQUMzRixDQUFDO0VBQ0RpN0MsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUdqN0MsUUFBUSxFQUFFczZDLGNBQWMsRUFBSztJQUMvQixJQUFNdHdCLElBQUksR0FBR3RzQixpREFBSSxDQUFDNDhDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFbjZDLFFBQVEsQ0FBQztJQUNwRCxPQUFPeUQsaURBQVMsQ0FBQzYyQyxjQUFjLENBQUNILFFBQVEsRUFBRW53QixJQUFJLEdBQUdzd0IsY0FBYyxDQUFDQyxNQUFNLENBQUM3eUQsS0FBSyxFQUFFc1ksUUFBUSxDQUFDO0VBQzNGLENBQUM7RUFDRGs3QyxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBR2w3QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ2pDLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFbnpDLGlEQUFLLENBQUNnakIsSUFBSSxDQUFDLEVBQUVocUIsUUFBUSxDQUFDO0VBQ3BFLENBQUM7RUFDRG03QyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBR243QyxRQUFRLEVBQUVzNkMsY0FBYyxFQUFLO0lBQ25DLElBQU10d0IsSUFBSSxHQUFHdHNCLGlEQUFJLENBQUM0OEMsY0FBYyxDQUFDSCxRQUFRLEVBQUVuNkMsUUFBUSxDQUFDO0lBQ3BELE9BQU95RCxpREFBUyxDQUFDNjJDLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFcGlDLGtEQUFPLENBQUNpUyxJQUFJLENBQUMsRUFBRWhxQixRQUFRLENBQUM7RUFDdEUsQ0FBQztFQUNEbzdDLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFHcDdDLFFBQVEsRUFBRXM2QyxjQUFjLEVBQUs7SUFDbEMsSUFBTXR3QixJQUFJLEdBQUd0c0IsaURBQUksQ0FBQzQ4QyxjQUFjLENBQUNILFFBQVEsRUFBRW42QyxRQUFRLENBQUM7SUFDcEQsT0FBT3lELGlEQUFTLENBQUM2MkMsY0FBYyxDQUFDSCxRQUFRLEVBQUVud0IsSUFBSSxDQUFDMWhDLE1BQU0sQ0FBQyxVQUFDdUYsSUFBSTtNQUFBLE9BQUssQ0FBQ3VaLGtEQUFNLENBQUN2WixJQUFJLEVBQUV5c0QsY0FBYyxDQUFDQyxNQUFNLENBQUM3eUQsS0FBSyxDQUFDO0lBQUEsRUFBQyxFQUFFc1ksUUFBUSxDQUFDO0VBQzFIO0FBQ0osQ0FBQztBQUNNLFNBQVN5NUIsV0FBV0EsQ0FBQ2dPLGFBQWEsRUFBRTRULFVBQVUsRUFBRTtFQUNuRCxJQUFJQyxZQUFZLEdBQUc3VCxhQUFhO0VBQ2hDLEtBQUssSUFBSTVnRCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd3MEQsVUFBVSxDQUFDRSxVQUFVLENBQUN2MUQsTUFBTSxFQUFFYSxDQUFDLEVBQUUsRUFBRTtJQUNuRCxJQUFNMjBELEtBQUssR0FBR0gsVUFBVSxDQUFDRSxVQUFVLENBQUMxMEQsQ0FBQyxDQUFDO0lBQ3RDMjBELEtBQUssQ0FBQ3JCLFFBQVEsR0FBR0QsZUFBZSxDQUFDc0IsS0FBSyxDQUFDckIsUUFBUSxFQUFFbUIsWUFBWSxDQUFDO0lBQzlELElBQU1HLE9BQU8sR0FBR3JCLGFBQWEsQ0FBQ29CLEtBQUssQ0FBQ0UsU0FBUyxDQUFDO0lBQzlDLElBQUksQ0FBQ0QsT0FBTyxFQUFFO01BQ1YsTUFBTSxJQUFJanhDLEtBQUssc0JBQUF4RixNQUFBLENBQXNCdzJDLEtBQUssQ0FBQ0UsU0FBUyxDQUFFLENBQUM7SUFDM0Q7SUFDQUosWUFBWSxHQUFHRyxPQUFPLENBQUNILFlBQVksRUFBRUUsS0FBSyxDQUFDO0VBQy9DO0VBQ0EsT0FBT0YsWUFBWTtBQUN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEZlO0FBRXFCOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBUzdxQixZQUFZQSxDQUFDa3JCLE9BQU8sRUFBRUMsWUFBWSxFQUFFQyxRQUFRLEVBQUVqcUIsTUFBTSxFQUFFO0VBQ2xFLElBQUFwbEMsSUFBQSxHQUF1Q3F2RCxRQUFRLElBQUk7TUFBQzdlLElBQUksRUFBRSxDQUFDLENBQUM7TUFBRWUsSUFBSSxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQTFEK2QsT0FBTyxHQUFBdHZELElBQUEsQ0FBYnd3QyxJQUFJO0lBQWlCK2UsT0FBTyxHQUFBdnZELElBQUEsQ0FBYnV4QyxJQUFJO0VBRTFCLElBQU1pZSxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBR3QrQyxJQUFJO0lBQUEsT0FBSWsrQyxZQUFZLENBQUN4Z0MsSUFBSSxDQUFDLFVBQUN0VixDQUFDLEVBQUVqZixDQUFDO01BQUEsT0FBSzZXLElBQUksQ0FBQzdXLENBQUMsQ0FBQyxLQUFLaWYsQ0FBQztJQUFBLEVBQUM7RUFBQTtFQUVuRSxJQUFNbTJDLEtBQUssR0FBR0wsWUFBWSxDQUFDNTFELE1BQU07RUFDakM7RUFDQSxJQUFNZzNDLElBQUksR0FBR2lmLEtBQUssR0FBRzN6RCxpREFBTSxDQUFDMHpELFFBQVEsRUFBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25ELElBQU0vZCxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSWtlLEtBQUssRUFBRTtJQUNQM3pDLGlEQUFpQixDQUFDLFVBQUM0ekMsV0FBVyxFQUFFQyxPQUFPLEVBQUs7TUFDeEMsSUFBTXBMLE9BQU8sR0FBR3pvRCxpREFBTSxDQUFDLFVBQUFtRSxLQUFBO1FBQUEsSUFBRWlSLElBQUksR0FBQWpSLEtBQUEsQ0FBSmlSLElBQUk7UUFBQSxPQUFNcytDLFFBQVEsQ0FBQ3QrQyxJQUFJLENBQUM7TUFBQSxHQUFFdytDLFdBQVcsQ0FBQztNQUMvRCxJQUFJbkwsT0FBTyxDQUFDL3FELE1BQU0sRUFBRTtRQUNoQiszQyxJQUFJLENBQUNvZSxPQUFPLENBQUMsR0FBR3BMLE9BQU87TUFDM0I7SUFDSixDQUFDLEVBQUVnTCxPQUFPLENBQUM7RUFDZjtFQUVBelMsbURBQVcsQ0FBQ3FTLE9BQU8sRUFBRSxVQUFDaHNELEtBQUssRUFBRWd5QyxRQUFRLEVBQUs7SUFDdEMsSUFBTXY1QyxFQUFFLEdBQUdzVixpREFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFL04sS0FBSyxDQUFDO0lBQ3ZDLElBQUl2SCxFQUFFLEVBQUU7TUFDSixJQUFJbEQsT0FBQSxDQUFPa0QsRUFBRSxNQUFLLFFBQVEsRUFBRTtRQUN4QixJQUFNOUIsSUFBSSxHQUFHWixNQUFNLENBQUNZLElBQUksQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDNnBCLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQU03QyxNQUFNLEdBQUd2WSxpREFBSyxDQUFDdlEsSUFBSSxFQUFFOEIsRUFBRSxDQUFDO1FBQzlCLElBQU13akQsTUFBTSxHQUFHdGxELElBQUksQ0FBQ3VsQixJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzdCLElBQU0wd0IsS0FBSyxHQUFJd0IsSUFBSSxDQUFDNk4sTUFBTSxDQUFDLEdBQUc3TixJQUFJLENBQUM2TixNQUFNLENBQUMsSUFBSSxFQUFHO1FBQ2pELElBQU13USxLQUFLLEdBQUdMLE9BQU8sQ0FBQ25RLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDbkMsSUFBTS85QyxJQUFJLEdBQUc7VUFBQ3VoQixNQUFNO1VBQUUxUixJQUFJLEVBQUVzSCxpREFBTSxDQUFDNDJDLFlBQVksRUFBRWphLFFBQVE7UUFBQyxDQUFDO1FBQzNELElBQU05bkMsS0FBSyxHQUFHb1AsaURBQU8sQ0FBQ3BiLElBQUksRUFBRXV1RCxLQUFLLENBQUM7UUFDbEMsSUFBSXZpRCxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7VUFDZDBpQyxLQUFLLENBQUM5MEMsSUFBSSxDQUFDb0csSUFBSSxDQUFDO1FBQ3BCLENBQUMsTUFBTTtVQUNIa3dDLElBQUksQ0FBQzZOLE1BQU0sQ0FBQyxHQUFHemlDLGlEQUFNLENBQUN0UCxLQUFLLEVBQUVoTSxJQUFJLEVBQUUwdUMsS0FBSyxDQUFDO1FBQzdDO01BQ0osQ0FBQyxNQUFNO1FBQ0hTLElBQUksQ0FBQzUwQyxFQUFFLENBQUMsR0FBRzRjLGlEQUFNLENBQUM0MkMsWUFBWSxFQUFFamEsUUFBUSxDQUFDO01BQzdDO0lBQ0o7RUFDSixDQUFDLENBQUM7O0VBRUY7RUFDQTtFQUNBLE9BQU87SUFBQzNFLElBQUk7SUFBRWUsSUFBSTtJQUFFbk0sTUFBTSxFQUFFQSxNQUFNLElBQUlpcUIsUUFBUSxDQUFDanFCO0VBQU0sQ0FBQztBQUMxRDtBQUVPLFNBQVMrSCxPQUFPQSxDQUFDNEMsS0FBSyxFQUFFbjBDLEVBQUUsRUFBRTtFQUMvQixJQUFJbEQsT0FBQSxDQUFPa0QsRUFBRSxNQUFLLFFBQVEsRUFBRTtJQUN4QixJQUFNOUIsSUFBSSxHQUFHWixNQUFNLENBQUNZLElBQUksQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDNnBCLElBQUksQ0FBQyxDQUFDO0lBQ25DLElBQU0yNUIsTUFBTSxHQUFHdGxELElBQUksQ0FBQ3VsQixJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzdCLElBQU1xc0MsUUFBUSxHQUFHM2IsS0FBSyxDQUFDd0IsSUFBSSxDQUFDNk4sTUFBTSxDQUFDO0lBQ25DLElBQUksQ0FBQ3NNLFFBQVEsRUFBRTtNQUNYLE9BQU8sS0FBSztJQUNoQjtJQUNBLElBQU05b0MsTUFBTSxHQUFHdlksaURBQUssQ0FBQ3ZRLElBQUksRUFBRThCLEVBQUUsQ0FBQztJQUM5QixJQUFNaTBELE9BQU8sR0FBR3QwQyxpREFBSSxDQUFDNlAsaURBQU0sQ0FBQ3hJLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRThvQyxRQUFRLENBQUM7SUFDeEQsT0FBT21FLE9BQU8sSUFBSUEsT0FBTyxDQUFDMytDLElBQUk7RUFDbEM7RUFDQSxPQUFPNitCLEtBQUssQ0FBQ1MsSUFBSSxDQUFDNTBDLEVBQUUsQ0FBQztBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEZzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzB4QyxVQUFVQSxDQUFDMXhDLEVBQUUsRUFBRTtFQUMzQixJQUFJMjVDLFdBQVcsRUFBRUMsUUFBUTtFQUN6QixJQUFNbm9DLEtBQUssR0FBR3pSLEVBQUUsQ0FBQ3M4QyxXQUFXLENBQUMsR0FBRyxDQUFDO0VBQ2pDLElBQUk3cUMsS0FBSyxHQUFHLENBQUMsR0FBR3pSLEVBQUUsQ0FBQ3BDLE1BQU0sRUFBRTtJQUN2Qmc4QyxRQUFRLEdBQUc1NUMsRUFBRSxDQUFDdzlDLFNBQVMsQ0FBQy9yQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDa29DLFdBQVcsR0FBRzVoQixJQUFJLENBQUNvakIsS0FBSyxDQUFDbjdDLEVBQUUsQ0FBQ3c5QyxTQUFTLENBQUMsQ0FBQyxFQUFFL3JDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN4RCxDQUFDLE1BQ0k7SUFDRGtvQyxXQUFXLEdBQUc1aEIsSUFBSSxDQUFDb2pCLEtBQUssQ0FBQ243QyxFQUFFLENBQUM7RUFDaEM7RUFDQSxPQUFPLENBQUMyNUMsV0FBVyxFQUFFQyxRQUFRLENBQUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3NhLFlBQVlBLENBQUNsMEQsRUFBRSxFQUFFbStCLEtBQUssRUFBRWcyQixVQUFVLEVBQUU7RUFDaEQsSUFBTUMsU0FBUyxHQUFHbDJELGlEQUFJLENBQUM4QixFQUFFLENBQUM7RUFDMUIsSUFBTXEwRCxLQUFLLEdBQUdELFNBQVMsQ0FBQzN3QyxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQ2pDLE9BQU8wYSxLQUFLLENBQUNnVyxLQUFLLENBQUN3QixJQUFJLENBQUMwZSxLQUFLLENBQUMsQ0FDekI3dUQsR0FBRyxDQUFDLFVBQUNnVyxHQUFHO0lBQUEsT0FBSzQ0QyxTQUFTLENBQUNuM0MsTUFBTSxDQUFDLFVBQUNqQyxHQUFHLEVBQUUxVyxHQUFHLEVBQUU3RixDQUFDLEVBQUs7TUFDaER1YyxHQUFHLENBQUMxVyxHQUFHLENBQUMsR0FBR2tYLEdBQUcsQ0FBQ3dMLE1BQU0sQ0FBQ3ZvQixDQUFDLENBQUM7TUFDeEIsT0FBT3VjLEdBQUc7SUFDZCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFBQSxFQUFDLENBQ0Y5YSxNQUFNLENBQUMsVUFBQ3NiLEdBQUc7SUFBQSxPQUFLd0QsaURBQU0sQ0FBQ2IsaURBQU0sQ0FBQ2cyQyxVQUFVLEVBQUUzNEMsR0FBRyxDQUFDLEVBQUUyQyxpREFBTSxDQUFDZzJDLFVBQVUsRUFBRW4wRCxFQUFFLENBQUMsQ0FBQztFQUFBLEVBQUM7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzJ4QyxVQUFVQSxDQUFDM3hDLEVBQUUsRUFBRTgwQyxFQUFFLEVBQUVyakMsS0FBSyxFQUFFMmtCLFFBQVEsRUFBRTtFQUNoRCxJQUFJaytCLE1BQU0sR0FBRyxFQUFFO0VBQ2YsSUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUNuQnJrQyxpREFBTyxDQUFDbHdCLEVBQUUsQ0FBQyxDQUFDaEMsT0FBTyxDQUFDLFVBQUFvRyxJQUFBLEVBQWtCO0lBQUEsSUFBQUMsS0FBQSxHQUFBL0YsY0FBQSxDQUFBOEYsSUFBQTtNQUFoQkUsR0FBRyxHQUFBRCxLQUFBO01BQUUvRSxLQUFLLEdBQUErRSxLQUFBO0lBQzVCLElBQUlpd0QsTUFBTSxDQUFDMTJELE1BQU0sRUFBRTtNQUNmO01BQ0E7SUFDSjtJQUNBLElBQUlFLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDdEIsSUFBTWsxRCxZQUFZLEdBQUcsQ0FBQzFmLEVBQUUsQ0FBQ3lKLHFCQUFxQixDQUFDOXNDLEtBQUssQ0FBQyxJQUNqRHFqQyxFQUFFLENBQUN5SixxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRWo2QyxHQUFHLENBQUM7TUFDckMsSUFBSWhGLEtBQUssQ0FBQ3FoQixRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekI0ekMsUUFBUSxDQUFDandELEdBQUcsQ0FBQyxHQUFHa3dELFlBQVk7TUFDaEMsQ0FBQyxNQUNJLElBQUlsMUQsS0FBSyxDQUFDcWhCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM1QjJ6QyxNQUFNLEdBQUdKLFlBQVksQ0FBQ2wwRCxFQUFFLEVBQUVvMkIsUUFBUSxDQUFDLENBQUMsRUFBRTl4QixHQUFHLENBQUM7TUFDOUMsQ0FBQyxNQUNJLElBQUloRixLQUFLLENBQUNxaEIsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ25DMnpDLE1BQU0sR0FBR0osWUFBWSxDQUFDbDBELEVBQUUsRUFBRW8yQixRQUFRLENBQUMsQ0FBQyxFQUFFOXhCLEdBQUcsQ0FBQyxDQUFDcEUsTUFBTSxDQUFDLFVBQUNzYixHQUFHO1VBQUEsT0FBS0EsR0FBRyxDQUFDbFgsR0FBRyxDQUFDLEdBQUdrd0QsWUFBWTtRQUFBLEVBQUM7TUFDdkY7SUFDSixDQUFDLE1BQ0k7TUFDREQsUUFBUSxDQUFDandELEdBQUcsQ0FBQyxHQUFHaEYsS0FBSztJQUN6QjtFQUNKLENBQUMsQ0FBQztFQUNGLElBQUlnMUQsTUFBTSxDQUFDMTJELE1BQU0sRUFBRTtJQUNmLE9BQU8wMkQsTUFBTTtFQUNqQjtFQUNBLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDO0FBQ3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvRW9DO0FBQ0E7QUFDUDtBQUN0QixTQUFTL2lCLG1CQUFtQkEsQ0FBQSxFQUFHO0VBQ2xDLE9BQU8sVUFBQzdWLFFBQVEsRUFBRXZGLFFBQVEsRUFBSztJQUMzQmhELGtEQUFLLENBQUMsWUFBTTtNQUNSLElBQUF5YixTQUFBLEdBQW1CelksUUFBUSxDQUFDLENBQUM7UUFBckJzVSxNQUFNLEdBQUFtRSxTQUFBLENBQU5uRSxNQUFNO01BQ2QvTyxRQUFRLENBQUN1TSxpREFBUyxDQUFBa0UsYUFBQSxDQUFBQSxhQUFBLEtBQU0xQixNQUFNO1FBQUVLLEtBQUssRUFBRTtNQUFJLEVBQUUsQ0FBQyxDQUFDO01BQy9DcFAsUUFBUSxDQUFDNE0sZ0RBQVEsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUM7RUFDTixDQUFDO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0RlOztBQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzJGLE9BQU9BLENBQUNqRixNQUFNLEVBQUU7RUFDNUIsSUFBTXdyQixVQUFVLEdBQUdseUQsaURBQUcsQ0FBQyxtQkFBbUIsRUFBRTBtQyxNQUFNLENBQUM7RUFDbkQsSUFBTXlyQixZQUFZLEdBQUdueUQsaURBQUcsQ0FBQywwQkFBMEIsRUFBRTBtQyxNQUFNLENBQUM7RUFDNUQsSUFBSTVwQixpREFBSSxDQUFDNHBCLE1BQU0sQ0FBQyxLQUFLLFFBQVEsSUFBSyxDQUFDd3JCLFVBQVUsSUFBSSxDQUFDQyxZQUFhLEVBQUU7SUFDN0QsTUFBTSxJQUFJdHlDLEtBQUssMktBS1g2bUIsTUFDSixDQUFDO0VBQ0w7RUFFQSxJQUFNMHJCLElBQUksR0FBR0QsWUFBWSxHQUNuQnpyQixNQUFNLENBQUNlLHdCQUF3QixHQUMvQmYsTUFBTSxDQUFDMnJCLGlCQUFpQjtFQUU5QixPQUFPRCxJQUFJLENBQUMzc0MsTUFBTSxDQUFDMnNDLElBQUksQ0FBQy8yRCxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHKzJELElBQUksR0FBR0EsSUFBSSxHQUFHLEdBQUc7QUFDbkU7QUFFQSxJQUFNRSxhQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDOztBQUUzQztBQUNPLElBQU0zVCxZQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FDcEIvaEMsTUFBTSxFQUNOa1MsSUFBSSxFQUdIO0VBQUEsSUFGRHlqQyxXQUFXLEdBQUFuM0QsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRyxFQUFFO0VBQUEsSUFDaEJvM0QsU0FBUyxHQUFBcDNELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUdtQixTQUFTO0VBRXJCLElBQUloQixLQUFLLENBQUMwQixPQUFPLENBQUMyZixNQUFNLENBQUMsRUFBRTtJQUN2QjtJQUNBQSxNQUFNLENBQUNuaEIsT0FBTyxDQUFDLFVBQUN1SixLQUFLLEVBQUU5SSxDQUFDLEVBQUs7TUFDekIsSUFBSXMyRCxTQUFTLEVBQUU7UUFDWCxJQUFNQyxLQUFLLEdBQUdsMUMsaURBQVMsQ0FBQyxVQUFBeEIsQ0FBQztVQUFBLE9BQUlxQyxpREFBUSxDQUFDLElBQUksRUFBRXJDLENBQUMsQ0FBQztRQUFBLEdBQUV5MkMsU0FBUyxDQUFDO1FBQzFELElBQUlDLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtVQUNkLElBQU16L0MsS0FBSyxHQUFHdUcsaURBQUssQ0FBQyxDQUFDLEVBQUVrNUMsS0FBSyxFQUFFRCxTQUFTLENBQUM7VUFDeEMsSUFBTXYvQyxJQUFJLEdBQUdzRyxpREFBSyxDQUFDazVDLEtBQUssRUFBRUQsU0FBUyxDQUFDbjNELE1BQU0sRUFBRW0zRCxTQUFTLENBQUM7VUFDdEQsSUFBSXgvQyxLQUFLLENBQUMzWCxNQUFNLEVBQUU7WUFDZHNqRCxZQUFXLENBQ1A1ckMsaURBQUksQ0FBQ0MsS0FBSyxFQUFFaE8sS0FBSyxDQUFDLEVBQ2xCOHBCLElBQUksRUFDSnpVLGlEQUFNLENBQUNrNEMsV0FBVyxFQUFFbDRDLGlEQUFNLENBQUMsQ0FBQ25lLENBQUMsQ0FBQyxFQUFFOFcsS0FBSyxDQUFDLENBQUMsRUFDdkNDLElBQ0osQ0FBQztVQUNMLENBQUMsTUFBTTtZQUNILElBQU15L0MsUUFBUSxHQUFHei9DLElBQUksQ0FDaEJoUSxHQUFHLENBQUMsVUFBQThZLENBQUM7Y0FBQSxPQUFJQSxDQUFDLENBQUNrSyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUFBLEVBQUMsQ0FDN0J0b0IsTUFBTSxDQUFDLFVBQUF3QyxDQUFDO2NBQUEsT0FBSUEsQ0FBQztZQUFBLEVBQUM7WUFDbkIsSUFBSXd5RCxRQUFRO2NBQ1JDLFNBQVMsR0FBR3Y0QyxpREFBTSxDQUFDLENBQUNuZSxDQUFDLENBQUMsRUFBRXcyRCxRQUFRLENBQUM7WUFDckMsSUFBSUEsUUFBUSxDQUFDcjNELE1BQU0sRUFBRTtjQUNqQnMzRCxRQUFRLEdBQUc1L0MsaURBQUksQ0FBQzIvQyxRQUFRLEVBQUUxdEQsS0FBSyxDQUFDO1lBQ3BDLENBQUMsTUFBTTtjQUNIMnRELFFBQVEsR0FBRzN0RCxLQUFLO1lBQ3BCO1lBQ0EsS0FBSyxJQUFNakQsR0FBRyxJQUFJNHdELFFBQVEsRUFBRTtjQUN4QixJQUFNNTFELEtBQUssR0FBRzQxRCxRQUFRLENBQUM1d0QsR0FBRyxDQUFDO2NBQzNCNDhDLFlBQVcsQ0FDUDVoRCxLQUFLLEVBQ0wreEIsSUFBSSxFQUNKelUsaURBQU0sQ0FBQ2s0QyxXQUFXLEVBQUVLLFNBQVMsQ0FBQ3Y0QyxNQUFNLENBQUMsQ0FBQ3RZLEdBQUcsQ0FBQyxDQUFDLENBQy9DLENBQUM7WUFDTDtVQUNKO1FBQ0osQ0FBQyxNQUFNO1VBQ0g0OEMsWUFBVyxDQUNQNXJDLGlEQUFJLENBQUN5L0MsU0FBUyxFQUFFeHRELEtBQUssQ0FBQyxFQUN0QjhwQixJQUFJLEVBQ0p6VSxpREFBTSxDQUFDazRDLFdBQVcsRUFBRWw0QyxpREFBTSxDQUFDLENBQUNuZSxDQUFDLENBQUMsRUFBRXMyRCxTQUFTLENBQUMsQ0FDOUMsQ0FBQztRQUNMO01BQ0osQ0FBQyxNQUFNO1FBQ0g3VCxZQUFXLENBQUMzNUMsS0FBSyxFQUFFOHBCLElBQUksRUFBRW5XLGlEQUFNLENBQUN6YyxDQUFDLEVBQUVxMkQsV0FBVyxDQUFDLENBQUM7TUFDcEQ7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDLE1BQU0sSUFBSXoxQyxpREFBSSxDQUFDRixNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUU7SUFDbENrUyxJQUFJLENBQUNsUyxNQUFNLEVBQUUyMUMsV0FBVyxDQUFDO0lBRXpCLElBQU14dEQsUUFBUSxHQUFHZ08saURBQUksQ0FBQ3UvQyxhQUFhLEVBQUUxMUMsTUFBTSxDQUFDO0lBQzVDLElBQUk3WCxRQUFRLEVBQUU7TUFDVixJQUFNOHRELE9BQU8sR0FBR3g0QyxpREFBTSxDQUFDazRDLFdBQVcsRUFBRUQsYUFBYSxDQUFDO01BQ2xEM1QsWUFBVyxDQUFDNTVDLFFBQVEsRUFBRStwQixJQUFJLEVBQUUrakMsT0FBTyxDQUFDO0lBQ3hDO0lBRUEsSUFBTUMsYUFBYSxHQUFHam1DLGlEQUFNLENBQ3hCLEVBQUUsRUFDRixDQUFDalEsTUFBTSxDQUFDMDNCLFNBQVMsRUFBRTEzQixNQUFNLENBQUNFLElBQUksQ0FBQyxFQUMvQm1WLE1BQU0sQ0FBQzhnQywyQkFDWCxDQUFDO0lBQ0RELGFBQWEsQ0FBQ3IzRCxPQUFPLENBQUMsVUFBQXUzRCxZQUFZLEVBQUk7TUFDbEMsSUFBSUEsWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QixJQUFBNjBDLHFCQUFBLEdBQTRCRCxZQUFZLENBQ25DM2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWHBxQixHQUFHLENBQUMsVUFBQThZLENBQUM7WUFBQSxPQUFJQSxDQUFDLENBQUNzUixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMxdkIsTUFBTSxDQUFDLFVBQUF3QyxDQUFDO2NBQUEsT0FBSUEsQ0FBQztZQUFBLEVBQUM7VUFBQSxFQUFDO1VBQUEreUQsc0JBQUEsR0FBQW4zRCxjQUFBLENBQUFrM0QscUJBQUE7VUFGckNFLFNBQVMsR0FBQUQsc0JBQUE7VUFBRVIsUUFBUSxHQUFBUSxzQkFBQTtRQUl4QixJQUFNbGdELEtBQUssR0FBR3FILGlEQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTg0QyxTQUFTLENBQUM7UUFDMUMsSUFBTUMsUUFBUSxHQUFHLzRDLGlEQUFNLENBQUNrNEMsV0FBVyxFQUFFdi9DLEtBQUssQ0FBQztRQUMzQzJyQyxZQUFXLENBQUM1ckMsaURBQUksQ0FBQ0MsS0FBSyxFQUFFNEosTUFBTSxDQUFDLEVBQUVrUyxJQUFJLEVBQUVza0MsUUFBUSxFQUFFVixRQUFRLENBQUM7TUFDOUQsQ0FBQyxNQUFNO1FBQ0gsSUFBSU0sWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUM3QixJQUFNaTFDLEtBQUssR0FBR0wsWUFBWSxDQUFDM2xDLEtBQUssQ0FBQyxHQUFHLENBQUM7VUFDckMsSUFBTThsQyxVQUFTLEdBQUcsRUFBRTtVQUNwQixJQUFNVCxTQUFRLEdBQUcsRUFBRTtVQUNuQixJQUFJcnFDLEtBQUssR0FBRyxLQUFLO1VBRWpCLEtBQUssSUFBSW5zQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdtM0QsS0FBSyxDQUFDaDRELE1BQU0sRUFBRWEsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBTW8zRCxPQUFPLEdBQUdELEtBQUssQ0FBQ24zRCxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDbXNCLEtBQUssSUFBSWlyQyxPQUFPLENBQUNsMUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2NBQ2xDaUssS0FBSyxHQUFHLElBQUk7Y0FDWjhxQyxVQUFTLENBQUNyMkQsSUFBSSxDQUFDdzJELE9BQU8sQ0FBQ3J0QyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsTUFBTTtjQUNILElBQUlvQyxLQUFLLEVBQUU7Z0JBQ1BxcUMsU0FBUSxDQUFDNTFELElBQUksQ0FBQ3cyRCxPQUFPLENBQUM7Y0FDMUIsQ0FBQyxNQUFNO2dCQUNISCxVQUFTLENBQUNyMkQsSUFBSSxDQUFDdzJELE9BQU8sQ0FBQztjQUMzQjtZQUNKO1VBQ0o7VUFDQSxJQUFNVCxRQUFPLEdBQUd4NEMsaURBQU0sQ0FBQ2s0QyxXQUFXLEdBQzlCLE9BQU8sRUFBQWw0QyxNQUFBLENBQ0o4NEMsVUFBUyxDQUNmLENBQUM7VUFFRixJQUFNSSxNQUFNLEdBQUd4Z0QsaURBQUksRUFBRSxPQUFPLEVBQUFzSCxNQUFBLENBQUs4NEMsVUFBUyxHQUFHdjJDLE1BQU0sQ0FBQztVQUNwRCxJQUFJMjJDLE1BQU0sS0FBS2gzRCxTQUFTLEVBQUU7WUFDdEIsS0FBSyxJQUFNd0YsR0FBRyxJQUFJd3hELE1BQU0sRUFBRTtjQUN0QixJQUFNeDJELEtBQUssR0FBR3cyRCxNQUFNLENBQUN4eEQsR0FBRyxDQUFDO2NBQ3pCLElBQUkyd0QsU0FBUSxDQUFDcjNELE1BQU0sRUFBRTtnQkFDakJzakQsWUFBVyxDQUNQNXJDLGlEQUFJLENBQUMyL0MsU0FBUSxFQUFFMzFELEtBQUssQ0FBQyxFQUNyQit4QixJQUFJLEVBQ0p6VSxpREFBTSxDQUFDdzRDLFFBQU8sR0FBRzl3RCxHQUFHLEVBQUFzWSxNQUFBLENBQUtxNEMsU0FBUSxDQUFDLENBQ3RDLENBQUM7Y0FDTCxDQUFDLE1BQU07Z0JBQ0gvVCxZQUFXLENBQUM1aEQsS0FBSyxFQUFFK3hCLElBQUksS0FBQXpVLE1BQUEsQ0FBQXliLGtCQUFBLENBQU0rOEIsUUFBTyxJQUFFOXdELEdBQUcsRUFBQyxDQUFDO2NBQy9DO1lBQ0o7VUFDSjtRQUNKLENBQUMsTUFBTTtVQUNILElBQU04d0QsU0FBTyxHQUFHeDRDLGlEQUFNLENBQUNrNEMsV0FBVyxHQUM5QixPQUFPLEVBQUFsNEMsTUFBQSxDQUFBeWIsa0JBQUEsQ0FDSms5QixZQUFZLENBQUMzbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUM3QixDQUFDO1VBQ0ZzeEIsWUFBVyxDQUNQNXJDLGlEQUFJLEVBQUUsT0FBTyxFQUFBc0gsTUFBQSxDQUFBeWIsa0JBQUEsQ0FBS2s5QixZQUFZLENBQUMzbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFHelEsTUFBTSxDQUFDLEVBQ25Ea1MsSUFBSSxFQUNKK2pDLFNBQ0osQ0FBQztRQUNMO01BQ0o7SUFDSixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUFBO0FBQ08sSUFBTTVzQixZQUFZO0VBQ3JCLFNBQUFBLGFBQUEsRUFBYztJQUFBcjVCLGVBQUEsT0FBQXE1QixZQUFBO0lBQ1YsSUFBSSxDQUFDd3RCLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDakI7RUFBQyxPQUFBem5ELFlBQUEsQ0FBQWk2QixZQUFBO0lBQUFsa0MsR0FBQTtJQUFBaEYsS0FBQSxFQUNELFNBQUEyMkQsRUFBRUEsQ0FBQ0MsS0FBSyxFQUFFMTBCLFFBQVEsRUFBRTtNQUFBLElBQUExTixLQUFBO01BQ2hCLElBQU0wVixNQUFNLEdBQUksSUFBSSxDQUFDd3NCLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDRixHQUFHLENBQUNFLEtBQUssQ0FBQyxJQUFJLEVBQUc7TUFDeEQxc0IsTUFBTSxDQUFDbnFDLElBQUksQ0FBQ21pQyxRQUFRLENBQUM7TUFDckIsT0FBTztRQUFBLE9BQU0xTixLQUFJLENBQUNxaUMsY0FBYyxDQUFDRCxLQUFLLEVBQUUxMEIsUUFBUSxDQUFDO01BQUE7SUFDckQ7RUFBQztJQUFBbDlCLEdBQUE7SUFBQWhGLEtBQUEsRUFDRCxTQUFBNjJELGNBQWNBLENBQUNELEtBQUssRUFBRTEwQixRQUFRLEVBQUU7TUFDNUIsSUFBTWdJLE1BQU0sR0FBRyxJQUFJLENBQUN3c0IsR0FBRyxDQUFDRSxLQUFLLENBQUM7TUFDOUIsSUFBSTFzQixNQUFNLEVBQUU7UUFDUixJQUFNbnZCLEdBQUcsR0FBR212QixNQUFNLENBQUMzb0IsT0FBTyxDQUFDMmdCLFFBQVEsQ0FBQztRQUNwQyxJQUFJbm5CLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNWbXZCLE1BQU0sQ0FBQzczQixNQUFNLENBQUMwSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCO01BQ0o7SUFDSjtFQUFDO0lBQUEvVixHQUFBO0lBQUFoRixLQUFBLEVBQ0QsU0FBQXVxQyxJQUFJQSxDQUFDcXNCLEtBQUssRUFBVztNQUFBLElBQUFFLE1BQUE7TUFBQSxTQUFBMTRELElBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQU55ZixJQUFJLE9BQUF2ZixLQUFBLENBQUFKLElBQUEsT0FBQUEsSUFBQSxXQUFBSyxJQUFBLE1BQUFBLElBQUEsR0FBQUwsSUFBQSxFQUFBSyxJQUFBO1FBQUpzZixJQUFJLENBQUF0ZixJQUFBLFFBQUFKLFNBQUEsQ0FBQUksSUFBQTtNQUFBO01BQ2YsSUFBTXlyQyxNQUFNLEdBQUcsSUFBSSxDQUFDd3NCLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDO01BQzlCLElBQUkxc0IsTUFBTSxFQUFFO1FBQ1JBLE1BQU0sQ0FBQ3hyQyxPQUFPLENBQUMsVUFBQXdqQyxRQUFRO1VBQUEsT0FBSUEsUUFBUSxDQUFDdmxCLEtBQUssQ0FBQ202QyxNQUFJLEVBQUUvNEMsSUFBSSxDQUFDO1FBQUEsRUFBQztNQUMxRDtJQUNKO0VBQUM7SUFBQS9ZLEdBQUE7SUFBQWhGLEtBQUEsRUFDRCxTQUFBeXZCLElBQUlBLENBQUNtbkMsS0FBSyxFQUFFMTBCLFFBQVEsRUFBRTtNQUFBLElBQUE2MEIsTUFBQTtNQUNsQixJQUFNcHdDLE1BQU0sR0FBRyxJQUFJLENBQUNnd0MsRUFBRSxDQUFDQyxLQUFLLEVBQUUsWUFBYTtRQUN2Q2p3QyxNQUFNLENBQUMsQ0FBQztRQUFDLFNBQUFxd0MsS0FBQSxHQUFBMzRELFNBQUEsQ0FBQUMsTUFBQSxFQURxQnlmLElBQUksT0FBQXZmLEtBQUEsQ0FBQXc0RCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSmw1QyxJQUFJLENBQUFrNUMsS0FBQSxJQUFBNTRELFNBQUEsQ0FBQTQ0RCxLQUFBO1FBQUE7UUFFbEMvMEIsUUFBUSxDQUFDdmxCLEtBQUssQ0FBQ282QyxNQUFJLEVBQUVoNUMsSUFBSSxDQUFDO01BQzlCLENBQUMsQ0FBQztJQUNOO0VBQUM7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDek1MO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1RTs7QUFFdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTbzVDLGNBQWNBLENBQ2xDQyxTQUFTLEVBQ1QxdkMsTUFBTSxFQUNOK3FDLFFBQVEsRUFDUjRFLGFBQWEsRUFFZjtFQUFBLElBREVDLFFBQVEsR0FBQWo1RCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLElBQUk7RUFFZixJQUFNdTNDLE1BQU0sR0FBRyxFQUFFO0VBQ2pCLEtBQUssSUFBTTJoQixZQUFZLElBQUlILFNBQVMsRUFBRTtJQUNsQyxJQUFJQSxTQUFTLENBQUMxekMsY0FBYyxDQUFDNnpDLFlBQVksQ0FBQyxFQUFFO01BQ3hDLElBQUl2OUIsS0FBSztNQUNUO01BQ0E7TUFDQTtNQUNBLElBQUk7UUFDQTtRQUNBO1FBQ0EsSUFBSSxPQUFPbzlCLFNBQVMsQ0FBQ0csWUFBWSxDQUFDLEtBQUssVUFBVSxFQUFFO1VBQy9DdjlCLEtBQUssR0FBR2xYLEtBQUssQ0FDVCxDQUFDdTBDLGFBQWEsSUFBSSxhQUFhLElBQzNCLElBQUksR0FDSjVFLFFBQVEsR0FDUixTQUFTLEdBQ1Q4RSxZQUFZLEdBQ1osZ0JBQWdCLEdBQ2hCLDhFQUE4RSxHQUFBLzVELE9BQUEsQ0FDdkU0NUQsU0FBUyxDQUFDRyxZQUFZLENBQUMsSUFDOUIsSUFDUixDQUFDO1VBQ0R2OUIsS0FBSyxDQUFDelMsSUFBSSxHQUFHLHFCQUFxQjtRQUN0QyxDQUFDLE1BQU07VUFDSHlTLEtBQUssR0FBR285QixTQUFTLENBQUNHLFlBQVksQ0FBQyxDQUMzQjd2QyxNQUFNLEVBQ042dkMsWUFBWSxFQUNaRixhQUFhLEVBQ2I1RSxRQUFRLEVBQ1IsSUFBSSxFQUNKeUUsNEVBQ0osQ0FBQztRQUNMO01BQ0osQ0FBQyxDQUFDLE9BQU9NLEVBQUUsRUFBRTtRQUNUeDlCLEtBQUssR0FBR3c5QixFQUFFO01BQ2Q7TUFDQSxJQUFJeDlCLEtBQUssSUFBSSxFQUFFQSxLQUFLLFlBQVlsWCxLQUFLLENBQUMsRUFBRTtRQUNwQzh5QixNQUFNLENBQUM3MUMsSUFBSSxDQUNQLENBQUNzM0QsYUFBYSxJQUFJLGFBQWEsSUFDM0IsMEJBQTBCLEdBQzFCNUUsUUFBUSxHQUNSLElBQUksR0FDSjhFLFlBQVksR0FDWixpQ0FBaUMsR0FDakMsMkRBQTJELEdBQUEvNUQsT0FBQSxDQUNwRHc4QixLQUFLLElBQ1osSUFBSSxHQUNKLGlFQUFpRSxHQUNqRSxnRUFBZ0UsR0FDaEUsaUNBQ1IsQ0FBQztNQUNMO01BQ0EsSUFBSUEsS0FBSyxZQUFZbFgsS0FBSyxFQUFFO1FBQ3hCLElBQUltYSxLQUFLLEdBQUlxNkIsUUFBUSxJQUFJQSxRQUFRLENBQUMsQ0FBQyxJQUFLLEVBQUU7UUFFMUMxaEIsTUFBTSxDQUFDNzFDLElBQUksQ0FDUCxTQUFTLEdBQUcweUQsUUFBUSxHQUFHLFNBQVMsR0FBR3o0QixLQUFLLENBQUN4UyxPQUFPLEdBQUd5VixLQUN2RCxDQUFDO01BQ0w7SUFDSjtFQUNKO0VBQ0EsT0FBTzJZLE1BQU0sQ0FBQ3p4QixJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzlCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZGb0M7QUFDVjtBQUNTO0FBRW5DLFNBQVMrbkIsT0FBT0EsQ0FBQy84QixLQUFLLEVBQUU7RUFDcEIsSUFBSUEsS0FBSyxDQUFDc29ELFNBQVMsRUFBRTtJQUNqQixvQkFBT3RoQywwREFBQTtNQUFLbkUsU0FBUyxFQUFDO0lBQXdCLENBQUUsQ0FBQztFQUNyRDtFQUNBLE9BQU8sSUFBSTtBQUNmO0FBRUFrYSxPQUFPLENBQUNMLFNBQVMsR0FBRztFQUNoQjRyQixTQUFTLEVBQUVsdkIsd0RBQWMsQ0FBQ212QjtBQUM5QixDQUFDO0FBRUQsK0RBQWVyOUIsb0RBQU8sQ0FBQyxVQUFBd0UsS0FBSztFQUFBLE9BQUs7SUFDN0I0NEIsU0FBUyxFQUFFNTRCLEtBQUssQ0FBQzQ0QjtFQUNyQixDQUFDO0FBQUEsQ0FBQyxDQUFDLENBQUN2ckIsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUEc7QUFDVztBQUNTO0FBQ0M7QUFDSztBQUFBLElBRW5DRSxRQUFRLDBCQUFBSyxnQkFBQTtFQUNWLFNBQUFMLFNBQVlqOUIsS0FBSyxFQUFFO0lBQUEsSUFBQXFsQixLQUFBO0lBQUEza0IsZUFBQSxPQUFBdThCLFFBQUE7SUFDZjVYLEtBQUEsR0FBQUMsVUFBQSxPQUFBMlgsUUFBQSxHQUFNajlCLEtBQUs7SUFDWCxJQUFJQSxLQUFLLENBQUN3NkIsTUFBTSxDQUFDZ3VCLFVBQVUsRUFBRTtNQUN6QixJQUFBQyxxQkFBQSxHQUE4QnpvRCxLQUFLLENBQUN3NkIsTUFBTSxDQUFDZ3VCLFVBQVU7UUFBOUNsYSxRQUFRLEdBQUFtYSxxQkFBQSxDQUFSbmEsUUFBUTtRQUFFb2EsU0FBUyxHQUFBRCxxQkFBQSxDQUFUQyxTQUFTO01BQzFCcmpDLEtBQUEsQ0FBS3FLLEtBQUssR0FBRztRQUNUNGUsUUFBUTtRQUNScWEsUUFBUSxFQUFFLEtBQUs7UUFDZkMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLFFBQVEsRUFBRSxJQUFJO1FBQ2RIO01BQ0osQ0FBQztJQUNMLENBQUMsTUFBTTtNQUNIcmpDLEtBQUEsQ0FBS3FLLEtBQUssR0FBRztRQUNUaTVCLFFBQVEsRUFBRTtNQUNkLENBQUM7SUFDTDtJQUNBdGpDLEtBQUEsQ0FBS3lqQyxNQUFNLEdBQUcsQ0FBQztJQUNmempDLEtBQUEsQ0FBSzBqQyxLQUFLLEdBQUd4MEIsUUFBUSxDQUFDeTBCLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDM0MzakMsS0FBQSxDQUFLNGpDLGFBQWEsR0FBRzVqQyxLQUFBLENBQUs0akMsYUFBYSxDQUFDbDZELElBQUksQ0FBQXMyQixLQUFLLENBQUM7SUFBQyxPQUFBQSxLQUFBO0VBQ3ZEO0VBQUNLLFNBQUEsQ0FBQXVYLFFBQUEsRUFBQUssZ0JBQUE7RUFBQSxPQUFBeDlCLFlBQUEsQ0FBQW05QixRQUFBO0lBQUFwbkMsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUFvNEQsYUFBYUEsQ0FBQSxFQUFHO01BQ1psakMsTUFBTSxDQUFDa2pDLGFBQWEsQ0FBQyxJQUFJLENBQUN2NUIsS0FBSyxDQUFDazVCLFVBQVUsQ0FBQztNQUMzQyxJQUFJLENBQUNNLFFBQVEsQ0FBQztRQUFDTixVQUFVLEVBQUU7TUFBSSxDQUFDLENBQUM7SUFDckM7RUFBQztJQUFBL3lELEdBQUE7SUFBQWhGLEtBQUEsRUFtQkQsU0FBQW8xQixrQkFBa0JBLENBQUNrakMsU0FBUyxFQUFFQyxTQUFTLEVBQUU7TUFDckMsSUFBT0MsYUFBYSxHQUFJLElBQUksQ0FBQzM1QixLQUFLLENBQTNCMjVCLGFBQWE7TUFDcEIsSUFBT244QixRQUFRLEdBQUksSUFBSSxDQUFDbHRCLEtBQUssQ0FBdEJrdEIsUUFBUTs7TUFFZjtNQUNBLElBQUksQ0FBQ204QixhQUFhLEVBQUU7UUFDaEI7TUFDSjs7TUFFQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDUSxJQUFJLENBQUN2MUQsaURBQUcsQ0FBQyxlQUFlLEVBQUVzMUQsU0FBUyxDQUFDLEVBQUU7UUFDbEM7TUFDSjtNQUVBLElBQ0lDLGFBQWEsQ0FBQzN0QixNQUFNLEtBQUssR0FBRyxJQUM1QjcwQixpREFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFd2lELGFBQWEsQ0FBQyxLQUMxQ3hpRCxpREFBSSxDQUFDLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRXVpRCxTQUFTLENBQUMsRUFDakU7UUFDRTtRQUNBLElBQ0lDLGFBQWEsQ0FBQzV0QixPQUFPLENBQUM2dEIsSUFBSSxJQUMxQixDQUFDLzRDLGlEQUFNLENBQ0g4NEMsYUFBYSxDQUFDNXRCLE9BQU8sQ0FBQ290QixRQUFRLENBQUMxNUQsTUFBTSxFQUNyQ3d4QixpREFBTSxDQUNGLEVBQUUsRUFDRixDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQ3hDeW9DLFNBQ0osQ0FBQyxDQUFDajZELE1BQ04sQ0FBQyxJQUNELENBQUNvaEIsaURBQU0sQ0FDSDZLLGlEQUFJLENBQUN6TixpREFBVSxDQUFDaVIsOENBQUUsQ0FBQyxFQUFFeXFDLGFBQWEsQ0FBQzV0QixPQUFPLENBQUNvdEIsUUFBUSxDQUFDLEVBQ3BEenRDLGlEQUFJLENBQ0F6TixpREFBVSxDQUFDaVIsOENBQUUsQ0FBQyxFQUNkK0IsaURBQU0sQ0FDRixFQUFFLEVBQ0YsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUN4Q3lvQyxTQUNKLENBQ0osQ0FDSixDQUFDLEVBQ0g7VUFDRTtVQUNBLElBQUlHLE9BQU8sR0FBRyxLQUFLO1VBQ25CO1VBQUEsSUFBQS96RCxTQUFBLEdBQUFnaUQsMEJBQUEsQ0FDYzZSLGFBQWEsQ0FBQzV0QixPQUFPLENBQUMrdEIsS0FBSztZQUFBOXpELEtBQUE7VUFBQTtZQUF6QyxLQUFBRixTQUFBLENBQUE4QyxDQUFBLE1BQUE1QyxLQUFBLEdBQUFGLFNBQUEsQ0FBQXdkLENBQUEsSUFBQXJpQixJQUFBLEdBQTJDO2NBQUEsSUFBbENrZCxDQUFDLEdBQUFuWSxLQUFBLENBQUE3RSxLQUFBO2NBQ04sSUFBSWdkLENBQUMsQ0FBQzQ3QyxNQUFNLEVBQUU7Z0JBQ1ZGLE9BQU8sR0FBRyxJQUFJO2dCQUNkLElBQU1HLGNBQWMsR0FBRyxFQUFFOztnQkFFekI7Z0JBQ0EsSUFBTUMsRUFBRSxHQUFHcDFCLFFBQVEsQ0FBQ3ExQixRQUFRLDZCQUFBejdDLE1BQUEsQ0FDR04sQ0FBQyxDQUFDeXlCLEdBQUcsV0FDaEMsSUFBSSxDQUFDeW9CLEtBQ1QsQ0FBQztnQkFDRCxJQUFJMzFELElBQUksR0FBR3UyRCxFQUFFLENBQUNFLFdBQVcsQ0FBQyxDQUFDO2dCQUUzQixPQUFPejJELElBQUksRUFBRTtrQkFDVHMyRCxjQUFjLENBQUM5NEQsSUFBSSxDQUFDd0MsSUFBSSxDQUFDO2tCQUN6QkEsSUFBSSxHQUFHdTJELEVBQUUsQ0FBQ0UsV0FBVyxDQUFDLENBQUM7Z0JBQzNCO2dCQUVBdDZELGtEQUFPLENBQ0gsVUFBQXlqQixDQUFDO2tCQUFBLE9BQUlBLENBQUMsQ0FBQzgyQyxZQUFZLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFBQSxHQUMzQ0osY0FDSixDQUFDO2dCQUVELElBQUk3N0MsQ0FBQyxDQUFDcXpDLFFBQVEsR0FBRyxDQUFDLEVBQUU7a0JBQ2hCLElBQU02SSxJQUFJLEdBQUd4MUIsUUFBUSxDQUFDak8sYUFBYSxDQUFDLE1BQU0sQ0FBQztrQkFDM0N5akMsSUFBSSxDQUFDQyxJQUFJLE1BQUE3N0MsTUFBQSxDQUFNTixDQUFDLENBQUN5eUIsR0FBRyxTQUFBbnlCLE1BQUEsQ0FBTU4sQ0FBQyxDQUFDcXpDLFFBQVEsQ0FBRTtrQkFDdEM2SSxJQUFJLENBQUNuNUMsSUFBSSxHQUFHLFVBQVU7a0JBQ3RCbTVDLElBQUksQ0FBQ0UsR0FBRyxHQUFHLFlBQVk7a0JBQ3ZCLElBQUksQ0FBQ2xCLEtBQUssQ0FBQ21CLFdBQVcsQ0FBQ0gsSUFBSSxDQUFDO2tCQUM1QjtnQkFDSjtjQUNKLENBQUMsTUFBTTtnQkFDSDtnQkFDQVIsT0FBTyxHQUFHLEtBQUs7Z0JBQ2Y7Y0FDSjtZQUNKO1VBQUMsU0FBQXo0RCxHQUFBO1lBQUEwRSxTQUFBLENBQUF2QixDQUFBLENBQUFuRCxHQUFBO1VBQUE7WUFBQTBFLFNBQUEsQ0FBQWdYLENBQUE7VUFBQTtVQUNELElBQUksQ0FBQys4QyxPQUFPLEVBQUU7WUFDVjtZQUNBO1lBQ0E7WUFDQXhqQyxNQUFNLENBQUN1OUIsUUFBUSxDQUFDNkcsTUFBTSxDQUFDLENBQUM7VUFDNUI7UUFDSixDQUFDLE1BQU07VUFDSDtVQUNBajlCLFFBQVEsQ0FBQztZQUFDdGMsSUFBSSxFQUFFO1VBQVEsQ0FBQyxDQUFDO1FBQzlCO01BQ0osQ0FBQyxNQUFNLElBQ0gsSUFBSSxDQUFDOGUsS0FBSyxDQUFDazVCLFVBQVUsS0FBSyxJQUFJLElBQzlCUyxhQUFhLENBQUMzdEIsTUFBTSxLQUFLLEdBQUcsRUFDOUI7UUFDRSxJQUFJLElBQUksQ0FBQ290QixNQUFNLEdBQUcsSUFBSSxDQUFDcDVCLEtBQUssQ0FBQ2c1QixTQUFTLEVBQUU7VUFDcEMsSUFBSSxDQUFDTyxhQUFhLENBQUMsQ0FBQztVQUNwQjtVQUNBbGpDLE1BQU0sQ0FBQ3FrQyxLQUFLLENBQ1IsMkNBQUFqOEMsTUFBQSxDQUEyQyxJQUFJLENBQUMyNkMsTUFBTSxnQkFDbEQsa0VBQ1IsQ0FBQztRQUNMO1FBQ0EsSUFBSSxDQUFDQSxNQUFNLEVBQUU7TUFDakI7SUFDSjtFQUFDO0lBQUFqekQsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUE4MEIsaUJBQWlCQSxDQUFBLEVBQUc7TUFDaEIsSUFBQUMsV0FBQSxHQUFrQyxJQUFJLENBQUM1bEIsS0FBSztRQUFyQ2t0QixRQUFRLEdBQUF0SCxXQUFBLENBQVJzSCxRQUFRO1FBQUVtOEIsYUFBYSxHQUFBempDLFdBQUEsQ0FBYnlqQyxhQUFhO01BQzlCLElBQUFnQixXQUFBLEdBQTZCLElBQUksQ0FBQzM2QixLQUFLO1FBQWhDaTVCLFFBQVEsR0FBQTBCLFdBQUEsQ0FBUjFCLFFBQVE7UUFBRXJhLFFBQVEsR0FBQStiLFdBQUEsQ0FBUi9iLFFBQVE7TUFDekIsSUFBSSxDQUFDcWEsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDajVCLEtBQUssQ0FBQ2s1QixVQUFVLEVBQUU7UUFDckMsSUFBTUEsVUFBVSxHQUFHN2lDLE1BQU0sQ0FBQ3VrQyxXQUFXLENBQUMsWUFBTTtVQUN4QztVQUNBO1VBQ0EsSUFBSWpCLGFBQWEsQ0FBQzN0QixNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3BDeE8sUUFBUSxDQUFDNE0sd0RBQVEsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1VBQzlEO1FBQ0osQ0FBQyxFQUFFd1UsUUFBUSxDQUFDO1FBQ1osSUFBSSxDQUFDNGEsUUFBUSxDQUFDO1VBQUNOO1FBQVUsQ0FBQyxDQUFDO01BQy9CO0lBQ0o7RUFBQztJQUFBL3lELEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBcTFCLG9CQUFvQkEsQ0FBQSxFQUFHO01BQ25CLElBQUksQ0FBQyxJQUFJLENBQUN3SixLQUFLLENBQUNpNUIsUUFBUSxJQUFJLElBQUksQ0FBQ2o1QixLQUFLLENBQUNrNUIsVUFBVSxFQUFFO1FBQy9DLElBQUksQ0FBQ0ssYUFBYSxDQUFDLENBQUM7TUFDeEI7SUFDSjtFQUFDO0lBQUFwekQsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUF1MUIsTUFBTUEsQ0FBQSxFQUFHO01BQ0wsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBdndCLEdBQUE7SUFBQWhGLEtBQUEsRUF4SkQsU0FBTzA1RCx3QkFBd0JBLENBQUN2cUQsS0FBSyxFQUFFO01BQ25DO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ1EsSUFDSSxDQUFDNGQsa0RBQU8sQ0FBQzVkLEtBQUssQ0FBQ3FwRCxhQUFhLENBQUMsSUFDN0JycEQsS0FBSyxDQUFDcXBELGFBQWEsQ0FBQzN0QixNQUFNLEtBQUssU0FBUyxFQUMxQztRQUNFLE9BQU87VUFBQzJ0QixhQUFhLEVBQUVycEQsS0FBSyxDQUFDcXBEO1FBQWEsQ0FBQztNQUMvQztNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7QUFBQSxFQTFDa0JyaUMsd0RBQWU7QUFzTHRDaVcsUUFBUSxDQUFDdXRCLFlBQVksR0FBRyxDQUFDLENBQUM7QUFFMUJ2dEIsUUFBUSxDQUFDUCxTQUFTLEdBQUc7RUFDakJuckMsRUFBRSxFQUFFNm5DLDBEQUFnQjtFQUNwQm9CLE1BQU0sRUFBRXBCLDBEQUFnQjtFQUN4Qml3QixhQUFhLEVBQUVqd0IsMERBQWdCO0VBQy9CbE0sUUFBUSxFQUFFa00sd0RBQWM7RUFDeEJrVixRQUFRLEVBQUVsViwwREFBZ0I1VztBQUM5QixDQUFDO0FBRUQsK0RBQWUwSSxvREFBTyxDQUNsQixVQUFBd0UsS0FBSztFQUFBLE9BQUs7SUFDTjhLLE1BQU0sRUFBRTlLLEtBQUssQ0FBQzhLLE1BQU07SUFDcEI2dUIsYUFBYSxFQUFFMzVCLEtBQUssQ0FBQzI1QjtFQUN6QixDQUFDO0FBQUEsQ0FBQyxFQUNGLFVBQUFuOEIsUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDK1AsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JOWCxNQUFxRztBQUNyRyxNQUEyRjtBQUMzRixNQUFrRztBQUNsRyxNQUFxSDtBQUNySCxNQUE4RztBQUM5RyxNQUE4RztBQUM5RyxNQUEyRztBQUMzRztBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLHdGQUFPOzs7O0FBSXFEO0FBQzdFLE9BQU8sK0RBQWUsd0ZBQU8sSUFBSSx3RkFBTyxVQUFVLHdGQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFCekM7QUFDVjtBQUNTO0FBQ2U7QUFDM0I7QUFFdkIsU0FBU3d0QixrQkFBa0JBLENBQUN6cUQsS0FBSyxFQUFFO0VBQy9CLElBQU9rdEIsUUFBUSxHQUFhbHRCLEtBQUssQ0FBMUJrdEIsUUFBUTtJQUFFMFAsT0FBTyxHQUFJNThCLEtBQUssQ0FBaEI0OEIsT0FBTztFQUV4QixJQUFNOHRCLFFBQVEsZ0JBQ1YxakMsMERBQUE7SUFDSW54QixHQUFHLEVBQUMsVUFBVTtJQUNkZ3RCLFNBQVMsRUFBQyxzQkFBc0I7SUFDaEM4bkMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7TUFBQSxPQUFRejlCLFFBQVEsQ0FBQ20xQixtREFBSSxDQUFDO0lBQUE7RUFBQyxnQkFFOUJyN0IsMERBQUE7SUFBS25FLFNBQVMsRUFBQztFQUFpQixHQUFDLFFBQU0sQ0FBQyxlQUN4Q21FLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBdUIsR0FBQyxNQUFTLENBQzlDLENBQ1Q7RUFFRCxJQUFNK25DLFFBQVEsZ0JBQ1Y1akMsMERBQUE7SUFDSW54QixHQUFHLEVBQUMsVUFBVTtJQUNkZ3RCLFNBQVMsRUFBQyxzQkFBc0I7SUFDaEM4bkMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7TUFBQSxPQUFRejlCLFFBQVEsQ0FBQ2kxQixtREFBSSxDQUFDO0lBQUE7RUFBQyxnQkFFOUJuN0IsMERBQUE7SUFBS25FLFNBQVMsRUFBQztFQUFpQixHQUFDLFFBQU0sQ0FBQyxlQUN4Q21FLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBdUIsR0FBQyxNQUFTLENBQzlDLENBQ1Q7RUFFRCxvQkFDSW1FLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBaUIsZ0JBQzVCbUUsMERBQUEsY0FDSzRWLE9BQU8sQ0FBQzZsQixJQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsR0FBR3U3RCxRQUFRLEdBQUcsSUFBSSxFQUN6Qzl0QixPQUFPLENBQUM0bEIsTUFBTSxDQUFDcnpELE1BQU0sR0FBRyxDQUFDLEdBQUd5N0QsUUFBUSxHQUFHLElBQ3ZDLENBQ0osQ0FBQztBQUVkO0FBRUFILGtCQUFrQixDQUFDL3RCLFNBQVMsR0FBRztFQUMzQkUsT0FBTyxFQUFFeEQsMERBQWdCO0VBQ3pCbE0sUUFBUSxFQUFFa00sd0RBQWN4VztBQUM1QixDQUFDO0FBRUQsSUFBTW9hLE9BQU8sR0FBRzlSLG9EQUFPLENBQ25CLFVBQUF3RSxLQUFLO0VBQUEsT0FBSztJQUNOa04sT0FBTyxFQUFFbE4sS0FBSyxDQUFDa047RUFDbkIsQ0FBQztBQUFBLENBQUMsRUFDRixVQUFBMVAsUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDdTlCLGtCQUFrQixDQUFDO0FBRXJCLCtEQUFlenRCLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcER0QixNQUF3RztBQUN4RyxNQUE4RjtBQUM5RixNQUFxRztBQUNyRyxNQUF3SDtBQUN4SCxNQUFpSDtBQUNqSCxNQUFpSDtBQUNqSCxNQUE2SDtBQUM3SDtBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLHVHQUFPOzs7O0FBSXVFO0FBQy9GLE9BQU8sK0RBQWUsdUdBQU8sSUFBSSx1R0FBTyxVQUFVLHVHQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUJBO0FBQzFDO0FBQ2M7QUFDZjtBQUNpQjtBQUNmO0FBQ0E7QUFDSztBQUNrQjtBQUVaO0FBQ1c7QUFDakI7QUFFSDtBQUNzQjtBQUs1QjtBQUVoQzZ0QixpREFBUyxDQUFDUSxHQUFHLENBQUNOLHdEQUFLLENBQUM7QUFDcEJGLGlEQUFTLENBQUNRLEdBQUcsQ0FBQ0wsd0RBQUssQ0FBQzs7QUFFcEI7QUFDQTtBQUNBO0FBQ0EsU0FBU00sZ0JBQWdCQSxDQUFDcnZCLE1BQU0sRUFBRXN2QixPQUFPLEVBQUVDLFVBQVUsRUFBRTtFQUNuRCxJQUFNQyxRQUFRLEdBQUcsRUFBRTtFQUNuQixJQUFNMW9DLFFBQVEsR0FBRyxFQUFFO0VBQ25CLElBQU0yb0MsU0FBUyxHQUFHLENBQUMsQ0FBQztFQUVwQixTQUFTQyxVQUFVQSxDQUFDcDZELEVBQUUsRUFBRXE2RCxXQUFXLEVBQUU7SUFDakMsSUFBTTFsQixRQUFRLEdBQUcwbEIsV0FBVyxDQUFDenFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBTThvQixLQUFLLEdBQUcxSCxrRUFBVyxDQUFDaHhDLEVBQUUsQ0FBQztJQUM3QixJQUFNczZELE1BQU0sR0FBR3g5RCxPQUFBLENBQU9rRCxFQUFFLE1BQUssUUFBUSxHQUFHLFVBQVUsR0FBRyxXQUFXOztJQUVoRTtJQUNBLElBQU11NkQsUUFBUSxHQUFHN2hCLEtBQUs7SUFDdEIsSUFBTThoQixPQUFPLE1BQUE1OUMsTUFBQSxDQUFNMjlDLFFBQVEsUUFBQTM5QyxNQUFBLENBQUsrM0IsUUFBUSxDQUFFO0lBRTFDLElBQUksQ0FBQ3VsQixRQUFRLENBQUN2NUMsUUFBUSxDQUFDNDVDLFFBQVEsQ0FBQyxFQUFFO01BQzlCTCxRQUFRLENBQUM3NkQsSUFBSSxDQUFDazdELFFBQVEsQ0FBQztNQUN2Qi9vQyxRQUFRLENBQUNueUIsSUFBSSxDQUFDO1FBQ1ZvSyxJQUFJLEVBQUU7VUFDRnpKLEVBQUUsRUFBRXU2RCxRQUFRO1VBQ1pybkMsS0FBSyxFQUFFd2xCLEtBQUs7VUFDWnI1QixJQUFJLEVBQUVpN0M7UUFDVjtNQUNKLENBQUMsQ0FBQztNQUNGSCxTQUFTLENBQUNJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7SUFDNUI7SUFFQSxJQUFJLENBQUNMLFFBQVEsQ0FBQ3Y1QyxRQUFRLENBQUM2NUMsT0FBTyxDQUFDLEVBQUU7TUFDN0JOLFFBQVEsQ0FBQzc2RCxJQUFJLENBQUNtN0QsT0FBTyxDQUFDO01BQ3RCaHBDLFFBQVEsQ0FBQ255QixJQUFJLENBQUM7UUFDVm9LLElBQUksRUFBRTtVQUNGekosRUFBRSxFQUFFdzZELE9BQU87VUFDWHRuQyxLQUFLLEVBQUV5aEIsUUFBUTtVQUNmdjBDLE1BQU0sRUFBRW02RCxRQUFRO1VBQ2hCbDdDLElBQUksRUFBRTtRQUNWO01BQ0osQ0FBQyxDQUFDO01BQ0Y4NkMsU0FBUyxDQUFDSSxRQUFRLENBQUMsQ0FBQ2w3RCxJQUFJLENBQUNtN0QsT0FBTyxDQUFDO0lBQ3JDO0lBRUEsT0FBT0EsT0FBTztFQUNsQjtFQUVBLFNBQVNDLFVBQVVBLENBQUM5M0QsTUFBTSxFQUFFQyxNQUFNLEVBQUV5YyxJQUFJLEVBQUU7SUFDdENtUyxRQUFRLENBQUNueUIsSUFBSSxDQUFDO01BQ1ZvSyxJQUFJLEVBQUU7UUFDRjlHLE1BQU0sRUFBRUEsTUFBTTtRQUNkQyxNQUFNLEVBQUVBLE1BQU07UUFDZHljLElBQUksRUFBRUE7TUFDVjtJQUNKLENBQUMsQ0FBQztFQUNOO0VBRUEsQ0FBQ3FyQixNQUFNLENBQUMyWSxTQUFTLElBQUksRUFBRSxFQUFFcmxELE9BQU8sQ0FBQyxVQUFDeWpDLFFBQVEsRUFBRWhqQyxDQUFDLEVBQUs7SUFDOUMsSUFBTXEyQyxFQUFFLHdCQUFBbDRCLE1BQUEsQ0FBd0I2a0IsUUFBUSxDQUFDdlosTUFBTSxDQUFFO0lBQ2pELElBQU13eUMsU0FBUyxHQUFHVixPQUFPLENBQUMzVyxTQUFTLENBQUM1aEIsUUFBUSxDQUFDdlosTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELElBQU1obkIsS0FBSyxHQUFHdzVELFNBQVMsQ0FBQ3g1RCxLQUFLLElBQUksQ0FBQztJQUNsQyxJQUFNeTVELElBQUksR0FBR0QsU0FBUyxDQUFDRSxLQUFLLElBQUksQ0FBQztJQUVqQ3BwQyxRQUFRLENBQUNueUIsSUFBSSxDQUFDO01BQ1ZvSyxJQUFJLEVBQUU7UUFDRnpKLEVBQUUsRUFBRTgwQyxFQUFFO1FBQ041aEIsS0FBSyxjQUFBdFcsTUFBQSxDQUFjbmUsQ0FBQyxDQUFFO1FBQ3RCNGdCLElBQUksRUFBRSxVQUFVO1FBQ2hCdzdDLElBQUksRUFBRXA1QixRQUFRLENBQUM0VSxtQkFBbUIsR0FBRyxRQUFRLEdBQUcsUUFBUTtRQUN4RG4xQyxLQUFLLEVBQUVBLEtBQUs7UUFDWnk1RCxJQUFJLEVBQUV6NUQsS0FBSyxHQUFHLENBQUMsR0FBRzhULElBQUksQ0FBQzhsRCxLQUFLLENBQUNILElBQUksR0FBR3o1RCxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzlDNjVELFVBQVUsRUFBRTUzQyxJQUFJLENBQUNvMEIsR0FBRyxDQUFDLENBQUM7UUFDdEJ5akIsUUFBUSxFQUFFNzNDLElBQUksQ0FBQ28wQixHQUFHLENBQUM7TUFDdkI7SUFDSixDQUFDLENBQUM7SUFFRjlWLFFBQVEsQ0FBQzhVLE9BQU8sQ0FBQy93QyxHQUFHLENBQUMsVUFBQXBCLElBQUEsRUFBb0I7TUFBQSxJQUFsQnBFLEVBQUUsR0FBQW9FLElBQUEsQ0FBRnBFLEVBQUU7UUFBRTIwQyxRQUFRLEdBQUF2d0MsSUFBQSxDQUFSdXdDLFFBQVE7TUFDL0IsSUFBTXNtQixNQUFNLEdBQUdiLFVBQVUsQ0FBQ3A2RCxFQUFFLEVBQUUyMEMsUUFBUSxDQUFDO01BQ3ZDOGxCLFVBQVUsQ0FBQzNsQixFQUFFLEVBQUVtbUIsTUFBTSxFQUFFLFFBQVEsQ0FBQztJQUNwQyxDQUFDLENBQUM7SUFFRng1QixRQUFRLENBQUNyVyxNQUFNLENBQUM1bEIsR0FBRyxDQUFDLFVBQUFuQixLQUFBLEVBQW9CO01BQUEsSUFBbEJyRSxFQUFFLEdBQUFxRSxLQUFBLENBQUZyRSxFQUFFO1FBQUUyMEMsUUFBUSxHQUFBdHdDLEtBQUEsQ0FBUnN3QyxRQUFRO01BQzlCLElBQU1zbUIsTUFBTSxHQUFHYixVQUFVLENBQUNwNkQsRUFBRSxFQUFFMjBDLFFBQVEsQ0FBQztNQUN2QzhsQixVQUFVLENBQUNRLE1BQU0sRUFBRW5tQixFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUVGclQsUUFBUSxDQUFDdEQsS0FBSyxDQUFDMzRCLEdBQUcsQ0FBQyxVQUFBazBDLEtBQUEsRUFBb0I7TUFBQSxJQUFsQjE1QyxFQUFFLEdBQUEwNUMsS0FBQSxDQUFGMTVDLEVBQUU7UUFBRTIwQyxRQUFRLEdBQUErRSxLQUFBLENBQVIvRSxRQUFRO01BQzdCLElBQU1zbUIsTUFBTSxHQUFHYixVQUFVLENBQUNwNkQsRUFBRSxFQUFFMjBDLFFBQVEsQ0FBQztNQUN2QzhsQixVQUFVLENBQUNRLE1BQU0sRUFBRW5tQixFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ25DLENBQUMsQ0FBQztFQUNOLENBQUMsQ0FBQzs7RUFFRjtFQUNBLElBQUltbEIsVUFBVSxFQUFFO0lBQ1pqekMsa0RBQU0sQ0FBQ216QyxTQUFTLENBQUMsQ0FBQ244RCxPQUFPLENBQUMsVUFBQWs5RCxRQUFRLEVBQUk7TUFDbENBLFFBQVEsQ0FBQ2w5RCxPQUFPLENBQUMsVUFBQW05RCxTQUFTLEVBQUk7UUFDMUJELFFBQVEsQ0FBQ2w5RCxPQUFPLENBQUMsVUFBQW85RCxPQUFPLEVBQUk7VUFDeEIsSUFBSUQsU0FBUyxLQUFLQyxPQUFPLEVBQUU7WUFDdkJYLFVBQVUsQ0FBQ1UsU0FBUyxFQUFFQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1VBQzVDO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0VBQ047RUFFQSxPQUFPNXBDLFFBQVE7QUFDbkI7QUFFQSxTQUFTNnBDLFlBQVlBLENBQUNseEIsTUFBTSxFQUFFO0VBQzFCLElBQUlqc0Msa0RBQUksQ0FBQ2lzQyxNQUFNLENBQUMsQ0FBQ3ZzQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQzNCLE9BQU91c0MsTUFBTSxDQUFDbXhCLE1BQU07RUFDeEI7RUFDQSxPQUFPbnhCLE1BQU07QUFDakI7QUFFQSxTQUFTb3hCLGNBQWNBLENBQUN0c0IsR0FBRyxFQUFFO0VBQ3pCLElBQU1zSCxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEtBQUssSUFBTW1DLEtBQUssSUFBSXpKLEdBQUcsRUFBRTtJQUNyQixLQUFLLElBQU0xekIsSUFBSSxJQUFJMHpCLEdBQUcsQ0FBQ3lKLEtBQUssQ0FBQyxFQUFFO01BQzNCbkMsT0FBTyxDQUFDbUMsS0FBSyxHQUFHLEdBQUcsR0FBR245QixJQUFJLENBQUMsR0FBRzB6QixHQUFHLENBQUN5SixLQUFLLENBQUMsQ0FBQ245QixJQUFJLENBQUM7SUFDbEQ7RUFDSjtFQUNBLE9BQU9nN0IsT0FBTztBQUNsQjtBQUVBLFNBQVNpbEIsYUFBYUEsQ0FBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUU7RUFDbkMsQ0FBQ0QsT0FBTyxJQUFJLEVBQUUsRUFBRXo5RCxPQUFPLENBQUMsVUFBQTI5RCxNQUFNLEVBQUk7SUFDOUIsSUFBSTc5RCxLQUFLLENBQUMwQixPQUFPLENBQUNtOEQsTUFBTSxDQUFDLEVBQUU7TUFDdkJILGFBQWEsQ0FBQ0csTUFBTSxFQUFFRCxLQUFLLENBQUM7SUFDaEMsQ0FBQyxNQUFNO01BQ0gsSUFBTzE3RCxFQUFFLEdBQXFCMjdELE1BQU0sQ0FBN0IzN0QsRUFBRTtRQUFFMjBDLFFBQVEsR0FBV2duQixNQUFNLENBQXpCaG5CLFFBQVE7UUFBRXIxQyxLQUFLLEdBQUlxOEQsTUFBTSxDQUFmcjhELEtBQUs7TUFDMUJvOEQsS0FBSyxDQUFDMXFCLGtFQUFXLENBQUNoeEMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHMjBDLFFBQVEsQ0FBQyxHQUFHcjFDLEtBQUs7SUFDbkQ7RUFDSixDQUFDLENBQUM7RUFDRixPQUFPbzhELEtBQUs7QUFDaEI7QUFFQSxTQUFTRSxhQUFhQSxDQUFDQyxRQUFRLEVBQUU7RUFDN0IsT0FBT0EsUUFBUSxDQUNWcnpDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FDN0JvSCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ1ozUyxNQUFNLENBQ0gsVUFBQzYrQyxHQUFHLEVBQUUzOEQsSUFBSTtJQUFBLE9BQ04yOEQsR0FBRyxDQUFDbC9DLE1BQU0sQ0FDTnpkLElBQUksQ0FBQ3FwQixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBQ2xNLENBQUMsRUFBRUMsQ0FBQztNQUFBLE9BQUtBLENBQUMsR0FBRyxjQUFjO0lBQUEsRUFDL0QsQ0FBQztFQUFBLEdBQ0wsRUFDSixDQUFDLENBQ0FrSCxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3BCOztBQUVBO0FBQ0EsSUFBTXM0QyxXQUFXLEdBQUcsRUFBRTtBQUV0QixJQUFNQyxXQUFXLEdBQUc7RUFDaEJuMUMsSUFBSSxFQUFFLE9BQU87RUFDYmhYLE9BQU8sRUFBRSxFQUFFO0VBQ1hvc0QsTUFBTSxFQUFFO0FBQ1osQ0FBQztBQUVELElBQU1DLFdBQVcsR0FBRztFQUFDcjFDLElBQUksRUFBRSxPQUFPO0VBQUVoWCxPQUFPLEVBQUUsRUFBRTtFQUFFekMsT0FBTyxFQUFFO0FBQUssQ0FBQztBQUVoRSxJQUFNK3VELE9BQU8sR0FBRztFQUNaLFVBQVUsRUFBQS92QixhQUFBLENBQUFBLGFBQUEsS0FBTTR2QixXQUFXO0lBQUVJLGFBQWEsRUFBRTtFQUFHLEVBQUM7RUFDaEQsWUFBWSxFQUFBaHdCLGFBQUEsQ0FBQUEsYUFBQSxLQUFNNHZCLFdBQVc7SUFBRUssT0FBTyxFQUFFLENBQUM7SUFBRUMsT0FBTyxFQUFFLEVBQUU7SUFBRUMsT0FBTyxFQUFFO0VBQUksRUFBQztFQUN0RUMsS0FBSyxFQUFFTixXQUFXO0VBQ2xCLGFBQWEsRUFBRUE7QUFDbkIsQ0FBQztBQUVELFNBQVNPLGFBQWFBLENBQUEsRUFBRztFQUNyQjtFQUNBLElBQU10b0IsS0FBSyxHQUFHalUsd0RBQVcsQ0FBQyxVQUFBL0IsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ2dXLEtBQUs7RUFBQSxFQUFDO0VBQy9DLElBQU14ckMsTUFBTSxHQUFHdTNCLHdEQUFXLENBQUMsVUFBQS9CLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUN4MUIsTUFBTTtFQUFBLEVBQUM7RUFDakQsSUFBTStoQyxNQUFNLEdBQUd4Syx3REFBVyxDQUFDLFVBQUEvQixLQUFLO0lBQUEsT0FBSUEsS0FBSyxDQUFDdU0sTUFBTTtFQUFBLEVBQUM7RUFDakQsSUFBTXN2QixPQUFPLEdBQUc5NUIsd0RBQVcsQ0FBQyxVQUFBL0IsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQzY3QixPQUFPO0VBQUEsRUFBQztFQUNuRCxJQUFNMEMsT0FBTyxHQUFHeDhCLHdEQUFXLENBQUMsVUFBQS9CLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUN1K0IsT0FBTztFQUFBLEVBQUM7RUFDbkQsSUFBTUMsY0FBYyxHQUFHejhCLHdEQUFXLENBQUMsVUFBQS9CLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUM2SyxZQUFZO0VBQUEsRUFBQzs7RUFFL0Q7RUFDQSxJQUFBSSxTQUFBLEdBQWdDeEIsK0NBQVEsQ0FBQyxJQUFJLENBQUM7SUFBQXlCLFVBQUEsR0FBQS9xQyxjQUFBLENBQUE4cUMsU0FBQTtJQUF2Q3d6QixRQUFRLEdBQUF2ekIsVUFBQTtJQUFFd3pCLFdBQVcsR0FBQXh6QixVQUFBO0VBQzVCLElBQUF5ekIsVUFBQSxHQUFrQ2wxQiwrQ0FBUSxDQUFDLElBQUksQ0FBQztJQUFBbTFCLFVBQUEsR0FBQXorRCxjQUFBLENBQUF3K0QsVUFBQTtJQUF6Q25qRCxTQUFTLEdBQUFvakQsVUFBQTtJQUFFQyxZQUFZLEdBQUFELFVBQUE7RUFFOUIsSUFBT0UsV0FBVyxHQUFJakQsT0FBTyxDQUF0QmlELFdBQVc7RUFDbEIsSUFBTUMsVUFBVSxHQUFHRCxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUUsV0FBVztFQUMzQyxJQUFNQyxjQUFjLEdBQUdybUMsNkNBQU0sQ0FBQyxJQUFJLENBQUM7RUFDbkMsSUFBQXNtQyxVQUFBLEdBQW9DejFCLCtDQUFRLENBQUNzMUIsVUFBVSxJQUFJLFVBQVUsQ0FBQztJQUFBSSxVQUFBLEdBQUFoL0QsY0FBQSxDQUFBKytELFVBQUE7SUFBL0RFLFVBQVUsR0FBQUQsVUFBQTtJQUFFRSxhQUFhLEdBQUFGLFVBQUE7O0VBRWhDO0VBQ0EsSUFBTTlyQyxRQUFRLEdBQUdrRSw4Q0FBTyxDQUNwQjtJQUFBLE9BQU1xa0MsZ0JBQWdCLENBQUNydkIsTUFBTSxFQUFFc3ZCLE9BQU8sRUFBRXVELFVBQVUsS0FBSyxPQUFPLENBQUM7RUFBQSxHQUMvRCxDQUFDN3lCLE1BQU0sRUFBRTZ5QixVQUFVLENBQ3ZCLENBQUM7O0VBRUQ7RUFDQSxJQUFNRSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJQyxNQUFNLEVBQUVDLFNBQVMsRUFBSztJQUM5Qzk2QixnREFBUyxDQUNMO01BQUEsT0FBT2xwQixTQUFTLElBQUkrakQsTUFBTSxDQUFDL2pELFNBQVMsQ0FBQyxJQUFLN2EsU0FBUztJQUFBLEdBQ25ENitELFNBQ0osQ0FBQztFQUNMLENBQUM7RUFFRCxTQUFTQyxZQUFZQSxDQUFDNTlELEVBQUUsRUFBRTtJQUN0QjtJQUNBO0lBQ0E7SUFDQSxJQUFJQSxFQUFFLENBQUNnb0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtNQUN0QjYxQyxXQUFXLEdBQUcsSUFBSTtNQUNsQixPQUFPLytELFNBQVM7SUFDcEI7SUFDQSxJQUFNa29ELE1BQU0sR0FBR3pWLHVEQUFPLENBQUM0QyxLQUFLLEVBQUVuMEMsRUFBRSxDQUFDO0lBQ2pDLE9BQU9nbkQsTUFBTSxHQUFHMXhDLGtEQUFJLENBQUMweEMsTUFBTSxFQUFFcitDLE1BQU0sQ0FBQyxHQUFHN0osU0FBUztFQUNwRDtFQUVBLFNBQVNnL0QsWUFBWUEsQ0FBQ3IwRCxJQUFJLEVBQUU7SUFDeEIsSUFBTXJKLE1BQU0sR0FBR3c5RCxZQUFZLENBQUNuMEQsSUFBSSxDQUFDckosTUFBTSxDQUFDO0lBQ3hDLE9BQU9BLE1BQU0sR0FBR0EsTUFBTSxDQUFDcU8sS0FBSyxDQUFDaEYsSUFBSSxDQUFDeXBCLEtBQUssQ0FBQyxHQUFHcDBCLFNBQVM7RUFDeEQ7RUFFQSxTQUFTaS9ELGVBQWVBLENBQUE1akIsS0FBQSxFQUFPO0lBQUEsSUFBQTZqQixxQkFBQTtJQUFBLElBQUwxOUQsRUFBRSxHQUFBNjVDLEtBQUEsQ0FBRjc1QyxFQUFFO0lBQ3hCLElBQU0yOUQsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNwQjM5RCxFQUFFLENBQUNSLEtBQUssQ0FBQyxDQUFDLENBQUNvK0QsSUFBSSxDQUFDLFVBQUF6OEMsQ0FBQyxFQUFJO01BQ2pCdzhDLFNBQVMsQ0FBQ3g4QyxDQUFDLENBQUN6aEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHeWhCLENBQUMsQ0FBQ2pZLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQzs7SUFFRjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQXd3RCxPQUFPLENBQUNpRCxXQUFXLEdBQUc7TUFDbEJwMkMsSUFBSSxFQUFFLFFBQVE7TUFDZGpYLEdBQUcsRUFBRSxLQUFLO01BQ1ZxdUQsU0FBUztNQUNUdHNDLElBQUksRUFBRXJ4QixFQUFFLENBQUNxeEIsSUFBSSxDQUFDLENBQUM7TUFDZkQsR0FBRyxFQUFFcHhCLEVBQUUsQ0FBQ294QixHQUFHLENBQUMsQ0FBQztNQUNieXJDLFdBQVcsR0FBQWEscUJBQUEsR0FBRVosY0FBYyxDQUFDM25ELE9BQU8sY0FBQXVvRCxxQkFBQSx1QkFBdEJBLHFCQUFBLENBQXdCMStEO0lBQ3pDLENBQUM7RUFDTDs7RUFFQTtFQUNBbStELGtCQUFrQixDQUNkLFVBQUFuOUQsRUFBRSxFQUFJO0lBQ0ZxWixTQUFTLENBQUNzOEMsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBQXZ6RCxDQUFDO01BQUEsT0FBSW02RCxXQUFXLENBQUNuNkQsQ0FBQyxDQUFDRSxNQUFNLENBQUM7SUFBQSxFQUFDO0lBQ3ZEK1csU0FBUyxDQUFDczhDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBQXZ6RCxDQUFDLEVBQUk7TUFDckIsSUFBSUEsQ0FBQyxDQUFDRSxNQUFNLEtBQUt0QyxFQUFFLEVBQUU7UUFDakJ1OEQsV0FBVyxDQUFDLElBQUksQ0FBQztNQUNyQjtJQUNKLENBQUMsQ0FBQztJQUNGbGpELFNBQVMsQ0FBQ3M4QyxFQUFFLENBQUMsTUFBTSxFQUFFOEgsZUFBZSxDQUFDO0lBQ3JDcGtELFNBQVMsQ0FBQ3M4QyxFQUFFLENBQUMsS0FBSyxFQUFFOEgsZUFBZSxDQUFDO0lBQ3BDcGtELFNBQVMsQ0FBQzdaLEtBQUssQ0FBQyxDQUFDLENBQUNtMkQsRUFBRSxDQUFDLFVBQVUsRUFBRThILGVBQWUsQ0FBQztFQUNyRCxDQUFDLEVBQ0QsQ0FBQ3BrRCxTQUFTLENBQ2QsQ0FBQzs7RUFFRDtFQUNBOGpELGtCQUFrQixDQUNkLFVBQUFuOUQsRUFBRTtJQUFBLE9BQUlzOEQsUUFBUSxJQUFJakQsMEVBQWtCLENBQUNyNUQsRUFBRSxFQUFFczhELFFBQVEsQ0FBQ256RCxJQUFJLENBQUMsQ0FBQyxDQUFDekosRUFBRSxDQUFDO0VBQUEsR0FDNUQsQ0FBQzQ4RCxRQUFRLENBQ2IsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7RUFDQWEsa0JBQWtCLENBQ2QsVUFBQW45RCxFQUFFO0lBQUEsT0FBSW84RCxPQUFPLElBQUk5QywwRUFBa0IsQ0FBQ3Q1RCxFQUFFLEVBQUVvOEQsT0FBTyxDQUFDMThELEVBQUUsRUFBRTA4RCxPQUFPLENBQUNqdUQsS0FBSyxDQUFDO0VBQUEsR0FDbEUsQ0FBQ2l1RCxPQUFPLENBQ1osQ0FBQzs7RUFFRDtFQUNBZSxrQkFBa0IsQ0FDZCxVQUFBbjlELEVBQUU7SUFBQSxPQUNFMDVELE9BQU8sQ0FBQ21FLE9BQU8sQ0FBQ25nRSxPQUFPLENBQUMsVUFBQTgyQyxFQUFFO01BQUEsT0FDdEIra0Isc0VBQWMsQ0FBQ3Y1RCxFQUFFLEVBQUV3MEMsRUFBRSxFQUFFa2xCLE9BQU8sQ0FBQzNXLFNBQVMsQ0FBQ3ZPLEVBQUUsQ0FBQyxDQUFDO0lBQUEsQ0FDakQsQ0FBQztFQUFBLEdBQ0wsQ0FBQ2tsQixPQUFPLENBQUNtRSxPQUFPLENBQ3BCLENBQUM7RUFFRCxJQUFJeEIsY0FBYyxLQUFLLFVBQVUsRUFBRTtJQUMvQjtJQUNBO0lBQ0Esb0JBQ0lsbkMsMERBQUE7TUFBS25FLFNBQVMsRUFBQztJQUE4QixnQkFDekNtRSwwREFBQTtNQUFLbkUsU0FBUyxFQUFDO0lBQTRCLGdCQUN2Q21FLDBEQUFBLGNBQUssZ0NBQW1DLENBQ3ZDLENBQ0osQ0FBQztFQUVkOztFQUVBO0VBQ0E7RUFDQSxJQUFJMm9DLFdBQVcsR0FBRyxFQUFFO0VBQ3BCLElBQUlDLFdBQVcsR0FBRyxDQUFDLENBQUM7RUFDcEIsSUFBSVIsV0FBVyxHQUFHLEtBQUs7RUFFdkIsSUFBSWpCLFFBQVEsRUFBRTtJQUNWLElBQU1uekQsSUFBSSxHQUFHbXpELFFBQVEsQ0FBQ256RCxJQUFJLENBQUMsQ0FBQztJQUU1QixRQUFRQSxJQUFJLENBQUM0VixJQUFJO01BQ2IsS0FBSyxXQUFXO1FBQUU7VUFBQSxJQUFBaS9DLGFBQUE7VUFDZCxJQUFNQyxJQUFJLEdBQUcxdkMsa0RBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFBeXZDLGFBQUEsR0FBRVYsWUFBWSxDQUFDbjBELElBQUksQ0FBQ3pKLEVBQUUsQ0FBQyxjQUFBcytELGFBQUEsdUJBQXJCQSxhQUFBLENBQXVCN3ZELEtBQUssQ0FBQztVQUN2RDR2RCxXQUFXLEdBQUdFLElBQUk7VUFDbEJILFdBQVcsR0FBRzMwRCxJQUFJLENBQUN6SixFQUFFO1VBQ3JCO1FBQ0o7TUFFQSxLQUFLLFVBQVU7UUFBRTtVQUNibytELFdBQVcsR0FBRzMwRCxJQUFJLENBQUNySixNQUFNO1VBQ3pCaStELFdBQVcsQ0FBQzUwRCxJQUFJLENBQUN5cEIsS0FBSyxDQUFDLEdBQUc0cUMsWUFBWSxDQUFDcjBELElBQUksQ0FBQztVQUM1QztRQUNKOztNQUVBO01BQ0E7UUFBUztVQUNMNDBELFdBQVcsQ0FBQ2gvQyxJQUFJLEdBQUc1VixJQUFJLENBQUNveEQsSUFBSTs7VUFFNUI7VUFDQSxJQUFNMkQsZ0JBQWdCLEdBQUcvMEQsSUFBSSxDQUFDekosRUFBRSxDQUFDOGIsS0FBSyxDQUFDaWdELFdBQVcsQ0FBQztVQUNuRHFDLFdBQVcsR0FBR3hDLGFBQWEsQ0FBQzRDLGdCQUFnQixDQUFDO1VBQzdDLElBQU05RCxTQUFTLEdBQUdWLE9BQU8sQ0FBQzNXLFNBQVMsQ0FBQ21iLGdCQUFnQixDQUFDO1VBQ3JELElBQUk5RCxTQUFTLEVBQUU7WUFDWCxJQUNJeDVELEtBQUssR0FTTHc1RCxTQUFTLENBVFR4NUQsS0FBSztjQUNMaXBDLE1BQU0sR0FRTnV3QixTQUFTLENBUlR2d0IsTUFBTTtjQUNOczBCLE9BQU8sR0FPUC9ELFNBQVMsQ0FQVCtELE9BQU87Y0FDUHhuQixTQUFTLEdBTVR5akIsU0FBUyxDQU5UempCLFNBQVM7Y0FDVDJqQixLQUFLLEdBS0xGLFNBQVMsQ0FMVEUsS0FBSztjQUNMOEQsT0FBTyxHQUlQaEUsU0FBUyxDQUpUZ0UsT0FBTztjQUNQenRELE1BQU0sR0FHTnlwRCxTQUFTLENBSFR6cEQsTUFBTTtjQUNObWEsTUFBTSxHQUVOc3ZDLFNBQVMsQ0FGVHR2QyxNQUFNO2NBQ04rUyxLQUFLLEdBQ0x1OEIsU0FBUyxDQURUdjhCLEtBQUs7WUFHVCxJQUFNd2dDLEdBQUcsR0FBRyxTQUFOQSxHQUFHQSxDQUFHamhELENBQUM7Y0FBQSxPQUFJMUksSUFBSSxDQUFDOGxELEtBQUssQ0FBQ3A5QyxDQUFDLElBQUl4YyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBQTtZQUU3Q205RCxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUduOUQsS0FBSztZQUNqQ205RCxXQUFXLENBQUNsMEIsTUFBTSxHQUFHa3hCLFlBQVksQ0FBQ2x4QixNQUFNLENBQUM7WUFFekMsSUFBTXkwQixNQUFNLEdBQUlQLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHO2NBQ3JEekQsS0FBSyxFQUFFK0QsR0FBRyxDQUFDL0QsS0FBSyxDQUFDO2NBQ2pCOEQsT0FBTyxFQUFFQyxHQUFHLENBQUNELE9BQU87WUFDeEIsQ0FBRTtZQUNGLElBQUlqMUQsSUFBSSxDQUFDb3hELElBQUksS0FBSyxRQUFRLEVBQUU7Y0FDeEIrRCxNQUFNLENBQUNILE9BQU8sR0FBR0UsR0FBRyxDQUFDRixPQUFPLENBQUM5RCxJQUFJLENBQUM7Y0FFbEMwRCxXQUFXLENBQUMsMkJBQTJCLENBQUMsR0FBRztnQkFDdkNRLFFBQVEsRUFBRUYsR0FBRyxDQUFDRixPQUFPLENBQUNJLFFBQVEsQ0FBQztnQkFDL0JDLE1BQU0sRUFBRUgsR0FBRyxDQUFDRixPQUFPLENBQUNLLE1BQU07Y0FDOUIsQ0FBQztZQUNMO1lBQ0EsS0FBSyxJQUFNeDZELEdBQUcsSUFBSTJ5QyxTQUFTLEVBQUU7Y0FDekIybkIsTUFBTSxDQUFDLFFBQVEsR0FBR3Q2RCxHQUFHLENBQUMsR0FBR3E2RCxHQUFHLENBQUMxbkIsU0FBUyxDQUFDM3lDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hEO1lBRUErNUQsV0FBVyxDQUFDOW5CLE9BQU8sR0FBR2dsQixjQUFjLENBQUN0cUQsTUFBTSxDQUFDO1lBQzVDb3RELFdBQVcsQ0FBQ2p6QyxNQUFNLEdBQUdvd0MsYUFBYSxDQUFDcHdDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5Q2l6QyxXQUFXLENBQUNsZ0MsS0FBSyxHQUFHcTlCLGFBQWEsQ0FBQ3I5QixLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDaEQsQ0FBQyxNQUFNO1lBQ0hrZ0MsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7VUFDakM7UUFDSjtJQUNKO0VBQ0o7RUFFQSxJQUFNVSxRQUFRLEdBQ1Y3QixVQUFVLEtBQUtLLFVBQVUsR0FDbkJOLFdBQVcsR0FDWHh1QyxrREFBVSxDQUFDMHRDLE9BQU8sQ0FBQ29CLFVBQVUsQ0FBQyxFQUFFO0lBQUNwdEQsS0FBSyxFQUFFNHREO0VBQWUsQ0FBQyxDQUFDO0VBRW5FLG9CQUNJdG9DLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBOEIsZ0JBQ3pDbUUsMERBQUEsQ0FBQzhqQyx5REFBa0I7SUFDZmhvQyxLQUFLLEVBQUU7TUFBQzVyQixLQUFLLEVBQUUsTUFBTTtNQUFFQyxNQUFNLEVBQUU7SUFBTSxDQUFFO0lBQ3ZDdEYsRUFBRSxFQUFFMDhELFlBQWE7SUFDakJ4ckMsUUFBUSxFQUFFQSxRQUFTO0lBQ25CN29CLE1BQU0sRUFBRW8yRCxRQUFTO0lBQ2pCdHRDLFVBQVUsRUFBRUEsMEVBQVVBO0VBQUMsQ0FDMUIsQ0FBQyxFQUNEbXJDLFFBQVEsZ0JBQ0xubkMsMERBQUE7SUFBS25FLFNBQVMsRUFBQztFQUF5QixHQUNuQ3VzQyxXQUFXLGdCQUNScG9DLDBEQUFBLGNBQUssNERBR0EsQ0FBQyxHQUNOLElBQUksZUFDUkEsMERBQUEsQ0FBQ2lrQyxzREFBUTtJQUNMandELElBQUksRUFBRTQwRCxXQUFZO0lBQ2xCVyxLQUFLLEVBQUMsYUFBYTtJQUNuQkMsYUFBYSxFQUFFLFNBQWZBLGFBQWFBLENBQUVyUixLQUFLO01BQUEsT0FDaEJBLEtBQUssQ0FBQ2h3RCxNQUFNLEtBQUssQ0FBQyxHQUFHd2dFLFdBQVcsR0FBR3hRLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFBQSxDQUM5QztJQUNEc1IsYUFBYSxFQUFFLFNBQWZBLGFBQWFBLENBQUc3L0MsSUFBSSxFQUFFNVYsSUFBSSxFQUFFMDFELFFBQVE7TUFBQSxvQkFDaEMxcEMsMERBQUEsZUFBTzBwQyxRQUFlLENBQUM7SUFBQSxDQUN6QjtJQUNGQyxnQkFBZ0IsRUFBRSxTQUFsQkEsZ0JBQWdCQSxDQUFHQyxPQUFPLEVBQUU1MUQsSUFBSSxFQUFFNjFELEtBQUs7TUFBQSxPQUFLQSxLQUFLLEdBQUcsQ0FBQztJQUFBO0VBQUMsQ0FDekQsQ0FDQSxDQUFDLEdBQ04sSUFBSSxlQUNSN3BDLDBEQUFBO0lBQ0luRSxTQUFTLEVBQUMsbUNBQW1DO0lBQzdDaXVDLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFFNzhELENBQUM7TUFBQSxPQUFJODZELGFBQWEsQ0FBQzk2RCxDQUFDLENBQUNFLE1BQU0sQ0FBQ3RELEtBQUssQ0FBQztJQUFBLENBQUM7SUFDN0NBLEtBQUssRUFBRWkrRCxVQUFXO0lBQ2xCdm9DLEdBQUcsRUFBRW9vQztFQUFlLEdBRW5CbC9ELGtEQUFJLENBQUNpK0QsT0FBTyxDQUFDLENBQUMzMkQsR0FBRyxDQUFDLFVBQUFySCxDQUFDO0lBQUEsb0JBQ2hCczNCLDBEQUFBO01BQVFuMkIsS0FBSyxFQUFFbkIsQ0FBRTtNQUFDbUcsR0FBRyxFQUFFbkc7SUFBRSxHQUNwQkEsQ0FDRyxDQUFDO0VBQUEsQ0FDWixDQUNHLENBQ1AsQ0FBQztBQUVkO0FBRUFzK0QsYUFBYSxDQUFDdHhCLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFBQyxJQUV2QnEwQixpQ0FBaUMsMEJBQUFDLFVBQUE7RUFDbkMsU0FBQUQsa0NBQVkvd0QsS0FBSyxFQUFFO0lBQUEsSUFBQXFsQixLQUFBO0lBQUEza0IsZUFBQSxPQUFBcXdELGlDQUFBO0lBQ2YxckMsS0FBQSxHQUFBQyxVQUFBLE9BQUF5ckMsaUNBQUEsR0FBTS93RCxLQUFLO0lBQ1hxbEIsS0FBQSxDQUFLcUssS0FBSyxHQUFHO01BQUM2TSxRQUFRLEVBQUU7SUFBSyxDQUFDO0lBQUMsT0FBQWxYLEtBQUE7RUFDbkM7RUFBQ0ssU0FBQSxDQUFBcXJDLGlDQUFBLEVBQUFDLFVBQUE7RUFBQSxPQUFBbHhELFlBQUEsQ0FBQWl4RCxpQ0FBQTtJQUFBbDdELEdBQUE7SUFBQWhGLEtBQUEsRUFNRCxTQUFBb2dFLGlCQUFpQkEsQ0FBQ3BtQyxLQUFLLEVBQUVxbUMsSUFBSSxFQUFFO01BQzNCLElBQU9oa0MsUUFBUSxHQUFJLElBQUksQ0FBQ2x0QixLQUFLLENBQXRCa3RCLFFBQVE7TUFDZkEsUUFBUSxDQUNKc00saURBQU8sQ0FBQztRQUNKMjNCLElBQUksRUFBRSxJQUFJLENBQUN6aEMsS0FBSyxDQUFDeWhDLElBQUk7UUFDckJ2Z0QsSUFBSSxFQUFFLFVBQVU7UUFDaEJpYSxLQUFLO1FBQ0xxbUM7TUFDSixDQUFDLENBQ0wsQ0FBQztJQUNMO0VBQUM7SUFBQXI3RCxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQXUxQixNQUFNQSxDQUFBLEVBQUc7TUFDTCxPQUFPLElBQUksQ0FBQ3NKLEtBQUssQ0FBQzZNLFFBQVEsZ0JBQ3RCdlYsMERBQUE7UUFBS25FLFNBQVMsRUFBQztNQUE4QixnQkFDekNtRSwwREFBQTtRQUFLbkUsU0FBUyxFQUFDO01BQTRCLGdCQUN2Q21FLDBEQUFBLGNBQUssMENBQTZDLENBQUMsZUFDbkRBLDBEQUFBLGNBQUssbUNBQXNDLENBQzFDLENBQ0osQ0FBQyxnQkFFTkEsMERBQUEsQ0FBQ2duQyxhQUFhLE1BQUUsQ0FDbkI7SUFDTDtFQUFDO0lBQUFuNEQsR0FBQTtJQUFBaEYsS0FBQSxFQTNCRCxTQUFPdWdFLHdCQUF3QkEsQ0FBQ3hpRSxDQUFDLEVBQUU7TUFDL0IsT0FBTztRQUFDMnRDLFFBQVEsRUFBRTtNQUFJLENBQUM7SUFDM0I7RUFBQztBQUFBLEVBUjJDOVYsNENBQVM7QUFvQ3pEc3FDLGlDQUFpQyxDQUFDcjBCLFNBQVMsR0FBRztFQUMxQ3hQLFFBQVEsRUFBRWtNLHdEQUFjeFc7QUFDNUIsQ0FBQztBQUVELElBQU15dUMsc0JBQXNCLEdBQUdubUMsb0RBQU8sQ0FBQyxJQUFJLEVBQUUsVUFBQWdDLFFBQVE7RUFBQSxPQUFLO0lBQUNBO0VBQVEsQ0FBQztBQUFBLENBQUMsQ0FBQyxDQUNsRTZqQyxpQ0FDSixDQUFDOzs7Ozs7Ozs7Ozs7O0FDcGVELElBQU0vdEMsVUFBVSxHQUFHLENBQ2Y7RUFDSTBCLFFBQVEsRUFBRSxHQUFHO0VBQ2I1QixLQUFLLEVBQUU7SUFDSCxXQUFXLEVBQUUsRUFBRTtJQUNmLGFBQWEsRUFBRTtFQUNuQjtBQUNKLENBQUMsRUFFRDtFQUNJNEIsUUFBUSxFQUFFLE1BQU07RUFDaEI1QixLQUFLLEVBQUU7SUFDSDVyQixLQUFLLEVBQUUsQ0FBQztJQUNSLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLG9CQUFvQixFQUFFLFNBQVM7SUFDL0Isb0JBQW9CLEVBQUUsVUFBVTtJQUNoQyxtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLHlCQUF5QixFQUFFLEVBQUU7SUFDN0IscUJBQXFCLEVBQUUsZ0NBQWdDO0lBQ3ZELHFCQUFxQixFQUFFLE9BQU87SUFDOUIsNEJBQTRCLEVBQUU7RUFDbEM7QUFDSixDQUFDLEVBRUQ7RUFDSXd0QixRQUFRLEVBQUUscUJBQXFCO0VBQy9CNUIsS0FBSyxFQUFFO0lBQ0h3dUMsT0FBTyxFQUFFO0VBQ2I7QUFDSixDQUFDLEVBRUQ7RUFDSTVzQyxRQUFRLEVBQUUscUJBQXFCO0VBQy9CNUIsS0FBSyxFQUFFO0lBQ0gsWUFBWSxFQUFFLFNBQVM7SUFDdkIsb0JBQW9CLEVBQUU7RUFDMUI7QUFDSixDQUFDLEVBRUQ7RUFDSTRCLFFBQVEsRUFBRSxvQkFBb0I7RUFDOUI1QixLQUFLLEVBQUU7SUFDSCxZQUFZLEVBQUU7RUFDbEI7QUFDSixDQUFDLEVBRUQ7RUFDSTRCLFFBQVEsRUFBRSxNQUFNO0VBQ2hCNUIsS0FBSyxFQUFFO0lBQ0h5dUMsS0FBSyxFQUFFLFNBQVM7SUFDaEJud0QsT0FBTyxFQUFFLENBQUM7SUFDVixhQUFhLEVBQUUsUUFBUTtJQUN2QixhQUFhLEVBQUUsUUFBUTtJQUN2QixjQUFjLEVBQUUsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLGNBQWMsRUFBRSxPQUFPO0lBQ3ZCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLHFCQUFxQixFQUFFLGdCQUFnQjtJQUN2QyxxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLDRCQUE0QixFQUFFO0VBQ2xDO0FBQ0osQ0FBQyxFQUVEO0VBQ0lzakIsUUFBUSxFQUFFLHVCQUF1QjtFQUNqQzVCLEtBQUssRUFBRTtJQUNINXJCLEtBQUssRUFBRSxFQUFFO0lBQ1RDLE1BQU0sRUFBRSxFQUFFO0lBQ1ZtbkMsS0FBSyxFQUFFLGlCQUFpQjtJQUN4QjdaLEtBQUssRUFBRSxTQUFQQSxLQUFLQSxDQUFFeHdCLENBQUM7TUFBQSxVQUFBa2EsTUFBQSxDQUFPbGEsQ0FBQyxDQUFDK0csSUFBSSxDQUFDLENBQUMsQ0FBQ3ZJLEtBQUssUUFBQTBiLE1BQUEsQ0FBS2xhLENBQUMsQ0FBQytHLElBQUksQ0FBQyxDQUFDLENBQUNreEQsSUFBSTtJQUFBLENBQUs7SUFDcEQsV0FBVyxFQUFFLE1BQU07SUFDbkIsb0JBQW9CLEVBQUU7RUFDMUI7QUFDSixDQUFDLEVBRUQ7RUFDSXhuQyxRQUFRLEVBQUUsc0NBQXNDO0VBQ2hENUIsS0FBSyxFQUFFO0lBQ0h5dUMsS0FBSyxFQUFFLFNBQVM7SUFDaEIsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSTdzQyxRQUFRLEVBQUUsc0NBQXNDO0VBQ2hENUIsS0FBSyxFQUFFO0lBQ0h5dUMsS0FBSyxFQUFFLFNBQVM7SUFDaEIsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSTdzQyxRQUFRLEVBQUUsK0NBQStDO0VBQ3pENUIsS0FBSyxFQUFFO0lBQ0g1ckIsS0FBSyxFQUFFLE9BQU87SUFDZDtJQUNBb25DLEtBQUssRUFBRSxXQUFXO0lBQ2xCN0MsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUV4bkMsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQytHLElBQUksQ0FBQyxDQUFDLENBQUN5cEIsS0FBSyxDQUFDMUssT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7SUFBQTtJQUM5QyxhQUFhLEVBQUUsS0FBSztJQUNwQixrQkFBa0IsRUFBRTtFQUN4QjtBQUNKLENBQUMsRUFFRDtFQUNJMkssUUFBUSxFQUFFLHVCQUF1QjtFQUNqQzVCLEtBQUssRUFBRTtJQUNINXJCLEtBQUssRUFBRSxPQUFPO0lBQ2RDLE1BQU0sRUFBRSxFQUFFO0lBQ1ZtbkMsS0FBSyxFQUFFLFdBQVc7SUFDbEI3QyxPQUFPLEVBQUUsYUFBYTtJQUN0QjgxQixLQUFLLEVBQUUsT0FBTztJQUNkLGtCQUFrQixFQUFFO0VBQ3hCO0FBQ0osQ0FBQyxFQUVEO0VBQ0k3c0MsUUFBUSxFQUFFLGdCQUFnQjtFQUMxQjVCLEtBQUssRUFBRTtJQUNIMHVDLEtBQUssRUFBRSxLQUFLO0lBQ1osZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGdCQUFnQixFQUFFO0VBQ3RCO0FBQ0osQ0FBQyxFQUVEO0VBQ0k5c0MsUUFBUSxFQUFFLGtDQUFrQztFQUM1QzVCLEtBQUssRUFBRTtJQUNILGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGNBQWMsRUFBRSxDQUFDO0lBQ2pCLGdCQUFnQixFQUFFO0VBQ3RCO0FBQ0osQ0FBQyxFQUVEO0VBQ0k0QixRQUFRLEVBQUUsaUJBQWlCO0VBQzNCNUIsS0FBSyxFQUFFO0lBQ0gsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSTRCLFFBQVEsRUFBRSxZQUFZO0VBQ3RCNUIsS0FBSyxFQUFFO0lBQ0gsWUFBWSxFQUFFLFNBQVM7SUFDdkIsb0JBQW9CLEVBQUU7RUFDMUI7QUFDSixDQUFDLEVBRUQ7RUFDSTRCLFFBQVEsRUFBRSxXQUFXO0VBQ3JCNUIsS0FBSyxFQUFFO0lBQ0gydUMsT0FBTyxFQUFFO0VBQ2I7QUFDSixDQUFDLENBQ0o7QUFFRCwrREFBZXp1QyxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoS3NDOztBQUUvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzJ1QyxZQUFZQSxDQUFDditELElBQUksRUFBRTtFQUN4QixJQUFNMnZCLFFBQVEsR0FBRzN2QixJQUFJLENBQUNZLGNBQWMsQ0FBQyxDQUFDO0VBQ3RDLE9BQU87SUFDSCtuQixLQUFLLEVBQUVnSCxRQUFRLENBQUN0eEIsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzFDaStCLEtBQUssRUFBRTNNLFFBQVEsQ0FBQ3R4QixNQUFNLENBQUMsa0JBQWtCLENBQUM7SUFDMUNnb0IsTUFBTSxFQUFFc0osUUFBUSxDQUFDdHhCLE1BQU0sQ0FBQyxtQkFBbUI7RUFDL0MsQ0FBQztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN5NUQsa0JBQWtCQSxDQUFDcjVELEVBQUUsRUFBRU4sRUFBRSxFQUFFO0VBQ3ZDLFNBQVNxZ0UsTUFBTUEsQ0FBQ3grRCxJQUFJLEVBQUVOLFVBQVUsRUFBRTtJQUM5QjtJQUNBLElBQU04ZCxJQUFJLEdBQUd4ZCxJQUFJLENBQUM0SCxJQUFJLENBQUMsQ0FBQyxDQUFDNFYsSUFBSSxLQUFLLFVBQVUsR0FBRyxPQUFPLEdBQUcsUUFBUTtJQUNqRSxJQUFNbFgsS0FBSyxHQUFHaTRELFlBQVksQ0FBQ3YrRCxJQUFJLENBQUMsQ0FBQ3dkLElBQUksQ0FBQztJQUN0QyxJQUFNaWhELE9BQU8sR0FBR240RCxLQUFLLENBQUNvNEQsT0FBTyxDQUFDLENBQUM7SUFDL0JoL0QsVUFBVSxDQUFDRyxLQUFLLENBQUN5RyxLQUFLLENBQUM7SUFDdkI1RyxVQUFVLENBQUNHLEtBQUssQ0FBQzQrRCxPQUFPLENBQUM7SUFDekIsSUFBSXorRCxJQUFJLENBQUM0SCxJQUFJLENBQUMsQ0FBQyxDQUFDNFYsSUFBSSxLQUFLLFVBQVUsRUFBRTtNQUNqQzlkLFVBQVUsQ0FBQ0csS0FBSyxDQUFDRyxJQUFJLENBQUNTLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdEM7SUFDQWcrRCxPQUFPLENBQUN0aUUsT0FBTyxDQUFDLFVBQUE2RCxJQUFJO01BQUEsT0FBSXcrRCxNQUFNLENBQUN4K0QsSUFBSSxFQUFFTixVQUFVLENBQUM7SUFBQSxFQUFDO0VBQ3JEO0VBRUEsU0FBU2kvRCxPQUFPQSxDQUFDMytELElBQUksRUFBRU4sVUFBVSxFQUFFO0lBQy9CLElBQU04ZCxJQUFJLEdBQUd4ZCxJQUFJLENBQUM0SCxJQUFJLENBQUMsQ0FBQyxDQUFDNFYsSUFBSSxLQUFLLFVBQVUsR0FBRyxRQUFRLEdBQUcsT0FBTztJQUNqRSxJQUFNbFgsS0FBSyxHQUFHaTRELFlBQVksQ0FBQ3YrRCxJQUFJLENBQUMsQ0FBQ3dkLElBQUksQ0FBQztJQUN0QyxJQUFNL1gsUUFBUSxHQUFHYSxLQUFLLENBQUNrcEQsT0FBTyxDQUFDLENBQUM7SUFDaEM5dkQsVUFBVSxDQUFDRyxLQUFLLENBQUN5RyxLQUFLLENBQUM7SUFDdkI1RyxVQUFVLENBQUNHLEtBQUssQ0FBQzRGLFFBQVEsQ0FBQztJQUMxQixJQUFJekYsSUFBSSxDQUFDNEgsSUFBSSxDQUFDLENBQUMsQ0FBQzRWLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDakM5ZCxVQUFVLENBQUNHLEtBQUssQ0FBQ0csSUFBSSxDQUFDUyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3RDO0lBQ0FnRixRQUFRLENBQUN0SixPQUFPLENBQUMsVUFBQTZELElBQUk7TUFBQSxPQUFJMitELE9BQU8sQ0FBQzMrRCxJQUFJLEVBQUVOLFVBQVUsQ0FBQztJQUFBLEVBQUM7RUFDdkQ7RUFFQSxJQUFJdkIsRUFBRSxFQUFFO0lBQ0osSUFBTTZCLElBQUksR0FBR3ZCLEVBQUUsQ0FBQ2tFLGNBQWMsQ0FBQ3hFLEVBQUUsQ0FBQzs7SUFFbEM7O0lBRUE2QixJQUFJLENBQUM0K0QsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7SUFFOUI7SUFDQTtJQUNBOztJQUVBOztJQUVBLElBQU1DLE9BQU8sR0FBR3BnRSxFQUFFLENBQUNpQixVQUFVLENBQUMsQ0FBQztJQUMvQm0vRCxPQUFPLENBQUNoL0QsS0FBSyxDQUFDRyxJQUFJLENBQUM7SUFDbkJ3K0QsTUFBTSxDQUFDeCtELElBQUksRUFBRTYrRCxPQUFPLENBQUM7SUFDckJGLE9BQU8sQ0FBQzMrRCxJQUFJLEVBQUU2K0QsT0FBTyxDQUFDO0lBRXRCLElBQU1DLEtBQUssR0FBR0QsT0FBTyxDQUFDRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFDRCxLQUFLLENBQUNGLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFFMUIsT0FBTyxZQUFNO01BQ1Q1K0QsSUFBSSxDQUFDZy9ELFdBQVcsQ0FBQyxlQUFlLENBQUM7TUFDakNGLEtBQUssQ0FBQ0UsV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0VBQ0w7RUFDQSxPQUFPL2hFLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM4NkQsa0JBQWtCQSxDQUFDdDVELEVBQUUsRUFBRU4sRUFBRSxFQUFFeU8sS0FBSyxFQUFtQjtFQUFBLElBQWpCcXlELFNBQVMsR0FBQW5qRSxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLEdBQUc7RUFDN0RMLE1BQU0sQ0FBQ1ksSUFBSSxDQUFDdVEsS0FBSyxDQUFDLENBQUN6USxPQUFPLENBQUMsVUFBQXVkLElBQUksRUFBSTtJQUMvQixJQUFNMVosSUFBSSxHQUFHdkIsRUFBRSxDQUFDa0UsY0FBYyxJQUFBb1ksTUFBQSxDQUFJNWMsRUFBRSxPQUFBNGMsTUFBQSxDQUFJckIsSUFBSSxDQUFFLENBQUM7SUFDL0MxWixJQUFJLENBQUNrL0QsVUFBVSxDQUFDLGNBQWMsRUFBRUQsU0FBUyxDQUFDO0lBQzFDai9ELElBQUksQ0FBQ20vRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQ1o5Z0UsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQzFCNmdFLFVBQVUsQ0FBQyxXQUFXLEVBQUVELFNBQVMsQ0FBQztFQUMzQyxDQUFDLENBQUM7QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2pILGNBQWNBLENBQUN2NUQsRUFBRSxFQUFFTixFQUFFLEVBQUVnNkQsT0FBTyxFQUFtQjtFQUFBLElBQWpCOEcsU0FBUyxHQUFBbmpFLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsR0FBRztFQUMzRCxJQUFNa0UsSUFBSSxHQUFHdkIsRUFBRSxDQUFDa0UsY0FBYyxzQkFBQW9ZLE1BQUEsQ0FBc0I1YyxFQUFFLENBQUUsQ0FBQztFQUN6RCxJQUFPa0IsS0FBSyxHQUFtQjg0RCxPQUFPLENBQS9COTRELEtBQUs7SUFBRTA1RCxLQUFLLEdBQVlaLE9BQU8sQ0FBeEJZLEtBQUs7SUFBRXp3QixNQUFNLEdBQUk2dkIsT0FBTyxDQUFqQjd2QixNQUFNO0VBQzNCLElBQU9teEIsTUFBTSxHQUFJbnhCLE1BQU0sQ0FBaEJteEIsTUFBTTs7RUFFYjtFQUNBLElBQU0yRixPQUFPLEdBQUcvL0QsS0FBSyxHQUFHLENBQUMsR0FBRzA1RCxLQUFLLEdBQUcxNUQsS0FBSyxHQUFHLENBQUM7RUFDN0NXLElBQUksQ0FBQzRILElBQUksQ0FBQyxPQUFPLEVBQUV2SSxLQUFLLENBQUM7RUFDekJXLElBQUksQ0FBQzRILElBQUksQ0FBQyxNQUFNLEVBQUV1TCxJQUFJLENBQUM4bEQsS0FBSyxDQUFDbUcsT0FBTyxDQUFDLENBQUM7O0VBRXRDO0VBQ0EsSUFBSTNGLE1BQU0sS0FBSyxTQUFTLEVBQUU7SUFDdEJ6NUQsSUFBSSxDQUFDNEgsSUFBSSxDQUFDLFlBQVksRUFBRTBaLElBQUksQ0FBQ28wQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25DMTFDLElBQUksQ0FBQzQrRCxRQUFRLENBQUMsa0JBQWtCLENBQUM7RUFDckMsQ0FBQyxNQUFNLElBQUk1K0QsSUFBSSxDQUFDcS9ELFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO0lBQzFDLElBQU1DLFFBQVEsR0FBR3QvRCxJQUFJLENBQUM0SCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUdxM0QsU0FBUyxHQUFHMzlDLElBQUksQ0FBQ28wQixHQUFHLENBQUMsQ0FBQztJQUNqRXNGLFVBQVUsQ0FDTjtNQUFBLE9BQU1oN0MsSUFBSSxDQUFDZy9ELFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztJQUFBLEdBQzFDN3JELElBQUksQ0FBQytILEdBQUcsQ0FBQ29rRCxRQUFRLEVBQUUsQ0FBQyxDQUN4QixDQUFDO0VBQ0w7RUFFQSxJQUNJN0YsTUFBTSxLQUFLLFNBQVMsSUFDcEJBLE1BQU0sS0FBSzZFLDJEQUFTLENBQUN4M0Isd0RBQU0sQ0FBQ3lCLEVBQUUsQ0FBQyxJQUMvQmt4QixNQUFNLEtBQUs2RSwyREFBUyxDQUFDeDNCLHdEQUFNLENBQUNrUSxjQUFjLENBQUMsRUFDN0M7SUFDRWgzQyxJQUFJLENBQUM0SCxJQUFJLENBQUMsVUFBVSxFQUFFMFosSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakMxMUMsSUFBSSxDQUFDNCtELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztFQUNuQyxDQUFDLE1BQU0sSUFBSTUrRCxJQUFJLENBQUNxL0QsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7SUFDeEMsSUFBTUMsU0FBUSxHQUFHdC9ELElBQUksQ0FBQzRILElBQUksQ0FBQyxVQUFVLENBQUMsR0FBR3EzRCxTQUFTLEdBQUczOUMsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDO0lBQy9Ec0YsVUFBVSxDQUNOO01BQUEsT0FBTWg3QyxJQUFJLENBQUNnL0QsV0FBVyxDQUFDLGdCQUFnQixDQUFDO0lBQUEsR0FDeEM3ckQsSUFBSSxDQUFDK0gsR0FBRyxDQUFDb2tELFNBQVEsRUFBRSxDQUFDLENBQ3hCLENBQUM7RUFDTDs7RUFFQTtFQUNBO0VBQ0EsSUFBSTdGLE1BQU0sS0FBSzZFLDJEQUFTLENBQUN4M0Isd0RBQU0sQ0FBQ3lCLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDdm9DLElBQUksQ0FBQ20vRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUNELFVBQVUsQ0FBQyxXQUFXLEVBQUVELFNBQVMsQ0FBQztFQUN4RDtBQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoS2dDO0FBQ0c7QUFDVztBQUFBLElBRXhDTSxzQkFBc0IsMEJBQUEzQixVQUFBO0VBQ3hCLFNBQUEyQix1QkFBWTN5RCxLQUFLLEVBQUU7SUFBQSxJQUFBcWxCLEtBQUE7SUFBQTNrQixlQUFBLE9BQUFpeUQsc0JBQUE7SUFDZnR0QyxLQUFBLEdBQUFDLFVBQUEsT0FBQXF0QyxzQkFBQSxHQUFNM3lELEtBQUs7SUFDWHFsQixLQUFBLENBQUtxSyxLQUFLLEdBQUc7TUFDVHloQyxJQUFJLEVBQUVueEQsS0FBSyxDQUFDa3JDLFdBQVc7TUFDdkIwbkIsV0FBVyxFQUFFLElBQUk7TUFDakJyMkIsUUFBUSxFQUFFO0lBQ2QsQ0FBQztJQUFDLE9BQUFsWCxLQUFBO0VBQ047RUFBQ0ssU0FBQSxDQUFBaXRDLHNCQUFBLEVBQUEzQixVQUFBO0VBQUEsT0FBQWx4RCxZQUFBLENBQUE2eUQsc0JBQUE7SUFBQTk4RCxHQUFBO0lBQUFoRixLQUFBLEVBTUQsU0FBQW9nRSxpQkFBaUJBLENBQUNwbUMsS0FBSyxFQUFFcW1DLElBQUksRUFBRTtNQUMzQixJQUFPaGtDLFFBQVEsR0FBSSxJQUFJLENBQUNsdEIsS0FBSyxDQUF0Qmt0QixRQUFRO01BQ2ZBLFFBQVEsQ0FDSnNNLGlEQUFPLENBQUM7UUFDSjIzQixJQUFJLEVBQUUsSUFBSSxDQUFDemhDLEtBQUssQ0FBQ3loQyxJQUFJO1FBQ3JCdmdELElBQUksRUFBRSxVQUFVO1FBQ2hCaWEsS0FBSztRQUNMcW1DO01BQ0osQ0FBQyxDQUNMLENBQUM7TUFDRGhrQyxRQUFRLENBQUNvMUIsNENBQU0sQ0FBQztJQUNwQjtFQUFDO0lBQUF6c0QsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUFvMUIsa0JBQWtCQSxDQUFDa2pDLFNBQVMsRUFBRUMsU0FBUyxFQUFFO01BQ3JDLElBQU15SixZQUFZLEdBQUcxSixTQUFTLENBQUN0d0QsUUFBUTtNQUN2QyxJQUNJLENBQUMsSUFBSSxDQUFDNjJCLEtBQUssQ0FBQzZNLFFBQVEsSUFDcEJzMkIsWUFBWSxLQUFLekosU0FBUyxDQUFDd0osV0FBVyxJQUN0Q0MsWUFBWSxLQUFLLElBQUksQ0FBQzd5RCxLQUFLLENBQUNuSCxRQUFRLEVBQ3RDO1FBQ0U7UUFDQSxJQUFJLENBQUNxd0QsUUFBUSxDQUFDO1VBQ1YwSixXQUFXLEVBQUVDO1FBQ2pCLENBQUMsQ0FBQztNQUNOO0lBQ0o7RUFBQztJQUFBaDlELEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBdTFCLE1BQU1BLENBQUEsRUFBRztNQUNMLElBQUFpa0MsV0FBQSxHQUFnQyxJQUFJLENBQUMzNkIsS0FBSztRQUFuQzZNLFFBQVEsR0FBQTh0QixXQUFBLENBQVI5dEIsUUFBUTtRQUFFcTJCLFdBQVcsR0FBQXZJLFdBQUEsQ0FBWHVJLFdBQVc7TUFDNUIsT0FBT3IyQixRQUFRLEdBQUdxMkIsV0FBVyxHQUFHLElBQUksQ0FBQzV5RCxLQUFLLENBQUNuSCxRQUFRO0lBQ3ZEO0VBQUM7SUFBQWhELEdBQUE7SUFBQWhGLEtBQUEsRUFsQ0QsU0FBT3VnRSx3QkFBd0JBLENBQUN4aUUsQ0FBQyxFQUFFO01BQy9CLE9BQU87UUFBQzJ0QyxRQUFRLEVBQUU7TUFBSSxDQUFDO0lBQzNCO0VBQUM7QUFBQSxFQVpnQzlWLDRDQUFTO0FBK0M5Q2tzQyxzQkFBc0IsQ0FBQ2oyQixTQUFTLEdBQUc7RUFDL0I3akMsUUFBUSxFQUFFdWdDLDBEQUFnQjtFQUMxQjhSLFdBQVcsRUFBRTlSLDBEQUFnQjtFQUM3QnZPLEtBQUssRUFBRXVPLDBEQUFnQjtFQUN2QmxNLFFBQVEsRUFBRWtNLHdEQUFjeFc7QUFDNUIsQ0FBQztBQUVELCtEQUFlK3ZDLHNCQUFzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RHJDLE1BQXdHO0FBQ3hHLE1BQThGO0FBQzlGLE1BQXFHO0FBQ3JHLE1BQXdIO0FBQ3hILE1BQWlIO0FBQ2pILE1BQWlIO0FBQ2pILE1BQW9IO0FBQ3BIO0FBQ0E7O0FBRUE7O0FBRUEsNEJBQTRCLHFHQUFtQjtBQUMvQyx3QkFBd0Isa0hBQWE7O0FBRXJDLHVCQUF1Qix1R0FBYTtBQUNwQztBQUNBLGlCQUFpQiwrRkFBTTtBQUN2Qiw2QkFBNkIsc0dBQWtCOztBQUUvQyxhQUFhLDBHQUFHLENBQUMsOEZBQU87Ozs7QUFJOEQ7QUFDdEYsT0FBTywrREFBZSw4RkFBTyxJQUFJLDhGQUFPLFVBQVUsOEZBQU8sbUJBQW1CLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFCekM7QUFDUDtBQUNnQztBQUNSO0FBQ2xCO0FBQ2I7QUFDeUI7QUFFTjtBQUFBLElBRW5DSyxhQUFhLDBCQUFBaEMsVUFBQTtFQUNmLFNBQUFnQyxjQUFZaHpELEtBQUssRUFBRTtJQUFBLElBQUFxbEIsS0FBQTtJQUFBM2tCLGVBQUEsT0FBQXN5RCxhQUFBO0lBQ2YzdEMsS0FBQSxHQUFBQyxVQUFBLE9BQUEwdEMsYUFBQSxHQUFNaHpELEtBQUs7SUFDWHFsQixLQUFBLENBQUtxSyxLQUFLLEdBQUc7TUFDVHVqQyxTQUFTLEVBQUU1dEMsS0FBQSxDQUFLcmxCLEtBQUssQ0FBQ2t6RDtJQUMxQixDQUFDO0lBQUMsT0FBQTd0QyxLQUFBO0VBQ047RUFBQ0ssU0FBQSxDQUFBc3RDLGFBQUEsRUFBQWhDLFVBQUE7RUFBQSxPQUFBbHhELFlBQUEsQ0FBQWt6RCxhQUFBO0lBQUFuOUQsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUF1MUIsTUFBTUEsQ0FBQSxFQUFHO01BQUEsSUFBQXVoQyxNQUFBO01BQ0wsSUFBQS9oQyxXQUFBLEdBQTBCLElBQUksQ0FBQzVsQixLQUFLO1FBQTdCL0wsQ0FBQyxHQUFBMnhCLFdBQUEsQ0FBRDN4QixDQUFDO1FBQUVrL0QsWUFBWSxHQUFBdnRDLFdBQUEsQ0FBWnV0QyxZQUFZO01BQ3RCLElBQU9GLFNBQVMsR0FBSSxJQUFJLENBQUN2akMsS0FBSyxDQUF2QnVqQyxTQUFTO01BRWhCLElBQU1HLFdBQVcsR0FDYiwwQkFBMEIsSUFDekJELFlBQVksR0FBRywrQkFBK0IsR0FBRyxFQUFFLENBQUM7O01BRXpEO01BQ0EsSUFBTUUsV0FBVyxnQkFDYnJzQyxLQUFBLENBQUFWLGFBQUE7UUFDSXpELFNBQVMsRUFBQywrQ0FBK0M7UUFDekQ4bkMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7VUFBQSxPQUFRaEQsTUFBSSxDQUFDdUIsUUFBUSxDQUFDO1lBQUMrSixTQUFTLEVBQUUsQ0FBQ0E7VUFBUyxDQUFDLENBQUM7UUFBQTtNQUFDLGdCQUV0RGpzQyxLQUFBLENBQUFWLGFBQUE7UUFBTXpELFNBQVMsRUFBQztNQUEwQixnQkFDdENtRSxLQUFBLENBQUFWLGFBQUE7UUFBTXpELFNBQVMsRUFBQztNQUFzQixHQUNqQzV1QixDQUFDLENBQUM0MkIsS0FBSyxDQUFDeFMsT0FBTyxJQUFJLE9BQ2xCLENBQ0osQ0FBQyxlQUNQMk8sS0FBQSxDQUFBVixhQUFBO1FBQU16RCxTQUFTLEVBQUM7TUFBMEIsZ0JBQ3RDbUUsS0FBQSxDQUFBVixhQUFBO1FBQU16RCxTQUFTLEVBQUM7TUFBcUMsTUFBQTFVLE1BQUEsQ0FDN0NsYSxDQUFDLENBQUNxL0QsU0FBUyxDQUFDQyxrQkFBa0IsQ0FBQyxDQUFDLENBQ2xDLENBQUMsZUFDUHZzQyxLQUFBLENBQUFWLGFBQUE7UUFBTXpELFNBQVMsRUFBQztNQUFxQyxHQUc3QyxhQUVGLENBQUMsZUFFUG1FLEtBQUEsQ0FBQVYsYUFBQSxDQUFDd3NDLCtEQUFZO1FBQ1Rqd0MsU0FBUyw2QkFBQTFVLE1BQUEsQ0FDTDhrRCxTQUFTLEdBQUcsa0NBQWtDLEdBQUcsRUFBRSxDQUNwRDtRQUNIdEksT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7VUFBQSxPQUFRaEQsTUFBSSxDQUFDdUIsUUFBUSxDQUFDO1lBQUMrSixTQUFTLEVBQUUsQ0FBQ0E7VUFBUyxDQUFDLENBQUM7UUFBQTtNQUFDLENBQ3pELENBQ0MsQ0FDTCxDQUNSO01BRUQsb0JBQ0lqc0MsS0FBQSxDQUFBVixhQUFBO1FBQUt6RCxTQUFTLEVBQUV1d0M7TUFBWSxHQUN2QkMsV0FBVyxFQUNYLENBQUNKLFNBQVMsaUJBQUlqc0MsS0FBQSxDQUFBVixhQUFBLENBQUNrdEMsWUFBWTtRQUFDM29DLEtBQUssRUFBRTUyQixDQUFDLENBQUM0MkI7TUFBTSxDQUFFLENBQzdDLENBQUM7SUFFZDtFQUFDO0FBQUEsRUF0RHVCcEUsNENBQVM7QUF5RHJDLFNBQVNndEMsWUFBWUEsQ0FBQTk5RCxJQUFBLEVBQWdCO0VBQUEsSUFBZGsxQixLQUFLLEdBQUFsMUIsSUFBQSxDQUFMazFCLEtBQUs7SUFBRXE3QixJQUFJLEdBQUF2d0QsSUFBQSxDQUFKdXdELElBQUk7RUFDOUIsSUFBTXdOLFNBQVMsR0FBR3ByQyw2Q0FBTSxDQUFDLElBQUksQ0FBQztFQUM5QixJQUFBcVMsU0FBQSxHQUE0QnhCLCtDQUFRLENBQUMsT0FBTyxDQUFDO0lBQUF5QixVQUFBLEdBQUEvcUMsY0FBQSxDQUFBOHFDLFNBQUE7SUFBdEN4akMsTUFBTSxHQUFBeWpDLFVBQUE7SUFBRSs0QixTQUFTLEdBQUEvNEIsVUFBQSxJQUFzQixDQUFDOztFQUUvQ3hHLGdEQUFTLENBQUMsWUFBTTtJQUNaLElBQU13L0IsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFHbk0sS0FBSyxFQUFJO01BQzNCLElBQ0lBLEtBQUssQ0FBQ3pzRCxJQUFJLElBQ1YzTSxPQUFBLENBQU9vNUQsS0FBSyxDQUFDenNELElBQUksTUFBSyxRQUFRLElBQzlCeXNELEtBQUssQ0FBQ3pzRCxJQUFJLENBQUM0VixJQUFJLEtBQUssZUFBZSxFQUNyQztRQUNFK2lELFNBQVMsSUFBQXhsRCxNQUFBLENBQUlzNUMsS0FBSyxDQUFDenNELElBQUksQ0FBQzdELE1BQU0sT0FBSSxDQUFDO01BQ3ZDO0lBQ0osQ0FBQztJQUVENHVCLE1BQU0sQ0FBQzh0QyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUVELGFBQWEsQ0FBQztJQUNqRCxPQUFPO01BQUEsT0FBTTd0QyxNQUFNLENBQUMrdEMsbUJBQW1CLENBQUMsU0FBUyxFQUFFRixhQUFhLENBQUM7SUFBQTtFQUNyRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sb0JBQ0k1c0MsS0FBQSxDQUFBVixhQUFBO0lBQ0lDLEdBQUcsRUFBRW10QyxTQUFVO0lBQ2ZLLE1BQU0sRUFBRWxwQyxLQUFLLENBQUNpM0IsSUFBSSxDQUNiL25DLE9BQU8sQ0FDSixTQUFTLDhCQUFBNUwsTUFBQSxDQUNpQjRrRCxvREFBVyxvWEFXekMsQ0FBQyxDQUNBaDVDLE9BQU8sQ0FBQyxpQkFBaUIsUUFBQTVMLE1BQUEsQ0FBTyszQyxJQUFJLGtCQUFlLENBQUU7SUFDMURwakMsS0FBSyxFQUFFO01BQ0g7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNnQjVyQixLQUFLLEVBQUUsb0JBQW9CO01BQzNCODhELE1BQU0sRUFBRSxNQUFNO01BQ2Q3OEQsTUFBTSxFQUFFQTtJQUNaO0VBQUUsQ0FDTCxDQUFDO0FBRVY7QUFFQSxJQUFNODhELGtCQUFrQixHQUFHLEVBQUU7QUFDN0I7QUFDQSxTQUFTQyx1QkFBdUJBLENBQUF0K0QsS0FBQSxFQUFnQjtFQUFBLElBQWRpMUIsS0FBSyxHQUFBajFCLEtBQUEsQ0FBTGkxQixLQUFLO0lBQUVxN0IsSUFBSSxHQUFBdHdELEtBQUEsQ0FBSnN3RCxJQUFJO0VBQ3pDLG9CQUNJbC9CLEtBQUEsQ0FBQVYsYUFBQTtJQUFLekQsU0FBUyxFQUFDO0VBQWlCLEdBTTNCLE9BQU9nSSxLQUFLLENBQUN4UyxPQUFPLEtBQUssUUFBUSxJQUNsQ3dTLEtBQUssQ0FBQ3hTLE9BQU8sQ0FBQ2xwQixNQUFNLEdBQUc4a0Usa0JBQWtCLEdBQUcsSUFBSSxnQkFDNUNqdEMsS0FBQSxDQUFBVixhQUFBO0lBQUt6RCxTQUFTLEVBQUM7RUFBbUIsZ0JBQzlCbUUsS0FBQSxDQUFBVixhQUFBO0lBQUt6RCxTQUFTLEVBQUM7RUFBMkMsR0FDckRnSSxLQUFLLENBQUN4UyxPQUNOLENBQ0osQ0FDUixFQUVBLE9BQU93UyxLQUFLLENBQUNpRCxLQUFLLEtBQUssUUFBUSxHQUFHLElBQUksZ0JBQ25DOUcsS0FBQSxDQUFBVixhQUFBO0lBQUt6RCxTQUFTLEVBQUM7RUFBbUIsZ0JBQzlCbUUsS0FBQSxDQUFBVixhQUFBO0lBQUt6RCxTQUFTLEVBQUM7RUFBcUIsZ0JBQ2hDbUUsS0FBQSxDQUFBVixhQUFBLCtCQUNJVSxLQUFBLENBQUFWLGFBQUEsK0JBQ0lVLEtBQUEsQ0FBQVYsYUFBQSxZQUFHLGtKQUtBLENBQ0UsQ0FBQyxFQUVUdUUsS0FBSyxDQUFDaUQsS0FBSyxDQUFDM00sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDcHFCLEdBQUcsQ0FBQyxVQUFDbzlELElBQUksRUFBRW5rRSxDQUFDO0lBQUEsb0JBQ2pDZzNCLEtBQUEsQ0FBQVYsYUFBQTtNQUFHendCLEdBQUcsRUFBRTdGO0lBQUUsR0FBRW1rRSxJQUFRLENBQUM7RUFBQSxDQUN4QixDQUNJLENBQ1IsQ0FDSixDQUNSLEVBRUEsT0FBT3RwQyxLQUFLLENBQUNpM0IsSUFBSSxLQUFLLFFBQVEsR0FBRyxJQUFJLEdBQUdqM0IsS0FBSyxDQUFDaTNCLElBQUksQ0FDNUMvUyxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQzUvQyxNQUFNLENBQUMsQ0FDaENpbEUsV0FBVyxDQUFDLENBQUMsS0FBSyxXQUFXLGdCQUNoQ3B0QyxLQUFBLENBQUFWLGFBQUE7SUFBS3pELFNBQVMsRUFBQztFQUFtQixnQkFDOUJtRSxLQUFBLENBQUFWLGFBQUE7SUFBS3pELFNBQVMsRUFBQztFQUFvQixnQkFLL0JtRSxLQUFBLENBQUFWLGFBQUEsQ0FBQ210QyxZQUFZO0lBQUM1b0MsS0FBSyxFQUFFQSxLQUFNO0lBQUNxN0IsSUFBSSxFQUFFQTtFQUFLLENBQUUsQ0FDeEMsQ0FDSixDQUFDLGdCQUVObC9CLEtBQUEsQ0FBQVYsYUFBQTtJQUFLekQsU0FBUyxFQUFDO0VBQW9CLGdCQUMvQm1FLEtBQUEsQ0FBQVYsYUFBQTtJQUFLekQsU0FBUyxFQUFDO0VBQW9CLEdBQUVnSSxLQUFLLENBQUNpM0IsSUFBVSxDQUNwRCxDQUVSLENBQUM7QUFFZDtBQUNBOztBQUVBLElBQU11UyxjQUFjLEdBQUdqN0IsdURBQWUsQ0FBQztFQUNuQy9nQixPQUFPLEVBQUUrZ0IsMERBQWdCO0VBRXpCO0VBQ0F0TCxLQUFLLEVBQUVzTCwwREFBZ0I7RUFFdkI7RUFDQTBvQixJQUFJLEVBQUUxb0IsMERBQWdCOVc7QUFDMUIsQ0FBQyxDQUFDO0FBRUY0eEMsdUJBQXVCLENBQUN4M0IsU0FBUyxHQUFHO0VBQ2hDN1IsS0FBSyxFQUFFd3BDLGNBQWM7RUFDckJuTyxJQUFJLEVBQUU5c0IsMERBQWdCOVc7QUFDMUIsQ0FBQztBQUVELElBQU1reEMsWUFBWSxHQUFHdG9DLG9EQUFPLENBQUMsVUFBQXdFLEtBQUs7RUFBQSxPQUFLO0lBQUN3MkIsSUFBSSxFQUFFem1CLHVEQUFPLENBQUMvUCxLQUFLLENBQUM4SyxNQUFNO0VBQUMsQ0FBQztBQUFBLENBQUMsQ0FBQyxDQUNsRTA1Qix1QkFDSixDQUFDO0FBRURsQixhQUFhLENBQUN0MkIsU0FBUyxHQUFHO0VBQ3RCem9DLENBQUMsRUFBRW1sQyx1REFBZSxDQUFDO0lBQ2ZrNkIsU0FBUyxFQUFFbDZCLDBEQUFnQjtJQUMzQnZPLEtBQUssRUFBRXdwQztFQUNYLENBQUMsQ0FBQztFQUNGbEIsWUFBWSxFQUFFLzVCLHdEQUFjO0VBQzVCODVCLFVBQVUsRUFBRTk1Qix3REFBYzNXO0FBQzlCLENBQUM7QUFFRHV3QyxhQUFhLENBQUN4SSxZQUFZLEdBQUc7RUFDekIySSxZQUFZLEVBQUUsS0FBSztFQUNuQkQsVUFBVSxFQUFFO0FBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDck5zQztBQUNWO0FBQ007QUFDaUI7QUFBQSxJQUU5Q29CLHNCQUFzQiwwQkFBQXRELFVBQUE7RUFDeEIsU0FBQXNELHVCQUFZdDBELEtBQUssRUFBRTtJQUFBVSxlQUFBLE9BQUE0ekQsc0JBQUE7SUFBQSxPQUFBaHZDLFVBQUEsT0FBQWd2QyxzQkFBQSxHQUNUdDBELEtBQUs7RUFDZjtFQUFDMGxCLFNBQUEsQ0FBQTR1QyxzQkFBQSxFQUFBdEQsVUFBQTtFQUFBLE9BQUFseEQsWUFBQSxDQUFBdzBELHNCQUFBO0lBQUF6K0QsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUF1MUIsTUFBTUEsQ0FBQSxFQUFHO01BQ0wsSUFBQVIsV0FBQSxHQUEwQyxJQUFJLENBQUM1bEIsS0FBSztRQUE3Q3ltQyxNQUFNLEdBQUE3Z0IsV0FBQSxDQUFONmdCLE1BQU07UUFBRXpGLFNBQVMsR0FBQXBiLFdBQUEsQ0FBVG9iLFNBQVM7UUFBRXV6QixZQUFZLEdBQUEzdUMsV0FBQSxDQUFaMnVDLFlBQVk7TUFFdEMsSUFBTXBCLFlBQVksR0FBRyxJQUFJLENBQUNuekQsS0FBSyxDQUFDbXpELFlBQVk7TUFDNUMsSUFBSUMsV0FBVyxHQUFHLDRDQUE0QztNQUU5RCxJQUFNb0IsYUFBYSxHQUFHL3RCLE1BQU0sQ0FBQzF2QyxHQUFHLENBQUMsVUFBQzh6QixLQUFLLEVBQUU3NkIsQ0FBQyxFQUFLO1FBQzNDLG9CQUFPZzNCLDBEQUFBLENBQUNnc0MsK0RBQWE7VUFBQy8rRCxDQUFDLEVBQUU0MkIsS0FBTTtVQUFDcW9DLFVBQVUsRUFBRSxJQUFLO1VBQUNyOUQsR0FBRyxFQUFFN0Y7UUFBRSxDQUFFLENBQUM7TUFDaEUsQ0FBQyxDQUFDO01BQ0YsSUFBSW1qRSxZQUFZLEVBQUU7UUFDZEMsV0FBVyxJQUFJLCtCQUErQjtNQUNsRDtNQUNBLG9CQUNJcHNDLDBEQUFBO1FBQUtuRSxTQUFTLEVBQUV1d0M7TUFBWSxnQkFDeEJwc0MsMERBQUE7UUFBS25FLFNBQVMsRUFBQztNQUF5QixnQkFDcENtRSwwREFBQTtRQUFLbkUsU0FBUyxFQUFDO01BQTBCLEdBQUMsUUFFdEMsRUFBQ21lLFNBQVMsR0FBRyxJQUFJLEdBQUcsc0NBQ25CLENBQUMsZUFDTmhhLDBEQUFBO1FBQ0luRSxTQUFTLEVBQUMsdUJBQXVCO1FBQ2pDOG5DLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO1VBQUEsT0FBUTRKLFlBQVksQ0FBQyxDQUFDO1FBQUE7TUFBQyxHQUNqQyxNQUVJLENBQ0osQ0FBQyxlQUNOdnRDLDBEQUFBO1FBQUtuRSxTQUFTLEVBQUM7TUFBdUIsR0FBRTJ4QyxhQUFtQixDQUMxRCxDQUFDO0lBRWQ7RUFBQztBQUFBLEVBbENnQy90Qyw0Q0FBUztBQXFDOUM2dEMsc0JBQXNCLENBQUM1M0IsU0FBUyxHQUFHO0VBQy9CbnJDLEVBQUUsRUFBRTZuQywwREFBZ0I7RUFDcEJxTixNQUFNLEVBQUVyTix5REFBZTtFQUN2QjRILFNBQVMsRUFBRTVILHdEQUFjO0VBQ3pCKzVCLFlBQVksRUFBRS81Qix1REFBYW50QjtBQUMvQixDQUFDO0FBRURxb0Qsc0JBQXNCLENBQUM1M0IsU0FBUyxHQUFHO0VBQy9CeTJCLFlBQVksRUFBRS81Qix1REFBYW50QjtBQUMvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25EbUM7QUFDRztBQUNKO0FBQ2M7QUFBQSxJQUUzQ3lvRCwrQkFBK0IsMEJBQUExRCxVQUFBO0VBQ2pDLFNBQUEwRCxnQ0FBWTEwRCxLQUFLLEVBQUU7SUFBQVUsZUFBQSxPQUFBZzBELCtCQUFBO0lBQUEsT0FBQXB2QyxVQUFBLE9BQUFvdkMsK0JBQUEsR0FDVDEwRCxLQUFLO0VBQ2Y7RUFBQzBsQixTQUFBLENBQUFndkMsK0JBQUEsRUFBQTFELFVBQUE7RUFBQSxPQUFBbHhELFlBQUEsQ0FBQTQwRCwrQkFBQTtJQUFBNytELEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBdTFCLE1BQU1BLENBQUEsRUFBRztNQUNMLElBQUFSLFdBQUEsR0FBa0MsSUFBSSxDQUFDNWxCLEtBQUs7UUFBckN3NkIsTUFBTSxHQUFBNVUsV0FBQSxDQUFONFUsTUFBTTtRQUFFM1AsS0FBSyxHQUFBakYsV0FBQSxDQUFMaUYsS0FBSztRQUFFaHlCLFFBQVEsR0FBQStzQixXQUFBLENBQVIvc0IsUUFBUTtNQUM5QixvQkFDSW11QiwwREFBQTtRQUFLejFCLEVBQUUsRUFBQztNQUE4QixnQkFDbEN5MUIsMERBQUEsQ0FBQ3l0Qyw0REFBUztRQUNOajZCLE1BQU0sRUFBRUEsTUFBTztRQUNmM1AsS0FBSyxFQUFFQSxLQUFNO1FBQ2I4cEMsU0FBUyxFQUFFdG9DLE9BQU8sQ0FBQ21PLE1BQU0sQ0FBQ2d1QixVQUFVO01BQUUsZ0JBRXRDeGhDLDBEQUFBO1FBQUt6MUIsRUFBRSxFQUFDO01BQW1CLEdBQUVzSCxRQUFjLENBQ3BDLENBQ1YsQ0FBQztJQUVkO0VBQUM7QUFBQSxFQWxCeUM0dEIsNENBQVM7QUFxQnZEaXVDLCtCQUErQixDQUFDaDRCLFNBQVMsR0FBRztFQUN4QzdqQyxRQUFRLEVBQUV1Z0MsMERBQWdCO0VBQzFCb0IsTUFBTSxFQUFFcEIsMERBQWdCO0VBQ3hCdk8sS0FBSyxFQUFFdU8sMERBQWdCMW9CO0FBQzNCLENBQUM7QUFFRCxJQUFNMm9CLG9CQUFvQixHQUFHbk8sb0RBQU8sQ0FBQyxVQUFBd0UsS0FBSztFQUFBLE9BQUs7SUFDM0M4SyxNQUFNLEVBQUU5SyxLQUFLLENBQUM4SyxNQUFNO0lBQ3BCM1AsS0FBSyxFQUFFNkUsS0FBSyxDQUFDN0U7RUFDakIsQ0FBQztBQUFBLENBQUMsQ0FBQyxDQUFDNnBDLCtCQUErQixDQUFDO0FBRXBDLCtEQUFlcjdCLG9CQUFvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQ25DLE1BQXFHO0FBQ3JHLE1BQTJGO0FBQzNGLE1BQWtHO0FBQ2xHLE1BQXFIO0FBQ3JILE1BQThHO0FBQzlHLE1BQThHO0FBQzlHLE1BQXlHO0FBQ3pHO0FBQ0E7O0FBRUE7O0FBRUEsNEJBQTRCLHFHQUFtQjtBQUMvQyx3QkFBd0Isa0hBQWE7O0FBRXJDLHVCQUF1Qix1R0FBYTtBQUNwQztBQUNBLGlCQUFpQiwrRkFBTTtBQUN2Qiw2QkFBNkIsc0dBQWtCOztBQUUvQyxhQUFhLDBHQUFHLENBQUMsc0ZBQU87Ozs7QUFJbUQ7QUFDM0UsT0FBTywrREFBZSxzRkFBTyxJQUFJLHNGQUFPLFVBQVUsc0ZBQU8sbUJBQW1CLEVBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzFCN0U7QUFDQSxzQkFBc0Isd0VBQXdFLGdCQUFnQixzQkFBc0IsT0FBTyxzQkFBc0Isb0JBQW9CLGdEQUFnRCxXQUFXO0FBQ2pOO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLCtEQUFlLFlBQVk7Ozs7Ozs7Ozs7Ozs7O0FDaEIzQjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQSxHQUFHLHlDQUF5QyxnREFBbUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxZQUFZOzs7Ozs7Ozs7Ozs7OztBQ2QzQjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxlQUFlOzs7Ozs7Ozs7Ozs7OztBQ2Q5QjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxZQUFZOzs7Ozs7Ozs7Ozs7OztBQ2QzQjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLHlDQUF5QyxnREFBbUI7QUFDL0Q7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxTQUFTOzs7Ozs7Ozs7Ozs7OztBQ2R4QjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxZQUFZOzs7Ozs7Ozs7Ozs7OztBQ2QzQjtBQUNBLHNCQUFzQix3RUFBd0UsZ0JBQWdCLHNCQUFzQixPQUFPLHNCQUFzQixvQkFBb0IsZ0RBQWdELFdBQVc7QUFDak47QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLHlDQUF5QyxnREFBbUI7QUFDL0Q7QUFDQSxHQUFHO0FBQ0g7QUFDQSwrREFBZSxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2J6QixNQUF3RztBQUN4RyxNQUE4RjtBQUM5RixNQUFxRztBQUNyRyxNQUF3SDtBQUN4SCxNQUFpSDtBQUNqSCxNQUFpSDtBQUNqSCxNQUFnSDtBQUNoSDtBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLDBGQUFPOzs7O0FBSTBEO0FBQ2xGLE9BQU8sK0RBQWUsMEZBQU8sSUFBSSwwRkFBTyxVQUFVLDBGQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUI1QjtBQUNkO0FBQ047QUFFSjtBQUVzQjtBQUNBO0FBQ0E7QUFDQTtBQUNKO0FBQ0Y7QUFDTztBQUNxQztBQUNMO0FBRWhGLElBQU04N0IsT0FBTyxHQUFHLFNBQVZBLE9BQU9BLENBQUlqUCxJQUFJLEVBQUVrUCxPQUFPLEVBQUVDLFFBQVE7RUFBQSxPQUNwQyxHQUFBbG5ELE1BQUEsQ0FBRyszQyxJQUFJLE9BQUEvM0MsTUFBQSxDQUFJKzNDLElBQUksUUFBQS8zQyxNQUFBLENBQUtpbkQsT0FBTyxLQUFNQyxRQUFRLE9BQUFsbkQsTUFBQSxDQUFPKzNDLElBQUksUUFBQS8zQyxNQUFBLENBQUtrbkQsUUFBUSxJQUFLLEVBQUUsQ0FBQztBQUFBO0FBRTdFLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7RUFDdEIsSUFBSTtJQUNBLE9BQU9DLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLDJCQUEyQixDQUFDLEtBQUssTUFBTTtFQUN2RSxDQUFDLENBQUMsT0FBT3ZoRSxDQUFDLEVBQUU7SUFDUjtJQUNBLE9BQU8sS0FBSztFQUNoQjtBQUNKLENBQUM7QUFFRCxJQUFNd2hFLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBOS9ELElBQUEsRUFRWDtFQUFBLElBUEZnL0QsU0FBUyxHQUFBaC9ELElBQUEsQ0FBVGcvRCxTQUFTO0lBQ1QzekIsU0FBUyxHQUFBcnJDLElBQUEsQ0FBVHFyQyxTQUFTO0lBQ1QwMEIsS0FBSyxHQUFBLy9ELElBQUEsQ0FBTCsvRCxLQUFLO0lBQ0xDLFlBQVksR0FBQWhnRSxJQUFBLENBQVpnZ0UsWUFBWTtJQUNaQyxRQUFRLEdBQUFqZ0UsSUFBQSxDQUFSaWdFLFFBQVE7SUFDUkMsbUJBQW1CLEdBQUFsZ0UsSUFBQSxDQUFuQmtnRSxtQkFBbUI7SUFDbkJyN0IsTUFBTSxHQUFBN2tDLElBQUEsQ0FBTjZrQyxNQUFNO0VBRU4sSUFBTXM3QixXQUFXLEdBQUduQixTQUFTLEdBQ3ZCM3pCLFNBQVMsR0FDTDR6Qiw0REFBUyxHQUNUSSwwREFBTyxHQUNYSCw0REFBUztFQUVmLElBQU1uNUIsTUFBTSxHQUFHaTVCLFNBQVMsR0FDbEIzekIsU0FBUyxHQUNMLFdBQVcsR0FDWCxhQUFhLEdBQ2pCLE1BQU07RUFFWixvQkFDSWhhLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBMEIsZ0JBQ3JDbUUsMERBQUE7SUFDSTJqQyxPQUFPLEVBQUVnTCxZQUFhO0lBQ3RCOXlDLFNBQVMsRUFDTCxDQUFDNnlDLEtBQUssSUFBSSxRQUFRLEdBQ1osbUNBQW1DLEdBQ25DLElBQUksSUFBSSwwQkFDakI7SUFDRG5rRSxFQUFFLEVBQUM7RUFBZ0MsZ0JBRW5DeTFCLDBEQUFBLENBQUM4dEMsNERBQVM7SUFBQ2p5QyxTQUFTLEVBQUM7RUFBdUIsQ0FBRSxDQUFDLFVBRS9DLEVBQUMreUMsUUFBUSxHQUFHLENBQUMsZ0JBQ1Q1dUMsMERBQUE7SUFBTW5FLFNBQVMsRUFBQztFQUF3RCxHQUNuRSt5QyxRQUNDLENBQUMsR0FDUCxJQUNBLENBQUMsZUFDVDV1QywwREFBQTtJQUNJMmpDLE9BQU8sRUFBRWtMLG1CQUFvQjtJQUM3Qmh6QyxTQUFTLEVBQ0wsQ0FBQzZ5QyxLQUFLLElBQUksZUFBZSxHQUNuQixtQ0FBbUMsR0FDbkMsRUFBRSxJQUFJLDBCQUNmO0lBQ0Rua0UsRUFBRSxFQUFDO0VBQXdDLGdCQUUzQ3kxQiwwREFBQSxDQUFDK3RDLDREQUFTO0lBQUNseUMsU0FBUyxFQUFDO0VBQXVCLENBQUUsQ0FBQyxhQUUzQyxDQUFDLGVBQ1RtRSwwREFBQTtJQUFLbkUsU0FBUyxFQUFDO0VBQTBCLENBQUUsQ0FBQyxlQUM1Q21FLDBEQUFBLENBQUNrdUMsMkRBQVc7SUFBQzE2QixNQUFNLEVBQUVBO0VBQU8sQ0FBRSxDQUFDLGVBQy9CeFQsMERBQUE7SUFBS25FLFNBQVMsRUFBQztFQUEwQixDQUFFLENBQUMsZUFDNUNtRSwwREFBQTtJQUNJbkUsU0FBUyxzREFBQTFVLE1BQUEsQ0FBc0R1dEIsTUFBTTtFQUFHLEdBQzNFLFFBRUcsZUFBQTFVLDBEQUFBLENBQUM4dUMsV0FBVztJQUFDanpDLFNBQVMsRUFBQztFQUF1QixDQUFFLENBQy9DLENBQUMsZUFDTm1FLDBEQUFBO0lBQ0luRSxTQUFTLEVBQUMsMEJBQTBCO0lBQ3BDQyxLQUFLLEVBQUU7TUFBQ2l6QyxXQUFXLEVBQUU7SUFBQztFQUFFLENBQzNCLENBQ0EsQ0FBQztBQUVkLENBQUM7QUFFRCxJQUFNdEIsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUE3K0QsS0FBQSxFQUE2QztFQUFBLElBQXhDaTFCLEtBQUssR0FBQWoxQixLQUFBLENBQUxpMUIsS0FBSztJQUFFOHBDLFNBQVMsR0FBQS8rRCxLQUFBLENBQVQrK0QsU0FBUztJQUFFbjZCLE1BQU0sR0FBQTVrQyxLQUFBLENBQU40a0MsTUFBTTtJQUFFM2hDLFFBQVEsR0FBQWpELEtBQUEsQ0FBUmlELFFBQVE7RUFDbEQsSUFBQThoQyxTQUFBLEdBQTBCeEIsK0NBQVEsQ0FBQyxRQUFRLENBQUM7SUFBQXlCLFVBQUEsR0FBQS9xQyxjQUFBLENBQUE4cUMsU0FBQTtJQUFyQys2QixLQUFLLEdBQUE5NkIsVUFBQTtJQUFFbzdCLFFBQVEsR0FBQXA3QixVQUFBO0VBQ3RCLElBQUF5ekIsVUFBQSxHQUFrQ2wxQiwrQ0FBUSxDQUFDbThCLFdBQVcsQ0FBQztJQUFBaEgsVUFBQSxHQUFBeitELGNBQUEsQ0FBQXcrRCxVQUFBO0lBQWhENEUsU0FBUyxHQUFBM0UsVUFBQTtJQUFFMkgsWUFBWSxHQUFBM0gsVUFBQTtFQUU5QixJQUFNc0gsUUFBUSxHQUFHL3FDLEtBQUssQ0FBQzJSLFFBQVEsQ0FBQ3J0QyxNQUFNLEdBQUcwN0IsS0FBSyxDQUFDNFIsT0FBTyxDQUFDdHRDLE1BQU07RUFDN0QsSUFBTTZ4QyxTQUFTLEdBQUduVyxLQUFLLENBQUNvVyxnQkFBZ0I7RUFFeEM3TSxnREFBUyxDQUFDLFlBQU07SUFDWixJQUFJd2hDLFFBQVEsR0FBRyxDQUFDLElBQUlGLEtBQUssSUFBSSxJQUFJLEVBQUU7TUFDL0JNLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDdEI7RUFDSixDQUFDLEVBQUUsQ0FBQ0osUUFBUSxDQUFDLENBQUM7RUFFZCxJQUFNRCxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBQSxFQUFTO0lBQ3ZCSyxRQUFRLENBQUNOLEtBQUssSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztFQUNqRCxDQUFDO0VBRUQsSUFBTUcsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBQSxFQUFTO0lBQzlCRyxRQUFRLENBQUNOLEtBQUssSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLGVBQWUsQ0FBQztFQUMvRCxDQUFDO0VBRUQsSUFBTVEsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFBLEVBQVM7SUFDMUJELFlBQVksQ0FBQyxDQUFDaEQsU0FBUyxDQUFDO0lBQ3hCLElBQUk7TUFDQXNDLFlBQVksQ0FBQ1ksT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUNsRCxTQUFTLENBQUM7SUFDakUsQ0FBQyxDQUFDLE9BQU9oL0QsQ0FBQyxFQUFFO01BQ1I7SUFBQTtFQUVSLENBQUM7RUFFRCxJQUFNd3lDLE1BQU0sR0FBR3Q0QixrREFBTSxDQUFDMGMsS0FBSyxDQUFDMlIsUUFBUSxFQUFFM1IsS0FBSyxDQUFDNFIsT0FBTyxDQUFDO0VBRXBELElBQU0yNUIsWUFBWSxnQkFDZHB2QywwREFBQTtJQUFLbkUsU0FBUyxFQUFDO0VBQXdCLEdBQ2xDNnlDLEtBQUssSUFBSSxlQUFlLGdCQUFHMXVDLDBEQUFBLENBQUNxcUMsZ0dBQXNCLE1BQUUsQ0FBQyxHQUFHaGhFLFNBQVMsRUFDakVxbEUsS0FBSyxJQUFJLFFBQVEsSUFBSUUsUUFBUSxHQUFHLENBQUMsZ0JBQzlCNXVDLDBEQUFBLENBQUNzdEMsMkZBQXNCO0lBQ25CQyxZQUFZLEVBQUVvQixZQUFhO0lBQzNCbHZCLE1BQU0sRUFBRUEsTUFBTztJQUNmekYsU0FBUyxFQUFFblcsS0FBSyxDQUFDb1c7RUFBaUIsQ0FDckMsQ0FBQyxHQUNGNXdDLFNBQ0gsQ0FDUjtFQUVELElBQU1nbUUsV0FBVyxHQUFHcEQsU0FBUyxHQUFHNWlFLFNBQVMsZ0JBQ3JDMjJCLDBEQUFBLENBQUN5dUMsV0FBVztJQUNSQyxLQUFLLEVBQUVBLEtBQU07SUFDYkUsUUFBUSxFQUFFQSxRQUFTO0lBQ25CRCxZQUFZLEVBQUVBLFlBQWE7SUFDM0JFLG1CQUFtQixFQUFFQSxtQkFBb0I7SUFDekNyN0IsTUFBTSxFQUFFQSxNQUFPO0lBQ2ZtNkIsU0FBUyxFQUFFQSxTQUFVO0lBQ3JCM3pCLFNBQVMsRUFBRUE7RUFBVSxDQUN4QixDQUNKO0VBRUQsb0JBQ0loYSwwREFBQSwyQkFDSUEsMERBQUE7SUFDSW5FLFNBQVMsRUFBRXN5QyxPQUFPLENBQ2Qsd0JBQXdCLEVBQ3hCbEMsU0FBUyxHQUFHLFdBQVcsR0FBRyxVQUM5QjtFQUFFLEdBRURtRCxZQUFZLEVBQ1pDLFdBQVcsZUFDWnJ2QywwREFBQTtJQUNJMmpDLE9BQU8sRUFBRXVMLGVBQWdCO0lBQ3pCcnpDLFNBQVMsRUFBRXN5QyxPQUFPLENBQ2QseUJBQXlCLEVBQ3pCbEMsU0FBUyxHQUFHLFdBQVcsR0FBRyxVQUM5QjtFQUFFLGdCQUVGanNDLDBEQUFBLENBQUNpdUMseURBQU0sTUFBRSxDQUFDLEVBQ1RXLFFBQVEsR0FBRyxDQUFDLElBQUkzQyxTQUFTLGdCQUN0QmpzQywwREFBQTtJQUFLbkUsU0FBUyxFQUFDO0VBQWtDLENBQUUsQ0FBQyxHQUNwRCxJQUNBLENBQ1AsQ0FBQyxFQUNMaHFCLFFBQ0EsQ0FBQztBQUVkLENBQUM7QUFFRDQ3RCxTQUFTLENBQUMvM0IsU0FBUyxHQUFHO0VBQ2xCN2pDLFFBQVEsRUFBRXVnQywwREFBZ0I7RUFDMUJ2TyxLQUFLLEVBQUV1TywwREFBZ0I7RUFDdkJ1N0IsU0FBUyxFQUFFdjdCLHdEQUFjO0VBQ3pCb0IsTUFBTSxFQUFFcEIsMERBQWdCMW9CO0FBQzVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFMRCxNQUF3RztBQUN4RyxNQUE4RjtBQUM5RixNQUFxRztBQUNyRyxNQUF3SDtBQUN4SCxNQUFpSDtBQUNqSCxNQUFpSDtBQUNqSCxNQUFrSDtBQUNsSDtBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLDRGQUFPOzs7O0FBSTREO0FBQ3BGLE9BQU8sK0RBQWUsNEZBQU8sSUFBSSw0RkFBTyxVQUFVLDRGQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ3pCN0UsdUtBQUF6YyxDQUFBLEVBQUFvdUIsQ0FBQSxFQUFBdEMsQ0FBQSx3QkFBQXh2QixNQUFBLEdBQUFBLE1BQUEsT0FBQXlpQixDQUFBLEdBQUErTSxDQUFBLENBQUF2dkIsUUFBQSxrQkFBQTR4QixDQUFBLEdBQUFyQyxDQUFBLENBQUE2WCxXQUFBLDhCQUFBNW5DLEVBQUErdkIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTZtQixDQUFBLEdBQUE3RCxDQUFBLElBQUFBLENBQUEsQ0FBQXZTLFNBQUEsWUFBQW8zQixTQUFBLEdBQUE3a0IsQ0FBQSxHQUFBNmtCLFNBQUEsRUFBQWxWLENBQUEsR0FBQTl6QixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxDQUFBcFcsU0FBQSxVQUFBcTNCLG1CQUFBLENBQUFuVixDQUFBLHVCQUFBNUMsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxRQUFBcHlCLENBQUEsRUFBQTZtQixDQUFBLEVBQUE4TCxDQUFBLEVBQUFuVyxDQUFBLE1BQUFxRCxDQUFBLEdBQUF1UyxDQUFBLFFBQUF0ckIsQ0FBQSxPQUFBaWhDLENBQUEsS0FBQWxvQixDQUFBLEtBQUFtRCxDQUFBLEtBQUEvRCxDQUFBLEVBQUFoYixDQUFBLEVBQUE0WixDQUFBLEVBQUFtQixDQUFBLEVBQUF4QyxDQUFBLEVBQUF3QyxDQUFBLENBQUFqZ0IsSUFBQSxDQUFBa0YsQ0FBQSxNQUFBK2EsQ0FBQSxXQUFBQSxFQUFBcVQsQ0FBQSxFQUFBdEMsQ0FBQSxXQUFBL3ZCLENBQUEsR0FBQXF5QixDQUFBLEVBQUF4TCxDQUFBLE1BQUE4TCxDQUFBLEdBQUExdUIsQ0FBQSxFQUFBOGpDLENBQUEsQ0FBQS9rQixDQUFBLEdBQUErTSxDQUFBLEVBQUFsUyxDQUFBLGdCQUFBbUIsRUFBQStRLENBQUEsRUFBQS9NLENBQUEsU0FBQTZELENBQUEsR0FBQWtKLENBQUEsRUFBQTRDLENBQUEsR0FBQTNQLENBQUEsRUFBQXFQLENBQUEsT0FBQXZyQixDQUFBLElBQUEwVixDQUFBLEtBQUE0VixDQUFBLElBQUFDLENBQUEsR0FBQXhTLENBQUEsQ0FBQTFnQixNQUFBLEVBQUFrekIsQ0FBQSxVQUFBRCxDQUFBLEVBQUFweUIsQ0FBQSxHQUFBNmYsQ0FBQSxDQUFBd1MsQ0FBQSxHQUFBclQsQ0FBQSxHQUFBK29CLENBQUEsQ0FBQWxvQixDQUFBLEVBQUFpUSxDQUFBLEdBQUE5dkIsQ0FBQSxLQUFBK3ZCLENBQUEsUUFBQXFDLENBQUEsR0FBQXRDLENBQUEsS0FBQTlNLENBQUEsTUFBQTJQLENBQUEsR0FBQTN5QixDQUFBLEVBQUE2bUIsQ0FBQSxHQUFBN21CLENBQUEsWUFBQTZtQixDQUFBLFdBQUE3bUIsQ0FBQSxNQUFBQSxDQUFBLE1BQUFpRSxDQUFBLElBQUFqRSxDQUFBLE9BQUFnZixDQUFBLE1BQUFvVCxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvUSxDQUFBLEdBQUFoZixDQUFBLFFBQUE2bUIsQ0FBQSxNQUFBa2hCLENBQUEsQ0FBQTlvQixDQUFBLEdBQUErRCxDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQWhqQixDQUFBLE9BQUFnZixDQUFBLEdBQUE4USxDQUFBLEtBQUFzQyxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsSUFBQUEsQ0FBQSxHQUFBOE0sQ0FBQSxNQUFBOXZCLENBQUEsTUFBQSt2QixDQUFBLEVBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBOE0sQ0FBQSxFQUFBakosQ0FBQSxjQUFBdUwsQ0FBQSxJQUFBckMsQ0FBQSxhQUFBbFMsQ0FBQSxRQUFBL1csQ0FBQSxPQUFBa2MsQ0FBQSxxQkFBQW9QLENBQUEsRUFBQXZTLENBQUEsRUFBQWlRLENBQUEsUUFBQXRULENBQUEsWUFBQXhiLFNBQUEsdUNBQUE4RixDQUFBLFVBQUErWSxDQUFBLElBQUFiLENBQUEsQ0FBQWEsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBakosQ0FBQSxHQUFBaEgsQ0FBQSxFQUFBOFMsQ0FBQSxHQUFBN0MsQ0FBQSxHQUFBdUMsQ0FBQSxHQUFBeEwsQ0FBQSxPQUFBNWlCLENBQUEsR0FBQTB1QixDQUFBLE1BQUE3ckIsQ0FBQSxLQUFBOUcsQ0FBQSxLQUFBNm1CLENBQUEsR0FBQUEsQ0FBQSxRQUFBQSxDQUFBLFNBQUFraEIsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQWhFLENBQUEsQ0FBQTZILENBQUEsRUFBQThMLENBQUEsS0FBQW9WLENBQUEsQ0FBQS9rQixDQUFBLEdBQUEyUCxDQUFBLEdBQUFvVixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBMFQsQ0FBQSxhQUFBblcsQ0FBQSxNQUFBeGMsQ0FBQSxRQUFBNm1CLENBQUEsS0FBQXVMLENBQUEsWUFBQUMsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQW95QixDQUFBLFdBQUFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsRUFBQTJ5QixDQUFBLFVBQUEzeEIsU0FBQSwyQ0FBQXF4QixDQUFBLENBQUExeEIsSUFBQSxTQUFBMHhCLENBQUEsRUFBQU0sQ0FBQSxHQUFBTixDQUFBLENBQUF4eEIsS0FBQSxFQUFBZ21CLENBQUEsU0FBQUEsQ0FBQSxvQkFBQUEsQ0FBQSxLQUFBd0wsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQTBHLE1BQUEsS0FBQTJyQixDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxHQUFBNm1CLENBQUEsU0FBQThMLENBQUEsR0FBQTN4QixTQUFBLHVDQUFBb3hCLENBQUEsZ0JBQUF2TCxDQUFBLE9BQUE3bUIsQ0FBQSxHQUFBaUUsQ0FBQSxjQUFBb3VCLENBQUEsSUFBQXZyQixDQUFBLEdBQUFpaEMsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQTJQLENBQUEsR0FBQTVDLENBQUEsQ0FBQS9nQixJQUFBLENBQUFnVSxDQUFBLEVBQUEra0IsQ0FBQSxPQUFBbHFCLENBQUEsa0JBQUF3VSxDQUFBLElBQUFyeUIsQ0FBQSxHQUFBaUUsQ0FBQSxFQUFBNGlCLENBQUEsTUFBQThMLENBQUEsR0FBQU4sQ0FBQSxjQUFBN1YsQ0FBQSxtQkFBQTNiLEtBQUEsRUFBQXd4QixDQUFBLEVBQUExeEIsSUFBQSxFQUFBbUcsQ0FBQSxTQUFBaXBCLENBQUEsRUFBQXFDLENBQUEsRUFBQXB5QixDQUFBLFFBQUEyeUIsQ0FBQSxRQUFBOVUsQ0FBQSxnQkFBQWdxQixVQUFBLGNBQUFHLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE1VixDQUFBLEdBQUF4ekIsTUFBQSxDQUFBNGxCLGNBQUEsTUFBQW9DLENBQUEsTUFBQTdELENBQUEsSUFBQXFQLENBQUEsQ0FBQUEsQ0FBQSxJQUFBclAsQ0FBQSxTQUFBOGtCLG1CQUFBLENBQUF6VixDQUFBLE9BQUFyUCxDQUFBLGlDQUFBcVAsQ0FBQSxHQUFBTSxDQUFBLEdBQUFzViwwQkFBQSxDQUFBeDNCLFNBQUEsR0FBQW8zQixTQUFBLENBQUFwM0IsU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsWUFBQXJLLEVBQUF2WSxDQUFBLFdBQUFwRixNQUFBLENBQUFxcEMsY0FBQSxHQUFBcnBDLE1BQUEsQ0FBQXFwQyxjQUFBLENBQUFqa0MsQ0FBQSxFQUFBZ2tDLDBCQUFBLEtBQUFoa0MsQ0FBQSxDQUFBa2tDLFNBQUEsR0FBQUYsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUFtdUIsQ0FBQSx5QkFBQW51QixDQUFBLENBQUF3TSxTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBbU8sQ0FBQSxHQUFBMXVCLENBQUEsV0FBQStqQyxpQkFBQSxDQUFBdjNCLFNBQUEsR0FBQXczQiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBblYsQ0FBQSxpQkFBQXNWLDBCQUFBLEdBQUFILG1CQUFBLENBQUFHLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBelMsV0FBQSx3QkFBQXVTLG1CQUFBLENBQUFHLDBCQUFBLEVBQUE3VixDQUFBLHdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsR0FBQW1WLG1CQUFBLENBQUFuVixDQUFBLEVBQUFQLENBQUEsZ0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBM1AsQ0FBQSxpQ0FBQThrQixtQkFBQSxDQUFBblYsQ0FBQSw4REFBQXlWLFlBQUEsWUFBQUEsYUFBQSxhQUFBaGlDLENBQUEsRUFBQXBHLENBQUEsRUFBQXcwQixDQUFBLEVBQUFoWSxDQUFBO0FBQUEsU0FBQXNyQixvQkFBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBcnlCLENBQUEsR0FBQW5CLE1BQUEsQ0FBQXdSLGNBQUEsUUFBQXJRLENBQUEsdUJBQUFpRSxDQUFBLElBQUFqRSxDQUFBLFFBQUE4bkMsbUJBQUEsWUFBQU8sbUJBQUFwa0MsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXRDLENBQUEsRUFBQS92QixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLENBQUEsRUFBQThyQixDQUFBLElBQUFsdkIsS0FBQSxFQUFBbWlCLENBQUEsRUFBQTlTLFVBQUEsR0FBQW1pQixDQUFBLEVBQUFsaUIsWUFBQSxHQUFBa2lCLENBQUEsRUFBQWppQixRQUFBLEdBQUFpaUIsQ0FBQSxNQUFBcHVCLENBQUEsQ0FBQThyQixDQUFBLElBQUEvTSxDQUFBLFlBQUFvUCxDQUFBLFlBQUFBLEVBQUFyQyxDQUFBLEVBQUEvTSxDQUFBLElBQUE4a0IsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxZQUFBOXJCLENBQUEsZ0JBQUFxa0MsT0FBQSxDQUFBdlksQ0FBQSxFQUFBL00sQ0FBQSxFQUFBL2UsQ0FBQSxVQUFBbXVCLENBQUEsYUFBQUEsQ0FBQSxjQUFBQSxDQUFBLG9CQUFBMFYsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQTtBQUFBLFNBQUF4eUIsZUFBQWt3QixDQUFBLEVBQUE5ckIsQ0FBQSxXQUFBNmtDLGVBQUEsQ0FBQS9ZLENBQUEsS0FBQWdaLHFCQUFBLENBQUFoWixDQUFBLEVBQUE5ckIsQ0FBQSxLQUFBK2tDLDJCQUFBLENBQUFqWixDQUFBLEVBQUE5ckIsQ0FBQSxLQUFBZ2xDLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQWpvQyxTQUFBO0FBQUEsU0FBQWdvQyw0QkFBQWpaLENBQUEsRUFBQWxTLENBQUEsUUFBQWtTLENBQUEsMkJBQUFBLENBQUEsU0FBQW1aLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBLE9BQUF3VSxDQUFBLE1BQUFuVSxRQUFBLENBQUFsUCxJQUFBLENBQUErZ0IsQ0FBQSxFQUFBMVMsS0FBQSw2QkFBQWdWLENBQUEsSUFBQXRDLENBQUEsQ0FBQTNQLFdBQUEsS0FBQWlTLENBQUEsR0FBQXRDLENBQUEsQ0FBQTNQLFdBQUEsQ0FBQWdJLElBQUEsYUFBQWlLLENBQUEsY0FBQUEsQ0FBQSxHQUFBaHpCLEtBQUEsQ0FBQWdoQixJQUFBLENBQUEwUCxDQUFBLG9CQUFBc0MsQ0FBQSwrQ0FBQWhILElBQUEsQ0FBQWdILENBQUEsSUFBQTZXLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBO0FBQUEsU0FBQXFyQixrQkFBQW5aLENBQUEsRUFBQWxTLENBQUEsYUFBQUEsQ0FBQSxJQUFBQSxDQUFBLEdBQUFrUyxDQUFBLENBQUE1d0IsTUFBQSxNQUFBMGUsQ0FBQSxHQUFBa1MsQ0FBQSxDQUFBNXdCLE1BQUEsWUFBQThFLENBQUEsTUFBQStlLENBQUEsR0FBQTNqQixLQUFBLENBQUF3ZSxDQUFBLEdBQUE1WixDQUFBLEdBQUE0WixDQUFBLEVBQUE1WixDQUFBLElBQUErZSxDQUFBLENBQUEvZSxDQUFBLElBQUE4ckIsQ0FBQSxDQUFBOXJCLENBQUEsVUFBQStlLENBQUE7QUFBQSxTQUFBK2xCLHNCQUFBaFosQ0FBQSxFQUFBRCxDQUFBLFFBQUF1QyxDQUFBLFdBQUF0QyxDQUFBLGdDQUFBeHZCLE1BQUEsSUFBQXd2QixDQUFBLENBQUF4dkIsTUFBQSxDQUFBQyxRQUFBLEtBQUF1dkIsQ0FBQSw0QkFBQXNDLENBQUEsUUFBQXB1QixDQUFBLEVBQUErZSxDQUFBLEVBQUFoakIsQ0FBQSxFQUFBMnlCLENBQUEsRUFBQTlVLENBQUEsT0FBQXJCLENBQUEsT0FBQTRWLENBQUEsaUJBQUFweUIsQ0FBQSxJQUFBcXlCLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQStnQixDQUFBLEdBQUFydkIsSUFBQSxRQUFBb3ZCLENBQUEsUUFBQWp4QixNQUFBLENBQUF3ekIsQ0FBQSxNQUFBQSxDQUFBLFVBQUE3VixDQUFBLHVCQUFBQSxDQUFBLElBQUF2WSxDQUFBLEdBQUFqRSxDQUFBLENBQUFnUCxJQUFBLENBQUFxakIsQ0FBQSxHQUFBMXhCLElBQUEsTUFBQWtkLENBQUEsQ0FBQWpkLElBQUEsQ0FBQXFELENBQUEsQ0FBQXBELEtBQUEsR0FBQWdkLENBQUEsQ0FBQTFlLE1BQUEsS0FBQTJ3QixDQUFBLEdBQUF0VCxDQUFBLGlCQUFBdVQsQ0FBQSxJQUFBcUMsQ0FBQSxPQUFBcFAsQ0FBQSxHQUFBK00sQ0FBQSx5QkFBQXZULENBQUEsWUFBQTZWLENBQUEsQ0FBQTNyQixNQUFBLEtBQUFpc0IsQ0FBQSxHQUFBTixDQUFBLENBQUEzckIsTUFBQSxJQUFBN0gsTUFBQSxDQUFBOHpCLENBQUEsTUFBQUEsQ0FBQSwyQkFBQVAsQ0FBQSxRQUFBcFAsQ0FBQSxhQUFBbkYsQ0FBQTtBQUFBLFNBQUFpckIsZ0JBQUEvWSxDQUFBLFFBQUExd0IsS0FBQSxDQUFBMEIsT0FBQSxDQUFBZ3ZCLENBQUEsVUFBQUEsQ0FBQTtBQUFBLFNBQUF3WSxtQkFBQXZsQixDQUFBLEVBQUFxUCxDQUFBLEVBQUFwdUIsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXFDLENBQUEsRUFBQXZVLENBQUEsRUFBQWdKLENBQUEsY0FBQTdtQixDQUFBLEdBQUFnakIsQ0FBQSxDQUFBbkYsQ0FBQSxFQUFBZ0osQ0FBQSxHQUFBOEwsQ0FBQSxHQUFBM3lCLENBQUEsQ0FBQWEsS0FBQSxXQUFBbWlCLENBQUEsZ0JBQUEvZSxDQUFBLENBQUErZSxDQUFBLEtBQUFoakIsQ0FBQSxDQUFBVyxJQUFBLEdBQUEweEIsQ0FBQSxDQUFBTSxDQUFBLElBQUE2VixPQUFBLENBQUFDLE9BQUEsQ0FBQTlWLENBQUEsRUFBQStWLElBQUEsQ0FBQTNZLENBQUEsRUFBQXFDLENBQUE7QUFBQSxTQUFBdVcsa0JBQUEzbEIsQ0FBQSw2QkFBQXFQLENBQUEsU0FBQXB1QixDQUFBLEdBQUEvRSxTQUFBLGFBQUFzcEMsT0FBQSxXQUFBelksQ0FBQSxFQUFBcUMsQ0FBQSxRQUFBdlUsQ0FBQSxHQUFBbUYsQ0FBQSxDQUFBeEYsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBcHVCLENBQUEsWUFBQTJrQyxNQUFBNWxCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxVQUFBN2xCLENBQUEsY0FBQTZsQixPQUFBN2xCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxXQUFBN2xCLENBQUEsS0FBQTRsQixLQUFBO0FBRGlEO0FBRXRCO0FBRTNCLElBQU0wOUIsU0FBUyxHQUFHLFFBQVE7QUFFMUIsU0FBU0MsZUFBZUEsQ0FBQ0MsRUFBRSxFQUFFQyxFQUFFLEVBQUU7RUFDN0I7RUFDQTtFQUNBRCxFQUFFLEdBQUdBLEVBQUUsQ0FBQ3o4QyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztFQUNwQzA4QyxFQUFFLEdBQUdBLEVBQUUsQ0FBQzE4QyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztFQUVwQyxJQUFNMjhDLE9BQU8sR0FBR0YsRUFBRSxDQUFDcjFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ3BxQixHQUFHLENBQUNqQyxNQUFNLENBQUM7RUFDekMsSUFBTTZoRSxPQUFPLEdBQUdGLEVBQUUsQ0FBQ3QxQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNwcUIsR0FBRyxDQUFDakMsTUFBTSxDQUFDO0VBRXpDLEtBQUssSUFBSTlFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VXLElBQUksQ0FBQytILEdBQUcsQ0FBQ29vRCxPQUFPLENBQUN2bkUsTUFBTSxFQUFFd25FLE9BQU8sQ0FBQ3huRSxNQUFNLENBQUMsRUFBRWEsQ0FBQyxFQUFFLEVBQUU7SUFDL0QsSUFBTTRtRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQzFtRSxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdCLElBQU02bUUsS0FBSyxHQUFHRixPQUFPLENBQUMzbUUsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUU3QixJQUFJNG1FLEtBQUssR0FBR0MsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUMzQixJQUFJRCxLQUFLLEdBQUdDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztFQUNoQztFQUVBLE9BQU8sQ0FBQztBQUNaO0FBQUMsU0FFY0Msc0JBQXNCQSxDQUFBdDFCLEVBQUE7RUFBQSxPQUFBdTFCLHVCQUFBLENBQUF2cEQsS0FBQSxPQUFBdGUsU0FBQTtBQUFBO0FBQUEsU0FBQTZuRSx3QkFBQTtFQUFBQSx1QkFBQSxHQUFBcCtCLGlCQUFBLGNBQUFQLFlBQUEsR0FBQTVULENBQUEsQ0FBckMsU0FBQTBXLFFBQXNDVixNQUFNO0lBQUEsSUFBQXc4QixrQkFBQSxFQUFBQyxjQUFBLEVBQUFDLGFBQUEsRUFBQUMsVUFBQSxFQUFBQyxhQUFBLEVBQUFDLGlCQUFBLEVBQUFDLHdCQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQSxFQUFBMzJCLEVBQUE7SUFBQSxPQUFBekksWUFBQSxHQUFBaGlDLENBQUEsV0FBQStrQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO1FBQUE7VUFFdEJna0Qsa0JBQWtCLEdBS2hDeDhCLE1BQU0sQ0FMTmk5QixZQUFZLEVBQ01SLGNBQWMsR0FJaEN6OEIsTUFBTSxDQUpOazlCLGdCQUFnQixFQUNBUixhQUFhLEdBRzdCMThCLE1BQU0sQ0FITm05QixjQUFjLEVBQ0RSLFVBQVUsR0FFdkIzOEIsTUFBTSxDQUZObzlCLFdBQVcsRUFDS1IsYUFBYSxHQUM3QjU4QixNQUFNLENBRE5xOUIsY0FBYztVQUFBMThCLFFBQUEsQ0FBQXRyQixDQUFBO1VBSWR3bkQsaUJBQWlCLEdBQUc5QixZQUFZLENBQUNDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztVQUNoRThCLHdCQUF3QixHQUFHL0IsWUFBWSxDQUFDQyxPQUFPLENBQzNDLDBCQUNKLENBQUM7VUFDRCtCLFdBQVcsR0FBR2hDLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLGFBQWEsQ0FBQztVQUFDcjZCLFFBQUEsQ0FBQW5vQixDQUFBO1VBQUE7UUFBQTtVQUFBbW9CLFFBQUEsQ0FBQXRyQixDQUFBO1VBQUFneEIsRUFBQSxHQUFBMUYsUUFBQSxDQUFBbHNCLENBQUE7VUFBQSxPQUFBa3NCLFFBQUEsQ0FBQXR0QixDQUFBLElBRzNDLENBQUMsQ0FBQztRQUFBO1VBQUEsTUFHVDBwRCxXQUFXLElBQ1g3aUQsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDLEdBQUdoMEMsTUFBTSxDQUFDeWlFLFdBQVcsQ0FBQyxHQUFHakIsU0FBUyxJQUM1Q2UsaUJBQWlCO1lBQUFsOEIsUUFBQSxDQUFBbm9CLENBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQW1vQixRQUFBLENBQUF0dEIsQ0FBQSxJQUVWO1lBQ0hpcUQsT0FBTyxFQUFFeHVDLElBQUksQ0FBQ29qQixLQUFLLENBQUMycUIsaUJBQWlCLENBQUM7WUFDdEN0TixJQUFJLEVBQUV1TjtVQUNWLENBQUM7UUFBQTtVQUFBLEtBQ01TLHdCQUF3QixDQUFDdjlCLE1BQU0sQ0FBQztZQUFBVyxRQUFBLENBQUFub0IsQ0FBQTtZQUFBO1VBQUE7VUFDakN3a0QsV0FBVyxHQUFHLElBQUlRLGVBQWUsQ0FBQztZQUNwQ1AsWUFBWSxFQUFFVCxrQkFBa0I7WUFDaENXLGNBQWMsRUFBRVQsYUFBYTtZQUM3QlUsV0FBVyxFQUFFVCxVQUFVO1lBQ3ZCVSxjQUFjLEVBQUVUO1VBQ3BCLENBQUMsQ0FBQyxDQUFDbHBELFFBQVEsQ0FBQyxDQUFDO1VBQUEsT0FBQWl0QixRQUFBLENBQUF0dEIsQ0FBQSxJQUNOZ3dCLEtBQUssQ0FBQ281QixjQUFjLEdBQUcsR0FBRyxHQUFHTyxXQUFXLEVBQUU7WUFBQ3BMLElBQUksRUFBRTtVQUFNLENBQUMsQ0FBQyxDQUMzRDF6QixJQUFJLENBQUMsVUFBQWtWLFFBQVE7WUFBQSxPQUFJQSxRQUFRLENBQUN6b0IsSUFBSSxDQUFDLENBQUM7VUFBQSxFQUFDLENBQ2pDdVQsSUFBSSxDQUFDLFVBQUF1SCxJQUFJLEVBQUk7WUFDVixJQUFJQSxJQUFJLElBQUlBLElBQUksQ0FBQzYzQixPQUFPLElBQUk3M0IsSUFBSSxDQUFDOHBCLElBQUksRUFBRTtjQUNuQyxJQUFJO2dCQUNBd0wsWUFBWSxDQUFDWSxPQUFPLENBQ2hCLHNCQUFzQixFQUN0QjdzQyxJQUFJLENBQUNDLFNBQVMsQ0FBQzBXLElBQUksQ0FBQzYzQixPQUFPLENBQy9CLENBQUM7Z0JBQ0R2QyxZQUFZLENBQUNZLE9BQU8sQ0FDaEIsMEJBQTBCLEVBQzFCbDJCLElBQUksQ0FBQzhwQixJQUNULENBQUM7Z0JBQ0R3TCxZQUFZLENBQUNZLE9BQU8sQ0FBQyxhQUFhLEVBQUV6aEQsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Y0FDbkQsQ0FBQyxDQUFDLE9BQU83MEMsQ0FBQyxFQUFFO2dCQUNSO2NBQUE7Y0FFSixPQUFPZ3NDLElBQUk7WUFDZixDQUFDLE1BQU07Y0FDSCxPQUFPLENBQUMsQ0FBQztZQUNiO1VBQ0osQ0FBQyxDQUFDLENBQ0RnNEIsS0FBSyxDQUFDLFlBQU07WUFDVCxPQUFPLENBQUMsQ0FBQztVQUNiLENBQUMsQ0FBQztRQUFBO1VBQUEsT0FBQTk4QixRQUFBLENBQUF0dEIsQ0FBQTtNQUFBO0lBQUEsR0FBQXF0QixPQUFBO0VBQUEsQ0FFYjtFQUFBLE9BQUE2N0IsdUJBQUEsQ0FBQXZwRCxLQUFBLE9BQUF0ZSxTQUFBO0FBQUE7QUFFRCxTQUFTNm9FLHdCQUF3QkEsQ0FBQ3Y5QixNQUFNLEVBQUU7RUFDdEM7RUFDQTtFQUNBLElBQUlBLE1BQU0sQ0FBQzA5QixxQkFBcUIsRUFBRTtJQUM5QixPQUFPLEtBQUs7RUFDaEI7RUFDQSxJQUFJQyxpQkFBaUIsRUFBRVosV0FBVztFQUNsQyxJQUFJO0lBQ0FZLGlCQUFpQixHQUNiNUMsWUFBWSxDQUFDQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxPQUFPO0lBQ3pEK0IsV0FBVyxHQUFHaEMsWUFBWSxDQUFDQyxPQUFPLENBQUMsYUFBYSxDQUFDO0VBQ3JELENBQUMsQ0FBQyxPQUFPdmhFLENBQUMsRUFBRTtJQUNSO0lBQ0EsT0FBTyxLQUFLO0VBQ2hCO0VBQ0EsT0FDSWtrRSxpQkFBaUIsS0FDaEIsQ0FBQ1osV0FBVyxJQUFJN2lELElBQUksQ0FBQ28wQixHQUFHLENBQUMsQ0FBQyxHQUFHaDBDLE1BQU0sQ0FBQ3lpRSxXQUFXLENBQUMsR0FBR2pCLFNBQVMsQ0FBQztBQUV0RTtBQUVBLFNBQVM4Qiw2QkFBNkJBLENBQ2xDcEIsa0JBQWtCLEVBQ2xCcUIsY0FBYyxFQUNkNzlCLE1BQU0sRUFDUjtFQUNFO0VBQ0E7RUFDQSxJQUFJQSxNQUFNLENBQUMwOUIscUJBQXFCLEVBQUU7SUFDOUIsT0FBTyxLQUFLO0VBQ2hCO0VBQ0EsSUFBSUMsaUJBQWlCLEVBQUVHLGFBQWEsRUFBRUMsb0JBQW9CO0VBQzFELElBQUk7SUFDQUosaUJBQWlCLEdBQ2I1QyxZQUFZLENBQUNDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLE9BQU87SUFDekQ4QyxhQUFhLEdBQUcvQyxZQUFZLENBQUNDLE9BQU8sQ0FBQyxlQUFlLENBQUM7SUFDckQrQyxvQkFBb0IsR0FBR2hELFlBQVksQ0FBQ0MsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0VBQ3ZFLENBQUMsQ0FBQyxPQUFPdmhFLENBQUMsRUFBRTtJQUNSO0lBQ0EsT0FBTyxLQUFLO0VBQ2hCO0VBQ0EsSUFDSW9rRSxjQUFjLEtBQUtob0UsU0FBUyxJQUM1QmttRSxlQUFlLENBQUNTLGtCQUFrQixFQUFFcUIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUN4RCxDQUFDRixpQkFBaUIsRUFDcEI7SUFDRSxPQUFPLEtBQUs7RUFDaEIsQ0FBQyxNQUFNLElBQ0hHLGFBQWEsSUFDYjVqRCxJQUFJLENBQUNvMEIsR0FBRyxDQUFDLENBQUMsR0FBR2gwQyxNQUFNLENBQUN3akUsYUFBYSxDQUFDLEdBQUdoQyxTQUFTLEVBQ2hEO0lBQ0UsT0FBTyxJQUFJO0VBQ2YsQ0FBQyxNQUFNLElBQ0hpQyxvQkFBb0IsSUFDcEIsQ0FBQ0QsYUFBYSxJQUNkL0IsZUFBZSxDQUFDZ0Msb0JBQW9CLEVBQUVGLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFDM0Q7SUFDRSxPQUFPLElBQUk7RUFDZixDQUFDLE1BQU07SUFDSCxPQUFPLENBQUNDLGFBQWEsSUFBSSxDQUFDQyxvQkFBb0I7RUFDbEQ7QUFDSjtBQUVPLElBQU1yRCxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQXYvRCxJQUFBLEVBQWlCO0VBQUEsSUFBWjZrQyxNQUFNLEdBQUE3a0MsSUFBQSxDQUFONmtDLE1BQU07RUFDL0IsSUFBQUcsU0FBQSxHQUE0Q3hCLCtDQUFRLENBQUM5b0MsU0FBUyxDQUFDO0lBQUF1cUMsVUFBQSxHQUFBL3FDLGNBQUEsQ0FBQThxQyxTQUFBO0lBQXhEMDlCLGNBQWMsR0FBQXo5QixVQUFBO0lBQUU0OUIsaUJBQWlCLEdBQUE1OUIsVUFBQTtFQUN4QyxJQUFBeXpCLFVBQUEsR0FBb0RsMUIsK0NBQVEsQ0FBQzlvQyxTQUFTLENBQUM7SUFBQWkrRCxVQUFBLEdBQUF6K0QsY0FBQSxDQUFBdytELFVBQUE7SUFBaEVvSyxrQkFBa0IsR0FBQW5LLFVBQUE7SUFBRW9LLHFCQUFxQixHQUFBcEssVUFBQTtFQUNoRCxJQUFBTSxVQUFBLEdBQXdEejFCLCtDQUFRLENBQUMsS0FBSyxDQUFDO0lBQUEwMUIsVUFBQSxHQUFBaC9ELGNBQUEsQ0FBQSsrRCxVQUFBO0lBQWhFK0osb0JBQW9CLEdBQUE5SixVQUFBO0lBQUUrSix1QkFBdUIsR0FBQS9KLFVBQUE7RUFFcEQsSUFBTWdLLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQUEsRUFBUztJQUMzQjtJQUNBLElBQUk7TUFDQXRELFlBQVksQ0FBQ1ksT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQztJQUNwRCxDQUFDLENBQUMsT0FBT2xpRSxDQUFDLEVBQUU7TUFDUjtJQUFBO0lBRUoya0UsdUJBQXVCLENBQUMsS0FBSyxDQUFDO0VBQ2xDLENBQUM7RUFFRCxJQUFNRSxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBLEVBQVM7SUFDM0I7SUFDQSxJQUFJO01BQ0F2RCxZQUFZLENBQUNZLE9BQU8sQ0FBQyxlQUFlLEVBQUV6aEQsSUFBSSxDQUFDbzBCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLE9BQU83MEMsQ0FBQyxFQUFFO01BQ1I7SUFBQTtJQUVKMmtFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztFQUNsQyxDQUFDO0VBRUQsSUFBTUcsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFrQkEsQ0FBQSxFQUFTO0lBQzdCO0lBQ0EsSUFBSTtNQUNBeEQsWUFBWSxDQUFDWSxPQUFPLENBQUMsc0JBQXNCLEVBQUVrQyxjQUFjLENBQUM7SUFDaEUsQ0FBQyxDQUFDLE9BQU9wa0UsQ0FBQyxFQUFFO01BQ1I7SUFBQTtJQUVKMmtFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztFQUNsQyxDQUFDO0VBRUR4a0MsZ0RBQVMsQ0FBQyxZQUFNO0lBQ1owaUMsc0JBQXNCLENBQUN0OEIsTUFBTSxDQUFDLENBQUM5QixJQUFJLENBQUMsVUFBQXVILElBQUksRUFBSTtNQUN4QyxJQUFJQSxJQUFJLEVBQUU7UUFDTnk0QixxQkFBcUIsQ0FBQ3o0QixJQUFJLENBQUM4cEIsSUFBSSxDQUFDO1FBQ2hDeU8saUJBQWlCLENBQUN2NEIsSUFBSSxDQUFDNjNCLE9BQU8sQ0FBQztNQUNuQztJQUNKLENBQUMsQ0FBQztFQUNOLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTjFqQyxnREFBUyxDQUFDLFlBQU07SUFDWixJQUFNNGtDLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUcva0UsQ0FBQyxFQUFJO01BQzVCLElBQ0kwa0Usb0JBQW9CLElBQ3BCLENBQUMxa0UsQ0FBQyxDQUFDRSxNQUFNLENBQUNvb0QsT0FBTyxDQUNiLHdEQUNKLENBQUMsRUFDSDtRQUNFcWMsdUJBQXVCLENBQUMsS0FBSyxDQUFDO01BQ2xDO0lBQ0osQ0FBQztJQUNEO0lBQ0Fya0MsUUFBUSxDQUFDcy9CLGdCQUFnQixDQUFDLE9BQU8sRUFBRW1GLGtCQUFrQixDQUFDO0lBRXRELE9BQU87TUFBQSxPQUFNemtDLFFBQVEsQ0FBQ3UvQixtQkFBbUIsQ0FBQyxPQUFPLEVBQUVrRixrQkFBa0IsQ0FBQztJQUFBO0VBQzFFLENBQUMsRUFBRSxDQUFDTCxvQkFBb0IsQ0FBQyxDQUFDO0VBRTFCLG9CQUNJM3hDLDBEQUFBO0lBQUtuRSxTQUFTLEVBQUM7RUFBMEIsR0FDcEM4MUMsb0JBQW9CLGdCQUNqQjN4QywwREFBQTtJQUFLbkUsU0FBUyxFQUFDO0VBQWtDLEdBQzVDNDFDLGtCQUFrQixnQkFDZnp4QywwREFBQTtJQUFHN3lCLE1BQU0sRUFBQyxRQUFRO0lBQUM2MUQsSUFBSSxFQUFFeU87RUFBbUIsR0FBQyxjQUUxQyxDQUFDLEdBQ0osSUFBSSxlQUNSenhDLDBEQUFBO0lBQVEyakMsT0FBTyxFQUFFb087RUFBbUIsR0FBQyxtQkFFN0IsQ0FBQyxlQUNUL3hDLDBEQUFBO0lBQVEyakMsT0FBTyxFQUFFbU87RUFBaUIsR0FBQyxvQkFFM0IsQ0FBQyxlQUNUOXhDLDBEQUFBO0lBQVEyakMsT0FBTyxFQUFFa087RUFBaUIsR0FBQyxtQ0FFM0IsQ0FDUCxDQUFDLEdBQ04sSUFBSSxlQUNSN3hDLDBEQUFBLGVBQU0sR0FBQyxFQUFDd1QsTUFBTSxDQUFDaTlCLFlBQW1CLENBQUMsRUFDbENXLDZCQUE2QixDQUMxQjU5QixNQUFNLENBQUNpOUIsWUFBWSxFQUNuQlksY0FBYyxFQUNkNzlCLE1BQ0osQ0FBQyxnQkFDR3hULDBEQUFBO0lBQ0luRSxTQUFTLEVBQUMsaUNBQWlDO0lBQzNDOG5DLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO01BQUEsT0FDSGlPLHVCQUF1QixDQUFDLENBQUNELG9CQUFvQixDQUFDO0lBQUE7RUFDakQsR0FDSiwyQkFDNEIsRUFBQ04sY0FDdEIsQ0FBQyxHQUNULElBQ0gsQ0FBQztBQUVkLENBQUM7Ozs7Ozs7Ozs7OztBQzFQRDtBQUNBOztBQUVBLCtEQUFlOzs7Ozs7Ozs7Ozs7Ozs7QUNIQSxTQUFTbjdCLGdCQUFnQkEsQ0FBQSxFQUFHO0VBQ3ZDLElBQU0rN0IsYUFBYSxHQUFHMWtDLFFBQVEsQ0FBQ3grQixjQUFjLENBQUMsY0FBYyxDQUFDO0VBQzdELE9BQU91ekIsSUFBSSxDQUFDb2pCLEtBQUssQ0FBQ3VzQixhQUFhLGFBQWJBLGFBQWEsZUFBYkEsYUFBYSxDQUFFQyxXQUFXLEdBQUdELGFBQWEsYUFBYkEsYUFBYSx1QkFBYkEsYUFBYSxDQUFFQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3JGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSE8sSUFBTUMscUJBQXFCLEdBQUcsbUJBQW1CO0FBQ2pELElBQU1DLGlCQUFpQixHQUFHLG9CQUFvQjtBQUM5QyxJQUFNejVCLG1CQUFtQixHQUFHLGFBQWE7QUFFekMsSUFBTXpGLE1BQU0sR0FBRztFQUNsQnlCLEVBQUUsRUFBRSxHQUFHO0VBQ1B5TyxjQUFjLEVBQUUsR0FBRztFQUNuQjtFQUNBO0VBQ0E7RUFDQWhKLFdBQVcsRUFBRSxHQUFHO0VBQ2hCRCxZQUFZLEVBQUUsR0FBRztFQUNqQmtKLGdCQUFnQixFQUFFLGtCQUFrQjtFQUNwQ21FLFdBQVcsRUFBRTtBQUNqQixDQUFDO0FBRU0sSUFBTWtqQixTQUFTLEdBQUc7RUFDckIsQ0FBQ3gzQixNQUFNLENBQUN5QixFQUFFLEdBQUcsU0FBUztFQUN0QixDQUFDekIsTUFBTSxDQUFDa1EsY0FBYyxHQUFHO0FBQzdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CNEI7QUFDdUM7QUFDMUI7QUFDQztBQUNhO0FBQ0g7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTcXZCLFNBQVNBLENBQUNDLGlCQUFpQixFQUFFO0VBQ2xDLElBQU1DLEVBQUUsR0FBR0osd0RBQVMsQ0FBQyxDQUFDO0VBQ3RCLEtBQUssSUFBSXppRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUc2aUUsRUFBRSxDQUFDeHFFLE1BQU0sRUFBRTJILENBQUMsRUFBRSxFQUFFO0lBQ2hDLElBQUE4aUUsY0FBQSxHQUEwQkQsRUFBRSxDQUFDN2lFLENBQUMsQ0FBQyxDQUFDNndCLFFBQVEsQ0FBQyxDQUFDO01BQWxDK2QsS0FBSyxHQUFBazBCLGNBQUEsQ0FBTGwwQixLQUFLO01BQUV4ckMsTUFBTSxHQUFBMC9ELGNBQUEsQ0FBTjEvRCxNQUFNO0lBQ3JCLElBQUk4aEMsYUFBYTtJQUNqQixJQUFJLENBQUMzc0MsS0FBSyxDQUFDMEIsT0FBTyxDQUFDMm9FLGlCQUFpQixDQUFDLEVBQUU7TUFDbkMxOUIsYUFBYSxHQUFHOEcsdURBQU8sQ0FBQzRDLEtBQUssRUFBRWcwQixpQkFBaUIsQ0FBQztJQUNyRCxDQUFDLE1BQ0k7TUFDRDE5QixhQUFhLEdBQUcwOUIsaUJBQWlCO0lBQ3JDO0lBQ0EsSUFBTTE1RCxLQUFLLEdBQUc2RyxpREFBSSxDQUFDbTFCLGFBQWEsRUFBRTloQyxNQUFNLENBQUM7SUFDekMsSUFBSThGLEtBQUssS0FBSzNQLFNBQVMsRUFBRTtNQUNyQixPQUFPMlAsS0FBSztJQUNoQjtFQUNKO0FBQ0o7QUFDQStsQixNQUFNLENBQUM4ekMsa0JBQWtCLEdBQUc7RUFDeEJMLGVBQWU7RUFDZkgsV0FBVztFQUNYQyxjQUFjO0VBQ2RHLFNBQVM7RUFDVGwzQixXQUFXQSxnRUFBQUE7QUFDZixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDbUM7QUFFN0IsU0FBU3UzQixvQkFBb0JBLENBQUN6aEQsT0FBTyxFQUFFclksS0FBSyxFQUFFNFEsSUFBSSxFQUFFO0VBQ3ZEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFSSxJQUFNbXBELFlBQVksR0FBRzFoRCxPQUFPLENBQUM4SSxLQUFLLENBQUMsR0FBRyxDQUFDO0VBQ3ZDLElBQUk2NEMsWUFBWTtFQUNoQixJQUFJOW5ELGlEQUFRLENBQUMsdUJBQXVCLEVBQUVtRyxPQUFPLENBQUMsRUFBRTtJQUM1QyxJQUFNNGhELGVBQWUsR0FBR0YsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN2Q0MsWUFBWSxNQUFBN3JELE1BQUEsQ0FBTThyRCxlQUFlLFVBQUE5ckQsTUFBQSxDQUFPeUMsSUFBSSxDQUFFO0lBQzlDLElBQUk1USxLQUFLLENBQUN6TyxFQUFFLEVBQUU7TUFDVnlvRSxZQUFZLGtCQUFBN3JELE1BQUEsQ0FBaUJuTyxLQUFLLENBQUN6TyxFQUFFLE9BQUc7SUFDNUM7SUFDQXlvRSxZQUFZLElBQUksdUNBQXVDO0VBQzNELENBQUMsTUFBTSxJQUFJOW5ELGlEQUFRLENBQUMsWUFBWSxFQUFFbUcsT0FBTyxDQUFDLEVBQUU7SUFDeEM7QUFDUjtBQUNBO0FBQ0E7SUFDUTJoRCxZQUFZLEdBQ1IzaEQsT0FBTyxDQUFDOEksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBQWhULE1BQUEsQ0FDakJ5QyxJQUFJLENBQUUsR0FDckIsUUFBUSxHQUNSeUgsT0FBTyxDQUFDOEksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQyxDQUFDLE1BQU0sSUFDSGpQLGlEQUFRLENBQUMsVUFBVSxFQUFFbUcsT0FBTyxDQUFDLElBQzdCbkcsaURBQVEsQ0FBQyxlQUFlLEVBQUVtRyxPQUFPLENBQUMsRUFDcEM7SUFDRSxJQUFNNGhELGdCQUFlLEdBQUdGLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFdkNDLFlBQVksd0JBQUE3ckQsTUFBQSxDQUF5QjhyRCxnQkFBZSxvQkFBQTlyRCxNQUFBLENBQWtCeUMsSUFBSSxDQUFFO0lBQzVFLElBQUk1USxLQUFLLENBQUN6TyxFQUFFLEVBQUU7TUFDVnlvRSxZQUFZLGtCQUFBN3JELE1BQUEsQ0FBaUJuTyxLQUFLLENBQUN6TyxFQUFFLE9BQUc7SUFDNUM7SUFDQXlvRSxZQUFZLElBQUksR0FBRzs7SUFFbkI7QUFDUjtBQUNBO0FBQ0E7QUFDQTtJQUNRLElBQUk5bkQsaURBQVEsQ0FBQyxhQUFhLEVBQUVtRyxPQUFPLENBQUMsRUFBRTtNQUNsQyxJQUFNNmhELGdCQUFnQixHQUFHN2hELE9BQU8sQ0FBQzhJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDeEQ2NEMsWUFBWSxrQkFBQTdyRCxNQUFBLENBQWtCK3JELGdCQUFnQixDQUFFO0lBQ3BEOztJQUVBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7SUFDUSxJQUFJaG9ELGlEQUFRLENBQUMsWUFBWSxFQUFFbUcsT0FBTyxDQUFDLEVBQUU7TUFDakMsSUFBTThoRCx1QkFBdUIsR0FBRzloRCxPQUFPLENBQ2xDOEksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN0QkEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjY0QyxZQUFZLDRCQUFBN3JELE1BQUEsQ0FBNkJnc0QsdUJBQXVCLE9BQUs7SUFDekU7SUFFQSxJQUFJcm1FLGlEQUFHLENBQUNtbUUsZ0JBQWUsRUFBRWo2RCxLQUFLLENBQUMsRUFBRTtNQUM3QjtBQUNaO0FBQ0E7QUFDQTtBQUNBO01BQ1ksSUFBTW82RCxpQkFBaUIsR0FBRzl3QyxJQUFJLENBQUNDLFNBQVMsQ0FDcEN2cEIsS0FBSyxDQUFDaTZELGdCQUFlLENBQUMsRUFDdEIsSUFBSSxFQUNKLENBQ0osQ0FBQztNQUNELElBQUlHLGlCQUFpQixFQUFFO1FBQ25CLElBQUlsb0QsaURBQVEsQ0FBQyxJQUFJLEVBQUVrb0QsaUJBQWlCLENBQUMsRUFBRTtVQUNuQ0osWUFBWSwyQkFBQTdyRCxNQUFBLENBQTJCaXNELGlCQUFpQixDQUFFO1FBQzlELENBQUMsTUFBTTtVQUNISixZQUFZLHlCQUFBN3JELE1BQUEsQ0FBeUJpc0QsaUJBQWlCLENBQUU7UUFDNUQ7TUFDSjtJQUNKO0VBQ0osQ0FBQyxNQUFNO0lBQ0g7QUFDUjtBQUNBO0FBQ0E7QUFDQTtJQUNRLE1BQU0sSUFBSXptRCxLQUFLLENBQUMwRSxPQUFPLENBQUM7RUFDNUI7RUFFQSxNQUFNLElBQUkxRSxLQUFLLENBQUNxbUQsWUFBWSxDQUFDO0FBQ2pDOzs7Ozs7Ozs7Ozs7OztBQ3ZIcUM7QUFFckMsSUFBTUssc0JBQXNCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7QUFFdEUsK0RBQWUsVUFBQTUzRCxTQUFTO0VBQUEsT0FBSXlQLGlEQUFRLENBQUN0QixpREFBSSxDQUFDbk8sU0FBUyxDQUFDLEVBQUU0M0Qsc0JBQXNCLENBQUM7QUFBQTs7Ozs7Ozs7Ozs7O0FDSjdFLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJM3lDLFFBQVEsRUFBSztFQUM5QixJQUFBeVksU0FBQSxHQUE4QnpZLFFBQVEsQ0FBQyxDQUFDO0lBQWhDNlMsTUFBTSxHQUFBNEYsU0FBQSxDQUFONUYsTUFBTTtJQUFFOHRCLFNBQVMsR0FBQWxvQixTQUFBLENBQVRrb0IsU0FBUztFQUN6QixJQUFNaVMsWUFBWSxHQUFHLy9CLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFKy9CLFlBQVk7RUFDekMsSUFBSSxDQUFDQSxZQUFZLEVBQUU7SUFDZjtFQUNKO0VBQ0EsSUFBSWpTLFNBQVMsRUFBRTtJQUNYLElBQUkvekIsUUFBUSxDQUFDaW1DLEtBQUssS0FBS0QsWUFBWSxFQUFFO01BQ2pDMzdCLFNBQVEsQ0FBQzQ3QixLQUFLLEdBQUdqbUMsUUFBUSxDQUFDaW1DLEtBQUs7TUFDL0JqbUMsUUFBUSxDQUFDaW1DLEtBQUssR0FBR0QsWUFBWTtJQUNqQztFQUNKLENBQUMsTUFDSTtJQUNELElBQUlobUMsUUFBUSxDQUFDaW1DLEtBQUssS0FBS0QsWUFBWSxFQUFFO01BQ2pDaG1DLFFBQVEsQ0FBQ2ltQyxLQUFLLEdBQUc1N0IsU0FBUSxDQUFDNDdCLEtBQUs7SUFDbkMsQ0FBQyxNQUNJO01BQ0Q1N0IsU0FBUSxDQUFDNDdCLEtBQUssR0FBR2ptQyxRQUFRLENBQUNpbUMsS0FBSztJQUNuQztFQUNKO0FBQ0osQ0FBQztBQUNELElBQU01N0IsU0FBUSxHQUFHO0VBQ2JqaUIsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDO0VBQ3JCODlDLGdCQUFnQixFQUFFcHFFLFNBQVM7RUFDM0J1dUMsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUFqcEMsSUFBQSxFQUFvQjtJQUFBLElBQWZneUIsUUFBUSxHQUFBaHlCLElBQUEsQ0FBUmd5QixRQUFRO0lBQ2pCLElBQUFzNkIsVUFBQSxHQUFtQnQ2QixRQUFRLENBQUMsQ0FBQztNQUFyQjZTLE1BQU0sR0FBQXluQixVQUFBLENBQU56bkIsTUFBTTtJQUNkLElBQUlvRSxTQUFRLENBQUNwRSxNQUFNLEtBQUtBLE1BQU0sRUFBRTtNQUFBLElBQUFrZ0MscUJBQUE7TUFDNUI5N0IsU0FBUSxDQUFDcEUsTUFBTSxHQUFHQSxNQUFNO01BQ3hCLENBQUFrZ0MscUJBQUEsR0FBQTk3QixTQUFRLENBQUM2N0IsZ0JBQWdCLGNBQUFDLHFCQUFBLGVBQXpCQSxxQkFBQSxDQUEyQkMsVUFBVSxDQUFDLENBQUM7TUFDdkMvN0IsU0FBUSxDQUFDNjdCLGdCQUFnQixHQUFHLElBQUlHLGdCQUFnQixDQUFDO1FBQUEsT0FBTU4sV0FBVyxDQUFDM3lDLFFBQVEsQ0FBQztNQUFBLEVBQUM7TUFDN0UsSUFBTTZ5QyxLQUFLLEdBQUdqbUMsUUFBUSxDQUFDeTBCLGFBQWEsQ0FBQyxPQUFPLENBQUM7TUFDN0MsSUFBSXdSLEtBQUssRUFBRTtRQUNQNTdCLFNBQVEsQ0FBQzY3QixnQkFBZ0IsQ0FBQ0ksT0FBTyxDQUFDTCxLQUFLLEVBQUU7VUFDckN2SSxPQUFPLEVBQUUsSUFBSTtVQUNiNkksU0FBUyxFQUFFLElBQUk7VUFDZkMsVUFBVSxFQUFFLElBQUk7VUFDaEJDLGFBQWEsRUFBRTtRQUNuQixDQUFDLENBQUM7TUFDTjtJQUNKO0lBQ0FWLFdBQVcsQ0FBQzN5QyxRQUFRLENBQUM7RUFDekI7QUFDSixDQUFDO0FBQ0QsK0RBQWVpWCxTQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0MyRTtBQUNtRDtBQUMzRjtBQUMrRDtBQUNwRDtBQUNaO0FBQ1c7QUFDcEUsSUFBTUEsUUFBUSxHQUFHO0VBQ2JBLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFBanBDLElBQUEsRUFBOEI7SUFBQSxJQUF6QnUzQixRQUFRLEdBQUF2M0IsSUFBQSxDQUFSdTNCLFFBQVE7TUFBRXZGLFFBQVEsR0FBQWh5QixJQUFBLENBQVJneUIsUUFBUTtJQUMzQixJQUFBeVksU0FBQSxHQUFvQ3pZLFFBQVEsQ0FBQyxDQUFDO01BQXpCdXpDLFFBQVEsR0FBQTk2QixTQUFBLENBQXJCd1UsU0FBUyxDQUFJc21CLFFBQVE7SUFDN0IsU0FBU0MsVUFBVUEsQ0FBQzVwRSxFQUFFLEVBQUU2cEUsWUFBWSxFQUFFO01BQ2xDLElBQUFuWixVQUFBLEdBQTBCdDZCLFFBQVEsQ0FBQyxDQUFDO1FBQTVCenRCLE1BQU0sR0FBQStuRCxVQUFBLENBQU4vbkQsTUFBTTtRQUFFd3JDLEtBQUssR0FBQXVjLFVBQUEsQ0FBTHZjLEtBQUs7TUFDckIsSUFBTW9GLFFBQVEsR0FBR2hJLHVEQUFPLENBQUM0QyxLQUFLLEVBQUVuMEMsRUFBRSxDQUFDO01BQ25DLElBQUksQ0FBQ3U1QyxRQUFRLEVBQUU7UUFDWCxPQUFPLEtBQUs7TUFDaEI7TUFDQTtNQUNBO01BQ0E7TUFDQXN3QixZQUFZLEdBQUdILDhEQUFnQixDQUFDcDBELGlEQUFJLENBQUNpa0MsUUFBUSxFQUFFNXdDLE1BQU0sQ0FBQyxFQUFFa2hFLFlBQVksRUFBRWx1QyxRQUFRLENBQUM7TUFDL0U7TUFDQTtNQUNBLElBQUFtdUMsaUJBQUEsR0FBa0JyaEMsOERBQWdCLENBQUM7VUFBRWg2QixLQUFLLEVBQUVvN0Q7UUFBYSxDQUFDLEVBQUVsdUMsUUFBUSxDQUFDO1FBQTdEbHRCLEtBQUssR0FBQXE3RCxpQkFBQSxDQUFMcjdELEtBQUs7TUFDYmt0QixRQUFRLENBQUN5VixxREFBVyxDQUFDO1FBQ2pCbUksUUFBUTtRQUNSOXFDLEtBQUs7UUFDTDlMLE1BQU0sRUFBRSxVQUFVO1FBQ2xCNjJDLFVBQVUsRUFBRTtNQUNoQixDQUFDLENBQUMsQ0FBQztNQUNILE9BQU8vcUMsS0FBSztJQUNoQjtJQUNBLElBQUlzN0Qsa0JBQWtCLEdBQUcsRUFBRTtJQUMzQixJQUFNQyxlQUFlLEdBQUcsRUFBRTtJQUMxQkwsUUFBUSxDQUFDM3JFLE9BQU8sQ0FBQyxVQUFBODJDLEVBQUUsRUFBSTtNQUFBLElBQUFtMUIsZ0JBQUE7TUFDbkIsSUFBTUMsWUFBWSxHQUFHdHRELGlEQUFNLEVBQUFxdEQsZ0JBQUEsR0FBQ24xQixFQUFFLENBQUNvMUIsWUFBWSxjQUFBRCxnQkFBQSxjQUFBQSxnQkFBQSxHQUFJLEVBQUUsRUFBRSxDQUFDbjFCLEVBQUUsQ0FBQ3JULFFBQVEsQ0FBQyxDQUFDO01BQ2pFLElBQUFtYyxZQUFBLEdBQXVFOUksRUFBRSxDQUFqRXJULFFBQVE7UUFBSTRVLG1CQUFtQixHQUFBdUgsWUFBQSxDQUFuQnZILG1CQUFtQjtRQUFFbnVCLE1BQU0sR0FBQTAxQixZQUFBLENBQU4xMUIsTUFBTTtRQUFJaWlELGVBQWUsR0FBS3IxQixFQUFFLENBQXRCcTFCLGVBQWU7TUFDbEUsSUFBSXZ1RCxpREFBSyxDQUFDdXVELGVBQWUsQ0FBQyxFQUFFO1FBQ3hCO01BQ0o7TUFDQSxJQUFRMWdFLElBQUksR0FBcUIwZ0UsZUFBZSxDQUF4QzFnRSxJQUFJO1FBQUU2dkIsS0FBSyxHQUFjNndDLGVBQWUsQ0FBbEM3d0MsS0FBSztRQUFFcVcsT0FBTyxHQUFLdzZCLGVBQWUsQ0FBM0J4NkIsT0FBTztNQUM1QixJQUFJbG1DLElBQUksS0FBSzNLLFNBQVMsRUFBRTtRQUNwQnhCLE1BQU0sQ0FBQ3lwQixPQUFPLENBQUN0ZCxJQUFJLENBQUMsQ0FBQ3pMLE9BQU8sQ0FBQyxVQUFBcUcsS0FBQSxFQUFpQjtVQUFBLElBQUFxMUMsS0FBQSxHQUFBcDdDLGNBQUEsQ0FBQStGLEtBQUE7WUFBZnJFLEVBQUUsR0FBQTA1QyxLQUFBO1lBQUVqckMsS0FBSyxHQUFBaXJDLEtBQUE7VUFDcEMsSUFBTTB3QixRQUFRLEdBQUc3bkIsc0VBQWUsQ0FBQ3ZpRCxFQUFFLENBQUM7VUFDcEMsSUFBQWd4RCxVQUFBLEdBQXVENTZCLFFBQVEsQ0FBQyxDQUFDO1lBQXpEc1UsTUFBTSxHQUFBc21CLFVBQUEsQ0FBTnRtQixNQUFNO1lBQVUyL0IsU0FBUyxHQUFBclosVUFBQSxDQUFqQnJvRCxNQUFNO1lBQW9COHFELFFBQVEsR0FBQXpDLFVBQUEsQ0FBZjdjLEtBQUs7VUFDeEM7VUFDQSxJQUFNbTJCLFlBQVksR0FBR1YsVUFBVSxDQUFDUSxRQUFRLEVBQUUzN0QsS0FBSyxDQUFDO1VBQ2hEO1VBQ0FzN0Qsa0JBQWtCLEdBQUdudEQsaURBQU0sQ0FBQ210RCxrQkFBa0IsRUFBRS9wRCxpREFBTyxDQUFDeGEsa0RBQUcsQ0FBQyxVQUFBK1YsSUFBSTtZQUFBLE9BQUlxbEMsNkVBQW1CLENBQUNsVyxNQUFNLEVBQUUrb0IsUUFBUSxFQUFFMlcsUUFBUSxFQUFFN3VELElBQUksRUFBRSxJQUFJLENBQUM7VUFBQSxHQUFFcmQsa0RBQUksQ0FBQ3VRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ2pKLEdBQUcsQ0FBQyxVQUFBK2tFLEdBQUc7WUFBQSxPQUFBbitCLGFBQUEsQ0FBQUEsYUFBQSxLQUMvSW0rQixHQUFHO2NBQ05MO1lBQVk7VUFBQSxDQUNkLENBQUMsQ0FBQztVQUNKLElBQU12VSxRQUFRLEdBQUdwa0IsdURBQU8sQ0FBQ2tpQixRQUFRLEVBQUUyVyxRQUFRLENBQUM7VUFDNUMsSUFBSSxDQUFDelUsUUFBUSxFQUFFO1lBQ1g7VUFDSjtVQUNBLElBQU02VSxNQUFNLEdBQUdsMUQsaURBQUksQ0FBQ3FnRCxRQUFRLEVBQUUwVSxTQUFTLENBQUM7VUFDeEMsSUFBTWhWLGFBQWEsR0FBR2ptQyxrREFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDbzdDLE1BQU0sQ0FBQzN6QixTQUFTLEVBQUUyekIsTUFBTSxDQUFDbnJELElBQUksQ0FBQyxFQUFFbVYsTUFBTSxDQUFDOGdDLDJCQUEyQixDQUFDO1VBQ2pILElBQU1tVixXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSW5qRSxRQUFRLEVBQUUrNUQsV0FBVyxFQUFFcUosZUFBZSxFQUF5QjtZQUFBLElBQXZCNWIsVUFBVSxHQUFBbnhELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsS0FBSztZQUMzRSxJQUFNZ3RFLE1BQU0sR0FBR3YwQyxRQUFRLENBQUMsQ0FBQyxDQUFDK2QsS0FBSztZQUMvQixJQUFNQSxLQUFLLEdBQUc5TCw0REFBWSxDQUFDL2dDLFFBQVEsRUFBRW9qRSxlQUFlLEVBQUVDLE1BQU0sQ0FBQztZQUM3RGh2QyxRQUFRLENBQUN3TSxrREFBUSxDQUFDZ00sS0FBSyxDQUFDLENBQUM7WUFDekI7WUFDQTQxQixrQkFBa0IsR0FBR250RCxpREFBTSxDQUFDbXRELGtCQUFrQixFQUFFdmIsNEVBQWtCLENBQUM5akIsTUFBTSxFQUFFeUosS0FBSyxFQUFFN3NDLFFBQVEsRUFBRTtjQUN4Rm1sRCxTQUFTLEVBQUVpZSxlQUFlO2NBQzFCNWI7WUFDSixDQUFDLENBQUMsQ0FBQ3RwRCxHQUFHLENBQUMsVUFBQStrRSxHQUFHO2NBQUEsT0FBQW4rQixhQUFBLENBQUFBLGFBQUEsS0FDSG0rQixHQUFHO2dCQUNOTDtjQUFZO1lBQUEsQ0FDZCxDQUFDLENBQUM7WUFDSjtZQUNBO1lBQ0FILGtCQUFrQixHQUFHbnRELGlEQUFNLENBQUNtdEQsa0JBQWtCLEVBQUV2Yiw0RUFBa0IsQ0FBQzlqQixNQUFNLEVBQUUrb0IsUUFBUSxFQUFFNE4sV0FBVyxFQUFFO2NBQzlGOVUsc0JBQXNCLEVBQUUsSUFBSTtjQUM1QkMsUUFBUSxFQUFFclksS0FBSztjQUNmc1ksU0FBUyxFQUFFaWUsZUFBZTtjQUMxQjViO1lBQ0osQ0FBQyxDQUFDLENBQUN0cEQsR0FBRyxDQUFDLFVBQUEra0UsR0FBRztjQUFBLE9BQUFuK0IsYUFBQSxDQUFBQSxhQUFBLEtBQ0htK0IsR0FBRztnQkFDTkw7Y0FBWTtZQUFBLENBQ2QsQ0FBQyxDQUFDO1VBQ1IsQ0FBQztVQUNELElBQUlVLFVBQVUsR0FBRyxLQUFLO1VBQ3RCLENBQUMsVUFBVSxDQUFDLENBQ1BodUQsTUFBTSxDQUFDeTRDLGFBQWEsQ0FBQyxDQUNyQnIzRCxPQUFPLENBQUMsVUFBQXUzRCxZQUFZLEVBQUk7WUFDekIsSUFBSXFWLFVBQVUsRUFBRTtjQUNaO1lBQ0o7WUFDQSxJQUFJclYsWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtjQUM3QixJQUFBNjBDLHFCQUFBLEdBQW9CRCxZQUFZLENBQzNCM2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWHBxQixHQUFHLENBQUMsVUFBQThZLENBQUM7a0JBQUEsT0FBSUEsQ0FBQyxDQUFDc1IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDMXZCLE1BQU0sQ0FBQyxVQUFBd0MsQ0FBQztvQkFBQSxPQUFJQSxDQUFDO2tCQUFBLEVBQUM7Z0JBQUEsRUFBQztnQkFBQSt5RCxzQkFBQSxHQUFBbjNELGNBQUEsQ0FBQWszRCxxQkFBQTtnQkFGbkNFLFNBQVMsR0FBQUQsc0JBQUE7Y0FHaEIsSUFBTW9WLFFBQVEsR0FBR3YxRCxpREFBSSxDQUFDb2dELFNBQVMsRUFBRTRVLFlBQVksQ0FBQztjQUM5QyxJQUFJLENBQUNPLFFBQVEsRUFBRTtnQkFDWDtjQUNKO2NBQ0E7Y0FDQUosV0FBVyxDQUFBcitCLGFBQUEsQ0FBQUEsYUFBQSxLQUNKbytCLE1BQU07Z0JBQ1QvN0QsS0FBSyxFQUFBMjlCLGFBQUEsQ0FBQUEsYUFBQSxLQUNFbytCLE1BQU0sQ0FBQy83RCxLQUFLLEdBQ1o2N0QsWUFBWTtjQUNsQixJQUNGRSxNQUFNLEVBQUU3VSxRQUFRLEVBQUV6M0Qsa0RBQUksQ0FBQ29zRSxZQUFZLENBQUMsQ0FBQztjQUN4QztjQUNBTSxVQUFVLEdBQUcsSUFBSTtZQUNyQixDQUFDLE1BQ0k7Y0FDRCxJQUFNRSxnQkFBZ0IsR0FBR3ZWLFlBQVksQ0FBQzNsQyxLQUFLLENBQUMsR0FBRyxDQUFDO2NBQ2hELElBQU10b0IsUUFBUSxHQUFHZ08saURBQUksQ0FBQ3cxRCxnQkFBZ0IsRUFBRVIsWUFBWSxDQUFDO2NBQ3JELElBQUksQ0FBQ2hqRSxRQUFRLEVBQUU7Z0JBQ1g7Y0FDSjtjQUNBLElBQU1vakUsZUFBZSxHQUFHOXRELGlEQUFNLENBQUMyMEIsdURBQU8sQ0FBQ2tpQixRQUFRLEVBQUUyVyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDeHRELE1BQU0sQ0FBQ2t1RCxnQkFBZ0IsQ0FBQyxDQUFDO2NBQy9GLElBQU16SixXQUFXLEdBQUcvckQsaURBQUksQ0FBQ28xRCxlQUFlLEVBQUVMLFNBQVMsQ0FBQztjQUNwREksV0FBVyxDQUFDbmpFLFFBQVEsRUFBRSs1RCxXQUFXLEVBQUVxSixlQUFlLENBQUM7WUFDdkQ7VUFDSixDQUFDLENBQUM7VUFDRjtVQUNBO1VBQ0E7VUFDQSxJQUFNSyxVQUFVLEdBQUd6N0Msa0RBQU0sQ0FBQyxVQUFDanlCLENBQUMsRUFBRWMsQ0FBQztZQUFBLE9BQUssRUFBRUEsQ0FBQyxJQUFJc1EsS0FBSyxDQUFDO1VBQUEsR0FBRTY3RCxZQUFZLENBQUM7VUFDaEUsSUFBSSxDQUFDaitDLGtEQUFPLENBQUMwK0MsVUFBVSxDQUFDLEVBQUU7WUFDdEIsSUFBQTVaLFVBQUEsR0FBeUMvNkIsUUFBUSxDQUFDLENBQUM7Y0FBbkM0MEMsYUFBYSxHQUFBN1osVUFBQSxDQUFyQnptQixNQUFNO2NBQWlCeUosS0FBSyxHQUFBZ2QsVUFBQSxDQUFMaGQsS0FBSztZQUNwQzQxQixrQkFBa0IsR0FBR250RCxpREFBTSxDQUFDbXRELGtCQUFrQixFQUFFNWEsMEVBQWdCLENBQUNudkQsRUFBRSxFQUFFK3FFLFVBQVUsRUFBRUMsYUFBYSxFQUFFNzJCLEtBQUssQ0FBQyxDQUFDM3VDLEdBQUcsQ0FBQyxVQUFBK2tFLEdBQUc7Y0FBQSxPQUFBbitCLGFBQUEsQ0FBQUEsYUFBQSxLQUN2R20rQixHQUFHO2dCQUNOTDtjQUFZO1lBQUEsQ0FDZCxDQUFDLENBQUM7VUFDUjtRQUNKLENBQUMsQ0FBQztRQUNGO1FBQ0E7UUFDQTtRQUNBRixlQUFlLENBQUMzcUUsSUFBSSxDQUFBK3NDLGFBQUEsQ0FBQUEsYUFBQSxLQUNiMEksRUFBRTtVQUNMbTJCLGFBQWEsRUFBRTtZQUNYQyxRQUFRLEVBQUUxbEUsa0RBQUcsQ0FBQ203QyxzRUFBZ0IsRUFBRTNnQyxpREFBTyxDQUFDODBCLEVBQUUsQ0FBQ21ZLFVBQVUsQ0FBQzcyQixRQUFRLENBQUMsQ0FBQyxDQUFDK2QsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RTAxQixZQUFZLEVBQUU3cEQsaURBQU8sQ0FBQ3hhLGtEQUFHLENBQUMsVUFBQTIwQyxLQUFBO2NBQUEsSUFBQUMsS0FBQSxHQUFBOTdDLGNBQUEsQ0FBQTY3QyxLQUFBO2dCQUFFbjZDLEVBQUUsR0FBQW82QyxLQUFBO2dCQUFFOTZDLEtBQUssR0FBQTg2QyxLQUFBO2NBQUEsT0FBTTUwQyxrREFBRyxDQUFDLFVBQUFtdkMsUUFBUTtnQkFBQSxPQUFJZ00sMEVBQWdCLENBQUM7a0JBQUUzZ0QsRUFBRTtrQkFBRTIwQztnQkFBUyxDQUFDLENBQUM7Y0FBQSxHQUFFejJDLGtEQUFJLENBQUNvQixLQUFLLENBQUMsQ0FBQztZQUFBLEdBQUU0d0Isa0RBQU8sQ0FBQ3ptQixJQUFJLENBQUMsQ0FBQztVQUMvSDtRQUFDLEVBQ0osQ0FBQztNQUNOO01BQ0EsSUFBSTZ2QixLQUFLLEtBQUt4NkIsU0FBUyxFQUFFO1FBQ3JCLElBQUlnb0IsT0FBTztRQUNYLElBQUlndUIsRUFBRSxDQUFDclQsUUFBUSxDQUFDcW1CLFNBQVMsRUFBRTtVQUN2QixJQUFNcWpCLEtBQUssR0FBR2p0RSxrREFBSSxDQUFDNDJDLEVBQUUsQ0FBQzRDLGNBQWMsQ0FBQyxDQUFDajBCLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDaERxRCxPQUFPLCtDQUFBbEssTUFBQSxDQUErQ3V1RCxLQUFLLENBQUU7UUFDakUsQ0FBQyxNQUNJO1VBQ0QsSUFBTTUwQixPQUFPLEdBQUc1RyxPQUFPLEdBQ2pCbnFDLGtEQUFHLENBQUNtN0Msc0VBQWdCLEVBQUUzZ0MsaURBQU8sQ0FBQyxDQUFDMnZCLE9BQU8sQ0FBQzRHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzl5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQzVEeUUsTUFBTTtVQUNacEIsT0FBTyw4QkFBQWxLLE1BQUEsQ0FBOEIyNUIsT0FBTyxDQUFFO1FBQ2xEO1FBQ0EsSUFBSUYsbUJBQW1CLEVBQUU7VUFDckIsSUFBbUIrMEIsRUFBRSxHQUF3Qi8wQixtQkFBbUIsQ0FBeERRLFNBQVM7WUFBcUJ0dUMsRUFBRSxHQUFLOHRDLG1CQUFtQixDQUF6Q1MsYUFBYTtVQUNwQ2h3QixPQUFPLGdDQUFBbEssTUFBQSxDQUFnQ3d1RCxFQUFFLE9BQUF4dUQsTUFBQSxDQUFJclUsRUFBRSxDQUFFO1FBQ3JEO1FBQ0F5bEMsMERBQWdCLENBQUMxVSxLQUFLLEVBQUV4UyxPQUFPLEVBQUU2VSxRQUFRLENBQUM7UUFDMUNxdUMsZUFBZSxDQUFDM3FFLElBQUksQ0FBQStzQyxhQUFBLENBQUFBLGFBQUEsS0FDYjBJLEVBQUU7VUFDTG0yQixhQUFhLEVBQUU7WUFDWEMsUUFBUSxFQUFFMWxFLGtEQUFHLENBQUNtN0Msc0VBQWdCLEVBQUUzZ0MsaURBQU8sQ0FBQzgwQixFQUFFLENBQUNtWSxVQUFVLENBQUM3MkIsUUFBUSxDQUFDLENBQUMsQ0FBQytkLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekUwMUIsWUFBWSxFQUFFO1VBQ2xCO1FBQUMsRUFDSixDQUFDO01BQ047SUFDSixDQUFDLENBQUM7SUFDRmx1QyxRQUFRLENBQUNpWSxzRUFBa0IsQ0FBQyxDQUN4QisxQixRQUFRLENBQUMvckUsTUFBTSxHQUFHazFDLDJFQUF1QixDQUFDNjJCLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFDMURBLFFBQVEsQ0FBQy9yRSxNQUFNLEdBQUdvMEMseUVBQXFCLENBQUMyM0IsUUFBUSxDQUFDL3JFLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFDL0Rvc0UsZUFBZSxDQUFDcHNFLE1BQU0sR0FDaEI4MEMsc0VBQWtCLENBQUNzM0IsZUFBZSxDQUFDLEdBQ25DLElBQUksRUFDVkQsa0JBQWtCLENBQUNuc0UsTUFBTSxHQUNuQjQwQyx5RUFBcUIsQ0FBQ3UzQixrQkFBa0IsQ0FBQyxHQUN6QyxJQUFJLENBQ2IsQ0FBQyxDQUFDO0VBQ1AsQ0FBQztFQUNEMytDLE1BQU0sRUFBRSxDQUFDLG9CQUFvQjtBQUNqQyxDQUFDO0FBQ0QsK0RBQWVpaUIsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ25MdkIsdUtBQUEzcUMsQ0FBQSxFQUFBb3VCLENBQUEsRUFBQXRDLENBQUEsd0JBQUF4dkIsTUFBQSxHQUFBQSxNQUFBLE9BQUF5aUIsQ0FBQSxHQUFBK00sQ0FBQSxDQUFBdnZCLFFBQUEsa0JBQUE0eEIsQ0FBQSxHQUFBckMsQ0FBQSxDQUFBNlgsV0FBQSw4QkFBQTVuQyxFQUFBK3ZCLENBQUEsRUFBQS9NLENBQUEsRUFBQW9QLENBQUEsRUFBQXB5QixDQUFBLFFBQUE2bUIsQ0FBQSxHQUFBN0QsQ0FBQSxJQUFBQSxDQUFBLENBQUF2UyxTQUFBLFlBQUFvM0IsU0FBQSxHQUFBN2tCLENBQUEsR0FBQTZrQixTQUFBLEVBQUFsVixDQUFBLEdBQUE5ekIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsQ0FBQXBXLFNBQUEsVUFBQXEzQixtQkFBQSxDQUFBblYsQ0FBQSx1QkFBQTVDLENBQUEsRUFBQS9NLENBQUEsRUFBQW9QLENBQUEsUUFBQXB5QixDQUFBLEVBQUE2bUIsQ0FBQSxFQUFBOEwsQ0FBQSxFQUFBblcsQ0FBQSxNQUFBcUQsQ0FBQSxHQUFBdVMsQ0FBQSxRQUFBdHJCLENBQUEsT0FBQWloQyxDQUFBLEtBQUFsb0IsQ0FBQSxLQUFBbUQsQ0FBQSxLQUFBL0QsQ0FBQSxFQUFBaGIsQ0FBQSxFQUFBNFosQ0FBQSxFQUFBbUIsQ0FBQSxFQUFBeEMsQ0FBQSxFQUFBd0MsQ0FBQSxDQUFBamdCLElBQUEsQ0FBQWtGLENBQUEsTUFBQSthLENBQUEsV0FBQUEsRUFBQXFULENBQUEsRUFBQXRDLENBQUEsV0FBQS92QixDQUFBLEdBQUFxeUIsQ0FBQSxFQUFBeEwsQ0FBQSxNQUFBOEwsQ0FBQSxHQUFBMXVCLENBQUEsRUFBQThqQyxDQUFBLENBQUEva0IsQ0FBQSxHQUFBK00sQ0FBQSxFQUFBbFMsQ0FBQSxnQkFBQW1CLEVBQUErUSxDQUFBLEVBQUEvTSxDQUFBLFNBQUE2RCxDQUFBLEdBQUFrSixDQUFBLEVBQUE0QyxDQUFBLEdBQUEzUCxDQUFBLEVBQUFxUCxDQUFBLE9BQUF2ckIsQ0FBQSxJQUFBMFYsQ0FBQSxLQUFBNFYsQ0FBQSxJQUFBQyxDQUFBLEdBQUF4UyxDQUFBLENBQUExZ0IsTUFBQSxFQUFBa3pCLENBQUEsVUFBQUQsQ0FBQSxFQUFBcHlCLENBQUEsR0FBQTZmLENBQUEsQ0FBQXdTLENBQUEsR0FBQXJULENBQUEsR0FBQStvQixDQUFBLENBQUFsb0IsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBOXZCLENBQUEsS0FBQSt2QixDQUFBLFFBQUFxQyxDQUFBLEdBQUF0QyxDQUFBLEtBQUE5TSxDQUFBLE1BQUEyUCxDQUFBLEdBQUEzeUIsQ0FBQSxFQUFBNm1CLENBQUEsR0FBQTdtQixDQUFBLFlBQUE2bUIsQ0FBQSxXQUFBN21CLENBQUEsTUFBQUEsQ0FBQSxNQUFBaUUsQ0FBQSxJQUFBakUsQ0FBQSxPQUFBZ2YsQ0FBQSxNQUFBb1QsQ0FBQSxHQUFBckMsQ0FBQSxRQUFBL1EsQ0FBQSxHQUFBaGYsQ0FBQSxRQUFBNm1CLENBQUEsTUFBQWtoQixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBK0QsQ0FBQSxFQUFBK2tCLENBQUEsQ0FBQS9rQixDQUFBLEdBQUFoakIsQ0FBQSxPQUFBZ2YsQ0FBQSxHQUFBOFEsQ0FBQSxLQUFBc0MsQ0FBQSxHQUFBckMsQ0FBQSxRQUFBL3ZCLENBQUEsTUFBQWdqQixDQUFBLElBQUFBLENBQUEsR0FBQThNLENBQUEsTUFBQTl2QixDQUFBLE1BQUErdkIsQ0FBQSxFQUFBL3ZCLENBQUEsTUFBQWdqQixDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQThNLENBQUEsRUFBQWpKLENBQUEsY0FBQXVMLENBQUEsSUFBQXJDLENBQUEsYUFBQWxTLENBQUEsUUFBQS9XLENBQUEsT0FBQWtjLENBQUEscUJBQUFvUCxDQUFBLEVBQUF2UyxDQUFBLEVBQUFpUSxDQUFBLFFBQUF0VCxDQUFBLFlBQUF4YixTQUFBLHVDQUFBOEYsQ0FBQSxVQUFBK1ksQ0FBQSxJQUFBYixDQUFBLENBQUFhLENBQUEsRUFBQWlRLENBQUEsR0FBQWpKLENBQUEsR0FBQWhILENBQUEsRUFBQThTLENBQUEsR0FBQTdDLENBQUEsR0FBQXVDLENBQUEsR0FBQXhMLENBQUEsT0FBQTVpQixDQUFBLEdBQUEwdUIsQ0FBQSxNQUFBN3JCLENBQUEsS0FBQTlHLENBQUEsS0FBQTZtQixDQUFBLEdBQUFBLENBQUEsUUFBQUEsQ0FBQSxTQUFBa2hCLENBQUEsQ0FBQS9rQixDQUFBLFFBQUFoRSxDQUFBLENBQUE2SCxDQUFBLEVBQUE4TCxDQUFBLEtBQUFvVixDQUFBLENBQUEva0IsQ0FBQSxHQUFBMlAsQ0FBQSxHQUFBb1YsQ0FBQSxDQUFBOW9CLENBQUEsR0FBQTBULENBQUEsYUFBQW5XLENBQUEsTUFBQXhjLENBQUEsUUFBQTZtQixDQUFBLEtBQUF1TCxDQUFBLFlBQUFDLENBQUEsR0FBQXJ5QixDQUFBLENBQUFveUIsQ0FBQSxXQUFBQyxDQUFBLEdBQUFBLENBQUEsQ0FBQXJqQixJQUFBLENBQUFoUCxDQUFBLEVBQUEyeUIsQ0FBQSxVQUFBM3hCLFNBQUEsMkNBQUFxeEIsQ0FBQSxDQUFBMXhCLElBQUEsU0FBQTB4QixDQUFBLEVBQUFNLENBQUEsR0FBQU4sQ0FBQSxDQUFBeHhCLEtBQUEsRUFBQWdtQixDQUFBLFNBQUFBLENBQUEsb0JBQUFBLENBQUEsS0FBQXdMLENBQUEsR0FBQXJ5QixDQUFBLENBQUEwRyxNQUFBLEtBQUEyckIsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsR0FBQTZtQixDQUFBLFNBQUE4TCxDQUFBLEdBQUEzeEIsU0FBQSx1Q0FBQW94QixDQUFBLGdCQUFBdkwsQ0FBQSxPQUFBN21CLENBQUEsR0FBQWlFLENBQUEsY0FBQW91QixDQUFBLElBQUF2ckIsQ0FBQSxHQUFBaWhDLENBQUEsQ0FBQS9rQixDQUFBLFFBQUEyUCxDQUFBLEdBQUE1QyxDQUFBLENBQUEvZ0IsSUFBQSxDQUFBZ1UsQ0FBQSxFQUFBK2tCLENBQUEsT0FBQWxxQixDQUFBLGtCQUFBd1UsQ0FBQSxJQUFBcnlCLENBQUEsR0FBQWlFLENBQUEsRUFBQTRpQixDQUFBLE1BQUE4TCxDQUFBLEdBQUFOLENBQUEsY0FBQTdWLENBQUEsbUJBQUEzYixLQUFBLEVBQUF3eEIsQ0FBQSxFQUFBMXhCLElBQUEsRUFBQW1HLENBQUEsU0FBQWlwQixDQUFBLEVBQUFxQyxDQUFBLEVBQUFweUIsQ0FBQSxRQUFBMnlCLENBQUEsUUFBQTlVLENBQUEsZ0JBQUFncUIsVUFBQSxjQUFBRyxrQkFBQSxjQUFBQywyQkFBQSxLQUFBNVYsQ0FBQSxHQUFBeHpCLE1BQUEsQ0FBQTRsQixjQUFBLE1BQUFvQyxDQUFBLE1BQUE3RCxDQUFBLElBQUFxUCxDQUFBLENBQUFBLENBQUEsSUFBQXJQLENBQUEsU0FBQThrQixtQkFBQSxDQUFBelYsQ0FBQSxPQUFBclAsQ0FBQSxpQ0FBQXFQLENBQUEsR0FBQU0sQ0FBQSxHQUFBc1YsMEJBQUEsQ0FBQXgzQixTQUFBLEdBQUFvM0IsU0FBQSxDQUFBcDNCLFNBQUEsR0FBQTVSLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFxQyxDQUFBLFlBQUFySyxFQUFBdlksQ0FBQSxXQUFBcEYsTUFBQSxDQUFBcXBDLGNBQUEsR0FBQXJwQyxNQUFBLENBQUFxcEMsY0FBQSxDQUFBamtDLENBQUEsRUFBQWdrQywwQkFBQSxLQUFBaGtDLENBQUEsQ0FBQWtrQyxTQUFBLEdBQUFGLDBCQUFBLEVBQUFILG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBbXVCLENBQUEseUJBQUFudUIsQ0FBQSxDQUFBd00sU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQW1PLENBQUEsR0FBQTF1QixDQUFBLFdBQUErakMsaUJBQUEsQ0FBQXYzQixTQUFBLEdBQUF3M0IsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQW5WLENBQUEsaUJBQUFzViwwQkFBQSxHQUFBSCxtQkFBQSxDQUFBRywwQkFBQSxpQkFBQUQsaUJBQUEsR0FBQUEsaUJBQUEsQ0FBQXpTLFdBQUEsd0JBQUF1UyxtQkFBQSxDQUFBRywwQkFBQSxFQUFBN1YsQ0FBQSx3QkFBQTBWLG1CQUFBLENBQUFuVixDQUFBLEdBQUFtVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBUCxDQUFBLGdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsRUFBQTNQLENBQUEsaUNBQUE4a0IsbUJBQUEsQ0FBQW5WLENBQUEsOERBQUF5VixZQUFBLFlBQUFBLGFBQUEsYUFBQWhpQyxDQUFBLEVBQUFwRyxDQUFBLEVBQUF3MEIsQ0FBQSxFQUFBaFksQ0FBQTtBQUFBLFNBQUFzckIsb0JBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXJ5QixDQUFBLEdBQUFuQixNQUFBLENBQUF3UixjQUFBLFFBQUFyUSxDQUFBLHVCQUFBaUUsQ0FBQSxJQUFBakUsQ0FBQSxRQUFBOG5DLG1CQUFBLFlBQUFPLG1CQUFBcGtDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBLFFBQUF0QyxDQUFBLEVBQUEvdkIsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxDQUFBLEVBQUE4ckIsQ0FBQSxJQUFBbHZCLEtBQUEsRUFBQW1pQixDQUFBLEVBQUE5UyxVQUFBLEdBQUFtaUIsQ0FBQSxFQUFBbGlCLFlBQUEsR0FBQWtpQixDQUFBLEVBQUFqaUIsUUFBQSxHQUFBaWlCLENBQUEsTUFBQXB1QixDQUFBLENBQUE4ckIsQ0FBQSxJQUFBL00sQ0FBQSxZQUFBb1AsQ0FBQSxZQUFBQSxFQUFBckMsQ0FBQSxFQUFBL00sQ0FBQSxJQUFBOGtCLG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsWUFBQTlyQixDQUFBLGdCQUFBcWtDLE9BQUEsQ0FBQXZZLENBQUEsRUFBQS9NLENBQUEsRUFBQS9lLENBQUEsVUFBQW11QixDQUFBLGFBQUFBLENBQUEsY0FBQUEsQ0FBQSxvQkFBQTBWLG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUE7QUFBQSxTQUFBd2YsUUFBQTV0QyxDQUFBLEVBQUE4ckIsQ0FBQSxRQUFBc0MsQ0FBQSxHQUFBeHpCLE1BQUEsQ0FBQVksSUFBQSxDQUFBd0UsQ0FBQSxPQUFBcEYsTUFBQSxDQUFBaXpDLHFCQUFBLFFBQUExZixDQUFBLEdBQUF2ekIsTUFBQSxDQUFBaXpDLHFCQUFBLENBQUE3dEMsQ0FBQSxHQUFBOHJCLENBQUEsS0FBQXFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBM3dCLE1BQUEsV0FBQXN1QixDQUFBLFdBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUE5dEMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQTdmLFVBQUEsT0FBQW1pQixDQUFBLENBQUF6eEIsSUFBQSxDQUFBNGMsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUE7QUFBQSxTQUFBc2IsY0FBQTFwQyxDQUFBLGFBQUE4ckIsQ0FBQSxNQUFBQSxDQUFBLEdBQUE3d0IsU0FBQSxDQUFBQyxNQUFBLEVBQUE0d0IsQ0FBQSxVQUFBc0MsQ0FBQSxXQUFBbnpCLFNBQUEsQ0FBQTZ3QixDQUFBLElBQUE3d0IsU0FBQSxDQUFBNndCLENBQUEsUUFBQUEsQ0FBQSxPQUFBOGhCLE9BQUEsQ0FBQWh6QyxNQUFBLENBQUF3ekIsQ0FBQSxPQUFBOXlCLE9BQUEsV0FBQXd3QixDQUFBLElBQUE0ZSxlQUFBLENBQUExcUMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXNDLENBQUEsQ0FBQXRDLENBQUEsU0FBQWx4QixNQUFBLENBQUFtekMseUJBQUEsR0FBQW56QyxNQUFBLENBQUFrUixnQkFBQSxDQUFBOUwsQ0FBQSxFQUFBcEYsTUFBQSxDQUFBbXpDLHlCQUFBLENBQUEzZixDQUFBLEtBQUF3ZixPQUFBLENBQUFoekMsTUFBQSxDQUFBd3pCLENBQUEsR0FBQTl5QixPQUFBLFdBQUF3d0IsQ0FBQSxJQUFBbHhCLE1BQUEsQ0FBQXdSLGNBQUEsQ0FBQXBNLENBQUEsRUFBQThyQixDQUFBLEVBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUExZixDQUFBLEVBQUF0QyxDQUFBLGlCQUFBOXJCLENBQUE7QUFBQSxTQUFBMHFDLGdCQUFBMXFDLENBQUEsRUFBQThyQixDQUFBLEVBQUFzQyxDQUFBLFlBQUF0QyxDQUFBLEdBQUFraUIsY0FBQSxDQUFBbGlCLENBQUEsTUFBQTlyQixDQUFBLEdBQUFwRixNQUFBLENBQUF3UixjQUFBLENBQUFwTSxDQUFBLEVBQUE4ckIsQ0FBQSxJQUFBbHZCLEtBQUEsRUFBQXd4QixDQUFBLEVBQUFuaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQW5NLENBQUEsQ0FBQThyQixDQUFBLElBQUFzQyxDQUFBLEVBQUFwdUIsQ0FBQTtBQUFBLFNBQUFndUMsZUFBQTVmLENBQUEsUUFBQXJ5QixDQUFBLEdBQUFreUMsWUFBQSxDQUFBN2YsQ0FBQSxnQ0FBQWgwQixPQUFBLENBQUEyQixDQUFBLElBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFreUMsYUFBQTdmLENBQUEsRUFBQXRDLENBQUEsb0JBQUExeEIsT0FBQSxDQUFBZzBCLENBQUEsTUFBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFwdUIsQ0FBQSxHQUFBb3VCLENBQUEsQ0FBQTl4QixNQUFBLENBQUE0eEMsV0FBQSxrQkFBQWx1QyxDQUFBLFFBQUFqRSxDQUFBLEdBQUFpRSxDQUFBLENBQUErSyxJQUFBLENBQUFxakIsQ0FBQSxFQUFBdEMsQ0FBQSxnQ0FBQTF4QixPQUFBLENBQUEyQixDQUFBLFVBQUFBLENBQUEsWUFBQWdCLFNBQUEseUVBQUErdUIsQ0FBQSxHQUFBbkgsTUFBQSxHQUFBOWpCLE1BQUEsRUFBQXV0QixDQUFBO0FBQUEsU0FBQWtXLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFBQSxTQUFBL29DLGVBQUFrd0IsQ0FBQSxFQUFBOXJCLENBQUEsV0FBQTZrQyxlQUFBLENBQUEvWSxDQUFBLEtBQUFnWixxQkFBQSxDQUFBaFosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQStrQywyQkFBQSxDQUFBalosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQWdsQyxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUFqb0MsU0FBQTtBQUFBLFNBQUFnb0MsNEJBQUFqWixDQUFBLEVBQUFsUyxDQUFBLFFBQUFrUyxDQUFBLDJCQUFBQSxDQUFBLFNBQUFtWixpQkFBQSxDQUFBblosQ0FBQSxFQUFBbFMsQ0FBQSxPQUFBd1UsQ0FBQSxNQUFBblUsUUFBQSxDQUFBbFAsSUFBQSxDQUFBK2dCLENBQUEsRUFBQTFTLEtBQUEsNkJBQUFnVixDQUFBLElBQUF0QyxDQUFBLENBQUEzUCxXQUFBLEtBQUFpUyxDQUFBLEdBQUF0QyxDQUFBLENBQUEzUCxXQUFBLENBQUFnSSxJQUFBLGFBQUFpSyxDQUFBLGNBQUFBLENBQUEsR0FBQWh6QixLQUFBLENBQUFnaEIsSUFBQSxDQUFBMFAsQ0FBQSxvQkFBQXNDLENBQUEsK0NBQUFoSCxJQUFBLENBQUFnSCxDQUFBLElBQUE2VyxpQkFBQSxDQUFBblosQ0FBQSxFQUFBbFMsQ0FBQTtBQUFBLFNBQUFxckIsa0JBQUFuWixDQUFBLEVBQUFsUyxDQUFBLGFBQUFBLENBQUEsSUFBQUEsQ0FBQSxHQUFBa1MsQ0FBQSxDQUFBNXdCLE1BQUEsTUFBQTBlLENBQUEsR0FBQWtTLENBQUEsQ0FBQTV3QixNQUFBLFlBQUE4RSxDQUFBLE1BQUErZSxDQUFBLEdBQUEzakIsS0FBQSxDQUFBd2UsQ0FBQSxHQUFBNVosQ0FBQSxHQUFBNFosQ0FBQSxFQUFBNVosQ0FBQSxJQUFBK2UsQ0FBQSxDQUFBL2UsQ0FBQSxJQUFBOHJCLENBQUEsQ0FBQTlyQixDQUFBLFVBQUErZSxDQUFBO0FBQUEsU0FBQStsQixzQkFBQWhaLENBQUEsRUFBQUQsQ0FBQSxRQUFBdUMsQ0FBQSxXQUFBdEMsQ0FBQSxnQ0FBQXh2QixNQUFBLElBQUF3dkIsQ0FBQSxDQUFBeHZCLE1BQUEsQ0FBQUMsUUFBQSxLQUFBdXZCLENBQUEsNEJBQUFzQyxDQUFBLFFBQUFwdUIsQ0FBQSxFQUFBK2UsQ0FBQSxFQUFBaGpCLENBQUEsRUFBQTJ5QixDQUFBLEVBQUE5VSxDQUFBLE9BQUFyQixDQUFBLE9BQUE0VixDQUFBLGlCQUFBcHlCLENBQUEsSUFBQXF5QixDQUFBLEdBQUFBLENBQUEsQ0FBQXJqQixJQUFBLENBQUErZ0IsQ0FBQSxHQUFBcnZCLElBQUEsUUFBQW92QixDQUFBLFFBQUFqeEIsTUFBQSxDQUFBd3pCLENBQUEsTUFBQUEsQ0FBQSxVQUFBN1YsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBdlksQ0FBQSxHQUFBakUsQ0FBQSxDQUFBZ1AsSUFBQSxDQUFBcWpCLENBQUEsR0FBQTF4QixJQUFBLE1BQUFrZCxDQUFBLENBQUFqZCxJQUFBLENBQUFxRCxDQUFBLENBQUFwRCxLQUFBLEdBQUFnZCxDQUFBLENBQUExZSxNQUFBLEtBQUEyd0IsQ0FBQSxHQUFBdFQsQ0FBQSxpQkFBQXVULENBQUEsSUFBQXFDLENBQUEsT0FBQXBQLENBQUEsR0FBQStNLENBQUEseUJBQUF2VCxDQUFBLFlBQUE2VixDQUFBLENBQUEzckIsTUFBQSxLQUFBaXNCLENBQUEsR0FBQU4sQ0FBQSxDQUFBM3JCLE1BQUEsSUFBQTdILE1BQUEsQ0FBQTh6QixDQUFBLE1BQUFBLENBQUEsMkJBQUFQLENBQUEsUUFBQXBQLENBQUEsYUFBQW5GLENBQUE7QUFBQSxTQUFBaXJCLGdCQUFBL1ksQ0FBQSxRQUFBMXdCLEtBQUEsQ0FBQTBCLE9BQUEsQ0FBQWd2QixDQUFBLFVBQUFBLENBQUE7QUFEK0M7QUFDd0c7QUFDbkc7QUFDcEQsSUFBTTZlLFFBQVEsR0FBRztFQUNiQSxRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBQWpwQyxJQUFBLEVBQThCO0lBQUEsSUFBekJ1M0IsUUFBUSxHQUFBdjNCLElBQUEsQ0FBUnUzQixRQUFRO01BQUV2RixRQUFRLEdBQUFoeUIsSUFBQSxDQUFSZ3lCLFFBQVE7SUFDM0IsSUFBQXlZLFNBQUEsR0FBcUN6WSxRQUFRLENBQUMsQ0FBQztNQUExQmkxQyxTQUFTLEdBQUF4OEIsU0FBQSxDQUF0QndVLFNBQVMsQ0FBSWdvQixTQUFTO0lBQzlCLElBQUEzYyxVQUFBLEdBQW1Ddi9CLGlEQUFTLENBQUMsVUFBQTJsQixFQUFFO1FBQUEsT0FBSUEsRUFBRSxDQUFDaUosZ0JBQWdCLFlBQVk5VyxPQUFPO01BQUEsR0FBRW9rQyxTQUFTLENBQUM7TUFBQTFjLFdBQUEsR0FBQXJ3RCxjQUFBLENBQUFvd0QsVUFBQTtNQUE5RjRjLFFBQVEsR0FBQTNjLFdBQUE7TUFBRTRjLGNBQWMsR0FBQTVjLFdBQUE7SUFDL0JoekIsUUFBUSxDQUFDaVksc0VBQWtCLENBQUMsQ0FDeEJ5M0IsU0FBUyxDQUFDenRFLE1BQU0sR0FBR3MxQyw0RUFBd0IsQ0FBQ200QixTQUFTLENBQUMsR0FBRyxJQUFJLEVBQzdEQyxRQUFRLENBQUMxdEUsTUFBTSxHQUFHZzFDLHVFQUFtQixDQUFDMDRCLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFDdERDLGNBQWMsQ0FBQzN0RSxNQUFNLEdBQ2ZzMEMsd0VBQW9CLENBQUNxNUIsY0FBYyxDQUFDL2xFLEdBQUcsQ0FBQyxVQUFBc3ZDLEVBQUU7TUFBQSxPQUFJeDVCLGlEQUFLLENBQUMsaUJBQWlCLEVBQUV3NUIsRUFBRSxDQUFDaUosZ0JBQWdCLEVBQUVqSixFQUFFLENBQUM7SUFBQSxFQUFDLENBQUMsR0FDakcsSUFBSSxDQUNiLENBQUMsQ0FBQztJQUNIdzJCLFFBQVEsQ0FBQ3R0RSxPQUFPO01BQUEsSUFBQXFHLEtBQUEsR0FBQStpQyxpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQUMsU0FBQTBXLFFBQU9tTCxFQUFFO1FBQUEsSUFBQTdqQyxNQUFBLEVBQUF5L0MsVUFBQSxFQUFBOGEsT0FBQSxFQUFBeGlDLFlBQUEsRUFBQWtELGlCQUFBLEVBQUF1L0IsU0FBQTtRQUFBLE9BQUE1a0MsWUFBQSxHQUFBaGlDLENBQUEsV0FBQStrQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO1lBQUE7Y0FBQW1vQixRQUFBLENBQUFub0IsQ0FBQTtjQUFBLE9BQ0RxekIsRUFBRSxDQUFDaUosZ0JBQWdCO1lBQUE7Y0FBbEM5c0MsTUFBTSxHQUFBMjRCLFFBQUEsQ0FBQWxzQixDQUFBO2NBQUFnekMsVUFBQSxHQUNtRXQ2QixRQUFRLENBQUMsQ0FBQyxFQUFwRW8xQyxPQUFPLEdBQUE5YSxVQUFBLENBQXBCck4sU0FBUyxDQUFJbW9CLE9BQU8sRUFBSXhpQyxZQUFZLEdBQUEwbkIsVUFBQSxDQUFaMW5CLFlBQVksRUFBV2tELGlCQUFpQixHQUFBd2tCLFVBQUEsQ0FBMUIvbEIsS0FBSyxDQUFJdUIsaUJBQWlCO2NBQUEsTUFDcEVsRCxZQUFZLEtBQUtOLGdFQUFXLENBQUMsVUFBVSxDQUFDO2dCQUFBa0IsUUFBQSxDQUFBbm9CLENBQUE7Z0JBQUE7Y0FBQTtjQUFBLE9BQUFtb0IsUUFBQSxDQUFBdHRCLENBQUE7WUFBQTtjQUc1QyxJQUFJNHZCLGlCQUFpQixFQUFFO2dCQUNuQkEsaUJBQWlCLENBQUM0SSxFQUFFLENBQUNyVCxRQUFRLEVBQUV4d0IsTUFBTSxDQUFDO2NBQzFDO2NBQ0E7Y0FDQTtjQUNNdzZELFNBQVMsR0FBRzlyRCxpREFBSSxDQUFDLFVBQUErckQsR0FBRztnQkFBQSxPQUFJQSxHQUFHLEtBQUs1MkIsRUFBRSxJQUFJNDJCLEdBQUcsQ0FBQzN0QixnQkFBZ0IsS0FBS2pKLEVBQUUsQ0FBQ2lKLGdCQUFnQjtjQUFBLEdBQUV5dEIsT0FBTyxDQUFDO2NBQUEsSUFDN0ZDLFNBQVM7Z0JBQUE3aEMsUUFBQSxDQUFBbm9CLENBQUE7Z0JBQUE7Y0FBQTtjQUFBLE9BQUFtb0IsUUFBQSxDQUFBdHRCLENBQUE7WUFBQTtjQUdkO2NBQ0FxZixRQUFRLENBQUNpWSxzRUFBa0IsQ0FBQyxDQUN4QkYsMEVBQXNCLENBQUMsQ0FBQyszQixTQUFTLENBQUMsQ0FBQyxFQUNuQ3Y1Qix3RUFBb0IsQ0FBQyxDQUFBOUYsYUFBQSxDQUFBQSxhQUFBLEtBRVZxL0IsU0FBUztnQkFDWnRCLGVBQWUsRUFBRWw1RDtjQUFNLEdBRTlCLENBQUMsQ0FDTCxDQUFDLENBQUM7WUFBQztjQUFBLE9BQUEyNEIsUUFBQSxDQUFBdHRCLENBQUE7VUFBQTtRQUFBLEdBQUFxdEIsT0FBQTtNQUFBLENBQ1A7TUFBQSxpQkFBQXNHLEVBQUE7UUFBQSxPQUFBNXJDLEtBQUEsQ0FBQTRYLEtBQUEsT0FBQXRlLFNBQUE7TUFBQTtJQUFBLElBQUM7RUFDTixDQUFDO0VBQ0R5dEIsTUFBTSxFQUFFLENBQUMscUJBQXFCO0FBQ2xDLENBQUM7QUFDRCwrREFBZWlpQixRQUFROzs7Ozs7Ozs7Ozs7OztBQzNDa0M7QUFDTDtBQUNwRCxJQUFNQSxRQUFRLEdBQUc7RUFDYkEsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUFqcEMsSUFBQSxFQUE4QjtJQUFBLElBQXpCdTNCLFFBQVEsR0FBQXYzQixJQUFBLENBQVJ1M0IsUUFBUTtNQUFFdkYsUUFBUSxHQUFBaHlCLElBQUEsQ0FBUmd5QixRQUFRO0lBQzNCLElBQUF5WSxTQUFBLEdBQWlDelksUUFBUSxDQUFDLENBQUM7TUFBbkNpdEIsU0FBUyxHQUFBeFUsU0FBQSxDQUFUd1UsU0FBUztNQUFFMFQsU0FBUyxHQUFBbG9CLFNBQUEsQ0FBVGtvQixTQUFTO0lBQzVCLElBQU02VSxnQkFBZ0IsR0FBR0QscUVBQW1CLENBQUN0b0IsU0FBUyxDQUFDO0lBQ3ZELElBQU1sa0QsSUFBSSxHQUFHMjdCLE9BQU8sQ0FBQzh3QyxnQkFBZ0IsQ0FBQ2h1RSxNQUFNLENBQUM7SUFDN0MsSUFBSW01RCxTQUFTLEtBQUs1M0QsSUFBSSxFQUFFO01BQ3BCdzhCLFFBQVEsQ0FBQ2kyQixnRUFBWSxDQUFDenlELElBQUksQ0FBQyxDQUFDO0lBQ2hDO0VBQ0osQ0FBQztFQUNEaXNCLE1BQU0sRUFBRSxDQUFDLFdBQVc7QUFDeEIsQ0FBQztBQUNELCtEQUFlaWlCLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ1p2Qix1S0FBQTNxQyxDQUFBLEVBQUFvdUIsQ0FBQSxFQUFBdEMsQ0FBQSx3QkFBQXh2QixNQUFBLEdBQUFBLE1BQUEsT0FBQXlpQixDQUFBLEdBQUErTSxDQUFBLENBQUF2dkIsUUFBQSxrQkFBQTR4QixDQUFBLEdBQUFyQyxDQUFBLENBQUE2WCxXQUFBLDhCQUFBNW5DLEVBQUErdkIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTZtQixDQUFBLEdBQUE3RCxDQUFBLElBQUFBLENBQUEsQ0FBQXZTLFNBQUEsWUFBQW8zQixTQUFBLEdBQUE3a0IsQ0FBQSxHQUFBNmtCLFNBQUEsRUFBQWxWLENBQUEsR0FBQTl6QixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxDQUFBcFcsU0FBQSxVQUFBcTNCLG1CQUFBLENBQUFuVixDQUFBLHVCQUFBNUMsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxRQUFBcHlCLENBQUEsRUFBQTZtQixDQUFBLEVBQUE4TCxDQUFBLEVBQUFuVyxDQUFBLE1BQUFxRCxDQUFBLEdBQUF1UyxDQUFBLFFBQUF0ckIsQ0FBQSxPQUFBaWhDLENBQUEsS0FBQWxvQixDQUFBLEtBQUFtRCxDQUFBLEtBQUEvRCxDQUFBLEVBQUFoYixDQUFBLEVBQUE0WixDQUFBLEVBQUFtQixDQUFBLEVBQUF4QyxDQUFBLEVBQUF3QyxDQUFBLENBQUFqZ0IsSUFBQSxDQUFBa0YsQ0FBQSxNQUFBK2EsQ0FBQSxXQUFBQSxFQUFBcVQsQ0FBQSxFQUFBdEMsQ0FBQSxXQUFBL3ZCLENBQUEsR0FBQXF5QixDQUFBLEVBQUF4TCxDQUFBLE1BQUE4TCxDQUFBLEdBQUExdUIsQ0FBQSxFQUFBOGpDLENBQUEsQ0FBQS9rQixDQUFBLEdBQUErTSxDQUFBLEVBQUFsUyxDQUFBLGdCQUFBbUIsRUFBQStRLENBQUEsRUFBQS9NLENBQUEsU0FBQTZELENBQUEsR0FBQWtKLENBQUEsRUFBQTRDLENBQUEsR0FBQTNQLENBQUEsRUFBQXFQLENBQUEsT0FBQXZyQixDQUFBLElBQUEwVixDQUFBLEtBQUE0VixDQUFBLElBQUFDLENBQUEsR0FBQXhTLENBQUEsQ0FBQTFnQixNQUFBLEVBQUFrekIsQ0FBQSxVQUFBRCxDQUFBLEVBQUFweUIsQ0FBQSxHQUFBNmYsQ0FBQSxDQUFBd1MsQ0FBQSxHQUFBclQsQ0FBQSxHQUFBK29CLENBQUEsQ0FBQWxvQixDQUFBLEVBQUFpUSxDQUFBLEdBQUE5dkIsQ0FBQSxLQUFBK3ZCLENBQUEsUUFBQXFDLENBQUEsR0FBQXRDLENBQUEsS0FBQTlNLENBQUEsTUFBQTJQLENBQUEsR0FBQTN5QixDQUFBLEVBQUE2bUIsQ0FBQSxHQUFBN21CLENBQUEsWUFBQTZtQixDQUFBLFdBQUE3bUIsQ0FBQSxNQUFBQSxDQUFBLE1BQUFpRSxDQUFBLElBQUFqRSxDQUFBLE9BQUFnZixDQUFBLE1BQUFvVCxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvUSxDQUFBLEdBQUFoZixDQUFBLFFBQUE2bUIsQ0FBQSxNQUFBa2hCLENBQUEsQ0FBQTlvQixDQUFBLEdBQUErRCxDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQWhqQixDQUFBLE9BQUFnZixDQUFBLEdBQUE4USxDQUFBLEtBQUFzQyxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsSUFBQUEsQ0FBQSxHQUFBOE0sQ0FBQSxNQUFBOXZCLENBQUEsTUFBQSt2QixDQUFBLEVBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBOE0sQ0FBQSxFQUFBakosQ0FBQSxjQUFBdUwsQ0FBQSxJQUFBckMsQ0FBQSxhQUFBbFMsQ0FBQSxRQUFBL1csQ0FBQSxPQUFBa2MsQ0FBQSxxQkFBQW9QLENBQUEsRUFBQXZTLENBQUEsRUFBQWlRLENBQUEsUUFBQXRULENBQUEsWUFBQXhiLFNBQUEsdUNBQUE4RixDQUFBLFVBQUErWSxDQUFBLElBQUFiLENBQUEsQ0FBQWEsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBakosQ0FBQSxHQUFBaEgsQ0FBQSxFQUFBOFMsQ0FBQSxHQUFBN0MsQ0FBQSxHQUFBdUMsQ0FBQSxHQUFBeEwsQ0FBQSxPQUFBNWlCLENBQUEsR0FBQTB1QixDQUFBLE1BQUE3ckIsQ0FBQSxLQUFBOUcsQ0FBQSxLQUFBNm1CLENBQUEsR0FBQUEsQ0FBQSxRQUFBQSxDQUFBLFNBQUFraEIsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQWhFLENBQUEsQ0FBQTZILENBQUEsRUFBQThMLENBQUEsS0FBQW9WLENBQUEsQ0FBQS9rQixDQUFBLEdBQUEyUCxDQUFBLEdBQUFvVixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBMFQsQ0FBQSxhQUFBblcsQ0FBQSxNQUFBeGMsQ0FBQSxRQUFBNm1CLENBQUEsS0FBQXVMLENBQUEsWUFBQUMsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQW95QixDQUFBLFdBQUFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsRUFBQTJ5QixDQUFBLFVBQUEzeEIsU0FBQSwyQ0FBQXF4QixDQUFBLENBQUExeEIsSUFBQSxTQUFBMHhCLENBQUEsRUFBQU0sQ0FBQSxHQUFBTixDQUFBLENBQUF4eEIsS0FBQSxFQUFBZ21CLENBQUEsU0FBQUEsQ0FBQSxvQkFBQUEsQ0FBQSxLQUFBd0wsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQTBHLE1BQUEsS0FBQTJyQixDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxHQUFBNm1CLENBQUEsU0FBQThMLENBQUEsR0FBQTN4QixTQUFBLHVDQUFBb3hCLENBQUEsZ0JBQUF2TCxDQUFBLE9BQUE3bUIsQ0FBQSxHQUFBaUUsQ0FBQSxjQUFBb3VCLENBQUEsSUFBQXZyQixDQUFBLEdBQUFpaEMsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQTJQLENBQUEsR0FBQTVDLENBQUEsQ0FBQS9nQixJQUFBLENBQUFnVSxDQUFBLEVBQUEra0IsQ0FBQSxPQUFBbHFCLENBQUEsa0JBQUF3VSxDQUFBLElBQUFyeUIsQ0FBQSxHQUFBaUUsQ0FBQSxFQUFBNGlCLENBQUEsTUFBQThMLENBQUEsR0FBQU4sQ0FBQSxjQUFBN1YsQ0FBQSxtQkFBQTNiLEtBQUEsRUFBQXd4QixDQUFBLEVBQUExeEIsSUFBQSxFQUFBbUcsQ0FBQSxTQUFBaXBCLENBQUEsRUFBQXFDLENBQUEsRUFBQXB5QixDQUFBLFFBQUEyeUIsQ0FBQSxRQUFBOVUsQ0FBQSxnQkFBQWdxQixVQUFBLGNBQUFHLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE1VixDQUFBLEdBQUF4ekIsTUFBQSxDQUFBNGxCLGNBQUEsTUFBQW9DLENBQUEsTUFBQTdELENBQUEsSUFBQXFQLENBQUEsQ0FBQUEsQ0FBQSxJQUFBclAsQ0FBQSxTQUFBOGtCLG1CQUFBLENBQUF6VixDQUFBLE9BQUFyUCxDQUFBLGlDQUFBcVAsQ0FBQSxHQUFBTSxDQUFBLEdBQUFzViwwQkFBQSxDQUFBeDNCLFNBQUEsR0FBQW8zQixTQUFBLENBQUFwM0IsU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsWUFBQXJLLEVBQUF2WSxDQUFBLFdBQUFwRixNQUFBLENBQUFxcEMsY0FBQSxHQUFBcnBDLE1BQUEsQ0FBQXFwQyxjQUFBLENBQUFqa0MsQ0FBQSxFQUFBZ2tDLDBCQUFBLEtBQUFoa0MsQ0FBQSxDQUFBa2tDLFNBQUEsR0FBQUYsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUFtdUIsQ0FBQSx5QkFBQW51QixDQUFBLENBQUF3TSxTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBbU8sQ0FBQSxHQUFBMXVCLENBQUEsV0FBQStqQyxpQkFBQSxDQUFBdjNCLFNBQUEsR0FBQXczQiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBblYsQ0FBQSxpQkFBQXNWLDBCQUFBLEdBQUFILG1CQUFBLENBQUFHLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBelMsV0FBQSx3QkFBQXVTLG1CQUFBLENBQUFHLDBCQUFBLEVBQUE3VixDQUFBLHdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsR0FBQW1WLG1CQUFBLENBQUFuVixDQUFBLEVBQUFQLENBQUEsZ0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBM1AsQ0FBQSxpQ0FBQThrQixtQkFBQSxDQUFBblYsQ0FBQSw4REFBQXlWLFlBQUEsWUFBQUEsYUFBQSxhQUFBaGlDLENBQUEsRUFBQXBHLENBQUEsRUFBQXcwQixDQUFBLEVBQUFoWSxDQUFBO0FBQUEsU0FBQXNyQixvQkFBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBcnlCLENBQUEsR0FBQW5CLE1BQUEsQ0FBQXdSLGNBQUEsUUFBQXJRLENBQUEsdUJBQUFpRSxDQUFBLElBQUFqRSxDQUFBLFFBQUE4bkMsbUJBQUEsWUFBQU8sbUJBQUFwa0MsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXRDLENBQUEsRUFBQS92QixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLENBQUEsRUFBQThyQixDQUFBLElBQUFsdkIsS0FBQSxFQUFBbWlCLENBQUEsRUFBQTlTLFVBQUEsR0FBQW1pQixDQUFBLEVBQUFsaUIsWUFBQSxHQUFBa2lCLENBQUEsRUFBQWppQixRQUFBLEdBQUFpaUIsQ0FBQSxNQUFBcHVCLENBQUEsQ0FBQThyQixDQUFBLElBQUEvTSxDQUFBLFlBQUFvUCxDQUFBLFlBQUFBLEVBQUFyQyxDQUFBLEVBQUEvTSxDQUFBLElBQUE4a0IsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxZQUFBOXJCLENBQUEsZ0JBQUFxa0MsT0FBQSxDQUFBdlksQ0FBQSxFQUFBL00sQ0FBQSxFQUFBL2UsQ0FBQSxVQUFBbXVCLENBQUEsYUFBQUEsQ0FBQSxjQUFBQSxDQUFBLG9CQUFBMFYsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQTtBQUFBLFNBQUF3ZixRQUFBNXRDLENBQUEsRUFBQThyQixDQUFBLFFBQUFzQyxDQUFBLEdBQUF4ekIsTUFBQSxDQUFBWSxJQUFBLENBQUF3RSxDQUFBLE9BQUFwRixNQUFBLENBQUFpekMscUJBQUEsUUFBQTFmLENBQUEsR0FBQXZ6QixNQUFBLENBQUFpekMscUJBQUEsQ0FBQTd0QyxDQUFBLEdBQUE4ckIsQ0FBQSxLQUFBcUMsQ0FBQSxHQUFBQSxDQUFBLENBQUEzd0IsTUFBQSxXQUFBc3VCLENBQUEsV0FBQWx4QixNQUFBLENBQUFrekMsd0JBQUEsQ0FBQTl0QyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBN2YsVUFBQSxPQUFBbWlCLENBQUEsQ0FBQXp4QixJQUFBLENBQUE0YyxLQUFBLENBQUE2VSxDQUFBLEVBQUFELENBQUEsWUFBQUMsQ0FBQTtBQUFBLFNBQUFzYixjQUFBMXBDLENBQUEsYUFBQThyQixDQUFBLE1BQUFBLENBQUEsR0FBQTd3QixTQUFBLENBQUFDLE1BQUEsRUFBQTR3QixDQUFBLFVBQUFzQyxDQUFBLFdBQUFuekIsU0FBQSxDQUFBNndCLENBQUEsSUFBQTd3QixTQUFBLENBQUE2d0IsQ0FBQSxRQUFBQSxDQUFBLE9BQUE4aEIsT0FBQSxDQUFBaHpDLE1BQUEsQ0FBQXd6QixDQUFBLE9BQUE5eUIsT0FBQSxXQUFBd3dCLENBQUEsSUFBQTRlLGVBQUEsQ0FBQTFxQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBc0MsQ0FBQSxDQUFBdEMsQ0FBQSxTQUFBbHhCLE1BQUEsQ0FBQW16Qyx5QkFBQSxHQUFBbnpDLE1BQUEsQ0FBQWtSLGdCQUFBLENBQUE5TCxDQUFBLEVBQUFwRixNQUFBLENBQUFtekMseUJBQUEsQ0FBQTNmLENBQUEsS0FBQXdmLE9BQUEsQ0FBQWh6QyxNQUFBLENBQUF3ekIsQ0FBQSxHQUFBOXlCLE9BQUEsV0FBQXd3QixDQUFBLElBQUFseEIsTUFBQSxDQUFBd1IsY0FBQSxDQUFBcE0sQ0FBQSxFQUFBOHJCLENBQUEsRUFBQWx4QixNQUFBLENBQUFrekMsd0JBQUEsQ0FBQTFmLENBQUEsRUFBQXRDLENBQUEsaUJBQUE5ckIsQ0FBQTtBQUFBLFNBQUEwcUMsZ0JBQUExcUMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXNDLENBQUEsWUFBQXRDLENBQUEsR0FBQWtpQixjQUFBLENBQUFsaUIsQ0FBQSxNQUFBOXJCLENBQUEsR0FBQXBGLE1BQUEsQ0FBQXdSLGNBQUEsQ0FBQXBNLENBQUEsRUFBQThyQixDQUFBLElBQUFsdkIsS0FBQSxFQUFBd3hCLENBQUEsRUFBQW5pQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxVQUFBbk0sQ0FBQSxDQUFBOHJCLENBQUEsSUFBQXNDLENBQUEsRUFBQXB1QixDQUFBO0FBQUEsU0FBQWd1QyxlQUFBNWYsQ0FBQSxRQUFBcnlCLENBQUEsR0FBQWt5QyxZQUFBLENBQUE3ZixDQUFBLGdDQUFBaDBCLE9BQUEsQ0FBQTJCLENBQUEsSUFBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQWt5QyxhQUFBN2YsQ0FBQSxFQUFBdEMsQ0FBQSxvQkFBQTF4QixPQUFBLENBQUFnMEIsQ0FBQSxNQUFBQSxDQUFBLFNBQUFBLENBQUEsTUFBQXB1QixDQUFBLEdBQUFvdUIsQ0FBQSxDQUFBOXhCLE1BQUEsQ0FBQTR4QyxXQUFBLGtCQUFBbHVDLENBQUEsUUFBQWpFLENBQUEsR0FBQWlFLENBQUEsQ0FBQStLLElBQUEsQ0FBQXFqQixDQUFBLEVBQUF0QyxDQUFBLGdDQUFBMXhCLE9BQUEsQ0FBQTJCLENBQUEsVUFBQUEsQ0FBQSxZQUFBZ0IsU0FBQSx5RUFBQSt1QixDQUFBLEdBQUFuSCxNQUFBLEdBQUE5akIsTUFBQSxFQUFBdXRCLENBQUE7QUFBQSxTQUFBeHlCLGVBQUFrd0IsQ0FBQSxFQUFBOXJCLENBQUEsV0FBQTZrQyxlQUFBLENBQUEvWSxDQUFBLEtBQUFnWixxQkFBQSxDQUFBaFosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQStrQywyQkFBQSxDQUFBalosQ0FBQSxFQUFBOXJCLENBQUEsS0FBQWdsQyxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUFqb0MsU0FBQTtBQUFBLFNBQUErbkMsc0JBQUFoWixDQUFBLEVBQUFELENBQUEsUUFBQXVDLENBQUEsV0FBQXRDLENBQUEsZ0NBQUF4dkIsTUFBQSxJQUFBd3ZCLENBQUEsQ0FBQXh2QixNQUFBLENBQUFDLFFBQUEsS0FBQXV2QixDQUFBLDRCQUFBc0MsQ0FBQSxRQUFBcHVCLENBQUEsRUFBQStlLENBQUEsRUFBQWhqQixDQUFBLEVBQUEyeUIsQ0FBQSxFQUFBOVUsQ0FBQSxPQUFBckIsQ0FBQSxPQUFBNFYsQ0FBQSxpQkFBQXB5QixDQUFBLElBQUFxeUIsQ0FBQSxHQUFBQSxDQUFBLENBQUFyakIsSUFBQSxDQUFBK2dCLENBQUEsR0FBQXJ2QixJQUFBLFFBQUFvdkIsQ0FBQSxRQUFBanhCLE1BQUEsQ0FBQXd6QixDQUFBLE1BQUFBLENBQUEsVUFBQTdWLENBQUEsdUJBQUFBLENBQUEsSUFBQXZZLENBQUEsR0FBQWpFLENBQUEsQ0FBQWdQLElBQUEsQ0FBQXFqQixDQUFBLEdBQUExeEIsSUFBQSxNQUFBa2QsQ0FBQSxDQUFBamQsSUFBQSxDQUFBcUQsQ0FBQSxDQUFBcEQsS0FBQSxHQUFBZ2QsQ0FBQSxDQUFBMWUsTUFBQSxLQUFBMndCLENBQUEsR0FBQXRULENBQUEsaUJBQUF1VCxDQUFBLElBQUFxQyxDQUFBLE9BQUFwUCxDQUFBLEdBQUErTSxDQUFBLHlCQUFBdlQsQ0FBQSxZQUFBNlYsQ0FBQSxDQUFBM3JCLE1BQUEsS0FBQWlzQixDQUFBLEdBQUFOLENBQUEsQ0FBQTNyQixNQUFBLElBQUE3SCxNQUFBLENBQUE4ekIsQ0FBQSxNQUFBQSxDQUFBLDJCQUFBUCxDQUFBLFFBQUFwUCxDQUFBLGFBQUFuRixDQUFBO0FBQUEsU0FBQWlyQixnQkFBQS9ZLENBQUEsUUFBQTF3QixLQUFBLENBQUEwQixPQUFBLENBQUFndkIsQ0FBQSxVQUFBQSxDQUFBO0FBQUEsU0FBQXdZLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFBQSxTQUFBaFAsbUJBQUE3SixDQUFBLFdBQUEyaEIsa0JBQUEsQ0FBQTNoQixDQUFBLEtBQUE0aEIsZ0JBQUEsQ0FBQTVoQixDQUFBLEtBQUFpWiwyQkFBQSxDQUFBalosQ0FBQSxLQUFBNmhCLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQTV3QyxTQUFBO0FBQUEsU0FBQWdvQyw0QkFBQWpaLENBQUEsRUFBQWxTLENBQUEsUUFBQWtTLENBQUEsMkJBQUFBLENBQUEsU0FBQW1aLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBLE9BQUF3VSxDQUFBLE1BQUFuVSxRQUFBLENBQUFsUCxJQUFBLENBQUErZ0IsQ0FBQSxFQUFBMVMsS0FBQSw2QkFBQWdWLENBQUEsSUFBQXRDLENBQUEsQ0FBQTNQLFdBQUEsS0FBQWlTLENBQUEsR0FBQXRDLENBQUEsQ0FBQTNQLFdBQUEsQ0FBQWdJLElBQUEsYUFBQWlLLENBQUEsY0FBQUEsQ0FBQSxHQUFBaHpCLEtBQUEsQ0FBQWdoQixJQUFBLENBQUEwUCxDQUFBLG9CQUFBc0MsQ0FBQSwrQ0FBQWhILElBQUEsQ0FBQWdILENBQUEsSUFBQTZXLGlCQUFBLENBQUFuWixDQUFBLEVBQUFsUyxDQUFBO0FBQUEsU0FBQTh6QixpQkFBQTVoQixDQUFBLDhCQUFBeHZCLE1BQUEsWUFBQXd2QixDQUFBLENBQUF4dkIsTUFBQSxDQUFBQyxRQUFBLGFBQUF1dkIsQ0FBQSx1QkFBQTF3QixLQUFBLENBQUFnaEIsSUFBQSxDQUFBMFAsQ0FBQTtBQUFBLFNBQUEyaEIsbUJBQUEzaEIsQ0FBQSxRQUFBMXdCLEtBQUEsQ0FBQTBCLE9BQUEsQ0FBQWd2QixDQUFBLFVBQUFtWixpQkFBQSxDQUFBblosQ0FBQTtBQUFBLFNBQUFtWixrQkFBQW5aLENBQUEsRUFBQWxTLENBQUEsYUFBQUEsQ0FBQSxJQUFBQSxDQUFBLEdBQUFrUyxDQUFBLENBQUE1d0IsTUFBQSxNQUFBMGUsQ0FBQSxHQUFBa1MsQ0FBQSxDQUFBNXdCLE1BQUEsWUFBQThFLENBQUEsTUFBQStlLENBQUEsR0FBQTNqQixLQUFBLENBQUF3ZSxDQUFBLEdBQUE1WixDQUFBLEdBQUE0WixDQUFBLEVBQUE1WixDQUFBLElBQUErZSxDQUFBLENBQUEvZSxDQUFBLElBQUE4ckIsQ0FBQSxDQUFBOXJCLENBQUEsVUFBQStlLENBQUE7QUFENEQ7QUFDK0c7QUFDckg7QUFDUTtBQUNmO0FBQ0s7QUFDcEQsSUFBTXFxRCxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSUMsRUFBRSxFQUFFQyxFQUFFLEVBQUs7RUFBQSxJQUFBQyxZQUFBLEVBQUFDLFlBQUE7RUFDN0IsT0FBTyxFQUFBRCxZQUFBLEdBQUNGLEVBQUUsQ0FBQ3ZlLFFBQVEsY0FBQXllLFlBQUEsY0FBQUEsWUFBQSxHQUFJLEVBQUUsTUFBQUMsWUFBQSxHQUFLRixFQUFFLENBQUN4ZSxRQUFRLGNBQUEwZSxZQUFBLGNBQUFBLFlBQUEsR0FBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzdELENBQUM7QUFDRCxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSXIzQixFQUFFLEVBQUVYLEtBQUssRUFBSztFQUM1QixJQUFROFksVUFBVSxHQUFLblksRUFBRSxDQUFqQm1ZLFVBQVU7RUFDbEIsSUFBTXRQLFVBQVUsR0FBR3NQLFVBQVUsQ0FBQzlZLEtBQUssQ0FBQztFQUNwQyxJQUFNaTRCLFdBQVcsR0FBR3BzRCxpREFBTyxDQUFDMjlCLFVBQVUsQ0FBQztFQUN2QyxJQUFNMHVCLFVBQVUsR0FBRyxFQUFFO0VBQ3JCLElBQU1DLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDakJGLFdBQVcsQ0FBQ3B1RSxPQUFPLENBQUMsVUFBQW9HLElBQUEsRUFBc0I7SUFBQSxJQUFuQnBFLEVBQUUsR0FBQW9FLElBQUEsQ0FBRnBFLEVBQUU7TUFBRTIwQyxRQUFRLEdBQUF2d0MsSUFBQSxDQUFSdXdDLFFBQVE7SUFDL0IsSUFBTStELEtBQUssR0FBRzFILGtFQUFXLENBQUNoeEMsRUFBRSxDQUFDO0lBQzdCLElBQU11c0UsS0FBSyxHQUFJRCxNQUFNLENBQUM1ekIsS0FBSyxDQUFDLEdBQUc0ekIsTUFBTSxDQUFDNXpCLEtBQUssQ0FBQyxJQUFJLEVBQUc7SUFDbkQ2ekIsS0FBSyxDQUFDbHRFLElBQUksQ0FBQ3MxQyxRQUFRLENBQUM7SUFDcEIwM0IsVUFBVSxDQUFDaHRFLElBQUksQ0FBQ3NoRCwwRUFBZ0IsQ0FBQztNQUFFM2dELEVBQUUsRUFBRTA0QyxLQUFLO01BQUUvRDtJQUFTLENBQUMsQ0FBQyxDQUFDO0VBQzlELENBQUMsQ0FBQztFQUNGLE9BQU87SUFBRWdKLFVBQVU7SUFBRTB1QjtFQUFXLENBQUM7QUFDckMsQ0FBQztBQUNELElBQU1HLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJMTNCLEVBQUUsRUFBRVgsS0FBSyxFQUFLO0VBQzFCLElBQU1zNEIsS0FBSyxNQUFBN3ZELE1BQUEsQ0FBQXliLGtCQUFBLENBQ0pyWSxpREFBTyxDQUFDODBCLEVBQUUsQ0FBQ0csU0FBUyxDQUFDZCxLQUFLLENBQUMsQ0FBQyxHQUFBOWIsa0JBQUEsQ0FDNUJyWSxpREFBTyxDQUFDODBCLEVBQUUsQ0FBQzFlLFFBQVEsQ0FBQytkLEtBQUssQ0FBQyxDQUFDLEVBQ2pDO0VBQ0QsSUFBTXU0QixTQUFTLEdBQUcsSUFBSXQ3RCxHQUFHLENBQUNxN0QsS0FBSyxDQUFDam5FLEdBQUcsQ0FBQyxVQUFBQyxJQUFJO0lBQUEsT0FBSSxDQUFDdXJDLGtFQUFXLENBQUN2ckMsSUFBSSxDQUFDekYsRUFBRSxDQUFDLEVBQUV5RixJQUFJLENBQUM7RUFBQSxFQUFDLENBQUM7RUFDMUUsSUFBTWtuRSxXQUFXLEdBQUc3dUUsS0FBSyxDQUFDZ2hCLElBQUksQ0FBQzR0RCxTQUFTLENBQUMxbEQsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNsRCxPQUFPMmxELFdBQVc7QUFDdEIsQ0FBQztBQUNELElBQU10L0IsUUFBUSxHQUFHO0VBQ2JBLFFBQVE7SUFBQSxJQUFBdS9CLFNBQUEsR0FBQXhsQyxpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQUUsU0FBQW1qQixTQUFBL3hDLEtBQUE7TUFBQSxJQUFBczNCLFFBQUEsRUFBQXZGLFFBQUEsRUFBQXlZLFNBQUEsRUFBQWcrQixtQkFBQSxFQUFBeEIsU0FBQSxFQUFBRyxPQUFBLEVBQUF2aUMsTUFBQSxFQUFBMEIsS0FBQSxFQUFBaGlDLE1BQUEsRUFBQXdyQyxLQUFBLEVBQUFuTCxZQUFBLEVBQUEwbkIsVUFBQSxFQUFBb2MsV0FBQSxFQUFBQyxTQUFBLEVBQUFyZSxVQUFBLEVBQUFDLFdBQUEsRUFBQXFlLGFBQUEsRUFBQUMsY0FBQSxFQUFBQyxtQkFBQSxFQUFBQyxvQkFBQSxFQUFBN0IsUUFBQTtNQUFBLE9BQUF6a0MsWUFBQSxHQUFBaGlDLENBQUEsV0FBQWc2QyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXA5QixDQUFBO1VBQUE7WUFBU2thLFFBQVEsR0FBQXQzQixLQUFBLENBQVJzM0IsUUFBUSxFQUFFdkYsUUFBUSxHQUFBL3hCLEtBQUEsQ0FBUit4QixRQUFRO1lBQUF5WSxTQUFBLEdBQ3lEelksUUFBUSxDQUFDLENBQUMsRUFBQXkyQyxtQkFBQSxHQUFBaCtCLFNBQUEsQ0FBNUZ3VSxTQUFTLEVBQUlnb0IsU0FBUyxHQUFBd0IsbUJBQUEsQ0FBVHhCLFNBQVMsRUFBRUcsT0FBTyxHQUFBcUIsbUJBQUEsQ0FBUHJCLE9BQU8sRUFBSXZpQyxNQUFNLEdBQUE0RixTQUFBLENBQU41RixNQUFNLEVBQUUwQixLQUFLLEdBQUFrRSxTQUFBLENBQUxsRSxLQUFLLEVBQUVoaUMsTUFBTSxHQUFBa21DLFNBQUEsQ0FBTmxtQyxNQUFNLEVBQUV3ckMsS0FBSyxHQUFBdEYsU0FBQSxDQUFMc0YsS0FBSyxFQUFFbkwsWUFBWSxHQUFBNkYsU0FBQSxDQUFaN0YsWUFBWTtZQUFBMG5CLFVBQUEsR0FDaER0NkIsUUFBUSxDQUFDLENBQUMsRUFBNUIwMkMsV0FBVyxHQUFBcGMsVUFBQSxDQUF4QnJOLFNBQVMsQ0FBSXlwQixXQUFXO1lBQUEsTUFDMUI5akMsWUFBWSxLQUFLTixnRUFBVyxDQUFDLFVBQVUsQ0FBQztjQUFBbVcsU0FBQSxDQUFBcDlCLENBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQW85QixTQUFBLENBQUF2aUMsQ0FBQTtVQUFBO1lBR3RDeXdELFNBQVMsR0FBRy8zRCxJQUFJLENBQUMrSCxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBR3N1RCxTQUFTLENBQUN6dEUsTUFBTSxHQUFHNHRFLE9BQU8sQ0FBQzV0RSxNQUFNLENBQUMsRUFDckU7WUFDQWt2RSxXQUFXLEdBQUdqakQsaURBQUksQ0FBQ2lpRCxZQUFZLEVBQUVnQixXQUFXLENBQUM7WUFDN0M7WUFBQXBlLFVBQUEsR0FDd0N2L0IsaURBQVMsQ0FBQyxVQUFBMmxCLEVBQUU7Y0FBQSxPQUFJKzJCLCtEQUFVLENBQUNsakUsTUFBTSxFQUFFd3JDLEtBQUssRUFBRXE0QixNQUFNLENBQUMxM0IsRUFBRSxFQUFFWCxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFBQSxHQUFFMjRCLFdBQVcsQ0FBQyxFQUFBbmUsV0FBQSxHQUFBcndELGNBQUEsQ0FBQW93RCxVQUFBLE1BQXBIc2UsYUFBYSxHQUFBcmUsV0FBQSxLQUFFc2UsY0FBYyxHQUFBdGUsV0FBQTtZQUM5QnVlLG1CQUFtQixHQUFHRixhQUFhLENBQUNseEQsS0FBSyxDQUFDLENBQUMsRUFBRWl4RCxTQUFTLENBQUM7WUFDdkRJLG9CQUFvQixHQUFHRixjQUFjLENBQUNueEQsS0FBSyxDQUFDLENBQUMsRUFBRWl4RCxTQUFTLEdBQUdHLG1CQUFtQixDQUFDdHZFLE1BQU0sQ0FBQztZQUM1RixJQUFJc3ZFLG1CQUFtQixDQUFDdHZFLE1BQU0sRUFBRTtjQUM1Qis5QixRQUFRLENBQUNpWSxzRUFBa0IsQ0FBQyxDQUN4QlIsOEVBQTBCLENBQUM4NUIsbUJBQW1CLENBQUMsRUFDL0M5NkIseUVBQXFCLENBQUM1c0MsaURBQUcsQ0FBQyxVQUFBc3ZDLEVBQUU7Z0JBQUEsT0FBSTJJLG1FQUFlLENBQUMzSSxFQUFFLEVBQUU3TCxNQUFNLEVBQUUwQixLQUFLLEVBQUV3SixLQUFLLEVBQUV4ckMsTUFBTSxFQUFFd2pFLFFBQVEsQ0FBQ3IzQixFQUFFLEVBQUVYLEtBQUssQ0FBQyxFQUFFeFksUUFBUSxFQUFFdkYsUUFBUSxDQUFDO2NBQUEsR0FBRTgyQyxtQkFBbUIsQ0FBQyxDQUFDLENBQ3BKLENBQUMsQ0FBQztZQUNQO1lBQ0EsSUFBSUMsb0JBQW9CLENBQUN2dkUsTUFBTSxFQUFFO2NBQ3ZCMHRFLFFBQVEsR0FBRzlsRSxpREFBRyxDQUFDLFVBQUFzdkMsRUFBRTtnQkFBQSxPQUFBMUksYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsS0FDaEIwSSxFQUFFLEdBQ0ZxM0IsUUFBUSxDQUFDcjNCLEVBQUUsRUFBRVgsS0FBSyxDQUFDO2tCQUN0QmlkLE9BQU8sRUFBRXlhLCtEQUFVLENBQUNsakUsTUFBTSxFQUFFd3JDLEtBQUssRUFBRXE0QixNQUFNLENBQUMxM0IsRUFBRSxFQUFFWCxLQUFLLENBQUM7Z0JBQUM7Y0FBQSxDQUN2RCxFQUFFZzVCLG9CQUFvQixDQUFDO2NBQ3pCeHhDLFFBQVEsQ0FBQ2lZLHNFQUFrQixDQUFDLENBQ3hCUiw4RUFBMEIsQ0FBQys1QixvQkFBb0IsQ0FBQyxFQUNoRHI3Qix1RUFBbUIsQ0FBQ3c1QixRQUFRLENBQUMsQ0FDaEMsQ0FBQyxDQUFDO2NBQ0hBLFFBQVEsQ0FBQ3R0RSxPQUFPO2dCQUFBLElBQUEwN0MsS0FBQSxHQUFBdFMsaUJBQUEsY0FBQVAsWUFBQSxHQUFBNVQsQ0FBQSxDQUFDLFNBQUEwVyxRQUFPbUwsRUFBRTtrQkFBQSxJQUFBa2MsVUFBQSxFQUFBb2MsT0FBQSxFQUFBM0IsU0FBQSxFQUFBNEIsaUJBQUE7a0JBQUEsT0FBQXhtQyxZQUFBLEdBQUFoaUMsQ0FBQSxXQUFBK2tDLFFBQUE7b0JBQUEsa0JBQUFBLFFBQUEsQ0FBQW5vQixDQUFBO3NCQUFBO3dCQUFBbW9CLFFBQUEsQ0FBQW5vQixDQUFBO3dCQUFBLE9BQ2hCcXpCLEVBQUUsQ0FBQ3NjLE9BQU87c0JBQUE7d0JBQUFKLFVBQUEsR0FDbUI1NkIsUUFBUSxDQUFDLENBQUMsRUFBeEJnM0MsT0FBTyxHQUFBcGMsVUFBQSxDQUFwQjNOLFNBQVMsQ0FBSStwQixPQUFPLEVBQzVCO3dCQUNBO3dCQUNBO3dCQUNBO3dCQUNNM0IsU0FBUyxHQUFHOXJELGlEQUFJLENBQUMsVUFBQStyRCxHQUFHOzBCQUFBLE9BQUlBLEdBQUcsS0FBSzUyQixFQUFFLElBQUk0MkIsR0FBRyxDQUFDdGEsT0FBTyxLQUFLdGMsRUFBRSxDQUFDc2MsT0FBTzt3QkFBQSxHQUFFZ2MsT0FBTyxDQUFDO3dCQUFBLElBQzNFM0IsU0FBUzswQkFBQTdoQyxRQUFBLENBQUFub0IsQ0FBQTswQkFBQTt3QkFBQTt3QkFBQSxPQUFBbW9CLFFBQUEsQ0FBQXR0QixDQUFBO3NCQUFBO3dCQUdSK3dELGlCQUFpQixHQUFHNXZCLG1FQUFlLENBQUMzSSxFQUFFLEVBQUU3TCxNQUFNLEVBQUUwQixLQUFLLEVBQUV3SixLQUFLLEVBQUV4ckMsTUFBTSxFQUFFbXNDLEVBQUUsRUFBRW5aLFFBQVEsRUFBRXZGLFFBQVEsQ0FBQzt3QkFDbkd1RixRQUFRLENBQUNpWSxzRUFBa0IsQ0FBQyxDQUN4QlosMEVBQXNCLENBQUMsQ0FBQzhCLEVBQUUsQ0FBQyxDQUFDLEVBQzVCMUMseUVBQXFCLENBQUMsQ0FBQ2k3QixpQkFBaUIsQ0FBQyxDQUFDLENBQzdDLENBQUMsQ0FBQztzQkFBQzt3QkFBQSxPQUFBempDLFFBQUEsQ0FBQXR0QixDQUFBO29CQUFBO2tCQUFBLEdBQUFxdEIsT0FBQTtnQkFBQSxDQUNQO2dCQUFBLGlCQUFBdUcsR0FBQTtrQkFBQSxPQUFBd0osS0FBQSxDQUFBejlCLEtBQUEsT0FBQXRlLFNBQUE7Z0JBQUE7Y0FBQSxJQUFDO1lBQ047VUFBQztZQUFBLE9BQUFraEQsU0FBQSxDQUFBdmlDLENBQUE7UUFBQTtNQUFBLEdBQUE4NUIsUUFBQTtJQUFBLENBQ0o7SUFBQSxTQS9DRC9JLFFBQVFBLENBQUE0QyxFQUFBO01BQUEsT0FBQTI4QixTQUFBLENBQUEzd0QsS0FBQSxPQUFBdGUsU0FBQTtJQUFBO0lBQUEsT0FBUjB2QyxRQUFRO0VBQUEsR0ErQ1A7RUFDRGppQixNQUFNLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUI7QUFDM0QsQ0FBQztBQUNELCtEQUFlaWlCLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQ2xGdkIsdUtBQUEzcUMsQ0FBQSxFQUFBb3VCLENBQUEsRUFBQXRDLENBQUEsd0JBQUF4dkIsTUFBQSxHQUFBQSxNQUFBLE9BQUF5aUIsQ0FBQSxHQUFBK00sQ0FBQSxDQUFBdnZCLFFBQUEsa0JBQUE0eEIsQ0FBQSxHQUFBckMsQ0FBQSxDQUFBNlgsV0FBQSw4QkFBQTVuQyxFQUFBK3ZCLENBQUEsRUFBQS9NLENBQUEsRUFBQW9QLENBQUEsRUFBQXB5QixDQUFBLFFBQUE2bUIsQ0FBQSxHQUFBN0QsQ0FBQSxJQUFBQSxDQUFBLENBQUF2UyxTQUFBLFlBQUFvM0IsU0FBQSxHQUFBN2tCLENBQUEsR0FBQTZrQixTQUFBLEVBQUFsVixDQUFBLEdBQUE5ekIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsQ0FBQXBXLFNBQUEsVUFBQXEzQixtQkFBQSxDQUFBblYsQ0FBQSx1QkFBQTVDLENBQUEsRUFBQS9NLENBQUEsRUFBQW9QLENBQUEsUUFBQXB5QixDQUFBLEVBQUE2bUIsQ0FBQSxFQUFBOEwsQ0FBQSxFQUFBblcsQ0FBQSxNQUFBcUQsQ0FBQSxHQUFBdVMsQ0FBQSxRQUFBdHJCLENBQUEsT0FBQWloQyxDQUFBLEtBQUFsb0IsQ0FBQSxLQUFBbUQsQ0FBQSxLQUFBL0QsQ0FBQSxFQUFBaGIsQ0FBQSxFQUFBNFosQ0FBQSxFQUFBbUIsQ0FBQSxFQUFBeEMsQ0FBQSxFQUFBd0MsQ0FBQSxDQUFBamdCLElBQUEsQ0FBQWtGLENBQUEsTUFBQSthLENBQUEsV0FBQUEsRUFBQXFULENBQUEsRUFBQXRDLENBQUEsV0FBQS92QixDQUFBLEdBQUFxeUIsQ0FBQSxFQUFBeEwsQ0FBQSxNQUFBOEwsQ0FBQSxHQUFBMXVCLENBQUEsRUFBQThqQyxDQUFBLENBQUEva0IsQ0FBQSxHQUFBK00sQ0FBQSxFQUFBbFMsQ0FBQSxnQkFBQW1CLEVBQUErUSxDQUFBLEVBQUEvTSxDQUFBLFNBQUE2RCxDQUFBLEdBQUFrSixDQUFBLEVBQUE0QyxDQUFBLEdBQUEzUCxDQUFBLEVBQUFxUCxDQUFBLE9BQUF2ckIsQ0FBQSxJQUFBMFYsQ0FBQSxLQUFBNFYsQ0FBQSxJQUFBQyxDQUFBLEdBQUF4UyxDQUFBLENBQUExZ0IsTUFBQSxFQUFBa3pCLENBQUEsVUFBQUQsQ0FBQSxFQUFBcHlCLENBQUEsR0FBQTZmLENBQUEsQ0FBQXdTLENBQUEsR0FBQXJULENBQUEsR0FBQStvQixDQUFBLENBQUFsb0IsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBOXZCLENBQUEsS0FBQSt2QixDQUFBLFFBQUFxQyxDQUFBLEdBQUF0QyxDQUFBLEtBQUE5TSxDQUFBLE1BQUEyUCxDQUFBLEdBQUEzeUIsQ0FBQSxFQUFBNm1CLENBQUEsR0FBQTdtQixDQUFBLFlBQUE2bUIsQ0FBQSxXQUFBN21CLENBQUEsTUFBQUEsQ0FBQSxNQUFBaUUsQ0FBQSxJQUFBakUsQ0FBQSxPQUFBZ2YsQ0FBQSxNQUFBb1QsQ0FBQSxHQUFBckMsQ0FBQSxRQUFBL1EsQ0FBQSxHQUFBaGYsQ0FBQSxRQUFBNm1CLENBQUEsTUFBQWtoQixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBK0QsQ0FBQSxFQUFBK2tCLENBQUEsQ0FBQS9rQixDQUFBLEdBQUFoakIsQ0FBQSxPQUFBZ2YsQ0FBQSxHQUFBOFEsQ0FBQSxLQUFBc0MsQ0FBQSxHQUFBckMsQ0FBQSxRQUFBL3ZCLENBQUEsTUFBQWdqQixDQUFBLElBQUFBLENBQUEsR0FBQThNLENBQUEsTUFBQTl2QixDQUFBLE1BQUErdkIsQ0FBQSxFQUFBL3ZCLENBQUEsTUFBQWdqQixDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQThNLENBQUEsRUFBQWpKLENBQUEsY0FBQXVMLENBQUEsSUFBQXJDLENBQUEsYUFBQWxTLENBQUEsUUFBQS9XLENBQUEsT0FBQWtjLENBQUEscUJBQUFvUCxDQUFBLEVBQUF2UyxDQUFBLEVBQUFpUSxDQUFBLFFBQUF0VCxDQUFBLFlBQUF4YixTQUFBLHVDQUFBOEYsQ0FBQSxVQUFBK1ksQ0FBQSxJQUFBYixDQUFBLENBQUFhLENBQUEsRUFBQWlRLENBQUEsR0FBQWpKLENBQUEsR0FBQWhILENBQUEsRUFBQThTLENBQUEsR0FBQTdDLENBQUEsR0FBQXVDLENBQUEsR0FBQXhMLENBQUEsT0FBQTVpQixDQUFBLEdBQUEwdUIsQ0FBQSxNQUFBN3JCLENBQUEsS0FBQTlHLENBQUEsS0FBQTZtQixDQUFBLEdBQUFBLENBQUEsUUFBQUEsQ0FBQSxTQUFBa2hCLENBQUEsQ0FBQS9rQixDQUFBLFFBQUFoRSxDQUFBLENBQUE2SCxDQUFBLEVBQUE4TCxDQUFBLEtBQUFvVixDQUFBLENBQUEva0IsQ0FBQSxHQUFBMlAsQ0FBQSxHQUFBb1YsQ0FBQSxDQUFBOW9CLENBQUEsR0FBQTBULENBQUEsYUFBQW5XLENBQUEsTUFBQXhjLENBQUEsUUFBQTZtQixDQUFBLEtBQUF1TCxDQUFBLFlBQUFDLENBQUEsR0FBQXJ5QixDQUFBLENBQUFveUIsQ0FBQSxXQUFBQyxDQUFBLEdBQUFBLENBQUEsQ0FBQXJqQixJQUFBLENBQUFoUCxDQUFBLEVBQUEyeUIsQ0FBQSxVQUFBM3hCLFNBQUEsMkNBQUFxeEIsQ0FBQSxDQUFBMXhCLElBQUEsU0FBQTB4QixDQUFBLEVBQUFNLENBQUEsR0FBQU4sQ0FBQSxDQUFBeHhCLEtBQUEsRUFBQWdtQixDQUFBLFNBQUFBLENBQUEsb0JBQUFBLENBQUEsS0FBQXdMLENBQUEsR0FBQXJ5QixDQUFBLENBQUEwRyxNQUFBLEtBQUEyckIsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsR0FBQTZtQixDQUFBLFNBQUE4TCxDQUFBLEdBQUEzeEIsU0FBQSx1Q0FBQW94QixDQUFBLGdCQUFBdkwsQ0FBQSxPQUFBN21CLENBQUEsR0FBQWlFLENBQUEsY0FBQW91QixDQUFBLElBQUF2ckIsQ0FBQSxHQUFBaWhDLENBQUEsQ0FBQS9rQixDQUFBLFFBQUEyUCxDQUFBLEdBQUE1QyxDQUFBLENBQUEvZ0IsSUFBQSxDQUFBZ1UsQ0FBQSxFQUFBK2tCLENBQUEsT0FBQWxxQixDQUFBLGtCQUFBd1UsQ0FBQSxJQUFBcnlCLENBQUEsR0FBQWlFLENBQUEsRUFBQTRpQixDQUFBLE1BQUE4TCxDQUFBLEdBQUFOLENBQUEsY0FBQTdWLENBQUEsbUJBQUEzYixLQUFBLEVBQUF3eEIsQ0FBQSxFQUFBMXhCLElBQUEsRUFBQW1HLENBQUEsU0FBQWlwQixDQUFBLEVBQUFxQyxDQUFBLEVBQUFweUIsQ0FBQSxRQUFBMnlCLENBQUEsUUFBQTlVLENBQUEsZ0JBQUFncUIsVUFBQSxjQUFBRyxrQkFBQSxjQUFBQywyQkFBQSxLQUFBNVYsQ0FBQSxHQUFBeHpCLE1BQUEsQ0FBQTRsQixjQUFBLE1BQUFvQyxDQUFBLE1BQUE3RCxDQUFBLElBQUFxUCxDQUFBLENBQUFBLENBQUEsSUFBQXJQLENBQUEsU0FBQThrQixtQkFBQSxDQUFBelYsQ0FBQSxPQUFBclAsQ0FBQSxpQ0FBQXFQLENBQUEsR0FBQU0sQ0FBQSxHQUFBc1YsMEJBQUEsQ0FBQXgzQixTQUFBLEdBQUFvM0IsU0FBQSxDQUFBcDNCLFNBQUEsR0FBQTVSLE1BQUEsQ0FBQTJsQixNQUFBLENBQUFxQyxDQUFBLFlBQUFySyxFQUFBdlksQ0FBQSxXQUFBcEYsTUFBQSxDQUFBcXBDLGNBQUEsR0FBQXJwQyxNQUFBLENBQUFxcEMsY0FBQSxDQUFBamtDLENBQUEsRUFBQWdrQywwQkFBQSxLQUFBaGtDLENBQUEsQ0FBQWtrQyxTQUFBLEdBQUFGLDBCQUFBLEVBQUFILG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBbXVCLENBQUEseUJBQUFudUIsQ0FBQSxDQUFBd00sU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQW1PLENBQUEsR0FBQTF1QixDQUFBLFdBQUErakMsaUJBQUEsQ0FBQXYzQixTQUFBLEdBQUF3M0IsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQW5WLENBQUEsaUJBQUFzViwwQkFBQSxHQUFBSCxtQkFBQSxDQUFBRywwQkFBQSxpQkFBQUQsaUJBQUEsR0FBQUEsaUJBQUEsQ0FBQXpTLFdBQUEsd0JBQUF1UyxtQkFBQSxDQUFBRywwQkFBQSxFQUFBN1YsQ0FBQSx3QkFBQTBWLG1CQUFBLENBQUFuVixDQUFBLEdBQUFtVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBUCxDQUFBLGdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsRUFBQTNQLENBQUEsaUNBQUE4a0IsbUJBQUEsQ0FBQW5WLENBQUEsOERBQUF5VixZQUFBLFlBQUFBLGFBQUEsYUFBQWhpQyxDQUFBLEVBQUFwRyxDQUFBLEVBQUF3MEIsQ0FBQSxFQUFBaFksQ0FBQTtBQUFBLFNBQUFzckIsb0JBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXJ5QixDQUFBLEdBQUFuQixNQUFBLENBQUF3UixjQUFBLFFBQUFyUSxDQUFBLHVCQUFBaUUsQ0FBQSxJQUFBakUsQ0FBQSxRQUFBOG5DLG1CQUFBLFlBQUFPLG1CQUFBcGtDLENBQUEsRUFBQThyQixDQUFBLEVBQUEvTSxDQUFBLEVBQUFxUCxDQUFBLFFBQUF0QyxDQUFBLEVBQUEvdkIsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxDQUFBLEVBQUE4ckIsQ0FBQSxJQUFBbHZCLEtBQUEsRUFBQW1pQixDQUFBLEVBQUE5UyxVQUFBLEdBQUFtaUIsQ0FBQSxFQUFBbGlCLFlBQUEsR0FBQWtpQixDQUFBLEVBQUFqaUIsUUFBQSxHQUFBaWlCLENBQUEsTUFBQXB1QixDQUFBLENBQUE4ckIsQ0FBQSxJQUFBL00sQ0FBQSxZQUFBb1AsQ0FBQSxZQUFBQSxFQUFBckMsQ0FBQSxFQUFBL00sQ0FBQSxJQUFBOGtCLG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsWUFBQTlyQixDQUFBLGdCQUFBcWtDLE9BQUEsQ0FBQXZZLENBQUEsRUFBQS9NLENBQUEsRUFBQS9lLENBQUEsVUFBQW11QixDQUFBLGFBQUFBLENBQUEsY0FBQUEsQ0FBQSxvQkFBQTBWLG1CQUFBLENBQUE3akMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUE7QUFBQSxTQUFBd2YsUUFBQTV0QyxDQUFBLEVBQUE4ckIsQ0FBQSxRQUFBc0MsQ0FBQSxHQUFBeHpCLE1BQUEsQ0FBQVksSUFBQSxDQUFBd0UsQ0FBQSxPQUFBcEYsTUFBQSxDQUFBaXpDLHFCQUFBLFFBQUExZixDQUFBLEdBQUF2ekIsTUFBQSxDQUFBaXpDLHFCQUFBLENBQUE3dEMsQ0FBQSxHQUFBOHJCLENBQUEsS0FBQXFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBM3dCLE1BQUEsV0FBQXN1QixDQUFBLFdBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUE5dEMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQTdmLFVBQUEsT0FBQW1pQixDQUFBLENBQUF6eEIsSUFBQSxDQUFBNGMsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUE7QUFBQSxTQUFBc2IsY0FBQTFwQyxDQUFBLGFBQUE4ckIsQ0FBQSxNQUFBQSxDQUFBLEdBQUE3d0IsU0FBQSxDQUFBQyxNQUFBLEVBQUE0d0IsQ0FBQSxVQUFBc0MsQ0FBQSxXQUFBbnpCLFNBQUEsQ0FBQTZ3QixDQUFBLElBQUE3d0IsU0FBQSxDQUFBNndCLENBQUEsUUFBQUEsQ0FBQSxPQUFBOGhCLE9BQUEsQ0FBQWh6QyxNQUFBLENBQUF3ekIsQ0FBQSxPQUFBOXlCLE9BQUEsV0FBQXd3QixDQUFBLElBQUE0ZSxlQUFBLENBQUExcUMsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXNDLENBQUEsQ0FBQXRDLENBQUEsU0FBQWx4QixNQUFBLENBQUFtekMseUJBQUEsR0FBQW56QyxNQUFBLENBQUFrUixnQkFBQSxDQUFBOUwsQ0FBQSxFQUFBcEYsTUFBQSxDQUFBbXpDLHlCQUFBLENBQUEzZixDQUFBLEtBQUF3ZixPQUFBLENBQUFoekMsTUFBQSxDQUFBd3pCLENBQUEsR0FBQTl5QixPQUFBLFdBQUF3d0IsQ0FBQSxJQUFBbHhCLE1BQUEsQ0FBQXdSLGNBQUEsQ0FBQXBNLENBQUEsRUFBQThyQixDQUFBLEVBQUFseEIsTUFBQSxDQUFBa3pDLHdCQUFBLENBQUExZixDQUFBLEVBQUF0QyxDQUFBLGlCQUFBOXJCLENBQUE7QUFBQSxTQUFBMHFDLGdCQUFBMXFDLENBQUEsRUFBQThyQixDQUFBLEVBQUFzQyxDQUFBLFlBQUF0QyxDQUFBLEdBQUFraUIsY0FBQSxDQUFBbGlCLENBQUEsTUFBQTlyQixDQUFBLEdBQUFwRixNQUFBLENBQUF3UixjQUFBLENBQUFwTSxDQUFBLEVBQUE4ckIsQ0FBQSxJQUFBbHZCLEtBQUEsRUFBQXd4QixDQUFBLEVBQUFuaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQW5NLENBQUEsQ0FBQThyQixDQUFBLElBQUFzQyxDQUFBLEVBQUFwdUIsQ0FBQTtBQUFBLFNBQUFndUMsZUFBQTVmLENBQUEsUUFBQXJ5QixDQUFBLEdBQUFreUMsWUFBQSxDQUFBN2YsQ0FBQSxnQ0FBQWgwQixPQUFBLENBQUEyQixDQUFBLElBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFreUMsYUFBQTdmLENBQUEsRUFBQXRDLENBQUEsb0JBQUExeEIsT0FBQSxDQUFBZzBCLENBQUEsTUFBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFwdUIsQ0FBQSxHQUFBb3VCLENBQUEsQ0FBQTl4QixNQUFBLENBQUE0eEMsV0FBQSxrQkFBQWx1QyxDQUFBLFFBQUFqRSxDQUFBLEdBQUFpRSxDQUFBLENBQUErSyxJQUFBLENBQUFxakIsQ0FBQSxFQUFBdEMsQ0FBQSxnQ0FBQTF4QixPQUFBLENBQUEyQixDQUFBLFVBQUFBLENBQUEsWUFBQWdCLFNBQUEseUVBQUErdUIsQ0FBQSxHQUFBbkgsTUFBQSxHQUFBOWpCLE1BQUEsRUFBQXV0QixDQUFBO0FBQUEsU0FBQWtXLG1CQUFBdmxCLENBQUEsRUFBQXFQLENBQUEsRUFBQXB1QixDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBdlUsQ0FBQSxFQUFBZ0osQ0FBQSxjQUFBN21CLENBQUEsR0FBQWdqQixDQUFBLENBQUFuRixDQUFBLEVBQUFnSixDQUFBLEdBQUE4TCxDQUFBLEdBQUEzeUIsQ0FBQSxDQUFBYSxLQUFBLFdBQUFtaUIsQ0FBQSxnQkFBQS9lLENBQUEsQ0FBQStlLENBQUEsS0FBQWhqQixDQUFBLENBQUFXLElBQUEsR0FBQTB4QixDQUFBLENBQUFNLENBQUEsSUFBQTZWLE9BQUEsQ0FBQUMsT0FBQSxDQUFBOVYsQ0FBQSxFQUFBK1YsSUFBQSxDQUFBM1ksQ0FBQSxFQUFBcUMsQ0FBQTtBQUFBLFNBQUF1VyxrQkFBQTNsQixDQUFBLDZCQUFBcVAsQ0FBQSxTQUFBcHVCLENBQUEsR0FBQS9FLFNBQUEsYUFBQXNwQyxPQUFBLFdBQUF6WSxDQUFBLEVBQUFxQyxDQUFBLFFBQUF2VSxDQUFBLEdBQUFtRixDQUFBLENBQUF4RixLQUFBLENBQUE2VSxDQUFBLEVBQUFwdUIsQ0FBQSxZQUFBMmtDLE1BQUE1bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFVBQUE3bEIsQ0FBQSxjQUFBNmxCLE9BQUE3bEIsQ0FBQSxJQUFBdWxCLGtCQUFBLENBQUExcUIsQ0FBQSxFQUFBa1MsQ0FBQSxFQUFBcUMsQ0FBQSxFQUFBd1csS0FBQSxFQUFBQyxNQUFBLFdBQUE3bEIsQ0FBQSxLQUFBNGxCLEtBQUE7QUFEb0s7QUFDdUk7QUFDblA7QUFDOEQ7QUFDbkY7QUFDc0I7QUFDekQsSUFBTWdHLFFBQVEsR0FBRztFQUNiQSxRQUFRO0lBQUEsSUFBQXUvQixTQUFBLEdBQUF4bEMsaUJBQUEsY0FBQVAsWUFBQSxHQUFBNVQsQ0FBQSxDQUFFLFNBQUEwVyxRQUFBdmxDLElBQUE7TUFBQSxJQUFBdTNCLFFBQUEsRUFBQXZGLFFBQUEsRUFBQXlZLFNBQUEsRUFBQXdVLFNBQUEsRUFBQXdwQixtQkFBQSxFQUFBQyxXQUFBLEVBQUFNLE9BQUEsRUFBQS9CLFNBQUEsRUFBQUcsT0FBQSxFQUFBOEIsTUFBQSxFQUFBbjVCLEtBQUEsRUFBQXpKLE1BQUEsRUFBQWdtQixVQUFBLEVBQUE2YyxTQUFBLEVBQUFDLGdCQUFBLEVBQUE1QixnQkFBQSxFQUFBNkIsVUFBQSxFQUFBQyxXQUFBLEVBQUFDLGlCQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQSxFQUFBQyxXQUFBLEVBQUFDLFdBQUEsRUFBQUMsZUFBQSxFQUFBQyxNQUFBLEVBQUFDLFFBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsTUFBQSxFQUFBQyxRQUFBLEVBQUFDLGdCQUFBLEVBQUFDLE1BQUEsRUFBQUMsUUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxNQUFBLEVBQUFDLFFBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsTUFBQSxFQUFBQyxRQUFBLEVBQUFDLGNBQUEsRUFBQUMsVUFBQSxFQUFBQyxVQUFBLEVBQUE5Z0IsVUFBQSxFQUFBOXNELEtBQUEsRUFBQTZ0RSxhQUFBLEVBQUFDLE9BQUEsRUFBQXZmLEtBQUEsRUFBQUosT0FBQTtNQUFBLE9BQUEzb0IsWUFBQSxHQUFBaGlDLENBQUEsV0FBQWc2QyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXA5QixDQUFBO1VBQUE7WUFBU2thLFFBQVEsR0FBQXYzQixJQUFBLENBQVJ1M0IsUUFBUSxFQUFFdkYsUUFBUSxHQUFBaHlCLElBQUEsQ0FBUmd5QixRQUFRO1lBQUF5b0IsU0FBQSxDQUFBcDlCLENBQUE7WUFBQSxPQUMzQm1uQix1REFBSSxDQUFDLENBQUMsQ0FBQztVQUFBO1lBQUFpRyxTQUFBLEdBQ3lGelksUUFBUSxDQUFDLENBQUMsRUFBeEdpdEIsU0FBUyxHQUFBeFUsU0FBQSxDQUFUd1UsU0FBUyxFQUFBd3BCLG1CQUFBLEdBQUFoK0IsU0FBQSxDQUFFd1UsU0FBUyxFQUFJeXBCLFdBQVcsR0FBQUQsbUJBQUEsQ0FBWEMsV0FBVyxFQUFFTSxPQUFPLEdBQUFQLG1CQUFBLENBQVBPLE9BQU8sRUFBRS9CLFNBQVMsR0FBQXdCLG1CQUFBLENBQVR4QixTQUFTLEVBQUVHLE9BQU8sR0FBQXFCLG1CQUFBLENBQVByQixPQUFPLEVBQUU4QixNQUFNLEdBQUFULG1CQUFBLENBQU5TLE1BQU0sRUFBSW41QixLQUFLLEdBQUF0RixTQUFBLENBQUxzRixLQUFLLEVBQUV6SixNQUFNLEdBQUFtRSxTQUFBLENBQU5uRSxNQUFNO1lBQUFnbUIsVUFBQSxHQUM5RHQ2QixRQUFRLENBQUMsQ0FBQyxFQUExQm0zQyxTQUFTLEdBQUE3YyxVQUFBLENBQXRCck4sU0FBUyxDQUFJa3FCLFNBQVM7WUFDdEJDLGdCQUFnQixHQUFHRCxTQUFTLENBQUN6eEQsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyQzh2RCxnQkFBZ0IsR0FBR0QscUVBQW1CLENBQUN0b0IsU0FBUyxDQUFDO1lBQ3ZEO0FBQ1I7QUFDQTtBQUNBO1lBQ2NvcUIsVUFBVSxHQUFHdnRFLGlEQUFNLENBQUMsVUFBQTQwQyxFQUFFO2NBQUEsSUFBQW0xQixnQkFBQTtjQUFBLE9BQUl0cEQsaURBQVEsQ0FBQ20wQixFQUFFLENBQUNyVCxRQUFRLEdBQUF3b0MsZ0JBQUEsR0FBRW4xQixFQUFFLENBQUNvMUIsWUFBWSxjQUFBRCxnQkFBQSxjQUFBQSxnQkFBQSxHQUFJLEVBQUUsQ0FBQztZQUFBLEdBQUVzRCxTQUFTLENBQUM7WUFDeEY7QUFDUjtBQUNBO0FBQ0E7QUFDQTtZQUNRQSxTQUFTLEdBQUd6cUUsaURBQVUsQ0FBQ3lxRSxTQUFTLEVBQUVFLFVBQVUsQ0FBQztZQUM3QztBQUNSO0FBQ0E7WUFDWUMsV0FBVyxHQUFHLEVBQUU7WUFDZEMsaUJBQWlCLEdBQUcsRUFBRTtZQUM1QjNtRCxpREFBTSxDQUFDM0csaURBQU8sQ0FBQzR1Qyx5RUFBbUIsRUFBRXNlLFNBQVMsQ0FBQyxDQUFDLENBQUN2dkUsT0FBTyxDQUFDLFVBQUFveEUsS0FBSyxFQUFJO2NBQzdELElBQUlBLEtBQUssQ0FBQ3h4RSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQjtnQkFDQSt2RSxpQkFBaUIsQ0FBQ3R1RSxJQUFJLENBQUMrdkUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQ3BDLENBQUMsTUFDSTtnQkFDRCxJQUFNQyxPQUFPLEdBQUdELEtBQUssQ0FBQ3p2RCxJQUFJLENBQUMsVUFBQW0xQixFQUFFO2tCQUFBLE9BQUlBLEVBQUUsQ0FBQytYLFdBQVc7Z0JBQUEsRUFBQztnQkFDaEQsSUFBSXdpQixPQUFPLEVBQUU7a0JBQ1Q7a0JBQ0EzQixXQUFXLENBQUNydUUsSUFBSSxDQUFDZ3dFLE9BQU8sQ0FBQztnQkFDN0I7Z0JBQ0EsSUFBTUMsbUJBQW1CLEdBQUdGLEtBQUssQ0FBQ2x2RSxNQUFNLENBQUMsVUFBQTQwQyxFQUFFO2tCQUFBLE9BQUlBLEVBQUUsS0FBS3U2QixPQUFPO2dCQUFBLEVBQUM7Z0JBQzlELElBQUlDLG1CQUFtQixDQUFDMXhFLE1BQU0sS0FBSyxDQUFDLEVBQUU7a0JBQ2xDO2tCQUNBK3ZFLGlCQUFpQixDQUFDdHVFLElBQUksQ0FBQ2l3RSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxNQUNJO2tCQUNEO2tCQUNBNUIsV0FBVyxHQUFHOXdELGtEQUFNLENBQUM4d0QsV0FBVyxFQUFFNEIsbUJBQW1CLENBQUM7a0JBQ3REM0IsaUJBQWlCLENBQUN0dUUsSUFBSSxDQUFDaXZCLGtEQUFTLENBQUM7b0JBQzdCb3BCLGNBQWMsRUFBRXo2QixrREFBTSxDQUFDeVIsa0RBQVMsQ0FBQzFaLElBQUksQ0FBQytILEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFQyxrREFBSyxDQUFDLGdCQUFnQixFQUFFc3lELG1CQUFtQixDQUFDLENBQUM7b0JBQzdGdGdCLGNBQWMsRUFBRTl1RCxpREFBTSxDQUFDLFVBQUFxdkUsR0FBRztzQkFBQSxPQUFJejBDLE9BQU8sQ0FBQ3kwQyxHQUFHLENBQUM7b0JBQUEsR0FBRXZ5RCxrREFBSyxDQUFDLGdCQUFnQixFQUFFc3lELG1CQUFtQixDQUFDLENBQUMsQ0FBQ3h6RCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2tCQUN6RyxDQUFDLEVBQUV3ekQsbUJBQW1CLENBQUN4ekQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekM7Y0FDSjtZQUNKLENBQUMsQ0FBQztZQUNGO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7WUFDUXl4RCxTQUFTLEdBQUdJLGlCQUFpQjtZQUM3QjtBQUNSO0FBQ0E7WUFDUTtBQUNSO0FBQ0E7QUFDQTtZQUNjQyxXQUFXLEdBQUc1dEQsa0RBQU8sQ0FBQ3hhLGtEQUFHLENBQUMsVUFBQTRwRSxLQUFLO2NBQUEsT0FBSUEsS0FBSyxDQUFDdHpELEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFBQSxHQUFFa0wsaURBQU0sQ0FBQzNHLGlEQUFPLENBQUM0dUMseUVBQW1CLEVBQUVyeUMsa0RBQU0sQ0FBQ2t3RCxXQUFXLEVBQUVTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdITSxXQUFXLEdBQUc3dEQsa0RBQU8sQ0FBQ3hhLGtEQUFHLENBQUMsVUFBQTRwRSxLQUFLO2NBQUEsT0FBSUEsS0FBSyxDQUFDdHpELEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFBQSxHQUFFa0wsaURBQU0sQ0FBQzNHLGlEQUFPLENBQUM0dUMseUVBQW1CLEVBQUVyeUMsa0RBQU0sQ0FBQ3d3RCxPQUFPLEVBQUVHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pITyxXQUFXLEdBQUc5dEQsa0RBQU8sQ0FBQ3hhLGtEQUFHLENBQUMsVUFBQTRwRSxLQUFLO2NBQUEsT0FBSUEsS0FBSyxDQUFDdHpELEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFBQSxHQUFFa0wsaURBQU0sQ0FBQzNHLGlEQUFPLENBQUM0dUMseUVBQW1CLEVBQUVyeUMsa0RBQU0sQ0FBQ3l1RCxTQUFTLEVBQUVrQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzSFEsV0FBVyxHQUFHL3RELGtEQUFPLENBQUN4YSxrREFBRyxDQUFDLFVBQUE0cEUsS0FBSztjQUFBLE9BQUlBLEtBQUssQ0FBQ3R6RCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUEsR0FBRWtMLGlEQUFNLENBQUMzRyxpREFBTyxDQUFDNHVDLHlFQUFtQixFQUFFcnlDLGtEQUFNLENBQUM0dUQsT0FBTyxFQUFFK0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0g7QUFDUjtBQUNBO1lBRlFTLGVBQUEsR0FHNkMzZSx3RUFBYyxDQUFDa2UsU0FBUyxFQUFFcDVCLEtBQUssQ0FBQyxFQUE5RDg1QixNQUFNLEdBQUFELGVBQUEsQ0FBYnBlLEtBQUssRUFBbUJzZSxRQUFRLEdBQUFGLGVBQUEsQ0FBakJ4ZSxPQUFPO1lBQUEyZSxnQkFBQSxHQUNlOWUsd0VBQWMsQ0FBQ3lkLFdBQVcsRUFBRTM0QixLQUFLLENBQUMsRUFBaEVpNkIsTUFBTSxHQUFBRCxnQkFBQSxDQUFidmUsS0FBSyxFQUFtQnllLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakIzZSxPQUFPO1lBQUE4ZSxnQkFBQSxHQUNlamYsd0VBQWMsQ0FBQytkLE9BQU8sRUFBRWo1QixLQUFLLENBQUMsRUFBNURvNkIsTUFBTSxHQUFBRCxnQkFBQSxDQUFiMWUsS0FBSyxFQUFtQjRlLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakI5ZSxPQUFPO1lBQUFpZixnQkFBQSxHQUNlcGYsd0VBQWMsQ0FBQ2djLFNBQVMsRUFBRWwzQixLQUFLLENBQUMsRUFBOUR1NkIsTUFBTSxHQUFBRCxnQkFBQSxDQUFiN2UsS0FBSyxFQUFtQitlLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakJqZixPQUFPO1lBQUFvZixnQkFBQSxHQUNldmYsd0VBQWMsQ0FBQ21jLE9BQU8sRUFBRXIzQixLQUFLLENBQUMsRUFBNUQwNkIsTUFBTSxHQUFBRCxnQkFBQSxDQUFiaGYsS0FBSyxFQUFtQmtmLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakJwZixPQUFPO1lBQzlCO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7WUFDUStkLFNBQVMsR0FBRzN3RCxrREFBTSxDQUFDOVosaURBQVUsQ0FBQ3lxRSxTQUFTLEVBQUVXLFFBQVEsQ0FBQyxFQUFFRCxNQUFNLENBQUM7WUFDM0Q7QUFDUjtBQUNBO1lBQ1ljLGNBQWMsR0FBRzdnQiwyRUFBaUIsQ0FBQy9aLEtBQUssRUFBRW81QixTQUFTLEVBQUUzQixnQkFBZ0IsRUFBRWxoQyxNQUFNLENBQUM7WUFDOUVza0MsVUFBVSxHQUFHLEVBQUU7WUFDZkMsVUFBVSxHQUFHLEVBQUU7WUFDbkI7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7WUFmUSxNQWdCSSxDQUFDRixjQUFjLENBQUNueEUsTUFBTSxJQUN0QjJ2RSxTQUFTLENBQUMzdkUsTUFBTSxJQUNoQjJ2RSxTQUFTLENBQUMzdkUsTUFBTSxLQUFLZ3VFLGdCQUFnQixDQUFDaHVFLE1BQU07Y0FBQWloRCxTQUFBLENBQUFwOUIsQ0FBQTtjQUFBO1lBQUE7WUFDeEMwc0MsVUFBVSxHQUFHb2YsU0FBUyxDQUFDenhELEtBQUssQ0FBQyxDQUFDLENBQUM7WUFBQXphLEtBQUEsZ0JBQUF3bEMsWUFBQSxHQUFBNVQsQ0FBQSxVQUFBNXhCLE1BQUE7Y0FBQSxJQUFBbXVFLGFBQUEsRUFBQUMsb0JBQUEsRUFBQTlmLFFBQUE7Y0FBQSxPQUFBOW9CLFlBQUEsR0FBQWhpQyxDQUFBLFdBQUEra0MsUUFBQTtnQkFBQSxrQkFBQUEsUUFBQSxDQUFBbm9CLENBQUE7a0JBQUE7b0JBRS9CO29CQUNBO29CQUNNK3RELGFBQWEsR0FBR3JoQixVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNuQzRnQixjQUFjLENBQUMxdkUsSUFBSSxDQUFDbXdFLGFBQWEsQ0FBQztvQkFDbENyaEIsVUFBVSxHQUFHQSxVQUFVLENBQUNyeUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDaEM7b0JBQ0FxeUMsVUFBVSxHQUFHRCwyRUFBaUIsQ0FBQy9aLEtBQUssRUFBRWdhLFVBQVUsRUFBRTRnQixjQUFjLENBQUM7b0JBQ2pFO29CQUNNVSxvQkFBb0IsR0FBRzNzRSxpREFBVSxDQUFDcXJELFVBQVUsRUFBRUEsVUFBVSxDQUFDO29CQUN6RHdCLFFBQVEsR0FBR3p2RCxpREFBTSxDQUFDLFVBQUE0MEMsRUFBRTtzQkFBQSxPQUFJLENBQUNBLEVBQUUsQ0FBQ28xQixZQUFZLElBQzFDLENBQUN2cEQsaURBQVEsQ0FBQzZ1RCxhQUFhLENBQUMvdEMsUUFBUSxFQUFFcVQsRUFBRSxDQUFDbzFCLFlBQVksQ0FBQztvQkFBQSxHQUFFdUYsb0JBQW9CLENBQUM7b0JBQzdFVCxVQUFVLEdBQUdweUQsa0RBQU0sQ0FBQ295RCxVQUFVLEVBQUVyZixRQUFRLENBQUM7b0JBQ3pDc2YsVUFBVSxHQUFHcnlELGtEQUFNLENBQUNxeUQsVUFBVSxFQUFFdGYsUUFBUSxDQUFDbnFELEdBQUcsQ0FBQyxVQUFBc3ZDLEVBQUU7c0JBQUEsSUFBQTQ2QixpQkFBQTtzQkFBQSxPQUFBdGpDLGFBQUEsQ0FBQUEsYUFBQSxLQUN4QzBJLEVBQUU7d0JBQ0xvMUIsWUFBWSxFQUFFdHRELGtEQUFNLEVBQUE4eUQsaUJBQUEsR0FBQzU2QixFQUFFLENBQUNvMUIsWUFBWSxjQUFBd0YsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSSxFQUFFLEVBQUUsQ0FDeENGLGFBQWEsQ0FBQy90QyxRQUFRLENBQ3pCO3NCQUFDO29CQUFBLENBQ0osQ0FBQyxDQUFDO2tCQUFDO29CQUFBLE9BQUFtSSxRQUFBLENBQUF0dEIsQ0FBQTtnQkFBQTtjQUFBLEdBQUFqYixLQUFBO1lBQUE7VUFBQTtZQUFBLEtBbEJGOHNELFVBQVUsQ0FBQ3Z3RCxNQUFNO2NBQUFpaEQsU0FBQSxDQUFBcDlCLENBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQW85QixTQUFBLENBQUFwaEMsQ0FBQSxDQUFBK2hDLGtCQUFBLENBQUFuK0MsS0FBQTtVQUFBO1lBQUF3OUMsU0FBQSxDQUFBcDlCLENBQUE7WUFBQTtVQUFBO1lBcUI1QjtBQUNSO0FBQ0E7QUFDQTtBQUNBO1lBQ1E4ckQsU0FBUyxHQUFHM3dELGtEQUFNLENBQUM5WixpREFBVSxDQUFDeXFFLFNBQVMsRUFBRXlCLFVBQVUsQ0FBQyxFQUFFQyxVQUFVLENBQUM7WUFDakU7QUFDUjtBQUNBO1lBQ1E7WUFDQTtZQUNBO1lBQ01DLGFBQWEsR0FBRzd1RCxpREFBTyxDQUFDLFVBQUF5MEIsRUFBRTtjQUFBLE9BQUlBLEVBQUUsQ0FBQ2thLGNBQWM7WUFBQSxHQUFFOXVELGlEQUFNLENBQUMsVUFBQTQwQyxFQUFFO2NBQUEsT0FBSSxDQUFDbDVCLGtEQUFLLENBQUNrNUIsRUFBRSxDQUFDa2EsY0FBYyxDQUFDO1lBQUEsR0FBRXNlLE1BQU0sQ0FBQyxDQUFDO1lBQ2pHNkIsT0FBTyxHQUFHanZFLGlEQUFNLENBQUMsVUFBQTQwQyxFQUFFLEVBQUk7Y0FDekI7Y0FDQSxJQUFJLENBQUNBLEVBQUUsQ0FBQ2thLGNBQWMsSUFDbEIsQ0FBQ2tnQixhQUFhLENBQUNwNkIsRUFBRSxDQUFDa2EsY0FBYyxDQUFDLElBQ2pDLENBQUNrZ0IsYUFBYSxDQUFDcDZCLEVBQUUsQ0FBQ2thLGNBQWMsQ0FBQyxDQUFDcHhELE1BQU0sRUFBRTtnQkFDMUMsT0FBTyxLQUFLO2NBQ2hCO2NBQ0E7Y0FDQSxJQUFNd3RCLE1BQU0sR0FBRzVsQixrREFBRyxDQUFDbTdDLHNFQUFnQixFQUFFM2dDLGtEQUFPLENBQUM4MEIsRUFBRSxDQUFDRyxTQUFTLENBQUNkLEtBQUssQ0FBQyxDQUFDLENBQUM7Y0FDbEU7Y0FDQSxJQUFNKzJCLFFBQVEsR0FBR2xyRCxrREFBTyxDQUFDeGEsa0RBQUcsQ0FBQyxVQUFBbXFFLEdBQUc7Z0JBQUEsT0FBSUEsR0FBRyxDQUFDMUUsYUFBYSxDQUFDQyxRQUFRO2NBQUEsR0FBRWdFLGFBQWEsQ0FBQ3A2QixFQUFFLENBQUNrYSxjQUFjLENBQUMsQ0FBQyxDQUFDO2NBQ2xHO2NBQ0EsSUFBTW1QLE9BQU8sR0FBR24rQyxrREFBTyxDQUFDeGEsa0RBQUcsQ0FBQyxVQUFBbXFFLEdBQUc7Z0JBQUEsT0FBSUEsR0FBRyxDQUFDMUUsYUFBYSxDQUFDcEIsWUFBWTtjQUFBLEdBQUVxRixhQUFhLENBQUNwNkIsRUFBRSxDQUFDa2EsY0FBYyxDQUFDLENBQUMsQ0FBQztjQUNyRztjQUNBO2NBQ0E7Y0FDQTtjQUNBLElBQU0vZixHQUFHLEdBQUc1aUIsa0RBQU8sQ0FBQ3pxQixrREFBWSxDQUFDd3BCLE1BQU0sRUFBRSt5QyxPQUFPLENBQUMsQ0FBQyxJQUM5Qzl4QyxrREFBTyxDQUFDdnBCLGlEQUFVLENBQUNzb0IsTUFBTSxFQUFFOC9DLFFBQVEsQ0FBQyxDQUFDLElBQ3JDLENBQUMvd0Qsa0RBQUcsQ0FBQzQyQixnRUFBYSxFQUFFK0QsRUFBRSxDQUFDclQsUUFBUSxDQUFDclcsTUFBTSxDQUFDO2NBQzNDLE9BQU82akIsR0FBRztZQUNkLENBQUMsRUFBRTgvQixjQUFjLENBQUM7WUFDbEI7QUFDUjtBQUNBO0FBQ0E7QUFDQTtZQUNReEIsU0FBUyxHQUFHenFFLGlEQUFVLENBQUN5cUUsU0FBUyxFQUFFNEIsT0FBTyxDQUFDO1lBQzFDSixjQUFjLEdBQUdqc0UsaURBQVUsQ0FBQ2lzRSxjQUFjLEVBQUVJLE9BQU8sQ0FBQztZQUNwRDVCLFNBQVMsR0FBR3pxRSxpREFBVSxDQUFDeXFFLFNBQVMsRUFBRXdCLGNBQWMsQ0FBQztZQUMzQ25mLEtBQUssR0FBRzlzRCxpREFBVSxDQUFDeXFFLFNBQVMsRUFBRUMsZ0JBQWdCLENBQUM7WUFDL0NoZSxPQUFPLEdBQUcxc0QsaURBQVUsQ0FBQzBxRSxnQkFBZ0IsRUFBRUQsU0FBUyxDQUFDO1lBQ3ZENXhDLFFBQVEsQ0FBQ2lZLHNFQUFrQixDQUFDO1lBQ3hCO1lBQ0FnYyxLQUFLLENBQUNoeUQsTUFBTSxHQUFHNDBDLHlFQUFxQixDQUFDb2QsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUNsREosT0FBTyxDQUFDNXhELE1BQU0sR0FBRzAxQyw0RUFBd0IsQ0FBQ2tjLE9BQU8sQ0FBQyxHQUFHLElBQUk7WUFDekQ7WUFDQW9lLFdBQVcsQ0FBQ2h3RSxNQUFNLEdBQ1p3MUMsOEVBQTBCLENBQUN3NkIsV0FBVyxDQUFDLEdBQ3ZDLElBQUksRUFDVkMsV0FBVyxDQUFDandFLE1BQU0sR0FBR28xQywwRUFBc0IsQ0FBQzY2QixXQUFXLENBQUMsR0FBRyxJQUFJLEVBQy9EQyxXQUFXLENBQUNsd0UsTUFBTSxHQUNaczFDLDRFQUF3QixDQUFDNDZCLFdBQVcsQ0FBQyxHQUNyQyxJQUFJLEVBQ1ZDLFdBQVcsQ0FBQ253RSxNQUFNLEdBQUc4MUMsMEVBQXNCLENBQUNxNkIsV0FBVyxDQUFDLEdBQUcsSUFBSTtZQUMvRDtZQUNBTSxRQUFRLENBQUN6d0UsTUFBTSxHQUFHdzFDLDhFQUEwQixDQUFDaTdCLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFDN0RELE1BQU0sQ0FBQ3h3RSxNQUFNLEdBQUcwMEMsMkVBQXVCLENBQUM4N0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUN0REksUUFBUSxDQUFDNXdFLE1BQU0sR0FBR28xQywwRUFBc0IsQ0FBQ3c3QixRQUFRLENBQUMsR0FBRyxJQUFJLEVBQ3pERCxNQUFNLENBQUMzd0UsTUFBTSxHQUFHazBDLHVFQUFtQixDQUFDeThCLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFDbERJLFFBQVEsQ0FBQy93RSxNQUFNLEdBQUdzMUMsNEVBQXdCLENBQUN5N0IsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUMzREQsTUFBTSxDQUFDOXdFLE1BQU0sR0FBR3cwQyx5RUFBcUIsQ0FBQ3M4QixNQUFNLENBQUMsR0FBRyxJQUFJLEVBQ3BESSxRQUFRLENBQUNseEUsTUFBTSxHQUFHODFDLDBFQUFzQixDQUFDbzdCLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFDekRELE1BQU0sQ0FBQ2p4RSxNQUFNLEdBQUdnMUMsdUVBQW1CLENBQUNpOEIsTUFBTSxDQUFDLEdBQUcsSUFBSTtZQUNsRDtZQUNBRSxjQUFjLENBQUNueEUsTUFBTSxHQUNmMDBDLDJFQUF1QixDQUFDeThCLGNBQWMsQ0FBQyxHQUN2QyxJQUFJLENBQ2IsQ0FBQyxDQUFDO1VBQUM7WUFBQSxPQUFBbHdCLFNBQUEsQ0FBQXZpQyxDQUFBO1FBQUE7TUFBQSxHQUFBcXRCLE9BQUE7SUFBQSxDQUNQO0lBQUEsU0F0TUQwRCxRQUFRQSxDQUFBNEMsRUFBQTtNQUFBLE9BQUEyOEIsU0FBQSxDQUFBM3dELEtBQUEsT0FBQXRlLFNBQUE7SUFBQTtJQUFBLE9BQVIwdkMsUUFBUTtFQUFBLEdBc01QO0VBQ0RqaUIsTUFBTSxFQUFFLENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0FBQ3pELENBQUM7QUFDRCwrREFBZWlpQixRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoTjREO0FBQ0Y7QUFDeEI7QUFDekQsSUFBTUEsUUFBUSxHQUFHO0VBQ2JBLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFBanBDLElBQUEsRUFBOEI7SUFBQSxJQUF6QnUzQixRQUFRLEdBQUF2M0IsSUFBQSxDQUFSdTNCLFFBQVE7TUFBRXZGLFFBQVEsR0FBQWh5QixJQUFBLENBQVJneUIsUUFBUTtJQUMzQixJQUFBeVksU0FBQSxHQUFzQnpZLFFBQVEsQ0FBQyxDQUFDO01BQXhCaXRCLFNBQVMsR0FBQXhVLFNBQUEsQ0FBVHdVLFNBQVM7SUFDakIsSUFBTXVvQixnQkFBZ0IsR0FBR0QscUVBQW1CLENBQUN0b0IsU0FBUyxDQUFDO0lBQ3ZELElBQUFxTixVQUFBLEdBQWtDdDZCLFFBQVEsQ0FBQyxDQUFDO01BQXZCazNDLE1BQU0sR0FBQTVjLFVBQUEsQ0FBbkJyTixTQUFTLENBQUlpcUIsTUFBTTtJQUMzQixJQUFBNWUsVUFBQSxHQUE2Q3YvQixpREFBUyxDQUFDLFVBQUEybEIsRUFBRTtRQUFBLE9BQUlsNUIsaURBQUssQ0FBQ2s1QixFQUFFLENBQUNrYSxjQUFjLENBQUM7TUFBQSxHQUFFc2UsTUFBTSxDQUFDO01BQUEzZSxXQUFBLEdBQUFyd0QsY0FBQSxDQUFBb3dELFVBQUE7TUFBdkZraEIsa0JBQWtCLEdBQUFqaEIsV0FBQTtNQUFFa2hCLGNBQWMsR0FBQWxoQixXQUFBO0lBQ3pDLElBQU1taEIsZUFBZSxHQUFHenZELGlEQUFPLENBQUMsVUFBQXkwQixFQUFFO01BQUEsT0FBSUEsRUFBRSxDQUFDa2EsY0FBYztJQUFBLEdBQUU2Z0IsY0FBYyxDQUFDO0lBQ3hFLElBQU1YLGFBQWEsR0FBRzd1RCxpREFBTyxDQUFDLFVBQUF5MEIsRUFBRTtNQUFBLE9BQUlBLEVBQUUsQ0FBQ2thLGNBQWM7SUFBQSxHQUFFOXVELGlEQUFNLENBQUMsVUFBQTQwQyxFQUFFO01BQUEsT0FBSSxDQUFDbDVCLGlEQUFLLENBQUNrNUIsRUFBRSxDQUFDa2EsY0FBYyxDQUFDO0lBQUEsR0FBRTRjLGdCQUFnQixDQUFDLENBQUM7SUFDakgsSUFBTXVELE9BQU8sR0FBR2x5RCxpREFBTSxDQUFDLFVBQUNneUIsR0FBRyxFQUFBNXFDLEtBQUE7TUFBQSxJQUFBcTFDLEtBQUEsR0FBQXA3QyxjQUFBLENBQUErRixLQUFBO1FBQUcycUQsY0FBYyxHQUFBdFYsS0FBQTtRQUFFcTJCLHVCQUF1QixHQUFBcjJCLEtBQUE7TUFBQSxPQUFNLENBQUN3MUIsYUFBYSxDQUFDbGdCLGNBQWMsQ0FBQyxHQUNuR3B5QyxpREFBTSxDQUFDcXlCLEdBQUcsRUFBRThnQyx1QkFBdUIsQ0FBQyxHQUNwQzlnQyxHQUFHO0lBQUEsR0FBRSxFQUFFLEVBQUUvZSxpREFBTyxDQUFDNC9DLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDbjBDLFFBQVEsQ0FBQ2lZLHNFQUFrQixDQUFDLENBQ3hCZzhCLGtCQUFrQixDQUFDaHlFLE1BQU0sR0FDbkI0MUMseUVBQXFCLENBQUNvOEIsa0JBQWtCLENBQUMsR0FDekMsSUFBSSxFQUNWVCxPQUFPLENBQUN2eEUsTUFBTSxHQUFHNDFDLHlFQUFxQixDQUFDMjdCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FDekQsQ0FBQyxDQUFDO0VBQ1AsQ0FBQztFQUNEL2pELE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQjtBQUN0RCxDQUFDO0FBQ0QsK0RBQWVpaUIsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJ2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBV2U7QUFDNEI7QUFFVDtBQUNpQjtBQUU1QyxJQUFNMmlDLFdBQVcsR0FBRyxvQkFBb0I7QUFFL0MsU0FBU3p3RSxHQUFHQSxDQUFDbUQsQ0FBQyxFQUFFO0VBQ1osSUFBTTQyQixLQUFLLEdBQUcsT0FBTzUyQixDQUFDLEtBQUssUUFBUSxHQUFHLElBQUkwZixLQUFLLENBQUMxZixDQUFDLENBQUMsR0FBR0EsQ0FBQztFQUV0RCxPQUFPd3VDLHlEQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUI3eEIsSUFBSSxFQUFFLFVBQVU7SUFDaEJpYTtFQUNKLENBQUMsQ0FBQztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTMjJDLGNBQWNBLENBQUNoZ0QsTUFBTSxFQUFFaWdELFNBQVMsRUFBRTtFQUN2QyxJQUFNQyxPQUFPLEdBQUdsZ0QsTUFBTSxHQUFHaWdELFNBQVM7RUFDbEMsSUFBTUUsT0FBTyxHQUFHRCxPQUFPLENBQUN2eUUsTUFBTTtFQUM5QixPQUFPLFVBQUEwRyxHQUFHO0lBQUEsT0FBSUEsR0FBRyxLQUFLMnJCLE1BQU0sSUFBSTNyQixHQUFHLENBQUMwckMsTUFBTSxDQUFDLENBQUMsRUFBRW9nQyxPQUFPLENBQUMsS0FBS0QsT0FBTztFQUFBO0FBQ3RFO0FBRUEsSUFBTUUsU0FBUyxHQUFHLEdBQUc7QUFDckIsSUFBTUMsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUc5MUQsR0FBRztFQUFBLE9BQUtBLEdBQUcsS0FBSzYxRCxTQUFTLEdBQUd2eEUsU0FBUyxHQUFHaTVCLElBQUksQ0FBQ29qQixLQUFLLENBQUMzZ0MsR0FBRyxJQUFJLElBQUksQ0FBQztBQUFBLENBQUM7QUFDL0UsSUFBTSsxRCxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBRy8xRCxHQUFHO0VBQUEsT0FBS0EsR0FBRyxLQUFLMWIsU0FBUyxHQUFHdXhFLFNBQVMsR0FBR3Q0QyxJQUFJLENBQUNDLFNBQVMsQ0FBQ3hkLEdBQUcsQ0FBQztBQUFBLENBQUM7QUFBQyxJQUUxRWcyRCxRQUFRO0VBQ1YsU0FBQUEsU0FBWXRsQyxPQUFPLEVBQUU7SUFBQS83QixlQUFBLE9BQUFxaEUsUUFBQTtJQUNqQixJQUFJLENBQUNDLEtBQUssR0FBR3ZsQyxPQUFPO0lBQ3BCLElBQUksQ0FBQ3dsQyxRQUFRLEdBQUdsOEMsTUFBTSxDQUFDMFcsT0FBTyxDQUFDO0VBQ25DO0VBQUMsT0FBQTM4QixZQUFBLENBQUFpaUUsUUFBQTtJQUFBbHNFLEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBcXhFLE9BQU9BLENBQUNyc0UsR0FBRyxFQUFFO01BQ1QsT0FBTyxJQUFJLENBQUNvc0UsUUFBUSxDQUFDek0sT0FBTyxDQUFDK0wsV0FBVyxHQUFHMXJFLEdBQUcsQ0FBQyxLQUFLLElBQUk7SUFDNUQ7RUFBQztJQUFBQSxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQTJrRSxPQUFPQSxDQUFDMy9ELEdBQUcsRUFBRTtNQUNUO01BQ0E7TUFDQSxPQUFPZ3NFLE1BQU0sQ0FBQyxJQUFJLENBQUNJLFFBQVEsQ0FBQ3pNLE9BQU8sQ0FBQytMLFdBQVcsR0FBRzFyRSxHQUFHLENBQUMsQ0FBQztJQUMzRDtFQUFDO0lBQUFBLEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBc3hFLFFBQVFBLENBQUN0c0UsR0FBRyxFQUFFaEYsS0FBSyxFQUFFO01BQ2pCO01BQ0EsSUFBSSxDQUFDb3hFLFFBQVEsQ0FBQzlMLE9BQU8sQ0FBQ29MLFdBQVcsR0FBRzFyRSxHQUFHLEVBQUVpc0UsVUFBVSxDQUFDanhFLEtBQUssQ0FBQyxDQUFDO0lBQy9EO0lBQ0E7QUFDSjtBQUNBO0FBQ0E7RUFISTtJQUFBZ0YsR0FBQTtJQUFBaEYsS0FBQSxFQUlBLFNBQUFzbEUsT0FBT0EsQ0FBQ3RnRSxHQUFHLEVBQUVoRixLQUFLLEVBQUVxOEIsUUFBUSxFQUFFO01BQzFCLElBQUk7UUFDQSxJQUFJLENBQUNpMUMsUUFBUSxDQUFDdHNFLEdBQUcsRUFBRWhGLEtBQUssQ0FBQztNQUM3QixDQUFDLENBQUMsT0FBT29ELENBQUMsRUFBRTtRQUNSaTVCLFFBQVEsQ0FDSnA4QixHQUFHLElBQUFxZCxNQUFBLENBQ0l0WSxHQUFHLHlCQUFBc1ksTUFBQSxDQUFzQixJQUFJLENBQUM2ekQsS0FBSyxtQ0FDMUMsQ0FDSixDQUFDO1FBQ0Q7UUFDQTtRQUNBO01BQ0o7SUFDSjtFQUFDO0lBQUFuc0UsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUF1eEUsVUFBVUEsQ0FBQ3ZzRSxHQUFHLEVBQUU7TUFDWixJQUFJLENBQUNvc0UsUUFBUSxDQUFDRyxVQUFVLENBQUNiLFdBQVcsR0FBRzFyRSxHQUFHLENBQUM7SUFDL0M7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7RUFISTtJQUFBQSxHQUFBO0lBQUFoRixLQUFBLEVBSUEsU0FBQWdpQyxLQUFLQSxDQUFDd3ZDLFNBQVMsRUFBRTtNQUFBLElBQUFoOUMsS0FBQTtNQUNiLElBQU1pOUMsVUFBVSxHQUFHZixXQUFXLElBQUljLFNBQVMsSUFBSSxFQUFFLENBQUM7TUFDbEQsSUFBTUUsUUFBUSxHQUFHZixjQUFjLENBQUNjLFVBQVUsRUFBRUQsU0FBUyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7TUFDakUsSUFBTUcsWUFBWSxHQUFHLEVBQUU7TUFDdkI7TUFDQTtNQUNBLEtBQUssSUFBSXh5RSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDaXlFLFFBQVEsQ0FBQzl5RSxNQUFNLEVBQUVhLENBQUMsRUFBRSxFQUFFO1FBQzNDLElBQU15eUUsT0FBTyxHQUFHLElBQUksQ0FBQ1IsUUFBUSxDQUFDcHNFLEdBQUcsQ0FBQzdGLENBQUMsQ0FBQztRQUNwQyxJQUFJdXlFLFFBQVEsQ0FBQ0UsT0FBTyxDQUFDLEVBQUU7VUFDbkJELFlBQVksQ0FBQzV4RSxJQUFJLENBQUM2eEUsT0FBTyxDQUFDO1FBQzlCO01BQ0o7TUFDQWx6RSxpREFBTyxDQUFDLFVBQUFHLENBQUM7UUFBQSxPQUFJMjFCLEtBQUksQ0FBQzQ4QyxRQUFRLENBQUNHLFVBQVUsQ0FBQzF5RSxDQUFDLENBQUM7TUFBQSxHQUFFOHlFLFlBQVksQ0FBQztJQUMzRDtFQUFDO0FBQUE7QUFBQSxJQUdDRSxRQUFRO0VBQ1YsU0FBQUEsU0FBQSxFQUFjO0lBQUFoaUUsZUFBQSxPQUFBZ2lFLFFBQUE7SUFDVixJQUFJLENBQUNseUIsS0FBSyxHQUFHLENBQUMsQ0FBQztFQUNuQjtFQUFDLE9BQUExd0MsWUFBQSxDQUFBNGlFLFFBQUE7SUFBQTdzRSxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQXF4RSxPQUFPQSxDQUFDcnNFLEdBQUcsRUFBRTtNQUNULE9BQU9BLEdBQUcsSUFBSSxJQUFJLENBQUMyNkMsS0FBSztJQUM1QjtFQUFDO0lBQUEzNkMsR0FBQTtJQUFBaEYsS0FBQSxFQUVELFNBQUEya0UsT0FBT0EsQ0FBQzMvRCxHQUFHLEVBQUU7TUFDVDtNQUNBO01BQ0EsT0FBT2dzRSxNQUFNLENBQUMsSUFBSSxDQUFDcnhCLEtBQUssQ0FBQzM2QyxHQUFHLENBQUMsQ0FBQztJQUNsQztFQUFDO0lBQUFBLEdBQUE7SUFBQWhGLEtBQUEsRUFFRCxTQUFBc2xFLE9BQU9BLENBQUN0Z0UsR0FBRyxFQUFFaEYsS0FBSyxFQUFFO01BQ2hCLElBQUksQ0FBQzIvQyxLQUFLLENBQUMzNkMsR0FBRyxDQUFDLEdBQUdpc0UsVUFBVSxDQUFDanhFLEtBQUssQ0FBQztJQUN2QztFQUFDO0lBQUFnRixHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQXV4RSxVQUFVQSxDQUFDdnNFLEdBQUcsRUFBRTtNQUNaLE9BQU8sSUFBSSxDQUFDMjZDLEtBQUssQ0FBQzM2QyxHQUFHLENBQUM7SUFDMUI7RUFBQztJQUFBQSxHQUFBO0lBQUFoRixLQUFBLEVBRUQsU0FBQWdpQyxLQUFLQSxDQUFDd3ZDLFNBQVMsRUFBRTtNQUFBLElBQUExYSxNQUFBO01BQ2IsSUFBSTBhLFNBQVMsRUFBRTtRQUNYOXlFLGlEQUFPLENBQ0gsVUFBQXNHLEdBQUc7VUFBQSxPQUFJLE9BQU84eEQsTUFBSSxDQUFDblgsS0FBSyxDQUFDMzZDLEdBQUcsQ0FBQztRQUFBLEdBQzdCcEUsaURBQU0sQ0FBQyt2RSxjQUFjLENBQUNhLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTV5RSxpREFBSSxDQUFDLElBQUksQ0FBQytnRCxLQUFLLENBQUMsQ0FDM0QsQ0FBQztNQUNMLENBQUMsTUFBTTtRQUNILElBQUksQ0FBQ0EsS0FBSyxHQUFHLENBQUMsQ0FBQztNQUNuQjtJQUNKO0VBQUM7QUFBQSxLQUdMO0FBQ0E7QUFDQTtBQUNBLElBQU1teUIsR0FBRyxHQUFHLEVBQUU7QUFDZCxTQUFTQyxVQUFVQSxDQUFBLEVBQUc7RUFDbEIsSUFBSXRxRSxDQUFDLEdBQUcsTUFBTTtFQUNkLEtBQUssSUFBSXRJLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzJ5RSxHQUFHLEVBQUUzeUUsQ0FBQyxFQUFFLEVBQUU7SUFDMUJzSSxDQUFDLElBQUlBLENBQUM7RUFDVjtFQUNBLE9BQU9BLENBQUM7QUFDWjtBQUVPLElBQU11cUUsTUFBTSxHQUFHO0VBQ2xCQyxNQUFNLEVBQUUsSUFBSUosUUFBUSxDQUFDO0VBQ3JCO0VBQ0E7QUFDSixDQUFDO0FBRUQsSUFBTUssUUFBUSxHQUFHO0VBQ2JDLEtBQUssRUFBRSxjQUFjO0VBQ3JCQyxPQUFPLEVBQUU7QUFDYixDQUFDO0FBRUQsU0FBU0MsY0FBY0EsQ0FBQ3ptQyxPQUFPLEVBQUV2UCxRQUFRLEVBQUU7RUFDdkMsSUFBTTdGLEtBQUssR0FBRyxJQUFJMDZDLFFBQVEsQ0FBQ3RsQyxPQUFPLENBQUM7RUFDbkMsSUFBTTBtQyxhQUFhLEdBQUdOLE1BQU0sQ0FBQ0MsTUFBTTtFQUNuQyxJQUFNTSxTQUFTLEdBQUdSLFVBQVUsQ0FBQyxDQUFDO0VBQzlCLElBQU1TLE9BQU8sR0FBRzlCLFdBQVcsR0FBRyxLQUFLO0VBQ25DLElBQUk7SUFDQWw2QyxLQUFLLENBQUM4NkMsUUFBUSxDQUFDa0IsT0FBTyxFQUFFRCxTQUFTLENBQUM7SUFDbEMsSUFBSS83QyxLQUFLLENBQUNtdUMsT0FBTyxDQUFDNk4sT0FBTyxDQUFDLEtBQUtELFNBQVMsRUFBRTtNQUN0Q2wyQyxRQUFRLENBQ0pwOEIsR0FBRyxJQUFBcWQsTUFBQSxDQUFJc3VCLE9BQU8saURBQThDLENBQ2hFLENBQUM7TUFDRCxPQUFPMG1DLGFBQWE7SUFDeEI7SUFDQTk3QyxLQUFLLENBQUMrNkMsVUFBVSxDQUFDaUIsT0FBTyxDQUFDO0lBQ3pCLE9BQU9oOEMsS0FBSztFQUNoQixDQUFDLENBQUMsT0FBT3B6QixDQUFDLEVBQUU7SUFDUmk1QixRQUFRLENBQ0pwOEIsR0FBRyxJQUFBcWQsTUFBQSxDQUFJc3VCLE9BQU8sa0RBQStDLENBQ2pFLENBQUM7RUFDTDtFQUNBLElBQUk7SUFDQXBWLEtBQUssQ0FBQ3dMLEtBQUssQ0FBQyxDQUFDO0lBQ2J4TCxLQUFLLENBQUM4NkMsUUFBUSxDQUFDa0IsT0FBTyxFQUFFRCxTQUFTLENBQUM7SUFDbEMsSUFBSS83QyxLQUFLLENBQUNtdUMsT0FBTyxDQUFDNk4sT0FBTyxDQUFDLEtBQUtELFNBQVMsRUFBRTtNQUN0QyxNQUFNLElBQUl6dkQsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQjtJQUNBMFQsS0FBSyxDQUFDKzZDLFVBQVUsQ0FBQ2lCLE9BQU8sQ0FBQztJQUN6Qm4yQyxRQUFRLENBQUNwOEIsR0FBRyxJQUFBcWQsTUFBQSxDQUFJc3VCLE9BQU8sNENBQXlDLENBQUMsQ0FBQztJQUNsRSxPQUFPcFYsS0FBSztFQUNoQixDQUFDLENBQUMsT0FBT3B6QixDQUFDLEVBQUU7SUFDUmk1QixRQUFRLENBQUNwOEIsR0FBRyxJQUFBcWQsTUFBQSxDQUFJc3VCLE9BQU8sK0NBQTRDLENBQUMsQ0FBQztJQUNyRSxPQUFPMG1DLGFBQWE7RUFDeEI7QUFDSjtBQUVBLFNBQVNHLFFBQVFBLENBQUMxeUQsSUFBSSxFQUFFc2MsUUFBUSxFQUFFO0VBQzlCLElBQUksQ0FBQzIxQyxNQUFNLENBQUNqeUQsSUFBSSxDQUFDLEVBQUU7SUFDZml5RCxNQUFNLENBQUNqeUQsSUFBSSxDQUFDLEdBQUdzeUQsY0FBYyxDQUFDSCxRQUFRLENBQUNueUQsSUFBSSxDQUFDLEVBQUVzYyxRQUFRLENBQUM7RUFDM0Q7RUFDQSxPQUFPMjFDLE1BQU0sQ0FBQ2p5RCxJQUFJLENBQUM7QUFDdkI7QUFFQSxJQUFNMnlELGFBQWEsR0FBRztFQUNsQkMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUVDLFNBQVM7SUFBQSxPQUFJQSxTQUFTO0VBQUE7RUFDL0JqMkQsS0FBSyxFQUFFLFNBQVBBLEtBQUtBLENBQUdrMkQsV0FBVyxFQUFFQyxVQUFVO0lBQUEsT0FBS0QsV0FBVztFQUFBO0FBQ25ELENBQUM7QUFFRCxJQUFNRSxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSTN1RCxPQUFPLEVBQUVrMkIsUUFBUSxFQUFFMDRCLFFBQVEsRUFBSztFQUNsRCxJQUNJNXVELE9BQU8sQ0FBQzZ1RCxxQkFBcUIsSUFDN0I3dUQsT0FBTyxDQUFDNnVELHFCQUFxQixDQUFDMzRCLFFBQVEsQ0FBQyxFQUN6QztJQUNFLElBQUkwNEIsUUFBUSxFQUFFO01BQ1YsT0FBTzV1RCxPQUFPLENBQUM2dUQscUJBQXFCLENBQUMzNEIsUUFBUSxDQUFDLENBQUMwNEIsUUFBUSxDQUFDO0lBQzVEO0lBQ0EsT0FBTzV1RCxPQUFPLENBQUM2dUQscUJBQXFCLENBQUMzNEIsUUFBUSxDQUFDO0VBQ2xEO0VBQ0EsT0FBT280QixhQUFhO0FBQ3hCLENBQUM7QUFFRCxJQUFNUSxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSXh5RSxFQUFFLEVBQUV5eUUsYUFBYSxFQUFFQyxXQUFXO0VBQUEsVUFBQTkxRCxNQUFBLENBQzNDbzBCLGtFQUFXLENBQUNoeEMsRUFBRSxDQUFDLE9BQUE0YyxNQUFBLENBQUk2MUQsYUFBYSxPQUFBNzFELE1BQUEsQ0FBSW1iLElBQUksQ0FBQ0MsU0FBUyxDQUFDMDZDLFdBQVcsQ0FBQztBQUFBLENBQUU7QUFFeEUsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUdocUUsTUFBTSxFQUFJO0VBQ3ZCLElBQU84RixLQUFLLEdBQXFCOUYsTUFBTSxDQUFoQzhGLEtBQUs7SUFBRTRRLElBQUksR0FBZTFXLE1BQU0sQ0FBekIwVyxJQUFJO0lBQUV3M0IsU0FBUyxHQUFJbHVDLE1BQU0sQ0FBbkJrdUMsU0FBUztFQUM3QixJQUFJLENBQUN4M0IsSUFBSSxJQUFJLENBQUN3M0IsU0FBUyxFQUFFO0lBQ3JCO0lBQ0EsT0FBTztNQUFDcG9DO0lBQUssQ0FBQztFQUNsQjtFQUNBLElBQU96TyxFQUFFLEdBQWlCeU8sS0FBSyxDQUF4QnpPLEVBQUU7SUFBRTB5RSxXQUFXLEdBQUlqa0UsS0FBSyxDQUFwQmlrRSxXQUFXO0VBRXRCLElBQU1odkQsT0FBTyxHQUFHeTlCLGlEQUFRLENBQUNqYSxPQUFPLENBQUN2K0IsTUFBTSxDQUFDO0VBQ3hDLElBQU1pcUUsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUdyM0QsSUFBSTtJQUFBLE9BQ2Y5TSxLQUFLLENBQUM4TSxJQUFJLENBQUMsSUFDWCxDQUFDbUksT0FBTyxDQUFDdTFDLFlBQVksSUFBSXYxQyxPQUFPLENBQUNtdkQsZUFBZSxJQUFJLENBQUMsQ0FBQyxFQUFFdDNELElBQUksQ0FBQztFQUFBO0VBQ2pFLElBQU11M0QsZUFBZSxHQUFHRixNQUFNLENBQUMsaUJBQWlCLENBQUM7RUFDakQsSUFBTUcsZ0JBQWdCLEdBQUdILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztFQUNuRCxJQUFNSSxVQUFVLEdBQUdoekUsRUFBRSxJQUFJOHlFLGVBQWUsSUFBSUMsZ0JBQWdCO0VBRTVELE9BQU87SUFDSEMsVUFBVTtJQUNWaHpFLEVBQUU7SUFDRnlPLEtBQUs7SUFDTGlWLE9BQU87SUFDUGd2RCxXQUFXO0lBQ1hJLGVBQWU7SUFDZkM7RUFDSixDQUFDO0FBQ0wsQ0FBQztBQUVNLFNBQVMvaUIsWUFBWUEsQ0FBQ3JuRCxNQUFNLEVBQUVzakQsUUFBUSxFQUFFdHdCLFFBQVEsRUFBRTtFQUNyRCxJQUFBczNDLFNBQUEsR0FRSU4sUUFBUSxDQUFDaHFFLE1BQU0sQ0FBQztJQVBoQnFxRSxVQUFVLEdBQUFDLFNBQUEsQ0FBVkQsVUFBVTtJQUNWaHpFLEVBQUUsR0FBQWl6RSxTQUFBLENBQUZqekUsRUFBRTtJQUNGeU8sS0FBSyxHQUFBd2tFLFNBQUEsQ0FBTHhrRSxLQUFLO0lBQ0xpVixPQUFPLEdBQUF1dkQsU0FBQSxDQUFQdnZELE9BQU87SUFDUGd2RCxXQUFXLEdBQUFPLFNBQUEsQ0FBWFAsV0FBVztJQUNYSSxlQUFlLEdBQUFHLFNBQUEsQ0FBZkgsZUFBZTtJQUNmQyxnQkFBZ0IsR0FBQUUsU0FBQSxDQUFoQkYsZ0JBQWdCOztFQUdwQjtFQUNBO0VBQ0EsSUFBTUcscUJBQXFCLEdBQ3ZCLENBQUFqbkIsUUFBUSxhQUFSQSxRQUFRLHVCQUFSQSxRQUFRLENBQUV5bUIsV0FBVyxNQUFLNXpFLFNBQVMsSUFDbkNtdEQsUUFBUSxDQUFDeW1CLFdBQVcsS0FBS0EsV0FBVztFQUV4QyxJQUFJLENBQUNNLFVBQVUsSUFBSSxDQUFDTixXQUFXLElBQUlRLHFCQUFxQixFQUFFO0lBQ3REO0VBQ0o7RUFFQWwxRSxpREFBTyxDQUFDLFVBQUF5MEUsYUFBYSxFQUFJO0lBQ3JCLElBQUFVLG9CQUFBLEdBQTZCVixhQUFhLENBQUM3aUQsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUFBd2pELHFCQUFBLEdBQUE5MEUsY0FBQSxDQUFBNjBFLG9CQUFBO01BQTlDdjVCLFFBQVEsR0FBQXc1QixxQkFBQTtNQUFFZCxRQUFRLEdBQUFjLHFCQUFBO0lBQ3pCLElBQUlubkIsUUFBUSxDQUFDclMsUUFBUSxDQUFDLEtBQUs5NkMsU0FBUyxFQUFFO01BQ2xDLElBQU11MEUsT0FBTyxHQUFHdEIsUUFBUSxDQUFDZ0IsZ0JBQWdCLEVBQUVwM0MsUUFBUSxDQUFDO01BQ3BELElBQUEyM0MsYUFBQSxHQUFrQmpCLFlBQVksQ0FBQzN1RCxPQUFPLEVBQUVrMkIsUUFBUSxFQUFFMDRCLFFBQVEsQ0FBQztRQUFwREwsT0FBTyxHQUFBcUIsYUFBQSxDQUFQckIsT0FBTztNQUVkLElBQU1zQixPQUFPLEdBQUdmLFVBQVUsQ0FBQ3h5RSxFQUFFLEVBQUV5eUUsYUFBYSxFQUFFQyxXQUFXLENBQUM7TUFDMUQsSUFBSWMsV0FBVyxHQUFHdkIsT0FBTyxDQUFDeGpFLEtBQUssQ0FBQ21yQyxRQUFRLENBQUMsQ0FBQztNQUMxQyxJQUFNNjVCLE1BQU0sR0FBR3hCLE9BQU8sQ0FBQ2htQixRQUFRLENBQUNyUyxRQUFRLENBQUMsQ0FBQzs7TUFFMUM7TUFDQTtNQUNBO01BQ0EsSUFBSTQ1QixXQUFXLEtBQUtDLE1BQU0sRUFBRTtRQUN4QixJQUFJSixPQUFPLENBQUMxQyxPQUFPLENBQUM0QyxPQUFPLENBQUMsRUFBRTtVQUMxQkMsV0FBVyxHQUFHSCxPQUFPLENBQUNwUCxPQUFPLENBQUNzUCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0M7UUFDQSxJQUFNampELElBQUksR0FDTmtqRCxXQUFXLEtBQUsxMEUsU0FBUyxHQUNuQixDQUFDMjBFLE1BQU0sQ0FBQyxHQUNSLENBQUNBLE1BQU0sRUFBRUQsV0FBVyxDQUFDO1FBQy9CSCxPQUFPLENBQUN6TyxPQUFPLENBQUMyTyxPQUFPLEVBQUVqakQsSUFBSSxFQUFFcUwsUUFBUSxDQUFDO01BQzVDO0lBQ0o7RUFDSixDQUFDLEVBQUVtM0MsZUFBZSxDQUFDO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3JxQyxnQkFBZ0JBLENBQUM5L0IsTUFBTSxFQUFFZ3pCLFFBQVEsRUFBRTtFQUMvQyxJQUFJdGMsaURBQUksQ0FBQzFXLE1BQU0sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDQSxNQUFNLENBQUM4RixLQUFLLEVBQUU7SUFDNUMsT0FBTzlGLE1BQU07RUFDakI7RUFFQSxPQUFPK3FFLGVBQWUsQ0FBQy9xRSxNQUFNLEVBQUVBLE1BQU0sRUFBRSxFQUFFLEVBQUVnekIsUUFBUSxDQUFDO0FBQ3hEO0FBRUEsSUFBTWc0QyxJQUFJLEdBQUcsSUFBSTtBQUNqQixTQUFTQyxPQUFPQSxDQUFDdHZFLEdBQUcsRUFBRSt1RSxPQUFPLEVBQUUzdkQsT0FBTyxFQUFFalYsS0FBSyxFQUFFZ2tFLGFBQWEsRUFBRWovQyxNQUFNLEVBQUVzOUIsSUFBSSxFQUFFO0VBQ3hFLElBQUl1aUIsT0FBTyxDQUFDMUMsT0FBTyxDQUFDcnNFLEdBQUcsQ0FBQyxFQUFFO0lBQ3RCLElBQUF1dkUsZ0JBQUEsR0FBOEJSLE9BQU8sQ0FBQ3BQLE9BQU8sQ0FBQzMvRCxHQUFHLENBQUM7TUFBQXd2RSxpQkFBQSxHQUFBeDFFLGNBQUEsQ0FBQXUxRSxnQkFBQTtNQUEzQ0osTUFBTSxHQUFBSyxpQkFBQTtNQUFFTixXQUFXLEdBQUFNLGlCQUFBO0lBQzFCLElBQU1DLE9BQU8sR0FBR2pqQixJQUFJLEdBQUcyaUIsTUFBTSxHQUFHRCxXQUFXO0lBQzNDLElBQU1RLEtBQUssR0FBR2xqQixJQUFJLEdBQUcwaUIsV0FBVyxHQUFHQyxNQUFNO0lBQ3pDLElBQUFRLHFCQUFBLEdBQTZCeEIsYUFBYSxDQUFDN2lELEtBQUssQ0FBQyxHQUFHLENBQUM7TUFBQXNrRCxxQkFBQSxHQUFBNTFFLGNBQUEsQ0FBQTIxRSxxQkFBQTtNQUE5Q3I2QixRQUFRLEdBQUFzNkIscUJBQUE7TUFBRTVCLFFBQVEsR0FBQTRCLHFCQUFBO0lBQ3pCLElBQU1DLFNBQVMsR0FBRzlCLFlBQVksQ0FBQzN1RCxPQUFPLEVBQUVrMkIsUUFBUSxFQUFFMDRCLFFBQVEsQ0FBQztJQUUzRCxJQUFJdHpELGlEQUFNLENBQUMrMEQsT0FBTyxFQUFFSSxTQUFTLENBQUNsQyxPQUFPLENBQUN4akUsS0FBSyxDQUFDbXJDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNyRHBtQixNQUFNLENBQUNvbUIsUUFBUSxDQUFDLEdBQUd1NkIsU0FBUyxDQUFDbDRELEtBQUssQ0FDOUIrM0QsS0FBSyxFQUNMcDZCLFFBQVEsSUFBSXBtQixNQUFNLEdBQUdBLE1BQU0sQ0FBQ29tQixRQUFRLENBQUMsR0FBR25yQyxLQUFLLENBQUNtckMsUUFBUSxDQUMxRCxDQUFDO0lBQ0wsQ0FBQyxNQUFNO01BQ0g7TUFDQTtNQUNBeTVCLE9BQU8sQ0FBQ3hDLFVBQVUsQ0FBQ3ZzRSxHQUFHLENBQUM7SUFDM0I7RUFDSjtBQUNKO0FBRUEsU0FBU292RSxlQUFlQSxDQUFDL3FFLE1BQU0sRUFBRXVJLFNBQVMsRUFBRW9FLElBQUksRUFBRXFtQixRQUFRLEVBQUU7RUFDeEQsSUFBQXk0QyxVQUFBLEdBUUl6QixRQUFRLENBQUN6aEUsU0FBUyxDQUFDO0lBUG5COGhFLFVBQVUsR0FBQW9CLFVBQUEsQ0FBVnBCLFVBQVU7SUFDVmh6RSxFQUFFLEdBQUFvMEUsVUFBQSxDQUFGcDBFLEVBQUU7SUFDRnlPLEtBQUssR0FBQTJsRSxVQUFBLENBQUwzbEUsS0FBSztJQUNMaVYsT0FBTyxHQUFBMHdELFVBQUEsQ0FBUDF3RCxPQUFPO0lBQ1BndkQsV0FBVyxHQUFBMEIsVUFBQSxDQUFYMUIsV0FBVztJQUNYSSxlQUFlLEdBQUFzQixVQUFBLENBQWZ0QixlQUFlO0lBQ2ZDLGdCQUFnQixHQUFBcUIsVUFBQSxDQUFoQnJCLGdCQUFnQjtFQUdwQixJQUFJc0IsU0FBUyxHQUFHMXJFLE1BQU07RUFDdEIsSUFBSXFxRSxVQUFVLElBQUlOLFdBQVcsRUFBRTtJQUMzQixJQUFNVyxPQUFPLEdBQUd0QixRQUFRLENBQUNnQixnQkFBZ0IsRUFBRXAzQyxRQUFRLENBQUM7SUFDcEQsSUFBTW5JLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakJ4MUIsaURBQU8sQ0FDSCxVQUFBeTBFLGFBQWE7TUFBQSxPQUNUbUIsT0FBTyxDQUNIcEIsVUFBVSxDQUFDeHlFLEVBQUUsRUFBRXl5RSxhQUFhLEVBQUVDLFdBQVcsQ0FBQyxFQUMxQ1csT0FBTyxFQUNQM3ZELE9BQU8sRUFDUGpWLEtBQUssRUFDTGdrRSxhQUFhLEVBQ2JqL0MsTUFDSixDQUFDO0lBQUEsR0FDTHMvQyxlQUNKLENBQUM7SUFFRCxLQUFLLElBQU1sNUIsUUFBUSxJQUFJcG1CLE1BQU0sRUFBRTtNQUMzQjZnRCxTQUFTLEdBQUd0eEUsaURBQUcsQ0FDWHFxQixpREFBUSxDQUFDOVgsSUFBSSxDQUFDc0gsTUFBTSxDQUFDLE9BQU8sRUFBRWc5QixRQUFRLENBQUMsQ0FBQyxFQUN4Q3BtQixNQUFNLENBQUNvbUIsUUFBUSxDQUFDLEVBQ2hCeTZCLFNBQ0osQ0FBQztJQUNMO0VBQ0o7O0VBRUE7RUFDQSxJQUFPL3NFLFFBQVEsR0FBSW1ILEtBQUssQ0FBakJuSCxRQUFRO0VBQ2YsSUFBSXhKLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQzhILFFBQVEsQ0FBQyxFQUFFO0lBQ3pCQSxRQUFRLENBQUN0SixPQUFPLENBQUMsVUFBQ3VKLEtBQUssRUFBRTlJLENBQUMsRUFBSztNQUMzQixJQUFJNGdCLGlEQUFJLENBQUM5WCxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUlBLEtBQUssQ0FBQ2tILEtBQUssRUFBRTtRQUN6QzRsRSxTQUFTLEdBQUdYLGVBQWUsQ0FDdkJXLFNBQVMsRUFDVDlzRSxLQUFLLEVBQ0wrTixJQUFJLENBQUNzSCxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRW5lLENBQUMsQ0FBQyxFQUNuQ2s5QixRQUNKLENBQUM7TUFDTDtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUMsTUFBTSxJQUFJdGMsaURBQUksQ0FBQy9YLFFBQVEsQ0FBQyxLQUFLLFFBQVEsSUFBSUEsUUFBUSxDQUFDbUgsS0FBSyxFQUFFO0lBQ3RENGxFLFNBQVMsR0FBR1gsZUFBZSxDQUN2QlcsU0FBUyxFQUNUL3NFLFFBQVEsRUFDUmdPLElBQUksQ0FBQ3NILE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQ2hDK2UsUUFDSixDQUFDO0VBQ0w7RUFDQSxPQUFPMDRDLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMzSyxnQkFBZ0JBLENBQUMvZ0UsTUFBTSxFQUFFc2pELFFBQVEsRUFBRXR3QixRQUFRLEVBQUU7RUFDekQsSUFBQTI0QyxVQUFBLEdBUUkzQixRQUFRLENBQUNocUUsTUFBTSxDQUFDO0lBUGhCcXFFLFVBQVUsR0FBQXNCLFVBQUEsQ0FBVnRCLFVBQVU7SUFDVmh6RSxFQUFFLEdBQUFzMEUsVUFBQSxDQUFGdDBFLEVBQUU7SUFDRnlPLEtBQUssR0FBQTZsRSxVQUFBLENBQUw3bEUsS0FBSztJQUNMaWtFLFdBQVcsR0FBQTRCLFVBQUEsQ0FBWDVCLFdBQVc7SUFDWEksZUFBZSxHQUFBd0IsVUFBQSxDQUFmeEIsZUFBZTtJQUNmQyxnQkFBZ0IsR0FBQXVCLFVBQUEsQ0FBaEJ2QixnQkFBZ0I7SUFDaEJydkQsT0FBTyxHQUFBNHdELFVBQUEsQ0FBUDV3RCxPQUFPO0VBR1gsSUFBTTZ3RCxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSTM2QixRQUFRLEVBQUU0NkIsT0FBTztJQUFBLE9BQy9CNTZCLFFBQVEsSUFBSXFTLFFBQVEsR0FBR0EsUUFBUSxDQUFDclMsUUFBUSxDQUFDLEdBQUc0NkIsT0FBTztFQUFBO0VBQ3ZELElBQU1DLGdCQUFnQixHQUFHRixRQUFRLENBQUMsYUFBYSxFQUFFN0IsV0FBVyxDQUFDO0VBRTdELElBQUksQ0FBQ00sVUFBVSxJQUFJLEVBQUVOLFdBQVcsSUFBSStCLGdCQUFnQixDQUFDLEVBQUU7SUFDbkQsT0FBT3hvQixRQUFRO0VBQ25CO0VBRUEsSUFBTXlvQixvQkFBb0IsR0FBR0gsUUFBUSxDQUFDLGtCQUFrQixFQUFFeEIsZ0JBQWdCLENBQUM7RUFDM0UsSUFBTTRCLG1CQUFtQixHQUFHSixRQUFRLENBQUMsaUJBQWlCLEVBQUV6QixlQUFlLENBQUM7RUFDeEUsSUFBTThCLGtCQUFrQixHQUNwQkgsZ0JBQWdCLEtBQUsvQixXQUFXLElBQ2hDZ0Msb0JBQW9CLEtBQUszQixnQkFBZ0IsSUFDekM0QixtQkFBbUIsS0FBSzdCLGVBQWU7RUFFM0MsSUFBTStCLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBR3BDLGFBQWE7SUFBQSxPQUMvQixFQUFFQSxhQUFhLENBQUM3aUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJcThCLFFBQVEsQ0FBQztFQUFBO0VBRTlDLElBQU16NEIsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUVqQixJQUFJc2hELGdCQUFnQixHQUFHcm1FLEtBQUs7RUFFNUIsSUFBSW1tRSxrQkFBa0IsSUFBSWxDLFdBQVcsRUFBRTtJQUNuQztJQUNBLElBQU1XLE9BQU8sR0FBR3RCLFFBQVEsQ0FBQ2dCLGdCQUFnQixFQUFFcDNDLFFBQVEsQ0FBQztJQUNwRDM5QixpREFBTyxDQUNILFVBQUF5MEUsYUFBYTtNQUFBLE9BQ1RtQixPQUFPLENBQ0hwQixVQUFVLENBQUN4eUUsRUFBRSxFQUFFeXlFLGFBQWEsRUFBRUMsV0FBVyxDQUFDLEVBQzFDVyxPQUFPLEVBQ1AzdkQsT0FBTyxFQUNQalYsS0FBSyxFQUNMZ2tFLGFBQWEsRUFDYmovQyxNQUFNLEVBQ05tZ0QsSUFDSixDQUFDO0lBQUEsR0FDTHp6RSxpREFBTSxDQUFDMjBFLGFBQWEsRUFBRS9CLGVBQWUsQ0FDekMsQ0FBQztJQUNEZ0MsZ0JBQWdCLEdBQUdybUQsa0RBQVUsQ0FBQ2hnQixLQUFLLEVBQUUra0IsTUFBTSxDQUFDO0VBQ2hEO0VBRUEsSUFBSWloRCxnQkFBZ0IsSUFBSUcsa0JBQWtCLEVBQUU7SUFDeEMsSUFBTUcsWUFBWSxHQUFHaEQsUUFBUSxDQUFDMkMsb0JBQW9CLEVBQUUvNEMsUUFBUSxDQUFDO0lBQzdEO0lBQ0EzOUIsaURBQU8sQ0FDSCxVQUFBeTBFLGFBQWE7TUFBQSxPQUNUbUIsT0FBTyxDQUNIcEIsVUFBVSxDQUFDeHlFLEVBQUUsRUFBRXl5RSxhQUFhLEVBQUVnQyxnQkFBZ0IsQ0FBQyxFQUMvQ00sWUFBWSxFQUNacnhELE9BQU8sRUFDUG94RCxnQkFBZ0IsRUFDaEJyQyxhQUFhLEVBQ2JqL0MsTUFDSixDQUFDO0lBQUEsR0FDTHR6QixpREFBTSxDQUFDMjBFLGFBQWEsRUFBRUYsbUJBQW1CLENBQzdDLENBQUM7RUFDTDtFQUNBLE9BQU9DLGtCQUFrQixHQUFHbm1ELGtEQUFVLENBQUN3OUIsUUFBUSxFQUFFejRCLE1BQU0sQ0FBQyxHQUFHeTRCLFFBQVE7QUFDdkU7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9nQm1EO0FBRXBDLFNBQVMrb0IsZ0JBQWdCQSxDQUFDbC9DLEtBQUssRUFBRTtFQUM1QyxPQUFPLFNBQVNtL0MsVUFBVUEsQ0FBQSxFQUFxQjtJQUFBLElBQXBCOTJDLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUFBLElBQUU2aUQsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0lBQ3pDLElBQUlvMkUsUUFBUSxHQUFHLzJDLEtBQUs7SUFDcEIsSUFBSXFpQixNQUFNLENBQUNuaEMsSUFBSSxLQUFLeVcsS0FBSyxFQUFFO01BQ3ZCLElBQUFxL0MsZUFBQSxHQUE4QjMwQixNQUFNLENBQUM3USxPQUFPO1FBQXJDM3ZDLEVBQUUsR0FBQW0xRSxlQUFBLENBQUZuMUUsRUFBRTtRQUFFbXFDLE1BQU0sR0FBQWdyQyxlQUFBLENBQU5ockMsTUFBTTtRQUFFRCxPQUFPLEdBQUFpckMsZUFBQSxDQUFQanJDLE9BQU87TUFDMUIsSUFBTWtyQyxVQUFVLEdBQUc7UUFBQ2pyQyxNQUFNO1FBQUVEO01BQU8sQ0FBQztNQUNwQyxJQUFJcHNDLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQ1EsRUFBRSxDQUFDLEVBQUU7UUFDbkJrMUUsUUFBUSxHQUFHNzVELGlEQUFTLENBQUNyYixFQUFFLEVBQUVvMUUsVUFBVSxFQUFFajNDLEtBQUssQ0FBQztNQUMvQyxDQUFDLE1BQU0sSUFBSW4rQixFQUFFLEVBQUU7UUFDWGsxRSxRQUFRLEdBQUc1NUQsaURBQUssQ0FBQ3RiLEVBQUUsRUFBRW8xRSxVQUFVLEVBQUVqM0MsS0FBSyxDQUFDO01BQzNDLENBQUMsTUFBTTtRQUNIKzJDLFFBQVEsR0FBR3ptRCxpREFBVSxDQUFDMFAsS0FBSyxFQUFFaTNDLFVBQVUsQ0FBQztNQUM1QztJQUNKO0lBQ0EsT0FBT0YsUUFBUTtFQUNuQixDQUFDO0FBQ0w7Ozs7Ozs7Ozs7Ozs7O0FDbEIrQztBQUNQO0FBRXhDLFNBQVNsc0MsWUFBWUEsQ0FBQSxFQUF5QztFQUFBLElBQXhDN0ssS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcrcUMsdURBQVcsQ0FBQyxTQUFTLENBQUM7RUFBQSxJQUFFOFgsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQ3hELFFBQVEwaEQsTUFBTSxDQUFDbmhDLElBQUk7SUFDZixLQUFLa2hDLDZEQUFTLENBQUMsbUJBQW1CLENBQUM7TUFDL0IsT0FBTzdYLHVEQUFXLENBQUM4WCxNQUFNLENBQUM3USxPQUFPLENBQUM7SUFDdEM7TUFDSSxPQUFPeFIsS0FBSztFQUNwQjtBQUNKO0FBRUEsK0RBQWU2SyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNac0I7QUFDakQsSUFBTXFzQyxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBSTM2QixHQUFHLEVBQUV2YyxLQUFLO0VBQUEsT0FBSzdpQixpREFBSyxDQUFDby9CLEdBQUcsQ0FBQ29CLEtBQUssRUFBRXBCLEdBQUcsRUFBRXZjLEtBQUssQ0FBQztBQUFBO0FBQzNELElBQU1tM0MsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUl4NUIsS0FBSyxFQUFFM2QsS0FBSztFQUFBLE9BQUtoZ0IsaURBQU0sQ0FBQzI5QixLQUFLLEVBQUUzZCxLQUFLLENBQUM7QUFBQTtBQUN4RCxJQUFNbzNDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJejVCLEtBQUssRUFBRTNkLEtBQUs7RUFBQSxPQUFLOWlCLGlEQUFTLENBQUMsQ0FBQ3lnQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFM2QsS0FBSyxDQUFDO0FBQUE7QUFDakYsNkJBQWUsc0NBQThCO0VBQUEsSUFBcEJBLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUFBLElBQUU2aUQsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQ3ZDLFFBQVEwaEQsTUFBTSxDQUFDbmhDLElBQUk7SUFDZixLQUFLLGtCQUFrQjtNQUNuQixPQUFPZzJELE1BQU0sQ0FBQzcwQixNQUFNLENBQUM3USxPQUFPLEVBQUV4UixLQUFLLENBQUM7SUFDeEMsS0FBSyxxQkFBcUI7TUFDdEIsT0FBT20zQyxTQUFTLENBQUM5MEIsTUFBTSxDQUFDN1EsT0FBTyxDQUFDbU0sS0FBSyxFQUFFM2QsS0FBSyxDQUFDO0lBQ2pELEtBQUssdUJBQXVCO01BQ3hCLE9BQU9vM0MsV0FBVyxDQUFDLzBCLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQ21NLEtBQUssRUFBRTNkLEtBQUssQ0FBQztJQUNuRDtNQUNJLE9BQU9BLEtBQUs7RUFDcEI7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZtRDtBQUM1QyxJQUFJMFMsa0JBQWtCO0FBQzdCLENBQUMsVUFBVUEsa0JBQWtCLEVBQUU7RUFDM0JBLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxHQUFHLHNCQUFzQjtFQUN6REEsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEdBQUcsdUJBQXVCO0VBQzNEQSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyx3QkFBd0I7RUFDN0RBLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsMEJBQTBCO0VBQ2pFQSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyx3QkFBd0I7RUFDN0RBLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLHFCQUFxQjtFQUN2REEsa0JBQWtCLENBQUMsWUFBWSxDQUFDLEdBQUcsc0JBQXNCO0VBQ3pEQSxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyx5QkFBeUI7RUFDL0RBLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsMEJBQTBCO0VBQ2pFQSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLDJCQUEyQjtFQUNuRUEsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsR0FBRyw2QkFBNkI7RUFDdkVBLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsMkJBQTJCO0VBQ25FQSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyx3QkFBd0I7RUFDN0RBLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLHlCQUF5QjtBQUNuRSxDQUFDLEVBQUVBLGtCQUFrQixLQUFLQSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLElBQUlDLDJCQUEyQjtBQUN0QyxDQUFDLFVBQVVBLDJCQUEyQixFQUFFO0VBQ3BDQSwyQkFBMkIsQ0FBQyxjQUFjLENBQUMsR0FBRyxxQkFBcUI7RUFDbkVBLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxHQUFHLHFCQUFxQjtBQUNwRSxDQUFDLEVBQUVBLDJCQUEyQixLQUFLQSwyQkFBMkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLElBQU0wa0MsYUFBYSxHQUFHO0VBQ2xCcEksT0FBTyxFQUFFLEVBQUU7RUFDWHpELFFBQVEsRUFBRSxFQUFFO0VBQ1owQixTQUFTLEVBQUUsRUFBRTtFQUNieUIsV0FBVyxFQUFFLEVBQUU7RUFDZlMsU0FBUyxFQUFFLEVBQUU7RUFDYkQsTUFBTSxFQUFFLEVBQUU7RUFDVjlCLE9BQU8sRUFBRSxFQUFFO0VBQ1hpSyxTQUFTLEVBQUU7QUFDZixDQUFDO0FBQ0QsSUFBTUMsVUFBVSxHQUFHO0VBQ2YsQ0FBQzdrQyxrQkFBa0IsQ0FBQ2tCLFVBQVUsR0FBR24xQiw2Q0FBTTtFQUN2QyxDQUFDaTBCLGtCQUFrQixDQUFDc0IsV0FBVyxHQUFHdjFCLDZDQUFNO0VBQ3hDLENBQUNpMEIsa0JBQWtCLENBQUN3QixZQUFZLEdBQUd6MUIsNkNBQU07RUFDekMsQ0FBQ2kwQixrQkFBa0IsQ0FBQzBCLGNBQWMsR0FBRzMxQiw2Q0FBTTtFQUMzQyxDQUFDaTBCLGtCQUFrQixDQUFDNEIsWUFBWSxHQUFHNzFCLDZDQUFNO0VBQ3pDLENBQUNpMEIsa0JBQWtCLENBQUM4QixTQUFTLEdBQUcvMUIsNkNBQU07RUFDdEMsQ0FBQ2kwQixrQkFBa0IsQ0FBQ2dDLFVBQVUsR0FBR2oyQiw2Q0FBTTtFQUN2QyxDQUFDaTBCLGtCQUFrQixDQUFDb0MsYUFBYSxHQUFHbndDLDZDQUFVO0VBQzlDLENBQUMrdEMsa0JBQWtCLENBQUNrQyxjQUFjLEdBQUdqd0MsNkNBQVU7RUFDL0MsQ0FBQyt0QyxrQkFBa0IsQ0FBQ3NDLGVBQWUsR0FBR3J3Qyw2Q0FBVTtFQUNoRCxDQUFDK3RDLGtCQUFrQixDQUFDd0MsaUJBQWlCLEdBQUd2d0MsNkNBQVU7RUFDbEQsQ0FBQyt0QyxrQkFBa0IsQ0FBQzBDLGVBQWUsR0FBR3p3Qyw2Q0FBVTtFQUNoRCxDQUFDK3RDLGtCQUFrQixDQUFDNEMsWUFBWSxHQUFHM3dDLDZDQUFVO0VBQzdDLENBQUMrdEMsa0JBQWtCLENBQUM4QyxhQUFhLEdBQUc3d0MsNkNBQVVBO0FBQ2xELENBQUM7QUFDRCxJQUFNNnlFLE1BQU0sR0FBRztFQUNYLENBQUM5a0Msa0JBQWtCLENBQUNrQixVQUFVLEdBQUcsU0FBUztFQUMxQyxDQUFDbEIsa0JBQWtCLENBQUNzQixXQUFXLEdBQUcsVUFBVTtFQUM1QyxDQUFDdEIsa0JBQWtCLENBQUN3QixZQUFZLEdBQUcsV0FBVztFQUM5QyxDQUFDeEIsa0JBQWtCLENBQUMwQixjQUFjLEdBQUcsYUFBYTtFQUNsRCxDQUFDMUIsa0JBQWtCLENBQUM0QixZQUFZLEdBQUcsV0FBVztFQUM5QyxDQUFDNUIsa0JBQWtCLENBQUM4QixTQUFTLEdBQUcsUUFBUTtFQUN4QyxDQUFDOUIsa0JBQWtCLENBQUNnQyxVQUFVLEdBQUcsU0FBUztFQUMxQyxDQUFDaEMsa0JBQWtCLENBQUNvQyxhQUFhLEdBQUcsU0FBUztFQUM3QyxDQUFDcEMsa0JBQWtCLENBQUNrQyxjQUFjLEdBQUcsVUFBVTtFQUMvQyxDQUFDbEMsa0JBQWtCLENBQUNzQyxlQUFlLEdBQUcsV0FBVztFQUNqRCxDQUFDdEMsa0JBQWtCLENBQUN3QyxpQkFBaUIsR0FBRyxhQUFhO0VBQ3JELENBQUN4QyxrQkFBa0IsQ0FBQzBDLGVBQWUsR0FBRyxXQUFXO0VBQ2pELENBQUMxQyxrQkFBa0IsQ0FBQzRDLFlBQVksR0FBRyxRQUFRO0VBQzNDLENBQUM1QyxrQkFBa0IsQ0FBQzhDLGFBQWEsR0FBRztBQUN4QyxDQUFDO0FBQ0QsSUFBTWlpQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUl6M0MsS0FBSyxFQUFFcWlCLE1BQU07RUFBQSxPQUFBcFUsYUFBQSxDQUFBQSxhQUFBLEtBQy9Cak8sS0FBSztJQUNSczNDLFNBQVMsRUFBRXQzQyxLQUFLLENBQUNzM0MsU0FBUyxHQUFHajFCLE1BQU0sQ0FBQzdRO0VBQU87QUFBQSxDQUM3QztBQUNGLElBQU1rbUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJMTNDLEtBQUssRUFBRXFpQixNQUFNLEVBQUs7RUFDdkMsSUFBTTJ6QixTQUFTLEdBQUd1QixVQUFVLENBQUNsMUIsTUFBTSxDQUFDbmhDLElBQUksQ0FBQztFQUN6QyxJQUFNeTJELEtBQUssR0FBR0gsTUFBTSxDQUFDbjFCLE1BQU0sQ0FBQ25oQyxJQUFJLENBQUM7RUFDakMsT0FBTyxDQUFDODBELFNBQVMsSUFBSSxDQUFDMkIsS0FBSyxJQUFJdDFCLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQy94QyxNQUFNLEtBQUssQ0FBQyxHQUNwRHVnQyxLQUFLLEdBQUFpTyxhQUFBLENBQUFBLGFBQUEsS0FFQWpPLEtBQUs7SUFDUixDQUFDMjNDLEtBQUssR0FBRzNCLFNBQVMsQ0FBQ2gyQyxLQUFLLENBQUMyM0MsS0FBSyxDQUFDLEVBQUV0MUIsTUFBTSxDQUFDN1EsT0FBTztFQUFDLEVBQ25EO0FBQ1QsQ0FBQztBQUNELCtEQUFlO0VBQUEsSUFBQ3hSLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHNjNFLGFBQWE7RUFBQSxJQUFFaDFCLE1BQU0sR0FBQTdpRCxTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBbUIsU0FBQTtFQUFBLE9BQUttZSxpREFBTSxDQUFDLFVBQUNsVyxDQUFDLEVBQUV1VixDQUFDLEVBQUs7SUFDL0QsSUFBSUEsQ0FBQyxLQUFLLElBQUksRUFBRTtNQUNaLE9BQU92VixDQUFDO0lBQ1osQ0FBQyxNQUNJLElBQUl1VixDQUFDLENBQUMrQyxJQUFJLEtBQUt5eEIsMkJBQTJCLENBQUNtQixZQUFZLEVBQUU7TUFDMUQsT0FBTzJqQyxlQUFlLENBQUM3dUUsQ0FBQyxFQUFFdVYsQ0FBQyxDQUFDO0lBQ2hDO0lBQ0EsT0FBT3U1RCxlQUFlLENBQUM5dUUsQ0FBQyxFQUFFdVYsQ0FBQyxDQUFDO0VBQ2hDLENBQUMsRUFBRTZoQixLQUFLLEVBQUVxaUIsTUFBTSxDQUFDbmhDLElBQUksS0FBS3l4QiwyQkFBMkIsQ0FBQytDLFNBQVMsR0FDekQyTSxNQUFNLENBQUM3USxPQUFPLEdBQ2QsQ0FBQzZRLE1BQU0sQ0FBQyxDQUFDO0FBQUE7Ozs7Ozs7Ozs7OztBQ3pGZixJQUFNdTFCLGFBQWEsR0FBRztFQUNsQi8xRSxFQUFFLEVBQUUsSUFBSTtFQUNSeU8sS0FBSyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBU2l1RCxPQUFPQSxDQUFBLEVBQXdCO0VBQUEsSUFBdkJ2K0IsS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUdvNEUsYUFBYTtFQUNsQztFQUNBO0VBQ0E7RUFDQSxPQUFPNTNDLEtBQUs7QUFDaEI7QUFFQSwrREFBZXUrQixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1p5QjtBQUNWO0FBRXRCLFNBQVN6ekIsTUFBTUEsQ0FBQSxFQUF1QjtFQUFBLElBQXRCOUssS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsSUFBSTtFQUFBLElBQUU2aUQsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQy9DLElBQUkwaEQsTUFBTSxDQUFDbmhDLElBQUksS0FBS2toQyw2REFBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3pDO0lBQ0EvckIsTUFBTSxDQUFDOGdDLDJCQUEyQixHQUFHdG5DLGlEQUFjLENBQy9Dd0csTUFBTSxDQUFDOGdDLDJCQUEyQixJQUFJLENBQUMsQ0FBQyxFQUN4QzlVLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQ3FtQyxjQUNuQixDQUFDO0lBQ0QsT0FBT3gxQixNQUFNLENBQUM3USxPQUFPO0VBQ3pCLENBQUMsTUFBTSxJQUFJNlEsTUFBTSxDQUFDbmhDLElBQUksS0FBS2toQyw2REFBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7SUFDdEQsT0FBT3Z5QixpREFBYyxDQUFDbVEsS0FBSyxFQUFFO01BQ3pCbU8sS0FBSyxFQUFFO1FBQ0hFLE9BQU8sRUFBRWdVLE1BQU0sQ0FBQzdRO01BQ3BCO0lBQ0osQ0FBQyxDQUFDO0VBQ047RUFDQSxPQUFPeFIsS0FBSztBQUNoQjs7Ozs7Ozs7Ozs7Ozs7O0FDbkJPLFNBQVN1SyxXQUFXQSxDQUFDdkssS0FBSyxFQUFFO0VBQy9CLElBQU04M0MsU0FBUyxHQUFHO0lBQ2RDLE9BQU8sRUFBRSxTQUFTO0lBQ2xCQyxRQUFRLEVBQUUsVUFBVTtJQUNwQkMsU0FBUyxFQUFFO0VBQ2YsQ0FBQztFQUNELElBQUlILFNBQVMsQ0FBQzkzQyxLQUFLLENBQUMsRUFBRTtJQUNsQixPQUFPODNDLFNBQVMsQ0FBQzkzQyxLQUFLLENBQUM7RUFDM0I7RUFDQSxNQUFNLElBQUkvYixLQUFLLElBQUF4RixNQUFBLENBQUl1aEIsS0FBSywrQkFBNEIsQ0FBQztBQUN6RDs7Ozs7Ozs7Ozs7O0FDVkEsSUFBTWs0QyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXZCLElBQU0zckMsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUEsRUFBcUM7RUFBQSxJQUFqQ3ZNLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHMDRFLFlBQVk7RUFBQSxJQUFFNzFCLE1BQU0sR0FBQTdpRCxTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBbUIsU0FBQTtFQUN4QyxJQUFJMGhELE1BQU0sQ0FBQ25oQyxJQUFJLEtBQUssWUFBWSxFQUFFO0lBQzlCLE9BQU9taEMsTUFBTSxDQUFDN1EsT0FBTztFQUN6QjtFQUNBLE9BQU94UixLQUFLO0FBQ2hCLENBQUM7QUFFRCwrREFBZXVNLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUWTtBQUVqQyxJQUFNNHJDLFlBQVksR0FBRztFQUNqQnJyQyxRQUFRLEVBQUUsRUFBRTtFQUNaQyxPQUFPLEVBQUUsRUFBRTtFQUNYd0UsZ0JBQWdCLEVBQUU7QUFDdEIsQ0FBQztBQUVjLFNBQVNwVyxLQUFLQSxDQUFBLEVBQStCO0VBQUEsSUFBOUI2RSxLQUFLLEdBQUF4Z0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRzI0RSxZQUFZO0VBQUEsSUFBRTkxQixNQUFNLEdBQUE3aUQsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQW1CLFNBQUE7RUFDdEQsUUFBUTBoRCxNQUFNLENBQUNuaEMsSUFBSTtJQUNmLEtBQUssVUFBVTtNQUFFO1FBQ2IsSUFBTzRyQixRQUFRLEdBQStCOU0sS0FBSyxDQUE1QzhNLFFBQVE7VUFBRUMsT0FBTyxHQUFzQi9NLEtBQUssQ0FBbEMrTSxPQUFPO1VBQUV3RSxnQkFBZ0IsR0FBSXZSLEtBQUssQ0FBekJ1UixnQkFBZ0I7UUFDMUM7UUFDQTtRQUNBO1FBQ0E3N0IsT0FBTyxDQUFDeWxCLEtBQUssQ0FBQ2tuQixNQUFNLENBQUM3USxPQUFPLENBQUNyVyxLQUFLLENBQUM7UUFFbkMsSUFBSWtuQixNQUFNLENBQUM3USxPQUFPLENBQUN0d0IsSUFBSSxLQUFLLFVBQVUsRUFBRTtVQUNwQyxPQUFPO1lBQ0g0ckIsUUFBUSxHQUNKeGMsaURBQVUsQ0FBQyt4QixNQUFNLENBQUM3USxPQUFPLEVBQUU7Y0FBQ295QixTQUFTLEVBQUUsSUFBSTUrQyxJQUFJLENBQUM7WUFBQyxDQUFDLENBQUMsRUFBQXZHLE1BQUEsQ0FBQXliLGtCQUFBLENBQ2hENFMsUUFBUSxFQUNkO1lBQ0RDLE9BQU87WUFDUHdFO1VBQ0osQ0FBQztRQUNMLENBQUMsTUFBTSxJQUFJOFEsTUFBTSxDQUFDN1EsT0FBTyxDQUFDdHdCLElBQUksS0FBSyxTQUFTLEVBQUU7VUFDMUMsT0FBTztZQUNINHJCLFFBQVE7WUFDUkMsT0FBTyxHQUNIemMsaURBQVUsQ0FBQyt4QixNQUFNLENBQUM3USxPQUFPLEVBQUU7Y0FBQ295QixTQUFTLEVBQUUsSUFBSTUrQyxJQUFJLENBQUM7WUFBQyxDQUFDLENBQUMsRUFBQXZHLE1BQUEsQ0FBQXliLGtCQUFBLENBQ2hENlMsT0FBTyxFQUNiO1lBQ0R3RTtVQUNKLENBQUM7UUFDTDtRQUNBLE9BQU92UixLQUFLO01BQ2hCO0lBQ0EsS0FBSyx1QkFBdUI7TUFBRTtRQUMxQixPQUFPMVAsaURBQVUsQ0FBQzBQLEtBQUssRUFBRTtVQUFDdVIsZ0JBQWdCLEVBQUU4USxNQUFNLENBQUM3UTtRQUFPLENBQUMsQ0FBQztNQUNoRTtJQUVBO01BQVM7UUFDTCxPQUFPeFIsS0FBSztNQUNoQjtFQUNKO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlDQSxJQUFNbzRDLGNBQWMsR0FBRztFQUNuQnJsQixJQUFJLEVBQUUsRUFBRTtFQUNSc2xCLE9BQU8sRUFBRSxDQUFDLENBQUM7RUFDWHZsQixNQUFNLEVBQUU7QUFDWixDQUFDO0FBRUQsU0FBUzVsQixPQUFPQSxDQUFBLEVBQWlDO0VBQUEsSUFBaENsTixLQUFLLEdBQUF4Z0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRzQ0RSxjQUFjO0VBQUEsSUFBRS8xQixNQUFNLEdBQUE3aUQsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQW1CLFNBQUE7RUFDM0MsUUFBUTBoRCxNQUFNLENBQUNuaEMsSUFBSTtJQUNmLEtBQUssTUFBTTtNQUFFO1FBQ1QsSUFBTzZ4QyxJQUFJLEdBQXFCL3lCLEtBQUssQ0FBOUIreUIsSUFBSTtVQUFFc2xCLE9BQU8sR0FBWXI0QyxLQUFLLENBQXhCcTRDLE9BQU87VUFBRXZsQixNQUFNLEdBQUk5eUIsS0FBSyxDQUFmOHlCLE1BQU07UUFDNUIsSUFBTXI1QyxRQUFRLEdBQUdzNUMsSUFBSSxDQUFDQSxJQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFNNjRFLE9BQU8sR0FBR3ZsQixJQUFJLENBQUNwMUMsS0FBSyxDQUFDLENBQUMsRUFBRW8xQyxJQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QyxPQUFPO1VBQ0hzekQsSUFBSSxFQUFFdWxCLE9BQU87VUFDYkQsT0FBTyxFQUFFNStELFFBQVE7VUFDakJxNUMsTUFBTSxHQUFHdWxCLE9BQU8sRUFBQTU1RCxNQUFBLENBQUF5YixrQkFBQSxDQUFLNDRCLE1BQU07UUFDL0IsQ0FBQztNQUNMO0lBRUEsS0FBSyxNQUFNO01BQUU7UUFDVCxJQUFPQyxLQUFJLEdBQXFCL3lCLEtBQUssQ0FBOUIreUIsSUFBSTtVQUFFc2xCLFFBQU8sR0FBWXI0QyxLQUFLLENBQXhCcTRDLE9BQU87VUFBRXZsQixPQUFNLEdBQUk5eUIsS0FBSyxDQUFmOHlCLE1BQU07UUFDNUIsSUFBTTl4RCxJQUFJLEdBQUc4eEQsT0FBTSxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFNeWxCLFNBQVMsR0FBR3psQixPQUFNLENBQUNuMUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqQyxPQUFPO1VBQ0hvMUMsSUFBSSxLQUFBdDBDLE1BQUEsQ0FBQXliLGtCQUFBLENBQU02NEIsS0FBSSxJQUFFc2xCLFFBQU8sRUFBQztVQUN4QkEsT0FBTyxFQUFFcjNFLElBQUk7VUFDYjh4RCxNQUFNLEVBQUV5bEI7UUFDWixDQUFDO01BQ0w7SUFFQSxLQUFLLFFBQVE7TUFBRTtRQUNYLElBQU94bEIsTUFBSSxHQUFZL3lCLEtBQUssQ0FBckIreUIsSUFBSTtVQUFFRCxRQUFNLEdBQUk5eUIsS0FBSyxDQUFmOHlCLE1BQU07UUFDbkIsSUFBTXI1QyxTQUFRLEdBQUdzNUMsTUFBSSxDQUFDQSxNQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFNNjRFLFFBQU8sR0FBR3ZsQixNQUFJLENBQUNwMUMsS0FBSyxDQUFDLENBQUMsRUFBRW8xQyxNQUFJLENBQUN0ekQsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QyxPQUFPO1VBQ0hzekQsSUFBSSxFQUFFdWxCLFFBQU87VUFDYkQsT0FBTyxFQUFFNStELFNBQVE7VUFDakJxNUMsTUFBTSxFQUFBNTRCLGtCQUFBLENBQU00NEIsUUFBTTtRQUN0QixDQUFDO01BQ0w7SUFFQTtNQUFTO1FBQ0wsT0FBTzl5QixLQUFLO01BQ2hCO0VBQ0o7QUFDSjtBQUVBLCtEQUFla04sT0FBTzs7Ozs7Ozs7Ozs7O0FDL0N0QixJQUFNc3JDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBV1o7RUFBQSxJQVZEeDRDLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHO0lBQ0ppdEMsVUFBVSxFQUFFLElBQUk7SUFDaEJDLFdBQVcsRUFBRSxJQUFJO0lBQ2pCbUIsV0FBVyxFQUFFLElBQUk7SUFDakJDLFlBQVksRUFBRSxJQUFJO0lBQ2xCQyxpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCQyxtQkFBbUIsRUFBRSxJQUFJO0lBQ3pCeXFDLElBQUksRUFBRTtFQUNWLENBQUM7RUFBQSxJQUNEcDJCLE1BQU0sR0FBQTdpRCxTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBbUIsU0FBQTtFQUVOLFFBQVEwaEQsTUFBTSxDQUFDbmhDLElBQUk7SUFDZixLQUFLLFdBQVc7TUFDWixPQUFPbWhDLE1BQU0sQ0FBQzdRLE9BQU87SUFDekI7TUFDSSxPQUFPeFIsS0FBSztFQUNwQjtBQUNKLENBQUM7QUFFRCwrREFBZXc0QyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7QUNwQm5CLElBQUlobEIsbUJBQW1CO0FBQzlCLENBQUMsVUFBVUEsbUJBQW1CLEVBQUU7RUFDNUJBLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLGVBQWU7QUFDaEQsQ0FBQyxFQUFFQSxtQkFBbUIsS0FBS0EsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxJQUFNNmpCLGFBQWEsR0FBRyxJQUFJO0FBQzFCLCtEQUFlO0VBQUEsSUFBQ3IzQyxLQUFLLEdBQUF4Z0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQW1CLFNBQUEsR0FBQW5CLFNBQUEsTUFBRzYzRSxhQUFhO0VBQUEsSUFBRWgxQixNQUFNLEdBQUE3aUQsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQW1CLFNBQUE7RUFBQSxPQUFNMGhELE1BQU0sQ0FBQ25oQyxJQUFJLEtBQUtzeUMsbUJBQW1CLENBQUMvd0QsR0FBRyxHQUFHNC9DLE1BQU0sQ0FBQzdRLE9BQU8sR0FBR3hSLEtBQUs7QUFBQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0dyRztBQUVnQztBQUUvQyxJQUFNeDFCLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFBLEVBQTJCO0VBQUEsSUFBdkJ3MUIsS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQUEsSUFBRTZpRCxNQUFNLEdBQUE3aUQsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQW1CLFNBQUE7RUFDOUIsSUFBSTBoRCxNQUFNLENBQUNuaEMsSUFBSSxLQUFLa2hDLDZEQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDekMsSUFBSXppRCxLQUFLLENBQUMwQixPQUFPLENBQUNnaEQsTUFBTSxDQUFDN1EsT0FBTyxDQUFDLEVBQUU7TUFDL0IsT0FBQXRYLGtCQUFBLENBQVdtb0IsTUFBTSxDQUFDN1EsT0FBTztJQUM3QjtJQUNBLE9BQUF2RCxhQUFBLEtBQVdvVSxNQUFNLENBQUM3USxPQUFPO0VBQzdCLENBQUMsTUFBTSxJQUNIaHZCLGlEQUFRLENBQUM2L0IsTUFBTSxDQUFDbmhDLElBQUksRUFBRSxDQUNsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCa2hDLDZEQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FDOUIsQ0FBQyxFQUNKO0lBQ0UsSUFBTXMyQixRQUFRLEdBQUczN0QsaURBQU0sQ0FBQyxPQUFPLEVBQUVzbEMsTUFBTSxDQUFDN1EsT0FBTyxDQUFDNEosUUFBUSxDQUFDO0lBQ3pELElBQU11OUIsYUFBYSxHQUFHcm1ELGlEQUFJLENBQUNyRCxpREFBUSxDQUFDeXBELFFBQVEsQ0FBQyxFQUFFMTRDLEtBQUssQ0FBQztJQUNyRCxJQUFNTixXQUFXLEdBQUdwUCxpREFBVSxDQUFDcW9ELGFBQWEsRUFBRXQyQixNQUFNLENBQUM3USxPQUFPLENBQUNsaEMsS0FBSyxDQUFDO0lBQ25FLE9BQU80TSxpREFBUyxDQUFDdzdELFFBQVEsRUFBRWg1QyxXQUFXLEVBQUVNLEtBQUssQ0FBQztFQUNsRDtFQUNBO0VBQUEsS0FDSyxJQUFJcWlCLE1BQU0sQ0FBQ25oQyxJQUFJLEtBQUtraEMsNkRBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3BELElBQUE0MEIsZUFBQSxHQUFtQzMwQixNQUFNLENBQUM3USxPQUFPO01BQTFDeitCLFNBQVMsR0FBQWlrRSxlQUFBLENBQVRqa0UsU0FBUztNQUFFdTVCLGFBQWEsR0FBQTBxQyxlQUFBLENBQWIxcUMsYUFBYTtJQUMvQixPQUFPcHZCLGlEQUFTLENBQUNvdkIsYUFBYSxFQUFFdjVCLFNBQVMsRUFBRWl0QixLQUFLLENBQUM7RUFDckQsQ0FBQyxNQUFNLElBQUlxaUIsTUFBTSxDQUFDbmhDLElBQUksS0FBS2toQyw2REFBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7SUFDdEQsSUFBTzlWLGNBQWEsR0FBSStWLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBL0JsRixhQUFhO0lBQ3BCLE9BQU92c0IsaURBQVUsQ0FBQ3VzQixjQUFhLEVBQUV0TSxLQUFLLENBQUM7RUFDM0M7RUFFQSxPQUFPQSxLQUFLO0FBQ2hCLENBQUM7QUFFRCwrREFBZXgxQixNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQytCO0FBQ3JDLFNBQVNrcEMsT0FBT0EsQ0FBQSxFQUFxQjtFQUFBLElBQXBCMVQsS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQUEsSUFBRTZpRCxNQUFNLEdBQUE3aUQsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQW1CLFNBQUE7RUFDOUMsUUFBUTBoRCxNQUFNLENBQUNuaEMsSUFBSTtJQUNmLEtBQUssUUFBUTtNQUNULE9BQU9taEMsTUFBTSxDQUFDN1EsT0FBTyxDQUFDMXlCLE1BQU0sQ0FBQyxVQUFDakMsR0FBRyxFQUFFKzdELElBQUksRUFBSztRQUN4QyxJQUFNQyxRQUFRLEdBQUcsQ0FBQ2ovQyxJQUFJLENBQUNDLFNBQVMsQ0FBQysrQyxJQUFJLENBQUN6aEUsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBTXNzQixJQUFJLEdBQUd4UyxpREFBTSxDQUFDLEVBQUUsRUFBRTRuRCxRQUFRLEVBQUVoOEQsR0FBRyxDQUFDO1FBQ3RDLE9BQU9LLGlEQUFTLENBQUMyN0QsUUFBUSxFQUFFcDFDLElBQUksQ0FBQzFoQyxNQUFNLENBQUMsVUFBQzJ4QyxPQUFPO1VBQUEsT0FBS0EsT0FBTyxDQUFDOEMsUUFBUSxLQUFLb2lDLElBQUksQ0FBQ3BpQyxRQUFRO1FBQUEsRUFBQyxFQUFFMzVCLEdBQUcsQ0FBQztNQUNqRyxDQUFDLEVBQUVtakIsS0FBSyxDQUFDO0lBQ2IsS0FBSyxTQUFTO01BQ1YsT0FBT3FpQixNQUFNLENBQUM3USxPQUFPLENBQUMxeUIsTUFBTSxDQUFDLFVBQUNqQyxHQUFHLEVBQUUrN0QsSUFBSSxFQUFLO1FBQ3hDLElBQU1DLFFBQVEsR0FBRyxDQUFDai9DLElBQUksQ0FBQ0MsU0FBUyxDQUFDKytDLElBQUksQ0FBQ3poRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFNc3NCLElBQUksR0FBR3hTLGlEQUFNLENBQUMsRUFBRSxFQUFFNG5ELFFBQVEsRUFBRWg4RCxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDMkYsaURBQVEsQ0FBQ28yRCxJQUFJLEVBQUVuMUMsSUFBSSxDQUFDLEVBQUU7VUFDdkI7VUFDQUEsSUFBSSxDQUFDdmlDLElBQUksQ0FBQzAzRSxJQUFJLENBQUM7UUFDbkI7UUFDQSxPQUFPMTdELGlEQUFTLENBQUMyN0QsUUFBUSxFQUFFcDFDLElBQUksRUFBRTVtQixHQUFHLENBQUM7TUFDekMsQ0FBQyxFQUFFbWpCLEtBQUssQ0FBQztJQUNiO01BQ0ksT0FBT0EsS0FBSztFQUNwQjtBQUNKOzs7Ozs7Ozs7Ozs7O0FDdEIrQztBQUUvQyxJQUFNODRDLFlBQVksR0FBRztFQUFDcmlDLElBQUksRUFBRSxDQUFDLENBQUM7RUFBRWUsSUFBSSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBRXpDLElBQU14QixLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBQSxFQUFxQztFQUFBLElBQWpDaFcsS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUdzNUUsWUFBWTtFQUFBLElBQUV6MkIsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQ3ZDLElBQUkwaEQsTUFBTSxDQUFDbmhDLElBQUksS0FBS2toQyw2REFBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQ3hDLE9BQU9DLE1BQU0sQ0FBQzdRLE9BQU87RUFDekI7RUFDQSxPQUFPeFIsS0FBSztBQUNoQixDQUFDO0FBRUQsK0RBQWVnVyxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1hRO0FBRXFCO0FBRWpELElBQU0raUMsY0FBYyxHQUFHO0VBQ25CaDJFLEtBQUssRUFBRSxDQUFDO0VBQ1IwNUQsS0FBSyxFQUFFLENBQUM7RUFDUjhELE9BQU8sRUFBRSxDQUFDO0VBQ1ZELE9BQU8sRUFBRTtJQUNMOUQsSUFBSSxFQUFFLENBQUM7SUFDUG1FLE1BQU0sRUFBRSxDQUFDO0lBQ1RELFFBQVEsRUFBRTtFQUNkLENBQUM7RUFDRDVuQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0VBQ2I5TSxNQUFNLEVBQUU7SUFDSm14QixNQUFNLEVBQUU7RUFDWixDQUFDO0VBQ0RycUQsTUFBTSxFQUFFLENBQUM7QUFDYixDQUFDO0FBRUQsSUFBTWttRSxZQUFZLEdBQUc7RUFDakJoWixPQUFPLEVBQUUsRUFBRTtFQUNYbG5CLFNBQVMsRUFBRSxDQUFDLENBQUM7RUFDYm9NLFNBQVMsRUFBRSxDQUFDLENBQUM7RUFDYjRaLFdBQVcsRUFBRTtBQUNqQixDQUFDO0FBRUQsSUFBTWpELE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFBLEVBQXFDO0VBQUEsSUFBakM3N0IsS0FBSyxHQUFBeGdDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUd3NUUsWUFBWTtFQUFBLElBQUUzMkIsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQ3pDLElBQUkwaEQsTUFBTSxDQUFDbmhDLElBQUksS0FBSyx1QkFBdUIsRUFBRTtJQUN6QztJQUNBO0lBQ0E7SUFDQSxJQUFBODFELGVBQUEsR0FBNEIzMEIsTUFBTSxDQUFDN1EsT0FBTztNQUFuQzN2QyxFQUFFLEdBQUFtMUUsZUFBQSxDQUFGbjFFLEVBQUU7TUFBRW01QyxLQUFLLEdBQUFnOEIsZUFBQSxDQUFMaDhCLEtBQUs7TUFBRWhQLE1BQU0sR0FBQWdyQyxlQUFBLENBQU5ockMsTUFBTTtJQUN4QixJQUFNaXRDLFlBQVksR0FBR2pYLDJEQUFTLENBQUNoMkIsTUFBTSxDQUFDLElBQUlBLE1BQU07O0lBRWhEO0lBQ0EsSUFBTStxQyxRQUFRLEdBQUc7TUFDYi9XLE9BQU8sRUFBRSxDQUFDbitELEVBQUUsQ0FBQztNQUNiaTNDLFNBQVMsRUFBRTlZLEtBQUssQ0FBQzhZLFNBQVM7TUFDMUJvTSxTQUFTLEVBQUVsbEIsS0FBSyxDQUFDa2xCLFNBQVM7TUFDMUI7TUFDQTtNQUNBO01BQ0E0WixXQUFXLEVBQUU5K0IsS0FBSyxDQUFDOCtCO0lBQ3ZCLENBQUM7SUFFRGlZLFFBQVEsQ0FBQzd4QixTQUFTLENBQUNyakQsRUFBRSxDQUFDLEdBQ2xCazFFLFFBQVEsQ0FBQzd4QixTQUFTLENBQUNyakQsRUFBRSxDQUFDLElBQUltYyxpREFBSyxDQUFDKzZELGNBQWMsQ0FBQztJQUVuRCxJQUFNcGlDLEVBQUUsR0FBR29nQyxRQUFRLENBQUM3eEIsU0FBUyxDQUFDcmpELEVBQUUsQ0FBQztJQUNqQyxJQUFNcTNFLFdBQVcsR0FBR3ZpQyxFQUFFLENBQUNtQyxTQUFTO0lBQ2hDLElBQU1xZ0MsY0FBYyxHQUFHcEMsUUFBUSxDQUFDaitCLFNBQVM7O0lBRXpDO0lBQ0FuQyxFQUFFLENBQUM1ekMsS0FBSyxJQUFJLENBQUM7SUFDYjR6QyxFQUFFLENBQUMzSyxNQUFNLENBQUNteEIsTUFBTSxHQUFHOGIsWUFBWTtJQUMvQnRpQyxFQUFFLENBQUMzSyxNQUFNLENBQUNpdEMsWUFBWSxDQUFDLEdBQUcsQ0FBQ3RpQyxFQUFFLENBQUMzSyxNQUFNLENBQUNpdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDNUR0aUMsRUFBRSxDQUFDN2pDLE1BQU0sR0FBR3V2QyxNQUFNLENBQUM3USxPQUFPLENBQUMxK0IsTUFBTTtJQUNqQzZqQyxFQUFFLENBQUMxcEIsTUFBTSxHQUFHbzFCLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQ3ZrQixNQUFNO0lBQ2pDMHBCLEVBQUUsQ0FBQzNXLEtBQUssR0FBR3FpQixNQUFNLENBQUM3USxPQUFPLENBQUN4UixLQUFLO0lBRS9CLElBQUlnYixLQUFLLEVBQUU7TUFDUCxJQUNJSCxhQUFhLEdBS2JHLEtBQUssQ0FMTEgsYUFBYTtRQUNiRCxhQUFhLEdBSWJJLEtBQUssQ0FKTEosYUFBYTtRQUNiRSxhQUFhLEdBR2JFLEtBQUssQ0FITEYsYUFBYTtRQUNiQyxlQUFlLEdBRWZDLEtBQUssQ0FGTEQsZUFBZTtRQUNacStCLElBQUksR0FBQUMsd0JBQUEsQ0FDUHIrQixLQUFLLEVBQUF2aUIsU0FBQTtNQUVUa2UsRUFBRSxDQUFDOGxCLEtBQUssSUFBSTVoQixhQUFhO01BQ3pCbEUsRUFBRSxDQUFDNHBCLE9BQU8sSUFBSTNsQixhQUFhO01BQzNCakUsRUFBRSxDQUFDMnBCLE9BQU8sQ0FBQzlELElBQUksSUFBSTNoQixhQUFhLEdBQUdELGFBQWE7TUFDaERqRSxFQUFFLENBQUMycEIsT0FBTyxDQUFDSyxNQUFNLElBQUk3bEIsYUFBYTtNQUNsQ25FLEVBQUUsQ0FBQzJwQixPQUFPLENBQUNJLFFBQVEsSUFBSTNsQixlQUFlO01BRXRDLEtBQUssSUFBTTFxQixDQUFDLElBQUkrb0QsSUFBSSxFQUFFO1FBQ2xCLElBQUlBLElBQUksQ0FBQ3YwRCxjQUFjLENBQUN3TCxDQUFDLENBQUMsRUFBRTtVQUN4QjZvRCxXQUFXLENBQUM3b0QsQ0FBQyxDQUFDLEdBQUcsQ0FBQzZvRCxXQUFXLENBQUM3b0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJK29ELElBQUksQ0FBQy9vRCxDQUFDLENBQUM7VUFDaEQ4b0QsY0FBYyxDQUFDOW9ELENBQUMsQ0FBQyxHQUFHLENBQUM4b0QsY0FBYyxDQUFDOW9ELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSStvRCxJQUFJLENBQUMvb0QsQ0FBQyxDQUFDO1FBQzFEO01BQ0o7SUFDSjtJQUVBLE9BQU8wbUQsUUFBUTtFQUNuQjtFQUVBLE9BQU8vMkMsS0FBSztBQUNoQixDQUFDO0FBRUQsK0RBQWU2N0IsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRnNEO0FBQ3RDO0FBRXlCO0FBRTFCO0FBQ0s7QUFDTjtBQUNOO0FBQ1M7QUFDWDtBQUNJO0FBQ0o7QUFDSTtBQUNBO0FBQ0k7QUFDTjtBQUNGO0FBQ2M7QUFDVjtBQUNrQjtBQUUzQyxJQUFNMmQsV0FBVyxHQUFHLENBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGNBQWMsQ0FDakI7QUFFRCxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBQSxFQUEyQjtFQUFBLElBQXZCejVDLEtBQUssR0FBQXhnQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBbUIsU0FBQSxHQUFBbkIsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUFBLElBQUU2aUQsTUFBTSxHQUFBN2lELFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFtQixTQUFBO0VBQ3BDLElBQ0k2aEIsa0RBQVEsQ0FBQzYvQixNQUFNLENBQUNuaEMsSUFBSSxFQUFFLENBQ2xCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLENBQ25CLENBQUMsRUFDSjtJQUNFO0lBQ0E7SUFDQSxJQUFNdzRELFVBQVUsR0FBR3IzQixNQUFNLENBQUM3USxPQUFPLENBQUM0SixRQUFRO0lBQzFDLElBQU11K0IsT0FBTyxHQUFHSixpRUFBYSxDQUFDRyxVQUFVLENBQUM7SUFDekMsSUFBTWoyQyxJQUFJLEdBQUd4UyxrREFBTSxDQUFDLENBQUMsRUFBRSxDQUFDMG9ELE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTM1QyxLQUFLLENBQUM7SUFDaERBLEtBQUssR0FBRzdpQixrREFBSyxDQUNUdzhELE9BQU8sRUFDUDtNQUNJdjBELElBQUksRUFBRXFlLElBQUksR0FBRyxDQUFDO01BQ2RtMkMsWUFBWSxFQUFFdjNCLE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQ2xoQyxLQUFLO01BQ2xDK3FDLFVBQVUsRUFBRWdILE1BQU0sQ0FBQzdRLE9BQU8sQ0FBQzZKO0lBQy9CLENBQUMsRUFDRHJiLEtBQ0osQ0FBQztFQUNMO0VBQ0EsT0FBT0EsS0FBSztBQUNoQixDQUFDO0FBRUQsU0FBUzY1QyxXQUFXQSxDQUFBLEVBQUc7RUFDbkIsSUFBTXYxQixLQUFLLEdBQUc7SUFDVnpaLFlBQVk7SUFDWnFhLFNBQVM7SUFDVHBhLE1BQU07SUFDTjNQLEtBQUs7SUFDTG9SLE1BQU07SUFDTlcsT0FBTztJQUNQVixLQUFLO0lBQ0xxdkIsT0FBTztJQUNQMEMsT0FBTztJQUNQM0YsU0FBUztJQUNUcHVELE1BQU07SUFDTndyQyxLQUFLO0lBQ0x5akMsWUFBWTtJQUNaL2xDLE9BQU9BLG1EQUFBQTtFQUNYLENBQUM7RUFDRDd6QyxrREFBTyxDQUFDLFVBQUF3d0IsQ0FBQyxFQUFJO0lBQ1RpMEIsS0FBSyxDQUFDajBCLENBQUMsQ0FBQyxHQUFHd21ELGdEQUFnQixDQUFDeG1ELENBQUMsQ0FBQztFQUNsQyxDQUFDLEVBQUVtcEQsV0FBVyxDQUFDO0VBRWZsMUIsS0FBSyxDQUFDN0csWUFBWSxHQUFHQSxzREFBWTtFQUVqQyxPQUFPNjdCLHVEQUFlLENBQUNoMUIsS0FBSyxDQUFDO0FBQ2pDO0FBRUEsU0FBU3cxQixvQkFBb0JBLENBQUN0b0MsT0FBTyxFQUFFeFIsS0FBSyxFQUFFKzVDLGFBQWEsRUFBRTtFQUN6RCxJQUFPeHRDLE1BQU0sR0FBbUJ2TSxLQUFLLENBQTlCdU0sTUFBTTtJQUFFeUosS0FBSyxHQUFZaFcsS0FBSyxDQUF0QmdXLEtBQUs7SUFBRXhyQyxNQUFNLEdBQUl3MUIsS0FBSyxDQUFmeDFCLE1BQU07RUFDNUIsSUFBTzR3QyxRQUFRLEdBQVc1SixPQUFPLENBQTFCNEosUUFBUTtJQUFFOXFDLEtBQUssR0FBSWtoQyxPQUFPLENBQWhCbGhDLEtBQUs7RUFDdEIsSUFBTTBwRSxRQUFRLEdBQUc3aUUsa0RBQUksQ0FBQ2lrQyxRQUFRLENBQUMzOEIsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRWpVLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUMvRCxJQUFPM0ksRUFBRSxHQUFJbTRFLFFBQVEsQ0FBZG40RSxFQUFFO0VBRVQsSUFBSW80RSxZQUFZO0VBQ2hCLElBQUlwNEUsRUFBRSxFQUFFO0lBQ0osSUFBSWs0RSxhQUFhLEVBQUU7TUFDZi81QyxLQUFLLENBQUN1K0IsT0FBTyxHQUFHO1FBQUMxOEQsRUFBRTtRQUFFeU87TUFBSyxDQUFDO0lBQy9CO0lBRUEycEUsWUFBWSxHQUFHO01BQUNwNEUsRUFBRTtNQUFFeU8sS0FBSyxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQzlCdlEsa0RBQUksQ0FBQ3VRLEtBQUssQ0FBQyxDQUFDelEsT0FBTyxDQUFDLFVBQUFxNkUsT0FBTyxFQUFJO01BQzNCLElBQUl6M0IsNkVBQW1CLENBQUNsVyxNQUFNLEVBQUV5SixLQUFLLEVBQUVuMEMsRUFBRSxFQUFFcTRFLE9BQU8sQ0FBQyxDQUFDejZFLE1BQU0sRUFBRTtRQUN4RHc2RSxZQUFZLENBQUMzcEUsS0FBSyxDQUFDNHBFLE9BQU8sQ0FBQyxHQUFHRixRQUFRLENBQUNFLE9BQU8sQ0FBQztNQUNuRDtJQUNKLENBQUMsQ0FBQztFQUNOO0VBQ0EsT0FBT0QsWUFBWTtBQUN2QjtBQUVBLFNBQVNFLGFBQWFBLENBQUMvMUQsT0FBTyxFQUFFO0VBQzVCLE9BQU8sVUFBVTRiLEtBQUssRUFBRXFpQixNQUFNLEVBQUU7SUFDNUI7SUFDQSxJQUFPbmhDLElBQUksR0FBYW1oQyxNQUFNLENBQXZCbmhDLElBQUk7TUFBRXN3QixPQUFPLEdBQUk2USxNQUFNLENBQWpCN1EsT0FBTztJQUNwQixJQUFJdHdCLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtNQUMzQjtNQUNBLElBQU0rNEQsWUFBWSxHQUFHSCxvQkFBb0IsQ0FBQ3RvQyxPQUFPLEVBQUV4UixLQUFLLEVBQUUsSUFBSSxDQUFDO01BQy9ELElBQUlpNkMsWUFBWSxJQUFJLENBQUMvckQsa0RBQU8sQ0FBQytyRCxZQUFZLENBQUMzcEUsS0FBSyxDQUFDLEVBQUU7UUFDOUMwdkIsS0FBSyxDQUFDa04sT0FBTyxDQUFDbXJDLE9BQU8sR0FBRzRCLFlBQVk7TUFDeEM7SUFDSjtJQUVBLElBQU10NUMsU0FBUyxHQUFHdmMsT0FBTyxDQUFDNGIsS0FBSyxFQUFFcWlCLE1BQU0sQ0FBQztJQUV4QyxJQUFJbmhDLElBQUksS0FBSyxnQkFBZ0IsSUFBSXN3QixPQUFPLENBQUNodEMsTUFBTSxLQUFLLFVBQVUsRUFBRTtNQUM1RDtBQUNaO0FBQ0E7QUFDQTtNQUNZLElBQU15MUUsYUFBWSxHQUFHSCxvQkFBb0IsQ0FBQ3RvQyxPQUFPLEVBQUU3USxTQUFTLENBQUM7TUFDN0QsSUFBSXM1QyxhQUFZLElBQUksQ0FBQy9yRCxrREFBTyxDQUFDK3JELGFBQVksQ0FBQzNwRSxLQUFLLENBQUMsRUFBRTtRQUM5Q3F3QixTQUFTLENBQUN1TSxPQUFPLEdBQUc7VUFDaEI2bEIsSUFBSSxLQUFBdDBDLE1BQUEsQ0FBQXliLGtCQUFBLENBQU15RyxTQUFTLENBQUN1TSxPQUFPLENBQUM2bEIsSUFBSSxJQUFFL3lCLEtBQUssQ0FBQ2tOLE9BQU8sQ0FBQ21yQyxPQUFPLEVBQUM7VUFDeERBLE9BQU8sRUFBRTRCLGFBQVk7VUFDckJubkIsTUFBTSxFQUFFO1FBQ1osQ0FBQztNQUNMO0lBQ0o7SUFFQSxPQUFPbnlCLFNBQVM7RUFDcEIsQ0FBQztBQUNMO0FBRUEsU0FBU3k1QyxlQUFlQSxDQUFDaDJELE9BQU8sRUFBRTtFQUM5QixPQUFPLFVBQVU0YixLQUFLLEVBQUVxaUIsTUFBTSxFQUFFO0lBQzVCLElBQUFwOEMsSUFBQSxHQUFpQys1QixLQUFLLElBQUksQ0FBQyxDQUFDO01BQXJDa04sT0FBTyxHQUFBam5DLElBQUEsQ0FBUGluQyxPQUFPO01BQUVwQyxNQUFNLEdBQUE3a0MsSUFBQSxDQUFONmtDLE1BQU07TUFBRTBCLEtBQUssR0FBQXZtQyxJQUFBLENBQUx1bUMsS0FBSztJQUM3QixJQUFJdXFDLFFBQVEsR0FBRy8yQyxLQUFLO0lBQ3BCLElBQUlxaUIsTUFBTSxDQUFDbmhDLElBQUksS0FBSyxRQUFRLEVBQUU7TUFDMUI2MUQsUUFBUSxHQUFHO1FBQUM3cEMsT0FBTztRQUFFcEMsTUFBTTtRQUFFMEI7TUFBSyxDQUFDO0lBQ3ZDLENBQUMsTUFBTSxJQUFJNlYsTUFBTSxDQUFDbmhDLElBQUksS0FBSyxZQUFZLEVBQUU7TUFDckM7TUFDQTtNQUNBO01BQ0E2MUQsUUFBUSxHQUFHO1FBQUN2cUM7TUFBSyxDQUFDO0lBQ3RCO0lBQ0EsT0FBT3BvQixPQUFPLENBQUMyeUQsUUFBUSxFQUFFMTBCLE1BQU0sQ0FBQztFQUNwQyxDQUFDO0FBQ0w7QUFFTyxTQUFTZzRCLGFBQWFBLENBQUEsRUFBRztFQUM1QixPQUFPRCxlQUFlLENBQUNELGFBQWEsQ0FBQ04sV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hEOzs7Ozs7Ozs7Ozs7QUMxSkEsK0RBQWU7RUFDWDl3QyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRWgyQixTQUFTLEVBQUk7SUFDbEIsSUFBT21PLElBQUksR0FBZW5PLFNBQVMsQ0FBNUJtTyxJQUFJO01BQUV3M0IsU0FBUyxHQUFJM2xDLFNBQVMsQ0FBdEIybEMsU0FBUztJQUV0QixJQUFNdTBCLEVBQUUsR0FBRzUyQyxNQUFNLENBQUNxaUIsU0FBUyxDQUFDO0lBRTVCLElBQUl1MEIsRUFBRSxFQUFFO01BQ0osSUFBSUEsRUFBRSxDQUFDL3JELElBQUksQ0FBQyxFQUFFO1FBQ1YsT0FBTytyRCxFQUFFLENBQUMvckQsSUFBSSxDQUFDO01BQ25CO01BRUEsTUFBTSxJQUFJK0MsS0FBSyxjQUFBeEYsTUFBQSxDQUFjeUMsSUFBSSxvQkFBQXpDLE1BQUEsQ0FBaUJpNkIsU0FBUyxDQUFFLENBQUM7SUFDbEU7SUFFQSxNQUFNLElBQUl6MEIsS0FBSyxJQUFBeEYsTUFBQSxDQUFJaTZCLFNBQVMsb0JBQWlCLENBQUM7RUFDbEQ7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEI0QjtBQUN3QjtBQUNyQjtBQUNtQjtBQUNQO0FBQ1U7QUFDUTtBQUNFO0FBQ2xCO0FBQ3NCO0FBQ0o7QUFDTjtBQUFBLElBQ3JDbWlDLGFBQWE7RUFDOUIsU0FBQUEsY0FBQSxFQUFjO0lBQUEsSUFBQWxsRCxLQUFBO0lBQUEza0IsZUFBQSxPQUFBNnBFLGFBQUE7SUFBQTVyQyxlQUFBO0lBQUFBLGVBQUEsd0JBT0UsSUFBSUQsc0RBQWEsQ0FBQyxDQUFDO0lBQUFDLGVBQUEsdUJBQ3BCcmUsaURBQUksQ0FBQyxZQUFNO01BQ3RCLElBQU11NkMsT0FBTyxHQUFHeDFDLEtBQUksQ0FBQ21sRCxhQUFhLENBQUMzUCxPQUFPO01BQzFDO01BQ0FBLE9BQU8sQ0FBQ3NQLGdFQUFhLENBQUM7TUFDdEJ0UCxPQUFPLENBQUN2Uyw0REFBUyxDQUFDO01BQ2xCdVMsT0FBTyxDQUFDUyxxRUFBa0IsQ0FBQztNQUMzQlQsT0FBTyxDQUFDeVAsdUVBQW9CLENBQUM7TUFDN0J6UCxPQUFPLENBQUN3UCxxRUFBa0IsQ0FBQztNQUMzQnhQLE9BQU8sQ0FBQ3VQLG9FQUFpQixDQUFDO01BQzFCdlAsT0FBTyxDQUFDVSxrRUFBZSxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUFBNThCLGVBQUEseUJBQ2UsVUFBQzdxQixPQUFPLEVBQUUyMkQsVUFBVSxFQUFLO01BQ3RDcGxELEtBQUksQ0FBQ3FsRCxPQUFPLEdBQUdWLG1EQUFXLENBQUNsMkQsT0FBTyxFQUFFMjJELFVBQVUsQ0FBQztNQUMvQ3BsRCxLQUFJLENBQUNtbEQsYUFBYSxDQUFDRyxRQUFRLENBQUN0bEQsS0FBSSxDQUFDcWxELE9BQU8sQ0FBQztNQUN6QyxJQUFNL1EsRUFBRSxHQUFJNXpDLE1BQU0sQ0FBQzZrRCxXQUFXLEdBQzFCN2tELE1BQU0sQ0FBQzZrRCxXQUFXLElBQUksRUFBRztNQUM3QixJQUFJLENBQUNqUixFQUFFLENBQUN6bkQsUUFBUSxDQUFDbVQsS0FBSSxDQUFDcWxELE9BQU8sQ0FBQyxFQUFFO1FBQzVCL1EsRUFBRSxDQUFDL29FLElBQUksQ0FBQ3kwQixLQUFJLENBQUNxbEQsT0FBTyxDQUFDO01BQ3pCO01BQ0FybEQsS0FBSSxDQUFDd2xELFlBQVksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBUElsc0MsZUFBQSwwQkFRa0IsVUFBQ3JDLEtBQUssRUFBSztNQUN6QixJQUFJalgsS0FBSSxDQUFDcWxELE9BQU8sSUFBSSxDQUFDcHVDLEtBQUssRUFBRTtRQUN4QixPQUFPalgsS0FBSSxDQUFDcWxELE9BQU87TUFDdkI7TUFDQSxJQUFNNTJELE9BQU8sR0FBR2kyRCxnRUFBYSxDQUFDLENBQUM7TUFDL0I7TUFDQSxJQUFJbGpELEtBQXFDLEVBQUU7QUFBQSxFQUUxQyxNQUNJO1FBQ0Q7UUFDQSxJQUFNa2tELFNBQVMsR0FBR2hsRCxNQUFNLENBQ25CaWxELG9DQUFvQztRQUN6QyxJQUFJRCxTQUFTLEVBQUU7VUFDWDFsRCxLQUFJLENBQUN5bEQsY0FBYyxDQUFDaDNELE9BQU8sRUFBRWkzRCxTQUFTLENBQUM7WUFBRUUsZUFBZSxFQUFFLENBQUMsZUFBZTtVQUFFLENBQUMsQ0FBQyxDQUFDaEIsdURBQWUsQ0FBQ0Msb0RBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0csQ0FBQyxNQUNJO1VBQ0Q3a0QsS0FBSSxDQUFDeWxELGNBQWMsQ0FBQ2gzRCxPQUFPLEVBQUVtMkQsdURBQWUsQ0FBQ0Msb0RBQUssQ0FBQyxDQUFDO1FBQ3hEO01BQ0o7TUFDQSxJQUFJLENBQUM1dEMsS0FBSyxFQUFFO1FBQ1I7UUFDQXZXLE1BQU0sQ0FBQ3NCLEtBQUssR0FBR2hDLEtBQUksQ0FBQ3FsRCxPQUFPO01BQy9CO01BQ0EsSUFBSXA4RSxLQUFVLEVBQUU7QUFBQSxFQU1mO01BQ0QsT0FBTysyQixLQUFJLENBQUNxbEQsT0FBTztJQUN2QixDQUFDO0lBcEVHLElBQUksQ0FBQ0EsT0FBTyxHQUFHLElBQUksQ0FBQ1ksZUFBZSxDQUFDLENBQUM7RUFDekM7RUFBQyxPQUFBeHJFLFlBQUEsQ0FBQXlxRSxhQUFBO0lBQUExMEUsR0FBQTtJQUFBMEMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBWTtNQUNSLE9BQU8sSUFBSSxDQUFDbXlFLE9BQU87SUFDdkI7RUFBQztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQmdDO0FBQzlCLElBQU14TixtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJeHRDLEtBQUs7RUFBQSxJQUFBNjdDLE1BQUE7RUFBQSxPQUFLLENBQUFBLE1BQUEsR0FBQWw4RSxLQUFLLENBQUMsQ0FBQyxFQUFDOGUsTUFBTSxDQUFBWCxLQUFBLENBQUErOUQsTUFBQSxFQUFBM2hELGtCQUFBLENBQUlyUixpREFBTSxDQUFDNkgsaURBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRXNQLEtBQUssQ0FBQyxDQUFDLEVBQUM7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0FDRDdDO0FBQ3JCO0FBQ047QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzg3QyxTQUFTQSxDQUFDQyxRQUFRLEVBQUV6ckUsS0FBSyxFQUFFO0VBQ2hDLElBQU0yNUQsRUFBRSxHQUFHSixrREFBUyxDQUFDLENBQUM7RUFDdEIsS0FBSyxJQUFJemlFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzZpRSxFQUFFLENBQUN4cUUsTUFBTSxFQUFFMkgsQ0FBQyxFQUFFLEVBQUU7SUFDaEMsSUFBQTQwRSxLQUFBLEdBQStCL1IsRUFBRSxDQUFDN2lFLENBQUMsQ0FBQztNQUE1Qm8yQixRQUFRLEdBQUF3K0MsS0FBQSxDQUFSeCtDLFFBQVE7TUFBRXZGLFFBQVEsR0FBQStqRCxLQUFBLENBQVIvakQsUUFBUTtJQUMxQixJQUFJcVUsYUFBYTtJQUNqQixJQUFBb0UsU0FBQSxHQUFrQnpZLFFBQVEsQ0FBQyxDQUFDO01BQXBCK2QsS0FBSyxHQUFBdEYsU0FBQSxDQUFMc0YsS0FBSztJQUNiLElBQUksQ0FBQ3IyQyxLQUFLLENBQUMwQixPQUFPLENBQUMwNkUsUUFBUSxDQUFDLEVBQUU7TUFDMUJ6dkMsYUFBYSxHQUFHOEcsdURBQU8sQ0FBQzRDLEtBQUssRUFBRStsQyxRQUFRLENBQUM7SUFDNUMsQ0FBQyxNQUNJO01BQ0R6dkMsYUFBYSxHQUFHeXZDLFFBQVE7SUFDNUI7SUFDQXYrQyxRQUFRLENBQUN5ViwyREFBVyxDQUFDO01BQ2pCM2lDLEtBQUs7TUFDTDhxQyxRQUFRLEVBQUU5TyxhQUFhO01BQ3ZCK08sVUFBVSxFQUFFO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0g3ZCxRQUFRLENBQUN3ViwrREFBZSxDQUFDO01BQUVueEMsRUFBRSxFQUFFazZFLFFBQVE7TUFBRXpyRTtJQUFNLENBQUMsQ0FBQyxDQUFDO0VBQ3REO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBTTJyRSxnQkFBZ0IsR0FBRyxrQ0FBa0M7QUFDM0QsSUFBTUMsUUFBUSxHQUFHLG1CQUFtQjtBQUNwQztBQUNBLElBQU1DLFNBQVMsR0FBRyxvREFBb0Q7QUFDdEUsSUFBTUMsWUFBWSxHQUFHLGtCQUFrQjtBQUN2QyxJQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBSXpyQyxHQUFHLEVBQStCO0VBQUEsSUFBN0IwckMsUUFBUSxHQUFBOThFLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFtQixTQUFBLEdBQUFuQixTQUFBLE1BQUcsYUFBYTtFQUM1QyxJQUFJb3hDLEdBQUcsS0FBSyxFQUFFLEVBQUU7SUFDWixPQUFPQSxHQUFHO0VBQ2Q7RUFDQSxJQUFNMnJDLE9BQU8sR0FBRzNyQyxHQUFHLENBQ2R2bUIsT0FBTyxDQUFDNnhELFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FDckI3eEQsT0FBTyxDQUFDOHhELFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDdEI5eEQsT0FBTyxDQUFDK3hELFlBQVksRUFBRSxVQUFDbDlFLENBQUMsRUFBRXM5RSxHQUFHO0lBQUEsT0FBS3R6RCxNQUFNLENBQUN1ekQsWUFBWSxDQUFDRCxHQUFHLENBQUM7RUFBQSxFQUFDLENBQzNERSxJQUFJLENBQUMsQ0FBQztFQUNYLElBQUlULGdCQUFnQixDQUFDdHdELElBQUksQ0FBQzR3RCxPQUFPLENBQUMsRUFBRTtJQUNoQyxPQUFPRCxRQUFRO0VBQ25CO0VBQ0EsT0FBTzFyQyxHQUFHO0FBQ2QsQ0FBQztBQUNELElBQU11SCxFQUFFLEdBQUk5aEIsTUFBTSxDQUFDNGlCLGVBQWUsR0FDOUI1aUIsTUFBTSxDQUFDNGlCLGVBQWUsSUFBSSxDQUFDLENBQUU7QUFDakNkLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRzJqQyxTQUFTO0FBQzNCM2pDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBR0EsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLeDNDLFNBQVMsR0FBRzA3RSxTQUFTLEdBQUdsa0MsRUFBRSxDQUFDLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDckR0RSxTQUFTN0UsV0FBV0EsQ0FBQ3FwQyxRQUFRLEVBQUU7RUFDbEMsSUFBSUMsSUFBSTtFQUNSLElBQU14OEQsSUFBSSxHQUFHeWtCLFFBQVEsQ0FBQ3kwQixhQUFhLENBQUMsTUFBTSxDQUFDO0VBQzNDLElBQUlxakIsUUFBUSxDQUFDejdELElBQUksS0FBSyxVQUFVLEVBQUU7SUFDOUIsSUFBTXFFLE9BQU8sR0FBR3NmLFFBQVEsQ0FBQ2pPLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDaERyUixPQUFPLENBQUN6bEIsR0FBRyxHQUFHNjhFLFFBQVEsQ0FBQy9yQyxHQUFHO0lBQzFCcnJCLE9BQU8sQ0FBQ3MzRCxLQUFLLEdBQUcsSUFBSTtJQUNwQkQsSUFBSSxHQUFHLElBQUk5ekMsT0FBTyxDQUFDLFVBQUNDLE9BQU8sRUFBRTFkLE1BQU0sRUFBSztNQUNwQzlGLE9BQU8sQ0FBQ3UzRCxNQUFNLEdBQUcsWUFBTTtRQUNuQi96QyxPQUFPLENBQUMsQ0FBQztNQUNiLENBQUM7TUFDRHhqQixPQUFPLENBQUN3M0QsT0FBTyxHQUFHLFVBQUE1aEQsS0FBSztRQUFBLE9BQUk5UCxNQUFNLENBQUM4UCxLQUFLLENBQUM7TUFBQTtJQUM1QyxDQUFDLENBQUM7SUFDRi9hLElBQUksYUFBSkEsSUFBSSxlQUFKQSxJQUFJLENBQUVvNkMsV0FBVyxDQUFDajFDLE9BQU8sQ0FBQztFQUM5QixDQUFDLE1BQ0ksSUFBSW8zRCxRQUFRLENBQUN6N0QsSUFBSSxLQUFLLFdBQVcsRUFBRTtJQUNwQyxJQUFNcUUsUUFBTyxHQUFHc2YsUUFBUSxDQUFDak8sYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUM5Q3JSLFFBQU8sQ0FBQyswQyxJQUFJLEdBQUdxaUIsUUFBUSxDQUFDL3JDLEdBQUc7SUFDM0JyckIsUUFBTyxDQUFDZzFDLEdBQUcsR0FBRyxZQUFZO0lBQzFCcWlCLElBQUksR0FBRyxJQUFJOXpDLE9BQU8sQ0FBQyxVQUFDQyxPQUFPLEVBQUUxZCxNQUFNLEVBQUs7TUFDcEM5RixRQUFPLENBQUN1M0QsTUFBTSxHQUFHLFlBQU07UUFDbkIvekMsT0FBTyxDQUFDLENBQUM7TUFDYixDQUFDO01BQ0R4akIsUUFBTyxDQUFDdzNELE9BQU8sR0FBRyxVQUFBNWhELEtBQUs7UUFBQSxPQUFJOVAsTUFBTSxDQUFDOFAsS0FBSyxDQUFDO01BQUE7SUFDNUMsQ0FBQyxDQUFDO0lBQ0YvYSxJQUFJLGFBQUpBLElBQUksZUFBSkEsSUFBSSxDQUFFbzZDLFdBQVcsQ0FBQ2oxQyxRQUFPLENBQUM7RUFDOUI7RUFDQSxPQUFPcTNELElBQUk7QUFDZjs7Ozs7Ozs7Ozs7Ozs7O0FDNUJPLFNBQVMvUyxTQUFTQSxDQUFBLEVBQUc7RUFDeEIsSUFBTXNKLE1BQU0sR0FBSTk4QyxNQUFNLENBQUM2a0QsV0FBVyxHQUM5QjdrRCxNQUFNLENBQUM2a0QsV0FBVyxJQUFJLEVBQUc7RUFDN0IsT0FBTy9ILE1BQU07QUFDakI7Ozs7Ozs7Ozs7OzswQkNIQSx1S0FBQTV1RSxDQUFBLEVBQUFvdUIsQ0FBQSxFQUFBdEMsQ0FBQSx3QkFBQXh2QixNQUFBLEdBQUFBLE1BQUEsT0FBQXlpQixDQUFBLEdBQUErTSxDQUFBLENBQUF2dkIsUUFBQSxrQkFBQTR4QixDQUFBLEdBQUFyQyxDQUFBLENBQUE2WCxXQUFBLDhCQUFBNW5DLEVBQUErdkIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxFQUFBcHlCLENBQUEsUUFBQTZtQixDQUFBLEdBQUE3RCxDQUFBLElBQUFBLENBQUEsQ0FBQXZTLFNBQUEsWUFBQW8zQixTQUFBLEdBQUE3a0IsQ0FBQSxHQUFBNmtCLFNBQUEsRUFBQWxWLENBQUEsR0FBQTl6QixNQUFBLENBQUEybEIsTUFBQSxDQUFBcUMsQ0FBQSxDQUFBcFcsU0FBQSxVQUFBcTNCLG1CQUFBLENBQUFuVixDQUFBLHVCQUFBNUMsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBb1AsQ0FBQSxRQUFBcHlCLENBQUEsRUFBQTZtQixDQUFBLEVBQUE4TCxDQUFBLEVBQUFuVyxDQUFBLE1BQUFxRCxDQUFBLEdBQUF1UyxDQUFBLFFBQUF0ckIsQ0FBQSxPQUFBaWhDLENBQUEsS0FBQWxvQixDQUFBLEtBQUFtRCxDQUFBLEtBQUEvRCxDQUFBLEVBQUFoYixDQUFBLEVBQUE0WixDQUFBLEVBQUFtQixDQUFBLEVBQUF4QyxDQUFBLEVBQUF3QyxDQUFBLENBQUFqZ0IsSUFBQSxDQUFBa0YsQ0FBQSxNQUFBK2EsQ0FBQSxXQUFBQSxFQUFBcVQsQ0FBQSxFQUFBdEMsQ0FBQSxXQUFBL3ZCLENBQUEsR0FBQXF5QixDQUFBLEVBQUF4TCxDQUFBLE1BQUE4TCxDQUFBLEdBQUExdUIsQ0FBQSxFQUFBOGpDLENBQUEsQ0FBQS9rQixDQUFBLEdBQUErTSxDQUFBLEVBQUFsUyxDQUFBLGdCQUFBbUIsRUFBQStRLENBQUEsRUFBQS9NLENBQUEsU0FBQTZELENBQUEsR0FBQWtKLENBQUEsRUFBQTRDLENBQUEsR0FBQTNQLENBQUEsRUFBQXFQLENBQUEsT0FBQXZyQixDQUFBLElBQUEwVixDQUFBLEtBQUE0VixDQUFBLElBQUFDLENBQUEsR0FBQXhTLENBQUEsQ0FBQTFnQixNQUFBLEVBQUFrekIsQ0FBQSxVQUFBRCxDQUFBLEVBQUFweUIsQ0FBQSxHQUFBNmYsQ0FBQSxDQUFBd1MsQ0FBQSxHQUFBclQsQ0FBQSxHQUFBK29CLENBQUEsQ0FBQWxvQixDQUFBLEVBQUFpUSxDQUFBLEdBQUE5dkIsQ0FBQSxLQUFBK3ZCLENBQUEsUUFBQXFDLENBQUEsR0FBQXRDLENBQUEsS0FBQTlNLENBQUEsTUFBQTJQLENBQUEsR0FBQTN5QixDQUFBLEVBQUE2bUIsQ0FBQSxHQUFBN21CLENBQUEsWUFBQTZtQixDQUFBLFdBQUE3bUIsQ0FBQSxNQUFBQSxDQUFBLE1BQUFpRSxDQUFBLElBQUFqRSxDQUFBLE9BQUFnZixDQUFBLE1BQUFvVCxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvUSxDQUFBLEdBQUFoZixDQUFBLFFBQUE2bUIsQ0FBQSxNQUFBa2hCLENBQUEsQ0FBQTlvQixDQUFBLEdBQUErRCxDQUFBLEVBQUEra0IsQ0FBQSxDQUFBL2tCLENBQUEsR0FBQWhqQixDQUFBLE9BQUFnZixDQUFBLEdBQUE4USxDQUFBLEtBQUFzQyxDQUFBLEdBQUFyQyxDQUFBLFFBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsSUFBQUEsQ0FBQSxHQUFBOE0sQ0FBQSxNQUFBOXZCLENBQUEsTUFBQSt2QixDQUFBLEVBQUEvdkIsQ0FBQSxNQUFBZ2pCLENBQUEsRUFBQStrQixDQUFBLENBQUEva0IsQ0FBQSxHQUFBOE0sQ0FBQSxFQUFBakosQ0FBQSxjQUFBdUwsQ0FBQSxJQUFBckMsQ0FBQSxhQUFBbFMsQ0FBQSxRQUFBL1csQ0FBQSxPQUFBa2MsQ0FBQSxxQkFBQW9QLENBQUEsRUFBQXZTLENBQUEsRUFBQWlRLENBQUEsUUFBQXRULENBQUEsWUFBQXhiLFNBQUEsdUNBQUE4RixDQUFBLFVBQUErWSxDQUFBLElBQUFiLENBQUEsQ0FBQWEsQ0FBQSxFQUFBaVEsQ0FBQSxHQUFBakosQ0FBQSxHQUFBaEgsQ0FBQSxFQUFBOFMsQ0FBQSxHQUFBN0MsQ0FBQSxHQUFBdUMsQ0FBQSxHQUFBeEwsQ0FBQSxPQUFBNWlCLENBQUEsR0FBQTB1QixDQUFBLE1BQUE3ckIsQ0FBQSxLQUFBOUcsQ0FBQSxLQUFBNm1CLENBQUEsR0FBQUEsQ0FBQSxRQUFBQSxDQUFBLFNBQUFraEIsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQWhFLENBQUEsQ0FBQTZILENBQUEsRUFBQThMLENBQUEsS0FBQW9WLENBQUEsQ0FBQS9rQixDQUFBLEdBQUEyUCxDQUFBLEdBQUFvVixDQUFBLENBQUE5b0IsQ0FBQSxHQUFBMFQsQ0FBQSxhQUFBblcsQ0FBQSxNQUFBeGMsQ0FBQSxRQUFBNm1CLENBQUEsS0FBQXVMLENBQUEsWUFBQUMsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQW95QixDQUFBLFdBQUFDLENBQUEsR0FBQUEsQ0FBQSxDQUFBcmpCLElBQUEsQ0FBQWhQLENBQUEsRUFBQTJ5QixDQUFBLFVBQUEzeEIsU0FBQSwyQ0FBQXF4QixDQUFBLENBQUExeEIsSUFBQSxTQUFBMHhCLENBQUEsRUFBQU0sQ0FBQSxHQUFBTixDQUFBLENBQUF4eEIsS0FBQSxFQUFBZ21CLENBQUEsU0FBQUEsQ0FBQSxvQkFBQUEsQ0FBQSxLQUFBd0wsQ0FBQSxHQUFBcnlCLENBQUEsQ0FBQTBHLE1BQUEsS0FBQTJyQixDQUFBLENBQUFyakIsSUFBQSxDQUFBaFAsQ0FBQSxHQUFBNm1CLENBQUEsU0FBQThMLENBQUEsR0FBQTN4QixTQUFBLHVDQUFBb3hCLENBQUEsZ0JBQUF2TCxDQUFBLE9BQUE3bUIsQ0FBQSxHQUFBaUUsQ0FBQSxjQUFBb3VCLENBQUEsSUFBQXZyQixDQUFBLEdBQUFpaEMsQ0FBQSxDQUFBL2tCLENBQUEsUUFBQTJQLENBQUEsR0FBQTVDLENBQUEsQ0FBQS9nQixJQUFBLENBQUFnVSxDQUFBLEVBQUEra0IsQ0FBQSxPQUFBbHFCLENBQUEsa0JBQUF3VSxDQUFBLElBQUFyeUIsQ0FBQSxHQUFBaUUsQ0FBQSxFQUFBNGlCLENBQUEsTUFBQThMLENBQUEsR0FBQU4sQ0FBQSxjQUFBN1YsQ0FBQSxtQkFBQTNiLEtBQUEsRUFBQXd4QixDQUFBLEVBQUExeEIsSUFBQSxFQUFBbUcsQ0FBQSxTQUFBaXBCLENBQUEsRUFBQXFDLENBQUEsRUFBQXB5QixDQUFBLFFBQUEyeUIsQ0FBQSxRQUFBOVUsQ0FBQSxnQkFBQWdxQixVQUFBLGNBQUFHLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE1VixDQUFBLEdBQUF4ekIsTUFBQSxDQUFBNGxCLGNBQUEsTUFBQW9DLENBQUEsTUFBQTdELENBQUEsSUFBQXFQLENBQUEsQ0FBQUEsQ0FBQSxJQUFBclAsQ0FBQSxTQUFBOGtCLG1CQUFBLENBQUF6VixDQUFBLE9BQUFyUCxDQUFBLGlDQUFBcVAsQ0FBQSxHQUFBTSxDQUFBLEdBQUFzViwwQkFBQSxDQUFBeDNCLFNBQUEsR0FBQW8zQixTQUFBLENBQUFwM0IsU0FBQSxHQUFBNVIsTUFBQSxDQUFBMmxCLE1BQUEsQ0FBQXFDLENBQUEsWUFBQXJLLEVBQUF2WSxDQUFBLFdBQUFwRixNQUFBLENBQUFxcEMsY0FBQSxHQUFBcnBDLE1BQUEsQ0FBQXFwQyxjQUFBLENBQUFqa0MsQ0FBQSxFQUFBZ2tDLDBCQUFBLEtBQUFoa0MsQ0FBQSxDQUFBa2tDLFNBQUEsR0FBQUYsMEJBQUEsRUFBQUgsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUFtdUIsQ0FBQSx5QkFBQW51QixDQUFBLENBQUF3TSxTQUFBLEdBQUE1UixNQUFBLENBQUEybEIsTUFBQSxDQUFBbU8sQ0FBQSxHQUFBMXVCLENBQUEsV0FBQStqQyxpQkFBQSxDQUFBdjNCLFNBQUEsR0FBQXczQiwwQkFBQSxFQUFBSCxtQkFBQSxDQUFBblYsQ0FBQSxpQkFBQXNWLDBCQUFBLEdBQUFILG1CQUFBLENBQUFHLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBelMsV0FBQSx3QkFBQXVTLG1CQUFBLENBQUFHLDBCQUFBLEVBQUE3VixDQUFBLHdCQUFBMFYsbUJBQUEsQ0FBQW5WLENBQUEsR0FBQW1WLG1CQUFBLENBQUFuVixDQUFBLEVBQUFQLENBQUEsZ0JBQUEwVixtQkFBQSxDQUFBblYsQ0FBQSxFQUFBM1AsQ0FBQSxpQ0FBQThrQixtQkFBQSxDQUFBblYsQ0FBQSw4REFBQXlWLFlBQUEsWUFBQUEsYUFBQSxhQUFBaGlDLENBQUEsRUFBQXBHLENBQUEsRUFBQXcwQixDQUFBLEVBQUFoWSxDQUFBO0FBQUEsU0FBQXNyQixvQkFBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQSxRQUFBcnlCLENBQUEsR0FBQW5CLE1BQUEsQ0FBQXdSLGNBQUEsUUFBQXJRLENBQUEsdUJBQUFpRSxDQUFBLElBQUFqRSxDQUFBLFFBQUE4bkMsbUJBQUEsWUFBQU8sbUJBQUFwa0MsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQS9NLENBQUEsRUFBQXFQLENBQUEsUUFBQXRDLENBQUEsRUFBQS92QixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLENBQUEsRUFBQThyQixDQUFBLElBQUFsdkIsS0FBQSxFQUFBbWlCLENBQUEsRUFBQTlTLFVBQUEsR0FBQW1pQixDQUFBLEVBQUFsaUIsWUFBQSxHQUFBa2lCLENBQUEsRUFBQWppQixRQUFBLEdBQUFpaUIsQ0FBQSxNQUFBcHVCLENBQUEsQ0FBQThyQixDQUFBLElBQUEvTSxDQUFBLFlBQUFvUCxDQUFBLFlBQUFBLEVBQUFyQyxDQUFBLEVBQUEvTSxDQUFBLElBQUE4a0IsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxZQUFBOXJCLENBQUEsZ0JBQUFxa0MsT0FBQSxDQUFBdlksQ0FBQSxFQUFBL00sQ0FBQSxFQUFBL2UsQ0FBQSxVQUFBbXVCLENBQUEsYUFBQUEsQ0FBQSxjQUFBQSxDQUFBLG9CQUFBMFYsbUJBQUEsQ0FBQTdqQyxDQUFBLEVBQUE4ckIsQ0FBQSxFQUFBL00sQ0FBQSxFQUFBcVAsQ0FBQTtBQUFBLFNBQUFrVyxtQkFBQXZsQixDQUFBLEVBQUFxUCxDQUFBLEVBQUFwdUIsQ0FBQSxFQUFBOHJCLENBQUEsRUFBQXFDLENBQUEsRUFBQXZVLENBQUEsRUFBQWdKLENBQUEsY0FBQTdtQixDQUFBLEdBQUFnakIsQ0FBQSxDQUFBbkYsQ0FBQSxFQUFBZ0osQ0FBQSxHQUFBOEwsQ0FBQSxHQUFBM3lCLENBQUEsQ0FBQWEsS0FBQSxXQUFBbWlCLENBQUEsZ0JBQUEvZSxDQUFBLENBQUErZSxDQUFBLEtBQUFoakIsQ0FBQSxDQUFBVyxJQUFBLEdBQUEweEIsQ0FBQSxDQUFBTSxDQUFBLElBQUE2VixPQUFBLENBQUFDLE9BQUEsQ0FBQTlWLENBQUEsRUFBQStWLElBQUEsQ0FBQTNZLENBQUEsRUFBQXFDLENBQUE7QUFBQSxTQUFBdVcsa0JBQUEzbEIsQ0FBQSw2QkFBQXFQLENBQUEsU0FBQXB1QixDQUFBLEdBQUEvRSxTQUFBLGFBQUFzcEMsT0FBQSxXQUFBelksQ0FBQSxFQUFBcUMsQ0FBQSxRQUFBdlUsQ0FBQSxHQUFBbUYsQ0FBQSxDQUFBeEYsS0FBQSxDQUFBNlUsQ0FBQSxFQUFBcHVCLENBQUEsWUFBQTJrQyxNQUFBNWxCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxVQUFBN2xCLENBQUEsY0FBQTZsQixPQUFBN2xCLENBQUEsSUFBQXVsQixrQkFBQSxDQUFBMXFCLENBQUEsRUFBQWtTLENBQUEsRUFBQXFDLENBQUEsRUFBQXdXLEtBQUEsRUFBQUMsTUFBQSxXQUFBN2xCLENBQUEsS0FBQTRsQixLQUFBO0FBREE7RUFBQSxJQUFBampDLElBQUEsR0FBQWdqQyxpQkFBQSxjQUFBUCxZQUFBLEdBQUE1VCxDQUFBLENBQWUsU0FBQTBXLFFBQU93eEMsUUFBUTtJQUFBLElBQUFDLFFBQUEsRUFBQTk4RCxDQUFBO0lBQUEsT0FBQXVvQixZQUFBLEdBQUFoaUMsQ0FBQSxXQUFBK2tDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBbm9CLENBQUE7UUFBQTtVQUVwQm5ELENBQUMsR0FBRyxJQUFJMm9CLE9BQU8sQ0FBQyxVQUFBQyxPQUFPO1lBQUEsT0FBS2swQyxRQUFRLEdBQUdsMEMsT0FBTztVQUFBLENBQUMsQ0FBQztVQUN0RDJWLFVBQVUsQ0FBQ3UrQixRQUFRLEVBQUVELFFBQVEsQ0FBQztVQUFDLE9BQUF2eEMsUUFBQSxDQUFBdHRCLENBQUEsSUFDeEJnQyxDQUFDO01BQUE7SUFBQSxHQUFBcXJCLE9BQUE7RUFBQSxDQUNYO0VBQUEsaUJBQUFzRyxFQUFBO0lBQUEsT0FBQTdyQyxJQUFBLENBQUE2WCxLQUFBLE9BQUF0ZSxTQUFBO0VBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTDhDO0FBQ007QUFDTjtBQUNoQyxTQUFTMjlFLGdCQUFnQkEsQ0FBQ2g5RCxDQUFDLEVBQUU7RUFDeEMsSUFBUW9GLE9BQU8sR0FBaUNwRixDQUFDLENBQXpDb0YsT0FBTztJQUFFalYsS0FBSyxHQUEwQjZQLENBQUMsQ0FBaEM3UCxLQUFLO0lBQUVuSCxRQUFRLEdBQWdCZ1gsQ0FBQyxDQUF6QmhYLFFBQVE7SUFBRTRKLFNBQVMsR0FBS29OLENBQUMsQ0FBZnBOLFNBQVM7RUFDM0NtcUUsNERBQWlCLENBQUNucUUsU0FBUyxDQUFDO0VBQzVCLElBQU11M0QsWUFBWSxHQUFHaFMsMkRBQWMsQ0FBQy95QyxPQUFPLENBQUN5bkIsU0FBUyxFQUFFMThCLEtBQUssRUFBRSxnQkFBZ0IsRUFBRWlWLE9BQU8sQ0FBQztFQUN4RixJQUFJK2tELFlBQVksRUFBRTtJQUNkRixpRUFBb0IsQ0FBQ0UsWUFBWSxFQUFFaDZELEtBQUssRUFBRXlDLFNBQVMsQ0FBQ21PLElBQUksQ0FBQztFQUM3RDtFQUNBLE9BQU8vWCxRQUFRO0FBQ25COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWGdFO0FBQ0M7QUFDMUI7QUFDaEMsSUFBTXdnRSxXQUFXLGdCQUFHcnlDLDBEQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFNBQVMrbEQsbUJBQW1CQSxDQUFDL3NFLEtBQUssRUFBRTtFQUN2QyxJQUFRbkgsUUFBUSxHQUFvQm1ILEtBQUssQ0FBakNuSCxRQUFRO0lBQUVtakMsYUFBYSxHQUFLaDhCLEtBQUssQ0FBdkJnOEIsYUFBYTtFQUMvQixJQUFNZ3hDLFVBQVUsR0FBRy9sRCw4Q0FBTyxDQUFDO0lBQUEsT0FBTXFDLElBQUksQ0FBQ0MsU0FBUyxDQUFDeVMsYUFBYSxDQUFDO0VBQUEsR0FBRSxDQUFDQSxhQUFhLENBQUMsQ0FBQztFQUNoRixJQUFNM1UsS0FBSyxHQUFHc0sscURBQVEsQ0FBQyxDQUFDO0VBQ3hCLElBQU0yMkIsU0FBUyxHQUFHd2tCLGtEQUFXLENBQUMsVUFBQ240RSxPQUFPLEVBQUs7SUFDdkMsSUFBQWdCLElBQUEsR0FBMkNoQixPQUFPLElBQUksQ0FBQyxDQUFDO01BQWhEMnhELFNBQVMsR0FBQTN3RCxJQUFBLENBQVQyd0QsU0FBUztNQUFFMm1CLE9BQU8sR0FBQXQzRSxJQUFBLENBQVBzM0UsT0FBTztNQUFFQyxVQUFVLEdBQUF2M0UsSUFBQSxDQUFWdTNFLFVBQVU7SUFDdEMsSUFBSUMsV0FBVyxHQUFHLENBQUNILFVBQVUsQ0FBQztJQUM5QixJQUFJMW1CLFNBQVMsRUFBRTtNQUNYNm1CLFdBQVcsR0FBRyxDQUNWN2pELElBQUksQ0FBQ0MsU0FBUyxDQUFDcGIsaURBQU0sQ0FBQzZ0QixhQUFhLEVBQUVzcUIsU0FBUyxDQUFDLENBQUMsQ0FDbkQ7SUFDTCxDQUFDLE1BQ0ksSUFBSTJtQixPQUFPLEVBQUU7TUFDZEUsV0FBVyxHQUFHLENBQUM3akQsSUFBSSxDQUFDQyxTQUFTLENBQUMwakQsT0FBTyxDQUFDLENBQUM7SUFDM0M7SUFDQSxJQUFNN3BDLE9BQU8sR0FBR3ppQixpREFBTSxDQUFDLEVBQUUsRUFBRXdzRCxXQUFXLEVBQUU5bEQsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQyxDQUFDeWIsT0FBTyxDQUFDO0lBQ2pFLE9BQU84cEMsVUFBVSxHQUNYOXBDLE9BQU8sQ0FBQzN4QyxNQUFNLENBQUN5N0UsVUFBVSxDQUFDLENBQUMvOUUsTUFBTSxHQUFHLENBQUMsR0FDckNpMEMsT0FBTyxDQUFDajBDLE1BQU0sR0FBRyxDQUFDO0VBQzVCLENBQUMsRUFBRSxDQUFDNjlFLFVBQVUsQ0FBQyxDQUFDO0VBQ2hCLElBQU1JLFVBQVUsR0FBR04sa0RBQVcsQ0FBQyxVQUFDbjRFLE9BQU8sRUFBSztJQUN4QyxJQUFBaUIsS0FBQSxHQUEyQ2pCLE9BQU8sSUFBSSxDQUFDLENBQUM7TUFBaER1NEUsVUFBVSxHQUFBdDNFLEtBQUEsQ0FBVnMzRSxVQUFVO01BQUU1bUIsU0FBUyxHQUFBMXdELEtBQUEsQ0FBVDB3RCxTQUFTO01BQUUybUIsT0FBTyxHQUFBcjNFLEtBQUEsQ0FBUHEzRSxPQUFPO0lBQ3RDLE9BQU94N0Msd0RBQVcsQ0FBQyxVQUFDL0IsS0FBSyxFQUFLO01BQzFCLElBQUl5OUMsV0FBVyxHQUFHLENBQUNILFVBQVUsQ0FBQztNQUM5QixJQUFJMW1CLFNBQVMsRUFBRTtRQUNYNm1CLFdBQVcsR0FBRyxDQUNWN2pELElBQUksQ0FBQ0MsU0FBUyxDQUFDcGIsaURBQU0sQ0FBQzZ0QixhQUFhLEVBQUVzcUIsU0FBUyxDQUFDLENBQUMsQ0FDbkQ7TUFDTCxDQUFDLE1BQ0ksSUFBSTJtQixPQUFPLEVBQUU7UUFDZEUsV0FBVyxHQUFHLENBQUM3akQsSUFBSSxDQUFDQyxTQUFTLENBQUMwakQsT0FBTyxDQUFDLENBQUM7TUFDM0M7TUFDQSxJQUFNM0UsSUFBSSxHQUFHM25ELGlEQUFNLENBQUMsRUFBRSxFQUFFd3NELFdBQVcsRUFBRXo5QyxLQUFLLENBQUMwVCxPQUFPLENBQUM7TUFDbkQsSUFBSThwQyxVQUFVLEVBQUU7UUFDWixPQUFPNUUsSUFBSSxDQUFDNzJFLE1BQU0sQ0FBQ3k3RSxVQUFVLENBQUMsQ0FBQy85RSxNQUFNLEdBQUcsQ0FBQztNQUM3QztNQUNBLE9BQU9tNUUsSUFBSSxDQUFDbjVFLE1BQU0sR0FBRyxDQUFDO0lBQzFCLENBQUMsQ0FBQztFQUNOLENBQUMsRUFBRSxDQUFDNjlFLFVBQVUsQ0FBQyxDQUFDO0VBQ2hCLElBQU1LLFFBQVEsR0FBR3BtRCw4Q0FBTyxDQUFDLFlBQU07SUFDM0IsT0FBTztNQUNIK1UsYUFBYTtNQUNic3NCLFNBQVM7TUFDVDhrQixVQUFVO01BQ1YzN0MsV0FBVztNQUNYRSxRQUFRO01BQ1JKLFdBQVdBLHNEQUFBQTtJQUNmLENBQUM7RUFDTCxDQUFDLEVBQUUsQ0FBQ3k3QyxVQUFVLENBQUMsQ0FBQztFQUNoQixvQkFBUWhtRCwwREFBbUIsQ0FBQ3F5QyxXQUFXLENBQUNqeUMsUUFBUSxFQUFFO0lBQUV2MkIsS0FBSyxFQUFFdzhFO0VBQVMsQ0FBQyxFQUFFeDBFLFFBQVEsQ0FBQztBQUNwRjtBQUNPLFNBQVN5Z0UsY0FBY0EsQ0FBQSxFQUFHO0VBQzdCLElBQU1nVSxHQUFHLEdBQUdqbEQsaURBQVUsQ0FBQ2d4QyxXQUFXLENBQUM7RUFDbkMsSUFBSSxDQUFDaVUsR0FBRyxFQUFFO0lBQ047SUFDQWxvRSxPQUFPLENBQUN5bEIsS0FBSyxDQUFDLHlLQUF5SyxDQUFDO0VBQzVMO0VBQ0EsT0FBT3lpRCxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlENEQ7QUFDcUY7QUFDbkY7QUFDd0I7QUFDbkI7QUFDRztBQUM2QztBQUNoRjtBQUNrQjtBQUNrQztBQUNyQztBQUNFO0FBQ3BELFNBQVNqekMsV0FBV0EsQ0FBQTFrQyxJQUFBLEVBRVA7RUFBQSxJQUZVcW1DLGFBQWEsR0FBQXJtQyxJQUFBLENBQWJxbUMsYUFBYTtJQUFFRCxrQkFBa0IsR0FBQXBtQyxJQUFBLENBQWxCb21DLGtCQUFrQjtJQUFFOHhDLGdCQUFnQixHQUFBbDRFLElBQUEsQ0FBaEJrNEUsZ0JBQWdCO0lBQzFFQyxVQUFVLEdBQUFuNEUsSUFBQSxDQUFWbTRFLFVBQVU7SUFDUGpvQixNQUFNLEdBQUFrakIsd0JBQUEsQ0FBQXB6RSxJQUFBLEVBQUF3eUIsU0FBQTtFQUNMLElBQU0rRSxRQUFRLEdBQUdxRSx3REFBVyxDQUFDLENBQUM7RUFDOUIsSUFBTXc4QyxZQUFZLEdBQUd6bEQsNkNBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMvQixJQUFNMGxELFNBQVMsR0FBRzFsRCw2Q0FBTSxDQUFDLEtBQUssQ0FBQztFQUMvQixJQUFNMmxELFlBQVksR0FBRzNsRCw2Q0FBTSxDQUFDMFQsYUFBYSxDQUFDO0VBQzFDLElBQUlreUMsZUFBZSxHQUFHLElBQUk7RUFDMUIsSUFBSUMsb0JBQW9CLEdBQUcsSUFBSTtFQUMvQixJQUFJQyxPQUFPLEdBQUcsSUFBSTtFQUNsQjtFQUNBLElBQU01ekMsTUFBTSxHQUFHL0ksd0RBQVcsQ0FBQ204QyxvREFBWSxDQUFDO0VBQ3hDO0VBQ0EsSUFBQVMsWUFBQSxHQUFpRTU4Qyx3REFBVyxDQUFDaThDLDJEQUFlLENBQUMxeEMsYUFBYSxDQUFDLEVBQUUyeEMsaUVBQXlCLENBQUM7SUFBQVcsYUFBQSxHQUFBeitFLGNBQUEsQ0FBQXcrRSxZQUFBO0lBQWhJNXJFLFNBQVMsR0FBQTZyRSxhQUFBO0lBQUVDLGNBQWMsR0FBQUQsYUFBQTtJQUFFOTNFLENBQUMsR0FBQTgzRSxhQUFBO0lBQUVoRixZQUFZLEdBQUFnRixhQUFBO0lBQUV2akMsVUFBVSxHQUFBdWpDLGFBQUE7RUFDN0RKLGVBQWUsR0FBR3pyRSxTQUFTO0VBQzNCMHJFLG9CQUFvQixHQUFHSSxjQUFjO0VBQ3JDSCxPQUFPLEdBQUc1M0UsQ0FBQztFQUNYeXdCLDhDQUFPLENBQUMsWUFBTTtJQUNWLElBQUk2bUQsVUFBVSxFQUFFO01BQ1pFLFNBQVMsQ0FBQ2huRSxPQUFPLEdBQUcsSUFBSTtNQUN4Qm9uRSxPQUFPLEdBQUcsQ0FBQztNQUNYLElBQUlBLE9BQU8sSUFBSUwsWUFBWSxDQUFDL21FLE9BQU8sRUFBRTtRQUNqQyxPQUFPK21FLFlBQVksQ0FBQy9tRSxPQUFPLENBQUNvbkUsT0FBTyxDQUFDO01BQ3hDO0lBQ0osQ0FBQyxNQUNJO01BQ0RKLFNBQVMsQ0FBQ2huRSxPQUFPLEdBQUcsS0FBSztJQUM3QjtJQUNBaW5FLFlBQVksQ0FBQ2puRSxPQUFPLEdBQUdnMUIsYUFBYTtFQUN4QyxDQUFDLEVBQUUsQ0FBQzh4QyxVQUFVLENBQUMsQ0FBQztFQUNoQixJQUFNVSxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSWh4QixRQUFRLEVBQUs7SUFDM0IsSUFBQWl4QixxQkFBQSxHQUFlTixvQkFBb0I7TUFBM0I1OEUsRUFBRSxHQUFBazlFLHFCQUFBLENBQUZsOUUsRUFBRTtJQUNWLElBQVFtOUUsV0FBVyxHQUFtQmx4QixRQUFRLENBQXRDa3hCLFdBQVc7TUFBS0MsU0FBUyxHQUFBNUYsd0JBQUEsQ0FBS3ZyQixRQUFRLEVBQUFveEIsVUFBQTtJQUM5QztJQUNBO0lBQ0ExaEQsUUFBUSxDQUFDLFVBQUNBLFFBQVEsRUFBRXZGLFFBQVEsRUFBSztNQUM3QixJQUFNa25ELFlBQVksR0FBR2xuRCxRQUFRLENBQUMsQ0FBQztNQUMvQixJQUFRc1UsTUFBTSxHQUFLNHlDLFlBQVksQ0FBdkI1eUMsTUFBTTtNQUNkLElBQU0yL0IsU0FBUyxHQUFHMlIsNkRBQWtCLENBQUNVLFlBQVksQ0FBQ2puRSxPQUFPLEVBQUU2bkUsWUFBWSxDQUFDO01BQ3hFLElBQUksQ0FBQ2pULFNBQVMsRUFDVjtNQUNKLElBQWVrVCxRQUFRLEdBQUtsVCxTQUFTLENBQTdCNTdELEtBQUs7TUFDYixJQUFJLENBQUM4dUUsUUFBUSxFQUNUO01BQ0osSUFBTXhGLFlBQVksR0FBR3pvRCxrREFBTSxDQUFDLFVBQUM5VSxHQUFHLEVBQUVsVyxHQUFHO1FBQUEsT0FBSyxDQUFDMGEsa0RBQU0sQ0FBQ3hFLEdBQUcsRUFBRStpRSxRQUFRLENBQUNqNUUsR0FBRyxDQUFDLENBQUM7TUFBQSxHQUFFODRFLFNBQVMsQ0FBQztNQUNqRixJQUFJRCxXQUFXLEVBQUU7UUFDYnhoRCxRQUFRLENBQUNzTSxpREFBTyxDQUFDO1VBQ2I1b0IsSUFBSSxFQUFFLFVBQVU7VUFDaEJpYSxLQUFLLEVBQUU2akQ7UUFDWCxDQUFDLENBQUMsQ0FBQztNQUNQO01BQ0EsSUFBSTl3RCxrREFBTyxDQUFDMHJELFlBQVksQ0FBQyxFQUFFO1FBQ3ZCO01BQ0o7TUFDQTtNQUNBLElBQU15RixXQUFXLEdBQUd4eEIscUVBQWMsQ0FBQ2hzRCxFQUFFLEVBQUU5QixrREFBSSxDQUFDNjVFLFlBQVksQ0FBQyxFQUFFcnRDLE1BQU0sQ0FBQztNQUNsRXRYLGtEQUFLLENBQUMsWUFBTTtRQUNSO1FBQ0EsSUFBSW9xRCxXQUFXLENBQUM1L0UsTUFBTSxFQUFFO1VBQ3BCKzlCLFFBQVEsQ0FBQ3dWLHlEQUFlLENBQUM7WUFDckJueEMsRUFBRTtZQUNGeU8sS0FBSyxFQUFFNGdCLGtEQUFJLENBQUNtdUQsV0FBVyxFQUFFekYsWUFBWTtVQUN6QyxDQUFDLENBQUMsQ0FBQztRQUNQO1FBQ0E7UUFDQXA4QyxRQUFRLENBQUN5VixxREFBVyxDQUFDO1VBQ2pCM2lDLEtBQUssRUFBRXNwRSxZQUFZO1VBQ25CeCtCLFFBQVEsRUFBRW1qQyxZQUFZLENBQUNqbkUsT0FBTztVQUM5QitqQyxVQUFVLEVBQUU7UUFDaEIsQ0FBQyxDQUFDLENBQUM7TUFDUCxDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7RUFDTixDQUFDO0VBQ0QsSUFBTWlrQyxlQUFlLEdBQUdsQyxrREFBVyxDQUFDLFVBQUNobkQsU0FBUyxFQUFFbXBELGFBQWEsRUFBRUMsZUFBZSxFQUFLO0lBQUEsSUFBQUMsZ0JBQUE7SUFDL0UsSUFBSS8wQyw4REFBaUIsQ0FBQzh6QyxlQUFlLENBQUMsRUFBRTtNQUNwQyxPQUFPQSxlQUFlO0lBQzFCO0lBQ0Esb0JBQVFsbkQsMERBQW1CLENBQUNxVCxXQUFXLEVBQUU7TUFBRXhrQyxHQUFHLEVBQUVpd0IsU0FBUyxhQUFUQSxTQUFTLGdCQUFBcXBELGdCQUFBLEdBQVRycEQsU0FBUyxDQUFFOWxCLEtBQUssY0FBQW12RSxnQkFBQSxlQUFoQkEsZ0JBQUEsQ0FBa0I1OUUsRUFBRSxHQUMxRGd4QyxrRUFBVyxDQUFDemMsU0FBUyxDQUFDOWxCLEtBQUssQ0FBQ3pPLEVBQUUsQ0FBQyxHQUMvQjAzRSx3REFBYSxDQUFDZ0csYUFBYSxDQUFDO01BQUVsekMsa0JBQWtCLEVBQUVBLGtCQUFrQjtNQUFFQyxhQUFhLEVBQUVpekMsYUFBYTtNQUFFcEIsZ0JBQWdCLEVBQUUvbkQsU0FBUztNQUFFZ29ELFVBQVUsRUFBRW9CO0lBQWdCLENBQUMsQ0FBQztFQUM3SyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ04sSUFBTUUsZ0JBQWdCLEdBQUd0QyxrREFBVyxDQUFDLFVBQUMxNUUsSUFBSSxFQUFFaThFLFlBQVksRUFBRUgsZUFBZSxFQUFLO0lBQzFFLElBQUk3L0UsS0FBSyxDQUFDMEIsT0FBTyxDQUFDcUMsSUFBSSxDQUFDLEVBQUU7TUFDckIsT0FBT0EsSUFBSSxDQUFDMkQsR0FBRyxDQUFDLFVBQUNpYyxDQUFDLEVBQUVoakIsQ0FBQyxFQUFLO1FBQ3RCLElBQUl3OUUseURBQWMsQ0FBQ3g2RCxDQUFDLENBQUMsRUFBRTtVQUNuQixPQUFPZzhELGVBQWUsQ0FBQ2g4RCxDQUFDLEVBQUU3RSxrREFBTSxDQUFDNnRCLGFBQWEsR0FDMUMsT0FBTyxFQUFBN3RCLE1BQUEsQ0FBQXliLGtCQUFBLENBQ0p5bEQsWUFBWSxJQUNmci9FLENBQUMsRUFDSixDQUFDLEVBQUVrL0UsZUFBZSxDQUFDO1FBQ3hCO1FBQ0EsT0FBT2w4RCxDQUFDO01BQ1osQ0FBQyxDQUFDO0lBQ047SUFDQSxJQUFJLENBQUN3NkQseURBQWMsQ0FBQ3A2RSxJQUFJLENBQUMsRUFBRTtNQUN2QixPQUFPQSxJQUFJO0lBQ2Y7SUFDQSxPQUFPNDdFLGVBQWUsQ0FBQzU3RSxJQUFJLEVBQUUrYSxrREFBTSxDQUFDNnRCLGFBQWEsR0FBRyxPQUFPLEVBQUE3dEIsTUFBQSxDQUFBeWIsa0JBQUEsQ0FBS3lsRCxZQUFZLEVBQUMsQ0FBQyxFQUFFSCxlQUFlLENBQUM7RUFDcEcsQ0FBQyxFQUFFLENBQUNsekMsYUFBYSxDQUFDLENBQUM7RUFDbkIsSUFBTXN6QyxVQUFVLEdBQUEzeEMsYUFBQTtJQUNaNndDO0VBQVEsR0FDTDNvQixNQUFNLENBQ1o7RUFDRCxJQUFJNG5CLDhEQUFtQixDQUFDUyxlQUFlLENBQUMsRUFBRTtJQUN0Q29CLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHdEIsU0FBUyxDQUFDaG5FLE9BQU8sR0FDMUMsUUFBUSxHQUNSc2lFLFlBQVksR0FDUnYrQixVQUFVLEdBQ1YsUUFBUTtFQUN0QjtFQUNBLElBQU13a0MsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBSTlzRSxTQUFTLEVBQUU4ckUsY0FBYyxFQUFLO0lBQ3BEO0lBQ0EsSUFBTTNuQixhQUFhLEdBQUdqbUMsa0RBQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRWxlLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFMmxDLFNBQVMsRUFBRTNsQyxTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRW1PLElBQUksQ0FBQyxFQUFFNHBCLE1BQU0sQ0FBQztJQUNuRyxJQUFJeDZCLEtBQUssR0FBR2dnQixrREFBVSxDQUFDdFEsa0RBQU0sQ0FBQyxVQUFVLEVBQUU2K0QsY0FBYyxDQUFDLEVBQUVlLFVBQVUsQ0FBQztJQUFDLElBQUExOEUsS0FBQSxZQUFBQSxNQUFBLEVBQ3hCO1FBQzNDLElBQU1rMEQsWUFBWSxHQUFHRixhQUFhLENBQUM1MkQsQ0FBQyxDQUFDO1FBQ3JDLElBQUl3L0UsY0FBYyxHQUFHLENBQUM7UUFDdEIsSUFBSTFvQixZQUFZLENBQ1gzbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNicEgsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDakJBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUl1dkQsWUFBWSxJQUNsQzBFLFNBQVMsQ0FBQ2huRSxPQUFPLElBQ2pCLENBQUNvbkUsT0FBTyxFQUFFO1VBQ1ZvQixjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCO1FBQ0EsSUFBTUMsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUkxaUUsR0FBRyxFQUFFbzZDLEtBQUssRUFBSztVQUNqQyxPQUFPdG9DLGtEQUFhLENBQUMsVUFBQ3pyQixJQUFJLEVBQUUxRCxDQUFDO1lBQUEsT0FBSzAvRSxnQkFBZ0IsQ0FBQ2g4RSxJQUFJLEtBQUErYSxNQUFBLENBQUF5YixrQkFBQSxDQUFNdTlCLEtBQUssSUFBRXozRCxDQUFDLElBQUc4L0UsY0FBYyxDQUFDO1VBQUEsR0FBRXppRSxHQUFHLENBQUM7UUFDakcsQ0FBQztRQUNELElBQUkrNUMsWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUM1QixJQUFJbTlELFlBQVksR0FBR3ZvQixZQUFZLENBQUMzbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQztVQUMxQyxJQUFJL3RCLElBQUk7VUFDUixJQUFJczhFLFNBQVM7VUFDYixJQUFJNW9CLFlBQVksQ0FBQzUwQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFBQSxJQUFBeTlELEtBQUE7WUFDN0IsSUFBTTFvQixTQUFTLEdBQUcsRUFBRTtjQUFFVCxRQUFRLEdBQUcsRUFBRTtZQUNuQyxJQUFJcnFDLEtBQUssR0FBRyxLQUFLO2NBQUV5ekQsU0FBUyxHQUFHLEtBQUs7WUFDcEM7WUFDQVAsWUFBWSxDQUFDOS9FLE9BQU8sQ0FBQyxVQUFBc2dCLENBQUMsRUFBSTtjQUN0QixJQUFJLENBQUNzTSxLQUFLLEVBQUU7Z0JBQ1IsSUFBSXRNLENBQUMsQ0FBQ3FDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtrQkFDbEJpSyxLQUFLLEdBQUcsSUFBSTtrQkFDWixJQUFJdE0sQ0FBQyxDQUFDcUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQjA5RCxTQUFTLEdBQUcsSUFBSTtvQkFDaEIzb0IsU0FBUyxDQUFDcjJELElBQUksQ0FBQ2lmLENBQUMsQ0FBQ2tLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7a0JBQ3pELENBQUMsTUFDSTtvQkFDRGt0QyxTQUFTLENBQUNyMkQsSUFBSSxDQUFDaWYsQ0FBQyxDQUFDa0ssT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztrQkFDdkM7Z0JBQ0osQ0FBQyxNQUNJLElBQUlsSyxDQUFDLENBQUNxQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7a0JBQ3ZCMDlELFNBQVMsR0FBRyxJQUFJO2tCQUNoQjNvQixTQUFTLENBQUNyMkQsSUFBSSxDQUFDaWYsQ0FBQyxDQUFDa0ssT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxNQUNJO2tCQUNEa3RDLFNBQVMsQ0FBQ3IyRCxJQUFJLENBQUNpZixDQUFDLENBQUM7Z0JBQ3JCO2NBQ0osQ0FBQyxNQUNJO2dCQUNELElBQUlBLENBQUMsQ0FBQ3FDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtrQkFDbEIwOUQsU0FBUyxHQUFHLElBQUk7a0JBQ2hCcHBCLFFBQVEsQ0FBQzUxRCxJQUFJLENBQUNpZixDQUFDLENBQUNrSyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLE1BQ0k7a0JBQ0R5c0MsUUFBUSxDQUFDNTFELElBQUksQ0FBQ2lmLENBQUMsQ0FBQztnQkFDcEI7Y0FDSjtZQUNKLENBQUMsQ0FBQztZQUNGemMsSUFBSSxHQUFHeVQsa0RBQUksQ0FBQ29nRCxTQUFTLEVBQUVqbkQsS0FBSyxDQUFDO1lBQzdCLElBQUk1TSxJQUFJLEtBQUsvQyxTQUFTLElBQUksR0FBQXMvRSxLQUFBLEdBQUN2OEUsSUFBSSxjQUFBdThFLEtBQUEsZUFBSkEsS0FBQSxDQUFNeGdGLE1BQU0sR0FBRTtjQUFBO1lBRXpDO1lBQ0EsSUFBTXdiLFNBQVMsR0FBRzlELGtEQUFJLENBQUMyL0MsUUFBUSxFQUFFcHpELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUN1WCxTQUFTLEVBQUU7Y0FBQTtZQUVoQjtZQUNBK2tFLFNBQVMsR0FBR3Q4RSxJQUFJLENBQUMyRCxHQUFHLENBQUMsVUFBQzJWLEVBQUUsRUFBRTFjLENBQUMsRUFBSztjQUM1QixJQUFNNi9FLFdBQVcsR0FBRzFoRSxrREFBTSxDQUFDODRDLFNBQVMsRUFBRTk0QyxrREFBTSxDQUFDLENBQUNuZSxDQUFDLENBQUMsRUFBRXcyRCxRQUFRLENBQUMsQ0FBQztjQUM1RCxJQUFJc3BCLFNBQVM7Y0FDYixJQUFJRixTQUFTLEVBQUU7Z0JBQ1gsSUFBSXBwQixRQUFRLENBQUNyM0QsTUFBTSxFQUFFO2tCQUNqQjJnRixTQUFTLEdBQUdMLFlBQVksQ0FBQzVvRSxrREFBSSxDQUFDMi9DLFFBQVEsRUFBRTk1QyxFQUFFLENBQUMsRUFBRW1qRSxXQUFXLENBQUM7Z0JBQzdELENBQUMsTUFDSTtrQkFDREMsU0FBUyxHQUFHTCxZQUFZLENBQUMvaUUsRUFBRSxFQUFFbWpFLFdBQVcsQ0FBQztnQkFDN0M7Y0FDSixDQUFDLE1BQ0k7Z0JBQ0RDLFNBQVMsR0FBR1YsZ0JBQWdCLENBQUN2b0Usa0RBQUksQ0FBQzIvQyxRQUFRLEVBQUU5NUMsRUFBRSxDQUFDLEVBQUVtakUsV0FBVyxFQUFFTCxjQUFjLENBQUM7Y0FDakY7Y0FDQSxPQUFPNWlFLGtEQUFTLENBQUM0NUMsUUFBUSxFQUFFc3BCLFNBQVMsRUFBRXBqRSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDO1lBQ0YyaUUsWUFBWSxHQUFHcG9CLFNBQVM7VUFDNUIsQ0FBQyxNQUNJO1lBQ0QsSUFBSUgsWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtjQUM3QjtjQUNBLElBQU1wTCxLQUFLLEdBQUcsRUFBRTtjQUNoQixJQUFJaXBFLE9BQU8sR0FBRyxFQUFFO2NBQ2hCLElBQUlDLE9BQU8sR0FBRyxLQUFLO2NBQ25CLElBQU14cEIsU0FBUSxHQUFHLEVBQUU7Y0FDbkIsS0FBSyxJQUFJNytDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzBuRSxZQUFZLENBQUNsZ0YsTUFBTSxFQUFFd1ksQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLElBQU1zb0UsR0FBRyxHQUFHWixZQUFZLENBQUMxbkUsQ0FBQyxDQUFDO2dCQUMzQixJQUFJc29FLEdBQUcsQ0FBQy85RCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7a0JBQ3BCNjlELE9BQU8sR0FBRzVoRSxrREFBTSxDQUFDckgsS0FBSyxFQUFFLENBQ3BCbXBFLEdBQUcsQ0FBQ2wyRCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUN4QixDQUFDO2tCQUNGLElBQUlwUyxDQUFDLEdBQUcwbkUsWUFBWSxDQUFDbGdGLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdCNmdGLE9BQU8sR0FBRyxJQUFJO2tCQUNsQjtnQkFDSixDQUFDLE1BQ0k7a0JBQ0QsSUFBSUEsT0FBTyxFQUFFO29CQUNUeHBCLFNBQVEsQ0FBQzUxRCxJQUFJLENBQUNxL0UsR0FBRyxDQUFDO2tCQUN0QixDQUFDLE1BQ0k7b0JBQ0RucEUsS0FBSyxDQUFDbFcsSUFBSSxDQUFDcS9FLEdBQUcsQ0FBQztrQkFDbkI7Z0JBQ0o7Y0FDSjtjQUNBLElBQU1DLFFBQVEsR0FBR3JwRSxrREFBSSxDQUFDa3BFLE9BQU8sRUFBRS92RSxLQUFLLENBQUM7Y0FDckMsSUFBSWt3RSxRQUFRLEtBQUs3L0UsU0FBUyxFQUFFO2dCQUN4QjtnQkFDQTtnQkFDQTtnQkFDQXEvRSxTQUFTLEdBQUc3d0Qsa0RBQWEsQ0FBQyxVQUFDN1AsQ0FBQyxFQUFFdGYsQ0FBQztrQkFBQSxPQUFLMC9FLGdCQUFnQixDQUFDWSxPQUFPLEdBQUducEUsa0RBQUksQ0FBQzIvQyxTQUFRLEVBQUV4M0MsQ0FBQyxDQUFDLEdBQUdBLENBQUMsRUFBRWdoRSxPQUFPLEdBQ3ZGN2hFLGtEQUFNLENBQUM0aEUsT0FBTyxFQUFFNWhFLGtEQUFNLENBQUMsQ0FBQ3plLENBQUMsQ0FBQyxFQUFFODJELFNBQVEsQ0FBQyxDQUFDLEdBQ3RDcjRDLGtEQUFNLENBQUM0aEUsT0FBTyxFQUFFLENBQUNyZ0YsQ0FBQyxDQUFDLENBQUMsRUFBRTgvRSxjQUFjLENBQUM7Z0JBQUEsR0FBRVUsUUFBUSxDQUFDO2dCQUN0RGIsWUFBWSxHQUFHVSxPQUFPO2NBQzFCO1lBQ0osQ0FBQyxNQUNJO2NBQ0QzOEUsSUFBSSxHQUFHeVQsa0RBQUksQ0FBQ3dvRSxZQUFZLEVBQUVydkUsS0FBSyxDQUFDO2NBQ2hDLElBQUk1TSxJQUFJLEtBQUsvQyxTQUFTLEVBQUU7Z0JBQUE7Y0FFeEI7Y0FDQXEvRSxTQUFTLEdBQUdOLGdCQUFnQixDQUFDaDhFLElBQUksRUFBRWk4RSxZQUFZLEVBQUVHLGNBQWMsQ0FBQztZQUNwRTtVQUNKO1VBQ0F4dkUsS0FBSyxHQUFHNE0sa0RBQVMsQ0FBQ3lpRSxZQUFZLEVBQUVLLFNBQVMsRUFBRTF2RSxLQUFLLENBQUM7UUFDckQsQ0FBQyxNQUNJO1VBQ0QsSUFBSThtRCxZQUFZLENBQUM1MEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdCLElBQUlpMUMsS0FBSyxHQUFHTCxZQUFZLENBQUMvc0MsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBTWhwQixPQUFPLEdBQUcrMUQsWUFBWSxDQUFDNTBDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDM0MsSUFBSW5oQixPQUFPLEVBQUU7Y0FDVG8yRCxLQUFLLEdBQUdBLEtBQUssQ0FBQ3B0QyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuQztZQUNBLElBQU0zbUIsTUFBSSxHQUFHNE0sS0FBSyxDQUFDbW5ELEtBQUssQ0FBQztZQUN6QixJQUFJL3pELE1BQUksS0FBSy9DLFNBQVMsRUFBRTtjQUNwQixJQUFJVSxPQUFPLEVBQUU7Z0JBQ1QsS0FBSyxJQUFJNFcsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHdlUsTUFBSSxDQUFDakUsTUFBTSxFQUFFd1ksRUFBQyxFQUFFLEVBQUU7a0JBQ2xDLElBQU13b0UsS0FBSyxHQUFHaGlFLGtEQUFNLENBQUMsQ0FBQ2c1QyxLQUFLLENBQUMsRUFBRSxDQUFDeC9DLEVBQUMsQ0FBQyxDQUFDO2tCQUNsQzNILEtBQUssR0FBRzRNLGtEQUFTLENBQUN1akUsS0FBSyxFQUFFVixZQUFZLENBQUNyOEUsTUFBSSxDQUFDdVUsRUFBQyxDQUFDLEVBQUV3b0UsS0FBSyxDQUFDLEVBQUVud0UsS0FBSyxDQUFDO2dCQUNqRTtjQUNKLENBQUMsTUFDSTtnQkFDREEsS0FBSyxHQUFHNk0sa0RBQUssQ0FBQ3M2QyxLQUFLLEVBQUVzb0IsWUFBWSxDQUFDcjhFLE1BQUksRUFBRSxDQUFDK3pELEtBQUssQ0FBQyxDQUFDLEVBQUVubkQsS0FBSyxDQUFDO2NBQzVEO1lBQ0o7VUFDSixDQUFDLE1BQ0k7WUFDRCxJQUFNNU0sTUFBSSxHQUFHNE0sS0FBSyxDQUFDOG1ELFlBQVksQ0FBQztZQUNoQyxJQUFJMXpELE1BQUksS0FBSy9DLFNBQVMsRUFBRTtjQUNwQjJQLEtBQUssR0FBRzZNLGtEQUFLLENBQUNpNkMsWUFBWSxFQUFFc29CLGdCQUFnQixDQUFDaDhFLE1BQUksRUFBRSxDQUFDMHpELFlBQVksQ0FBQyxFQUFFMG9CLGNBQWMsQ0FBQyxFQUFFeHZFLEtBQUssQ0FBQztZQUM5RjtVQUNKO1FBQ0o7TUFDSixDQUFDO01BQUFrd0MsSUFBQTtJQXhKRCxLQUFLLElBQUlsZ0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNDJELGFBQWEsQ0FBQ3ozRCxNQUFNLEVBQUVhLENBQUMsRUFBRTtNQUFBa2dELElBQUEsR0FBQXQ5QyxLQUFBO01BQUEsSUFBQXM5QyxJQUFBLFFBc0Q3QjtJQUFTO0lBbUd6QixJQUFJdC9CLGtEQUFJLENBQUM1USxLQUFLLENBQUN6TyxFQUFFLENBQUMsS0FBSyxRQUFRLEVBQUU7TUFDN0I7TUFDQTtNQUNBO01BQ0F5TyxLQUFLLENBQUN6TyxFQUFFLEdBQUdneEMsa0VBQVcsQ0FBQ3ZpQyxLQUFLLENBQUN6TyxFQUFFLENBQUM7SUFDcEM7SUFDQSxPQUFPeU8sS0FBSztFQUNoQixDQUFDO0VBQ0QsSUFBTW93RSxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQSxFQUFTO0lBQ3RCLElBQUlwQyxTQUFTLENBQUNobkUsT0FBTyxFQUFFO01BQ25Ca25FLGVBQWUsR0FBR0wsZ0JBQWdCO01BQ2xDTSxvQkFBb0IsR0FBR04sZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsdUJBQWhCQSxnQkFBZ0IsQ0FBRTd0RSxLQUFLO0lBQ2xEO0lBQ0EsSUFBSSxDQUFDa3VFLGVBQWUsRUFBRTtNQUNsQixPQUFPLElBQUk7SUFDZjtJQUNBLElBQU1qNUQsT0FBTyxHQUFHeTlCLGlEQUFRLENBQUNqYSxPQUFPLENBQUN5MUMsZUFBZSxDQUFDO0lBQ2pELElBQU1tQyxhQUFhLEdBQUdkLGdCQUFnQixDQUFDckIsZUFBZSxFQUFFQyxvQkFBb0IsQ0FBQztJQUM3RSxJQUFJbUMsZ0JBQWdCO0lBQ3BCLElBQUluQyxvQkFBb0IsQ0FBQ3QxRSxRQUFRLEtBQUt4SSxTQUFTLEVBQUU7TUFDN0NpZ0YsZ0JBQWdCLEdBQUdsQixnQkFBZ0IsQ0FBQ2pCLG9CQUFvQixDQUFDdDFFLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUN1MUUsT0FBTyxJQUFJSixTQUFTLENBQUNobkUsT0FBTyxJQUFJLFVBQVUsSUFBSXNpRSxZQUFZLEdBQ3RJLENBQUMsQ0FBQyxHQUNGLENBQUMsQ0FBQztJQUNaO0lBQ0EwRSxTQUFTLENBQUNobkUsT0FBTyxHQUFHLEtBQUs7SUFDekIsT0FBT3d6QixNQUFNLENBQUMrMUMsV0FBVyxpQkFBSXZwRCwwREFBbUIsQ0FBQzZsRCx5REFBZ0IsRUFBRTtNQUFFNTNELE9BQU8sRUFBRUEsT0FBTztNQUFFalYsS0FBSyxFQUFFcXdFLGFBQWE7TUFBRTV0RSxTQUFTLEVBQUV5ckU7SUFBZ0IsQ0FBQyxFQUFFNW5ELHdEQUFhLENBQUNyUixPQUFPLEVBQUVvN0QsYUFBYSxFQUFFZixVQUFVLEVBQUVnQixnQkFBZ0IsQ0FBQyxDQUFDLElBQUtocUQsd0RBQWEsQ0FBQ3JSLE9BQU8sRUFBRW83RCxhQUFhLEVBQUVmLFVBQVUsRUFBRWdCLGdCQUFnQixDQUFFO0VBQzVSLENBQUM7RUFDRCxJQUFJRSxRQUFRLEdBQUcsSUFBSTtFQUNuQixJQUFJcEMsT0FBTyxJQUFJTCxZQUFZLENBQUMvbUUsT0FBTyxJQUFJLENBQUNnbkUsU0FBUyxDQUFDaG5FLE9BQU8sRUFBRTtJQUN2RHdwRSxRQUFRLEdBQUcsYUFBQXhwRCwyREFBb0IsQ0FBQyttRCxZQUFZLENBQUMvbUUsT0FBTyxDQUFDb25FLE9BQU8sQ0FBQyxDQUFDLEdBQ3hETCxZQUFZLENBQUMvbUUsT0FBTyxDQUFDb25FLE9BQU8sQ0FBQyxHQUM3QixJQUFJO0VBQ2Q7RUFDQSxJQUFJLENBQUNvQyxRQUFRLEVBQUU7SUFDWEEsUUFBUSxHQUFHSixXQUFXLENBQUMsQ0FBQztJQUN4QnJDLFlBQVksQ0FBQy9tRSxPQUFPLEdBQUc7TUFBRSxDQUFDb25FLE9BQU8sR0FBR29DO0lBQVMsQ0FBQztFQUNsRDtFQUNBLE9BQU90QyxlQUFlLGlCQUFJbG5ELDBEQUFtQixDQUFDMnJDLHNGQUFzQixFQUFFO0lBQUUrZCxhQUFhLEVBQUV4QyxlQUFlLENBQUN0OUQsSUFBSTtJQUFFczZCLFdBQVcsRUFBRXZ4QixrREFBRSxDQUFDOXFCLE1BQU0sRUFBRXMvRSxvQkFBb0IsQ0FBQzU4RSxFQUFFLENBQUMsR0FDbkpneEMsa0VBQVcsQ0FBQzRyQyxvQkFBb0IsQ0FBQzU4RSxFQUFFLENBQUMsR0FDcEM0OEUsb0JBQW9CLENBQUM1OEUsRUFBRTtJQUFFczVCLEtBQUssRUFBRWtSLGtCQUFrQjtJQUFFN08sUUFBUSxFQUFFQTtFQUFTLENBQUMsZUFDOUVsRywwREFBbUIsQ0FBQytsRCw4REFBbUIsRUFBRTtJQUFFL3dDLGFBQWEsRUFBRUE7RUFBYyxDQUFDLEVBQUUsYUFBQWhWLDJEQUFvQixDQUFDd3BELFFBQVEsQ0FBQyxHQUFHQSxRQUFRLGdCQUFHeHBELDBEQUFtQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFLQSwwREFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdk07QUFDQSwrREFBZXFULFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDalV5QjtBQUNGO0FBQ1Q7QUFDeUQ7QUFDakc7QUFDQTtBQUNBO0FBQ0EsU0FBU20vQixlQUFlQSxDQUFBN2pFLElBQUEsRUFBNkM7RUFBQSxJQUExQzhNLFNBQVMsR0FBQTlNLElBQUEsQ0FBVDhNLFNBQVM7SUFBRXU1QixhQUFhLEdBQUFybUMsSUFBQSxDQUFicW1DLGFBQWE7SUFBQTIwQyxTQUFBLEdBQUFoN0UsSUFBQSxDQUFFdkIsSUFBSTtJQUFKQSxJQUFJLEdBQUF1OEUsU0FBQSxjQUFHLEtBQUssR0FBQUEsU0FBQTtFQUM3RCxJQUFNempELFFBQVEsR0FBR3FFLHdEQUFXLENBQUMsQ0FBQztFQUM5QixJQUFBb0osU0FBQSxHQUFnQ3hCLCtDQUFRLENBQUMsS0FBSyxDQUFDO0lBQUF5QixVQUFBLEdBQUEvcUMsY0FBQSxDQUFBOHFDLFNBQUE7SUFBeENpMkMsUUFBUSxHQUFBaDJDLFVBQUE7SUFBRWkyQyxXQUFXLEdBQUFqMkMsVUFBQTtFQUM1QnhHLGdEQUFTLENBQUMsWUFBTTtJQUNaO0lBQ0E7SUFDQWxILFFBQVEsQ0FBQzIwQiw4REFBb0IsQ0FBQztNQUMxQnAvQyxTQUFTO01BQ1R1NUI7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNINjBDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDakIsT0FBTyxZQUFNO01BQ1QsSUFBSXo4RSxJQUFJLEVBQUU7UUFDTjg0QixRQUFRLENBQUN5MEIseURBQWUsQ0FBQztVQUFFM2xCO1FBQWMsQ0FBQyxDQUFDLENBQUM7TUFDaEQ7SUFDSixDQUFDO0VBQ0wsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNONUgsZ0RBQVMsQ0FBQyxZQUFNO0lBQ1p6UCxrREFBSyxDQUFDLFlBQU07TUFDUnVJLFFBQVEsQ0FBQ3lWLHFEQUFXLENBQUM7UUFBRW1JLFFBQVEsRUFBRTlPLGFBQWE7UUFBRWg4QixLQUFLLEVBQUV5QyxTQUFTLENBQUN6QztNQUFNLENBQUMsQ0FBQyxDQUFDO01BQzFFLElBQUl5QyxTQUFTLENBQUN6QyxLQUFLLENBQUN6TyxFQUFFLEVBQUU7UUFDcEIyN0IsUUFBUSxDQUFDd1YseURBQWUsQ0FBQztVQUNyQm54QyxFQUFFLEVBQUVrUixTQUFTLENBQUN6QyxLQUFLLENBQUN6TyxFQUFFO1VBQ3RCeU8sS0FBSyxFQUFFeUMsU0FBUyxDQUFDekM7UUFDckIsQ0FBQyxDQUFDLENBQUM7TUFDUDtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUMsRUFBRSxDQUFDeUMsU0FBUyxDQUFDekMsS0FBSyxDQUFDLENBQUM7RUFDckIsSUFBSSxDQUFDNHdFLFFBQVEsRUFBRTtJQUNYLE9BQU8sSUFBSTtFQUNmO0VBQ0E7RUFDQSxvQkFBTzVwRCwwREFBbUIsQ0FBQ3FULG9EQUFXLEVBQUU7SUFBRTJCLGFBQWEsRUFBRUE7RUFBYyxDQUFDLENBQUM7QUFDN0U7QUFDQSwrREFBZXc5QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekMwRDtBQUN6RDtBQUMvQixJQUFNdVgsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixJQUFNQyxzQkFBc0IsR0FBRyxTQUF6QkEsc0JBQXNCQSxDQUFJQyxXQUFXLEVBQUU1SCxPQUFPLEVBQUs7RUFDckQsSUFBTTZILGVBQWUsR0FBR0QsV0FBVyxDQUFDOXZELEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDOUMsSUFBTWd3RCxZQUFZLEdBQUc5SCxPQUFPLENBQUNsb0QsS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUN2QztFQUNBLElBQU1pd0QsY0FBYyxHQUFHRCxZQUFZLENBQUNFLEtBQUssQ0FBQyxVQUFDQyxHQUFHLEVBQUV0aEYsQ0FBQztJQUFBLE9BQUtraEYsZUFBZSxDQUFDbGhGLENBQUMsQ0FBQyxLQUFLc2hGLEdBQUc7RUFBQSxFQUFDO0VBQ2pGLElBQUksQ0FBQ0YsY0FBYyxFQUNmLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0VBQ3RCO0VBQ0EsSUFBTUcsaUJBQWlCLEdBQUdMLGVBQWUsQ0FBQzdqRSxLQUFLLENBQUM4akUsWUFBWSxDQUFDaGlGLE1BQU0sQ0FBQztFQUNwRSxJQUFNcWlGLFVBQVUsR0FBR0QsaUJBQWlCLENBQUM5L0UsTUFBTSxDQUFDLFVBQUE2RyxDQUFDO0lBQUEsT0FBSUEsQ0FBQyxLQUFLLE9BQU87RUFBQSxFQUFDLENBQUNuSixNQUFNO0VBQ3RFLE9BQU8sQ0FBQ3FpRixVQUFVLEdBQUcsQ0FBQyxFQUFFRCxpQkFBaUIsQ0FBQztBQUM5QyxDQUFDO0FBQ0QsU0FBU0UscUJBQXFCQSxDQUFDL2hELEtBQUssRUFBRTI1QyxPQUFPLEVBQUU7RUFDM0MsSUFBSXFJLFlBQVksR0FBRyxDQUFDO0VBQ3BCLElBQUkzbUMsVUFBVSxDQUFDLENBQUM7RUFDaEIsSUFBTXUrQixZQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCejZFLE1BQU0sQ0FBQ3lwQixPQUFPLENBQUNvWCxLQUFLLENBQUN5NUMsWUFBWSxDQUFDLENBQUM1NUUsT0FBTyxDQUFDLFVBQUFvRyxJQUFBLEVBQTZCO0lBQUEsSUFBQUMsS0FBQSxHQUFBL0YsY0FBQSxDQUFBOEYsSUFBQTtNQUEzQnM3RSxXQUFXLEdBQUFyN0UsS0FBQTtNQUFFKzdFLFFBQVEsR0FBQS83RSxLQUFBO0lBQzlELElBQUFnOEUscUJBQUEsR0FBd0NaLHNCQUFzQixDQUFDQyxXQUFXLEVBQUU1SCxPQUFPLENBQUM7TUFBQXdJLHNCQUFBLEdBQUFoaUYsY0FBQSxDQUFBK2hGLHFCQUFBO01BQTdFRSxVQUFVLEdBQUFELHNCQUFBO01BQUVOLGlCQUFpQixHQUFBTSxzQkFBQTtJQUNwQyxJQUFJQyxVQUFVLEVBQUU7TUFDWixJQUFNQyxZQUFZLEdBQUdweEQsaURBQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDc3dELFdBQVcsQ0FBQyxFQUFFRixjQUFjLENBQUM7TUFDOURXLFlBQVksSUFBSS93RCxpREFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFZ3hELFFBQVEsQ0FBQztNQUM3QyxJQUFJSSxZQUFZLEtBQUtKLFFBQVEsRUFBRTtRQUMzQixJQUFJVixXQUFXLEtBQUs1SCxPQUFPLEVBQUU7VUFDekJ4NkUsTUFBTSxDQUFDQyxNQUFNLENBQUN3NkUsWUFBWSxFQUFFO1lBQUUsQ0FBQ2lJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHO1VBQUssQ0FBQyxDQUFDO1VBQzdEeG1DLFVBQVUsR0FBRyxZQUFZO1FBQzdCLENBQUMsTUFDSTtVQUNEbDhDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDdzZFLFlBQVksRUFBRTNvRCxpREFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUVneEQsUUFBUSxDQUFDLENBQUM7VUFDbkU1bUMsVUFBVSxHQUFHcHFCLGlEQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRWd4RCxRQUFRLENBQUM7UUFDckQ7UUFDQVosY0FBYyxDQUFDRSxXQUFXLENBQUMsR0FBR1UsUUFBUTtNQUMxQztJQUNKO0VBQ0osQ0FBQyxDQUFDO0VBQ0YsT0FBTztJQUNINzhELElBQUksRUFBRTQ4RCxZQUFZO0lBQ2xCcEksWUFBWTtJQUNaditCO0VBQ0osQ0FBQztBQUNMO0FBQ08sSUFBTTJpQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUkxeEMsYUFBYTtFQUFBLE9BQUssVUFBQ3RNLEtBQUssRUFBSztJQUN6RCxJQUFNN1ksQ0FBQyxHQUFHMDJELDZEQUFrQixDQUFDdnhDLGFBQWEsRUFBRXRNLEtBQUssQ0FBQztJQUNsRDtJQUNBO0lBQ0E7SUFDQSxJQUFNMjVDLE9BQU8sR0FBR0osd0RBQWEsQ0FBQ2p0QyxhQUFhLENBQUM7SUFDNUMsSUFBSWxuQixJQUFJO0lBQ1IsSUFBSWc4RCxrRUFBdUIsQ0FBQ2o2RCxDQUFDLENBQUMsRUFBRTtNQUM1Qi9CLElBQUksR0FBRzI4RCxxQkFBcUIsQ0FBQy9oRCxLQUFLLEVBQUUyNUMsT0FBTyxDQUFDO0lBQ2hELENBQUMsTUFDSTtNQUNEdjBELElBQUksR0FBRzRhLEtBQUssQ0FBQ3k1QyxZQUFZLENBQUNFLE9BQU8sQ0FBQztJQUN0QztJQUNBLElBQUk3eUUsQ0FBQyxHQUFHLENBQUM7SUFDVCxJQUFJOHlFLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSXYrQixVQUFVLEdBQUcsRUFBRTtJQUNuQixJQUFJajJCLElBQUksRUFBRTtNQUNOdGUsQ0FBQyxHQUFHc2UsSUFBSSxDQUFDLE1BQU0sQ0FBQztNQUNoQncwRCxZQUFZLEdBQUd4MEQsSUFBSSxDQUFDLGNBQWMsQ0FBQztNQUNuQ2kyQixVQUFVLEdBQUdqMkIsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUNuQztJQUNBLE9BQU8sQ0FBQytCLENBQUMsRUFBRUEsQ0FBQyxhQUFEQSxDQUFDLHVCQUFEQSxDQUFDLENBQUU3VyxLQUFLLEVBQUV4SixDQUFDLEVBQUU4eUUsWUFBWSxFQUFFditCLFVBQVUsQ0FBQztFQUNyRCxDQUFDO0FBQUE7QUFDTSxTQUFTNGlDLHlCQUF5QkEsQ0FBQTFpQyxLQUFBLEVBQUFTLEtBQUEsRUFBMkM7RUFBQSxJQUFBQyxLQUFBLEdBQUE5N0MsY0FBQSxDQUFBbzdDLEtBQUE7SUFBekNyOEMsQ0FBQyxHQUFBKzhDLEtBQUE7SUFBRW9CLEVBQUUsR0FBQXBCLEtBQUE7SUFBRTcyQixJQUFJLEdBQUE2MkIsS0FBQTtFQUFBLElBQUFnQixLQUFBLEdBQUE5OEMsY0FBQSxDQUFBNjdDLEtBQUE7SUFBSXNtQyxHQUFHLEdBQUFybEMsS0FBQTtJQUFFc2xDLElBQUksR0FBQXRsQyxLQUFBO0lBQUVvbEMsWUFBWSxHQUFBcGxDLEtBQUE7RUFDN0U7RUFDQSxPQUFPNzNCLElBQUksS0FBS2k5RCxZQUFZO0FBQ2hDO0FBQ08sU0FBU25FLFlBQVlBLENBQUNsK0MsS0FBSyxFQUFFO0VBQ2hDLE9BQU9BLEtBQUssQ0FBQzhLLE1BQU07QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEUwQjtBQUN3QztBQUMzRCxTQUFTbFUsYUFBYUEsQ0FBQ3JSLE9BQU8sRUFBRWpWLEtBQUssRUFBRXN2RSxVQUFVLEVBQUV6MkUsUUFBUSxFQUFFO0VBQ2hFLElBQU00akUsUUFBUSxHQUFHejhDLGlEQUFVLENBQUNoZ0IsS0FBSyxFQUFFc3ZFLFVBQVUsQ0FBQztFQUM5QyxJQUFJamdGLEtBQUssQ0FBQzBCLE9BQU8sQ0FBQzhILFFBQVEsQ0FBQyxFQUFFO0lBQ3pCLG9CQUFPbXVCLDBEQUFtQixDQUFBeFosS0FBQSxDQUFuQndaLDhDQUFLLEdBQWUvUixPQUFPLEVBQUV3bkQsUUFBUSxFQUFBdHVELE1BQUEsQ0FBQXliLGtCQUFBLENBQUsvd0IsUUFBUSxHQUFDO0VBQzlEO0VBQ0Esb0JBQU9tdUIsMERBQW1CLENBQUMvUixPQUFPLEVBQUV3bkQsUUFBUSxFQUFFNWpFLFFBQVEsQ0FBQztBQUMzRDtBQUNPLFNBQVMyMEUsY0FBY0EsQ0FBQ3pnRSxHQUFHLEVBQUU7RUFDaEMsT0FBUTZELGlEQUFJLENBQUM3RCxHQUFHLENBQUMsS0FBSyxRQUFRLElBQzFCalosaURBQUcsQ0FBQyxNQUFNLEVBQUVpWixHQUFHLENBQUMsSUFDaEJqWixpREFBRyxDQUFDLFdBQVcsRUFBRWlaLEdBQUcsQ0FBQyxJQUNyQmpaLGlEQUFHLENBQUMsT0FBTyxFQUFFaVosR0FBRyxDQUFDO0FBQ3pCO0FBQ08sU0FBUzYvRCxpQkFBaUJBLENBQUNzRixtQkFBbUIsRUFBRTtFQUNuRCxJQUFJdGhFLGlEQUFJLENBQUNzaEUsbUJBQW1CLENBQUMsS0FBSyxPQUFPLEVBQUU7SUFDdkMsTUFBTSxJQUFJditELEtBQUssQ0FBQyxtRUFBbUUsR0FDL0UsaUVBQWlFLEdBQ2pFLHNEQUFzRCxHQUN0RCw2Q0FBNkMsR0FDN0MyVixJQUFJLENBQUNDLFNBQVMsQ0FBQzJvRCxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDckQ7RUFDQSxJQUFJdGhFLGlEQUFJLENBQUNzaEUsbUJBQW1CLENBQUMsS0FBSyxRQUFRLElBQ3RDLEVBQUVwK0UsaURBQUcsQ0FBQyxXQUFXLEVBQUVvK0UsbUJBQW1CLENBQUMsSUFDbkNwK0UsaURBQUcsQ0FBQyxNQUFNLEVBQUVvK0UsbUJBQW1CLENBQUMsSUFDaENwK0UsaURBQUcsQ0FBQyxPQUFPLEVBQUVvK0UsbUJBQW1CLENBQUMsQ0FBQyxFQUFFO0lBQ3hDLE1BQU0sSUFBSXYrRCxLQUFLLENBQUMsK0RBQStELEdBQzNFLHdDQUF3QyxHQUN4QywwREFBMEQsR0FDMUQyVixJQUFJLENBQUNDLFNBQVMsQ0FBQzJvRCxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDckQ7QUFDSjtBQUNPLFNBQVNqSixhQUFhQSxDQUFDa0osVUFBVSxFQUFFO0VBQ3RDLE9BQU9uOUQsaURBQUksQ0FBQyxHQUFHLEVBQUVtOUQsVUFBVSxDQUFDO0FBQ2hDO0FBQ08sU0FBUzVFLGtCQUFrQkEsQ0FBQ3Z4QyxhQUFhLEVBQUV0TSxLQUFLLEVBQUU7RUFDckQsT0FBTzdvQixpREFBSSxDQUFDbTFCLGFBQWEsRUFBRXRNLEtBQUssQ0FBQ3gxQixNQUFNLENBQUM7QUFDNUM7QUFDTyxTQUFTdXpFLG1CQUFtQkEsQ0FBQ3lFLG1CQUFtQixFQUFFO0VBQ3JELE9BQVEsZ0JBQWdCLElBQ3BCdnhELGlEQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQ3V4RCxtQkFBbUIsYUFBbkJBLG1CQUFtQix1QkFBbkJBLG1CQUFtQixDQUFFOXBDLFNBQVMsRUFBRThwQyxtQkFBbUIsYUFBbkJBLG1CQUFtQix1QkFBbkJBLG1CQUFtQixDQUFFdGhFLElBQUksQ0FBQyxFQUFFbVYsTUFBTSxDQUFDO0FBQ3ZGO0FBQ08sU0FBUytxRCx1QkFBdUJBLENBQUNvQixtQkFBbUIsRUFBRTtFQUN6RCxPQUFRLG9CQUFvQixJQUN4QnZ4RCxpREFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUN1eEQsbUJBQW1CLGFBQW5CQSxtQkFBbUIsdUJBQW5CQSxtQkFBbUIsQ0FBRTlwQyxTQUFTLEVBQUU4cEMsbUJBQW1CLGFBQW5CQSxtQkFBbUIsdUJBQW5CQSxtQkFBbUIsQ0FBRXRoRSxJQUFJLENBQUMsRUFBRW1WLE1BQU0sQ0FBQztBQUN2Rjs7Ozs7Ozs7Ozs7QUM5Q0E7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N6QkE7V0FDQTtXQUNBO1dBQ0EsZUFBZSw0QkFBNEI7V0FDM0MsZUFBZTtXQUNmLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsQ0FBQzs7Ozs7V0NQRCw4Q0FBOEM7Ozs7O1dDQTlDO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQ0pBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHFCQUFNLG9CQUFvQixxQkFBTTtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHFDQUFxQyw0QkFBNEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsMEJBQTBCLGVBQWU7QUFDdEU7O0FBRU87QUFDUDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pvQjRDO0FBQ1A7O0FBRXJDO0FBQ0FBLE1BQU0sQ0FBQ3lZLFlBQVksR0FBR0EsdURBQVksQyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AcGxvdGx5L2Rhc2gtY29tcG9uZW50LXBsdWdpbnMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXBhdGh5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hc2hlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1kdW5lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWZvcmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1oZWF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1sYWtlc2lkZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1zZWFzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9iZXNwaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2JyZXdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jaGFsay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29kZXNjaG9vbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29sb3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9kZWZhdWx0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9laWdodGllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZW1iZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9mbGF0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9nb29nbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dyYXlzY2FsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JlZW5zY3JlZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hhcm1vbmljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ob3BzY290Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9pc290b3BlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tYXJyYWtlc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vY2hhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tb25va2FpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9vY2Vhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcGFyYWlzby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcG9wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9yYWlsc2Nhc3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zaGFwZXNoaWZ0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc3VtbWVyZnJ1aXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RocmVlemVyb3R3b2ZvdXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RvbW9ycm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90dWJlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90d2lsaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1zdHJpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nvb2tpZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nvc2UtYmFzZS9jb3NlLWJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWRhZ3JlL2N5dG9zY2FwZS1kYWdyZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1mY29zZS9jeXRvc2NhcGUtZmNvc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUvZGlzdC9jeXRvc2NhcGUuZXNtLm1qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2FjeWNsaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9jb29yZGluYXRlLXN5c3RlbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kYXRhL2xpc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZGVidWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JlZWR5LWZhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbG9kYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL25lc3RpbmctZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbm9ybWFsaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9iYXJ5Y2VudGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2J1aWxkLWxheWVyLWdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luaXQtb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvcmVzb2x2ZS1jb25mbGljdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC1zdWJncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9mZWFzaWJsZS10cmVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9uZXR3b3JrLXNpbXBsZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay91dGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RlcGVuZGVuY3ktZ3JhcGgvbGliL2RlcF9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Zhc3QtaXNudW1lcmljL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2NvbXBvbmVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Rmcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEtYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmluZC1jeWNsZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90b3Bzb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2RhdGEvcHJpb3JpdHktcXVldWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9pcy1zdHJpbmctYmxhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sYXlvdXQtYmFzZS9sYXlvdXQtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC5jdXJyeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25Jbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUd0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbERlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hTi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VMdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU9yZGVyQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNvcnRCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUcmltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmlxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlWmlwT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdEZ1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0UGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlQXNjZW5kaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlTXVsdGlwbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlRmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQXJyYXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hdGNoRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVCeVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaWN0SW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nVG9QYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdW5pY29kZVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmVEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlZmF1bHRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9nZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXBWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWF4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbkJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3BpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaXF1ZUlkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC96aXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FueS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXBwZW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hc3NvY1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9iaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb21wYXJhdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29uY2F0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29udmVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZXF1YWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZXZvbHZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mb3JFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZm9yRWFjaE9iakluZGV4ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ncm91cEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5zZXJ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcml0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheUZyb21JdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jb21wbGVtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jcmVhdGVSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5Mi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnlOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kaXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZXF1YWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19mdW5jdGlvbk5hbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luY2x1ZGVzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0ludGVnZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNQbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1RyYW5zZm9ybWVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19tYWtlRmxhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbnRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19vYmplY3RJcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19wYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3F1b3RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19yZWR1Y2VkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3RvSVNPU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hBcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGFueS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZkJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3htYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHJlZHVjZUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h0YWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h1bmlxQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHdyYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnZva2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pc0VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNOaWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qb2luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvanV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2tleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGVuc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21hcE9iakluZGV4ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tYXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZW1vaXplV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlRGVlcFJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlTGVmdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGhLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vbWl0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb25jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL292ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXJ0aXRpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGF0aE9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpY2tCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BsdWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJlcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wRXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlZHVjZUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVtb3ZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NsaWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc29ydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3N0YXJ0c1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90YWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdG9QYWlycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmlxQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy92aWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwT2JqLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtYmFzZTE2LXN0eWxpbmcvbGliL2VzbS9jb2xvckNvbnZlcnRlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1iYXNlMTYtc3R5bGluZy9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL3R5cGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2RpZmYuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvanNvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9wYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0l0ZW1SYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJheU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OQXJyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OSXRlcmFibGVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk5lc3RlZE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05PYmplY3ROb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTlZhbHVlTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9nZXRDb2xsZWN0aW9uRW50cmllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vb2JqVHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL3RoZW1lcy9zb2xhcml6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL0NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL1Byb3ZpZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9jb25uZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9pbnZhbGlkQXJnRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21lcmdlUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvdmVyaWZ5U3Vic2VsZWN0b3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2V4cG9ydHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VEaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVJlZHV4Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlU3RvcmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3R5cGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvU3Vic2NyaXB0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9iaW5kQWN0aW9uQ3JlYXRvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3NoYWxsb3dFcXVhbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL2NyZWF0ZUFjdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzTnVsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zaW1wbGUtc3dpenpsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL25vZGVfbW9kdWxlcy9pcy1hcnJheWlzaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vd2l0aC1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FQSUNvbnRyb2xsZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BcHBDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BcHBQcm92aWRlci5yZWFjdC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9EYXNoUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9TdG9yZU9ic2VydmVyLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llc190cy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzQXBwUmVhZHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvbG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2gudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9wYXR0ZXJuTWF0Y2hpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3JlcXVlc3REZXBlbmRlbmNpZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3V0aWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY2hlY2tQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcz9kODEzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3M/NThlMiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhFZmZlY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Db21wb25lbnRFcnJvckJvdW5kYXJ5LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzcz9hOTAwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvUGVyY3kuY3NzP2FmMzgiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NoZWNrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb2NrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NvbGxhcHNlSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Vycm9ySWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0V4cGFuZC5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0dyYXBoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL09mZkljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5jc3M/NmQ1NCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8uY3NzP2RiMjIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8ucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL3dlcmt6ZXVnY3NzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uZmlnLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uc3RhbnRzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2Rhc2hBcGkudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9leGNlcHRpb25zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaXNTaW1wbGVDb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZG9jdW1lbnRUaXRsZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRpbmdDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3ByaW9yaXRpemVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9wZXJzaXN0ZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwcExpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrSm9icy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NoYW5nZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9kZXBlbmRlbmN5R3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9lcnJvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9ob29rcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9wYXRocy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3Byb2ZpbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9yZWR1Y2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9zdG9yZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9saWJyYXJpZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9zdG9yZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy93YWl0LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9DaGVja2VkQ29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvRGFzaENvbnRleHQudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9EYXNoV3JhcHBlci50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0V4dGVybmFsV3JhcHBlci50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL3NlbGVjdG9ycy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvd3JhcHBpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJQcm9wVHlwZXNcIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL2V4dGVybmFsIHdpbmRvdyBcIlJlYWN0XCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdERPTVwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxuZXhwb3J0IHsgX2FycmF5TGlrZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbmV4cG9ydCB7IF9hcnJheVdpdGhIb2xlcyBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIpO1xufVxuZXhwb3J0IHsgX2FycmF5V2l0aG91dEhvbGVzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpIHtcbiAgaWYgKHZvaWQgMCA9PT0gZSkgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICByZXR1cm4gZTtcbn1cbmV4cG9ydCB7IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhLCBuKSB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbn1cbmV4cG9ydCB7IF9jbGFzc0NhbGxDaGVjayBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbmV4cG9ydCB7IF9jcmVhdGVDbGFzcyBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbmV4cG9ydCB7IF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7XG4gICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHtcbiAgICAgIHZhciB0ID0gYXJndW1lbnRzW2VdO1xuICAgICAgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgeyBfZXh0ZW5kcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpIHtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7XG4gIH0sIF9nZXRQcm90b3R5cGVPZih0KTtcbn1cbmV4cG9ydCB7IF9nZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHModCwgZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlICYmIG51bGwgIT09IGUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHQsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgfVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGUgJiYgc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocikge1xuICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIG51bGwgIT0gcltTeW1ib2wuaXRlcmF0b3JdIHx8IG51bGwgIT0gcltcIkBAaXRlcmF0b3JcIl0pIHJldHVybiBBcnJheS5mcm9tKHIpO1xufVxuZXhwb3J0IHsgX2l0ZXJhYmxlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxuZXhwb3J0IHsgX2l0ZXJhYmxlVG9BcnJheUxpbWl0IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZXhwb3J0IHsgX25vbkl0ZXJhYmxlUmVzdCBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVNwcmVhZCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGRlZmluZVByb3BlcnR5IGZyb20gXCIuL2RlZmluZVByb3BlcnR5LmpzXCI7XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcbiAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuICBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuICAgIHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcbiAgICByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5leHBvcnQgeyBfb2JqZWN0U3ByZWFkMiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIi4vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qc1wiO1xuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGUsIHQpIHtcbiAgaWYgKG51bGwgPT0gZSkgcmV0dXJuIHt9O1xuICB2YXIgbyxcbiAgICByLFxuICAgIGkgPSBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKGUsIHQpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICBmb3IgKHIgPSAwOyByIDwgbi5sZW5ndGg7IHIrKykgbyA9IG5bcl0sIC0xID09PSB0LmluZGV4T2YobykgJiYge30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBvKSAmJiAoaVtvXSA9IGVbb10pO1xuICB9XG4gIHJldHVybiBpO1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShyLCBlKSB7XG4gIGlmIChudWxsID09IHIpIHJldHVybiB7fTtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiByKSBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSkge1xuICAgIGlmICgtMSAhPT0gZS5pbmRleE9mKG4pKSBjb250aW51ZTtcbiAgICB0W25dID0gcltuXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBlKSB7XG4gIGlmIChlICYmIChcIm9iamVjdFwiID09IF90eXBlb2YoZSkgfHwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlKSkgcmV0dXJuIGU7XG4gIGlmICh2b2lkIDAgIT09IGUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZCh0KTtcbn1cbmV4cG9ydCB7IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXlMaW1pdCBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5leHBvcnQgeyBfc2xpY2VkVG9BcnJheSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXkocikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbmV4cG9ydCB7IF90b0NvbnN1bWFibGVBcnJheSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZXhwb3J0IHsgdG9QcmltaXRpdmUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cbmV4cG9ydCB7IHRvUHJvcGVydHlLZXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIF90eXBlb2Yobyk7XG59XG5leHBvcnQgeyBfdHlwZW9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyLCBhKTtcbiAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpO1xuICAgIHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IGFycmF5TGlrZVRvQXJyYXkociwgYSkgOiB2b2lkIDA7XG4gIH1cbn1cbmV4cG9ydCB7IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwiIWZ1bmN0aW9uKGUsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sbik6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihyZXF1aXJlKFwicmVhY3RcIikpOmVbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4oZS5SZWFjdCl9KHdpbmRvdywoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXt9O2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHQubT1lLHQuYz1uLHQuZD1mdW5jdGlvbihlLG4scil7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLG4pe2lmKDEmbiYmKGU9dChlKSksOCZuKXJldHVybiBlO2lmKDQmbiYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHQucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZuJiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSl0LmQocixvLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfS5iaW5kKG51bGwsbykpO3JldHVybiByfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPVwiXCIsdCh0LnM9MSl9KFtmdW5jdGlvbihuLHQpe24uZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4sdCl7XCJ1c2Ugc3RyaWN0XCI7dC5yKG4pLHQuZChuLFwiYXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSx0LmQobixcImluaGVyaXRBc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLHQuZChuLFwiaXNSZWFkeVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLHQuZChuLFwiSGlzdG9yeVwiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPXQoMCk7ZnVuY3Rpb24gbyhlLG4sdCxyLG8saSx1KXt0cnl7dmFyIGE9ZVtpXSh1KSxjPWEudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdChlKX1hLmRvbmU/bihjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIHU9ZS5hcHBseShuLHQpO2Z1bmN0aW9uIGEoZSl7byh1LHIsaSxhLGMsXCJuZXh0XCIsZSl9ZnVuY3Rpb24gYyhlKXtvKHUscixpLGEsYyxcInRocm93XCIsZSl9YSh2b2lkIDApfSkpfX12YXIgdT1mdW5jdGlvbihlLG4pe3ZhciB0LG89e2lzUmVhZHk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKSxnZXQ6T2JqZWN0KHIubGF6eSkoKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuKCkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGkocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0KCEwKTtjYXNlIDI6by5pc1JlYWR5PSEwO2Nhc2UgMzpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpLDApLGV9KSl9KSl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5pc1JlYWR5fX0pLG8uZ2V0fSxhPWZ1bmN0aW9uKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMobil9fSl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5fTtmdW5jdGlvbiBmKGUsbil7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgcz1cIl9kYXNocHJpdmF0ZV9oaXN0b3J5Y2hhbmdlXCIsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSxuKXtpZighKGUgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLGUpfXZhciBuLHQscjtyZXR1cm4gbj1lLHI9W3trZXk6XCJkaXNwYXRjaENoYW5nZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocykpfX0se2tleTpcIm9uQ2hhbmdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsZSksZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocyxlKX19fV0sKHQ9bnVsbCkmJmYobi5wcm90b3R5cGUsdCksciYmZihuLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwicHJvdG90eXBlXCIse3dyaXRhYmxlOiExfSksZX0oKX1dKX0pKTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2FwYXRoeScsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMDMxQTE2JyxcbiAgYmFzZTAxOiAnIzBCMzQyRCcsXG4gIGJhc2UwMjogJyMxODRFNDUnLFxuICBiYXNlMDM6ICcjMkI2ODVFJyxcbiAgYmFzZTA0OiAnIzVGOUM5MicsXG4gIGJhc2UwNTogJyM4MUI1QUMnLFxuICBiYXNlMDY6ICcjQTdDRUM4JyxcbiAgYmFzZTA3OiAnI0QyRTdFNCcsXG4gIGJhc2UwODogJyMzRTk2ODgnLFxuICBiYXNlMDk6ICcjM0U3OTk2JyxcbiAgYmFzZTBBOiAnIzNFNEM5NicsXG4gIGJhc2UwQjogJyM4ODNFOTYnLFxuICBiYXNlMEM6ICcjOTYzRTRDJyxcbiAgYmFzZTBEOiAnIzk2ODgzRScsXG4gIGJhc2UwRTogJyM0Qzk2M0UnLFxuICBiYXNlMEY6ICcjM0U5NjVCJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXNoZXMnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzFDMjAyMycsXG4gIGJhc2UwMTogJyMzOTNGNDUnLFxuICBiYXNlMDI6ICcjNTY1RTY1JyxcbiAgYmFzZTAzOiAnIzc0N0M4NCcsXG4gIGJhc2UwNDogJyNBREIzQkEnLFxuICBiYXNlMDU6ICcjQzdDQ0QxJyxcbiAgYmFzZTA2OiAnI0RGRTJFNScsXG4gIGJhc2UwNzogJyNGM0Y0RjUnLFxuICBiYXNlMDg6ICcjQzdBRTk1JyxcbiAgYmFzZTA5OiAnI0M3Qzc5NScsXG4gIGJhc2UwQTogJyNBRUM3OTUnLFxuICBiYXNlMEI6ICcjOTVDN0FFJyxcbiAgYmFzZTBDOiAnIzk1QUVDNycsXG4gIGJhc2UwRDogJyNBRTk1QzcnLFxuICBiYXNlMEU6ICcjQzc5NUFFJyxcbiAgYmFzZTBGOiAnI0M3OTU5NSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgZHVuZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9kdW5lKScsXG4gIGJhc2UwMDogJyMyMDIwMWQnLFxuICBiYXNlMDE6ICcjMjkyODI0JyxcbiAgYmFzZTAyOiAnIzZlNmI1ZScsXG4gIGJhc2UwMzogJyM3ZDdhNjgnLFxuICBiYXNlMDQ6ICcjOTk5NTgwJyxcbiAgYmFzZTA1OiAnI2E2YTI4YycsXG4gIGJhc2UwNjogJyNlOGU0Y2YnLFxuICBiYXNlMDc6ICcjZmVmYmVjJyxcbiAgYmFzZTA4OiAnI2Q3MzczNycsXG4gIGJhc2UwOTogJyNiNjU2MTEnLFxuICBiYXNlMEE6ICcjY2ZiMDE3JyxcbiAgYmFzZTBCOiAnIzYwYWMzOScsXG4gIGJhc2UwQzogJyMxZmFkODMnLFxuICBiYXNlMEQ6ICcjNjY4NGUxJyxcbiAgYmFzZTBFOiAnI2I4NTRkNCcsXG4gIGJhc2UwRjogJyNkNDM1NTInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGZvcmVzdCcsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9mb3Jlc3QpJyxcbiAgYmFzZTAwOiAnIzFiMTkxOCcsXG4gIGJhc2UwMTogJyMyYzI0MjEnLFxuICBiYXNlMDI6ICcjNjg2MTVlJyxcbiAgYmFzZTAzOiAnIzc2NmU2YicsXG4gIGJhc2UwNDogJyM5Yzk0OTEnLFxuICBiYXNlMDU6ICcjYThhMTlmJyxcbiAgYmFzZTA2OiAnI2U2ZTJlMCcsXG4gIGJhc2UwNzogJyNmMWVmZWUnLFxuICBiYXNlMDg6ICcjZjIyYzQwJyxcbiAgYmFzZTA5OiAnI2RmNTMyMCcsXG4gIGJhc2UwQTogJyNkNTkxMWEnLFxuICBiYXNlMEI6ICcjNWFiNzM4JyxcbiAgYmFzZTBDOiAnIzAwYWQ5YycsXG4gIGJhc2UwRDogJyM0MDdlZTcnLFxuICBiYXNlMEU6ICcjNjY2NmVhJyxcbiAgYmFzZTBGOiAnI2MzM2ZmMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgaGVhdGgnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvaGVhdGgpJyxcbiAgYmFzZTAwOiAnIzFiMTgxYicsXG4gIGJhc2UwMTogJyMyOTIzMjknLFxuICBiYXNlMDI6ICcjNjk1ZDY5JyxcbiAgYmFzZTAzOiAnIzc3Njk3NycsXG4gIGJhc2UwNDogJyM5ZThmOWUnLFxuICBiYXNlMDU6ICcjYWI5YmFiJyxcbiAgYmFzZTA2OiAnI2Q4Y2FkOCcsXG4gIGJhc2UwNzogJyNmN2YzZjcnLFxuICBiYXNlMDg6ICcjY2E0MDJiJyxcbiAgYmFzZTA5OiAnI2E2NTkyNicsXG4gIGJhc2UwQTogJyNiYjhhMzUnLFxuICBiYXNlMEI6ICcjMzc5YTM3JyxcbiAgYmFzZTBDOiAnIzE1OTM5MycsXG4gIGJhc2UwRDogJyM1MTZhZWMnLFxuICBiYXNlMEU6ICcjN2I1OWMwJyxcbiAgYmFzZTBGOiAnI2NjMzNjYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgbGFrZXNpZGUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvbGFrZXNpZGUvKScsXG4gIGJhc2UwMDogJyMxNjFiMWQnLFxuICBiYXNlMDE6ICcjMWYyOTJlJyxcbiAgYmFzZTAyOiAnIzUxNmQ3YicsXG4gIGJhc2UwMzogJyM1YTdiOGMnLFxuICBiYXNlMDQ6ICcjNzE5NWE4JyxcbiAgYmFzZTA1OiAnIzdlYTJiNCcsXG4gIGJhc2UwNjogJyNjMWU0ZjYnLFxuICBiYXNlMDc6ICcjZWJmOGZmJyxcbiAgYmFzZTA4OiAnI2QyMmQ3MicsXG4gIGJhc2UwOTogJyM5MzVjMjUnLFxuICBiYXNlMEE6ICcjOGE4YTBmJyxcbiAgYmFzZTBCOiAnIzU2OGMzYicsXG4gIGJhc2UwQzogJyMyZDhmNmYnLFxuICBiYXNlMEQ6ICcjMjU3ZmFkJyxcbiAgYmFzZTBFOiAnIzVkNWRiMScsXG4gIGJhc2UwRjogJyNiNzJkZDInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIHNlYXNpZGUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvc2Vhc2lkZS8pJyxcbiAgYmFzZTAwOiAnIzEzMTUxMycsXG4gIGJhc2UwMTogJyMyNDI5MjQnLFxuICBiYXNlMDI6ICcjNWU2ZTVlJyxcbiAgYmFzZTAzOiAnIzY4N2Q2OCcsXG4gIGJhc2UwNDogJyM4MDk5ODAnLFxuICBiYXNlMDU6ICcjOGNhNjhjJyxcbiAgYmFzZTA2OiAnI2NmZThjZicsXG4gIGJhc2UwNzogJyNmMGZmZjAnLFxuICBiYXNlMDg6ICcjZTYxOTNjJyxcbiAgYmFzZTA5OiAnIzg3NzExZCcsXG4gIGJhc2UwQTogJyNjM2MzMjInLFxuICBiYXNlMEI6ICcjMjlhMzI5JyxcbiAgYmFzZTBDOiAnIzE5OTliMycsXG4gIGJhc2UwRDogJyMzZDYyZjUnLFxuICBiYXNlMEU6ICcjYWQyYmVlJyxcbiAgYmFzZTBGOiAnI2U2MTljMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2Jlc3BpbicsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzI4MjExYycsXG4gIGJhc2UwMTogJyMzNjMxMmUnLFxuICBiYXNlMDI6ICcjNWU1ZDVjJyxcbiAgYmFzZTAzOiAnIzY2NjY2NicsXG4gIGJhc2UwNDogJyM3OTc5NzcnLFxuICBiYXNlMDU6ICcjOGE4OTg2JyxcbiAgYmFzZTA2OiAnIzlkOWI5NycsXG4gIGJhc2UwNzogJyNiYWFlOWUnLFxuICBiYXNlMDg6ICcjY2Y2YTRjJyxcbiAgYmFzZTA5OiAnI2NmN2QzNCcsXG4gIGJhc2UwQTogJyNmOWVlOTgnLFxuICBiYXNlMEI6ICcjNTRiZTBkJyxcbiAgYmFzZTBDOiAnI2FmYzRkYicsXG4gIGJhc2UwRDogJyM1ZWE2ZWEnLFxuICBiYXNlMEU6ICcjOWI4NTlkJyxcbiAgYmFzZTBGOiAnIzkzNzEyMSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2JyZXdlcicsXG4gIGF1dGhvcjogJ3RpbW90aMOpZSBwb2lzb3QgKGh0dHA6Ly9naXRodWIuY29tL3Rwb2lzb3QpJyxcbiAgYmFzZTAwOiAnIzBjMGQwZScsXG4gIGJhc2UwMTogJyMyZTJmMzAnLFxuICBiYXNlMDI6ICcjNTE1MjUzJyxcbiAgYmFzZTAzOiAnIzczNzQ3NScsXG4gIGJhc2UwNDogJyM5NTk2OTcnLFxuICBiYXNlMDU6ICcjYjdiOGI5JyxcbiAgYmFzZTA2OiAnI2RhZGJkYycsXG4gIGJhc2UwNzogJyNmY2ZkZmUnLFxuICBiYXNlMDg6ICcjZTMxYTFjJyxcbiAgYmFzZTA5OiAnI2U2NTUwZCcsXG4gIGJhc2UwQTogJyNkY2EwNjAnLFxuICBiYXNlMEI6ICcjMzFhMzU0JyxcbiAgYmFzZTBDOiAnIzgwYjFkMycsXG4gIGJhc2UwRDogJyMzMTgyYmQnLFxuICBiYXNlMEU6ICcjNzU2YmIxJyxcbiAgYmFzZTBGOiAnI2IxNTkyOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2JyaWdodCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMzAzMDMwJyxcbiAgYmFzZTAyOiAnIzUwNTA1MCcsXG4gIGJhc2UwMzogJyNiMGIwYjAnLFxuICBiYXNlMDQ6ICcjZDBkMGQwJyxcbiAgYmFzZTA1OiAnI2UwZTBlMCcsXG4gIGJhc2UwNjogJyNmNWY1ZjUnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZiMDEyMCcsXG4gIGJhc2UwOTogJyNmYzZkMjQnLFxuICBiYXNlMEE6ICcjZmRhMzMxJyxcbiAgYmFzZTBCOiAnI2ExYzY1OScsXG4gIGJhc2UwQzogJyM3NmM3YjcnLFxuICBiYXNlMEQ6ICcjNmZiM2QyJyxcbiAgYmFzZTBFOiAnI2QzODFjMycsXG4gIGJhc2UwRjogJyNiZTY0M2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjaGFsaycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxNTE1MTUnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjYjBiMGIwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZjVmNWY1JyxcbiAgYmFzZTA4OiAnI2ZiOWZiMScsXG4gIGJhc2UwOTogJyNlZGE5ODcnLFxuICBiYXNlMEE6ICcjZGRiMjZmJyxcbiAgYmFzZTBCOiAnI2FjYzI2NycsXG4gIGJhc2UwQzogJyMxMmNmYzAnLFxuICBiYXNlMEQ6ICcjNmZjMmVmJyxcbiAgYmFzZTBFOiAnI2UxYTNlZScsXG4gIGJhc2UwRjogJyNkZWFmOGYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjb2Rlc2Nob29sJyxcbiAgYXV0aG9yOiAnYnJldHRvZjg2JyxcbiAgYmFzZTAwOiAnIzIzMmMzMScsXG4gIGJhc2UwMTogJyMxYzM2NTcnLFxuICBiYXNlMDI6ICcjMmEzNDNhJyxcbiAgYmFzZTAzOiAnIzNmNDk0NCcsXG4gIGJhc2UwNDogJyM4NDg5OGMnLFxuICBiYXNlMDU6ICcjOWVhN2E2JyxcbiAgYmFzZTA2OiAnI2E3Y2ZhMycsXG4gIGJhc2UwNzogJyNiNWQ4ZjYnLFxuICBiYXNlMDg6ICcjMmE1NDkxJyxcbiAgYmFzZTA5OiAnIzQzODIwZCcsXG4gIGJhc2UwQTogJyNhMDNiMWUnLFxuICBiYXNlMEI6ICcjMjM3OTg2JyxcbiAgYmFzZTBDOiAnI2IwMmYzMCcsXG4gIGJhc2UwRDogJyM0ODRkNzknLFxuICBiYXNlMEU6ICcjYzU5ODIwJyxcbiAgYmFzZTBGOiAnI2M5ODM0NCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NvbG9ycycsXG4gIGF1dGhvcjogJ21ybXJzIChodHRwOi8vY2xycy5jYyknLFxuICBiYXNlMDA6ICcjMTExMTExJyxcbiAgYmFzZTAxOiAnIzMzMzMzMycsXG4gIGJhc2UwMjogJyM1NTU1NTUnLFxuICBiYXNlMDM6ICcjNzc3Nzc3JyxcbiAgYmFzZTA0OiAnIzk5OTk5OScsXG4gIGJhc2UwNTogJyNiYmJiYmInLFxuICBiYXNlMDY6ICcjZGRkZGRkJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmZjQxMzYnLFxuICBiYXNlMDk6ICcjZmY4NTFiJyxcbiAgYmFzZTBBOiAnI2ZmZGMwMCcsXG4gIGJhc2UwQjogJyMyZWNjNDAnLFxuICBiYXNlMEM6ICcjN2ZkYmZmJyxcbiAgYmFzZTBEOiAnIzAwNzRkOScsXG4gIGJhc2UwRTogJyNiMTBkYzknLFxuICBiYXNlMEY6ICcjODUxNDRiJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZGVmYXVsdCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxODE4MTgnLFxuICBiYXNlMDE6ICcjMjgyODI4JyxcbiAgYmFzZTAyOiAnIzM4MzgzOCcsXG4gIGJhc2UwMzogJyM1ODU4NTgnLFxuICBiYXNlMDQ6ICcjYjhiOGI4JyxcbiAgYmFzZTA1OiAnI2Q4ZDhkOCcsXG4gIGJhc2UwNjogJyNlOGU4ZTgnLFxuICBiYXNlMDc6ICcjZjhmOGY4JyxcbiAgYmFzZTA4OiAnI2FiNDY0MicsXG4gIGJhc2UwOTogJyNkYzk2NTYnLFxuICBiYXNlMEE6ICcjZjdjYTg4JyxcbiAgYmFzZTBCOiAnI2ExYjU2YycsXG4gIGJhc2UwQzogJyM4NmMxYjknLFxuICBiYXNlMEQ6ICcjN2NhZmMyJyxcbiAgYmFzZTBFOiAnI2JhOGJhZicsXG4gIGJhc2UwRjogJyNhMTY5NDYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdlaWdodGllcycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyZDJkMmQnLFxuICBiYXNlMDE6ICcjMzkzOTM5JyxcbiAgYmFzZTAyOiAnIzUxNTE1MScsXG4gIGJhc2UwMzogJyM3NDczNjknLFxuICBiYXNlMDQ6ICcjYTA5ZjkzJyxcbiAgYmFzZTA1OiAnI2QzZDBjOCcsXG4gIGJhc2UwNjogJyNlOGU2ZGYnLFxuICBiYXNlMDc6ICcjZjJmMGVjJyxcbiAgYmFzZTA4OiAnI2YyNzc3YScsXG4gIGJhc2UwOTogJyNmOTkxNTcnLFxuICBiYXNlMEE6ICcjZmZjYzY2JyxcbiAgYmFzZTBCOiAnIzk5Y2M5OScsXG4gIGJhc2UwQzogJyM2NmNjY2MnLFxuICBiYXNlMEQ6ICcjNjY5OWNjJyxcbiAgYmFzZTBFOiAnI2NjOTljYycsXG4gIGJhc2UwRjogJyNkMjdiNTMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdlbWJlcnMnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzE2MTMwRicsXG4gIGJhc2UwMTogJyMyQzI2MjAnLFxuICBiYXNlMDI6ICcjNDMzQjMyJyxcbiAgYmFzZTAzOiAnIzVBNTA0NycsXG4gIGJhc2UwNDogJyM4QTgwNzUnLFxuICBiYXNlMDU6ICcjQTM5QTkwJyxcbiAgYmFzZTA2OiAnI0JFQjZBRScsXG4gIGJhc2UwNzogJyNEQkQ2RDEnLFxuICBiYXNlMDg6ICcjODI2RDU3JyxcbiAgYmFzZTA5OiAnIzgyODI1NycsXG4gIGJhc2UwQTogJyM2RDgyNTcnLFxuICBiYXNlMEI6ICcjNTc4MjZEJyxcbiAgYmFzZTBDOiAnIzU3NkQ4MicsXG4gIGJhc2UwRDogJyM2RDU3ODInLFxuICBiYXNlMEU6ICcjODI1NzZEJyxcbiAgYmFzZTBGOiAnIzgyNTc1Nydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2ZsYXQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMkMzRTUwJyxcbiAgYmFzZTAxOiAnIzM0NDk1RScsXG4gIGJhc2UwMjogJyM3RjhDOEQnLFxuICBiYXNlMDM6ICcjOTVBNUE2JyxcbiAgYmFzZTA0OiAnI0JEQzNDNycsXG4gIGJhc2UwNTogJyNlMGUwZTAnLFxuICBiYXNlMDY6ICcjZjVmNWY1JyxcbiAgYmFzZTA3OiAnI0VDRjBGMScsXG4gIGJhc2UwODogJyNFNzRDM0MnLFxuICBiYXNlMDk6ICcjRTY3RTIyJyxcbiAgYmFzZTBBOiAnI0YxQzQwRicsXG4gIGJhc2UwQjogJyMyRUNDNzEnLFxuICBiYXNlMEM6ICcjMUFCQzlDJyxcbiAgYmFzZTBEOiAnIzM0OThEQicsXG4gIGJhc2UwRTogJyM5QjU5QjYnLFxuICBiYXNlMEY6ICcjYmU2NDNjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ29vZ2xlJyxcbiAgYXV0aG9yOiAnc2V0aCB3cmlnaHQgKGh0dHA6Ly9zZXRoYXdyaWdodC5jb20pJyxcbiAgYmFzZTAwOiAnIzFkMWYyMScsXG4gIGJhc2UwMTogJyMyODJhMmUnLFxuICBiYXNlMDI6ICcjMzczYjQxJyxcbiAgYmFzZTAzOiAnIzk2OTg5NicsXG4gIGJhc2UwNDogJyNiNGI3YjQnLFxuICBiYXNlMDU6ICcjYzVjOGM2JyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjQ0MzNDJCJyxcbiAgYmFzZTA5OiAnI0Y5NkEzOCcsXG4gIGJhc2UwQTogJyNGQkE5MjInLFxuICBiYXNlMEI6ICcjMTk4ODQ0JyxcbiAgYmFzZTBDOiAnIzM5NzFFRCcsXG4gIGJhc2UwRDogJyMzOTcxRUQnLFxuICBiYXNlMEU6ICcjQTM2QUM3JyxcbiAgYmFzZTBGOiAnIzM5NzFFRCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dyYXlzY2FsZScsXG4gIGF1dGhvcjogJ2FsZXhhbmRyZSBnYXZpb2xpIChodHRwczovL2dpdGh1Yi5jb20vYWxleHgyLyknLFxuICBiYXNlMDA6ICcjMTAxMDEwJyxcbiAgYmFzZTAxOiAnIzI1MjUyNScsXG4gIGJhc2UwMjogJyM0NjQ2NDYnLFxuICBiYXNlMDM6ICcjNTI1MjUyJyxcbiAgYmFzZTA0OiAnI2FiYWJhYicsXG4gIGJhc2UwNTogJyNiOWI5YjknLFxuICBiYXNlMDY6ICcjZTNlM2UzJyxcbiAgYmFzZTA3OiAnI2Y3ZjdmNycsXG4gIGJhc2UwODogJyM3YzdjN2MnLFxuICBiYXNlMDk6ICcjOTk5OTk5JyxcbiAgYmFzZTBBOiAnI2EwYTBhMCcsXG4gIGJhc2UwQjogJyM4ZThlOGUnLFxuICBiYXNlMEM6ICcjODY4Njg2JyxcbiAgYmFzZTBEOiAnIzY4Njg2OCcsXG4gIGJhc2UwRTogJyM3NDc0NzQnLFxuICBiYXNlMEY6ICcjNWU1ZTVlJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ3JlZW4gc2NyZWVuJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMTEwMCcsXG4gIGJhc2UwMTogJyMwMDMzMDAnLFxuICBiYXNlMDI6ICcjMDA1NTAwJyxcbiAgYmFzZTAzOiAnIzAwNzcwMCcsXG4gIGJhc2UwNDogJyMwMDk5MDAnLFxuICBiYXNlMDU6ICcjMDBiYjAwJyxcbiAgYmFzZTA2OiAnIzAwZGQwMCcsXG4gIGJhc2UwNzogJyMwMGZmMDAnLFxuICBiYXNlMDg6ICcjMDA3NzAwJyxcbiAgYmFzZTA5OiAnIzAwOTkwMCcsXG4gIGJhc2UwQTogJyMwMDc3MDAnLFxuICBiYXNlMEI6ICcjMDBiYjAwJyxcbiAgYmFzZTBDOiAnIzAwNTUwMCcsXG4gIGJhc2UwRDogJyMwMDk5MDAnLFxuICBiYXNlMEU6ICcjMDBiYjAwJyxcbiAgYmFzZTBGOiAnIzAwNTUwMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2hhcm1vbmljMTYnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzBiMWMyYycsXG4gIGJhc2UwMTogJyMyMjNiNTQnLFxuICBiYXNlMDI6ICcjNDA1Yzc5JyxcbiAgYmFzZTAzOiAnIzYyN2U5OScsXG4gIGJhc2UwNDogJyNhYWJjY2UnLFxuICBiYXNlMDU6ICcjY2JkNmUyJyxcbiAgYmFzZTA2OiAnI2U1ZWJmMScsXG4gIGJhc2UwNzogJyNmN2Y5ZmInLFxuICBiYXNlMDg6ICcjYmY4YjU2JyxcbiAgYmFzZTA5OiAnI2JmYmY1NicsXG4gIGJhc2UwQTogJyM4YmJmNTYnLFxuICBiYXNlMEI6ICcjNTZiZjhiJyxcbiAgYmFzZTBDOiAnIzU2OGJiZicsXG4gIGJhc2UwRDogJyM4YjU2YmYnLFxuICBiYXNlMEU6ICcjYmY1NjhiJyxcbiAgYmFzZTBGOiAnI2JmNTY1Nidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2hvcHNjb3RjaCcsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzMyMjkzMScsXG4gIGJhc2UwMTogJyM0MzNiNDInLFxuICBiYXNlMDI6ICcjNWM1NDViJyxcbiAgYmFzZTAzOiAnIzc5NzM3OScsXG4gIGJhc2UwNDogJyM5ODk0OTgnLFxuICBiYXNlMDU6ICcjYjliNWI4JyxcbiAgYmFzZTA2OiAnI2Q1ZDNkNScsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZGQ0NjRjJyxcbiAgYmFzZTA5OiAnI2ZkOGIxOScsXG4gIGJhc2UwQTogJyNmZGNjNTknLFxuICBiYXNlMEI6ICcjOGZjMTNlJyxcbiAgYmFzZTBDOiAnIzE0OWI5MycsXG4gIGJhc2UwRDogJyMxMjkwYmYnLFxuICBiYXNlMEU6ICcjYzg1ZTdjJyxcbiAgYmFzZTBGOiAnI2IzMzUwOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZShvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialsnZGVmYXVsdCddIDogb2JqOyB9XG5cbnZhciBfdGhyZWV6ZXJvdHdvZm91ciA9IHJlcXVpcmUoJy4vdGhyZWV6ZXJvdHdvZm91cicpO1xuXG5leHBvcnRzLnRocmVlemVyb3R3b2ZvdXIgPSBfaW50ZXJvcFJlcXVpcmUoX3RocmVlemVyb3R3b2ZvdXIpO1xuXG52YXIgX2FwYXRoeSA9IHJlcXVpcmUoJy4vYXBhdGh5Jyk7XG5cbmV4cG9ydHMuYXBhdGh5ID0gX2ludGVyb3BSZXF1aXJlKF9hcGF0aHkpO1xuXG52YXIgX2FzaGVzID0gcmVxdWlyZSgnLi9hc2hlcycpO1xuXG5leHBvcnRzLmFzaGVzID0gX2ludGVyb3BSZXF1aXJlKF9hc2hlcyk7XG5cbnZhciBfYXRlbGllckR1bmUgPSByZXF1aXJlKCcuL2F0ZWxpZXItZHVuZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJEdW5lID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyRHVuZSk7XG5cbnZhciBfYXRlbGllckZvcmVzdCA9IHJlcXVpcmUoJy4vYXRlbGllci1mb3Jlc3QnKTtcblxuZXhwb3J0cy5hdGVsaWVyRm9yZXN0ID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyRm9yZXN0KTtcblxudmFyIF9hdGVsaWVySGVhdGggPSByZXF1aXJlKCcuL2F0ZWxpZXItaGVhdGgnKTtcblxuZXhwb3J0cy5hdGVsaWVySGVhdGggPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJIZWF0aCk7XG5cbnZhciBfYXRlbGllckxha2VzaWRlID0gcmVxdWlyZSgnLi9hdGVsaWVyLWxha2VzaWRlJyk7XG5cbmV4cG9ydHMuYXRlbGllckxha2VzaWRlID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyTGFrZXNpZGUpO1xuXG52YXIgX2F0ZWxpZXJTZWFzaWRlID0gcmVxdWlyZSgnLi9hdGVsaWVyLXNlYXNpZGUnKTtcblxuZXhwb3J0cy5hdGVsaWVyU2Vhc2lkZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllclNlYXNpZGUpO1xuXG52YXIgX2Jlc3BpbiA9IHJlcXVpcmUoJy4vYmVzcGluJyk7XG5cbmV4cG9ydHMuYmVzcGluID0gX2ludGVyb3BSZXF1aXJlKF9iZXNwaW4pO1xuXG52YXIgX2JyZXdlciA9IHJlcXVpcmUoJy4vYnJld2VyJyk7XG5cbmV4cG9ydHMuYnJld2VyID0gX2ludGVyb3BSZXF1aXJlKF9icmV3ZXIpO1xuXG52YXIgX2JyaWdodCA9IHJlcXVpcmUoJy4vYnJpZ2h0Jyk7XG5cbmV4cG9ydHMuYnJpZ2h0ID0gX2ludGVyb3BSZXF1aXJlKF9icmlnaHQpO1xuXG52YXIgX2NoYWxrID0gcmVxdWlyZSgnLi9jaGFsaycpO1xuXG5leHBvcnRzLmNoYWxrID0gX2ludGVyb3BSZXF1aXJlKF9jaGFsayk7XG5cbnZhciBfY29kZXNjaG9vbCA9IHJlcXVpcmUoJy4vY29kZXNjaG9vbCcpO1xuXG5leHBvcnRzLmNvZGVzY2hvb2wgPSBfaW50ZXJvcFJlcXVpcmUoX2NvZGVzY2hvb2wpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoJy4vY29sb3JzJyk7XG5cbmV4cG9ydHMuY29sb3JzID0gX2ludGVyb3BSZXF1aXJlKF9jb2xvcnMpO1xuXG52YXIgX2RlZmF1bHQgPSByZXF1aXJlKCcuL2RlZmF1bHQnKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gX2ludGVyb3BSZXF1aXJlKF9kZWZhdWx0KTtcblxudmFyIF9laWdodGllcyA9IHJlcXVpcmUoJy4vZWlnaHRpZXMnKTtcblxuZXhwb3J0cy5laWdodGllcyA9IF9pbnRlcm9wUmVxdWlyZShfZWlnaHRpZXMpO1xuXG52YXIgX2VtYmVycyA9IHJlcXVpcmUoJy4vZW1iZXJzJyk7XG5cbmV4cG9ydHMuZW1iZXJzID0gX2ludGVyb3BSZXF1aXJlKF9lbWJlcnMpO1xuXG52YXIgX2ZsYXQgPSByZXF1aXJlKCcuL2ZsYXQnKTtcblxuZXhwb3J0cy5mbGF0ID0gX2ludGVyb3BSZXF1aXJlKF9mbGF0KTtcblxudmFyIF9nb29nbGUgPSByZXF1aXJlKCcuL2dvb2dsZScpO1xuXG5leHBvcnRzLmdvb2dsZSA9IF9pbnRlcm9wUmVxdWlyZShfZ29vZ2xlKTtcblxudmFyIF9ncmF5c2NhbGUgPSByZXF1aXJlKCcuL2dyYXlzY2FsZScpO1xuXG5leHBvcnRzLmdyYXlzY2FsZSA9IF9pbnRlcm9wUmVxdWlyZShfZ3JheXNjYWxlKTtcblxudmFyIF9ncmVlbnNjcmVlbiA9IHJlcXVpcmUoJy4vZ3JlZW5zY3JlZW4nKTtcblxuZXhwb3J0cy5ncmVlbnNjcmVlbiA9IF9pbnRlcm9wUmVxdWlyZShfZ3JlZW5zY3JlZW4pO1xuXG52YXIgX2hhcm1vbmljID0gcmVxdWlyZSgnLi9oYXJtb25pYycpO1xuXG5leHBvcnRzLmhhcm1vbmljID0gX2ludGVyb3BSZXF1aXJlKF9oYXJtb25pYyk7XG5cbnZhciBfaG9wc2NvdGNoID0gcmVxdWlyZSgnLi9ob3BzY290Y2gnKTtcblxuZXhwb3J0cy5ob3BzY290Y2ggPSBfaW50ZXJvcFJlcXVpcmUoX2hvcHNjb3RjaCk7XG5cbnZhciBfaXNvdG9wZSA9IHJlcXVpcmUoJy4vaXNvdG9wZScpO1xuXG5leHBvcnRzLmlzb3RvcGUgPSBfaW50ZXJvcFJlcXVpcmUoX2lzb3RvcGUpO1xuXG52YXIgX21hcnJha2VzaCA9IHJlcXVpcmUoJy4vbWFycmFrZXNoJyk7XG5cbmV4cG9ydHMubWFycmFrZXNoID0gX2ludGVyb3BSZXF1aXJlKF9tYXJyYWtlc2gpO1xuXG52YXIgX21vY2hhID0gcmVxdWlyZSgnLi9tb2NoYScpO1xuXG5leHBvcnRzLm1vY2hhID0gX2ludGVyb3BSZXF1aXJlKF9tb2NoYSk7XG5cbnZhciBfbW9ub2thaSA9IHJlcXVpcmUoJy4vbW9ub2thaScpO1xuXG5leHBvcnRzLm1vbm9rYWkgPSBfaW50ZXJvcFJlcXVpcmUoX21vbm9rYWkpO1xuXG52YXIgX29jZWFuID0gcmVxdWlyZSgnLi9vY2VhbicpO1xuXG5leHBvcnRzLm9jZWFuID0gX2ludGVyb3BSZXF1aXJlKF9vY2Vhbik7XG5cbnZhciBfcGFyYWlzbyA9IHJlcXVpcmUoJy4vcGFyYWlzbycpO1xuXG5leHBvcnRzLnBhcmFpc28gPSBfaW50ZXJvcFJlcXVpcmUoX3BhcmFpc28pO1xuXG52YXIgX3BvcCA9IHJlcXVpcmUoJy4vcG9wJyk7XG5cbmV4cG9ydHMucG9wID0gX2ludGVyb3BSZXF1aXJlKF9wb3ApO1xuXG52YXIgX3JhaWxzY2FzdHMgPSByZXF1aXJlKCcuL3JhaWxzY2FzdHMnKTtcblxuZXhwb3J0cy5yYWlsc2Nhc3RzID0gX2ludGVyb3BSZXF1aXJlKF9yYWlsc2Nhc3RzKTtcblxudmFyIF9zaGFwZXNoaWZ0ZXIgPSByZXF1aXJlKCcuL3NoYXBlc2hpZnRlcicpO1xuXG5leHBvcnRzLnNoYXBlc2hpZnRlciA9IF9pbnRlcm9wUmVxdWlyZShfc2hhcGVzaGlmdGVyKTtcblxudmFyIF9zb2xhcml6ZWQgPSByZXF1aXJlKCcuL3NvbGFyaXplZCcpO1xuXG5leHBvcnRzLnNvbGFyaXplZCA9IF9pbnRlcm9wUmVxdWlyZShfc29sYXJpemVkKTtcblxudmFyIF9zdW1tZXJmcnVpdCA9IHJlcXVpcmUoJy4vc3VtbWVyZnJ1aXQnKTtcblxuZXhwb3J0cy5zdW1tZXJmcnVpdCA9IF9pbnRlcm9wUmVxdWlyZShfc3VtbWVyZnJ1aXQpO1xuXG52YXIgX3RvbW9ycm93ID0gcmVxdWlyZSgnLi90b21vcnJvdycpO1xuXG5leHBvcnRzLnRvbW9ycm93ID0gX2ludGVyb3BSZXF1aXJlKF90b21vcnJvdyk7XG5cbnZhciBfdHViZSA9IHJlcXVpcmUoJy4vdHViZScpO1xuXG5leHBvcnRzLnR1YmUgPSBfaW50ZXJvcFJlcXVpcmUoX3R1YmUpO1xuXG52YXIgX3R3aWxpZ2h0ID0gcmVxdWlyZSgnLi90d2lsaWdodCcpO1xuXG5leHBvcnRzLnR3aWxpZ2h0ID0gX2ludGVyb3BSZXF1aXJlKF90d2lsaWdodCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdpc290b3BlJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzQwNDA0MCcsXG4gIGJhc2UwMjogJyM2MDYwNjAnLFxuICBiYXNlMDM6ICcjODA4MDgwJyxcbiAgYmFzZTA0OiAnI2MwYzBjMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmZjAwMDAnLFxuICBiYXNlMDk6ICcjZmY5OTAwJyxcbiAgYmFzZTBBOiAnI2ZmMDA5OScsXG4gIGJhc2UwQjogJyMzM2ZmMDAnLFxuICBiYXNlMEM6ICcjMDBmZmZmJyxcbiAgYmFzZTBEOiAnIzAwNjZmZicsXG4gIGJhc2UwRTogJyNjYzAwZmYnLFxuICBiYXNlMEY6ICcjMzMwMGZmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbWFycmFrZXNoJyxcbiAgYXV0aG9yOiAnYWxleGFuZHJlIGdhdmlvbGkgKGh0dHA6Ly9naXRodWIuY29tL2FsZXh4Mi8pJyxcbiAgYmFzZTAwOiAnIzIwMTYwMicsXG4gIGJhc2UwMTogJyMzMDJlMDAnLFxuICBiYXNlMDI6ICcjNWY1YjE3JyxcbiAgYmFzZTAzOiAnIzZjNjgyMycsXG4gIGJhc2UwNDogJyM4NjgxM2InLFxuICBiYXNlMDU6ICcjOTQ4ZTQ4JyxcbiAgYmFzZTA2OiAnI2NjYzM3YScsXG4gIGJhc2UwNzogJyNmYWYwYTUnLFxuICBiYXNlMDg6ICcjYzM1MzU5JyxcbiAgYmFzZTA5OiAnI2IzNjE0NCcsXG4gIGJhc2UwQTogJyNhODgzMzknLFxuICBiYXNlMEI6ICcjMTg5NzRlJyxcbiAgYmFzZTBDOiAnIzc1YTczOCcsXG4gIGJhc2UwRDogJyM0NzdjYTEnLFxuICBiYXNlMEU6ICcjODg2OGIzJyxcbiAgYmFzZTBGOiAnI2IzNTg4ZSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21vY2hhJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzNCMzIyOCcsXG4gIGJhc2UwMTogJyM1MzQ2MzYnLFxuICBiYXNlMDI6ICcjNjQ1MjQwJyxcbiAgYmFzZTAzOiAnIzdlNzA1YScsXG4gIGJhc2UwNDogJyNiOGFmYWQnLFxuICBiYXNlMDU6ICcjZDBjOGM2JyxcbiAgYmFzZTA2OiAnI2U5ZTFkZCcsXG4gIGJhc2UwNzogJyNmNWVlZWInLFxuICBiYXNlMDg6ICcjY2I2MDc3JyxcbiAgYmFzZTA5OiAnI2QyOGI3MScsXG4gIGJhc2UwQTogJyNmNGJjODcnLFxuICBiYXNlMEI6ICcjYmViNTViJyxcbiAgYmFzZTBDOiAnIzdiYmRhNCcsXG4gIGJhc2UwRDogJyM4YWIzYjUnLFxuICBiYXNlMEU6ICcjYTg5YmI5JyxcbiAgYmFzZTBGOiAnI2JiOTU4NCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21vbm9rYWknLFxuICBhdXRob3I6ICd3aW1lciBoYXplbmJlcmcgKGh0dHA6Ly93d3cubW9ub2thaS5ubCknLFxuICBiYXNlMDA6ICcjMjcyODIyJyxcbiAgYmFzZTAxOiAnIzM4MzgzMCcsXG4gIGJhc2UwMjogJyM0OTQ4M2UnLFxuICBiYXNlMDM6ICcjNzU3MTVlJyxcbiAgYmFzZTA0OiAnI2E1OWY4NScsXG4gIGJhc2UwNTogJyNmOGY4ZjInLFxuICBiYXNlMDY6ICcjZjVmNGYxJyxcbiAgYmFzZTA3OiAnI2Y5ZjhmNScsXG4gIGJhc2UwODogJyNmOTI2NzInLFxuICBiYXNlMDk6ICcjZmQ5NzFmJyxcbiAgYmFzZTBBOiAnI2Y0YmY3NScsXG4gIGJhc2UwQjogJyNhNmUyMmUnLFxuICBiYXNlMEM6ICcjYTFlZmU0JyxcbiAgYmFzZTBEOiAnIzY2ZDllZicsXG4gIGJhc2UwRTogJyNhZTgxZmYnLFxuICBiYXNlMEY6ICcjY2M2NjMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnb2NlYW4nLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMmIzMDNiJyxcbiAgYmFzZTAxOiAnIzM0M2Q0NicsXG4gIGJhc2UwMjogJyM0ZjViNjYnLFxuICBiYXNlMDM6ICcjNjU3MzdlJyxcbiAgYmFzZTA0OiAnI2E3YWRiYScsXG4gIGJhc2UwNTogJyNjMGM1Y2UnLFxuICBiYXNlMDY6ICcjZGZlMWU4JyxcbiAgYmFzZTA3OiAnI2VmZjFmNScsXG4gIGJhc2UwODogJyNiZjYxNmEnLFxuICBiYXNlMDk6ICcjZDA4NzcwJyxcbiAgYmFzZTBBOiAnI2ViY2I4YicsXG4gIGJhc2UwQjogJyNhM2JlOGMnLFxuICBiYXNlMEM6ICcjOTZiNWI0JyxcbiAgYmFzZTBEOiAnIzhmYTFiMycsXG4gIGJhc2UwRTogJyNiNDhlYWQnLFxuICBiYXNlMEY6ICcjYWI3OTY3J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncGFyYWlzbycsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzJmMWUyZScsXG4gIGJhc2UwMTogJyM0MTMyM2YnLFxuICBiYXNlMDI6ICcjNGY0MjRjJyxcbiAgYmFzZTAzOiAnIzc3NmU3MScsXG4gIGJhc2UwNDogJyM4ZDg2ODcnLFxuICBiYXNlMDU6ICcjYTM5ZTliJyxcbiAgYmFzZTA2OiAnI2I5YjZiMCcsXG4gIGJhc2UwNzogJyNlN2U5ZGInLFxuICBiYXNlMDg6ICcjZWY2MTU1JyxcbiAgYmFzZTA5OiAnI2Y5OWIxNScsXG4gIGJhc2UwQTogJyNmZWM0MTgnLFxuICBiYXNlMEI6ICcjNDhiNjg1JyxcbiAgYmFzZTBDOiAnIzViYzRiZicsXG4gIGJhc2UwRDogJyMwNmI2ZWYnLFxuICBiYXNlMEU6ICcjODE1YmE0JyxcbiAgYmFzZTBGOiAnI2U5NmJhOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3BvcCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjYjBiMGIwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ViMDA4YScsXG4gIGJhc2UwOTogJyNmMjkzMzMnLFxuICBiYXNlMEE6ICcjZjhjYTEyJyxcbiAgYmFzZTBCOiAnIzM3YjM0OScsXG4gIGJhc2UwQzogJyMwMGFhYmInLFxuICBiYXNlMEQ6ICcjMGU1YTk0JyxcbiAgYmFzZTBFOiAnI2IzMWU4ZCcsXG4gIGJhc2UwRjogJyM3YTJkMDAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdyYWlsc2Nhc3RzJyxcbiAgYXV0aG9yOiAncnlhbiBiYXRlcyAoaHR0cDovL3JhaWxzY2FzdHMuY29tKScsXG4gIGJhc2UwMDogJyMyYjJiMmInLFxuICBiYXNlMDE6ICcjMjcyOTM1JyxcbiAgYmFzZTAyOiAnIzNhNDA1NScsXG4gIGJhc2UwMzogJyM1YTY0N2UnLFxuICBiYXNlMDQ6ICcjZDRjZmM5JyxcbiAgYmFzZTA1OiAnI2U2ZTFkYycsXG4gIGJhc2UwNjogJyNmNGYxZWQnLFxuICBiYXNlMDc6ICcjZjlmN2YzJyxcbiAgYmFzZTA4OiAnI2RhNDkzOScsXG4gIGJhc2UwOTogJyNjYzc4MzMnLFxuICBiYXNlMEE6ICcjZmZjNjZkJyxcbiAgYmFzZTBCOiAnI2E1YzI2MScsXG4gIGJhc2UwQzogJyM1MTlmNTAnLFxuICBiYXNlMEQ6ICcjNmQ5Y2JlJyxcbiAgYmFzZTBFOiAnI2I2YjNlYicsXG4gIGJhc2UwRjogJyNiYzk0NTgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzaGFwZXNoaWZ0ZXInLFxuICBhdXRob3I6ICd0eWxlciBiZW56aWdlciAoaHR0cDovL3R5YmVuei5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMwNDA0MDQnLFxuICBiYXNlMDI6ICcjMTAyMDE1JyxcbiAgYmFzZTAzOiAnIzM0MzQzNCcsXG4gIGJhc2UwNDogJyM1NTU1NTUnLFxuICBiYXNlMDU6ICcjYWJhYmFiJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmOWY5ZjknLFxuICBiYXNlMDg6ICcjZTkyZjJmJyxcbiAgYmFzZTA5OiAnI2UwOTQ0OCcsXG4gIGJhc2UwQTogJyNkZGRkMTMnLFxuICBiYXNlMEI6ICcjMGVkODM5JyxcbiAgYmFzZTBDOiAnIzIzZWRkYScsXG4gIGJhc2UwRDogJyMzYjQ4ZTMnLFxuICBiYXNlMEU6ICcjZjk5NmUyJyxcbiAgYmFzZTBGOiAnIzY5NTQyZCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3NvbGFyaXplZCcsXG4gIGF1dGhvcjogJ2V0aGFuIHNjaG9vbm92ZXIgKGh0dHA6Ly9ldGhhbnNjaG9vbm92ZXIuY29tL3NvbGFyaXplZCknLFxuICBiYXNlMDA6ICcjMDAyYjM2JyxcbiAgYmFzZTAxOiAnIzA3MzY0MicsXG4gIGJhc2UwMjogJyM1ODZlNzUnLFxuICBiYXNlMDM6ICcjNjU3YjgzJyxcbiAgYmFzZTA0OiAnIzgzOTQ5NicsXG4gIGJhc2UwNTogJyM5M2ExYTEnLFxuICBiYXNlMDY6ICcjZWVlOGQ1JyxcbiAgYmFzZTA3OiAnI2ZkZjZlMycsXG4gIGJhc2UwODogJyNkYzMyMmYnLFxuICBiYXNlMDk6ICcjY2I0YjE2JyxcbiAgYmFzZTBBOiAnI2I1ODkwMCcsXG4gIGJhc2UwQjogJyM4NTk5MDAnLFxuICBiYXNlMEM6ICcjMmFhMTk4JyxcbiAgYmFzZTBEOiAnIzI2OGJkMicsXG4gIGJhc2UwRTogJyM2YzcxYzQnLFxuICBiYXNlMEY6ICcjZDMzNjgyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc3VtbWVyZnJ1aXQnLFxuICBhdXRob3I6ICdjaHJpc3RvcGhlciBjb3JsZXkgKGh0dHA6Ly9jc2NvcmxleS5naXRodWIuaW8vKScsXG4gIGJhc2UwMDogJyMxNTE1MTUnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjQjBCMEIwJyxcbiAgYmFzZTA1OiAnI0QwRDBEMCcsXG4gIGJhc2UwNjogJyNFMEUwRTAnLFxuICBiYXNlMDc6ICcjRkZGRkZGJyxcbiAgYmFzZTA4OiAnI0ZGMDA4NicsXG4gIGJhc2UwOTogJyNGRDg5MDAnLFxuICBiYXNlMEE6ICcjQUJBODAwJyxcbiAgYmFzZTBCOiAnIzAwQzkxOCcsXG4gIGJhc2UwQzogJyMxZmFhYWEnLFxuICBiYXNlMEQ6ICcjMzc3N0U2JyxcbiAgYmFzZTBFOiAnI0FEMDBBMScsXG4gIGJhc2UwRjogJyNjYzY2MzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0aHJlZXplcm90d29mb3VyJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQgKGh0dHA6Ly9naXRodWIuY29tL2lkbGViZXJnKScsXG4gIGJhc2UwMDogJyMwOTAzMDAnLFxuICBiYXNlMDE6ICcjM2EzNDMyJyxcbiAgYmFzZTAyOiAnIzRhNDU0MycsXG4gIGJhc2UwMzogJyM1YzU4NTUnLFxuICBiYXNlMDQ6ICcjODA3ZDdjJyxcbiAgYmFzZTA1OiAnI2E1YTJhMicsXG4gIGJhc2UwNjogJyNkNmQ1ZDQnLFxuICBiYXNlMDc6ICcjZjdmN2Y3JyxcbiAgYmFzZTA4OiAnI2RiMmQyMCcsXG4gIGJhc2UwOTogJyNlOGJiZDAnLFxuICBiYXNlMEE6ICcjZmRlZDAyJyxcbiAgYmFzZTBCOiAnIzAxYTI1MicsXG4gIGJhc2UwQzogJyNiNWU0ZjQnLFxuICBiYXNlMEQ6ICcjMDFhMGU0JyxcbiAgYmFzZTBFOiAnI2ExNmE5NCcsXG4gIGJhc2UwRjogJyNjZGFiNTMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0b21vcnJvdycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxZDFmMjEnLFxuICBiYXNlMDE6ICcjMjgyYTJlJyxcbiAgYmFzZTAyOiAnIzM3M2I0MScsXG4gIGJhc2UwMzogJyM5Njk4OTYnLFxuICBiYXNlMDQ6ICcjYjRiN2I0JyxcbiAgYmFzZTA1OiAnI2M1YzhjNicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2NjNjY2NicsXG4gIGJhc2UwOTogJyNkZTkzNWYnLFxuICBiYXNlMEE6ICcjZjBjNjc0JyxcbiAgYmFzZTBCOiAnI2I1YmQ2OCcsXG4gIGJhc2UwQzogJyM4YWJlYjcnLFxuICBiYXNlMEQ6ICcjODFhMmJlJyxcbiAgYmFzZTBFOiAnI2IyOTRiYicsXG4gIGJhc2UwRjogJyNhMzY4NWEnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdsb25kb24gdHViZScsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzIzMWYyMCcsXG4gIGJhc2UwMTogJyMxYzNmOTUnLFxuICBiYXNlMDI6ICcjNWE1NzU4JyxcbiAgYmFzZTAzOiAnIzczNzE3MScsXG4gIGJhc2UwNDogJyM5NTljYTEnLFxuICBiYXNlMDU6ICcjZDlkOGQ4JyxcbiAgYmFzZTA2OiAnI2U3ZTdlOCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZWUyZTI0JyxcbiAgYmFzZTA5OiAnI2YzODZhMScsXG4gIGJhc2UwQTogJyNmZmQyMDQnLFxuICBiYXNlMEI6ICcjMDA4NTNlJyxcbiAgYmFzZTBDOiAnIzg1Y2ViYycsXG4gIGJhc2UwRDogJyMwMDlkZGMnLFxuICBiYXNlMEU6ICcjOTgwMDVkJyxcbiAgYmFzZTBGOiAnI2IwNjExMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3R3aWxpZ2h0JyxcbiAgYXV0aG9yOiAnZGF2aWQgaGFydCAoaHR0cDovL2hhcnQtZGV2LmNvbSknLFxuICBiYXNlMDA6ICcjMWUxZTFlJyxcbiAgYmFzZTAxOiAnIzMyMzUzNycsXG4gIGJhc2UwMjogJyM0NjRiNTAnLFxuICBiYXNlMDM6ICcjNWY1YTYwJyxcbiAgYmFzZTA0OiAnIzgzODE4NCcsXG4gIGJhc2UwNTogJyNhN2E3YTcnLFxuICBiYXNlMDY6ICcjYzNjM2MzJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNjZjZhNGMnLFxuICBiYXNlMDk6ICcjY2RhODY5JyxcbiAgYmFzZTBBOiAnI2Y5ZWU5OCcsXG4gIGJhc2UwQjogJyM4ZjlkNmEnLFxuICBiYXNlMEM6ICcjYWZjNGRiJyxcbiAgYmFzZTBEOiAnIzc1ODdhNicsXG4gIGJhc2UwRTogJyM5Yjg1OWQnLFxuICBiYXNlMEY6ICcjOWI3MDNmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY3NzS2V5d29yZHMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG5cbi8vIE5PVEU6IGNvbnZlcnNpb25zIHNob3VsZCBvbmx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzIChpLmUuIGFycmF5cywgb3Jcbi8vICAgICAgIHZhbHVlcyB0aGF0IGdpdmUgY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzKS5cbi8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbnZhciByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAodmFyIGtleSBpbiBjc3NLZXl3b3Jkcykge1xuXHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJldmVyc2VLZXl3b3Jkc1tjc3NLZXl3b3Jkc1trZXldXSA9IGtleTtcblx0fVxufVxuXG52YXIgY29udmVydCA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxuLy8gaGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuZm9yICh2YXIgbW9kZWwgaW4gY29udmVydCkge1xuXHRpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcblx0XHRpZiAoISgnY2hhbm5lbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmICghKCdsYWJlbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmIChjb252ZXJ0W21vZGVsXS5sYWJlbHMubGVuZ3RoICE9PSBjb252ZXJ0W21vZGVsXS5jaGFubmVscykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xuXHR9XG59XG5cbmNvbnZlcnQucmdiLmhzbCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXHR2YXIgbDtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmRpZjtcblx0dmFyIGdkaWY7XG5cdHZhciBiZGlmO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRpZmYgPSB2IC0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cdFx0aWYgKGggPCAwKSB7XG5cdFx0XHRoICs9IDE7XG5cdFx0fSBlbHNlIGlmIChoID4gMSkge1xuXHRcdFx0aCAtPSAxO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBbXG5cdFx0aCAqIDM2MCxcblx0XHRzICogMTAwLFxuXHRcdHYgKiAxMDBcblx0XTtcbn07XG5cbmNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF07XG5cdHZhciBnID0gcmdiWzFdO1xuXHR2YXIgYiA9IHJnYlsyXTtcblx0dmFyIGggPSBjb252ZXJ0LnJnYi5oc2wocmdiKVswXTtcblx0dmFyIHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIGM7XG5cdHZhciBtO1xuXHR2YXIgeTtcblx0dmFyIGs7XG5cblx0ayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0eSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG4vKipcbiAqIFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuICogKi9cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHRyZXR1cm4gKFxuXHRcdE1hdGgucG93KHhbMF0gLSB5WzBdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzJdIC0geVsyXSwgMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdHZhciBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yICh2YXIga2V5d29yZCBpbiBjc3NLZXl3b3Jkcykge1xuXHRcdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXl3b3JkKSkge1xuXHRcdFx0dmFyIHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRcdHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHRcdC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXHRcdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0S2V5d29yZCA9IGtleXdvcmQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbn07XG5cbmNvbnZlcnQua2V5d29yZC5yZ2IgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRyZXR1cm4gY3NzS2V5d29yZHNba2V5d29yZF07XG59O1xuXG5jb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChyICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKHIgLyAxMi45Mik7XG5cdGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChnIC8gMTIuOTIpO1xuXHRiID0gYiA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoYiAvIDEyLjkyKTtcblxuXHR2YXIgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0dmFyIHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdHZhciB6ID0gKHIgKiAwLjAxOTMpICsgKGcgKiAwLjExOTIpICsgKGIgKiAwLjk1MDUpO1xuXG5cdHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5sYWIgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdIC8gMzYwO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciB0MTtcblx0dmFyIHQyO1xuXHR2YXIgdDM7XG5cdHZhciByZ2I7XG5cdHZhciB2YWw7XG5cblx0aWYgKHMgPT09IDApIHtcblx0XHR2YWwgPSBsICogMjU1O1xuXHRcdHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG5cdH1cblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdHQyID0gbCAqICgxICsgcyk7XG5cdH0gZWxzZSB7XG5cdFx0dDIgPSBsICsgcyAtIGwgKiBzO1xuXHR9XG5cblx0dDEgPSAyICogbCAtIHQyO1xuXG5cdHJnYiA9IFswLCAwLCAwXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHR0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXHRcdGlmICh0MyA8IDApIHtcblx0XHRcdHQzKys7XG5cdFx0fVxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBzbWluID0gcztcblx0dmFyIGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcblx0dmFyIHN2O1xuXHR2YXIgdjtcblxuXHRsICo9IDI7XG5cdHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG5cdHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuXHR2ID0gKGwgKyBzKSAvIDI7XG5cdHN2ID0gbCA9PT0gMCA/ICgyICogc21pbikgLyAobG1pbiArIHNtaW4pIDogKDIgKiBzKSAvIChsICsgcyk7XG5cblx0cmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdIC8gNjA7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cblx0dmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0dmFyIHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0dmFyIHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKTtcblx0dmFyIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdHZhciBsbWluO1xuXHR2YXIgc2w7XG5cdHZhciBsO1xuXG5cdGwgPSAoMiAtIHMpICogdjtcblx0bG1pbiA9ICgyIC0gcykgKiB2bWluO1xuXHRzbCA9IHMgKiB2bWluO1xuXHRzbCAvPSAobG1pbiA8PSAxKSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0c2wgPSBzbCB8fCAwO1xuXHRsIC89IDI7XG5cblx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG4vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcbmNvbnZlcnQuaHdiLnJnYiA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIGggPSBod2JbMF0gLyAzNjA7XG5cdHZhciB3aCA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGJsID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgcmF0aW8gPSB3aCArIGJsO1xuXHR2YXIgaTtcblx0dmFyIHY7XG5cdHZhciBmO1xuXHR2YXIgbjtcblxuXHQvLyB3aCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0diA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gbGluZWFyIGludGVycG9sYXRpb25cblxuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyBnID0gbjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyBnID0gdjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDI6IHIgPSB3aDsgZyA9IHY7IGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyBnID0gd2g7IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDU6IHIgPSB2OyBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0dmFyIGMgPSBjbXlrWzBdIC8gMTAwO1xuXHR2YXIgbSA9IGNteWtbMV0gLyAxMDA7XG5cdHZhciB5ID0gY215a1syXSAvIDEwMDtcblx0dmFyIGsgPSBjbXlrWzNdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcblx0ZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuXHRiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF0gLyAxMDA7XG5cdHZhciB5ID0geHl6WzFdIC8gMTAwO1xuXHR2YXIgeiA9IHh5elsyXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG5cdGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuXHRiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KHIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGIgKiAxMi45MjtcblxuXHRyID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuXHRnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuXHRiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5sYWIueHl6ID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgeDtcblx0dmFyIHk7XG5cdHZhciB6O1xuXG5cdHkgPSAobCArIDE2KSAvIDExNjtcblx0eCA9IGEgLyA1MDAgKyB5O1xuXHR6ID0geSAtIGIgLyAyMDA7XG5cblx0dmFyIHkyID0gTWF0aC5wb3coeSwgMyk7XG5cdHZhciB4MiA9IE1hdGgucG93KHgsIDMpO1xuXHR2YXIgejIgPSBNYXRoLnBvdyh6LCAzKTtcblx0eSA9IHkyID4gMC4wMDg4NTYgPyB5MiA6ICh5IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcblxuXHR4ICo9IDk1LjA0Nztcblx0eSAqPSAxMDA7XG5cdHogKj0gMTA4Ljg4MztcblxuXHRyZXR1cm4gW3gsIHksIHpdO1xufTtcblxuY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgaHI7XG5cdHZhciBoO1xuXHR2YXIgYztcblxuXHRociA9IE1hdGguYXRhbjIoYiwgYSk7XG5cdGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0YyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuXHRyZXR1cm4gW2wsIGMsIGhdO1xufTtcblxuY29udmVydC5sY2gubGFiID0gZnVuY3Rpb24gKGxjaCkge1xuXHR2YXIgbCA9IGxjaFswXTtcblx0dmFyIGMgPSBsY2hbMV07XG5cdHZhciBoID0gbGNoWzJdO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cdHZhciBocjtcblxuXHRociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0YSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXHR2YXIgdmFsdWUgPSAxIGluIGFyZ3VtZW50cyA/IGFyZ3VtZW50c1sxXSA6IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXTsgLy8gaHN2IC0+IGFuc2kxNiBvcHRpbWl6YXRpb25cblxuXHR2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cblx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0cmV0dXJuIDMwO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAzMFxuXHRcdCsgKChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIpXG5cdFx0fCAoTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxKVxuXHRcdHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cblx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0YW5zaSArPSA2MDtcblx0fVxuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gb3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG5cdC8vIGl0IGNvbnZlcnRlZCBmb3IgdXMuXG5cdHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kyNTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXG5cdC8vIHdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG5cdFx0aWYgKHIgPCA4KSB7XG5cdFx0XHRyZXR1cm4gMTY7XG5cdFx0fVxuXG5cdFx0aWYgKHIgPiAyNDgpIHtcblx0XHRcdHJldHVybiAyMzE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKChyIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0dmFyIG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHR2YXIgciA9ICgoY29sb3IgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdHZhciBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuXHRcdHJldHVybiBbYywgYywgY107XG5cdH1cblxuXHRhcmdzIC09IDE2O1xuXG5cdHZhciByZW07XG5cdHZhciByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0dmFyIGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHR2YXIgYiA9IChyZW0gJSA2KSAvIDUgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBbMCwgMCwgMF07XG5cdH1cblxuXHR2YXIgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuXHRpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG5cdFx0Y29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaGFyKSB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHR2YXIgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cdHZhciByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0dmFyIGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdHZhciBiID0gaW50ZWdlciAmIDB4RkY7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0dmFyIG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0dmFyIGNocm9tYSA9IChtYXggLSBtaW4pO1xuXHR2YXIgZ3JheXNjYWxlO1xuXHR2YXIgaHVlO1xuXG5cdGlmIChjaHJvbWEgPCAxKSB7XG5cdFx0Z3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuXHR9IGVsc2Uge1xuXHRcdGdyYXlzY2FsZSA9IDA7XG5cdH1cblxuXHRpZiAoY2hyb21hIDw9IDApIHtcblx0XHRodWUgPSAwO1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gcikge1xuXHRcdGh1ZSA9ICgoZyAtIGIpIC8gY2hyb21hKSAlIDY7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSBnKSB7XG5cdFx0aHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG5cdH0gZWxzZSB7XG5cdFx0aHVlID0gNCArIChyIC0gZykgLyBjaHJvbWEgKyA0O1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIGMgPSAxO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHRjID0gMi4wICogcyAqIGw7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IDIuMCAqIHMgKiAoMS4wIC0gbCk7XG5cdH1cblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0dmFyIGMgPSBzICogdjtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgaCA9IGhjZ1swXSAvIDM2MDtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGlmIChjID09PSAwLjApIHtcblx0XHRyZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuXHR9XG5cblx0dmFyIHB1cmUgPSBbMCwgMCwgMF07XG5cdHZhciBoaSA9IChoICUgMSkgKiA2O1xuXHR2YXIgdiA9IGhpICUgMTtcblx0dmFyIHcgPSAxIC0gdjtcblx0dmFyIG1nID0gMDtcblxuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0dmFyIHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciB3ID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYiA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHYgPSAxIC0gYjtcblx0dmFyIGMgPSB2IC0gdztcblx0dmFyIGcgPSAwO1xuXG5cdGlmIChjIDwgMSkge1xuXHRcdGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbn07XG5cbmNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG5cdHJldHVybiBbKGFwcGxlWzBdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMV0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsyXSAvIDY1NTM1KSAqIDI1NV07XG59O1xuXG5jb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIFsocmdiWzBdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzFdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzJdIC8gMjU1KSAqIDY1NTM1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xufTtcblxuY29udmVydC5ncmF5LmhzbCA9IGNvbnZlcnQuZ3JheS5oc3YgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xufTtcblxuY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHZhciB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0dmFyIGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xudmFyIHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG52YXIgY29udmVydCA9IHt9O1xuXG52YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gd2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdHZhciByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHR2YXIgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKHRvTW9kZWwpIHtcblx0XHR2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5cbi8qXG5cdHRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuXHR0byB0aGUgcmV0dXJuZWQgc3ludGhldGljIGZ1bmN0aW9uLiBUaGlzIHByb3BlcnR5IGlzIGFuIGFycmF5XG5cdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG5cdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuXHRjb252ZXJzaW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgc2ltcGx5IGFyZSBub3QgaW5jbHVkZWQuXG4qL1xuXG5mdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuXHR2YXIgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHR2YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHR2YXIgZ3JhcGggPSBidWlsZEdyYXBoKCk7XG5cdHZhciBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyB1bnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHR2YXIgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdHZhciBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9uc1tjdXJyZW50XSk7XG5cblx0XHRmb3IgKHZhciBsZW4gPSBhZGphY2VudHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHR2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHR2YXIgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0dmFyIHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcblx0dmFyIGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcblxuXHR2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXHR3aGlsZSAoZ3JhcGhbY3VyXS5wYXJlbnQpIHtcblx0XHRwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuXHRcdGZuID0gbGluayhjb252ZXJzaW9uc1tncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuXHRcdGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuXHR9XG5cblx0Zm4uY29udmVyc2lvbiA9IHBhdGg7XG5cdHJldHVybiBmbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHR2YXIgY29udmVyc2lvbiA9IHt9O1xuXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHR2YXIgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHR2YXIgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBubyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyBjcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuXHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBuYW1lKSkge1xuXHRcdHJldmVyc2VOYW1lc1tjb2xvck5hbWVzW25hbWVdXSA9IG5hbWU7XG5cdH1cbn1cblxudmFyIGNzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRvOiB7fSxcblx0Z2V0OiB7fVxufTtcblxuY3MuZ2V0ID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgdmFsO1xuXHR2YXIgbW9kZWw7XG5cdHN3aXRjaCAocHJlZml4KSB7XG5cdFx0Y2FzZSAnaHNsJzpcblx0XHRcdHZhbCA9IGNzLmdldC5oc2woc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2hzbCc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdod2InOlxuXHRcdFx0dmFsID0gY3MuZ2V0Lmh3YihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHdiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR2YWwgPSBjcy5nZXQucmdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdyZ2InO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAoIXZhbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIHttb2RlbDogbW9kZWwsIHZhbHVlOiB2YWx9O1xufTtcblxuY3MuZ2V0LnJnYiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBhYmJyID0gL14jKFthLWYwLTldezMsNH0pJC9pO1xuXHR2YXIgaGV4ID0gL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pO1xuXHR2YXIgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC9eKFxcdyspJC87XG5cblx0dmFyIHJnYiA9IFswLCAwLCAwLCAxXTtcblx0dmFyIG1hdGNoO1xuXHR2YXIgaTtcblx0dmFyIGhleEFscGhhO1xuXG5cdGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFsyXTtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3NsaWNlLXZzLXN1YnN0ci12cy1zdWJzdHJpbmctbWV0aG9kcy1sb25nLXN0cmluZy8xOVxuXHRcdFx0dmFyIGkyID0gaSAqIDI7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpMiwgaTIgKyAyKSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicikpIHtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXHRcdGhleEFscGhhID0gbWF0Y2hbM107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpXSArIG1hdGNoW2ldLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSArIGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdLCAwKTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGtleXdvcmQpKSB7XG5cdFx0aWYgKG1hdGNoWzFdID09PSAndHJhbnNwYXJlbnQnKSB7XG5cdFx0XHRyZXR1cm4gWzAsIDAsIDAsIDBdO1xuXHRcdH1cblxuXHRcdGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBtYXRjaFsxXSkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuXHRcdHJnYlszXSA9IDE7XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHJnYltpXSA9IGNsYW1wKHJnYltpXSwgMCwgMjU1KTtcblx0fVxuXHRyZ2JbM10gPSBjbGFtcChyZ2JbM10sIDAsIDEpO1xuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jcy5nZXQuaHNsID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkezAsM31cXC4pP1xcZCspKD86ZGVnKT9cXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86Wyx8XFwvXVxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IE1hdGgucm91bmQobnVtKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb2xvclN0cmluZyA9IHJlcXVpcmUoJ2NvbG9yLXN0cmluZycpO1xudmFyIGNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cbnZhciBfc2xpY2UgPSBbXS5zbGljZTtcblxudmFyIHNraXBwZWRNb2RlbHMgPSBbXG5cdC8vIHRvIGJlIGhvbmVzdCwgSSBkb24ndCByZWFsbHkgZmVlbCBsaWtlIGtleXdvcmQgYmVsb25ncyBpbiBjb2xvciBjb252ZXJ0LCBidXQgZWguXG5cdCdrZXl3b3JkJyxcblxuXHQvLyBncmF5IGNvbmZsaWN0cyB3aXRoIHNvbWUgbWV0aG9kIG5hbWVzLCBhbmQgaGFzIGl0cyBvd24gbWV0aG9kIGRlZmluZWQuXG5cdCdncmF5JyxcblxuXHQvLyBzaG91bGRuJ3QgcmVhbGx5IGJlIGluIGNvbG9yLWNvbnZlcnQgZWl0aGVyLi4uXG5cdCdoZXgnXG5dO1xuXG52YXIgaGFzaGVkTW9kZWxLZXlzID0ge307XG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRoYXNoZWRNb2RlbEtleXNbX3NsaWNlLmNhbGwoY29udmVydFttb2RlbF0ubGFiZWxzKS5zb3J0KCkuam9pbignJyldID0gbW9kZWw7XG59KTtcblxudmFyIGxpbWl0ZXJzID0ge307XG5cbmZ1bmN0aW9uIENvbG9yKG9iaiwgbW9kZWwpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqLCBtb2RlbCk7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgbW9kZWwgaW4gc2tpcHBlZE1vZGVscykge1xuXHRcdG1vZGVsID0gbnVsbDtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiAhKG1vZGVsIGluIGNvbnZlcnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGVsOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0dmFyIGk7XG5cdHZhciBjaGFubmVscztcblxuXHRpZiAob2JqID09IG51bGwpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gWzAsIDAsIDBdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHRoaXMubW9kZWwgPSBvYmoubW9kZWw7XG5cdFx0dGhpcy5jb2xvciA9IG9iai5jb2xvci5zbGljZSgpO1xuXHRcdHRoaXMudmFscGhhID0gb2JqLnZhbHBoYTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHZhciByZXN1bHQgPSBjb2xvclN0cmluZy5nZXQob2JqKTtcblx0XHRpZiAocmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIHN0cmluZzogJyArIG9iaik7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IHJlc3VsdC5tb2RlbDtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dGhpcy5jb2xvciA9IHJlc3VsdC52YWx1ZS5zbGljZSgwLCBjaGFubmVscyk7XG5cdFx0dGhpcy52YWxwaGEgPSB0eXBlb2YgcmVzdWx0LnZhbHVlW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyByZXN1bHQudmFsdWVbY2hhbm5lbHNdIDogMTtcblx0fSBlbHNlIGlmIChvYmoubGVuZ3RoKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsIHx8ICdyZ2InO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbmV3QXJyID0gX3NsaWNlLmNhbGwob2JqLCAwLCBjaGFubmVscyk7XG5cdFx0dGhpcy5jb2xvciA9IHplcm9BcnJheShuZXdBcnIsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmpbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IG9ialtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG5cdFx0Ly8gdGhpcyBpcyBhbHdheXMgUkdCIC0gY2FuIGJlIGNvbnZlcnRlZCBsYXRlciBvbi5cblx0XHRvYmogJj0gMHhGRkZGRkY7XG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbXG5cdFx0XHQob2JqID4+IDE2KSAmIDB4RkYsXG5cdFx0XHQob2JqID4+IDgpICYgMHhGRixcblx0XHRcdG9iaiAmIDB4RkZcblx0XHRdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cblx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0aWYgKCdhbHBoYScgaW4gb2JqKSB7XG5cdFx0XHRrZXlzLnNwbGljZShrZXlzLmluZGV4T2YoJ2FscGhhJyksIDEpO1xuXHRcdFx0dGhpcy52YWxwaGEgPSB0eXBlb2Ygb2JqLmFscGhhID09PSAnbnVtYmVyJyA/IG9iai5hbHBoYSA6IDA7XG5cdFx0fVxuXG5cdFx0dmFyIGhhc2hlZEtleXMgPSBrZXlzLnNvcnQoKS5qb2luKCcnKTtcblx0XHRpZiAoIShoYXNoZWRLZXlzIGluIGhhc2hlZE1vZGVsS2V5cykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IGhhc2hlZE1vZGVsS2V5c1toYXNoZWRLZXlzXTtcblxuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmxhYmVscztcblx0XHR2YXIgY29sb3IgPSBbXTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb2xvci5wdXNoKG9ialtsYWJlbHNbaV1dKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KGNvbG9yKTtcblx0fVxuXG5cdC8vIHBlcmZvcm0gbGltaXRhdGlvbnMgKGNsYW1waW5nLCBldGMuKVxuXHRpZiAobGltaXRlcnNbdGhpcy5tb2RlbF0pIHtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHZhciBsaW1pdCA9IGxpbWl0ZXJzW3RoaXMubW9kZWxdW2ldO1xuXHRcdFx0aWYgKGxpbWl0KSB7XG5cdFx0XHRcdHRoaXMuY29sb3JbaV0gPSBsaW1pdCh0aGlzLmNvbG9yW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aGlzLnZhbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHRoaXMudmFscGhhKSk7XG5cblx0aWYgKE9iamVjdC5mcmVlemUpIHtcblx0XHRPYmplY3QuZnJlZXplKHRoaXMpO1xuXHR9XG59XG5cbkNvbG9yLnByb3RvdHlwZSA9IHtcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHJpbmcoKTtcblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpc1t0aGlzLm1vZGVsXSgpO1xuXHR9LFxuXG5cdHN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5tb2RlbCBpbiBjb2xvclN0cmluZy50byA/IHRoaXMgOiB0aGlzLnJnYigpO1xuXHRcdHNlbGYgPSBzZWxmLnJvdW5kKHR5cGVvZiBwbGFjZXMgPT09ICdudW1iZXInID8gcGxhY2VzIDogMSk7XG5cdFx0dmFyIGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBzZWxmLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvW3NlbGYubW9kZWxdKGFyZ3MpO1xuXHR9LFxuXG5cdHBlcmNlbnRTdHJpbmc6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXMucmdiKCkucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8ucmdiLnBlcmNlbnQoYXJncyk7XG5cdH0sXG5cblx0YXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxwaGEgPT09IDEgPyB0aGlzLmNvbG9yLnNsaWNlKCkgOiB0aGlzLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdH0sXG5cblx0b2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7XG5cdFx0XHRyZXN1bHRbbGFiZWxzW2ldXSA9IHRoaXMuY29sb3JbaV07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZXN1bHQuYWxwaGEgPSB0aGlzLnZhbHBoYTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdHVuaXRBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJnYlswXSAvPSAyNTU7XG5cdFx0cmdiWzFdIC89IDI1NTtcblx0XHRyZ2JbMl0gLz0gMjU1O1xuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZ2IucHVzaCh0aGlzLnZhbHBoYSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHR1bml0T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkub2JqZWN0KCk7XG5cdFx0cmdiLnIgLz0gMjU1O1xuXHRcdHJnYi5nIC89IDI1NTtcblx0XHRyZ2IuYiAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHRwbGFjZXMgPSBNYXRoLm1heChwbGFjZXMgfHwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLm1hcChyb3VuZFRvUGxhY2UocGxhY2VzKSkuY29uY2F0KHRoaXMudmFscGhhKSwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0YWxwaGE6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLmNvbmNhdChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWwpKSksIHRoaXMubW9kZWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnZhbHBoYTtcblx0fSxcblxuXHQvLyByZ2Jcblx0cmVkOiBnZXRzZXQoJ3JnYicsIDAsIG1heGZuKDI1NSkpLFxuXHRncmVlbjogZ2V0c2V0KCdyZ2InLCAxLCBtYXhmbigyNTUpKSxcblx0Ymx1ZTogZ2V0c2V0KCdyZ2InLCAyLCBtYXhmbigyNTUpKSxcblxuXHRodWU6IGdldHNldChbJ2hzbCcsICdoc3YnLCAnaHNsJywgJ2h3YicsICdoY2cnXSwgMCwgZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gKCh2YWwgJSAzNjApICsgMzYwKSAlIDM2MDsgfSksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYnJhY2Utc3R5bGVcblxuXHRzYXR1cmF0aW9ubDogZ2V0c2V0KCdoc2wnLCAxLCBtYXhmbigxMDApKSxcblx0bGlnaHRuZXNzOiBnZXRzZXQoJ2hzbCcsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHNhdHVyYXRpb252OiBnZXRzZXQoJ2hzdicsIDEsIG1heGZuKDEwMCkpLFxuXHR2YWx1ZTogZ2V0c2V0KCdoc3YnLCAyLCBtYXhmbigxMDApKSxcblxuXHRjaHJvbWE6IGdldHNldCgnaGNnJywgMSwgbWF4Zm4oMTAwKSksXG5cdGdyYXk6IGdldHNldCgnaGNnJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0d2hpdGU6IGdldHNldCgnaHdiJywgMSwgbWF4Zm4oMTAwKSksXG5cdHdibGFjazogZ2V0c2V0KCdod2InLCAyLCBtYXhmbigxMDApKSxcblxuXHRjeWFuOiBnZXRzZXQoJ2NteWsnLCAwLCBtYXhmbigxMDApKSxcblx0bWFnZW50YTogZ2V0c2V0KCdjbXlrJywgMSwgbWF4Zm4oMTAwKSksXG5cdHllbGxvdzogZ2V0c2V0KCdjbXlrJywgMiwgbWF4Zm4oMTAwKSksXG5cdGJsYWNrOiBnZXRzZXQoJ2NteWsnLCAzLCBtYXhmbigxMDApKSxcblxuXHR4OiBnZXRzZXQoJ3h5eicsIDAsIG1heGZuKDEwMCkpLFxuXHR5OiBnZXRzZXQoJ3h5eicsIDEsIG1heGZuKDEwMCkpLFxuXHR6OiBnZXRzZXQoJ3h5eicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGw6IGdldHNldCgnbGFiJywgMCwgbWF4Zm4oMTAwKSksXG5cdGE6IGdldHNldCgnbGFiJywgMSksXG5cdGI6IGdldHNldCgnbGFiJywgMiksXG5cblx0a2V5d29yZDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZlcnRbdGhpcy5tb2RlbF0ua2V5d29yZCh0aGlzLmNvbG9yKTtcblx0fSxcblxuXHRoZXg6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih2YWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKTtcblx0fSxcblxuXHRyZ2JOdW1iZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRyZXR1cm4gKChyZ2JbMF0gJiAweEZGKSA8PCAxNikgfCAoKHJnYlsxXSAmIDB4RkYpIDw8IDgpIHwgKHJnYlsyXSAmIDB4RkYpO1xuXHR9LFxuXG5cdGx1bWlub3NpdHk6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cblx0XHR2YXIgbHVtID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBjaGFuID0gcmdiW2ldIC8gMjU1O1xuXHRcdFx0bHVtW2ldID0gKGNoYW4gPD0gMC4wMzkyOCkgPyBjaGFuIC8gMTIuOTIgOiBNYXRoLnBvdygoKGNoYW4gKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDAuMjEyNiAqIGx1bVswXSArIDAuNzE1MiAqIGx1bVsxXSArIDAuMDcyMiAqIGx1bVsyXTtcblx0fSxcblxuXHRjb250cmFzdDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcblx0XHR2YXIgbHVtMSA9IHRoaXMubHVtaW5vc2l0eSgpO1xuXHRcdHZhciBsdW0yID0gY29sb3IyLmx1bWlub3NpdHkoKTtcblxuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobHVtMiArIDAuMDUpIC8gKGx1bTEgKyAwLjA1KTtcblx0fSxcblxuXHRsZXZlbDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdHZhciBjb250cmFzdFJhdGlvID0gdGhpcy5jb250cmFzdChjb2xvcjIpO1xuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcuMSkge1xuXHRcdFx0cmV0dXJuICdBQUEnO1xuXHRcdH1cblxuXHRcdHJldHVybiAoY29udHJhc3RSYXRpbyA+PSA0LjUpID8gJ0FBJyA6ICcnO1xuXHR9LFxuXG5cdGlzRGFyazogZnVuY3Rpb24gKCkge1xuXHRcdC8vIFlJUSBlcXVhdGlvbiBmcm9tIGh0dHA6Ly8yNHdheXMub3JnLzIwMTAvY2FsY3VsYXRpbmctY29sb3ItY29udHJhc3Rcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgeWlxID0gKHJnYlswXSAqIDI5OSArIHJnYlsxXSAqIDU4NyArIHJnYlsyXSAqIDExNCkgLyAxMDAwO1xuXHRcdHJldHVybiB5aXEgPCAxMjg7XG5cdH0sXG5cblx0aXNMaWdodDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAhdGhpcy5pc0RhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiLmNvbG9yW2ldID0gMjU1IC0gcmdiLmNvbG9yW2ldO1xuXHRcdH1cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdGxpZ2h0ZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSArPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRhcmtlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdIC09IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0c2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSArPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRlc2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSAtPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHdoaXRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzFdICs9IGh3Yi5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0YmxhY2tlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzJdICs9IGh3Yi5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0Z3JheXNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmF5c2NhbGUjQ29udmVydGluZ19jb2xvcl90b19ncmF5c2NhbGVcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgdmFsID0gcmdiWzBdICogMC4zICsgcmdiWzFdICogMC41OSArIHJnYlsyXSAqIDAuMTE7XG5cdFx0cmV0dXJuIENvbG9yLnJnYih2YWwsIHZhbCwgdmFsKTtcblx0fSxcblxuXHRmYWRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSAtICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0b3BhcXVlcjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgKyAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdHJvdGF0ZTogZnVuY3Rpb24gKGRlZ3JlZXMpIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHR2YXIgaHVlID0gaHNsLmNvbG9yWzBdO1xuXHRcdGh1ZSA9IChodWUgKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRodWUgPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdGhzbC5jb2xvclswXSA9IGh1ZTtcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdG1peDogZnVuY3Rpb24gKG1peGluQ29sb3IsIHdlaWdodCkge1xuXHRcdC8vIHBvcnRlZCBmcm9tIHNhc3MgaW1wbGVtZW50YXRpb24gaW4gQ1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL2xpYnNhc3MvYmxvYi8wZTZiNGEyODUwMDkyMzU2YWEzZWNlMDdjNmIyNDlmMDIyMWNhY2VkL2Z1bmN0aW9ucy5jcHAjTDIwOVxuXHRcdGlmICghbWl4aW5Db2xvciB8fCAhbWl4aW5Db2xvci5yZ2IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdG8gXCJtaXhcIiB3YXMgbm90IGEgQ29sb3IgaW5zdGFuY2UsIGJ1dCByYXRoZXIgYW4gaW5zdGFuY2Ugb2YgJyArIHR5cGVvZiBtaXhpbkNvbG9yKTtcblx0XHR9XG5cdFx0dmFyIGNvbG9yMSA9IG1peGluQ29sb3IucmdiKCk7XG5cdFx0dmFyIGNvbG9yMiA9IHRoaXMucmdiKCk7XG5cdFx0dmFyIHAgPSB3ZWlnaHQgPT09IHVuZGVmaW5lZCA/IDAuNSA6IHdlaWdodDtcblxuXHRcdHZhciB3ID0gMiAqIHAgLSAxO1xuXHRcdHZhciBhID0gY29sb3IxLmFscGhhKCkgLSBjb2xvcjIuYWxwaGEoKTtcblxuXHRcdHZhciB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMi4wO1xuXHRcdHZhciB3MiA9IDEgLSB3MTtcblxuXHRcdHJldHVybiBDb2xvci5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKCksXG5cdFx0XHRcdGNvbG9yMS5hbHBoYSgpICogcCArIGNvbG9yMi5hbHBoYSgpICogKDEgLSBwKSk7XG5cdH1cbn07XG5cbi8vIG1vZGVsIGNvbnZlcnNpb24gbWV0aG9kcyBhbmQgc3RhdGljIGNvbnN0cnVjdG9yc1xuT2JqZWN0LmtleXMoY29udmVydCkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcblx0aWYgKHNraXBwZWRNb2RlbHMuaW5kZXhPZihtb2RlbCkgIT09IC0xKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cblx0Ly8gY29udmVyc2lvbiBtZXRob2RzXG5cdENvbG9yLnByb3RvdHlwZVttb2RlbF0gPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwgPT09IG1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMpO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKGFyZ3VtZW50cywgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBuZXdBbHBoYSA9IHR5cGVvZiBhcmd1bWVudHNbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IGNoYW5uZWxzIDogdGhpcy52YWxwaGE7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihhc3NlcnRBcnJheShjb252ZXJ0W3RoaXMubW9kZWxdW21vZGVsXS5yYXcodGhpcy5jb2xvcikpLmNvbmNhdChuZXdBbHBoYSksIG1vZGVsKTtcblx0fTtcblxuXHQvLyAnc3RhdGljJyBjb25zdHJ1Y3Rpb24gbWV0aG9kc1xuXHRDb2xvclttb2RlbF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcblx0XHRpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29sb3IgPSB6ZXJvQXJyYXkoX3NsaWNlLmNhbGwoYXJndW1lbnRzKSwgY2hhbm5lbHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbG9yKGNvbG9yLCBtb2RlbCk7XG5cdH07XG59KTtcblxuZnVuY3Rpb24gcm91bmRUbyhudW0sIHBsYWNlcykge1xuXHRyZXR1cm4gTnVtYmVyKG51bS50b0ZpeGVkKHBsYWNlcykpO1xufVxuXG5mdW5jdGlvbiByb3VuZFRvUGxhY2UocGxhY2VzKSB7XG5cdHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG5cdFx0cmV0dXJuIHJvdW5kVG8obnVtLCBwbGFjZXMpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRzZXQobW9kZWwsIGNoYW5uZWwsIG1vZGlmaWVyKSB7XG5cdG1vZGVsID0gQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbCA6IFttb2RlbF07XG5cblx0bW9kZWwuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuXHRcdChsaW1pdGVyc1ttXSB8fCAobGltaXRlcnNbbV0gPSBbXSkpW2NoYW5uZWxdID0gbW9kaWZpZXI7XG5cdH0pO1xuXG5cdG1vZGVsID0gbW9kZWxbMF07XG5cblx0cmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcblx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0XHR2YWwgPSBtb2RpZmllcih2YWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpO1xuXHRcdFx0cmVzdWx0LmNvbG9yW2NoYW5uZWxdID0gdmFsO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpLmNvbG9yW2NoYW5uZWxdO1xuXHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0cmVzdWx0ID0gbW9kaWZpZXIocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXhmbihtYXgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh2KSB7XG5cdFx0cmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgdikpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRBcnJheSh2YWwpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xufVxuXG5mdW5jdGlvbiB6ZXJvQXJyYXkoYXJyLCBsZW5ndGgpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgYXJyW2ldICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YXJyW2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xuIiwiLyohXG4gKiBjb29raWVcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLWNvbnRlbnQgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLWNvbnRlbnQgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiBmaWVsZC12Y2hhciAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqL1xuXG52YXIgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5cbi8qKlxuICogUGFyc2UgYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge31cbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcblxuICB2YXIgaW5kZXggPSAwXG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZXFJZHggPSBzdHIuaW5kZXhPZignPScsIGluZGV4KVxuXG4gICAgLy8gbm8gbW9yZSBjb29raWUgcGFpcnNcbiAgICBpZiAoZXFJZHggPT09IC0xKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHZhciBlbmRJZHggPSBzdHIuaW5kZXhPZignOycsIGluZGV4KVxuXG4gICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgIGVuZElkeCA9IHN0ci5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZignOycsIGVxSWR4IC0gMSkgKyAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKClcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAodW5kZWZpbmVkID09PSBvYmpba2V5XSkge1xuICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpXG5cbiAgICAgIC8vIHF1b3RlZCB2YWx1ZXNcbiAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMHgyMikge1xuICAgICAgICB2YWwgPSB2YWwuc2xpY2UoMSwgLTEpXG4gICAgICB9XG5cbiAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICB9XG5cbiAgICBpbmRleCA9IGVuZElkeCArIDFcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIHRoZSBhIG5hbWUgdmFsdWUgcGFpciBpbnRvIGEgY29va2llIHN0cmluZyBzdWl0YWJsZSBmb3JcbiAqIGh0dHAgaGVhZGVycy4gQW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVkIGNvb2tpZSBwYXJhbWV0ZXJzLlxuICpcbiAqIHNlcmlhbGl6ZSgnZm9vJywgJ2JhcicsIHsgaHR0cE9ubHk6IHRydWUgfSlcbiAqICAgPT4gXCJmb289YmFyOyBodHRwT25seVwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gIHZhciBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZW5jb2RlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBuYW1lIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgdmFsIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciBzdHIgPSBuYW1lICsgJz0nICsgdmFsdWU7XG5cbiAgaWYgKG51bGwgIT0gb3B0Lm1heEFnZSkge1xuICAgIHZhciBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcblxuICAgIGlmIChpc05hTihtYXhBZ2UpIHx8ICFpc0Zpbml0ZShtYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gbWF4QWdlIGlzIGludmFsaWQnKVxuICAgIH1cblxuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIHZhciBleHBpcmVzID0gb3B0LmV4cGlyZXNcblxuICAgIGlmICghaXNEYXRlKGV4cGlyZXMpIHx8IGlzTmFOKGV4cGlyZXMudmFsdWVPZigpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBFeHBpcmVzPScgKyBleHBpcmVzLnRvVVRDU3RyaW5nKClcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQucGFydGl0aW9uZWQpIHtcbiAgICBzdHIgKz0gJzsgUGFydGl0aW9uZWQnXG4gIH1cblxuICBpZiAob3B0LnByaW9yaXR5KSB7XG4gICAgdmFyIHByaW9yaXR5ID0gdHlwZW9mIG9wdC5wcmlvcml0eSA9PT0gJ3N0cmluZydcbiAgICAgID8gb3B0LnByaW9yaXR5LnRvTG93ZXJDYXNlKClcbiAgICAgIDogb3B0LnByaW9yaXR5XG5cbiAgICBzd2l0Y2ggKHByaW9yaXR5KSB7XG4gICAgICBjYXNlICdsb3cnOlxuICAgICAgICBzdHIgKz0gJzsgUHJpb3JpdHk9TG93J1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWVkaXVtJzpcbiAgICAgICAgc3RyICs9ICc7IFByaW9yaXR5PU1lZGl1bSdcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2hpZ2gnOlxuICAgICAgICBzdHIgKz0gJzsgUHJpb3JpdHk9SGlnaCdcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwcmlvcml0eSBpcyBpbnZhbGlkJylcbiAgICB9XG4gIH1cblxuICBpZiAob3B0LnNhbWVTaXRlKSB7XG4gICAgdmFyIHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gb3B0LnNhbWVTaXRlLnRvTG93ZXJDYXNlKCkgOiBvcHQuc2FtZVNpdGU7XG5cbiAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xheCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1MYXgnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmljdCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9Tm9uZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIFVSTC1kZWNvZGUgc3RyaW5nIHZhbHVlLiBPcHRpbWl6ZWQgdG8gc2tpcCBuYXRpdmUgY2FsbCB3aGVuIG5vICUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGUgKHN0cikge1xuICByZXR1cm4gc3RyLmluZGV4T2YoJyUnKSAhPT0gLTFcbiAgICA/IGRlY29kZVVSSUNvbXBvbmVudChzdHIpXG4gICAgOiBzdHJcbn1cblxuLyoqXG4gKiBVUkwtZW5jb2RlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZW5jb2RlICh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHZhbHVlIGlzIGEgRGF0ZS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbFxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0RhdGUgKHZhbCkge1xuICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJyB8fFxuICAgIHZhbCBpbnN0YW5jZW9mIERhdGVcbn1cblxuLyoqXG4gKiBUcnkgZGVjb2RpbmcgYSBzdHJpbmcgdXNpbmcgYSBkZWNvZGluZyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkZWNvZGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ5RGVjb2RlKHN0ciwgZGVjb2RlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibGF5b3V0LWJhc2VcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wibGF5b3V0LWJhc2VcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY29zZUJhc2VcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJsYXlvdXQtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY29zZUJhc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJsYXlvdXRCYXNlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzU1MV9fKSB7XG5yZXR1cm4gLyoqKioqKi8gKCgpID0+IHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHRcInVzZSBzdHJpY3RcIjtcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA0NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBjb3NlQmFzZSA9IHt9O1xuXG5jb3NlQmFzZS5sYXlvdXRCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpO1xuY29zZUJhc2UuQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbmNvc2VCYXNlLkNvU0VFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjcpO1xuY29zZUJhc2UuQ29TRUdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODApO1xuY29zZUJhc2UuQ29TRUdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTc4KTtcbmNvc2VCYXNlLkNvU0VMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NSk7XG5jb3NlQmFzZS5Db1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkxKTtcbmNvc2VCYXNlLkNvbnN0cmFpbnRIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvc2VCYXNlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODA2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Q29uc3RhbnRzO1xuXG5mdW5jdGlvbiBDb1NFQ29uc3RhbnRzKCkge31cblxuLy9Db1NFQ29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBGRExheW91dENvbnN0YW50c1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dENvbnN0YW50cykge1xuICBDb1NFQ29uc3RhbnRzW3Byb3BdID0gRkRMYXlvdXRDb25zdGFudHNbcHJvcF07XG59XG5cbkNvU0VDb25zdGFudHMuREVGQVVMVF9VU0VfTVVMVElfTEVWRUxfU0NBTElORyA9IGZhbHNlO1xuQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbkNvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTiA9IDYwO1xuQ29TRUNvbnN0YW50cy5USUxFID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUwgPSAxMDtcbkNvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTCA9IDEwO1xuQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gdHJ1ZTsgLy8gdGhpcyBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGlmIHRoZXJlIHdpbGwgYmUgYSBjb25zdHJhaW50XG4vLyBUaGlzIGNvbnN0YW50IGlzIGZvciBkaWZmZXJlbnRpYXRpbmcgd2hldGhlciBhY3R1YWwgbGF5b3V0IGFsZ29yaXRobSB0aGF0IHVzZXMgY29zZS1iYXNlIHdhbnRzIHRvIGFwcGx5IG9ubHkgaW5jcmVtZW50YWwgbGF5b3V0IG9yIFxuLy8gYW4gaW5jcmVtZW50YWwgbGF5b3V0IG9uIHRvcCBvZiBhIHJhbmRvbWl6ZWQgbGF5b3V0LiBJZiBpdCBpcyBvbmx5IGluY3JlbWVudGFsIGxheW91dCwgdGhlbiB0aGlzIGNvbnN0YW50IHNob3VsZCBiZSB0cnVlLlxuQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VDb25zdGFudHM7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3Njc6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0RWRnZTtcblxuZnVuY3Rpb24gQ29TRUVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIEZETGF5b3V0RWRnZS5jYWxsKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSk7XG59XG5cbkNvU0VFZGdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXRFZGdlLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0RWRnZSkge1xuICBDb1NFRWRnZVtwcm9wXSA9IEZETGF5b3V0RWRnZVtwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFRWRnZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDg4MDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoO1xuXG5mdW5jdGlvbiBDb1NFR3JhcGgocGFyZW50LCBncmFwaE1nciwgdkdyYXBoKSB7XG4gIExHcmFwaC5jYWxsKHRoaXMsIHBhcmVudCwgZ3JhcGhNZ3IsIHZHcmFwaCk7XG59XG5cbkNvU0VHcmFwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExHcmFwaC5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGgpIHtcbiAgQ29TRUdyYXBoW3Byb3BdID0gTEdyYXBoW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VHcmFwaDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaE1hbmFnZXI7XG5cbmZ1bmN0aW9uIENvU0VHcmFwaE1hbmFnZXIobGF5b3V0KSB7XG4gIExHcmFwaE1hbmFnZXIuY2FsbCh0aGlzLCBsYXlvdXQpO1xufVxuXG5Db1NFR3JhcGhNYW5hZ2VyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoTWFuYWdlci5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhNYW5hZ2VyKSB7XG4gIENvU0VHcmFwaE1hbmFnZXJbcHJvcF0gPSBMR3JhcGhNYW5hZ2VyW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VHcmFwaE1hbmFnZXI7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NjU6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXQ7XG52YXIgQ29TRUdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTc4KTtcbnZhciBDb1NFR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MCk7XG52YXIgQ29TRU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MSk7XG52YXIgQ29TRUVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2Nyk7XG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbnZhciBDb25zdHJhaW50SGFuZGxlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTAyKTtcbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dENvbnN0YW50cztcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGF5b3V0Q29uc3RhbnRzO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlBvaW50O1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5Qb2ludEQ7XG52YXIgRGltZW5zaW9uRCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5EaW1lbnNpb25EO1xudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MYXlvdXQ7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JbnRlZ2VyO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JR2VvbWV0cnk7XG52YXIgTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaDtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuVHJhbnNmb3JtO1xudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGlua2VkTGlzdDtcblxuZnVuY3Rpb24gQ29TRUxheW91dCgpIHtcbiAgRkRMYXlvdXQuY2FsbCh0aGlzKTtcblxuICB0aGlzLnRvQmVUaWxlZCA9IHt9OyAvLyBNZW1vcml6ZSBpZiBhIG5vZGUgaXMgdG8gYmUgdGlsZWQgb3IgaXMgdGlsZWRcbiAgdGhpcy5jb25zdHJhaW50cyA9IHt9OyAvLyBrZWVwIGxheW91dCBjb25zdHJhaW50c1xufVxuXG5Db1NFTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXQucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dCkge1xuICBDb1NFTGF5b3V0W3Byb3BdID0gRkRMYXlvdXRbcHJvcF07XG59XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdtID0gbmV3IENvU0VHcmFwaE1hbmFnZXIodGhpcyk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG4gIHJldHVybiBnbTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IENvU0VHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld05vZGUgPSBmdW5jdGlvbiAodk5vZGUpIHtcbiAgcmV0dXJuIG5ldyBDb1NFTm9kZSh0aGlzLmdyYXBoTWFuYWdlciwgdk5vZGUpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3RWRnZSA9IGZ1bmN0aW9uICh2RWRnZSkge1xuICByZXR1cm4gbmV3IENvU0VFZGdlKG51bGwsIG51bGwsIHZFZGdlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBGRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIDwgMTApIHtcbiAgICAgIHRoaXMuaWRlYWxFZGdlTGVuZ3RoID0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaWRlYWxFZGdlTGVuZ3RoID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cblxuICAgIHRoaXMudXNlU21hcnRJZGVhbEVkZ2VMZW5ndGhDYWxjdWxhdGlvbiA9IENvU0VDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gICAgdGhpcy5ncmF2aXR5Q29uc3RhbnQgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEg7XG4gICAgdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSDtcbiAgICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gICAgdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG5cbiAgICAvLyB2YXJpYWJsZXMgZm9yIHRyZWUgcmVkdWN0aW9uIHN1cHBvcnRcbiAgICB0aGlzLnBydW5lZE5vZGVzQWxsID0gW107XG4gICAgdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgPSAwO1xuICAgIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zID0gMDtcbiAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzR3Jvd3RoRmluaXNoZWQgPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgQ29TRSByZWxhdGVkIHBhcmFtZXRlcnMgdXNlZCBieSBzcHJpbmcgZW1iZWRkZXIuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0U3ByaW5nRW1iZWRkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIEZETGF5b3V0LnByb3RvdHlwZS5pbml0U3ByaW5nRW1iZWRkZXIuY2FsbCh0aGlzKTtcblxuICAvLyB2YXJpYWJsZXMgZm9yIGNvb2xpbmdcbiAgdGhpcy5jb29saW5nQ3ljbGUgPSAwO1xuICB0aGlzLm1heENvb2xpbmdDeWNsZSA9IHRoaXMubWF4SXRlcmF0aW9ucyAvIEZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRDtcbiAgdGhpcy5maW5hbFRlbXBlcmF0dXJlID0gMC4wNDtcbiAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSAxO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIGlmIChjcmVhdGVCZW5kc0FzTmVlZGVkKSB7XG4gICAgdGhpcy5jcmVhdGVCZW5kcG9pbnRzKCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xuICB9XG5cbiAgdGhpcy5sZXZlbCA9IDA7XG4gIHJldHVybiB0aGlzLmNsYXNzaWNMYXlvdXQoKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsYXNzaWNMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubm9kZXNXaXRoR3Jhdml0eSA9IHRoaXMuY2FsY3VsYXRlTm9kZXNUb0FwcGx5R3Jhdml0YXRpb25UbygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbih0aGlzLm5vZGVzV2l0aEdyYXZpdHkpO1xuICB0aGlzLmNhbGNOb09mQ2hpbGRyZW5Gb3JBbGxOb2RlcygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmNhbGNJbmNsdXNpb25UcmVlRGVwdGhzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB0aGlzLmNhbGNJZGVhbEVkZ2VMZW5ndGhzKCk7XG5cbiAgaWYgKCF0aGlzLmluY3JlbWVudGFsKSB7XG4gICAgdmFyIGZvcmVzdCA9IHRoaXMuZ2V0RmxhdEZvcmVzdCgpO1xuXG4gICAgLy8gVGhlIGdyYXBoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBpcyBmbGF0IGFuZCBhIGZvcmVzdFxuICAgIGlmIChmb3Jlc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFkaWFsbHkoZm9yZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGdyYXBoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBpcyBub3QgZmxhdCBvciBhIGZvcmVzdFxuICAgIGVsc2Uge1xuICAgICAgICAvLyBSZWR1Y2UgdGhlIHRyZWVzIHdoZW4gaW5jcmVtZW50YWwgbW9kZSBpcyBub3QgZW5hYmxlZCBhbmQgZ3JhcGggaXMgbm90IGEgZm9yZXN0IFxuICAgICAgICB0aGlzLnJlZHVjZVRyZWVzKCk7XG4gICAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25Ob2Rlc1JhbmRvbWx5KCk7XG4gICAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKENvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwpIHtcbiAgICAgIC8vIFJlZHVjZSB0aGUgdHJlZXMgaW4gaW5jcmVtZW50YWwgbW9kZSBpZiBvbmx5IHRoaXMgY29uc3RhbnQgaXMgc2V0IHRvIHRydWUgXG4gICAgICB0aGlzLnJlZHVjZVRyZWVzKCk7XG4gICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModGhpcy5jb25zdHJhaW50cykubGVuZ3RoID4gMCkge1xuICAgIENvbnN0cmFpbnRIYW5kbGVyLmhhbmRsZUNvbnN0cmFpbnRzKHRoaXMpO1xuICAgIHRoaXMuaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMoKTtcbiAgfVxuXG4gIHRoaXMuaW5pdFNwcmluZ0VtYmVkZGVyKCk7XG4gIGlmIChDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCkge1xuICAgIHRoaXMucnVuU3ByaW5nRW1iZWRkZXIoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGljayA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50b3RhbEl0ZXJhdGlvbnMrKztcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgPT09IHRoaXMubWF4SXRlcmF0aW9ucyAmJiAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5DT05WRVJHRU5DRV9DSEVDS19QRVJJT0QgPT0gMCAmJiAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5pc0NvbnZlcmdlZCgpKSB7XG4gICAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvb2xpbmdDeWNsZSsrO1xuXG4gICAgaWYgKHRoaXMubGF5b3V0UXVhbGl0eSA9PSAwKSB7XG4gICAgICAvLyBxdWFsaXR5IC0gXCJkcmFmdFwiXG4gICAgICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IHRoaXMuY29vbGluZ0N5Y2xlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sYXlvdXRRdWFsaXR5ID09IDEpIHtcbiAgICAgIC8vIHF1YWxpdHkgLSBcImRlZmF1bHRcIlxuICAgICAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSB0aGlzLmNvb2xpbmdDeWNsZSAvIDM7XG4gICAgfVxuXG4gICAgLy8gY29vbGluZyBzY2hlZHVsZSBpcyBiYXNlZCBvbiBodHRwOi8vd3d3LmJ0bHVrZS5jb20vc2ltYW5mMS5odG1sIC0+IGNvb2xpbmcgc2NoZWR1bGUgM1xuICAgIHRoaXMuY29vbGluZ0ZhY3RvciA9IE1hdGgubWF4KHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgLSBNYXRoLnBvdyh0aGlzLmNvb2xpbmdDeWNsZSwgTWF0aC5sb2coMTAwICogKHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgLSB0aGlzLmZpbmFsVGVtcGVyYXR1cmUpKSAvIE1hdGgubG9nKHRoaXMubWF4Q29vbGluZ0N5Y2xlKSkgLyAxMDAgKiB0aGlzLmNvb2xpbmdBZGp1c3RlciwgdGhpcy5maW5hbFRlbXBlcmF0dXJlKTtcbiAgICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IE1hdGguY2VpbCh0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2QgKiBNYXRoLnNxcnQodGhpcy5jb29saW5nRmFjdG9yKSk7XG4gIH1cbiAgLy8gT3BlcmF0aW9ucyB3aGlsZSB0cmVlIGlzIGdyb3dpbmcgYWdhaW4gXG4gIGlmICh0aGlzLmlzVHJlZUdyb3dpbmcpIHtcbiAgICBpZiAodGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICAgICAgdGhpcy5ncm93VHJlZSh0aGlzLnBydW5lZE5vZGVzQWxsKTtcbiAgICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG5cbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgICAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIC8gMjtlbHNlIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0dyb3d0aEZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMrKztcbiAgfVxuICAvLyBPcGVyYXRpb25zIGFmdGVyIGdyb3d0aCBpcyBmaW5pc2hlZFxuICBpZiAodGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMuaXNDb252ZXJnZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgfVxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgLyAyICogKCgxMDAgLSB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucykgLyAxMDApO2Vsc2UgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAqICgoMTAwIC0gdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMpIC8gMTAwKTtcbiAgICB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucysrO1xuICB9XG5cbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zICUgMTAgPT0gMSAmJiB0aGlzLmlzVHJlZUdyb3dpbmcgfHwgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgJSAxMCA9PSAxICYmIHRoaXMuaXNHcm93dGhGaW5pc2hlZDtcblxuICB0aGlzLnRvdGFsRGlzcGxhY2VtZW50ID0gMDtcbiAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gIHRoaXMuY2FsY1NwcmluZ0ZvcmNlcygpO1xuICB0aGlzLmNhbGNSZXB1bHNpb25Gb3JjZXMoZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpO1xuICB0aGlzLmNhbGNHcmF2aXRhdGlvbmFsRm9yY2VzKCk7XG4gIHRoaXMubW92ZU5vZGVzKCk7XG4gIHRoaXMuYW5pbWF0ZSgpO1xuXG4gIHJldHVybiBmYWxzZTsgLy8gTGF5b3V0IGlzIG5vdCBlbmRlZCB5ZXQgcmV0dXJuIGZhbHNlXG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRQb3NpdGlvbnNEYXRhID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICB2YXIgcERhdGEgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZWN0ID0gYWxsTm9kZXNbaV0ucmVjdDtcbiAgICB2YXIgaWQgPSBhbGxOb2Rlc1tpXS5pZDtcbiAgICBwRGF0YVtpZF0gPSB7XG4gICAgICBpZDogaWQsXG4gICAgICB4OiByZWN0LmdldENlbnRlclgoKSxcbiAgICAgIHk6IHJlY3QuZ2V0Q2VudGVyWSgpLFxuICAgICAgdzogcmVjdC53aWR0aCxcbiAgICAgIGg6IHJlY3QuaGVpZ2h0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBwRGF0YTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJ1blNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2QgPSAyNTtcbiAgdGhpcy5hbmltYXRpb25QZXJpb2QgPSB0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2Q7XG4gIHZhciBsYXlvdXRFbmRlZCA9IGZhbHNlO1xuXG4gIC8vIElmIGFtaW5hdGUgb3B0aW9uIGlzICdkdXJpbmcnIHNpZ25hbCB0aGF0IGxheW91dCBpcyBzdXBwb3NlZCB0byBzdGFydCBpdGVyYXRpbmdcbiAgaWYgKEZETGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPT09ICdkdXJpbmcnKSB7XG4gICAgdGhpcy5lbWl0KCdsYXlvdXRzdGFydGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW1pbmF0ZSBvcHRpb24gaXMgJ2R1cmluZycgdGljaygpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGluZGV4LmpzXG4gICAgd2hpbGUgKCFsYXlvdXRFbmRlZCkge1xuICAgICAgbGF5b3V0RW5kZWQgPSB0aGlzLnRpY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgfVxufTtcblxuLy8gb3ZlcnJpZGVzIG1vdmVOb2RlcyBtZXRob2QgaW4gRkRMYXlvdXRcbkNvU0VMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgLy8gY2FsY3VsYXRlIGRpc3BsYWNlbWVudCBmb3IgZWFjaCBub2RlIFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBsTm9kZXNbaV07XG4gICAgbm9kZS5jYWxjdWxhdGVEaXNwbGFjZW1lbnQoKTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy51cGRhdGVEaXNwbGFjZW1lbnRzKCk7XG4gIH1cblxuICAvLyBtb3ZlIGVhY2ggbm9kZVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBsTm9kZXNbaV07XG4gICAgbm9kZS5tb3ZlKCk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cmFpbnQgcmVsYXRlZCBtZXRob2RzOiBpbml0Q29uc3RyYWludFZhcmlhYmxlcyBhbmQgdXBkYXRlRGlzcGxhY2VtZW50c1xuXG4vLyBpbml0aWFsaXplIGNvbnN0cmFpbnQgcmVsYXRlZCB2YXJpYWJsZXNcbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRDb25zdHJhaW50VmFyaWFibGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuaWRUb05vZGVNYXAgPSBuZXcgTWFwKCk7XG4gIHRoaXMuZml4ZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG5cbiAgLy8gZmlsbCBpZFRvTm9kZU1hcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICB0aGlzLmlkVG9Ob2RlTWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSBmaXhlZCBub2RlIHdlaWdodCBmb3IgZ2l2ZW4gY29tcG91bmQgbm9kZVxuICB2YXIgY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQgPSBmdW5jdGlvbiBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChjb21wb3VuZE5vZGUpIHtcbiAgICB2YXIgbm9kZXMgPSBjb21wb3VuZE5vZGUuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICAgIHZhciBub2RlO1xuICAgIHZhciBmaXhlZE5vZGVXZWlnaHQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgICAgZml4ZWROb2RlV2VpZ2h0ICs9IDEwMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZml4ZWROb2RlV2VpZ2h0ICs9IGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZml4ZWROb2RlV2VpZ2h0O1xuICB9O1xuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICAvLyBmaWxsIGZpeGVkTm9kZVNldFxuICAgIHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgc2VsZi5maXhlZE5vZGVTZXQuYWRkKG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgfSk7XG5cbiAgICAvLyBhc3NpZ24gZml4ZWQgbm9kZSB3ZWlnaHRzIHRvIGNvbXBvdW5kcyBpZiB0aGV5IGNvbnRhaW4gZml4ZWQgbm9kZXNcbiAgICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICAgIHZhciBub2RlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBmaXhlZE5vZGVXZWlnaHQgPSBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChub2RlKTtcbiAgICAgICAgaWYgKGZpeGVkTm9kZVdlaWdodCA+IDApIHtcbiAgICAgICAgICBub2RlLmZpeGVkTm9kZVdlaWdodCA9IGZpeGVkTm9kZVdlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIHZhciBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHZhciBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZml4ZWROb2Rlc09uSG9yaXpvbnRhbCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmZpeGVkTm9kZXNPblZlcnRpY2FsID0gbmV3IFNldCgpO1xuXG4gICAgLy8gZmlsbCBtYXBzIGFuZCBzZXRzXG4gICAgdGhpcy5maXhlZE5vZGVTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKG5vZGVJZCk7XG4gICAgICBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChub2RlSWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgdmVydGljYWxBbGlnbm1lbnQgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljYWxBbGlnbm1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIGksIFtdKTtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudFtpXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIGkpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbm1lbnQgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3Jpem9udGFsQWxpZ25tZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIGksIFtdKTtcbiAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50W2ldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIGkpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTKSB7XG5cbiAgICAgIHRoaXMuc2h1ZmZsZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgaiwgeCwgaTtcbiAgICAgICAgZm9yIChpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAyICogYXJyYXkubGVuZ3RoIC8gMzsgaS0tKSB7XG4gICAgICAgICAgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIHggPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwgPSBbXTtcbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwgPSBbXTtcbiAgICAgIHRoaXMubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsID0gbmV3IE1hcCgpO1xuXG4gICAgICAvLyBmaWxsIGFycmF5cyBhbmQgbWFwc1xuICAgICAgdGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgdmFyIG5vZGVJZExlZnQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmxlZnQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5sZWZ0KSA6IGNvbnN0cmFpbnQubGVmdDtcbiAgICAgICAgICB2YXIgbm9kZUlkUmlnaHQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnJpZ2h0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIDogY29uc3RyYWludC5yaWdodDtcblxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmluY2x1ZGVzKG5vZGVJZExlZnQpKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwucHVzaChub2RlSWRMZWZ0KTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkTGVmdCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZExlZnQpWzBdKS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRMZWZ0KS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5pbmNsdWRlcyhub2RlSWRSaWdodCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5wdXNoKG5vZGVJZFJpZ2h0KTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZFJpZ2h0KSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZFJpZ2h0KVswXSkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZFJpZ2h0KS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkTGVmdCkucHVzaCh7IHJpZ2h0OiBub2RlSWRSaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZFJpZ2h0KS5wdXNoKHsgbGVmdDogbm9kZUlkTGVmdCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbm9kZUlkVG9wID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnRvcCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQudG9wKSA6IGNvbnN0cmFpbnQudG9wO1xuICAgICAgICAgIHZhciBub2RlSWRCb3R0b20gPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5ib3R0b20pIDogY29uc3RyYWludC5ib3R0b207XG5cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwuaW5jbHVkZXMobm9kZUlkVG9wKSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5wdXNoKG5vZGVJZFRvcCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkVG9wKSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWRUb3ApWzBdKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRUb3ApLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5pbmNsdWRlcyhub2RlSWRCb3R0b20pKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLnB1c2gobm9kZUlkQm90dG9tKTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWRCb3R0b20pKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZEJvdHRvbSlbMF0pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZEJvdHRvbSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkVG9wKS5wdXNoKHsgYm90dG9tOiBub2RlSWRCb3R0b20sIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkQm90dG9tKS5wdXNoKHsgdG9wOiBub2RlSWRUb3AsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3ViR3JhcGhPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7IC8vIHN1YmdyYXBoIGZyb20gdmVydGljYWwgUlAgY29uc3RyYWludHNcbiAgICAgIHZhciBzdWJHcmFwaE9uVmVydGljYWwgPSBuZXcgTWFwKCk7IC8vIHN1YmdyYXBoIGZyb20gdmVydGljYWwgUlAgY29uc3RyYWludHNcblxuICAgICAgLy8gY29uc3RydWN0IHN1YmdyYXBocyBmcm9tIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50cyBcbiAgICAgIHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIHZhciBsZWZ0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5sZWZ0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQubGVmdCkgOiBjb25zdHJhaW50LmxlZnQ7XG4gICAgICAgICAgdmFyIHJpZ2h0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5yaWdodCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnJpZ2h0KSA6IGNvbnN0cmFpbnQucmlnaHQ7XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhsZWZ0KSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KGxlZnQpLnB1c2gocmlnaHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQobGVmdCwgW3JpZ2h0XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMocmlnaHQpKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQocmlnaHQpLnB1c2gobGVmdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChyaWdodCwgW2xlZnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRvcCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC50b3ApID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnRvcCkgOiBjb25zdHJhaW50LnRvcDtcbiAgICAgICAgICB2YXIgYm90dG9tID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmJvdHRvbSkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSA6IGNvbnN0cmFpbnQuYm90dG9tO1xuICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKHRvcCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQodG9wKS5wdXNoKGJvdHRvbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQodG9wLCBbYm90dG9tXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKGJvdHRvbSkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQoYm90dG9tKS5wdXNoKHRvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQoYm90dG9tLCBbdG9wXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZnVuY3Rpb24gdG8gY29uc3RydWN0IGNvbXBvbmVudHMgZnJvbSBhIGdpdmVuIGdyYXBoIFxuICAgICAgLy8gYWxzbyByZXR1cm5zIGFuIGFycmF5IHRoYXQga2VlcHMgd2hldGhlciBlYWNoIGNvbXBvbmVudCBjb250YWlucyBmaXhlZCBub2RlXG4gICAgICB2YXIgY29uc3RydWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIGNvbnN0cnVjdENvbXBvbmVudHMoZ3JhcGgsIGZpeGVkTm9kZXMpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdmFyIGlzRml4ZWQgPSBbXTtcbiAgICAgICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICAgICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0gPSBbXTtcbiAgICAgICAgICAgIGlzRml4ZWRbY291bnRdID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgY3VycmVudE5vZGUgPSBrZXk7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaXNGaXhlZFtjb3VudF0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IGNvbXBvbmVudHM6IGNvbXBvbmVudHMsIGlzRml4ZWQ6IGlzRml4ZWQgfTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZXN1bHRPbkhvcml6b250YWwgPSBjb25zdHJ1Y3RDb21wb25lbnRzKHN1YkdyYXBoT25Ib3Jpem9udGFsLCBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwpO1xuICAgICAgdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsID0gcmVzdWx0T25Ib3Jpem9udGFsLmNvbXBvbmVudHM7XG4gICAgICB0aGlzLmZpeGVkQ29tcG9uZW50c09uSG9yaXpvbnRhbCA9IHJlc3VsdE9uSG9yaXpvbnRhbC5pc0ZpeGVkO1xuICAgICAgdmFyIHJlc3VsdE9uVmVydGljYWwgPSBjb25zdHJ1Y3RDb21wb25lbnRzKHN1YkdyYXBoT25WZXJ0aWNhbCwgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsID0gcmVzdWx0T25WZXJ0aWNhbC5jb21wb25lbnRzO1xuICAgICAgdGhpcy5maXhlZENvbXBvbmVudHNPblZlcnRpY2FsID0gcmVzdWx0T25WZXJ0aWNhbC5pc0ZpeGVkO1xuICAgIH1cbiAgfVxufTtcblxuLy8gdXBkYXRlcyBub2RlIGRpc3BsYWNlbWVudHMgYmFzZWQgb24gY29uc3RyYWludHNcbkNvU0VMYXlvdXQucHJvdG90eXBlLnVwZGF0ZURpc3BsYWNlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgdmFyIGZpeGVkTm9kZSA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgICBmaXhlZE5vZGUuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICBmaXhlZE5vZGUuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgdmFyIGFsbFZlcnRpY2FsQWxpZ25tZW50cyA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b3RhbERpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmZpeGVkTm9kZVNldC5oYXMoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKSkge1xuICAgICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFggKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50WCA9IHRvdGFsRGlzcGxhY2VtZW50WCAvIGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudFg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICB2YXIgYWxsSG9yaXpvbnRhbEFsaWdubWVudHMgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRvdGFsRGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5maXhlZE5vZGVTZXQuaGFzKGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKSkge1xuICAgICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFkgKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnRZID0gdG90YWxEaXNwbGFjZW1lbnRZIC8gYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50WTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuXG4gICAgaWYgKENvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMpIHtcbiAgICAgIC8vIHNodWZmbGUgYXJyYXkgdG8gcmFuZG9taXplIG5vZGUgcHJvY2Vzc2luZyBvcmRlclxuICAgICAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgICB0aGlzLnNodWZmbGUodGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsKTtcbiAgICAgICAgdGhpcy5zaHVmZmxlKHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgIGlmICghc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgdmFyIGRpc3BsYWNlbWVudCA9IDA7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpWzBdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5yaWdodCkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoY29uc3RyYWludC5yaWdodCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgLSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgLT0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoY29uc3RyYWludC5sZWZ0KSArIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCArPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZCwgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpICsgZGlzcGxhY2VtZW50KTtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICB2YXIgZGlzcGxhY2VtZW50ID0gMDtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpWzBdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYm90dG9tKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoY29uc3RyYWludC5ib3R0b20pIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSAtIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCAtPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGNvbnN0cmFpbnQudG9wKSArIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCArPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWQsIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgKyBkaXNwbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbFtpXTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWRDb21wb25lbnRzT25Ib3Jpem9udGFsW2ldKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB2YXIgYWN0dWFsTm9kZXMgPSB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSk7XG4gICAgICAgICAgICAgIHN1bSArPSBhY3R1YWxOb2Rlcy5sZW5ndGggKiB0aGlzLmlkVG9Ob2RlTWFwLmdldChhY3R1YWxOb2Rlc1swXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICAgICAgY291bnQgKz0gYWN0dWFsTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VtICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnQgPSBzdW0gLyBjb3VudDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50c09uVmVydGljYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c09uVmVydGljYWxbaV07XG4gICAgICAgIGlmICh0aGlzLmZpeGVkQ29tcG9uZW50c09uVmVydGljYWxbaV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHZhciBhY3R1YWxOb2RlcyA9IHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pO1xuICAgICAgICAgICAgICBzdW0gKz0gYWN0dWFsTm9kZXMubGVuZ3RoICogdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWN0dWFsTm9kZXNbMF0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgICAgIGNvdW50ICs9IGFjdHVhbE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1bSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50ID0gc3VtIC8gY291bnQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjdWxhdGVOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvblRvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgdmFyIGdyYXBoO1xuXG4gIHZhciBncmFwaHMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRHcmFwaHMoKTtcbiAgdmFyIHNpemUgPSBncmFwaHMubGVuZ3RoO1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGdyYXBoID0gZ3JhcGhzW2ldO1xuXG4gICAgZ3JhcGgudXBkYXRlQ29ubmVjdGVkKCk7XG5cbiAgICBpZiAoIWdyYXBoLmlzQ29ubmVjdGVkKSB7XG4gICAgICBub2RlTGlzdCA9IG5vZGVMaXN0LmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZUxpc3Q7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgZWRnZXMgPSBlZGdlcy5jb25jYXQodGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKSk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcblxuICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZSkpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdmFyIHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7XG5cbiAgICAgIGlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7XG4gICAgICAgIGVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgZWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICB0aGlzLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzKGVkZ2UpO1xuICAgICAgICB2aXNpdGVkLmFkZChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlZGdlTGlzdCA9IFtdO1xuXG4gICAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KHNvdXJjZS5nZXRFZGdlTGlzdFRvTm9kZSh0YXJnZXQpKTtcbiAgICAgICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQodGFyZ2V0LmdldEVkZ2VMaXN0VG9Ob2RlKHNvdXJjZSkpO1xuXG4gICAgICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZUxpc3RbMF0pKSB7XG4gICAgICAgICAgaWYgKGVkZ2VMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGVkZ2VMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgIHZhciBtdWx0aUVkZ2UgPSBlZGdlTGlzdFtrXTtcbiAgICAgICAgICAgICAgbXVsdGlFZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRHVtbXlOb2Rlc0ZvckJlbmRwb2ludHMobXVsdGlFZGdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWRnZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQoZWRnZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlzaXRlZC5zaXplID09IGVkZ2VzLmxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFkaWFsbHkgPSBmdW5jdGlvbiAoZm9yZXN0KSB7XG4gIC8vIFdlIHRpbGUgdGhlIHRyZWVzIHRvIGEgZ3JpZCByb3cgYnkgcm93OyBmaXJzdCB0cmVlIHN0YXJ0cyBhdCAoMCwwKVxuICB2YXIgY3VycmVudFN0YXJ0aW5nUG9pbnQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gIHZhciBudW1iZXJPZkNvbHVtbnMgPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KGZvcmVzdC5sZW5ndGgpKTtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIHZhciBjdXJyZW50WSA9IDA7XG4gIHZhciBjdXJyZW50WCA9IDA7XG4gIHZhciBwb2ludCA9IG5ldyBQb2ludEQoMCwgMCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSAlIG51bWJlck9mQ29sdW1ucyA9PSAwKSB7XG4gICAgICAvLyBTdGFydCBvZiBhIG5ldyByb3csIG1ha2UgdGhlIHggY29vcmRpbmF0ZSAwLCBpbmNyZW1lbnQgdGhlXG4gICAgICAvLyB5IGNvb3JkaW5hdGUgd2l0aCB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcHJldmlvdXMgcm93XG4gICAgICBjdXJyZW50WCA9IDA7XG4gICAgICBjdXJyZW50WSA9IGhlaWdodDtcblxuICAgICAgaWYgKGkgIT0gMCkge1xuICAgICAgICBjdXJyZW50WSArPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT047XG4gICAgICB9XG5cbiAgICAgIGhlaWdodCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHRyZWUgPSBmb3Jlc3RbaV07XG5cbiAgICAvLyBGaW5kIHRoZSBjZW50ZXIgb2YgdGhlIHRyZWVcbiAgICB2YXIgY2VudGVyTm9kZSA9IExheW91dC5maW5kQ2VudGVyT2ZUcmVlKHRyZWUpO1xuXG4gICAgLy8gU2V0IHRoZSBzdGFyaW5nIHBvaW50IG9mIHRoZSBuZXh0IHRyZWVcbiAgICBjdXJyZW50U3RhcnRpbmdQb2ludC54ID0gY3VycmVudFg7XG4gICAgY3VycmVudFN0YXJ0aW5nUG9pbnQueSA9IGN1cnJlbnRZO1xuXG4gICAgLy8gRG8gYSByYWRpYWwgbGF5b3V0IHN0YXJ0aW5nIHdpdGggdGhlIGNlbnRlclxuICAgIHBvaW50ID0gQ29TRUxheW91dC5yYWRpYWxMYXlvdXQodHJlZSwgY2VudGVyTm9kZSwgY3VycmVudFN0YXJ0aW5nUG9pbnQpO1xuXG4gICAgaWYgKHBvaW50LnkgPiBoZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IocG9pbnQueSk7XG4gICAgfVxuXG4gICAgY3VycmVudFggPSBNYXRoLmZsb29yKHBvaW50LnggKyBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT04pO1xuICB9XG5cbiAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RChMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1ggLSBwb2ludC54IC8gMiwgTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9ZIC0gcG9pbnQueSAvIDIpKTtcbn07XG5cbkNvU0VMYXlvdXQucmFkaWFsTGF5b3V0ID0gZnVuY3Rpb24gKHRyZWUsIGNlbnRlck5vZGUsIHN0YXJ0aW5nUG9pbnQpIHtcbiAgdmFyIHJhZGlhbFNlcCA9IE1hdGgubWF4KHRoaXMubWF4RGlhZ29uYWxJblRyZWUodHJlZSksIENvU0VDb25zdGFudHMuREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTik7XG4gIENvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0KGNlbnRlck5vZGUsIG51bGwsIDAsIDM1OSwgMCwgcmFkaWFsU2VwKTtcbiAgdmFyIGJvdW5kcyA9IExHcmFwaC5jYWxjdWxhdGVCb3VuZHModHJlZSk7XG5cbiAgdmFyIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgdHJhbnNmb3JtLnNldERldmljZU9yZ1goYm91bmRzLmdldE1pblgoKSk7XG4gIHRyYW5zZm9ybS5zZXREZXZpY2VPcmdZKGJvdW5kcy5nZXRNaW5ZKCkpO1xuICB0cmFuc2Zvcm0uc2V0V29ybGRPcmdYKHN0YXJ0aW5nUG9pbnQueCk7XG4gIHRyYW5zZm9ybS5zZXRXb3JsZE9yZ1koc3RhcnRpbmdQb2ludC55KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHRyZWVbaV07XG4gICAgbm9kZS50cmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgfVxuXG4gIHZhciBib3R0b21SaWdodCA9IG5ldyBQb2ludEQoYm91bmRzLmdldE1heFgoKSwgYm91bmRzLmdldE1heFkoKSk7XG5cbiAgcmV0dXJuIHRyYW5zZm9ybS5pbnZlcnNlVHJhbnNmb3JtUG9pbnQoYm90dG9tUmlnaHQpO1xufTtcblxuQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50T2ZOb2RlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgZGlzdGFuY2UsIHJhZGlhbFNlcGFyYXRpb24pIHtcbiAgLy8gRmlyc3QsIHBvc2l0aW9uIHRoaXMgbm9kZSBieSBmaW5kaW5nIGl0cyBhbmdsZS5cbiAgdmFyIGhhbGZJbnRlcnZhbCA9IChlbmRBbmdsZSAtIHN0YXJ0QW5nbGUgKyAxKSAvIDI7XG5cbiAgaWYgKGhhbGZJbnRlcnZhbCA8IDApIHtcbiAgICBoYWxmSW50ZXJ2YWwgKz0gMTgwO1xuICB9XG5cbiAgdmFyIG5vZGVBbmdsZSA9IChoYWxmSW50ZXJ2YWwgKyBzdGFydEFuZ2xlKSAlIDM2MDtcbiAgdmFyIHRldGEgPSBub2RlQW5nbGUgKiBJR2VvbWV0cnkuVFdPX1BJIC8gMzYwO1xuXG4gIC8vIE1ha2UgcG9sYXIgdG8gamF2YSBjb3JkaW5hdGUgY29udmVyc2lvbi5cbiAgdmFyIGNvc190ZXRhID0gTWF0aC5jb3ModGV0YSk7XG4gIHZhciB4XyA9IGRpc3RhbmNlICogTWF0aC5jb3ModGV0YSk7XG4gIHZhciB5XyA9IGRpc3RhbmNlICogTWF0aC5zaW4odGV0YSk7XG5cbiAgbm9kZS5zZXRDZW50ZXIoeF8sIHlfKTtcblxuICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZSBhbmQgcmVjdXJzaXZlbHkgY2FsbCB0aGlzXG4gIC8vIGZ1bmN0aW9uLlxuICB2YXIgbmVpZ2hib3JFZGdlcyA9IFtdO1xuICBuZWlnaGJvckVkZ2VzID0gbmVpZ2hib3JFZGdlcy5jb25jYXQobm9kZS5nZXRFZGdlcygpKTtcbiAgdmFyIGNoaWxkQ291bnQgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcblxuICBpZiAocGFyZW50T2ZOb2RlICE9IG51bGwpIHtcbiAgICBjaGlsZENvdW50LS07XG4gIH1cblxuICB2YXIgYnJhbmNoQ291bnQgPSAwO1xuXG4gIHZhciBpbmNFZGdlc0NvdW50ID0gbmVpZ2hib3JFZGdlcy5sZW5ndGg7XG4gIHZhciBzdGFydEluZGV4O1xuXG4gIHZhciBlZGdlcyA9IG5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHBhcmVudE9mTm9kZSk7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVkZ2VzLCBwcnVuZSB0aGVtIHVudGlsIHRoZXJlIHJlbWFpbnMgb25seSBvbmVcbiAgLy8gZWRnZS5cbiAgd2hpbGUgKGVkZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAvL25laWdoYm9yRWRnZXMucmVtb3ZlKGVkZ2VzLnJlbW92ZSgwKSk7XG4gICAgdmFyIHRlbXAgPSBlZGdlc1swXTtcbiAgICBlZGdlcy5zcGxpY2UoMCwgMSk7XG4gICAgdmFyIGluZGV4ID0gbmVpZ2hib3JFZGdlcy5pbmRleE9mKHRlbXApO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBuZWlnaGJvckVkZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGluY0VkZ2VzQ291bnQtLTtcbiAgICBjaGlsZENvdW50LS07XG4gIH1cblxuICBpZiAocGFyZW50T2ZOb2RlICE9IG51bGwpIHtcbiAgICAvL2Fzc2VydCBlZGdlcy5sZW5ndGggPT0gMTtcbiAgICBzdGFydEluZGV4ID0gKG5laWdoYm9yRWRnZXMuaW5kZXhPZihlZGdlc1swXSkgKyAxKSAlIGluY0VkZ2VzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRJbmRleCA9IDA7XG4gIH1cblxuICB2YXIgc3RlcEFuZ2xlID0gTWF0aC5hYnMoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSAvIGNoaWxkQ291bnQ7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGJyYW5jaENvdW50ICE9IGNoaWxkQ291bnQ7IGkgPSArK2kgJSBpbmNFZGdlc0NvdW50KSB7XG4gICAgdmFyIGN1cnJlbnROZWlnaGJvciA9IG5laWdoYm9yRWRnZXNbaV0uZ2V0T3RoZXJFbmQobm9kZSk7XG5cbiAgICAvLyBEb24ndCBiYWNrIHRyYXZlcnNlIHRvIHJvb3Qgbm9kZSBpbiBjdXJyZW50IHRyZWUuXG4gICAgaWYgKGN1cnJlbnROZWlnaGJvciA9PSBwYXJlbnRPZk5vZGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjaGlsZFN0YXJ0QW5nbGUgPSAoc3RhcnRBbmdsZSArIGJyYW5jaENvdW50ICogc3RlcEFuZ2xlKSAlIDM2MDtcbiAgICB2YXIgY2hpbGRFbmRBbmdsZSA9IChjaGlsZFN0YXJ0QW5nbGUgKyBzdGVwQW5nbGUpICUgMzYwO1xuXG4gICAgQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQoY3VycmVudE5laWdoYm9yLCBub2RlLCBjaGlsZFN0YXJ0QW5nbGUsIGNoaWxkRW5kQW5nbGUsIGRpc3RhbmNlICsgcmFkaWFsU2VwYXJhdGlvbiwgcmFkaWFsU2VwYXJhdGlvbik7XG5cbiAgICBicmFuY2hDb3VudCsrO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0Lm1heERpYWdvbmFsSW5UcmVlID0gZnVuY3Rpb24gKHRyZWUpIHtcbiAgdmFyIG1heERpYWdvbmFsID0gSW50ZWdlci5NSU5fVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB0cmVlW2ldO1xuICAgIHZhciBkaWFnb25hbCA9IG5vZGUuZ2V0RGlhZ29uYWwoKTtcblxuICAgIGlmIChkaWFnb25hbCA+IG1heERpYWdvbmFsKSB7XG4gICAgICBtYXhEaWFnb25hbCA9IGRpYWdvbmFsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXhEaWFnb25hbDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGNSZXB1bHNpb25SYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gZm9ybXVsYSBpcyAyIHggKGxldmVsICsgMSkgeCBpZGVhbEVkZ2VMZW5ndGhcbiAgcmV0dXJuIDIgKiAodGhpcy5sZXZlbCArIDEpICogdGhpcy5pZGVhbEVkZ2VMZW5ndGg7XG59O1xuXG4vLyBUaWxpbmcgbWV0aG9kc1xuXG4vLyBHcm91cCB6ZXJvIGRlZ3JlZSBtZW1iZXJzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZCwgY3JlYXRlIGR1bW15IHBhcmVudHMgd2hlcmUgbmVlZGVkIGFuZCBmaWxsIG1lbWJlckdyb3VwcyBieSB0aGVpciBkdW1tcCBwYXJlbnQgaWQnc1xuQ29TRUxheW91dC5wcm90b3R5cGUuZ3JvdXBaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICAvLyBhcnJheSBvZiBbcGFyZW50X2lkIHggb25lRGVncmVlTm9kZV9pZF1cbiAgdmFyIHRlbXBNZW1iZXJHcm91cHMgPSB7fTsgLy8gQSB0ZW1wb3JhcnkgbWFwIG9mIHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVyc1xuICB0aGlzLm1lbWJlckdyb3VwcyA9IHt9OyAvLyBBIG1hcCBvZiBkdW1teSBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIHRoaXMuaWRUb0R1bW15Tm9kZSA9IHt9OyAvLyBBIG1hcCBvZiBpZCB0byBkdW1teSBub2RlIFxuXG4gIHZhciB6ZXJvRGVncmVlID0gW107IC8vIExpc3Qgb2YgemVybyBkZWdyZWUgbm9kZXMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG5cbiAgLy8gRmlsbCB6ZXJvIGRlZ3JlZSBsaXN0XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIHZhciBwYXJlbnQgPSBub2RlLmdldFBhcmVudCgpO1xuICAgIC8vIElmIGEgbm9kZSBoYXMgemVybyBkZWdyZWUgYW5kIGl0cyBwYXJlbnQgaXMgbm90IHRvIGJlIHRpbGVkIGlmIGV4aXN0cyBhZGQgdGhhdCBub2RlIHRvIHplcm9EZWdyZXMgbGlzdFxuICAgIGlmICh0aGlzLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4obm9kZSkgPT09IDAgJiYgKHBhcmVudC5pZCA9PSB1bmRlZmluZWQgfHwgIXRoaXMuZ2V0VG9CZVRpbGVkKHBhcmVudCkpKSB7XG4gICAgICB6ZXJvRGVncmVlLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbWFwIG9mIHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVyc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHplcm9EZWdyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHplcm9EZWdyZWVbaV07IC8vIFplcm8gZGVncmVlIG5vZGUgaXRzZWxmXG4gICAgdmFyIHBfaWQgPSBub2RlLmdldFBhcmVudCgpLmlkOyAvLyBQYXJlbnQgaWRcblxuICAgIGlmICh0eXBlb2YgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9PT0gXCJ1bmRlZmluZWRcIikgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9IFtdO1xuXG4gICAgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF0uY29uY2F0KG5vZGUpOyAvLyBQdXNoIG5vZGUgdG8gdGhlIGxpc3QgYmVsb25ncyB0byBpdHMgcGFyZW50IGluIHRlbXBNZW1iZXJHcm91cHNcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gbm9kZXMgYXQgYSBsZXZlbCwgY3JlYXRlIGEgZHVtbXkgY29tcG91bmQgZm9yIHRoZW1cbiAgT2JqZWN0LmtleXModGVtcE1lbWJlckdyb3VwcykuZm9yRWFjaChmdW5jdGlvbiAocF9pZCkge1xuICAgIGlmICh0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBkdW1teUNvbXBvdW5kSWQgPSBcIkR1bW15Q29tcG91bmRfXCIgKyBwX2lkOyAvLyBUaGUgaWQgb2YgZHVtbXkgY29tcG91bmQgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIHNvb25cbiAgICAgIHNlbGYubWVtYmVyR3JvdXBzW2R1bW15Q29tcG91bmRJZF0gPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdOyAvLyBBZGQgZHVtbXkgY29tcG91bmQgdG8gbWVtYmVyR3JvdXBzXG5cbiAgICAgIHZhciBwYXJlbnQgPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdWzBdLmdldFBhcmVudCgpOyAvLyBUaGUgcGFyZW50IG9mIHplcm8gZGVncmVlIG5vZGVzIHdpbGwgYmUgdGhlIHBhcmVudCBvZiBuZXcgZHVtbXkgY29tcG91bmRcblxuICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgY29tcG91bmQgd2l0aCBjYWxjdWxhdGVkIGlkXG4gICAgICB2YXIgZHVtbXlDb21wb3VuZCA9IG5ldyBDb1NFTm9kZShzZWxmLmdyYXBoTWFuYWdlcik7XG4gICAgICBkdW1teUNvbXBvdW5kLmlkID0gZHVtbXlDb21wb3VuZElkO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nTGVmdCA9IHBhcmVudC5wYWRkaW5nTGVmdCB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nUmlnaHQgPSBwYXJlbnQucGFkZGluZ1JpZ2h0IHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdCb3R0b20gPSBwYXJlbnQucGFkZGluZ0JvdHRvbSB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nVG9wID0gcGFyZW50LnBhZGRpbmdUb3AgfHwgMDtcblxuICAgICAgc2VsZi5pZFRvRHVtbXlOb2RlW2R1bW15Q29tcG91bmRJZF0gPSBkdW1teUNvbXBvdW5kO1xuXG4gICAgICB2YXIgZHVtbXlQYXJlbnRHcmFwaCA9IHNlbGYuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKHNlbGYubmV3R3JhcGgoKSwgZHVtbXlDb21wb3VuZCk7XG4gICAgICB2YXIgcGFyZW50R3JhcGggPSBwYXJlbnQuZ2V0Q2hpbGQoKTtcblxuICAgICAgLy8gQWRkIGR1bW15IGNvbXBvdW5kIHRvIHBhcmVudCB0aGUgZ3JhcGhcbiAgICAgIHBhcmVudEdyYXBoLmFkZChkdW1teUNvbXBvdW5kKTtcblxuICAgICAgLy8gRm9yIGVhY2ggemVybyBkZWdyZWUgbm9kZSBpbiB0aGlzIGxldmVsIHJlbW92ZSBpdCBmcm9tIGl0cyBwYXJlbnQgZ3JhcGggYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGggb2YgZHVtbXkgcGFyZW50XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlbXBNZW1iZXJHcm91cHNbcF9pZF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdW2ldO1xuXG4gICAgICAgIHBhcmVudEdyYXBoLnJlbW92ZShub2RlKTtcbiAgICAgICAgZHVtbXlQYXJlbnRHcmFwaC5hZGQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsZWFyQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2hpbGRHcmFwaE1hcCA9IHt9O1xuICB2YXIgaWRUb05vZGUgPSB7fTtcblxuICAvLyBHZXQgY29tcG91bmQgb3JkZXJpbmcgYnkgZmluZGluZyB0aGUgaW5uZXIgb25lIGZpcnN0XG4gIHRoaXMucGVyZm9ybURGU09uQ29tcG91bmRzKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvdW5kT3JkZXIubGVuZ3RoOyBpKyspIHtcblxuICAgIGlkVG9Ob2RlW3RoaXMuY29tcG91bmRPcmRlcltpXS5pZF0gPSB0aGlzLmNvbXBvdW5kT3JkZXJbaV07XG4gICAgY2hpbGRHcmFwaE1hcFt0aGlzLmNvbXBvdW5kT3JkZXJbaV0uaWRdID0gW10uY29uY2F0KHRoaXMuY29tcG91bmRPcmRlcltpXS5nZXRDaGlsZCgpLmdldE5vZGVzKCkpO1xuXG4gICAgLy8gUmVtb3ZlIGNoaWxkcmVuIG9mIGNvbXBvdW5kc1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlbW92ZSh0aGlzLmNvbXBvdW5kT3JkZXJbaV0uZ2V0Q2hpbGQoKSk7XG4gICAgdGhpcy5jb21wb3VuZE9yZGVyW2ldLmNoaWxkID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcblxuICAvLyBUaWxlIHRoZSByZW1vdmVkIGNoaWxkcmVuXG4gIHRoaXMudGlsZUNvbXBvdW5kTWVtYmVycyhjaGlsZEdyYXBoTWFwLCBpZFRvTm9kZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGVhclplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0aWxlZFplcm9EZWdyZWVQYWNrID0gdGhpcy50aWxlZFplcm9EZWdyZWVQYWNrID0gW107XG5cbiAgT2JqZWN0LmtleXModGhpcy5tZW1iZXJHcm91cHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IHNlbGYuaWRUb0R1bW15Tm9kZVtpZF07IC8vIEdldCB0aGUgZHVtbXkgY29tcG91bmRcblxuICAgIHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdID0gc2VsZi50aWxlTm9kZXMoc2VsZi5tZW1iZXJHcm91cHNbaWRdLCBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQgKyBjb21wb3VuZE5vZGUucGFkZGluZ1JpZ2h0KTtcblxuICAgIC8vIFNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZHVtbXkgY29tcG91bmQgYXMgY2FsY3VsYXRlZFxuICAgIGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoID0gdGlsZWRaZXJvRGVncmVlUGFja1tpZF0ud2lkdGg7XG4gICAgY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0ID0gdGlsZWRaZXJvRGVncmVlUGFja1tpZF0uaGVpZ2h0O1xuICAgIGNvbXBvdW5kTm9kZS5zZXRDZW50ZXIodGlsZWRaZXJvRGVncmVlUGFja1tpZF0uY2VudGVyWCwgdGlsZWRaZXJvRGVncmVlUGFja1tpZF0uY2VudGVyWSk7XG5cbiAgICAvLyBjb21wb3VuZCBsZWZ0IGFuZCB0b3AgbWFyZ2luZ3MgZm9yIGxhYmVsc1xuICAgIC8vIHdoZW4gbm9kZSBsYWJlbHMgYXJlIGluY2x1ZGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJlbG93IGFuZCBhcmUgdXNlZCBpbiB0aWxpbmdQb3N0TGF5b3V0LFxuICAgIC8vIG90aGVyd2lzZSB0aGV5IHN0YXkgYXMgemVyb1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAwO1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IDA7XG5cbiAgICAvLyBVcGRhdGUgY29tcG91bmQgYm91bmRzIGNvbnNpZGVyaW5nIGl0cyBsYWJlbCBwcm9wZXJ0aWVzIGFuZCBzZXQgbGFiZWwgbWFyZ2lucyBmb3IgbGVmdCBhbmQgdG9wXG4gICAgaWYgKENvU0VDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTKSB7XG5cbiAgICAgIHZhciB3aWR0aCA9IGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodDtcblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJ0b3BcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucmVwb3B1bGF0ZUNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IHRoaXMuY29tcG91bmRPcmRlci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsQ29tcG91bmROb2RlID0gdGhpcy5jb21wb3VuZE9yZGVyW2ldO1xuICAgIHZhciBpZCA9IGxDb21wb3VuZE5vZGUuaWQ7XG4gICAgdmFyIGhvcml6b250YWxNYXJnaW4gPSBsQ29tcG91bmROb2RlLnBhZGRpbmdMZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IGxDb21wb3VuZE5vZGUucGFkZGluZ1RvcDtcbiAgICB2YXIgbGFiZWxNYXJnaW5MZWZ0ID0gbENvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQ7XG4gICAgdmFyIGxhYmVsTWFyZ2luVG9wID0gbENvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcDtcblxuICAgIHRoaXMuYWRqdXN0TG9jYXRpb25zKHRoaXMudGlsZWRNZW1iZXJQYWNrW2lkXSwgbENvbXBvdW5kTm9kZS5yZWN0LngsIGxDb21wb3VuZE5vZGUucmVjdC55LCBob3Jpem9udGFsTWFyZ2luLCB2ZXJ0aWNhbE1hcmdpbiwgbGFiZWxNYXJnaW5MZWZ0LCBsYWJlbE1hcmdpblRvcCk7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlcG9wdWxhdGVaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdGlsZWRQYWNrID0gdGhpcy50aWxlZFplcm9EZWdyZWVQYWNrO1xuXG4gIE9iamVjdC5rZXlzKHRpbGVkUGFjaykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgY29tcG91bmROb2RlID0gc2VsZi5pZFRvRHVtbXlOb2RlW2lkXTsgLy8gR2V0IHRoZSBkdW1teSBjb21wb3VuZCBieSBpdHMgaWRcbiAgICB2YXIgaG9yaXpvbnRhbE1hcmdpbiA9IGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdDtcbiAgICB2YXIgdmVydGljYWxNYXJnaW4gPSBjb21wb3VuZE5vZGUucGFkZGluZ1RvcDtcbiAgICB2YXIgbGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdDtcbiAgICB2YXIgbGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3A7XG5cbiAgICAvLyBBZGp1c3QgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyB3cnQgaXRzIGNvbXBvdW5kXG4gICAgc2VsZi5hZGp1c3RMb2NhdGlvbnModGlsZWRQYWNrW2lkXSwgY29tcG91bmROb2RlLnJlY3QueCwgY29tcG91bmROb2RlLnJlY3QueSwgaG9yaXpvbnRhbE1hcmdpbiwgdmVydGljYWxNYXJnaW4sIGxhYmVsTWFyZ2luTGVmdCwgbGFiZWxNYXJnaW5Ub3ApO1xuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFRvQmVUaWxlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBpZCA9IG5vZGUuaWQ7XG4gIC8vZmlyc3RseSBjaGVjayB0aGUgcHJldmlvdXMgcmVzdWx0c1xuICBpZiAodGhpcy50b0JlVGlsZWRbaWRdICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy50b0JlVGlsZWRbaWRdO1xuICB9XG5cbiAgLy9vbmx5IGNvbXBvdW5kIG5vZGVzIGFyZSB0byBiZSB0aWxlZFxuICB2YXIgY2hpbGRHcmFwaCA9IG5vZGUuZ2V0Q2hpbGQoKTtcbiAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IGNoaWxkR3JhcGguZ2V0Tm9kZXMoKTsgLy8gR2V0IHRoZSBjaGlsZHJlbiBub2Rlc1xuXG4gIC8vYSBjb21wb3VuZCBub2RlIGlzIG5vdCB0byBiZSB0aWxlZCBpZiBhbGwgb2YgaXRzIGNvbXBvdW5kIGNoaWxkcmVuIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aGVDaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURlZ3JlZSh0aGVDaGlsZCkgPiAwKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL3Bhc3MgdGhlIGNoaWxkcmVuIG5vdCBoYXZpbmcgdGhlIGNvbXBvdW5kIHN0cnVjdHVyZVxuICAgIGlmICh0aGVDaGlsZC5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW3RoZUNoaWxkLmlkXSA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdldFRvQmVUaWxlZCh0aGVDaGlsZCkpIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB0aGlzLnRvQmVUaWxlZFtpZF0gPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBkZWdyZWUgb2YgYSBub2RlIGRlcGVuZGluZyBvZiBpdHMgZWRnZXMgYW5kIGluZGVwZW5kZW50IG9mIGl0cyBjaGlsZHJlblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0Tm9kZURlZ3JlZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBpZCA9IG5vZGUuaWQ7XG4gIHZhciBlZGdlcyA9IG5vZGUuZ2V0RWRnZXMoKTtcbiAgdmFyIGRlZ3JlZSA9IDA7XG5cbiAgLy8gRm9yIHRoZSBlZGdlcyBjb25uZWN0ZWRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgaWYgKGVkZ2UuZ2V0U291cmNlKCkuaWQgIT09IGVkZ2UuZ2V0VGFyZ2V0KCkuaWQpIHtcbiAgICAgIGRlZ3JlZSA9IGRlZ3JlZSArIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWdyZWU7XG59O1xuXG4vLyBHZXQgZGVncmVlIG9mIGEgbm9kZSB3aXRoIGl0cyBjaGlsZHJlblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBkZWdyZWUgPSB0aGlzLmdldE5vZGVEZWdyZWUobm9kZSk7XG4gIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBkZWdyZWUgKz0gdGhpcy5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuKGNoaWxkKTtcbiAgfVxuICByZXR1cm4gZGVncmVlO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucGVyZm9ybURGU09uQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbXBvdW5kT3JkZXIgPSBbXTtcbiAgdGhpcy5maWxsQ29tcGV4T3JkZXJCeURGUyh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkuZ2V0Tm9kZXMoKSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5maWxsQ29tcGV4T3JkZXJCeURGUyA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGNoaWxkLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5maWxsQ29tcGV4T3JkZXJCeURGUyhjaGlsZC5nZXRDaGlsZCgpLmdldE5vZGVzKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRUb0JlVGlsZWQoY2hpbGQpKSB7XG4gICAgICB0aGlzLmNvbXBvdW5kT3JkZXIucHVzaChjaGlsZCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiogVGhpcyBtZXRob2QgcGxhY2VzIGVhY2ggemVybyBkZWdyZWUgbWVtYmVyIHdydCBnaXZlbiAoeCx5KSBjb29yZGluYXRlcyAodG9wIGxlZnQpLlxuKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmFkanVzdExvY2F0aW9ucyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIHgsIHksIGNvbXBvdW5kSG9yaXpvbnRhbE1hcmdpbiwgY29tcG91bmRWZXJ0aWNhbE1hcmdpbiwgY29tcG91bmRMYWJlbE1hcmdpbkxlZnQsIGNvbXBvdW5kTGFiZWxNYXJnaW5Ub3ApIHtcbiAgeCArPSBjb21wb3VuZEhvcml6b250YWxNYXJnaW4gKyBjb21wb3VuZExhYmVsTWFyZ2luTGVmdDtcbiAgeSArPSBjb21wb3VuZFZlcnRpY2FsTWFyZ2luICsgY29tcG91bmRMYWJlbE1hcmdpblRvcDtcblxuICB2YXIgbGVmdCA9IHg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByb3cgPSBvcmdhbml6YXRpb24ucm93c1tpXTtcbiAgICB4ID0gbGVmdDtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbG5vZGUgPSByb3dbal07XG5cbiAgICAgIGxub2RlLnJlY3QueCA9IHg7IC8vICsgbG5vZGUucmVjdC53aWR0aCAvIDI7XG4gICAgICBsbm9kZS5yZWN0LnkgPSB5OyAvLyArIGxub2RlLnJlY3QuaGVpZ2h0IC8gMjtcblxuICAgICAgeCArPSBsbm9kZS5yZWN0LndpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuXG4gICAgICBpZiAobG5vZGUucmVjdC5oZWlnaHQgPiBtYXhIZWlnaHQpIG1heEhlaWdodCA9IGxub2RlLnJlY3QuaGVpZ2h0O1xuICAgIH1cblxuICAgIHkgKz0gbWF4SGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZUNvbXBvdW5kTWVtYmVycyA9IGZ1bmN0aW9uIChjaGlsZEdyYXBoTWFwLCBpZFRvTm9kZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMudGlsZWRNZW1iZXJQYWNrID0gW107XG5cbiAgT2JqZWN0LmtleXMoY2hpbGRHcmFwaE1hcCkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAvLyBHZXQgdGhlIGNvbXBvdW5kIG5vZGVcbiAgICB2YXIgY29tcG91bmROb2RlID0gaWRUb05vZGVbaWRdO1xuXG4gICAgc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdID0gc2VsZi50aWxlTm9kZXMoY2hpbGRHcmFwaE1hcFtpZF0sIGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdCArIGNvbXBvdW5kTm9kZS5wYWRkaW5nUmlnaHQpO1xuXG4gICAgY29tcG91bmROb2RlLnJlY3Qud2lkdGggPSBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0ud2lkdGg7XG4gICAgY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0ID0gc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmhlaWdodDtcbiAgICBjb21wb3VuZE5vZGUuc2V0Q2VudGVyKHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5jZW50ZXJYLCBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uY2VudGVyWSk7XG5cbiAgICAvLyBjb21wb3VuZCBsZWZ0IGFuZCB0b3AgbWFyZ2luZ3MgZm9yIGxhYmVsc1xuICAgIC8vIHdoZW4gbm9kZSBsYWJlbHMgYXJlIGluY2x1ZGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJlbG93IGFuZCBhcmUgdXNlZCBpbiB0aWxpbmdQb3N0TGF5b3V0LFxuICAgIC8vIG90aGVyd2lzZSB0aGV5IHN0YXkgYXMgemVyb1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAwO1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IDA7XG5cbiAgICAvLyBVcGRhdGUgY29tcG91bmQgYm91bmRzIGNvbnNpZGVyaW5nIGl0cyBsYWJlbCBwcm9wZXJ0aWVzIGFuZCBzZXQgbGFiZWwgbWFyZ2lucyBmb3IgbGVmdCBhbmQgdG9wXG4gICAgaWYgKENvU0VDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTKSB7XG5cbiAgICAgIHZhciB3aWR0aCA9IGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodDtcblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJ0b3BcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZU5vZGVzID0gZnVuY3Rpb24gKG5vZGVzLCBtaW5XaWR0aCkge1xuICB2YXIgaG9yaXpvbnRhbE9yZyA9IHRoaXMudGlsZU5vZGVzQnlGYXZvcmluZ0RpbShub2RlcywgbWluV2lkdGgsIHRydWUpO1xuICB2YXIgdmVydGljYWxPcmcgPSB0aGlzLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0obm9kZXMsIG1pbldpZHRoLCBmYWxzZSk7XG5cbiAgdmFyIGhvcml6b250YWxSYXRpbyA9IHRoaXMuZ2V0T3JnUmF0aW8oaG9yaXpvbnRhbE9yZyk7XG4gIHZhciB2ZXJ0aWNhbFJhdGlvID0gdGhpcy5nZXRPcmdSYXRpbyh2ZXJ0aWNhbE9yZyk7XG4gIHZhciBiZXN0T3JnO1xuXG4gIC8vIHRoZSBiZXN0IHJhdGlvIGlzIHRoZSBvbmUgdGhhdCBpcyBjbG9zZXIgdG8gMSBzaW5jZSB0aGUgcmF0aW9zIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWRcbiAgLy8gYW5kIHRoZSBiZXN0IG9yZ2FuaXphdGlvbiBpcyB0aGUgb25lIHRoYXQgaGFzIHRoZSBiZXN0IHJhdGlvXG4gIGlmICh2ZXJ0aWNhbFJhdGlvIDwgaG9yaXpvbnRhbFJhdGlvKSB7XG4gICAgYmVzdE9yZyA9IHZlcnRpY2FsT3JnO1xuICB9IGVsc2Uge1xuICAgIGJlc3RPcmcgPSBob3Jpem9udGFsT3JnO1xuICB9XG5cbiAgcmV0dXJuIGJlc3RPcmc7XG59O1xuXG4vLyBnZXQgdGhlIHdpZHRoL2hlaWdodCByYXRpbyBvZiB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXMgbm9ybWFsaXplZCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIGxlc3MgdGhhbiAxXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRPcmdSYXRpbyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgLy8gZ2V0IGRpbWVuc2lvbnMgYW5kIGNhbGN1bGF0ZSB0aGUgaW5pdGlhbCByYXRpb1xuICB2YXIgd2lkdGggPSBvcmdhbml6YXRpb24ud2lkdGg7XG4gIHZhciBoZWlnaHQgPSBvcmdhbml6YXRpb24uaGVpZ2h0O1xuICB2YXIgcmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcblxuICAvLyBpZiB0aGUgaW5pdGlhbCByYXRpbyBpcyBsZXNzIHRoZW4gMSB0aGVuIGludmVyc2UgaXRcbiAgaWYgKHJhdGlvIDwgMSkge1xuICAgIHJhdGlvID0gMSAvIHJhdGlvO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRoZSBub3JtYWxpemVkIHJhdGlvXG4gIHJldHVybiByYXRpbztcbn07XG5cbi8qXG4gKiBDYWxjdWxhdGVzIHRoZSBpZGVhbCB3aWR0aCBmb3IgdGhlIHJvd3MuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdFxuICogZWFjaCBub2RlIGhhcyB0aGUgc2FtZSBzaXplcyBhbmQgY2FsY3VsYXRlcyB0aGUgaWRlYWwgcm93IHdpZHRoIHRoYXRcbiAqIGFwcHJveGltYXRlcyBhIHNxdWFyZSBzaGFwZWQgY29tcGxleCBhY2NvcmRpbmdseS4gSG93ZXZlciwgc2luY2Ugbm9kZXMgd291bGRcbiAqIGhhdmUgZGlmZmVyZW50IHNpemVzIHNvbWUgcm93cyB3b3VsZCBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgdGhlIHJlc3VsdGluZ1xuICogc2hhcGUgd291bGQgbm90IGJlIGFuIGV4YWN0IHNxdWFyZS5cbiAqL1xuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY0lkZWFsUm93V2lkdGggPSBmdW5jdGlvbiAobWVtYmVycywgZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gIC8vIFRvIGFwcHJveGltYXRlIGEgc3F1YXJlIHNoYXBlZCBjb21wbGV4IHdlIG5lZWQgdG8gbWFrZSBjb21wbGV4IHdpZHRoIGVxdWFsIHRvIGNvbXBsZXggaGVpZ2h0LlxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgbmVlZCB0byBzb2x2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uIHN5c3RlbSBmb3IgaGM6XG4gIC8vICh4ICsgYngpICogaGMgLSBieCA9ICh5ICsgYnkpICogdmMgLSBieSwgaGMgKiB2YyA9IG5cbiAgLy8gd2hlcmUgeCBpcyB0aGUgYXZhcmFnZSB3aWR0aCBvZiB0aGUgbm9kZXMsIHkgaXMgdGhlIGF2YXJhZ2UgaGVpZ2h0IG9mIG5vZGVzXG4gIC8vIGJ4IGFuZCBieSBhcmUgdGhlIGJ1ZmZlciBzaXplcyBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaW1lbnNpb25zIGFjY29yZGluZ2x5LFxuICAvLyBoYyBhbmQgdmMgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaW1lbnNpb25zXG4gIC8vIG4gaXMgbnVtYmVyIG9mIG1lbWJlcnMuXG5cbiAgdmFyIHZlcnRpY2FsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUw7XG4gIHZhciBob3Jpem9udGFsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTDtcblxuICAvLyBudW1iZXIgb2YgbWVtYmVyc1xuICB2YXIgbWVtYmVyc1NpemUgPSBtZW1iZXJzLmxlbmd0aDtcblxuICAvLyBzdW0gb2YgdGhlIHdpZHRoIG9mIGFsbCBtZW1iZXJzXG4gIHZhciB0b3RhbFdpZHRoID0gMDtcblxuICAvLyBzdW0gb2YgdGhlIGhlaWdodCBvZiBhbGwgbWVtYmVyc1xuICB2YXIgdG90YWxIZWlnaHQgPSAwO1xuXG4gIHZhciBtYXhXaWR0aCA9IDA7XG5cbiAgLy8gdHJhdmVyc2UgYWxsIG1lbWJlcnMgdG8gY2FsY3VsYXRlIHRvdGFsIHdpZHRoIGFuZCB0b3RhbCBoZWlnaHQgYW5kIGdldCB0aGUgbWF4aW11bSBtZW1iZXJzIHdpZHRoXG4gIG1lbWJlcnMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIHRvdGFsV2lkdGggKz0gbm9kZS5nZXRXaWR0aCgpO1xuICAgIHRvdGFsSGVpZ2h0ICs9IG5vZGUuZ2V0SGVpZ2h0KCk7XG5cbiAgICBpZiAobm9kZS5nZXRXaWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgIG1heFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYXZlcmFnZSB3aWR0aCBvZiB0aGUgbWVtYmVyc1xuICB2YXIgYXZlcmFnZVdpZHRoID0gdG90YWxXaWR0aCAvIG1lbWJlcnNTaXplO1xuXG4gIC8vIGF2ZXJhZ2UgaGVpZ2h0IG9mIHRoZSBtZW1iZXJzXG4gIHZhciBhdmVyYWdlSGVpZ2h0ID0gdG90YWxIZWlnaHQgLyBtZW1iZXJzU2l6ZTtcblxuICAvLyBzb2x2aW5nIHRoZSBpbml0aWFsIGVxdWF0aW9uIHN5c3RlbSBmb3IgdGhlIGhjIHlpZWxkcyB0aGUgZm9sbG93aW5nIHNlY29uZCBkZWdyZWUgZXF1YXRpb246XG4gIC8vIGhjXjIgKiAoeCtieCkgKyBoYyAqIChieSAtIGJ4KSAtIG4gKiAoeSArIGJ5KSA9IDBcblxuICAvLyB0aGUgZGVsdGEgdmFsdWUgdG8gc29sdmUgdGhlIGVxdWF0aW9uIGFib3ZlIGZvciBoY1xuICB2YXIgZGVsdGEgPSBNYXRoLnBvdyh2ZXJ0aWNhbFBhZGRpbmcgLSBob3Jpem9udGFsUGFkZGluZywgMikgKyA0ICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSAqIChhdmVyYWdlSGVpZ2h0ICsgdmVydGljYWxQYWRkaW5nKSAqIG1lbWJlcnNTaXplO1xuXG4gIC8vIHNvbHZlIHRoZSBlcXVhdGlvbiB1c2luZyBkZWx0YSB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGhvcml6b250YWwgY291bnRcbiAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYW4gaWRlYWwgcm93XG4gIHZhciBob3Jpem9udGFsQ291bnREb3VibGUgPSAoaG9yaXpvbnRhbFBhZGRpbmcgLSB2ZXJ0aWNhbFBhZGRpbmcgKyBNYXRoLnNxcnQoZGVsdGEpKSAvICgyICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSk7XG4gIC8vIHJvdW5kIHRoZSBjYWxjdWxhdGVkIGhvcml6b250YWwgY291bnQgdXAgb3IgZG93biBhY2NvcmRpbmcgdG8gdGhlIGZhdm9yZWQgZGltZW5zaW9uXG4gIHZhciBob3Jpem9udGFsQ291bnQ7XG5cbiAgaWYgKGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICAgIGhvcml6b250YWxDb3VudCA9IE1hdGguY2VpbChob3Jpem9udGFsQ291bnREb3VibGUpO1xuICAgIC8vIGlmIGhvcml6b250YWxDb3VudCBjb3VudCBpcyBub3QgYSBmbG9hdCB2YWx1ZSB0aGVuIGJvdGggb2Ygcm91bmRpbmcgdG8gZmxvb3IgYW5kIGNlaWxcbiAgICAvLyB3aWxsIHlpZWxkIHRoZSBzYW1lIHZhbHVlcy4gSW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIHNhbWUgY2FsY3VsYXRpb24gdHJ5IGdvaW5nIHVwXG4gICAgLy8gd2hpbGUgZmF2b3JpbmcgaG9yaXpvbnRhbCBkaW1lbnNpb24gaW4gc3VjaCBjYXNlc1xuICAgIGlmIChob3Jpem9udGFsQ291bnQgPT0gaG9yaXpvbnRhbENvdW50RG91YmxlKSB7XG4gICAgICBob3Jpem9udGFsQ291bnQrKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaG9yaXpvbnRhbENvdW50ID0gTWF0aC5mbG9vcihob3Jpem9udGFsQ291bnREb3VibGUpO1xuICB9XG5cbiAgLy8gaWRlYWwgd2lkdGggdG8gYmUgY2FsY3VsYXRlZFxuICB2YXIgaWRlYWxXaWR0aCA9IGhvcml6b250YWxDb3VudCAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykgLSBob3Jpem9udGFsUGFkZGluZztcblxuICAvLyBpZiBtYXggd2lkdGggaXMgYmlnZ2VyIHRoYW4gY2FsY3VsYXRlZCBpZGVhbCB3aWR0aCByZXNldCBpZGVhbCB3aWR0aCB0byBpdFxuICBpZiAobWF4V2lkdGggPiBpZGVhbFdpZHRoKSB7XG4gICAgaWRlYWxXaWR0aCA9IG1heFdpZHRoO1xuICB9XG5cbiAgLy8gYWRkIHRoZSBsZWZ0LXJpZ2h0IG1hcmdpbnMgdG8gdGhlIGlkZWFsIHJvdyB3aWR0aFxuICBpZGVhbFdpZHRoICs9IGhvcml6b250YWxQYWRkaW5nICogMjtcblxuICAvLyByZXR1cm4gdGhlIGlkZWFsIHJvdyB3aWR0aDFcbiAgcmV0dXJuIGlkZWFsV2lkdGg7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlTm9kZXNCeUZhdm9yaW5nRGltID0gZnVuY3Rpb24gKG5vZGVzLCBtaW5XaWR0aCwgZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gIHZhciB2ZXJ0aWNhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMO1xuICB2YXIgaG9yaXpvbnRhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUw7XG4gIHZhciB0aWxpbmdDb21wYXJlQnkgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19DT01QQVJFX0JZO1xuICB2YXIgb3JnYW5pemF0aW9uID0ge1xuICAgIHJvd3M6IFtdLFxuICAgIHJvd1dpZHRoOiBbXSxcbiAgICByb3dIZWlnaHQ6IFtdLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogbWluV2lkdGgsIC8vIGFzc3VtZSBtaW5IZWlnaHQgZXF1YWxzIHRvIG1pbldpZHRoXG4gICAgdmVydGljYWxQYWRkaW5nOiB2ZXJ0aWNhbFBhZGRpbmcsXG4gICAgaG9yaXpvbnRhbFBhZGRpbmc6IGhvcml6b250YWxQYWRkaW5nLFxuICAgIGNlbnRlclg6IDAsXG4gICAgY2VudGVyWTogMFxuICB9O1xuXG4gIGlmICh0aWxpbmdDb21wYXJlQnkpIHtcbiAgICBvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCA9IHRoaXMuY2FsY0lkZWFsUm93V2lkdGgobm9kZXMsIGZhdm9ySG9yaXpvbnRhbERpbSk7XG4gIH1cblxuICB2YXIgZ2V0Tm9kZUFyZWEgPSBmdW5jdGlvbiBnZXROb2RlQXJlYShuKSB7XG4gICAgcmV0dXJuIG4ucmVjdC53aWR0aCAqIG4ucmVjdC5oZWlnaHQ7XG4gIH07XG5cbiAgdmFyIGFyZWFDb21wYXJlRmNuID0gZnVuY3Rpb24gYXJlYUNvbXBhcmVGY24objEsIG4yKSB7XG4gICAgcmV0dXJuIGdldE5vZGVBcmVhKG4yKSAtIGdldE5vZGVBcmVhKG4xKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBub2RlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIGFyZWFzXG4gIG5vZGVzLnNvcnQoZnVuY3Rpb24gKG4xLCBuMikge1xuICAgIHZhciBjbXBCeSA9IGFyZWFDb21wYXJlRmNuO1xuICAgIGlmIChvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgICAgY21wQnkgPSB0aWxpbmdDb21wYXJlQnk7XG4gICAgICByZXR1cm4gY21wQnkobjEuaWQsIG4yLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNtcEJ5KG4xLCBuMik7XG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgb3JnYW5pemF0aW9uIC0+IGNhbGN1bGF0ZSBjb21wb3VuZCBjZW50ZXJcbiAgdmFyIHN1bUNlbnRlclggPSAwO1xuICB2YXIgc3VtQ2VudGVyWSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcblxuICAgIHN1bUNlbnRlclggKz0gbE5vZGUuZ2V0Q2VudGVyWCgpO1xuICAgIHN1bUNlbnRlclkgKz0gbE5vZGUuZ2V0Q2VudGVyWSgpO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLmNlbnRlclggPSBzdW1DZW50ZXJYIC8gbm9kZXMubGVuZ3RoO1xuICBvcmdhbml6YXRpb24uY2VudGVyWSA9IHN1bUNlbnRlclkgLyBub2Rlcy5sZW5ndGg7XG5cbiAgLy8gQ3JlYXRlIHRoZSBvcmdhbml6YXRpb24gLT4gdGlsZSBtZW1iZXJzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcblxuICAgIGlmIChvcmdhbml6YXRpb24ucm93cy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgMCwgbWluV2lkdGgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jYW5BZGRIb3Jpem9udGFsKG9yZ2FuaXphdGlvbiwgbE5vZGUucmVjdC53aWR0aCwgbE5vZGUucmVjdC5oZWlnaHQpKSB7XG4gICAgICB2YXIgcm93SW5kZXggPSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGggLSAxO1xuICAgICAgaWYgKCFvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgICAgICByb3dJbmRleCA9IHRoaXMuZ2V0U2hvcnRlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgcm93SW5kZXgsIG1pbldpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoLCBtaW5XaWR0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaGlmdFRvTGFzdFJvdyhvcmdhbml6YXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIG9yZ2FuaXphdGlvbjtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluc2VydE5vZGVUb1JvdyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIG5vZGUsIHJvd0luZGV4LCBtaW5XaWR0aCkge1xuICB2YXIgbWluQ29tcG91bmRTaXplID0gbWluV2lkdGg7XG5cbiAgLy8gQWRkIG5ldyByb3cgaWYgbmVlZGVkXG4gIGlmIChyb3dJbmRleCA9PSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGgpIHtcbiAgICB2YXIgc2Vjb25kRGltZW5zaW9uID0gW107XG5cbiAgICBvcmdhbml6YXRpb24ucm93cy5wdXNoKHNlY29uZERpbWVuc2lvbik7XG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoLnB1c2gobWluQ29tcG91bmRTaXplKTtcbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0LnB1c2goMCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcm93IHdpZHRoXG4gIHZhciB3ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW3Jvd0luZGV4XSArIG5vZGUucmVjdC53aWR0aDtcblxuICBpZiAob3JnYW5pemF0aW9uLnJvd3Nbcm93SW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICB3ICs9IG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtyb3dJbmRleF0gPSB3O1xuICAvLyBVcGRhdGUgY29tcG91bmQgd2lkdGhcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCA8IHcpIHtcbiAgICBvcmdhbml6YXRpb24ud2lkdGggPSB3O1xuICB9XG5cbiAgLy8gVXBkYXRlIGhlaWdodFxuICB2YXIgaCA9IG5vZGUucmVjdC5oZWlnaHQ7XG4gIGlmIChyb3dJbmRleCA+IDApIGggKz0gb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICB2YXIgZXh0cmFIZWlnaHQgPSAwO1xuICBpZiAoaCA+IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdKSB7XG4gICAgZXh0cmFIZWlnaHQgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XTtcbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSA9IGg7XG4gICAgZXh0cmFIZWlnaHQgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSAtIGV4dHJhSGVpZ2h0O1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLmhlaWdodCArPSBleHRyYUhlaWdodDtcblxuICAvLyBJbnNlcnQgbm9kZVxuICBvcmdhbml6YXRpb24ucm93c1tyb3dJbmRleF0ucHVzaChub2RlKTtcbn07XG5cbi8vU2NhbnMgdGhlIHJvd3Mgb2YgYW4gb3JnYW5pemF0aW9uIGFuZCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgbWluIHdpZHRoXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRTaG9ydGVzdFJvd0luZGV4ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgciA9IC0xO1xuICB2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXSA8IG1pbikge1xuICAgICAgciA9IGk7XG4gICAgICBtaW4gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufTtcblxuLy9TY2FucyB0aGUgcm93cyBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBtYXggd2lkdGhcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldExvbmdlc3RSb3dJbmRleCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIHIgPSAtMTtcbiAgdmFyIG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuXG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXSA+IG1heCkge1xuICAgICAgciA9IGk7XG4gICAgICBtYXggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHI7XG59O1xuXG4vKipcbiogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYWRkaW5nIGV4dHJhIHdpZHRoIHRvIHRoZSBvcmdhbml6YXRpb24gdmlvbGF0ZXNcbiogdGhlIGFzcGVjdCByYXRpbygxKSBvciBub3QuXG4qL1xuQ29TRUxheW91dC5wcm90b3R5cGUuY2FuQWRkSG9yaXpvbnRhbCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIGV4dHJhV2lkdGgsIGV4dHJhSGVpZ2h0KSB7XG5cbiAgLy8gaWYgdGhlcmUgaXMgYW4gaWRlYWwgcm93IHdpZHRoIHNwZWNpZmllZCB1c2UgaXQgaW5zdGVhZCBvZiBjaGVja2luZyB0aGUgYXNwZWN0IHJhdGlvXG4gIGlmIChvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgIHZhciBsYXN0Um93SW5kZXggPSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGggLSAxO1xuICAgIHZhciBsYXN0Um93V2lkdGggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdFJvd0luZGV4XTtcblxuICAgIC8vIGNoZWNrIGFuZCByZXR1cm4gaWYgaWRlYWwgcm93IHdpZHRoIHdpbGwgYmUgZXhjZWVkIGlmIHRoZSBub2RlIGlzIGFkZGVkIHRvIHRoZSByb3dcbiAgICByZXR1cm4gbGFzdFJvd1dpZHRoICsgZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyA8PSBvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aDtcbiAgfVxuXG4gIHZhciBzcmkgPSB0aGlzLmdldFNob3J0ZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcblxuICBpZiAoc3JpIDwgMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG1pbiA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtzcmldO1xuXG4gIGlmIChtaW4gKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcgKyBleHRyYVdpZHRoIDw9IG9yZ2FuaXphdGlvbi53aWR0aCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGhEaWZmID0gMDtcblxuICAvLyBBZGRpbmcgdG8gYW4gZXhpc3Rpbmcgcm93XG4gIGlmIChvcmdhbml6YXRpb24ucm93SGVpZ2h0W3NyaV0gPCBleHRyYUhlaWdodCkge1xuICAgIGlmIChzcmkgPiAwKSBoRGlmZiA9IGV4dHJhSGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZyAtIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbc3JpXTtcbiAgfVxuXG4gIHZhciBhZGRfdG9fcm93X3JhdGlvO1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIC0gbWluID49IGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcpIHtcbiAgICBhZGRfdG9fcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyAobWluICsgZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyk7XG4gIH0gZWxzZSB7XG4gICAgYWRkX3RvX3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gb3JnYW5pemF0aW9uLndpZHRoO1xuICB9XG5cbiAgLy8gQWRkaW5nIGEgbmV3IHJvdyBmb3IgdGhpcyBub2RlXG4gIGhEaWZmID0gZXh0cmFIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuICB2YXIgYWRkX25ld19yb3dfcmF0aW87XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggPCBleHRyYVdpZHRoKSB7XG4gICAgYWRkX25ld19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIGV4dHJhV2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgYWRkX25ld19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgfVxuXG4gIGlmIChhZGRfbmV3X3Jvd19yYXRpbyA8IDEpIGFkZF9uZXdfcm93X3JhdGlvID0gMSAvIGFkZF9uZXdfcm93X3JhdGlvO1xuXG4gIGlmIChhZGRfdG9fcm93X3JhdGlvIDwgMSkgYWRkX3RvX3Jvd19yYXRpbyA9IDEgLyBhZGRfdG9fcm93X3JhdGlvO1xuXG4gIHJldHVybiBhZGRfdG9fcm93X3JhdGlvIDwgYWRkX25ld19yb3dfcmF0aW87XG59O1xuXG4vL0lmIG1vdmluZyB0aGUgbGFzdCBub2RlIGZyb20gdGhlIGxvbmdlc3Qgcm93IGFuZCBhZGRpbmcgaXQgdG8gdGhlIGxhc3Rcbi8vcm93IG1ha2VzIHRoZSBib3VuZGluZyBib3ggc21hbGxlciwgZG8gaXQuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5zaGlmdFRvTGFzdFJvdyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIGxvbmdlc3QgPSB0aGlzLmdldExvbmdlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuICB2YXIgbGFzdCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aC5sZW5ndGggLSAxO1xuICB2YXIgcm93ID0gb3JnYW5pemF0aW9uLnJvd3NbbG9uZ2VzdF07XG4gIHZhciBub2RlID0gcm93W3Jvdy5sZW5ndGggLSAxXTtcblxuICB2YXIgZGlmZiA9IG5vZGUud2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIG9uIHRoZSBsYXN0IHJvd1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIC0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdID4gZGlmZiAmJiBsb25nZXN0ICE9IGxhc3QpIHtcbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbG9uZ2VzdCByb3dcbiAgICByb3cuc3BsaWNlKC0xLCAxKTtcblxuICAgIC8vIFB1c2ggaXQgdG8gdGhlIGxhc3Qgcm93XG4gICAgb3JnYW5pemF0aW9uLnJvd3NbbGFzdF0ucHVzaChub2RlKTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsb25nZXN0XSA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsb25nZXN0XSAtIGRpZmY7XG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdICsgZGlmZjtcbiAgICBvcmdhbml6YXRpb24ud2lkdGggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaW5zdGFuY2UuZ2V0TG9uZ2VzdFJvd0luZGV4KG9yZ2FuaXphdGlvbildO1xuXG4gICAgLy8gVXBkYXRlIGhlaWdodHMgb2YgdGhlIG9yZ2FuaXphdGlvblxuICAgIHZhciBtYXhIZWlnaHQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93W2ldLmhlaWdodCA+IG1heEhlaWdodCkgbWF4SGVpZ2h0ID0gcm93W2ldLmhlaWdodDtcbiAgICB9XG4gICAgaWYgKGxvbmdlc3QgPiAwKSBtYXhIZWlnaHQgKz0gb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICAgIHZhciBwcmV2VG90YWwgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdICsgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gPSBtYXhIZWlnaHQ7XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF0gPCBub2RlLmhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmcpIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF0gPSBub2RlLmhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgICB2YXIgZmluYWxUb3RhbCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gKyBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdO1xuICAgIG9yZ2FuaXphdGlvbi5oZWlnaHQgKz0gZmluYWxUb3RhbCAtIHByZXZUb3RhbDtcblxuICAgIHRoaXMuc2hpZnRUb0xhc3RSb3cob3JnYW5pemF0aW9uKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsaW5nUHJlTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQ29TRUNvbnN0YW50cy5USUxFKSB7XG4gICAgLy8gRmluZCB6ZXJvIGRlZ3JlZSBub2RlcyBhbmQgY3JlYXRlIGEgY29tcG91bmQgZm9yIGVhY2ggbGV2ZWxcbiAgICB0aGlzLmdyb3VwWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgICAvLyBUaWxlIGFuZCBjbGVhciBjaGlsZHJlbiBvZiBlYWNoIGNvbXBvdW5kXG4gICAgdGhpcy5jbGVhckNvbXBvdW5kcygpO1xuICAgIC8vIFNlcGFyYXRlbHkgdGlsZSBhbmQgY2xlYXIgemVybyBkZWdyZWUgbm9kZXMgZm9yIGVhY2ggbGV2ZWxcbiAgICB0aGlzLmNsZWFyWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsaW5nUG9zdExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKENvU0VDb25zdGFudHMuVElMRSkge1xuICAgIHRoaXMucmVwb3B1bGF0ZVplcm9EZWdyZWVNZW1iZXJzKCk7XG4gICAgdGhpcy5yZXBvcHVsYXRlQ29tcG91bmRzKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWN0aW9uOiBUcmVlIFJlZHVjdGlvbiBtZXRob2RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVkdWNlIHRyZWVzIFxuQ29TRUxheW91dC5wcm90b3R5cGUucmVkdWNlVHJlZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwcnVuZWROb2Rlc0FsbCA9IFtdO1xuICB2YXIgY29udGFpbnNMZWFmID0gdHJ1ZTtcbiAgdmFyIG5vZGU7XG5cbiAgd2hpbGUgKGNvbnRhaW5zTGVhZikge1xuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gICAgdmFyIHBydW5lZE5vZGVzSW5TdGVwVGVtcCA9IFtdO1xuICAgIGNvbnRhaW5zTGVhZiA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0RWRnZXMoKS5sZW5ndGggPT0gMSAmJiAhbm9kZS5nZXRFZGdlcygpWzBdLmlzSW50ZXJHcmFwaCAmJiBub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB7XG4gICAgICAgICAgdmFyIG90aGVyRW5kID0gbm9kZS5nZXRFZGdlcygpWzBdLmdldE90aGVyRW5kKG5vZGUpO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVBvc2l0aW9uID0gbmV3IERpbWVuc2lvbkQobm9kZS5nZXRDZW50ZXJYKCkgLSBvdGhlckVuZC5nZXRDZW50ZXJYKCksIG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3RoZXJFbmQuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXAucHVzaChbbm9kZSwgbm9kZS5nZXRFZGdlcygpWzBdLCBub2RlLmdldE93bmVyKCksIHJlbGF0aXZlUG9zaXRpb25dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXAucHVzaChbbm9kZSwgbm9kZS5nZXRFZGdlcygpWzBdLCBub2RlLmdldE93bmVyKCldKTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluc0xlYWYgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udGFpbnNMZWFmID09IHRydWUpIHtcbiAgICAgIHZhciBwcnVuZWROb2Rlc0luU3RlcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcnVuZWROb2Rlc0luU3RlcFRlbXAubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXS5nZXRFZGdlcygpLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXAucHVzaChwcnVuZWROb2Rlc0luU3RlcFRlbXBbal0pO1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXS5nZXRPd25lcigpLnJlbW92ZShwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcnVuZWROb2Rlc0FsbC5wdXNoKHBydW5lZE5vZGVzSW5TdGVwKTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5wcnVuZWROb2Rlc0FsbCA9IHBydW5lZE5vZGVzQWxsO1xufTtcblxuLy8gR3JvdyB0cmVlIG9uZSBzdGVwIFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ3Jvd1RyZWUgPSBmdW5jdGlvbiAocHJ1bmVkTm9kZXNBbGwpIHtcbiAgdmFyIGxlbmd0aE9mUHJ1bmVkTm9kZXNJblN0ZXAgPSBwcnVuZWROb2Rlc0FsbC5sZW5ndGg7XG4gIHZhciBwcnVuZWROb2Rlc0luU3RlcCA9IHBydW5lZE5vZGVzQWxsW2xlbmd0aE9mUHJ1bmVkTm9kZXNJblN0ZXAgLSAxXTtcblxuICB2YXIgbm9kZURhdGE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJ1bmVkTm9kZXNJblN0ZXAubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlRGF0YSA9IHBydW5lZE5vZGVzSW5TdGVwW2ldO1xuXG4gICAgdGhpcy5maW5kUGxhY2Vmb3JQcnVuZWROb2RlKG5vZGVEYXRhKTtcblxuICAgIG5vZGVEYXRhWzJdLmFkZChub2RlRGF0YVswXSk7XG4gICAgbm9kZURhdGFbMl0uYWRkKG5vZGVEYXRhWzFdLCBub2RlRGF0YVsxXS5zb3VyY2UsIG5vZGVEYXRhWzFdLnRhcmdldCk7XG4gIH1cblxuICBwcnVuZWROb2Rlc0FsbC5zcGxpY2UocHJ1bmVkTm9kZXNBbGwubGVuZ3RoIC0gMSwgMSk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xufTtcblxuLy8gRmluZCBhbiBhcHByb3ByaWF0ZSBwb3NpdGlvbiB0byByZXBsYWNlIHBydW5lZCBub2RlLCB0aGlzIG1ldGhvZCBjYW4gYmUgaW1wcm92ZWRcbkNvU0VMYXlvdXQucHJvdG90eXBlLmZpbmRQbGFjZWZvclBydW5lZE5vZGUgPSBmdW5jdGlvbiAobm9kZURhdGEpIHtcblxuICB2YXIgZ3JpZEZvclBydW5lZE5vZGU7XG4gIHZhciBub2RlVG9Db25uZWN0O1xuICB2YXIgcHJ1bmVkTm9kZSA9IG5vZGVEYXRhWzBdO1xuICBpZiAocHJ1bmVkTm9kZSA9PSBub2RlRGF0YVsxXS5zb3VyY2UpIHtcbiAgICBub2RlVG9Db25uZWN0ID0gbm9kZURhdGFbMV0udGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIG5vZGVUb0Nvbm5lY3QgPSBub2RlRGF0YVsxXS5zb3VyY2U7XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB7XG4gICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgKyBub2RlRGF0YVszXS5nZXRXaWR0aCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSArIG5vZGVEYXRhWzNdLmdldEhlaWdodCgpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3RhcnRHcmlkWCA9IG5vZGVUb0Nvbm5lY3Quc3RhcnRYO1xuICAgIHZhciBmaW5pc2hHcmlkWCA9IG5vZGVUb0Nvbm5lY3QuZmluaXNoWDtcbiAgICB2YXIgc3RhcnRHcmlkWSA9IG5vZGVUb0Nvbm5lY3Quc3RhcnRZO1xuICAgIHZhciBmaW5pc2hHcmlkWSA9IG5vZGVUb0Nvbm5lY3QuZmluaXNoWTtcblxuICAgIHZhciB1cE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGRvd25Ob2RlQ291bnQgPSAwO1xuICAgIHZhciByaWdodE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGxlZnROb2RlQ291bnQgPSAwO1xuICAgIHZhciBjb250cm9sUmVnaW9ucyA9IFt1cE5vZGVDb3VudCwgcmlnaHROb2RlQ291bnQsIGRvd25Ob2RlQ291bnQsIGxlZnROb2RlQ291bnRdO1xuXG4gICAgaWYgKHN0YXJ0R3JpZFkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWDsgaSA8PSBmaW5pc2hHcmlkWDsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzBdICs9IHRoaXMuZ3JpZFtpXVtzdGFydEdyaWRZIC0gMV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ldW3N0YXJ0R3JpZFldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5pc2hHcmlkWCA8IHRoaXMuZ3JpZC5sZW5ndGggLSAxKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWTsgaSA8PSBmaW5pc2hHcmlkWTsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzFdICs9IHRoaXMuZ3JpZFtmaW5pc2hHcmlkWCArIDFdW2ldLmxlbmd0aCArIHRoaXMuZ3JpZFtmaW5pc2hHcmlkWF1baV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmlzaEdyaWRZIDwgdGhpcy5ncmlkWzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRYOyBpIDw9IGZpbmlzaEdyaWRYOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMl0gKz0gdGhpcy5ncmlkW2ldW2ZpbmlzaEdyaWRZICsgMV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ldW2ZpbmlzaEdyaWRZXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnRHcmlkWCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRZOyBpIDw9IGZpbmlzaEdyaWRZOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbM10gKz0gdGhpcy5ncmlkW3N0YXJ0R3JpZFggLSAxXVtpXS5sZW5ndGggKyB0aGlzLmdyaWRbc3RhcnRHcmlkWF1baV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtaW5Db3VudDtcbiAgICB2YXIgbWluSW5kZXg7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb250cm9sUmVnaW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zW2pdIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGNvbnRyb2xSZWdpb25zW2pdO1xuICAgICAgICBtaW5Db3VudCA9IDE7XG4gICAgICAgIG1pbkluZGV4ID0gajtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbal0gPT0gbWluKSB7XG4gICAgICAgIG1pbkNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pbkNvdW50ID09IDMgJiYgbWluID09IDApIHtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5Db3VudCA9PSAyICYmIG1pbiA9PSAwKSB7XG4gICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMik7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwKSB7XG4gICAgICAgIDtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluQ291bnQgPT0gNCAmJiBtaW4gPT0gMCkge1xuICAgICAgdmFyIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpO1xuICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSByYW5kb207XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gbWluSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDApIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSAtIG5vZGVUb0Nvbm5lY3QuZ2V0SGVpZ2h0KCkgLyAyIC0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAtIHBydW5lZE5vZGUuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICB9IGVsc2UgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDEpIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpICsgbm9kZVRvQ29ubmVjdC5nZXRXaWR0aCgpIC8gMiArIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBwcnVuZWROb2RlLmdldFdpZHRoKCkgLyAyLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSk7XG4gICAgfSBlbHNlIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAyKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgKyBub2RlVG9Db25uZWN0LmdldEhlaWdodCgpIC8gMiArIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBwcnVuZWROb2RlLmdldEhlaWdodCgpIC8gMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpIC0gbm9kZVRvQ29ubmVjdC5nZXRXaWR0aCgpIC8gMiAtIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLSBwcnVuZWROb2RlLmdldFdpZHRoKCkgLyAyLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VMYXlvdXQ7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5OTE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXROb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Tm9kZTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JTWF0aDtcblxuZnVuY3Rpb24gQ29TRU5vZGUoZ20sIGxvYywgc2l6ZSwgdk5vZGUpIHtcbiAgRkRMYXlvdXROb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xufVxuXG5Db1NFTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0Tm9kZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dE5vZGUpIHtcbiAgQ29TRU5vZGVbcHJvcF0gPSBGRExheW91dE5vZGVbcHJvcF07XG59XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5jYWxjdWxhdGVEaXNwbGFjZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcbiAgLy8gdGhpcyBjaGVjayBpcyBmb3IgY29tcG91bmQgbm9kZXMgdGhhdCBjb250YWluIGZpeGVkIG5vZGVzXG4gIGlmICh0aGlzLmdldENoaWxkKCkgIT0gbnVsbCAmJiB0aGlzLmZpeGVkTm9kZVdlaWdodCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWCArIHRoaXMucmVwdWxzaW9uRm9yY2VYICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCkgLyB0aGlzLmZpeGVkTm9kZVdlaWdodDtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVkgKyB0aGlzLnJlcHVsc2lvbkZvcmNlWSArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkpIC8gdGhpcy5maXhlZE5vZGVXZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VYICsgdGhpcy5yZXB1bHNpb25Gb3JjZVggKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYKSAvIHRoaXMubm9PZkNoaWxkcmVuO1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWSArIHRoaXMucmVwdWxzaW9uRm9yY2VZICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSkgLyB0aGlzLm5vT2ZDaGlsZHJlbjtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFgpID4gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCA9IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQgKiBJTWF0aC5zaWduKHRoaXMuZGlzcGxhY2VtZW50WCk7XG4gIH1cblxuICBpZiAoTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRZKSA+IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50ICogSU1hdGguc2lnbih0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG5cbiAgLy8gbm9uLWVtcHR5IGNvbXBvdW5kIG5vZGUsIHByb3BvZ2F0ZSBtb3ZlbWVudCB0byBjaGlsZHJlbiBhcyB3ZWxsXG4gIGlmICh0aGlzLmNoaWxkICYmIHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuKHRoaXMuZGlzcGxhY2VtZW50WCwgdGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4gPSBmdW5jdGlvbiAoZFgsIGRZKSB7XG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICB2YXIgbm9kZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGlzcGxhY2VtZW50WCArPSBkWDtcbiAgICAgIG5vZGUuZGlzcGxhY2VtZW50WSArPSBkWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuKGRYLCBkWSk7XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuXG4gIC8vIGEgc2ltcGxlIG5vZGUgb3IgYW4gZW1wdHkgY29tcG91bmQgbm9kZSwgbW92ZSBpdFxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsIHx8IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgIHRoaXMubW92ZUJ5KHRoaXMuZGlzcGxhY2VtZW50WCwgdGhpcy5kaXNwbGFjZW1lbnRZKTtcblxuICAgIGxheW91dC50b3RhbERpc3BsYWNlbWVudCArPSBNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFgpICsgTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxuXG4gIHRoaXMuc3ByaW5nRm9yY2VYID0gMDtcbiAgdGhpcy5zcHJpbmdGb3JjZVkgPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWCA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VZID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmRpc3BsYWNlbWVudFggPSAwO1xuICB0aGlzLmRpc3BsYWNlbWVudFkgPSAwO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldFByZWQxID0gZnVuY3Rpb24gKHByZWQxKSB7XG4gIHRoaXMucHJlZDEgPSBwcmVkMTtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXRQcmVkMSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByZWQxO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldFByZWQyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJlZDI7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0TmV4dCA9IGZ1bmN0aW9uIChuZXh0KSB7XG4gIHRoaXMubmV4dCA9IG5leHQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0TmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5leHQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0UHJvY2Vzc2VkID0gZnVuY3Rpb24gKHByb2Nlc3NlZCkge1xuICB0aGlzLnByb2Nlc3NlZCA9IHByb2Nlc3NlZDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5pc1Byb2Nlc3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRU5vZGU7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MDI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIENvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MaW5rZWRMaXN0O1xudmFyIE1hdHJpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5NYXRyaXg7XG52YXIgU1ZEID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlNWRDtcblxuZnVuY3Rpb24gQ29uc3RyYWludEhhbmRsZXIoKSB7fVxuXG5Db25zdHJhaW50SGFuZGxlci5oYW5kbGVDb25zdHJhaW50cyA9IGZ1bmN0aW9uIChsYXlvdXQpIHtcbiAgLy8gIGxldCBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcblxuICAvLyBnZXQgY29uc3RyYWludHMgZnJvbSBsYXlvdXRcbiAgdmFyIGNvbnN0cmFpbnRzID0ge307XG4gIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludDtcbiAgY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50O1xuICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50O1xuXG4gIHZhciBpZFRvTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpO1xuICB2YXIgeENvb3JkcyA9IFtdO1xuICB2YXIgeUNvb3JkcyA9IFtdO1xuXG4gIHZhciBhbGxOb2RlcyA9IGxheW91dC5nZXRBbGxOb2RlcygpO1xuICB2YXIgaW5kZXggPSAwO1xuICAvLyBmaWxsIGluZGV4IG1hcCBhbmQgY29vcmRpbmF0ZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZS5pZCwgaW5kZXgrKyk7XG4gICAgICB4Q29vcmRzLnB1c2gobm9kZS5nZXRDZW50ZXJYKCkpO1xuICAgICAgeUNvb3Jkcy5wdXNoKG5vZGUuZ2V0Q2VudGVyWSgpKTtcbiAgICAgIGlkVG9Ob2RlTWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSBleGlzdHMgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnQgd2l0aG91dCBnYXAgdmFsdWUsIHNldCBpdCB0byBkZWZhdWx0IFxuICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmICghY29uc3RyYWludC5nYXAgJiYgY29uc3RyYWludC5nYXAgIT0gMCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgY29uc3RyYWludC5nYXAgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5sZWZ0KS5nZXRXaWR0aCgpIC8gMiArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LnJpZ2h0KS5nZXRXaWR0aCgpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdHJhaW50LmdhcCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LnRvcCkuZ2V0SGVpZ2h0KCkgLyAyICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKS5nZXRIZWlnaHQoKSAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qIGF1eGlsaWFyeSBmdW5jdGlvbnMgKi9cblxuICAvLyBjYWxjdWxhdGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3NpdGlvbiBvYmplY3RzXG4gIHZhciBjYWxjdWxhdGVQb3NpdGlvbkRpZmYgPSBmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbkRpZmYocG9zMSwgcG9zMikge1xuICAgIHJldHVybiB7IHg6IHBvczEueCAtIHBvczIueCwgeTogcG9zMS55IC0gcG9zMi55IH07XG4gIH07XG5cbiAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIG5vZGVzXG4gIHZhciBjYWxjdWxhdGVBdmdQb3NpdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKG5vZGVJZFNldCkge1xuICAgIHZhciB4UG9zU3VtID0gMDtcbiAgICB2YXIgeVBvc1N1bSA9IDA7XG4gICAgbm9kZUlkU2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgeFBvc1N1bSArPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgIHlQb3NTdW0gKz0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyB4OiB4UG9zU3VtIC8gbm9kZUlkU2V0LnNpemUsIHk6IHlQb3NTdW0gLyBub2RlSWRTZXQuc2l6ZSB9O1xuICB9O1xuXG4gIC8vIGZpbmQgYW4gYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHRoZSBub2RlcyBpbiBhIGdpdmVuIGdyYXBoIGFjY29yZGluZyB0byByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgLy8gdGhpcyBmdW5jdGlvbiBhbHNvIHRha2VzIHRoZSBmaXhlZCBub2RlcyBhbmQgYWxpZ25tZW50IGNvbnN0cmFpbnRzIGludG8gYWNjb3VudFxuICAvLyBncmFwaDogZGFnIHRvIGJlIGV2YWx1YXRlZCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiBvciBcInZlcnRpY2FsXCIsIFxuICAvLyBmaXhlZE5vZGVzOiBzZXQgb2YgZml4ZWQgbm9kZXMgdG8gY29uc2lkZXIgZHVyaW5nIGV2YWx1YXRpb24sIGR1bW15UG9zaXRpb25zOiBhcHByb3ByaWF0ZSBjb29yZGluYXRlcyBvZiB0aGUgZHVtbXkgbm9kZXMgIFxuICB2YXIgZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudCA9IGZ1bmN0aW9uIGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZ3JhcGgsIGRpcmVjdGlvbiwgZml4ZWROb2RlcywgZHVtbXlQb3NpdGlvbnMsIGNvbXBvbmVudFNvdXJjZXMpIHtcblxuICAgIC8vIGZpbmQgdW5pb24gb2YgdHdvIHNldHNcbiAgICBmdW5jdGlvbiBzZXRVbmlvbihzZXRBLCBzZXRCKSB7XG4gICAgICB2YXIgdW5pb24gPSBuZXcgU2V0KHNldEEpO1xuICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHNldEJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGVsZW0gPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHVuaW9uLmFkZChlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlvbjtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGluZGVncmVlIGNvdW50IGZvciBlYWNoIG5vZGVcbiAgICB2YXIgaW5EZWdyZWVzID0gbmV3IE1hcCgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaW5EZWdyZWVzLnNldChrZXksIDApO1xuICAgIH0pO1xuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIGluRGVncmVlcy5zZXQoYWRqYWNlbnQuaWQsIGluRGVncmVlcy5nZXQoYWRqYWNlbnQuaWQpICsgMSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHZhciBwb3NpdGlvbk1hcCA9IG5ldyBNYXAoKTsgLy8ga2VlcHMgdGhlIHBvc2l0aW9uIGZvciBlYWNoIG5vZGVcbiAgICB2YXIgcGFzdE1hcCA9IG5ldyBNYXAoKTsgLy8ga2VlcHMgdGhlIHByZWRlY2Vzc29ycyhwYXN0KSBvZiBhIG5vZGVcbiAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgIGluRGVncmVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgPT0gMCkge1xuICAgICAgICBxdWV1ZS5wdXNoKGtleSk7XG4gICAgICAgIGlmICghZml4ZWROb2Rlcykge1xuICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIG5vZGVJbmRleGVzLmhhcyhrZXkpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoa2V5KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIG5vZGVJbmRleGVzLmhhcyhrZXkpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoa2V5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgICAgfVxuICAgICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgICAgcGFzdE1hcC5zZXQoa2V5LCBuZXcgU2V0KFtrZXldKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBhbGlnbiBzb3VyY2VzIG9mIGVhY2ggY29tcG9uZW50IGluIGVuZm9yY2VtZW50IHBoYXNlXG4gICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgIGNvbXBvbmVudFNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIHZhciBmaXhlZElkcyA9IFtdO1xuICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGZpeGVkSWRzLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZml4ZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgICAgICAgZml4ZWRJZHMuZm9yRWFjaChmdW5jdGlvbiAoZml4ZWRJZCkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoZml4ZWRJZCwgbm9kZUluZGV4ZXMuaGFzKGZpeGVkSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoZml4ZWRJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGZpeGVkSWQpKTtcbiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gcG9zaXRpb25NYXAuZ2V0KGZpeGVkSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGZpeGVkSWQsIG5vZGVJbmRleGVzLmhhcyhmaXhlZElkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGZpeGVkSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChmaXhlZElkKSk7XG4gICAgICAgICAgICAgIHBvc2l0aW9uICs9IHBvc2l0aW9uTWFwLmdldChmaXhlZElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uIC8gZml4ZWRJZHMubGVuZ3RoO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBwb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBfcG9zaXRpb24gKz0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3Bvc2l0aW9uICs9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBfcG9zaXRpb24gLyBjb21wb25lbnQubGVuZ3RoO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIF9wb3NpdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzXG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KGN1cnJlbnROb2RlKTtcbiAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICBpZiAocG9zaXRpb25NYXAuZ2V0KG5laWdoYm9yLmlkKSA8IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApIHtcbiAgICAgICAgICBpZiAoZml4ZWROb2RlcyAmJiBmaXhlZE5vZGVzLmhhcyhuZWlnaGJvci5pZCkpIHtcbiAgICAgICAgICAgIHZhciBmaXhlZFBvc2l0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uID0gbm9kZUluZGV4ZXMuaGFzKG5laWdoYm9yLmlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5laWdoYm9yLmlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZml4ZWRQb3NpdGlvbiA9IG5vZGVJbmRleGVzLmhhcyhuZWlnaGJvci5pZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChuZWlnaGJvci5pZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChuZWlnaGJvci5pZCwgZml4ZWRQb3NpdGlvbik7IC8vIFRPRE86IG1heSBkbyB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICAgICAgICBpZiAoZml4ZWRQb3NpdGlvbiA8IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwIC0gZml4ZWRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgcGFzdE1hcC5nZXQoY3VycmVudE5vZGUpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIHBvc2l0aW9uTWFwLmdldChub2RlSWQpIC0gZGlmZik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobmVpZ2hib3IuaWQsIHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbkRlZ3JlZXMuc2V0KG5laWdoYm9yLmlkLCBpbkRlZ3JlZXMuZ2V0KG5laWdoYm9yLmlkKSAtIDEpO1xuICAgICAgICBpZiAoaW5EZWdyZWVzLmdldChuZWlnaGJvci5pZCkgPT0gMCkge1xuICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAgICAgcGFzdE1hcC5zZXQobmVpZ2hib3IuaWQsIHNldFVuaW9uKHBhc3RNYXAuZ2V0KGN1cnJlbnROb2RlKSwgcGFzdE1hcC5nZXQobmVpZ2hib3IuaWQpKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfVxuXG4gICAgLy8gcmVhZGp1c3QgcG9zaXRpb24gb2YgdGhlIG5vZGVzIGFmdGVyIGVuZm9yY2VtZW50XG4gICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgIC8vIGZpbmQgaW5kZWdyZWUgY291bnQgZm9yIGVhY2ggbm9kZVxuICAgICAgdmFyIHNpbmtOb2RlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBzaW5rTm9kZXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX2NvbXBvbmVudHMgPSBbXTtcbiAgICAgIHBhc3RNYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoc2lua05vZGVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdmFyIGlzRml4ZWRDb21wb25lbnQgPSBmYWxzZTtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjIgPSBmYWxzZTtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IChfc3RlcDIgPSBfaXRlcmF0b3IyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZSkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgaXNGaXhlZENvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMiA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLnJldHVybigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc0ZpeGVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB2YXIgaXNFeGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGV4aXN0QXQgPSB2b2lkIDA7XG4gICAgICAgICAgICBfY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaGFzKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodmFsdWUpKVswXSkpIHtcbiAgICAgICAgICAgICAgICBpc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBleGlzdEF0ID0gaW5kZXg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFpc0V4aXN0KSB7XG4gICAgICAgICAgICAgIF9jb21wb25lbnRzLnB1c2gobmV3IFNldCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudHNbZXhpc3RBdF0uYWRkKGVsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIG1pbkJlZm9yZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1pbkFmdGVyID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWF4QmVmb3JlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWF4QWZ0ZXIgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMyA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IGNvbXBvbmVudFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IChfc3RlcDMgPSBfaXRlcmF0b3IzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICAgICAgdmFyIHBvc0JlZm9yZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgcG9zQmVmb3JlID0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcG9zQmVmb3JlID0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBvc0FmdGVyID0gcG9zaXRpb25NYXAuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAocG9zQmVmb3JlIDwgbWluQmVmb3JlKSB7XG4gICAgICAgICAgICAgIG1pbkJlZm9yZSA9IHBvc0JlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NCZWZvcmUgPiBtYXhCZWZvcmUpIHtcbiAgICAgICAgICAgICAgbWF4QmVmb3JlID0gcG9zQmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0FmdGVyIDwgbWluQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgbWluQWZ0ZXIgPSBwb3NBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NBZnRlciA+IG1heEFmdGVyKSB7XG4gICAgICAgICAgICAgIG1heEFmdGVyID0gcG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjMgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMyA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyAmJiBfaXRlcmF0b3IzLnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IzLnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IzKSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlmZiA9IChtaW5CZWZvcmUgKyBtYXhCZWZvcmUpIC8gMiAtIChtaW5BZnRlciArIG1heEFmdGVyKSAvIDI7XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNCA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IGNvbXBvbmVudFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IChfc3RlcDQgPSBfaXRlcmF0b3I0Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIF9ub2RlSWQgPSBfc3RlcDQudmFsdWU7XG5cbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChfbm9kZUlkLCBwb3NpdGlvbk1hcC5nZXQoX25vZGVJZCkgKyBkaWZmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNCA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I0ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ICYmIF9pdGVyYXRvcjQucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjQucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uTWFwO1xuICB9O1xuXG4gIC8vIGZpbmQgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHMgaWYgdGhlcmUgYXJlIGJvdGggYWxpZ25tZW50IGFuZCByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICAvLyBvciBpZiB0aGVyZSBhcmUgb25seSByZWwuIHBsYWNlbWVudCBjb250cmFpbnRzIHdoZXJlIHRoZSBsYXJnZXN0IGNvbXBvbmVudCBpc24ndCBzdWZmaWNpZW50bHkgbGFyZ2VcbiAgdmFyIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50ID0gZnVuY3Rpb24gYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQocmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50cykge1xuICAgIC8vIHZhcmlhYmxlcyB0byBjb3VudCB2b3Rlc1xuICAgIHZhciByZWZsZWN0T25ZID0gMCxcbiAgICAgICAgbm90UmVmbGVjdE9uWSA9IDA7XG4gICAgdmFyIHJlZmxlY3RPblggPSAwLFxuICAgICAgICBub3RSZWZsZWN0T25YID0gMDtcblxuICAgIHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludHMuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LmxlZnQpXSAtIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQucmlnaHQpXSA+PSAwID8gcmVmbGVjdE9uWSsrIDogbm90UmVmbGVjdE9uWSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC50b3ApXSAtIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKV0gPj0gMCA/IHJlZmxlY3RPblgrKyA6IG5vdFJlZmxlY3RPblgrKztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZWZsZWN0T25ZID4gbm90UmVmbGVjdE9uWSAmJiByZWZsZWN0T25YID4gbm90UmVmbGVjdE9uWCkge1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVJbmRleGVzLnNpemU7IF9pKyspIHtcbiAgICAgICAgeENvb3Jkc1tfaV0gPSAtMSAqIHhDb29yZHNbX2ldO1xuICAgICAgICB5Q29vcmRzW19pXSA9IC0xICogeUNvb3Jkc1tfaV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0T25ZID4gbm90UmVmbGVjdE9uWSkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kyKyspIHtcbiAgICAgICAgeENvb3Jkc1tfaTJdID0gLTEgKiB4Q29vcmRzW19pMl07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0T25YID4gbm90UmVmbGVjdE9uWCkge1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kzKyspIHtcbiAgICAgICAgeUNvb3Jkc1tfaTNdID0gLTEgKiB5Q29vcmRzW19pM107XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGZpbmQgd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIHVuZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGZpbmRDb21wb25lbnRzID0gZnVuY3Rpb24gZmluZENvbXBvbmVudHMoZ3JhcGgpIHtcbiAgICAvLyBmaW5kIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiBkYWdcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoa2V5KSkge1xuICAgICAgICBjb21wb25lbnRzW2NvdW50XSA9IFtdO1xuICAgICAgICB2YXIgX2N1cnJlbnROb2RlID0ga2V5O1xuICAgICAgICBxdWV1ZS5wdXNoKF9jdXJyZW50Tm9kZSk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKF9jdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2goX2N1cnJlbnROb2RlKTtcblxuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICBfY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoX2N1cnJlbnROb2RlKTtcbiAgICAgICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMobmVpZ2hib3IuaWQpKSB7XG4gICAgICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH07XG5cbiAgLy8gcmV0dXJuIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiBnaXZlbiBkYWdcbiAgdmFyIGRhZ1RvVW5kaXJlY3RlZCA9IGZ1bmN0aW9uIGRhZ1RvVW5kaXJlY3RlZChkYWcpIHtcbiAgICB2YXIgdW5kaXJlY3RlZCA9IG5ldyBNYXAoKTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB1bmRpcmVjdGVkLnNldChrZXksIFtdKTtcbiAgICB9KTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICB1bmRpcmVjdGVkLmdldChrZXkpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICB1bmRpcmVjdGVkLmdldChhZGphY2VudC5pZCkucHVzaCh7IGlkOiBrZXksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVuZGlyZWN0ZWQ7XG4gIH07XG5cbiAgLy8gcmV0dXJuIHJldmVyc2VkIChkaXJlY3Rpb25zIGludmVydGVkKSB2ZXJzaW9uIG9mIGdpdmVuIGRhZ1xuICB2YXIgZGFnVG9SZXZlcnNlZCA9IGZ1bmN0aW9uIGRhZ1RvUmV2ZXJzZWQoZGFnKSB7XG4gICAgdmFyIHJldmVyc2VkID0gbmV3IE1hcCgpO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldmVyc2VkLnNldChrZXksIFtdKTtcbiAgICB9KTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICByZXZlcnNlZC5nZXQoYWRqYWNlbnQuaWQpLnB1c2goeyBpZDoga2V5LCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXZlcnNlZDtcbiAgfTtcblxuICAvKioqKiAgYXBwbHkgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGluaXRpYWwgZHJhZnQgbGF5b3V0IHRvIGJldHRlciBhbGlnbiB3aXRoIGNvbnN0cmFpbmVkIG5vZGVzICoqKiovXG4gIC8vIHNvbHZlIHRoZSBPcnRob2dvbmFsIFByb2NydXN0ZWFuIFByb2JsZW0gdG8gcm90YXRlIGFuZC9vciByZWZsZWN0IGluaXRpYWwgZHJhZnQgbGF5b3V0XG4gIC8vIGhlcmUgd2UgZm9sbG93IHRoZSBzb2x1dGlvbiBpbiBDaGFwdGVyIDIwLjIgb2YgQm9yZywgSS4gJiBHcm9lbmVuLCBQLiAoMjAwNSkgTW9kZXJuIE11bHRpZGltZW5zaW9uYWwgU2NhbGluZzogVGhlb3J5IGFuZCBBcHBsaWNhdGlvbnMgXG5cbiAgLyogY29uc3RydWN0IHNvdXJjZSBhbmQgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zICovXG5cbiAgdmFyIHRhcmdldE1hdHJpeCA9IFtdOyAvLyBBIC0gdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgdmFyIHNvdXJjZU1hdHJpeCA9IFtdOyAvLyBCIC0gc291cmNlIGNvbmZpZ3VyYXRpb24gXG4gIHZhciBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gZmFsc2U7IC8vIGZhbHNlIGZvciBubyB0cmFuc2Zvcm1hdGlvbiwgdHJ1ZSBmb3Igc3RhbmRhcnQgKFByb2NydXN0ZXMpIHRyYW5zZm9ybWF0aW9uIChyb3RhdGlvbiBhbmQvb3IgcmVmbGVjdGlvbilcbiAgdmFyIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7IC8vIGZhbHNlL3RydWUgZm9yIHJlZmxlY3Rpb24gY2hlY2ssICdyZWZsZWN0T25YJywgJ3JlZmxlY3RPblknIG9yICdyZWZsZWN0T25Cb3RoJyBmb3IgcmVmbGVjdGlvbiB0eXBlIGlmIG5lY2Vzc2FyeVxuICB2YXIgZml4ZWROb2RlcyA9IG5ldyBTZXQoKTtcbiAgdmFyIGRhZyA9IG5ldyBNYXAoKTsgLy8gYWRqYWNlbmN5IGxpc3QgdG8ga2VlcCBkaXJlY3RlZCBhY3ljbGljIGdyYXBoIChkYWcpIHRoYXQgY29uc2lzdHMgb2YgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIHZhciBkYWdVbmRpcmVjdGVkID0gbmV3IE1hcCgpOyAvLyB1bmRpcmVjdGVkIHZlcnNpb24gb2YgdGhlIGRhZ1xuICB2YXIgY29tcG9uZW50cyA9IFtdOyAvLyB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHNcblxuICAvLyBmaWxsIGZpeGVkTm9kZXMgY29sbGVjdGlvbiB0byB1c2UgbGF0ZXJcbiAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICBmaXhlZE5vZGVzLmFkZChub2RlRGF0YS5ub2RlSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY29uc3RydWN0IGRhZyBmcm9tIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50cyBcbiAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIC8vIGNvbnN0cnVjdCBib3RoIGRpcmVjdGVkIGFuZCB1bmRpcmVjdGVkIHZlcnNpb24gb2YgdGhlIGRhZ1xuICAgIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgIGlmIChkYWcuaGFzKGNvbnN0cmFpbnQubGVmdCkpIHtcbiAgICAgICAgICBkYWcuZ2V0KGNvbnN0cmFpbnQubGVmdCkucHVzaCh7IGlkOiBjb25zdHJhaW50LnJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5sZWZ0LCBbeyBpZDogY29uc3RyYWludC5yaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiB9XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYWcuaGFzKGNvbnN0cmFpbnQucmlnaHQpKSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LnJpZ2h0LCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkYWcuaGFzKGNvbnN0cmFpbnQudG9wKSkge1xuICAgICAgICAgIGRhZy5nZXQoY29uc3RyYWludC50b3ApLnB1c2goeyBpZDogY29uc3RyYWludC5ib3R0b20sIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC50b3AsIFt7IGlkOiBjb25zdHJhaW50LmJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIgfV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGFnLmhhcyhjb25zdHJhaW50LmJvdHRvbSkpIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQuYm90dG9tLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRhZ1VuZGlyZWN0ZWQgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnKTtcbiAgICBjb21wb25lbnRzID0gZmluZENvbXBvbmVudHMoZGFnVW5kaXJlY3RlZCk7XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORykge1xuICAgIC8vIGZpcnN0IGNoZWNrIGZpeGVkIG5vZGUgY29uc3RyYWludFxuICAgIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ICYmIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSwgaSkge1xuICAgICAgICB0YXJnZXRNYXRyaXhbaV0gPSBbbm9kZURhdGEucG9zaXRpb24ueCwgbm9kZURhdGEucG9zaXRpb24ueV07XG4gICAgICAgIHNvdXJjZU1hdHJpeFtpXSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV1dO1xuICAgICAgfSk7XG4gICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoZW4gY2hlY2sgYWxpZ25tZW50IGNvbnN0cmFpbnRcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgICB2YXIgdmVydGljYWxBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKF9pNCkge1xuICAgICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25bX2k0XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB2YXIgeFBvcyA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHhQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB4UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS54O1xuXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduW19pNF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHRhcmdldE1hdHJpeFtjb3VudF0gPSBbeFBvcywgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBzb3VyY2VNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgdmVydGljYWxBbGlnbi5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICAgICAgICBfbG9vcDIoX2k0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgIHZhciBob3Jpem9udGFsQWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgICB2YXIgX2xvb3AzID0gZnVuY3Rpb24gX2xvb3AzKF9pNSkge1xuICAgICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbltfaTVdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZhciB5UG9zID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeVBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHlQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLnk7XG5cbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbltfaTVdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB0YXJnZXRNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5UG9zXTtcbiAgICAgICAgICAgICAgc291cmNlTWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGhvcml6b250YWxBbGlnbi5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICAgICAgICBfbG9vcDMoX2k1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgICAgIHJlZmxlY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgLy8gZmluYWxseSBjaGVjayByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludFxuICAgICAgLy8gZmluZCBsYXJnZXN0IGNvbXBvbmVudCBpbiBkYWdcbiAgICAgIHZhciBsYXJnZXN0Q29tcG9uZW50U2l6ZSA9IDA7XG4gICAgICB2YXIgbGFyZ2VzdENvbXBvbmVudEluZGV4ID0gMDtcbiAgICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaTYrKykge1xuICAgICAgICBpZiAoY29tcG9uZW50c1tfaTZdLmxlbmd0aCA+IGxhcmdlc3RDb21wb25lbnRTaXplKSB7XG4gICAgICAgICAgbGFyZ2VzdENvbXBvbmVudFNpemUgPSBjb21wb25lbnRzW19pNl0ubGVuZ3RoO1xuICAgICAgICAgIGxhcmdlc3RDb21wb25lbnRJbmRleCA9IF9pNjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgbGFyZ2VzdCBjb21wb25lbnQgaXNuJ3QgZG9taW5hbnQsIHRoZW4gdGFrZSB0aGUgdm90ZXMgZm9yIHJlZmxlY3Rpb25cbiAgICAgIGlmIChsYXJnZXN0Q29tcG9uZW50U2l6ZSA8IGRhZ1VuZGlyZWN0ZWQuc2l6ZSAvIDIpIHtcbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KTtcbiAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlO1xuICAgICAgICByZWZsZWN0aW9uVHlwZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGxhcmdlc3QgY29tcG9uZW50IGZvciB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAvLyBjb25zdHJ1Y3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3ViZ3JhcGhzIGluIHRoZSBsYXJnZXN0IGNvbXBvbmVudFxuICAgICAgICB2YXIgc3ViR3JhcGhPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBzdWJHcmFwaE9uVmVydGljYWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudCA9IFtdO1xuXG4gICAgICAgIGNvbXBvbmVudHNbbGFyZ2VzdENvbXBvbmVudEluZGV4XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBkYWcuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgICAgIGlmIChhZGphY2VudC5kaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KG5vZGVJZCkucHVzaChhZGphY2VudCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KG5vZGVJZCwgW2FkamFjZW50XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KGFkamFjZW50LmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQucHVzaCh7IGxlZnQ6IG5vZGVJZCwgcmlnaHQ6IGFkamFjZW50LmlkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQobm9kZUlkKS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KG5vZGVJZCwgW2FkamFjZW50XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdWJHcmFwaE9uVmVydGljYWwuaGFzKGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQoYWRqYWNlbnQuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudC5wdXNoKHsgdG9wOiBub2RlSWQsIGJvdHRvbTogYWRqYWNlbnQuaWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50KTtcbiAgICAgICAgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHN1YmdyYXBoc1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBIb3Jpem9udGFsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChzdWJHcmFwaE9uSG9yaXpvbnRhbCwgXCJob3Jpem9udGFsXCIpO1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBWZXJ0aWNhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoc3ViR3JhcGhPblZlcnRpY2FsLCBcInZlcnRpY2FsXCIpO1xuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBzb3VyY2UgYW5kIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAgICAgIGNvbXBvbmVudHNbbGFyZ2VzdENvbXBvbmVudEluZGV4XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQsIGkpIHtcbiAgICAgICAgICBzb3VyY2VNYXRyaXhbaV0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICB0YXJnZXRNYXRyaXhbaV0gPSBbXTtcbiAgICAgICAgICBpZiAocG9zaXRpb25NYXBIb3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMF0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVswXSA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb25NYXBWZXJ0aWNhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzFdID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzFdID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0cmFuc2Zvcm1hdGlvbiBpcyByZXF1aXJlZCwgdGhlbiBjYWxjdWxhdGUgYW5kIGFwcGx5IHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgIGlmIChzdGFuZGFyZFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAvKiBjYWxjdWxhdGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovXG4gICAgICB2YXIgdHJhbnNmb3JtYXRpb25NYXRyaXggPSB2b2lkIDA7XG4gICAgICB2YXIgdGFyZ2V0TWF0cml4VHJhbnNwb3NlID0gTWF0cml4LnRyYW5zcG9zZSh0YXJnZXRNYXRyaXgpOyAvLyBBJ1xuICAgICAgdmFyIHNvdXJjZU1hdHJpeFRyYW5zcG9zZSA9IE1hdHJpeC50cmFuc3Bvc2Uoc291cmNlTWF0cml4KTsgLy8gQidcblxuICAgICAgLy8gY2VudHJhbGl6ZSB0cmFuc3Bvc2UgbWF0cmljZXNcbiAgICAgIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IHRhcmdldE1hdHJpeFRyYW5zcG9zZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgICAgIHRhcmdldE1hdHJpeFRyYW5zcG9zZVtfaTddID0gTWF0cml4Lm11bHRHYW1tYSh0YXJnZXRNYXRyaXhUcmFuc3Bvc2VbX2k3XSk7XG4gICAgICAgIHNvdXJjZU1hdHJpeFRyYW5zcG9zZVtfaTddID0gTWF0cml4Lm11bHRHYW1tYShzb3VyY2VNYXRyaXhUcmFuc3Bvc2VbX2k3XSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvIGFjdHVhbCBjYWxjdWxhdGlvbiBmb3IgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICB2YXIgdGVtcE1hdHJpeCA9IE1hdHJpeC5tdWx0TWF0KHRhcmdldE1hdHJpeFRyYW5zcG9zZSwgTWF0cml4LnRyYW5zcG9zZShzb3VyY2VNYXRyaXhUcmFuc3Bvc2UpKTsgLy8gdGVtcE1hdHJpeCA9IEEnQlxuICAgICAgdmFyIFNWRFJlc3VsdCA9IFNWRC5zdmQodGVtcE1hdHJpeCk7IC8vIFNWRChBJ0IpID0gVVNWJywgc3ZkIGZ1bmN0aW9uIHJldHVybnMgVSwgUyBhbmQgViBcbiAgICAgIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gTWF0cml4Lm11bHRNYXQoU1ZEUmVzdWx0LlYsIE1hdHJpeC50cmFuc3Bvc2UoU1ZEUmVzdWx0LlUpKTsgLy8gdHJhbnNmb3JtYXRpb25NYXRyaXggPSBUID0gVlUnXG5cbiAgICAgIC8qIGFwcGx5IGZvdW5kIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBvYnRhaW4gZmluYWwgZHJhZnQgbGF5b3V0ICovXG4gICAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBub2RlSW5kZXhlcy5zaXplOyBfaTgrKykge1xuICAgICAgICB2YXIgdGVtcDEgPSBbeENvb3Jkc1tfaThdLCB5Q29vcmRzW19pOF1dO1xuICAgICAgICB2YXIgdGVtcDIgPSBbdHJhbnNmb3JtYXRpb25NYXRyaXhbMF1bMF0sIHRyYW5zZm9ybWF0aW9uTWF0cml4WzFdWzBdXTtcbiAgICAgICAgdmFyIHRlbXAzID0gW3RyYW5zZm9ybWF0aW9uTWF0cml4WzBdWzFdLCB0cmFuc2Zvcm1hdGlvbk1hdHJpeFsxXVsxXV07XG4gICAgICAgIHhDb29yZHNbX2k4XSA9IE1hdHJpeC5kb3RQcm9kdWN0KHRlbXAxLCB0ZW1wMik7XG4gICAgICAgIHlDb29yZHNbX2k4XSA9IE1hdHJpeC5kb3RQcm9kdWN0KHRlbXAxLCB0ZW1wMyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGxpZWQgb25seSBib3RoIGFsaWdubWVudCBhbmQgcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHMgZXhpc3RcbiAgICAgIGlmIChyZWZsZWN0aW9uVHlwZSkge1xuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMpIHtcbiAgICAvKioqKiAgZW5mb3JjZSBjb25zdHJhaW50cyBvbiB0aGUgdHJhbnNmb3JtZWQgZHJhZnQgbGF5b3V0ICoqKiovXG5cbiAgICAvKiBmaXJzdCBlbmZvcmNlIGZpeGVkIG5vZGUgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgdHJhbnNsYXRpb25BbW91bnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEsIGkpIHtcbiAgICAgICAgdmFyIHBvc0luVGhlb3J5ID0geyB4OiB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSwgeTogeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gfTtcbiAgICAgICAgdmFyIHBvc0Rlc2lyZWQgPSBub2RlRGF0YS5wb3NpdGlvbjtcbiAgICAgICAgdmFyIHBvc0RpZmYgPSBjYWxjdWxhdGVQb3NpdGlvbkRpZmYocG9zRGVzaXJlZCwgcG9zSW5UaGVvcnkpO1xuICAgICAgICB0cmFuc2xhdGlvbkFtb3VudC54ICs9IHBvc0RpZmYueDtcbiAgICAgICAgdHJhbnNsYXRpb25BbW91bnQueSArPSBwb3NEaWZmLnk7XG4gICAgICB9KTtcbiAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnggLz0gY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGg7XG4gICAgICB0cmFuc2xhdGlvbkFtb3VudC55IC89IGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoO1xuXG4gICAgICB4Q29vcmRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgIHhDb29yZHNbaV0gKz0gdHJhbnNsYXRpb25BbW91bnQueDtcbiAgICAgIH0pO1xuXG4gICAgICB5Q29vcmRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgIHlDb29yZHNbaV0gKz0gdHJhbnNsYXRpb25BbW91bnQueTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldID0gbm9kZURhdGEucG9zaXRpb24ueDtcbiAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gPSBub2RlRGF0YS5wb3NpdGlvbi55O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyogdGhlbiBlbmZvcmNlIGFsaWdubWVudCBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgdmFyIHhBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgdmFyIF9sb29wNCA9IGZ1bmN0aW9uIF9sb29wNChfaTkpIHtcbiAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHhBbGlnbltfaTldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHZhciB4UG9zID0gdm9pZCAwO1xuICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHhQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB4UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS54O1xuXG4gICAgICAgICAgYWxpZ25tZW50U2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHhQb3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgeEFsaWduLmxlbmd0aDsgX2k5KyspIHtcbiAgICAgICAgICBfbG9vcDQoX2k5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICB2YXIgeUFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgIHZhciBfbG9vcDUgPSBmdW5jdGlvbiBfbG9vcDUoX2kxMCkge1xuICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgeUFsaWduW19pMTBdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHZhciB5UG9zID0gdm9pZCAwO1xuICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHlQb3MgPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB5UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS55O1xuXG4gICAgICAgICAgYWxpZ25tZW50U2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHlQb3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCB5QWxpZ24ubGVuZ3RoOyBfaTEwKyspIHtcbiAgICAgICAgICBfbG9vcDUoX2kxMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBmaW5hbGx5IGVuZm9yY2UgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBmaXhlZE5vZGVzT25Ib3Jpem9udGFsID0gbmV3IFNldCgpO1xuICAgICAgICB2YXIgZml4ZWROb2Rlc09uVmVydGljYWwgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgLy8gZmlsbCBtYXBzIGFuZCBzZXRzICAgICAgXG4gICAgICAgIGZpeGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQobm9kZUlkKTtcbiAgICAgICAgICBmaXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQobm9kZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ25tZW50ID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICAgICAgdmFyIF9sb29wNiA9IGZ1bmN0aW9uIF9sb29wNihfaTExKSB7XG4gICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTEsIFtdKTtcbiAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnRbX2kxMV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBfaTExKTtcbiAgICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBfaTExKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKFwiZHVtbXlcIiArIF9pMTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTEsIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHZlcnRpY2FsQWxpZ25tZW50W19pMTFdWzBdKV0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB2ZXJ0aWNhbEFsaWdubWVudC5sZW5ndGg7IF9pMTErKykge1xuICAgICAgICAgICAgICBfbG9vcDYoX2kxMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgICAgIHZhciBob3Jpem9udGFsQWxpZ25tZW50ID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgICAgICB2YXIgX2xvb3A3ID0gZnVuY3Rpb24gX2xvb3A3KF9pMTIpIHtcbiAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTEyLCBbXSk7XG4gICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnRbX2kxMl0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIF9pMTIpO1xuICAgICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgX2kxMikucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICBmaXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQoXCJkdW1teVwiICsgX2kxMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTEyLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChob3Jpem9udGFsQWxpZ25tZW50W19pMTJdWzBdKV0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2kxMiA9IDA7IF9pMTIgPCBob3Jpem9udGFsQWxpZ25tZW50Lmxlbmd0aDsgX2kxMisrKSB7XG4gICAgICAgICAgICAgIF9sb29wNyhfaTEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zdHJ1Y3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGFncyAoc3ViZ3JhcGhzKSBmcm9tIG92ZXJhbGwgZGFnXG4gICAgICAgIHZhciBkYWdPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkYWdPblZlcnRpY2FsID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIHZhciBfbG9vcDggPSBmdW5jdGlvbiBfbG9vcDgobm9kZUlkKSB7XG4gICAgICAgICAgZGFnLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlSWQgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChhZGphY2VudFtcImRpcmVjdGlvblwiXSA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBzb3VyY2VJZCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpIDogbm9kZUlkO1xuICAgICAgICAgICAgICBpZiAobm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHsgaWQ6IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGFkamFjZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkYWdPbkhvcml6b250YWwuaGFzKHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5nZXQoc291cmNlSWQpLnB1c2godGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLnNldChzb3VyY2VJZCwgW3RhcmdldE5vZGVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhZ09uSG9yaXpvbnRhbC5oYXModGFyZ2V0Tm9kZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuc2V0KHRhcmdldE5vZGUuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291cmNlSWQgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgOiBub2RlSWQ7XG4gICAgICAgICAgICAgIGlmIChub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB7IGlkOiBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGFkamFjZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkYWdPblZlcnRpY2FsLmhhcyhzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLmdldChzb3VyY2VJZCkucHVzaCh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLnNldChzb3VyY2VJZCwgW3RhcmdldE5vZGVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhZ09uVmVydGljYWwuaGFzKHRhcmdldE5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5zZXQodGFyZ2V0Tm9kZS5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNSA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I1ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IGRhZy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDU7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSAoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDUudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wOChub2RlSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZpbmQgc291cmNlIG5vZGVzIG9mIGVhY2ggY29tcG9uZW50IGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRhZ3NcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I1ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjUgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgJiYgX2l0ZXJhdG9yNS5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNS5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNSkge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuZGlyZWN0ZWRPbkhvcml6b250YWwgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHVuZGlyZWN0ZWRPblZlcnRpY2FsID0gZGFnVG9VbmRpcmVjdGVkKGRhZ09uVmVydGljYWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50c09uSG9yaXpvbnRhbCA9IGZpbmRDb21wb25lbnRzKHVuZGlyZWN0ZWRPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50c09uVmVydGljYWwgPSBmaW5kQ29tcG9uZW50cyh1bmRpcmVjdGVkT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciByZXZlcnNlZERhZ09uSG9yaXpvbnRhbCA9IGRhZ1RvUmV2ZXJzZWQoZGFnT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHJldmVyc2VkRGFnT25WZXJ0aWNhbCA9IGRhZ1RvUmV2ZXJzZWQoZGFnT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsID0gW107XG4gICAgICAgIHZhciBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbCA9IFtdO1xuXG4gICAgICAgIGNvbXBvbmVudHNPbkhvcml6b250YWwuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWxbaW5kZXhdID0gW107XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkRGFnT25Ib3Jpem9udGFsLmdldChub2RlSWQpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWxbaW5kZXhdLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50c09uVmVydGljYWwuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsW2luZGV4XSA9IFtdO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChyZXZlcnNlZERhZ09uVmVydGljYWwuZ2V0KG5vZGVJZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50U291cmNlc09uVmVydGljYWxbaW5kZXhdLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciBzdWJncmFwaHNcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZGFnT25Ib3Jpem9udGFsLCBcImhvcml6b250YWxcIiwgZml4ZWROb2Rlc09uSG9yaXpvbnRhbCwgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudCwgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBwb3NpdGlvbk1hcFZlcnRpY2FsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChkYWdPblZlcnRpY2FsLCBcInZlcnRpY2FsXCIsIGZpeGVkTm9kZXNPblZlcnRpY2FsLCBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQsIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsKTtcblxuICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb25zIG9mIHRoZSBub2RlcyBiYXNlZCBvbiByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcblxuICAgICAgICB2YXIgX2xvb3A5ID0gZnVuY3Rpb24gX2xvb3A5KGtleSkge1xuICAgICAgICAgIGlmIChkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChrZXkpKSB7XG4gICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChrZXkpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNiA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I2ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNiA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDY7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSAoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDYudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wOShrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjYgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgJiYgX2l0ZXJhdG9yNi5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNi5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNikge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9sb29wMTAgPSBmdW5jdGlvbiBfbG9vcDEwKGtleSkge1xuICAgICAgICAgIGlmIChkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNyA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I3ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNyA9IHBvc2l0aW9uTWFwVmVydGljYWwua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA3OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gKF9zdGVwNyA9IF9pdGVyYXRvcjcubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX3N0ZXA3LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDEwKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjcgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNyA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyAmJiBfaXRlcmF0b3I3LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I3LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I3KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXNzaWduIG5ldyBjb29yZGluYXRlcyB0byBub2RlcyBhZnRlciBjb25zdHJhaW50IGhhbmRsaW5nXG4gIGZvciAodmFyIF9pMTMgPSAwOyBfaTEzIDwgYWxsTm9kZXMubGVuZ3RoOyBfaTEzKyspIHtcbiAgICB2YXIgX25vZGUgPSBhbGxOb2Rlc1tfaTEzXTtcbiAgICBpZiAoX25vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBfbm9kZS5zZXRDZW50ZXIoeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoX25vZGUuaWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoX25vZGUuaWQpXSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnN0cmFpbnRIYW5kbGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTUxOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181NTFfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfXztcbi8qKioqKiovIH0pKClcbjtcbn0pOyIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvID4gZGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xcbiAgICBjb2xvcjogIzAwNzRkOTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDAuMjtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC1pY29uLXVuZG8ge1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLFlBQVk7SUFDWixVQUFVO0lBQ1YsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsMENBQTBDO0FBQzlDO0FBQ0E7SUFDSSxrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksVUFBVTtBQUNkO0FBQ0E7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0FBQzdCO0FBQ0E7SUFDSSxlQUFlO0lBQ2Ysd0JBQXdCO0FBQzVCO0FBQ0E7SUFDSSxlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5fZGFzaC11bmRvLXJlZG8ge1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogMzBweDtcXG4gICAgbGVmdDogMzBweDtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDk5OTk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkbyA+IGRpdiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcXG4gICAgY29sb3I6ICMwMDc0ZDk7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBvcGFjaXR5OiAwLjI7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLXVuZG8tcmVkby1sYWJlbCB7XFxuICAgIGZvbnQtc2l6ZTogMTVweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmRhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXIge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHdpZHRoOiA4MHZ3O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC8qIHNoYWRvdy0xICovXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxcbiAgICAgICAgMHB4IDJweCA2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTIpLFxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLWluZm8ge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcGFkZGluZzogOHB4O1xcbiAgICBib3R0b206IDE2cHg7XFxuICAgIGxlZnQ6IDE2cHg7XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMzJweCk7XFxuICAgIG1heC1oZWlnaHQ6IDUwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2NjYztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGxpbmUtaGVpZ2h0OiAyZW07XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDNweDtcXG4gICAgcmlnaHQ6IDNweDtcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiOzs0Q0FFd0M7QUFDNUM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixvQ0FBb0M7SUFDcEMsc0JBQXNCO0lBQ3RCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtBQUNkXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogODB2dztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA3NXB4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDE2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTY1KSxcXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgYm90dG9tOiAxNnB4O1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xcbiAgICBtYXgtaGVpZ2h0OiA1MCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBsaW5lLWhlaWdodDogMmVtO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAzcHg7XFxuICAgIHJpZ2h0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5lcnJvci1jb250YWluZXIge1xcbiAgICBwYWRkaW5nOiAwIDEwcHg7XFxuICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMDtcXG4gICAgdG9wOiAwO1xcbiAgICBjb2xvcjogI2I5YzJjZTtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXg6aG92ZXIge1xcbiAgICBjb2xvcjogI2ExYTliNTtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JzIHtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tZXJyb3Ige1xcbiAgICB3aWR0aDogMjBweDtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbi1yaWdodDogMTZweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tY2xvc2Uge1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxMnB4O1xcbiAgICB0b3A6IDEycHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tYXJyb3cge1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDI4cHg7XFxuICAgIG1hcmdpbjogMHB4IDhweDtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XFxuICAgIC8qXFxuICAgICAqIDc3JSBpcyB0aGUgbWF4aW11bSBzcGFjZSBhbGxvd2VkIGJhc2VkIG9mZiBvZiB0aGUgb3RoZXIgZWxlbWVudHNcXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cXG4gICAgICogdGhpcyB3YXMgbWFudWFsbHkgZGV0ZXJtaW5lZCAqL1xcbiAgICB3aWR0aDogNzclO1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5kYXNoLWZlLWVycm9yX190aXRsZSB7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgIG1hcmdpbjogMHB4O1xcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBsaW5lLWhlaWdodDogMjBweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCB7XFxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2NvbGxhcHNlLS1mbGlwcGVkIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2luZm9fdGl0bGUge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGNvbG9yOiAjNTA2Nzg0O1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZzogMTBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2luZm8ge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcXG4gICAgcGFkZGluZzogMTBweDtcXG5cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIGNvbG9yOiAjNTA2Nzg0O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLXRvcCB7XFxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLWJvdHRvbSB7XFxuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQ6IDRweDtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tcmlnaHQ6IDRweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZWZlZjtcXG59XFxuXFxuLmRhc2gtYmUtZXJyb3JfX3N0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgLyogaWZyYW1lIGNvbnRhaW5lciBoYW5kbGVzIHRoZSBzY3JvbGxpbmcgKi9cXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3RyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjZmYTtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBsaW5lLWhlaWdodDogMTdweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbn1cXG5cXG4uZGFzaC1iYWNrZW5kLWVycm9yIHtcXG4gICAgcGFkZGluZzogOHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1tZW51IHtcXG4gICAgbWF4LXdpZHRoOiA1MCU7XFxuICAgIG1heC1oZWlnaHQ6IDYwJTtcXG4gICAgZGlzcGxheTogY29udGVudHM7XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29tbW9uLWxpZ2F0dXJlcztcXG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZCB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgLyogc2hhZG93LTEgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBhbmltYXRpb246IGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24gMC41cztcXG4gICAgcGFkZGluZzogMjRweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAtMzAwcHg7XFxuICAgIGxlZnQ6IC0xcHg7XFxuICAgIGFuaW1hdGlvbjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogbm9uZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VjZWNlYztcXG4gICAgYm9yZGVyLWJvdHRvbTogMDtcXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xcbiAgICB3aWR0aDogNDIycHg7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIHdpZHRoOiA2MDBweDtcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxcbiAgICAgICAgMHB4IDEuOXB4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KSxcXG4gICAgICAgIDBweCA0LjVweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX190b3BiYXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTRweDtcXG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSA+IHN0cm9uZyB7XFxuICAgIGNvbG9yOiAjZmY0NTAwO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBmb250LXNpemU6IDEyLjZweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3ItaXRlbSB7XFxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwYWRkaW5nOiA4cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuQGtleWZyYW1lcyBkYXNoLWVycm9yLWNhcmQtYW5pbWF0aW9uIHtcXG4gICAgZnJvbSB7XFxuICAgICAgICBvcGFjaXR5OiAwO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgIH1cXG4gICAgdG8ge1xcbiAgICAgICAgb3BhY2l0eTogMTtcXG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgfVxcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixxQkFBcUI7SUFDckIsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsU0FBUztJQUNULHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0FBQ25CO0FBQ0E7SUFDSTs7O3FDQUdpQztJQUNqQyxVQUFVO0FBQ2Q7QUFDQTtJQUNJLG9CQUFvQjtJQUNwQixtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxpQ0FBaUM7SUFDakMsNkJBQTZCO0lBQzdCLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFNBQVM7SUFDVCxjQUFjO0lBQ2QsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLDJCQUEyQjtJQUMzQiw0QkFBNEI7SUFDNUIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsYUFBYTs7SUFFYix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxjQUFjO0lBQ2QscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1Qix3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLDJDQUEyQztJQUMzQyxnQkFBZ0I7SUFDaEIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLGVBQWU7SUFDZix3Q0FBd0M7SUFDeEMsc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLHlDQUF5QztJQUN6QyxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtJQUN2QixXQUFXO0FBQ2Y7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsVUFBVTtJQUNWLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLFlBQVk7QUFDaEI7QUFDQTtJQUNJLGFBQWE7SUFDYixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsY0FBYztJQUNkLGtCQUFrQjtJQUNsQjs7OENBRTBDO0FBQzlDOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixhQUFhO0lBQ2IsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG9CQUFvQjtJQUNwQixnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLDJCQUEyQjtJQUMzQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmVycm9yLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IENvdXJpZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXgge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIGNvbG9yOiAjYjljMmNlO1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlciB7XFxuICAgIGNvbG9yOiAjYTFhOWI1O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcnMge1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1lcnJvciB7XFxuICAgIHdpZHRoOiAyMHB4O1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1jbG9zZSB7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIHRvcDogMTJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogMjhweDtcXG4gICAgbWFyZ2luOiAwcHggOHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwOmZpcnN0LWNoaWxkIHtcXG4gICAgLypcXG4gICAgICogNzclIGlzIHRoZSBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgYmFzZWQgb2ZmIG9mIHRoZSBvdGhlciBlbGVtZW50c1xcbiAgICAgKiBpbiB0aGUgdG9wIHBhcnQgb2YgdGhlIGVycm9yIGNvbnRhaW5lciAodGltZXN0YW1wICYgY29sbGFwc2UgYXJyb3cpLlxcbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXFxuICAgIHdpZHRoOiA3NyU7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpdGxlIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgbWFyZ2luOiAwcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgZm9udC1zaXplOiAxMi42cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtdG9wIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtYm90dG9tIHtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmVmO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdHIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxufVxcblxcbi5kYXNoLWJhY2tlbmQtZXJyb3Ige1xcbiAgICBwYWRkaW5nOiA4cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLW1lbnUge1xcbiAgICBtYXgtd2lkdGg6IDUwJTtcXG4gICAgbWF4LWhlaWdodDogNjAlO1xcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xcbiAgICBwYWRkaW5nOiAyNHB4O1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IC0zMDBweDtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYW5pbWF0aW9uOiBub25lO1xcbiAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xcbiAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XFxuICAgIHdpZHRoOiA0MjJweDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbiAgICBmb250LXdlaWdodDogNzAwO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlID4gc3Ryb25nIHtcXG4gICAgY29sb3I6ICNmZjQ1MDA7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvci1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5wZXJjeS1zaG93IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuQG1lZGlhIG9ubHkgcGVyY3kge1xcbiAgICAucGVyY3ktaGlkZSB7XFxuICAgICAgICBkaXNwbGF5OiBub25lO1xcbiAgICB9XFxuICAgIC5wZXJjeS1zaG93IHtcXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICB9XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGFBQWE7SUFDakI7SUFDQTtRQUNJLGNBQWM7SUFDbEI7QUFDSlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIucGVyY3ktc2hvdyB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbkBtZWRpYSBvbmx5IHBlcmN5IHtcXG4gICAgLnBlcmN5LWhpZGUge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgfVxcbiAgICAucGVyY3ktc2hvdyB7XFxuICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgfVxcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuZGFzaC1kZWJ1Zy1tZW51IHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIHBhZGRpbmc6IDAgOHB4O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGdhcDogNnB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fcG9wdXAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGdhcDogOHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNzVweCk7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHdpZHRoOiA0MjZweDtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAgIGdhcDogOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcXG4gICAgYmFja2dyb3VuZDogI2ZmZjtcXG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgLyogU2hhZG93L1NtYWxsICovXFxuICAgIGJveC1zaGFkb3c6IDBweCAwLjdweCAxLjRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA3KSxcXG4gICAgICAgIDBweCAxLjlweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgYSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XFxuICAgIHBhZGRpbmc6IDE2cHggMTJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b25zLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGdhcDogOHB4O1xcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgcGFkZGluZy10b3A6IDE2cHg7XFxuICAgIG1hcmdpbi10b3A6IDE2cHg7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9uLXByaW1hcnkge1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1zZWNvbmRhcnkge1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzNCwgNzQsIDIxMiwgMC44KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMDhkZTQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IC0xcHg7XFxuICAgIHJpZ2h0OiAtMXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjb2xvcjogYmxhY2s7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgMDtcXG4gICAgcGFkZGluZzogMTVweCAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBib3gtc2hhZG93OiAwcHggMC44cHggMC44cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNCksXFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XFxuICAgIG1heC13aWR0aDogNTBweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xcbiAgICBtYXgtd2lkdGg6IDY4MnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogY2FsYygxMDAlICsgMTJweCk7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIHBhZGRpbmc6IDExcHg7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMTRweCA1cHggIzAwMDAwMDEyO1xcbiAgICB6LWluZGV4OiAxMjAwO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X190b2dnbGUge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG59XFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlLS1leHBhbmRlZCB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvciB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogOHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREMzRTQyO1xcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAzcHg7XFxuICAgIHRvcDogMTNweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fc3RhdHVzIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiA2cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2U7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXIge1xcbiAgICB3aWR0aDogMS41cHg7XFxuICAgIGhlaWdodDogMjZweDtcXG4gICAgbWFyZ2luOiAwcHggMTNweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMTU1OTRkO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24ge1xcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJveC1zaGFkb3c6IDAgMXB4ICNkM2RhZTY7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBjb2xvcjogYmxhY2s7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm94LXNoYWRvdzogMCAycHggIzAwNzFjMjtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZDpob3ZlciB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XFxuICAgIHBhZGRpbmc6IDNweCA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmRhc2gtZGVidWctZGlzY29ubmVjdGVkIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLHlCQUF5QjtJQUN6QixtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFlBQVk7SUFDWixlQUFlO0FBQ25CO0FBQ0E7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osY0FBYztJQUNkLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsYUFBYTtJQUNiLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixRQUFRO0lBQ1IsUUFBUTtJQUNSLDhCQUE4QjtJQUM5Qix5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsWUFBWTtJQUNaLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLFFBQVE7SUFDUixrQkFBa0I7SUFDbEIsdUNBQXVDO0lBQ3ZDLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQjs7OENBRTBDO0FBQzlDOztBQUVBO0lBQ0kscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksY0FBYztJQUNkLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFFBQVE7SUFDUixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsMkNBQTJDO0FBQy9DOztBQUVBO0lBQ0ksWUFBWTtJQUNaLFdBQVc7SUFDWCxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxvQ0FBb0M7SUFDcEMsY0FBYztJQUNkLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx3QkFBd0I7SUFDeEIsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qjs2Q0FDeUM7SUFDekMsdUNBQXVDO0FBQzNDO0FBQ0E7SUFDSSxlQUFlO0FBQ25CO0FBQ0E7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLFFBQVE7SUFDUixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsMkJBQTJCO0lBQzNCLGFBQWE7SUFDYixzQ0FBc0M7SUFDdEMsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLHlCQUF5QjtBQUM3QjtBQUNBO0lBQ0ksVUFBVTtJQUNWLFdBQVc7SUFDWCx5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsU0FBUztBQUNiO0FBQ0E7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFFBQVE7QUFDWjs7QUFFQTtJQUNJLGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsaUJBQWlCO0lBQ2pCLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsMkJBQTJCO0FBQy9COztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsaUNBQWlDO0lBQ2pDLDJDQUEyQztJQUMzQyxpQkFBaUI7SUFDakIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCx5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsY0FBYztJQUNkLGVBQWU7SUFDZjs2Q0FDeUM7SUFDekMsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1osc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFdBQVc7SUFDWCx5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixnQkFBZ0I7QUFDcEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudSB7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzNXB4O1xcbiAgICByaWdodDogMzVweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDEwMDAxO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTE5ZGZmO1xcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgICB3aWR0aDogNjRweDtcXG4gICAgaGVpZ2h0OiA2NHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnUtLW9wZW4ge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTgwZGVnKTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIgYnV0dG9uIHtcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBwYWRkaW5nOiAwIDhweDtcXG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgYm9yZGVyLXJhZGl1czogMHB4O1xcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBnYXA6IDZweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3BvcHVwIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IDEwMCU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICBnYXA6IDhweDtcXG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXQge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICB3aWR0aDogNDI2cHg7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbiAgICBnYXA6IDhweDtcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxuICAgIGJhY2tncm91bmQ6ICNmZmY7XFxuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIC8qIFNoYWRvdy9TbWFsbCAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IGEge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgc3BhbiB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXQgYnV0dG9uIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xcbiAgICBwYWRkaW5nOiAxNnB4IDEycHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9ucy1jb250YWluZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDhweDtcXG4gICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHBhZGRpbmctdG9wOiAxNnB4O1xcbiAgICBtYXJnaW4tdG9wOiAxNnB4O1xcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1wcmltYXJ5IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBjb2xvcjogI2ZmZjtcXG4gICAgYmFja2dyb3VuZDogIzdmNGJjNDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b24tc2Vjb25kYXJ5IHtcXG4gICAgYmFja2dyb3VuZDogcmdiYSgxNjEsIDg5LCAyNTUsIDAuMDUpO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzQsIDc0LCAyMTIsIDAuOCk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTA4ZGU0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciB7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAtMXB4O1xcbiAgICByaWdodDogLTFweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgY29sb3I6IGJsYWNrO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDEwMDAwO1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHggMCAwIDA7XFxuICAgIHBhZGRpbmc6IDE1cHggMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjZmYTtcXG4gICAgYm94LXNoYWRvdzogMHB4IDAuOHB4IDAuOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDQpLFxcbiAgICAgICAgMHB4IDIuM3B4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjAzKTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlci5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jb2xsYXBzZWQge1xcbiAgICBtYXgtd2lkdGg6IDUwcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWV4cGFuZGVkIHtcXG4gICAgbWF4LXdpZHRoOiA2ODJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xcbiAgICByaWdodDogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBwYWRkaW5nOiAxMXB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDE0cHggNXB4ICMwMDAwMDAxMjtcXG4gICAgei1pbmRleDogMTIwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZS0tZXhwYW5kZWQge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3Ige1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDhweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0RDM0U0MjtcXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogM3B4O1xcbiAgICB0b3A6IDEzcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19kaXZpZGVyIHtcXG4gICAgd2lkdGg6IDEuNXB4O1xcbiAgICBoZWlnaHQ6IDI2cHg7XFxuICAgIG1hcmdpbjogMHB4IDEzcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDE1NTk0ZDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBib3gtc2hhZG93OiAwIDFweCAjZDNkYWU2O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgY29sb3I6IGJsYWNrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIGJveC1zaGFkb3c6IDAgMnB4ICMwMDcxYzI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQ6aG92ZXIge1xcbiAgICBjb2xvcjogIzU4MDZjNDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBmb250LXNpemU6IDEwcHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLWFsZXJ0LWxhYmVsIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDgxcHg7XFxuICAgIHJpZ2h0OiAyOXB4O1xcbiAgICB6LWluZGV4OiAxMDAwMjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcXG4gICAgYm9yZGVyLXJhZGl1czogMzJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHBhZGRpbmc6IDRweDtcXG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZXJyb3ItY291bnQge1xcbiAgICBmb250LXNpemU6IDEycHg7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzczYTNhO1xcbiAgICBwYWRkaW5nOiAzcHggNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgbWFyZ2luLWxlZnQ6IDNweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYSB7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDJweCA1cHg7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBmb250LXNpemU6IDEwcHQ7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXA6YWZ0ZXIge1xcbiAgICBjb250ZW50OiAnICc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAxMDAlO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcbiAgICBib3JkZXItd2lkdGg6IDEwcHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ExNTlmZjBkO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIHBhZGRpbmc6IDBweCA4cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7O0lBRUksaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCxlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixhQUFhO0lBQ2IsMkNBQTJDO0lBQzNDLGdCQUFnQjtJQUNoQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsdURBQXVEO0FBQzNEOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLDJCQUEyQjtJQUMzQixjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLDJDQUEyQztJQUMzQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLHVCQUF1QjtJQUN2QixjQUFjO0FBQ2xCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCBidXR0b24sXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGEge1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBwYWRkaW5nOiAycHggNXB4O1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgZm9udC1zaXplOiAxMHB0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwOmFmdGVyIHtcXG4gICAgY29udGVudDogJyAnO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMTAwJTtcXG4gICAgbGVmdDogNTAlO1xcbiAgICBtYXJnaW4tbGVmdDogLTVweDtcXG4gICAgYm9yZGVyLXdpZHRoOiAxMHB4O1xcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgICBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNhMTU5ZmYwZDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBwYWRkaW5nOiAwcHggOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBib3JkZXItY29sb3I6ICM4NjRhZDQzMztcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiZGFncmVcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiZGFncmVcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJkYWdyZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaW1wbCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7IC8vIHJlZ2lzdGVycyB0aGUgZXh0ZW5zaW9uIG9uIGEgY3l0b3NjYXBlIGxpYiByZWZcblxuXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cblxuICBjeXRvc2NhcGUoJ2xheW91dCcsICdkYWdyZScsIGltcGwpOyAvLyByZWdpc3RlciB3aXRoIGN5dG9zY2FwZS5qc1xufTtcblxuaWYgKHR5cGVvZiBjeXRvc2NhcGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIGV4cG9zZSB0byBnbG9iYWwgY3l0b3NjYXBlIChpLmUuIHdpbmRvdy5jeXRvc2NhcGUpXG4gIHJlZ2lzdGVyKGN5dG9zY2FwZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVnaXN0ZXI7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBkZWZhdWx0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgZGFncmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOyAvLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5cblxuZnVuY3Rpb24gRGFncmVMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbn0gLy8gcnVucyB0aGUgbGF5b3V0XG5cblxuRGFncmVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBsYXlvdXQgPSB0aGlzO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5OyAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG5cbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgdmFyIGdldFZhbCA9IGZ1bmN0aW9uIGdldFZhbChlbGUsIHZhbCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbCkgPyB2YWwuYXBwbHkoZWxlLCBbZWxlXSkgOiB2YWw7XG4gIH07XG5cbiAgdmFyIGJiID0gb3B0aW9ucy5ib3VuZGluZ0JveCB8fCB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9O1xuXG4gIGlmIChiYi54MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueDIgPSBiYi54MSArIGJiLnc7XG4gIH1cblxuICBpZiAoYmIudyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIH1cblxuICBpZiAoYmIueTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLnkyID0gYmIueTEgKyBiYi5oO1xuICB9XG5cbiAgaWYgKGJiLmggPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG5cbiAgdmFyIGcgPSBuZXcgZGFncmUuZ3JhcGhsaWIuR3JhcGgoe1xuICAgIG11bHRpZ3JhcGg6IHRydWUsXG4gICAgY29tcG91bmQ6IHRydWVcbiAgfSk7XG4gIHZhciBnT2JqID0ge307XG5cbiAgdmFyIHNldEdPYmogPSBmdW5jdGlvbiBzZXRHT2JqKG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgZ09ialtuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgc2V0R09iaignbm9kZXNlcCcsIG9wdGlvbnMubm9kZVNlcCk7XG4gIHNldEdPYmooJ2VkZ2VzZXAnLCBvcHRpb25zLmVkZ2VTZXApO1xuICBzZXRHT2JqKCdyYW5rc2VwJywgb3B0aW9ucy5yYW5rU2VwKTtcbiAgc2V0R09iaigncmFua2RpcicsIG9wdGlvbnMucmFua0Rpcik7XG4gIHNldEdPYmooJ2FsaWduJywgb3B0aW9ucy5hbGlnbik7XG4gIHNldEdPYmooJ3JhbmtlcicsIG9wdGlvbnMucmFua2VyKTtcbiAgc2V0R09iaignYWN5Y2xpY2VyJywgb3B0aW9ucy5hY3ljbGljZXIpO1xuICBnLnNldEdyYXBoKGdPYmopO1xuICBnLnNldERlZmF1bHRFZGdlTGFiZWwoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGcuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTsgLy8gYWRkIG5vZGVzIHRvIGRhZ3JlXG5cbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuXG4gIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMuc29ydCkpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBub2RlLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgZy5zZXROb2RlKG5vZGUuaWQoKSwge1xuICAgICAgd2lkdGg6IG5iYi53LFxuICAgICAgaGVpZ2h0OiBuYmIuaCxcbiAgICAgIG5hbWU6IG5vZGUuaWQoKVxuICAgIH0pOyAvLyBjb25zb2xlLmxvZyggZy5ub2RlKG5vZGUuaWQoKSkgKTtcbiAgfSAvLyBzZXQgY29tcG91bmQgcGFyZW50c1xuXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcblxuICAgIGlmIChfbm9kZS5pc0NoaWxkKCkpIHtcbiAgICAgIGcuc2V0UGFyZW50KF9ub2RlLmlkKCksIF9ub2RlLnBhcmVudCgpLmlkKCkpO1xuICAgIH1cbiAgfSAvLyBhZGQgZWRnZXMgdG8gZGFncmVcblxuXG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKS5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gIWVkZ2Uuc291cmNlKCkuaXNQYXJlbnQoKSAmJiAhZWRnZS50YXJnZXQoKS5pc1BhcmVudCgpOyAvLyBkYWdyZSBjYW4ndCBoYW5kbGUgZWRnZXMgb24gY29tcG91bmQgbm9kZXNcbiAgfSk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIGVkZ2VzID0gZWRnZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWRnZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbX2kyXTtcbiAgICBnLnNldEVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIHtcbiAgICAgIG1pbmxlbjogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMubWluTGVuKSxcbiAgICAgIHdlaWdodDogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMuZWRnZVdlaWdodCksXG4gICAgICBuYW1lOiBlZGdlLmlkKClcbiAgICB9LCBlZGdlLmlkKCkpOyAvLyBjb25zb2xlLmxvZyggZy5lZGdlKGVkZ2Uuc291cmNlKCkuaWQoKSwgZWRnZS50YXJnZXQoKS5pZCgpLCBlZGdlLmlkKCkpICk7XG4gIH1cblxuICBkYWdyZS5sYXlvdXQoZyk7XG4gIHZhciBnTm9kZUlkcyA9IGcubm9kZXMoKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBnTm9kZUlkcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGlkID0gZ05vZGVJZHNbX2kzXTtcbiAgICB2YXIgbiA9IGcubm9kZShpZCk7XG4gICAgY3kuZ2V0RWxlbWVudEJ5SWQoaWQpLnNjcmF0Y2goKS5kYWdyZSA9IG47XG4gIH1cblxuICB2YXIgZGFncmVCQjtcblxuICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgIGRhZ3JlQkIgPSB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTE6IEluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eVxuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGRNb2RlbCA9IG5vZGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgICAgZGFncmVCQi54MSA9IE1hdGgubWluKGRhZ3JlQkIueDEsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueDIgPSBNYXRoLm1heChkYWdyZUJCLngyLCBkTW9kZWwueCk7XG4gICAgICBkYWdyZUJCLnkxID0gTWF0aC5taW4oZGFncmVCQi55MSwgZE1vZGVsLnkpO1xuICAgICAgZGFncmVCQi55MiA9IE1hdGgubWF4KGRhZ3JlQkIueTIsIGRNb2RlbC55KTtcbiAgICB9KTtcbiAgICBkYWdyZUJCLncgPSBkYWdyZUJCLngyIC0gZGFncmVCQi54MTtcbiAgICBkYWdyZUJCLmggPSBkYWdyZUJCLnkyIC0gZGFncmVCQi55MTtcbiAgfSBlbHNlIHtcbiAgICBkYWdyZUJCID0gYmI7XG4gIH1cblxuICB2YXIgY29uc3RyYWluUG9zID0gZnVuY3Rpb24gY29uc3RyYWluUG9zKHApIHtcbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgdmFyIHhQY3QgPSBkYWdyZUJCLncgPT09IDAgPyAwIDogKHAueCAtIGRhZ3JlQkIueDEpIC8gZGFncmVCQi53O1xuICAgICAgdmFyIHlQY3QgPSBkYWdyZUJCLmggPT09IDAgPyAwIDogKHAueSAtIGRhZ3JlQkIueTEpIC8gZGFncmVCQi5oO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEgKyB4UGN0ICogYmIudyxcbiAgICAgICAgeTogYmIueTEgKyB5UGN0ICogYmIuaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9O1xuXG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICBlbGUgPSBfdHlwZW9mKGVsZSkgPT09IFwib2JqZWN0XCIgPyBlbGUgOiB0aGlzO1xuICAgIHZhciBkTW9kZWwgPSBlbGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgIHJldHVybiBjb25zdHJhaW5Qb3Moe1xuICAgICAgeDogZE1vZGVsLngsXG4gICAgICB5OiBkTW9kZWwueVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhZ3JlTGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIGRlZmF1bHRzID0ge1xuICAvLyBkYWdyZSBhbGdvIG9wdGlvbnMsIHVzZXMgZGVmYXVsdCB2YWx1ZSBvbiB1bmRlZmluZWRcbiAgbm9kZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgZWRnZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IGVkZ2VzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua1NlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua0RpcjogdW5kZWZpbmVkLFxuICAvLyAnVEInIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHQsXG4gIGFsaWduOiB1bmRlZmluZWQsXG4gIC8vIGFsaWdubWVudCBmb3IgcmFuayBub2Rlcy4gQ2FuIGJlICdVTCcsICdVUicsICdETCcsIG9yICdEUicsIHdoZXJlIFUgPSB1cCwgRCA9IGRvd24sIEwgPSBsZWZ0LCBhbmQgUiA9IHJpZ2h0XG4gIGFjeWNsaWNlcjogdW5kZWZpbmVkLFxuICAvLyBJZiBzZXQgdG8gJ2dyZWVkeScsIHVzZXMgYSBncmVlZHkgaGV1cmlzdGljIGZvciBmaW5kaW5nIGEgZmVlZGJhY2sgYXJjIHNldCBmb3IgYSBncmFwaC5cbiAgLy8gQSBmZWVkYmFjayBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gIHJhbmtlcjogdW5kZWZpbmVkLFxuICAvLyBUeXBlIG9mIGFsZ29yaXRobSB0byBhc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoLlxuICAvLyBQb3NzaWJsZSB2YWx1ZXM6IG5ldHdvcmstc2ltcGxleCwgdGlnaHQtdHJlZSBvciBsb25nZXN0LXBhdGhcbiAgbWluTGVuOiBmdW5jdGlvbiBtaW5MZW4oZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBudW1iZXIgb2YgcmFua3MgdG8ga2VlcCBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvZiB0aGUgZWRnZVxuICBlZGdlV2VpZ2h0OiBmdW5jdGlvbiBlZGdlV2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xuICAvLyBnZW5lcmFsIGxheW91dCBvcHRpb25zXG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIGZpdCBwYWRkaW5nXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gd2hldGhlciBsYWJlbHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGRldGVybWluaW5nIHRoZSBzcGFjZSB1c2VkIGJ5IGEgbm9kZVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gd2hldGhlciB0byBhbmltYXRlIHNwZWNpZmljIG5vZGVzIHdoZW4gYW5pbWF0aW9uIGlzIG9uOyBub24tYW5pbWF0ZWQgbm9kZXMgaW1tZWRpYXRlbHkgZ28gdG8gdGhlaXIgZmluYWwgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvcykge1xuICAgIHJldHVybiBwb3M7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGEgdHJhbnNmb3JtIHRvIHRoZSBmaW5hbCBub2RlIHBvc2l0aW9uXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeSgpIHt9LFxuICAvLyBvbiBsYXlvdXRyZWFkeVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXMgYW5kIGVkZ2VzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICAvLyBiZWNhdXNlIGN5dG9zY2FwZSBkYWdyZSBjcmVhdGVzIGEgZGlyZWN0ZWQgZ3JhcGgsIGFuZCBkaXJlY3RlZCBncmFwaHMgdXNlIHRoZSBub2RlIG9yZGVyIGFzIGEgdGllIGJyZWFrZXIgd2hlblxuICAvLyBkZWZpbmluZyB0aGUgdG9wb2xvZ3kgb2YgYSBncmFwaCwgdGhpcyBzb3J0IGZ1bmN0aW9uIGNhbiBoZWxwIGVuc3VyZSB0aGUgY29ycmVjdCBvcmRlciBvZiB0aGUgbm9kZXMvZWRnZXMuXG4gIC8vIHRoaXMgZmVhdHVyZSBpcyBtb3N0IHVzZWZ1bCB3aGVuIGFkZGluZyBhbmQgcmVtb3ZpbmcgdGhlIHNhbWUgbm9kZXMgYW5kIGVkZ2VzIG11bHRpcGxlIHRpbWVzIGluIGEgZ3JhcGguXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy8gU2ltcGxlLCBpbnRlcm5hbCBPYmplY3QuYXNzaWduKCkgcG9seWZpbGwgZm9yIG9wdGlvbnMgb2JqZWN0cyBldGMuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc3Jjc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHRndFtrXSA9IHNyY1trXTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0Z3Q7XG59O1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X187XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcbn0pOyIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJjb3NlLWJhc2VcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJjb3NlLWJhc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImN5dG9zY2FwZUZjb3NlXCJdID0gZmFjdG9yeShyb290W1wiY29zZUJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX18pIHtcbnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDY1ODpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuYXNzaWduICE9IG51bGwgPyBPYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KSA6IGZ1bmN0aW9uICh0Z3QpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNyY3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc3Jjc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHRndFtrXSA9IHNyY1trXTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NDg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KCk7XG5cbi8qXG4gKiBBdXhpbGlhcnkgZnVuY3Rpb25zXG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MaW5rZWRMaXN0O1xuXG52YXIgYXV4aWxpYXJ5ID0ge307XG5cbi8vIGdldCB0aGUgdG9wIG1vc3Qgbm9kZXNcbmF1eGlsaWFyeS5nZXRUb3BNb3N0Tm9kZXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgdmFyIG5vZGVzTWFwID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2Rlc01hcFtub2Rlc1tpXS5pZCgpXSA9IHRydWU7XG4gIH1cbiAgdmFyIHJvb3RzID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICBpZiAodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZWxlID0gaTtcbiAgICB9XG4gICAgdmFyIHBhcmVudCA9IGVsZS5wYXJlbnQoKVswXTtcbiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHtcbiAgICAgIGlmIChub2Rlc01hcFtwYXJlbnQuaWQoKV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudCgpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvb3RzO1xufTtcblxuLy8gZmluZCBkaXNjb25uZWN0ZWQgY29tcG9uZW50cyBhbmQgY3JlYXRlIGR1bW15IG5vZGVzIHRoYXQgY29ubmVjdCB0aGVtXG5hdXhpbGlhcnkuY29ubmVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiAoY3ksIGVsZXMsIHRvcE1vc3ROb2RlcywgZHVtbXlOb2Rlcykge1xuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHZpc2l0ZWRUb3BNb3N0Tm9kZXMgPSBbXTtcbiAgdmFyIGN1cnJlbnROZWlnaGJvciA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZU5vZGUgPSB2b2lkIDA7XG4gIHZhciBtaW5EZWdyZWUgPSB2b2lkIDA7XG5cbiAgdmFyIGlzQ29ubmVjdGVkID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IDE7XG4gIHZhciBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkgPSBbXTtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBjb21wb25lbnRzLnB1c2goY21wdCk7XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0b3BNb3N0Tm9kZXNbMF07XG4gICAgdmFyIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUubWVyZ2UoY3VycmVudE5vZGUpLm1lcmdlKGN1cnJlbnROb2RlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKTtcbiAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgY2hpbGRyZW5PZkN1cnJlbnROb2RlLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgfSk7XG5cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkge1xuICAgICAgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICAgICAgdmFyIG5laWdoYm9yTm9kZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICBjdXJyZW50Tm9kZS5uZWlnaGJvcmhvb2QoKS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGN1cnJlbnROb2RlLmVkZ2VzV2l0aChub2RlKSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG5laWdoYm9yTm9kZXMubWVyZ2Uobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5laWdoYm9yTm9kZSA9IG5laWdoYm9yTm9kZXNbaV07XG4gICAgICAgIGN1cnJlbnROZWlnaGJvciA9IHRvcE1vc3ROb2Rlcy5pbnRlcnNlY3Rpb24obmVpZ2hib3JOb2RlLnVuaW9uKG5laWdoYm9yTm9kZS5hbmNlc3RvcnMoKSkpO1xuICAgICAgICBpZiAoY3VycmVudE5laWdoYm9yICE9IG51bGwgJiYgIXZpc2l0ZWQuaGFzKGN1cnJlbnROZWlnaGJvclswXSkpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLnVuaW9uKGN1cnJlbnROZWlnaGJvci5kZXNjZW5kYW50cygpKTtcblxuICAgICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQobm9kZSk7XG4gICAgICAgICAgICBjbXB0Lm1lcmdlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKHRvcE1vc3ROb2Rlcy5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgdmlzaXRlZFRvcE1vc3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgX2xvb3AyKCk7XG4gICAgfVxuXG4gICAgY21wdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBlbGVzLmludGVyc2VjdGlvbihub2RlLmNvbm5lY3RlZEVkZ2VzKCkpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gY29ubmVjdGVkRWRnZXMoKSB1c3VhbGx5IGNhY2hlZFxuICAgICAgICBpZiAoY21wdC5oYXMoZS5zb3VyY2UoKSkgJiYgY21wdC5oYXMoZS50YXJnZXQoKSkpIHtcbiAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgIGNtcHQubWVyZ2UoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKHZpc2l0ZWRUb3BNb3N0Tm9kZXMubGVuZ3RoID09IHRvcE1vc3ROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29ubmVjdGVkIHx8IGlzQ29ubmVjdGVkICYmIGNvdW50ID4gMSkge1xuICAgICAgbWluRGVncmVlTm9kZSA9IHZpc2l0ZWRUb3BNb3N0Tm9kZXNbMF07XG4gICAgICBtaW5EZWdyZWUgPSBtaW5EZWdyZWVOb2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgdmlzaXRlZFRvcE1vc3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluRGVncmVlKSB7XG4gICAgICAgICAgbWluRGVncmVlID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aDtcbiAgICAgICAgICBtaW5EZWdyZWVOb2RlID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkucHVzaChtaW5EZWdyZWVOb2RlLmlkKCkpO1xuICAgICAgLy8gVE8gRE86IENoZWNrIGVmZmljaWVuY3kgb2YgdGhpcyBwYXJ0XG4gICAgICB2YXIgdGVtcCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIHRlbXAubWVyZ2UodmlzaXRlZFRvcE1vc3ROb2Rlc1swXSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdGVtcC5tZXJnZShub2RlKTtcbiAgICAgIH0pO1xuICAgICAgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICAgICAgdG9wTW9zdE5vZGVzID0gdG9wTW9zdE5vZGVzLmRpZmZlcmVuY2UodGVtcCk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfTtcblxuICBkbyB7XG4gICAgX2xvb3AoKTtcbiAgfSB3aGlsZSAoIWlzQ29ubmVjdGVkKTtcblxuICBpZiAoZHVtbXlOb2Rlcykge1xuICAgIGlmIChub2Rlc0Nvbm5lY3RlZFRvRHVtbXkubGVuZ3RoID4gMCkge1xuICAgICAgZHVtbXlOb2Rlcy5zZXQoJ2R1bW15JyArIChkdW1teU5vZGVzLnNpemUgKyAxKSwgbm9kZXNDb25uZWN0ZWRUb0R1bW15KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59O1xuXG4vLyByZWxvY2F0ZXMgY29tcG9uZW50UmVzdWx0IHRvIG9yaWdpbmFsQ2VudGVyIGlmIHRoZXJlIGlzIG5vIGZpeGVkTm9kZUNvbnN0cmFpbnRcbmF1eGlsaWFyeS5yZWxvY2F0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChvcmlnaW5hbENlbnRlciwgY29tcG9uZW50UmVzdWx0LCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgdmFyIG1pblhDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WENvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIHZhciBtaW5ZQ29vcmQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1heFlDb29yZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gY29tcG9uZW50UmVzdWx0Lm5vZGVJbmRleGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBfcmVmID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKTtcblxuICAgICAgICAgIHZhciBrZXkgPSBfcmVmMlswXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgICAgICAgIHZhciBjeU5vZGUgPSBvcHRpb25zLmN5LmdldEVsZW1lbnRCeUlkKGtleSk7XG4gICAgICAgICAgaWYgKGN5Tm9kZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVCQiA9IGN5Tm9kZS5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgdmFyIGxlZnRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdIC0gbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHJpZ2h0WCA9IGNvbXBvbmVudFJlc3VsdC54Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi53IC8gMjtcbiAgICAgICAgICAgIHZhciB0b3BZID0gY29tcG9uZW50UmVzdWx0LnlDb29yZHNbdmFsdWVdIC0gbm9kZUJCLmggLyAyO1xuICAgICAgICAgICAgdmFyIGJvdHRvbVkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gKyBub2RlQkIuaCAvIDI7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgICAgICBpZiAocmlnaHRYID4gbWF4WENvb3JkKSBtYXhYQ29vcmQgPSByaWdodFg7XG4gICAgICAgICAgICBpZiAodG9wWSA8IG1pbllDb29yZCkgbWluWUNvb3JkID0gdG9wWTtcbiAgICAgICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgZGlmZk9uWSA9IG9yaWdpbmFsQ2VudGVyLnkgLSAobWF4WUNvb3JkICsgbWluWUNvb3JkKSAvIDI7XG4gICAgICAvLyBtb3ZlIGNvbXBvbmVudCB0byBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIGNvbXBvbmVudFJlc3VsdC54Q29vcmRzID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHMubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4ICsgZGlmZk9uWDtcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50UmVzdWx0LnlDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkcy5tYXAoZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgcmV0dXJuIHkgKyBkaWZmT25ZO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNhbGN1bGF0ZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50UmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBub2RlID0gY29tcG9uZW50UmVzdWx0W2l0ZW1dO1xuICAgICAgICB2YXIgbGVmdFggPSBub2RlLmdldFJlY3QoKS54O1xuICAgICAgICB2YXIgcmlnaHRYID0gbm9kZS5nZXRSZWN0KCkueCArIG5vZGUuZ2V0UmVjdCgpLndpZHRoO1xuICAgICAgICB2YXIgdG9wWSA9IG5vZGUuZ2V0UmVjdCgpLnk7XG4gICAgICAgIHZhciBib3R0b21ZID0gbm9kZS5nZXRSZWN0KCkueSArIG5vZGUuZ2V0UmVjdCgpLmhlaWdodDtcblxuICAgICAgICBpZiAobGVmdFggPCBtaW5YQ29vcmQpIG1pblhDb29yZCA9IGxlZnRYO1xuICAgICAgICBpZiAocmlnaHRYID4gbWF4WENvb3JkKSBtYXhYQ29vcmQgPSByaWdodFg7XG4gICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICBpZiAoYm90dG9tWSA+IG1heFlDb29yZCkgbWF4WUNvb3JkID0gYm90dG9tWTtcbiAgICAgIH0pO1xuICAgICAgLy8gZmluZCBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgb3JpZ2luYWwgY2VudGVyXG4gICAgICB2YXIgX2RpZmZPblggPSBvcmlnaW5hbENlbnRlci54IC0gKG1heFhDb29yZCArIG1pblhDb29yZCkgLyAyO1xuICAgICAgdmFyIF9kaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50UmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBub2RlID0gY29tcG9uZW50UmVzdWx0W2l0ZW1dO1xuICAgICAgICBub2RlLnNldENlbnRlcihub2RlLmdldENlbnRlclgoKSArIF9kaWZmT25YLCBub2RlLmdldENlbnRlclkoKSArIF9kaWZmT25ZKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcblxuYXV4aWxpYXJ5LmNhbGNCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwYXJlbnROb2RlLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcykge1xuICAvLyBjYWxjdWxhdGUgYm91bmRzXG4gIHZhciBsZWZ0ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIHZhciByaWdodCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIHZhciBib3R0b20gPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgdmFyIG5vZGVMZWZ0ID0gdm9pZCAwO1xuICB2YXIgbm9kZVJpZ2h0ID0gdm9pZCAwO1xuICB2YXIgbm9kZVRvcCA9IHZvaWQgMDtcbiAgdmFyIG5vZGVCb3R0b20gPSB2b2lkIDA7XG5cbiAgdmFyIG5vZGVzID0gcGFyZW50Tm9kZS5kZXNjZW5kYW50cygpLm5vdChcIjpwYXJlbnRcIik7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG5cbiAgICBub2RlTGVmdCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldIC0gbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlUmlnaHQgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlLmlkKCkpXSArIG5vZGUud2lkdGgoKSAvIDI7XG4gICAgbm9kZVRvcCA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldIC0gbm9kZS5oZWlnaHQoKSAvIDI7XG4gICAgbm9kZUJvdHRvbSA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS5oZWlnaHQoKSAvIDI7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdCb3ggPSB7fTtcbiAgYm91bmRpbmdCb3gudG9wTGVmdFggPSBsZWZ0O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WSA9IHRvcDtcbiAgYm91bmRpbmdCb3gud2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIGJvdW5kaW5nQm94LmhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgcmV0dXJuIGJvdW5kaW5nQm94O1xufTtcblxuLy8gVGhpcyBmdW5jdGlvbiBmaW5kcyBhbmQgcmV0dXJucyBwYXJlbnQgbm9kZXMgd2hvc2UgYWxsIGNoaWxkcmVuIGFyZSBoaWRkZW5cbmF1eGlsaWFyeS5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGZ1bmN0aW9uIChjeSwgZWxlcykge1xuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgZWxlcy5ub2RlcygnOnBhcmVudCcpLmZvckVhY2goZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgIHBhcmVudC5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuY3NzKCdkaXNwbGF5JykgIT0gJ25vbmUnKSB7XG4gICAgICAgIGNoZWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNoZWNrKSB7XG4gICAgICBwYXJlbnRzV2l0aG91dENoaWxkcmVuLm1lcmdlKHBhcmVudCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyZW50c1dpdGhvdXRDaGlsZHJlbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXV4aWxpYXJ5O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODE2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9zdHByb2Nlc3NpbmcgcGFydCB0aGF0IGFwcGxpZXMgQ29TRSBsYXlvdXQgb3ZlciB0aGUgc3BlY3RyYWwgbGF5b3V0XG4qL1xuXG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xudmFyIENvU0VMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkuQ29TRUxheW91dDtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTm9kZTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5Qb2ludEQ7XG52YXIgRGltZW5zaW9uRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkRpbWVuc2lvbkQ7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTGF5b3V0Q29uc3RhbnRzO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRkRMYXlvdXRDb25zdGFudHM7XG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFQ29uc3RhbnRzO1xuXG4vLyBtYWluIGZ1bmN0aW9uIHRoYXQgY29zZSBsYXlvdXQgaXMgcHJvY2Vzc2VkXG52YXIgY29zZUxheW91dCA9IGZ1bmN0aW9uIGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHQpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSBlbGVzLmVkZ2VzKCk7XG5cbiAgdmFyIG5vZGVJbmRleGVzID0gdm9pZCAwO1xuICB2YXIgeENvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIHlDb29yZHMgPSB2b2lkIDA7XG4gIHZhciBpZFRvTE5vZGUgPSB7fTtcblxuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICBub2RlSW5kZXhlcyA9IHNwZWN0cmFsUmVzdWx0W1wibm9kZUluZGV4ZXNcIl07XG4gICAgeENvb3JkcyA9IHNwZWN0cmFsUmVzdWx0W1wieENvb3Jkc1wiXTtcbiAgICB5Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ5Q29vcmRzXCJdO1xuICB9XG5cbiAgdmFyIGlzRm4gPSBmdW5jdGlvbiBpc0ZuKGZuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfTtcblxuICB2YXIgb3B0Rm4gPSBmdW5jdGlvbiBvcHRGbihvcHQsIGVsZSkge1xuICAgIGlmIChpc0ZuKG9wdCkpIHtcbiAgICAgIHJldHVybiBvcHQoZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdDtcbiAgICB9XG4gIH07XG5cbiAgLyoqKiogUG9zdHByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgdmFyIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4gPSBhdXguY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4oY3ksIGVsZXMpO1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBub2RlcyB0byBjb3NlIG5vZGVzXG4gIHZhciBwcm9jZXNzQ2hpbGRyZW5MaXN0ID0gZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuTGlzdChwYXJlbnQsIGNoaWxkcmVuLCBsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIHRoZUNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICB2YXIgY2hpbGRyZW5fb2ZfY2hpbGRyZW4gPSBudWxsO1xuICAgICAgaWYgKHRoZUNoaWxkLmludGVyc2VjdGlvbihwYXJlbnRzV2l0aG91dENoaWxkcmVuKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IHRoZUNoaWxkLmNoaWxkcmVuKCk7XG4gICAgICB9XG4gICAgICB2YXIgdGhlTm9kZSA9IHZvaWQgMDtcblxuICAgICAgdmFyIGRpbWVuc2lvbnMgPSB0aGVDaGlsZC5sYXlvdXREaW1lbnNpb25zKHtcbiAgICAgICAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGVDaGlsZC5vdXRlcldpZHRoKCkgIT0gbnVsbCAmJiB0aGVDaGlsZC5vdXRlckhlaWdodCgpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmFuZG9taXplKSB7XG4gICAgICAgICAgaWYgKCF0aGVDaGlsZC5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RCh4Q29vcmRzW25vZGVJbmRleGVzLmdldCh0aGVDaGlsZC5pZCgpKV0gLSBkaW1lbnNpb25zLncgLyAyLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldCh0aGVDaGlsZC5pZCgpKV0gLSBkaW1lbnNpb25zLmggLyAyKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveCh0aGVDaGlsZCwgeENvb3JkcywgeUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgaWYgKHRoZUNoaWxkLmludGVyc2VjdGlvbihwYXJlbnRzV2l0aG91dENoaWxkcmVuKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyZW50SW5mby53aWR0aCwgcGFyZW50SW5mby5oZWlnaHQpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBmb3IgdGhlIHBhcmVudHNXaXRob3V0Q2hpbGRyZW5cbiAgICAgICAgICAgICAgdGhlTm9kZSA9IHBhcmVudC5hZGQobmV3IENvU0VOb2RlKGxheW91dC5ncmFwaE1hbmFnZXIsIG5ldyBQb2ludEQocGFyZW50SW5mby50b3BMZWZ0WCwgcGFyZW50SW5mby50b3BMZWZ0WSksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RCh0aGVDaGlsZC5wb3NpdGlvbigneCcpIC0gZGltZW5zaW9ucy53IC8gMiwgdGhlQ2hpbGQucG9zaXRpb24oJ3knKSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhlTm9kZSA9IHBhcmVudC5hZGQobmV3IENvU0VOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyKSk7XG4gICAgICB9XG4gICAgICAvLyBBdHRhY2ggaWQgdG8gdGhlIGxheW91dCBub2RlIGFuZCByZXB1bHNpb24gdmFsdWVcbiAgICAgIHRoZU5vZGUuaWQgPSB0aGVDaGlsZC5kYXRhKFwiaWRcIik7XG4gICAgICB0aGVOb2RlLm5vZGVSZXB1bHNpb24gPSBvcHRGbihvcHRpb25zLm5vZGVSZXB1bHNpb24sIHRoZUNoaWxkKTtcbiAgICAgIC8vIEF0dGFjaCB0aGUgcGFkZGluZ3Mgb2YgY3kgbm9kZSB0byBsYXlvdXQgbm9kZVxuICAgICAgdGhlTm9kZS5wYWRkaW5nTGVmdCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICAgIHRoZU5vZGUucGFkZGluZ1RvcCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICAgIHRoZU5vZGUucGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nQm90dG9tID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuXG4gICAgICAvL0F0dGFjaCB0aGUgbGFiZWwgcHJvcGVydGllcyB0byBib3RoIGNvbXBvdW5kIGFuZCBzaW1wbGUgbm9kZXMgaWYgbGFiZWxzIHdpbGwgYmUgaW5jbHVkZWQgaW4gbm9kZSBkaW1lbnNpb25zXG4gICAgICAvL1RoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkIHdoaWxlIHVwZGF0aW5nIGJvdW5kcyBvZiBjb21wb3VuZHMgZHVyaW5nIGl0ZXJhdGlvbnMgb3IgdGlsaW5nXG4gICAgICAvL2FuZCB3aWxsIGJlIHVzZWQgZm9yIHNpbXBsZSBub2RlcyB3aGlsZSB0cmFuc2ZlcnJpbmcgZmluYWwgcG9zaXRpb25zIHRvIGN5dG9zY2FwZVxuICAgICAgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICAgIHRoZU5vZGUubGFiZWxXaWR0aCA9IHRoZUNoaWxkLmJvdW5kaW5nQm94KHsgaW5jbHVkZUxhYmVsczogdHJ1ZSwgaW5jbHVkZU5vZGVzOiBmYWxzZSwgaW5jbHVkZU92ZXJsYXlzOiBmYWxzZSB9KS53O1xuICAgICAgICB0aGVOb2RlLmxhYmVsSGVpZ2h0ID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLmg7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9IHRoZUNoaWxkLmNzcyhcInRleHQtdmFsaWduXCIpO1xuICAgICAgICB0aGVOb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9IHRoZUNoaWxkLmNzcyhcInRleHQtaGFsaWduXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBNYXAgdGhlIGxheW91dCBub2RlXG4gICAgICBpZFRvTE5vZGVbdGhlQ2hpbGQuZGF0YShcImlkXCIpXSA9IHRoZU5vZGU7XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueCkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOYU4odGhlTm9kZS5yZWN0LnkpKSB7XG4gICAgICAgIHRoZU5vZGUucmVjdC55ID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkcmVuX29mX2NoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW5fb2ZfY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdGhlTmV3R3JhcGggPSB2b2lkIDA7XG4gICAgICAgIHRoZU5ld0dyYXBoID0gbGF5b3V0LmdldEdyYXBoTWFuYWdlcigpLmFkZChsYXlvdXQubmV3R3JhcGgoKSwgdGhlTm9kZSk7XG4gICAgICAgIHByb2Nlc3NDaGlsZHJlbkxpc3QodGhlTmV3R3JhcGgsIGNoaWxkcmVuX29mX2NoaWxkcmVuLCBsYXlvdXQsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgZWRnZXMgdG8gY29zZSBlZGdlc1xuICB2YXIgcHJvY2Vzc0VkZ2VzID0gZnVuY3Rpb24gcHJvY2Vzc0VkZ2VzKGxheW91dCwgZ20sIGVkZ2VzKSB7XG4gICAgdmFyIGlkZWFsTGVuZ3RoVG90YWwgPSAwO1xuICAgIHZhciBlZGdlQ291bnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICB2YXIgc291cmNlTm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJzb3VyY2VcIildO1xuICAgICAgdmFyIHRhcmdldE5vZGUgPSBpZFRvTE5vZGVbZWRnZS5kYXRhKFwidGFyZ2V0XCIpXTtcbiAgICAgIGlmIChzb3VyY2VOb2RlICYmIHRhcmdldE5vZGUgJiYgc291cmNlTm9kZSAhPT0gdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlLmdldEVkZ2VzQmV0d2Vlbih0YXJnZXROb2RlKS5sZW5ndGggPT0gMCkge1xuICAgICAgICB2YXIgZTEgPSBnbS5hZGQobGF5b3V0Lm5ld0VkZ2UoKSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSk7XG4gICAgICAgIGUxLmlkID0gZWRnZS5pZCgpO1xuICAgICAgICBlMS5pZGVhbExlbmd0aCA9IG9wdEZuKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoLCBlZGdlKTtcbiAgICAgICAgZTEuZWRnZUVsYXN0aWNpdHkgPSBvcHRGbihvcHRpb25zLmVkZ2VFbGFzdGljaXR5LCBlZGdlKTtcbiAgICAgICAgaWRlYWxMZW5ndGhUb3RhbCArPSBlMS5pZGVhbExlbmd0aDtcbiAgICAgICAgZWRnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpZGVhbCBlZGdlIGxlbmd0aCBjb25zdGFudCB3aXRoIHRoZSBhdmcuIGlkZWFsIGxlbmd0aCB2YWx1ZSBhZnRlciBwcm9jZXNzaW5nIGVkZ2VzXG4gICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBlZGdlLCB1c2Ugb3RoZXIgb3B0aW9uc1xuICAgIGlmIChvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCAhPSBudWxsKSB7XG4gICAgICBpZiAoZWRnZUNvdW50ID4gMCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IGlkZWFsTGVuZ3RoVG90YWwgLyBlZGdlQ291bnQ7ZWxzZSBpZiAoIWlzRm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgpKSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIGJ1dCBvcHRpb24gZ2l2ZXMgYSB2YWx1ZSB0byB1c2VcbiAgICAgICAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO2Vsc2UgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBlZGdlIGFuZCB3ZSBjYW5ub3QgZ2V0IGEgdmFsdWUgZnJvbSBvcHRpb24gKGJlY2F1c2UgaXQncyBhIGZ1bmN0aW9uKVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gNTA7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmFzZWQgb24gdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50XG4gICAgICBDb1NFQ29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMC4wO1xuICAgICAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgICB9XG4gIH07XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIGNvbnN0cmFpbnRzIHRvIGNvc2UgbGF5b3V0XG4gIHZhciBwcm9jZXNzQ29uc3RyYWludHMgPSBmdW5jdGlvbiBwcm9jZXNzQ29uc3RyYWludHMobGF5b3V0LCBvcHRpb25zKSB7XG4gICAgLy8gZ2V0IG5vZGVzIHRvIGJlIGZpeGVkXG4gICAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wiZml4ZWROb2RlQ29uc3RyYWludFwiXSA9IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludDtcbiAgICB9XG4gICAgLy8gZ2V0IG5vZGVzIHRvIGJlIGFsaWduZWRcbiAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJhbGlnbm1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgcmVsYXRpdmVseSBwbGFjZWRcbiAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcInJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludFwiXSA9IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBBcHBseSBwb3N0cHJvY2Vzc2luZyAqKioqL1xuICBpZiAob3B0aW9ucy5uZXN0aW5nRmFjdG9yICE9IG51bGwpIENvU0VDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IEZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSBvcHRpb25zLm5lc3RpbmdGYWN0b3I7XG4gIGlmIChvcHRpb25zLmdyYXZpdHkgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEggPSBvcHRpb25zLmdyYXZpdHk7XG4gIGlmIChvcHRpb25zLm51bUl0ZXIgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gb3B0aW9ucy5udW1JdGVyO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2UgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IG9wdGlvbnMuZ3Jhdml0eVJhbmdlO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5Q29tcG91bmQgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEggPSBvcHRpb25zLmdyYXZpdHlDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eVJhbmdlQ29tcG91bmQgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IG9wdGlvbnMuZ3Jhdml0eVJhbmdlQ29tcG91bmQ7XG4gIGlmIChvcHRpb25zLmluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsICE9IG51bGwpIENvU0VDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgPSBvcHRpb25zLmluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsO1xuXG4gIGlmIChvcHRpb25zLnRpbGluZ0NvbXBhcmVCeSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLlRJTElOR19DT01QQVJFX0JZID0gb3B0aW9ucy50aWxpbmdDb21wYXJlQnk7XG5cbiAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSAncHJvb2YnKSBMYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDI7ZWxzZSBMYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDA7XG5cbiAgQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBGRExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBMYXlvdXRDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTID0gb3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM7XG4gIENvU0VDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9ICFvcHRpb25zLnJhbmRvbWl6ZTtcbiAgQ29TRUNvbnN0YW50cy5BTklNQVRFID0gRkRMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9IExheW91dENvbnN0YW50cy5BTklNQVRFID0gb3B0aW9ucy5hbmltYXRlO1xuICBDb1NFQ29uc3RhbnRzLlRJTEUgPSBvcHRpb25zLnRpbGU7XG4gIENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nVmVydGljYWwgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbC5jYWxsKCkgOiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbDtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMID0gdHlwZW9mIG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnRpbGluZ1BhZGRpbmdIb3Jpem9udGFsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWw7XG5cbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gdHJ1ZTtcbiAgQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUyA9IG9wdGlvbnMudW5pZm9ybU5vZGVEaW1lbnNpb25zO1xuXG4gIC8vIFRoaXMgcGFydCBpcyBmb3IgZGVidWcvZGVtbyBwdXJwb3NlXG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJ0cmFuc2Zvcm1lZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTID0gZmFsc2U7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiZW5mb3JjZWRcIikge1xuICAgIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gZmFsc2U7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcImNvc2VcIikge1xuICAgIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgaWYgKG9wdGlvbnMucmFuZG9taXplKSBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtlbHNlIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgfHwgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50IHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIENvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGNvc2VMYXlvdXQgPSBuZXcgQ29TRUxheW91dCgpO1xuICB2YXIgZ20gPSBjb3NlTGF5b3V0Lm5ld0dyYXBoTWFuYWdlcigpO1xuXG4gIHByb2Nlc3NDaGlsZHJlbkxpc3QoZ20uYWRkUm9vdCgpLCBhdXguZ2V0VG9wTW9zdE5vZGVzKG5vZGVzKSwgY29zZUxheW91dCwgb3B0aW9ucyk7XG4gIHByb2Nlc3NFZGdlcyhjb3NlTGF5b3V0LCBnbSwgZWRnZXMpO1xuICBwcm9jZXNzQ29uc3RyYWludHMoY29zZUxheW91dCwgb3B0aW9ucyk7XG5cbiAgY29zZUxheW91dC5ydW5MYXlvdXQoKTtcblxuICByZXR1cm4gaWRUb0xOb2RlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IGNvc2VMYXlvdXQ6IGNvc2VMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIxMjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1OCk7XG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xuXG52YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1NyksXG4gICAgc3BlY3RyYWxMYXlvdXQgPSBfcmVxdWlyZS5zcGVjdHJhbExheW91dDtcblxudmFyIF9yZXF1aXJlMiA9IF9fd2VicGFja19yZXF1aXJlX18oODE2KSxcbiAgICBjb3NlTGF5b3V0ID0gX3JlcXVpcmUyLmNvc2VMYXlvdXQ7XG5cbnZhciBkZWZhdWx0cyA9IE9iamVjdC5mcmVlemUoe1xuXG4gIC8vICdkcmFmdCcsICdkZWZhdWx0JyBvciAncHJvb2YnIFxuICAvLyAtICdkcmFmdCcgb25seSBhcHBsaWVzIHNwZWN0cmFsIGxheW91dCBcbiAgLy8gLSAnZGVmYXVsdCcgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChmYXN0IGNvb2xpbmcgcmF0ZSlcbiAgLy8gLSAncHJvb2YnIGltcHJvdmVzIHRoZSBxdWFsaXR5IHdpdGggc3Vic2VxdWVudCBDb1NFIGxheW91dCAoc2xvdyBjb29saW5nIHJhdGUpIFxuICBxdWFsaXR5OiBcImRlZmF1bHRcIixcbiAgLy8gVXNlIHJhbmRvbSBub2RlIHBvc2l0aW9ucyBhdCBiZWdpbm5pbmcgb2YgbGF5b3V0XG4gIC8vIGlmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgXCJwcm9vZlwiXG4gIHJhbmRvbWl6ZTogdHJ1ZSxcbiAgLy8gV2hldGhlciBvciBub3QgdG8gYW5pbWF0ZSB0aGUgbGF5b3V0XG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIER1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcywgaWYgZW5hYmxlZFxuICBhbmltYXRpb25EdXJhdGlvbjogMTAwMCxcbiAgLy8gRWFzaW5nIG9mIGFuaW1hdGlvbiwgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gRml0IHRoZSB2aWV3cG9ydCB0byB0aGUgcmVwb3NpdGlvbmVkIG5vZGVzXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBhcm91bmQgbGF5b3V0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBXaGV0aGVyIHRvIGluY2x1ZGUgbGFiZWxzIGluIG5vZGUgZGltZW5zaW9ucy4gVmFsaWQgaW4gXCJwcm9vZlwiIHF1YWxpdHlcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gV2hldGhlciBvciBub3Qgc2ltcGxlIG5vZGVzIChub24tY29tcG91bmQgbm9kZXMpIGFyZSBvZiB1bmlmb3JtIGRpbWVuc2lvbnNcbiAgdW5pZm9ybU5vZGVEaW1lbnNpb25zOiBmYWxzZSxcbiAgLy8gV2hldGhlciB0byBwYWNrIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIC0gdmFsaWQgb25seSBpZiByYW5kb21pemU6IHRydWVcbiAgcGFja0NvbXBvbmVudHM6IHRydWUsXG4gIC8vIExheW91dCBzdGVwIC0gYWxsLCB0cmFuc2Zvcm1lZCwgZW5mb3JjZWQsIGNvc2UgLSBmb3IgZGVidWcgcHVycG9zZSBvbmx5XG4gIHN0ZXA6IFwiYWxsXCIsXG5cbiAgLyogc3BlY3RyYWwgbGF5b3V0IG9wdGlvbnMgKi9cblxuICAvLyBGYWxzZSBmb3IgcmFuZG9tLCB0cnVlIGZvciBncmVlZHlcbiAgc2FtcGxpbmdUeXBlOiB0cnVlLFxuICAvLyBTYW1wbGUgc2l6ZSB0byBjb25zdHJ1Y3QgZGlzdGFuY2UgbWF0cml4XG4gIHNhbXBsZVNpemU6IDI1LFxuICAvLyBTZXBhcmF0aW9uIGFtb3VudCBiZXR3ZWVuIG5vZGVzXG4gIG5vZGVTZXBhcmF0aW9uOiA3NSxcbiAgLy8gUG93ZXIgaXRlcmF0aW9uIHRvbGVyYW5jZVxuICBwaVRvbDogMC4wMDAwMDAxLFxuXG4gIC8qIENvU0UgbGF5b3V0IG9wdGlvbnMgKi9cblxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb246IGZ1bmN0aW9uIG5vZGVSZXB1bHNpb24obm9kZSkge1xuICAgIHJldHVybiA0NTAwO1xuICB9LFxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoOiBmdW5jdGlvbiBpZGVhbEVkZ2VMZW5ndGgoZWRnZSkge1xuICAgIHJldHVybiA1MDtcbiAgfSxcbiAgLy8gRGl2aXNvciB0byBjb21wdXRlIGVkZ2UgZm9yY2VzXG4gIGVkZ2VFbGFzdGljaXR5OiBmdW5jdGlvbiBlZGdlRWxhc3RpY2l0eShlZGdlKSB7XG4gICAgcmV0dXJuIDAuNDU7XG4gIH0sXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvcjogMC4xLFxuICAvLyBHcmF2aXR5IGZvcmNlIChjb25zdGFudClcbiAgZ3Jhdml0eTogMC4yNSxcbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtXG4gIG51bUl0ZXI6IDI1MDAsXG4gIC8vIEZvciBlbmFibGluZyB0aWxpbmdcbiAgdGlsZTogdHJ1ZSxcbiAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBjcml0ZXJpYSBmb3IgY29tcGFyaW5nIG5vZGVzIHdoaWxlIHNvcnRpbmcgdGhlbSBkdXJpbmcgdGlsaW5nIG9wZXJhdGlvbi5cbiAgLy8gVGFrZXMgdGhlIG5vZGUgaWQgYXMgYSBwYXJhbWV0ZXIgYW5kIHRoZSBkZWZhdWx0IHRpbGluZyBvcGVyYXRpb24gaXMgcGVyZm9tZWQgd2hlbiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LlxuICB0aWxpbmdDb21wYXJlQnk6IHVuZGVmaW5lZCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSB2ZXJ0aWNhbCBzcGFjZSB0byBwdXQgYmV0d2VlbiB0aGUgemVybyBkZWdyZWUgbWVtYmVycyBkdXJpbmcgdGhlIHRpbGluZyBvcGVyYXRpb24oY2FuIGFsc28gYmUgYSBmdW5jdGlvbilcbiAgdGlsaW5nUGFkZGluZ1ZlcnRpY2FsOiAxMCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSBob3Jpem9udGFsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDogMTAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlSYW5nZUNvbXBvdW5kOiAxLjUsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlDb21wb3VuZDogMS4wLFxuICAvLyBHcmF2aXR5IHJhbmdlIChjb25zdGFudClcbiAgZ3Jhdml0eVJhbmdlOiAzLjgsXG4gIC8vIEluaXRpYWwgY29vbGluZyBmYWN0b3IgZm9yIGluY3JlbWVudGFsIGxheW91dCAgXG4gIGluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsOiAwLjMsXG5cbiAgLyogY29uc3RyYWludCBvcHRpb25zICovXG5cbiAgLy8gRml4IHJlcXVpcmVkIG5vZGVzIHRvIHByZWRlZmluZWQgcG9zaXRpb25zXG4gIC8vIFt7bm9kZUlkOiAnbjEnLCBwb3NpdGlvbjoge3g6IDEwMCwgeTogMjAwfSwgey4uLn1dXG4gIGZpeGVkTm9kZUNvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gQWxpZ24gcmVxdWlyZWQgbm9kZXMgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb25cbiAgLy8ge3ZlcnRpY2FsOiBbWyduMScsICduMicpXSwgWyduMycsICduNCddXSwgaG9yaXpvbnRhbDogWyduMicsICduNCddfVxuICBhbGlnbm1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG4gIC8vIFBsYWNlIHR3byBub2RlcyByZWxhdGl2ZWx5IGluIHZlcnRpY2FsL2hvcml6b250YWwgZGlyZWN0aW9uIFxuICAvLyBbe3RvcDogJ24xJywgYm90dG9tOiAnbjInLCBnYXA6IDEwMH0sIHtsZWZ0OiAnbjMnLCByaWdodDogJ240JywgZ2FwOiA3NX1dXG4gIHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDogdW5kZWZpbmVkLFxuXG4gIC8qIGxheW91dCBldmVudCBjYWxsYmFja3MgKi9cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59KTtcblxudmFyIExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGF5b3V0KTtcblxuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExheW91dCwgW3tcbiAgICBrZXk6ICdydW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW4oKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuXG4gICAgICB2YXIgc3BlY3RyYWxSZXN1bHQgPSBbXTtcbiAgICAgIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICAgICAgdmFyIHlDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgY29zZVJlc3VsdCA9IFtdO1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSB2b2lkIDA7XG4gICAgICB2YXIgY29tcG9uZW50Q2VudGVycyA9IFtdO1xuXG4gICAgICAvLyBiYXNpYyB2YWxpZGl0eSBjaGVjayBmb3IgY29uc3RyYWludCBpbnB1dHMgXG4gICAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50ICYmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHx8IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkgfHwgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGFueSBjb25zdHJhaW50IGV4aXN0cywgc2V0IHNvbWUgb3B0aW9uc1xuICAgICAgdmFyIGNvbnN0cmFpbnRFeGlzdCA9IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgICBpZiAoY29uc3RyYWludEV4aXN0KSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnRzIHdvcmsgd2l0aCB0aGVzZSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMudGlsZSA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnBhY2tDb21wb25lbnRzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlY2lkZSBjb21wb25lbnQgcGFja2luZyBpcyBlbmFibGVkIG9yIG5vdFxuICAgICAgdmFyIGxheVV0aWwgPSB2b2lkIDA7XG4gICAgICB2YXIgcGFja2luZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGlmIChjeS5sYXlvdXRVdGlsaXRpZXMgJiYgb3B0aW9ucy5wYWNrQ29tcG9uZW50cykge1xuICAgICAgICBsYXlVdGlsID0gY3kubGF5b3V0VXRpbGl0aWVzKFwiZ2V0XCIpO1xuICAgICAgICBpZiAoIWxheVV0aWwpIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoKTtcbiAgICAgICAgcGFja2luZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlcy5ub2RlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgcGFja2luZyBpcyBub3QgZW5hYmxlZCwgcGVyZm9ybSBsYXlvdXQgb24gdGhlIHdob2xlIGdyYXBoXG4gICAgICAgIGlmICghcGFja2luZ0VuYWJsZWQpIHtcbiAgICAgICAgICAvLyBzdG9yZSBjb21wb25lbnQgY2VudGVyXG4gICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gb3B0aW9ucy5lbGVzLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAvLyBhcHBseSBzcGVjdHJhbCBsYXlvdXRcbiAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBzcGVjdHJhbExheW91dChvcHRpb25zKTtcbiAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYXBwbHkgY29zZSBsYXlvdXQgYXMgcG9zdHByb2Nlc3NpbmdcbiAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIpIHtcbiAgICAgICAgICAgIGNvc2VSZXN1bHQucHVzaChjb3NlTGF5b3V0KG9wdGlvbnMsIHNwZWN0cmFsUmVzdWx0WzBdKSk7XG4gICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1swXSwgY29zZVJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1swXSwgc3BlY3RyYWxSZXN1bHRbMF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcGFja2luZyBpcyBlbmFibGVkXG4gICAgICAgICAgdmFyIHRvcE1vc3ROb2RlcyA9IGF1eC5nZXRUb3BNb3N0Tm9kZXMob3B0aW9ucy5lbGVzLm5vZGVzKCkpO1xuICAgICAgICAgIGNvbXBvbmVudHMgPSBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIG9wdGlvbnMuZWxlcywgdG9wTW9zdE5vZGVzKTtcbiAgICAgICAgICAvLyBzdG9yZSBjb21wb25lbnQgY2VudGVyc1xuICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBjb21wb25lbnQuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGNvbXBvbmVudENlbnRlcnMucHVzaCh7IHg6IGJvdW5kaW5nQm94LngxICsgYm91bmRpbmdCb3gudyAvIDIsIHk6IGJvdW5kaW5nQm94LnkxICsgYm91bmRpbmdCb3guaCAvIDIgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvL3NlbmQgZWFjaCBjb21wb25lbnQgdG8gc3BlY3RyYWwgbGF5b3V0IGlmIHJhbmRvbWl6ZWRcbiAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChzcGVjdHJhbExheW91dChvcHRpb25zKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIpIHtcbiAgICAgICAgICAgIHZhciB0b0JlVGlsZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGUpIHtcbiAgICAgICAgICAgICAgLy8gYmVoYXZlIG5vZGVzIHRvIGJlIHRpbGVkIGFzIG9uZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICB2YXIgX3hDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIF95Q29vcmRzID0gW107XG4gICAgICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgICAgIHZhciB0ZW1wU3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogX3hDb29yZHMsIHlDb29yZHM6IF95Q29vcmRzIH07XG4gICAgICAgICAgICAgIHZhciBpbmRleGVzVG9CZURlbGV0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5lZGdlcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvQmVUaWxlZE5vZGVzLm1lcmdlKGNvbXBvbmVudC5ub2RlcygpW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3BlY3RyYWxSZXN1bHQubm9kZUluZGV4ZXMuc2V0KGNvbXBvbmVudC5ub2RlcygpW2ldLmlkKCksIGNvdW50KyspO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC54Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS54KTtcbiAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3BlY3RyYWxSZXN1bHQueUNvb3Jkcy5wdXNoKGNvbXBvbmVudC5ub2RlcygpWzBdLnBvc2l0aW9uKCkueSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaW5kZXhlc1RvQmVEZWxldGVkLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh0b0JlVGlsZWROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9ib3VuZGluZ0JveCA9IHRvQmVUaWxlZE5vZGVzLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogX2JvdW5kaW5nQm94LngxICsgX2JvdW5kaW5nQm94LncgLyAyLCB5OiBfYm91bmRpbmdCb3gueTEgKyBfYm91bmRpbmdCb3guaCAvIDIgfSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKHRvQmVUaWxlZE5vZGVzKTtcbiAgICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHRlbXBTcGVjdHJhbFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ZXNUb0JlRGVsZXRlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5zcGxpY2UoaW5kZXhlc1RvQmVEZWxldGVkW2ldLCAxKTtcbiAgICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5zcGxpY2UoaW5kZXhlc1RvQmVEZWxldGVkW2ldLCAxKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gc2VuZCBlYWNoIGNvbXBvbmVudCB0byBjb3NlIGxheW91dFxuICAgICAgICAgICAgICBvcHRpb25zLmVsZXMgPSBjb21wb25lbnQ7XG4gICAgICAgICAgICAgIGNvc2VSZXN1bHQucHVzaChjb3NlTGF5b3V0KG9wdGlvbnMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XSkpO1xuICAgICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1tpbmRleF0sIGNvc2VSZXN1bHRbaW5kZXhdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBwYWNraW5nXG4gICAgICAgICAgdmFyIGNvbXBvbmVudHNFdmFsdWF0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN1YmdyYXBocyA9IFtdO1xuICAgICAgICAgICAgdmFyIGhpZGRlbkVsZXMgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuY3NzKCdkaXNwbGF5JykgPT0gJ25vbmUnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleGVzID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbaW5kZXhdLm5vZGVJbmRleGVzO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ub2RlcygpLm5vdChoaWRkZW5FbGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YmdyYXBoID0ge307XG4gICAgICAgICAgICAgICAgc3ViZ3JhcGguZWRnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBub2RlSW5kZXggPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW25vZGVJbmRleF0gLSBub2RlLmJvdW5kaW5nYm94KCkudyAvIDIsIHk6IHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW25vZGVJbmRleF0gLSBub2RlLmJvdW5kaW5nYm94KCkuaCAvIDIsIHdpZHRoOiBub2RlLmJvdW5kaW5nYm94KCkudywgaGVpZ2h0OiBub2RlLmJvdW5kaW5nYm94KCkuaCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3gobm9kZSwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IHBhcmVudEluZm8udG9wTGVmdFgsIHk6IHBhcmVudEluZm8udG9wTGVmdFksIHdpZHRoOiBwYXJlbnRJbmZvLndpZHRoLCBoZWlnaHQ6IHBhcmVudEluZm8uaGVpZ2h0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzLnB1c2goeyB4OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldExlZnQoKSwgeTogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRUb3AoKSwgd2lkdGg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0V2lkdGgoKSwgaGVpZ2h0OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldEhlaWdodCgpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuY3NzKFwiZGlzcGxheVwiKSAhPSBcIm5vbmVcIiAmJiB0YXJnZXQuY3NzKFwiZGlzcGxheVwiKSAhPSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VOb2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoc291cmNlLmlkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXROb2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQodGFyZ2V0LmlkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2VudGVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3goc291cmNlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFggKyBwYXJlbnRJbmZvLndpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChwYXJlbnRJbmZvLnRvcExlZnRZICsgcGFyZW50SW5mby5oZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbc291cmNlTm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3BhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRhcmdldCwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChfcGFyZW50SW5mby50b3BMZWZ0WCArIF9wYXJlbnRJbmZvLndpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChfcGFyZW50SW5mby50b3BMZWZ0WSArIF9wYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1t0YXJnZXROb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBzb3VyY2VDZW50ZXJbMF0sIHN0YXJ0WTogc291cmNlQ2VudGVyWzFdLCBlbmRYOiB0YXJnZXRDZW50ZXJbMF0sIGVuZFk6IHRhcmdldENlbnRlclsxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29zZVJlc3VsdFtpbmRleF1bc291cmNlLmlkKCldICYmIGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGguZWRnZXMucHVzaCh7IHN0YXJ0WDogY29zZVJlc3VsdFtpbmRleF1bc291cmNlLmlkKCldLmdldENlbnRlclgoKSwgc3RhcnRZOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWSgpLCBlbmRYOiBjb3NlUmVzdWx0W2luZGV4XVt0YXJnZXQuaWQoKV0uZ2V0Q2VudGVyWCgpLCBlbmRZOiBjb3NlUmVzdWx0W2luZGV4XVt0YXJnZXQuaWQoKV0uZ2V0Q2VudGVyWSgpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzdWJncmFwaC5ub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBzdWJncmFwaHMucHVzaChzdWJncmFwaCk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmFkZChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBzaGlmdFJlc3VsdCA9IGxheVV0aWwucGFja0NvbXBvbmVudHMoc3ViZ3JhcGhzLCBvcHRpb25zLnJhbmRvbWl6ZSkuc2hpZnRzO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdYQ29vcmRzID0gcmVzdWx0LnhDb29yZHMubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geCArIHNoaWZ0UmVzdWx0W2luZGV4XS5keDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3WUNvb3JkcyA9IHJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHkgKyBzaGlmdFJlc3VsdFtpbmRleF0uZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnhDb29yZHMgPSBuZXdYQ29vcmRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC55Q29vcmRzID0gbmV3WUNvb3JkcztcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgX2NvdW50ID0gMDtcbiAgICAgICAgICAgICAgY29tcG9uZW50c0V2YWx1YXRlZC5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvc2VSZXN1bHRbaW5kZXhdKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbm9kZVJlY3RhbmdsZSA9IGNvc2VSZXN1bHRbaW5kZXhdW2l0ZW1dO1xuICAgICAgICAgICAgICAgICAgbm9kZVJlY3RhbmdsZS5zZXRDZW50ZXIobm9kZVJlY3RhbmdsZS5nZXRDZW50ZXJYKCkgKyBzaGlmdFJlc3VsdFtfY291bnRdLmR4LCBub2RlUmVjdGFuZ2xlLmdldENlbnRlclkoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF9jb3VudCsrO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGVhY2ggZWxlbWVudCdzIGNhbGN1bGF0ZWQgcG9zaXRpb25cbiAgICAgIHZhciBnZXRQb3NpdGlvbnMgPSBmdW5jdGlvbiBnZXRQb3NpdGlvbnMoZWxlLCBpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcG9zID0gdm9pZCAwO1xuICAgICAgICAgIHZhciBub2RlID0gdm9pZCAwO1xuICAgICAgICAgIHZhciB0aGVJZCA9IGVsZS5kYXRhKCdpZCcpO1xuICAgICAgICAgIGNvc2VSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhlSWQgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgIHBvcyA9IHsgeDogcmVzdWx0W3RoZUlkXS5nZXRSZWN0KCkuZ2V0Q2VudGVyWCgpLCB5OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJZKCkgfTtcbiAgICAgICAgICAgICAgbm9kZSA9IHJlc3VsdFt0aGVJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgICAgICAgIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgICAgICAgIHBvcy54ICs9IG5vZGUubGFiZWxXaWR0aCAvIDI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggLT0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnkgKz0gbm9kZS5sYWJlbEhlaWdodCAvIDI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSAtPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zID09IHVuZGVmaW5lZCkgcG9zID0geyB4OiBlbGUucG9zaXRpb24oXCJ4XCIpLCB5OiBlbGUucG9zaXRpb24oXCJ5XCIpIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHBvcy54LFxuICAgICAgICAgICAgeTogcG9zLnlcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9zID0gdm9pZCAwO1xuICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lm5vZGVJbmRleGVzLmdldChlbGUuaWQoKSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIF9wb3MgPSB7IHg6IHJlc3VsdC54Q29vcmRzW2luZGV4XSwgeTogcmVzdWx0LnlDb29yZHNbaW5kZXhdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9wb3MgPT0gdW5kZWZpbmVkKSBfcG9zID0geyB4OiBlbGUucG9zaXRpb24oXCJ4XCIpLCB5OiBlbGUucG9zaXRpb24oXCJ5XCIpIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IF9wb3MueCxcbiAgICAgICAgICAgIHk6IF9wb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIHF1YWxpdHkgPSBcImRyYWZ0XCIgYW5kIHJhbmRvbWl6ZSA9IGZhbHNlIGFyZSBjb250cmFkaWN0aXZlIHNvIGluIHRoYXQgY2FzZSBwb3NpdGlvbnMgZG9uJ3QgY2hhbmdlXG4gICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIgfHwgb3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgLy8gdHJhbnNmZXIgY2FsY3VsYXRlZCBwb3NpdGlvbnMgdG8gbm9kZXMgKHBvc2l0aW9ucyBvZiBvbmx5IHNpbXBsZSBub2RlcyBhcmUgZXZhbHVhdGVkLCBjb21wb3VuZHMgYXJlIHBvc2l0aW9uZWQgYXV0b21hdGljYWxseSlcbiAgICAgICAgdmFyIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4gPSBhdXguY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4oY3ksIGVsZXMpO1xuICAgICAgICB2YXIgX2hpZGRlbkVsZXMgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zLmVsZXMgPSBlbGVzLm5vdChfaGlkZGVuRWxlcyk7XG5cbiAgICAgICAgZWxlcy5ub2RlcygpLm5vdChcIjpwYXJlbnRcIikubm90KF9oaWRkZW5FbGVzKS5sYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBnZXRQb3NpdGlvbnMpO1xuXG4gICAgICAgIGlmIChwYXJlbnRzV2l0aG91dENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYXJlbnRzV2l0aG91dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZWxlLnBvc2l0aW9uKGdldFBvc2l0aW9ucyhlbGUpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJZiByYW5kb21pemUgb3B0aW9uIGlzIHNldCB0byBmYWxzZSwgdGhlbiBxdWFsaXR5IG9wdGlvbiBtdXN0IGJlICdkZWZhdWx0JyBvciAncHJvb2YnLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGF5b3V0O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY1Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbi8qKlxuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWN0cmFsIGxheW91dCB0aGF0IGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmY29zZSBsYXlvdXQgYWxnb3JpdGhtXG4qL1xuXG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xudmFyIE1hdHJpeCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLk1hdHJpeDtcbnZhciBTVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5TVkQ7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBzcGVjdHJhbCBsYXlvdXQgaXMgcHJvY2Vzc2VkXG52YXIgc3BlY3RyYWxMYXlvdXQgPSBmdW5jdGlvbiBzcGVjdHJhbExheW91dChvcHRpb25zKSB7XG5cbiAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKTtcbiAgdmFyIHBhcmVudE5vZGVzID0gZWxlcy5ub2RlcyhcIjpwYXJlbnRcIik7XG5cbiAgdmFyIGR1bW15Tm9kZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGR1bW15IG5vZGVzIGFuZCB0aGVpciBuZWlnaGJvcnNcbiAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpOyAvLyBtYXAgdG8ga2VlcCBpbmRleGVzIHRvIG5vZGVzXG4gIHZhciBwYXJlbnRDaGlsZE1hcCA9IG5ldyBNYXAoKTsgLy8gbWFwcGluZyBidHcuIGNvbXBvdW5kIGFuZCBpdHMgcmVwcmVzZW50YXRpdmUgbm9kZSBcbiAgdmFyIGFsbE5vZGVzTmVpZ2hib3Job29kID0gW107IC8vIGFycmF5IHRvIGtlZXAgbmVpZ2hib3Job29kIG9mIGFsbCBub2Rlc1xuICB2YXIgeENvb3JkcyA9IFtdO1xuICB2YXIgeUNvb3JkcyA9IFtdO1xuXG4gIHZhciBzYW1wbGVzQ29sdW1uID0gW107IC8vIHNhbXBsZWQgdmVydGljZXNcbiAgdmFyIG1pbkRpc3RhbmNlc0NvbHVtbiA9IFtdO1xuICB2YXIgQyA9IFtdOyAvLyBjb2x1bW4gc2FtcGxpbmcgbWF0cml4XG4gIHZhciBQSEkgPSBbXTsgLy8gaW50ZXJzZWN0aW9uIG9mIGNvbHVtbiBhbmQgcm93IHNhbXBsaW5nIG1hdHJpY2VzIFxuICB2YXIgSU5WID0gW107IC8vIGludmVyc2Ugb2YgUEhJIFxuXG4gIHZhciBmaXJzdFNhbXBsZSA9IHZvaWQgMDsgLy8gdGhlIGZpcnN0IHNhbXBsZWQgbm9kZVxuICB2YXIgbm9kZVNpemUgPSB2b2lkIDA7XG5cbiAgdmFyIGluZmluaXR5ID0gMTAwMDAwMDAwO1xuICB2YXIgc21hbGwgPSAwLjAwMDAwMDAwMTtcblxuICB2YXIgcGlUb2wgPSBvcHRpb25zLnBpVG9sO1xuICB2YXIgc2FtcGxpbmdUeXBlID0gb3B0aW9ucy5zYW1wbGluZ1R5cGU7IC8vIGZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICB2YXIgbm9kZVNlcGFyYXRpb24gPSBvcHRpb25zLm5vZGVTZXBhcmF0aW9uO1xuICB2YXIgc2FtcGxlU2l6ZSA9IHZvaWQgMDtcblxuICAvKioqKiBTcGVjdHJhbC1wcmVwcm9jZXNzaW5nIGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8qKioqIFNwZWN0cmFsIGxheW91dCBmdW5jdGlvbnMgKioqKi9cblxuICAvLyBkZXRlcm1pbmUgd2hpY2ggY29sdW1ucyB0byBiZSBzYW1wbGVkXG4gIHZhciByYW5kb21TYW1wbGVDUiA9IGZ1bmN0aW9uIHJhbmRvbVNhbXBsZUNSKCkge1xuICAgIHZhciBzYW1wbGUgPSAwO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGZsYWcgPSBmYWxzZTtcblxuICAgIHdoaWxlIChjb3VudCA8IHNhbXBsZVNpemUpIHtcbiAgICAgIHNhbXBsZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVTaXplKTtcblxuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGlmIChzYW1wbGVzQ29sdW1uW2ldID09IHNhbXBsZSkge1xuICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZmxhZykge1xuICAgICAgICBzYW1wbGVzQ29sdW1uW2NvdW50XSA9IHNhbXBsZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB0YWtlcyB0aGUgaW5kZXggb2YgdGhlIG5vZGUocGl2b3QpIHRvIGluaXRpYXRlIEJGUyBhcyBhIHBhcmFtZXRlclxuICB2YXIgQkZTID0gZnVuY3Rpb24gQkZTKHBpdm90LCBpbmRleCwgc2FtcGxpbmdNZXRob2QpIHtcbiAgICB2YXIgcGF0aCA9IFtdOyAvLyB0aGUgZnJvbnQgb2YgdGhlIHBhdGhcbiAgICB2YXIgZnJvbnQgPSAwOyAvLyB0aGUgYmFjayBvZiB0aGUgcGF0aFxuICAgIHZhciBiYWNrID0gMDtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG4gICAgdmFyIGRpc3RhbmNlID0gW107XG5cbiAgICB2YXIgbWF4X2Rpc3QgPSAwOyAvLyB0aGUgZnVydGhlc3Qgbm9kZSB0byBiZSByZXR1cm5lZFxuICAgIHZhciBtYXhfaW5kID0gMTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZVNpemU7IGkrKykge1xuICAgICAgZGlzdGFuY2VbaV0gPSBpbmZpbml0eTtcbiAgICB9XG5cbiAgICBwYXRoW2JhY2tdID0gcGl2b3Q7XG4gICAgZGlzdGFuY2VbcGl2b3RdID0gMDtcblxuICAgIHdoaWxlIChiYWNrID49IGZyb250KSB7XG4gICAgICBjdXJyZW50ID0gcGF0aFtmcm9udCsrXTtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSBhbGxOb2Rlc05laWdoYm9yaG9vZFtjdXJyZW50XTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHRlbXAgPSBub2RlSW5kZXhlcy5nZXQobmVpZ2hib3JzW19pXSk7XG4gICAgICAgIGlmIChkaXN0YW5jZVt0ZW1wXSA9PSBpbmZpbml0eSkge1xuICAgICAgICAgIGRpc3RhbmNlW3RlbXBdID0gZGlzdGFuY2VbY3VycmVudF0gKyAxO1xuICAgICAgICAgIHBhdGhbKytiYWNrXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIENbY3VycmVudF1baW5kZXhdID0gZGlzdGFuY2VbY3VycmVudF0gKiBub2RlU2VwYXJhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoc2FtcGxpbmdNZXRob2QpIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVTaXplOyBfaTIrKykge1xuICAgICAgICBpZiAoQ1tfaTJdW2luZGV4XSA8IG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdKSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kyXSA9IENbX2kyXVtpbmRleF07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVTaXplOyBfaTMrKykge1xuICAgICAgICBpZiAobWluRGlzdGFuY2VzQ29sdW1uW19pM10gPiBtYXhfZGlzdCkge1xuICAgICAgICAgIG1heF9kaXN0ID0gbWluRGlzdGFuY2VzQ29sdW1uW19pM107XG4gICAgICAgICAgbWF4X2luZCA9IF9pMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4X2luZDtcbiAgfTtcblxuICAvLyBhcHBseSBCRlMgdG8gYWxsIG5vZGVzIG9yIHNlbGVjdGVkIHNhbXBsZXNcbiAgdmFyIGFsbEJGUyA9IGZ1bmN0aW9uIGFsbEJGUyhzYW1wbGluZ01ldGhvZCkge1xuXG4gICAgdmFyIHNhbXBsZSA9IHZvaWQgMDtcblxuICAgIGlmICghc2FtcGxpbmdNZXRob2QpIHtcbiAgICAgIHJhbmRvbVNhbXBsZUNSKCk7XG5cbiAgICAgIC8vIGNhbGwgQkZTXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNhbXBsZVNpemU7IGkrKykge1xuICAgICAgICBCRlMoc2FtcGxlc0NvbHVtbltpXSwgaSwgc2FtcGxpbmdNZXRob2QsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuICAgICAgZmlyc3RTYW1wbGUgPSBzYW1wbGU7XG5cbiAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVTaXplOyBfaTQrKykge1xuICAgICAgICBtaW5EaXN0YW5jZXNDb2x1bW5bX2k0XSA9IGluZmluaXR5O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBzYW1wbGVTaXplOyBfaTUrKykge1xuICAgICAgICBzYW1wbGVzQ29sdW1uW19pNV0gPSBzYW1wbGU7XG4gICAgICAgIHNhbXBsZSA9IEJGUyhzYW1wbGUsIF9pNSwgc2FtcGxpbmdNZXRob2QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gdGhlIHNxdWFyZWQgZGlzdGFuY2VzIGZvciBDXG4gICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbm9kZVNpemU7IF9pNisrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNhbXBsZVNpemU7IGorKykge1xuICAgICAgICBDW19pNl1bal0gKj0gQ1tfaTZdW2pdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gUEhJXG4gICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgc2FtcGxlU2l6ZTsgX2k3KyspIHtcbiAgICAgIFBISVtfaTddID0gW107XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgc2FtcGxlU2l6ZTsgX2k4KyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBzYW1wbGVTaXplOyBfaisrKSB7XG4gICAgICAgIFBISVtfaThdW19qXSA9IENbc2FtcGxlc0NvbHVtbltfal1dW19pOF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHBlcmZvcm0gdGhlIFNWRCBhbGdvcml0aG0gYW5kIGFwcGx5IGEgcmVndWxhcml6YXRpb24gc3RlcFxuICB2YXIgc2FtcGxlID0gZnVuY3Rpb24gc2FtcGxlKCkge1xuXG4gICAgdmFyIFNWRFJlc3VsdCA9IFNWRC5zdmQoUEhJKTtcblxuICAgIHZhciBhX3EgPSBTVkRSZXN1bHQuUztcbiAgICB2YXIgYV91ID0gU1ZEUmVzdWx0LlU7XG4gICAgdmFyIGFfdiA9IFNWRFJlc3VsdC5WO1xuXG4gICAgdmFyIG1heF9zID0gYV9xWzBdICogYV9xWzBdICogYV9xWzBdO1xuXG4gICAgdmFyIGFfU2lnID0gW107XG5cbiAgICAvLyAgcmVndWxhcml6YXRpb25cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNhbXBsZVNpemU7IGkrKykge1xuICAgICAgYV9TaWdbaV0gPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIGFfU2lnW2ldW2pdID0gMDtcbiAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgIGFfU2lnW2ldW2pdID0gYV9xW2ldIC8gKGFfcVtpXSAqIGFfcVtpXSArIG1heF9zIC8gKGFfcVtpXSAqIGFfcVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgSU5WID0gTWF0cml4Lm11bHRNYXQoTWF0cml4Lm11bHRNYXQoYV92LCBhX1NpZyksIE1hdHJpeC50cmFuc3Bvc2UoYV91KSk7XG4gIH07XG5cbiAgLy8gY2FsY3VsYXRlIGZpbmFsIGNvb3JkaW5hdGVzIFxuICB2YXIgcG93ZXJJdGVyYXRpb24gPSBmdW5jdGlvbiBwb3dlckl0ZXJhdGlvbigpIHtcbiAgICAvLyB0d28gbGFyZ2VzdCBlaWdlbnZhbHVlc1xuICAgIHZhciB0aGV0YTEgPSB2b2lkIDA7XG4gICAgdmFyIHRoZXRhMiA9IHZvaWQgMDtcblxuICAgIC8vIGluaXRpYWwgZ3Vlc3NlcyBmb3IgZWlnZW52ZWN0b3JzXG4gICAgdmFyIFkxID0gW107XG4gICAgdmFyIFkyID0gW107XG5cbiAgICB2YXIgVjEgPSBbXTtcbiAgICB2YXIgVjIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZVNpemU7IGkrKykge1xuICAgICAgWTFbaV0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgWTJbaV0gPSBNYXRoLnJhbmRvbSgpO1xuICAgIH1cblxuICAgIFkxID0gTWF0cml4Lm5vcm1hbGl6ZShZMSk7XG4gICAgWTIgPSBNYXRyaXgubm9ybWFsaXplKFkyKTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgLy8gdG8ga2VlcCB0cmFjayBvZiB0aGUgaW1wcm92ZW1lbnQgcmF0aW8gaW4gcG93ZXIgaXRlcmF0aW9uXG4gICAgdmFyIGN1cnJlbnQgPSBzbWFsbDtcbiAgICB2YXIgcHJldmlvdXMgPSBzbWFsbDtcblxuICAgIHZhciB0ZW1wID0gdm9pZCAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pOSA9IDA7IF9pOSA8IG5vZGVTaXplOyBfaTkrKykge1xuICAgICAgICBWMVtfaTldID0gWTFbX2k5XTtcbiAgICAgIH1cblxuICAgICAgWTEgPSBNYXRyaXgubXVsdEdhbW1hKE1hdHJpeC5tdWx0TChNYXRyaXgubXVsdEdhbW1hKFYxKSwgQywgSU5WKSk7XG4gICAgICB0aGV0YTEgPSBNYXRyaXguZG90UHJvZHVjdChWMSwgWTEpO1xuICAgICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcblxuICAgICAgY3VycmVudCA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG5cbiAgICAgIHRlbXAgPSBNYXRoLmFicyhjdXJyZW50IC8gcHJldmlvdXMpO1xuXG4gICAgICBpZiAodGVtcCA8PSAxICsgcGlUb2wgJiYgdGVtcCA+PSAxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBub2RlU2l6ZTsgX2kxMCsrKSB7XG4gICAgICBWMVtfaTEwXSA9IFkxW19pMTBdO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2aW91cyA9IHNtYWxsO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb3VudCsrO1xuXG4gICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IG5vZGVTaXplOyBfaTExKyspIHtcbiAgICAgICAgVjJbX2kxMV0gPSBZMltfaTExXTtcbiAgICAgIH1cblxuICAgICAgVjIgPSBNYXRyaXgubWludXNPcChWMiwgTWF0cml4Lm11bHRDb25zKFYxLCBNYXRyaXguZG90UHJvZHVjdChWMSwgVjIpKSk7XG4gICAgICBZMiA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjIpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMiA9IE1hdHJpeC5kb3RQcm9kdWN0KFYyLCBZMik7XG4gICAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEyID0gMDsgX2kxMiA8IG5vZGVTaXplOyBfaTEyKyspIHtcbiAgICAgIFYyW19pMTJdID0gWTJbX2kxMl07XG4gICAgfVxuXG4gICAgLy8gdGhldGExIG5vdyBjb250YWlucyBkb21pbmFudCBlaWdlbnZhbHVlXG4gICAgLy8gdGhldGEyIG5vdyBjb250YWlucyB0aGUgc2Vjb25kLWxhcmdlc3QgZWlnZW52YWx1ZVxuICAgIC8vIFYxIG5vdyBjb250YWlucyB0aGV0YTEncyBlaWdlbnZlY3RvclxuICAgIC8vIFYyIG5vdyBjb250YWlucyB0aGV0YTIncyBlaWdlbnZlY3RvclxuXG4gICAgLy9wb3B1bGF0ZSB0aGUgdHdvIHZlY3RvcnNcbiAgICB4Q29vcmRzID0gTWF0cml4Lm11bHRDb25zKFYxLCBNYXRoLnNxcnQoTWF0aC5hYnModGhldGExKSkpO1xuICAgIHlDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjIsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTIpKSk7XG4gIH07XG5cbiAgLyoqKiogUHJlcGFyYXRpb24gZm9yIHNwZWN0cmFsIGxheW91dCAoUHJlcHJvY2Vzc2luZykgKioqKi9cblxuICAvLyBjb25uZWN0IGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIChmaXJzdCB0b3AgbGV2ZWwsIHRoZW4gaW5zaWRlIG9mIGVhY2ggY29tcG91bmQgbm9kZSlcbiAgYXV4LmNvbm5lY3RDb21wb25lbnRzKGN5LCBlbGVzLCBhdXguZ2V0VG9wTW9zdE5vZGVzKG5vZGVzKSwgZHVtbXlOb2Rlcyk7XG5cbiAgcGFyZW50Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgYXV4LmNvbm5lY3RDb21wb25lbnRzKGN5LCBlbGVzLCBhdXguZ2V0VG9wTW9zdE5vZGVzKGVsZS5kZXNjZW5kYW50cygpLmludGVyc2VjdGlvbihlbGVzKSksIGR1bW15Tm9kZXMpO1xuICB9KTtcblxuICAvLyBhc3NpZ24gaW5kZXhlcyB0byBub2RlcyAoZmlyc3QgcmVhbCwgdGhlbiBkdW1teSBub2RlcylcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghbm9kZXNbaV0uaXNQYXJlbnQoKSkge1xuICAgICAgbm9kZUluZGV4ZXMuc2V0KG5vZGVzW2ldLmlkKCksIGluZGV4KyspO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGR1bW15Tm9kZXMua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBub2RlSW5kZXhlcy5zZXQoa2V5LCBpbmRleCsrKTtcbiAgICB9XG5cbiAgICAvLyBpbnN0YW50aWF0ZSB0aGUgbmVpZ2hib3Job29kIG1hdHJpeFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIF9pMTMgPSAwOyBfaTEzIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kxMysrKSB7XG4gICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbX2kxM10gPSBbXTtcbiAgfVxuXG4gIC8vIGZvcm0gYSBwYXJlbnQtY2hpbGQgbWFwIHRvIGtlZXAgcmVwcmVzZW50YXRpdmUgbm9kZSBvZiBlYWNoIGNvbXBvdW5kIG5vZGUgIFxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUuY2hpbGRyZW4oKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG5cbiAgICAvLyAgICAgIGxldCByYW5kb20gPSAwO1xuICAgIHdoaWxlIChjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoID09IDApIHtcbiAgICAgIC8vICAgICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcygpLmxlbmd0aCk7IC8vIGlmIGFsbCBjaGlsZHJlbiBhcmUgY29tcG91bmQgdGhlbiBwcm9jZWVkIHJhbmRvbWx5XG4gICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLm5vZGVzKClbMF0uY2hpbGRyZW4oKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgfVxuICAgIC8vICBzZWxlY3QgdGhlIHJlcHJlc2VudGF0aXZlIG5vZGUgLSB3ZSBjYW4gYXBwbHkgZGlmZmVyZW50IG1ldGhvZHMgaGVyZVxuICAgIC8vICAgICAgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbWluID0gY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpWzBdLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUyLCBpKSB7XG4gICAgICBpZiAoZWxlMi5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aCA8IG1pbikge1xuICAgICAgICBtaW4gPSBlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGFyZW50Q2hpbGRNYXAuc2V0KGVsZS5pZCgpLCBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbaW5kZXhdLmlkKCkpO1xuICB9KTtcblxuICAvLyBhZGQgbmVpZ2hib3Job29kIHJlbGF0aW9ucyAoZmlyc3QgcmVhbCwgdGhlbiBkdW1teSBub2RlcylcbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZUluZGV4ID0gdm9pZCAwO1xuXG4gICAgaWYgKGVsZS5pc1BhcmVudCgpKSBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChwYXJlbnRDaGlsZE1hcC5nZXQoZWxlLmlkKCkpKTtlbHNlIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcblxuICAgIGVsZS5uZWlnaGJvcmhvb2QoKS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChlbGVzLmludGVyc2VjdGlvbihlbGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChub2RlLmlzUGFyZW50KCkpIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKHBhcmVudENoaWxkTWFwLmdldChub2RlLmlkKCkpKTtlbHNlIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKG5vZGUuaWQoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9rZXkpIHtcbiAgICB2YXIgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoX2tleSk7XG4gICAgdmFyIGRpc2Nvbm5lY3RlZElkID0gdm9pZCAwO1xuICAgIGR1bW15Tm9kZXMuZ2V0KF9rZXkpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoY3kuZ2V0RWxlbWVudEJ5SWQoaWQpLmlzUGFyZW50KCkpIGRpc2Nvbm5lY3RlZElkID0gcGFyZW50Q2hpbGRNYXAuZ2V0KGlkKTtlbHNlIGRpc2Nvbm5lY3RlZElkID0gaWQ7XG5cbiAgICAgIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKGRpc2Nvbm5lY3RlZElkKTtcbiAgICAgIGFsbE5vZGVzTmVpZ2hib3Job29kW25vZGVJbmRleGVzLmdldChkaXNjb25uZWN0ZWRJZCldLnB1c2goX2tleSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcbiAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICB2YXIgX2l0ZXJhdG9yRXJyb3IyID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IGR1bW15Tm9kZXMua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICB2YXIgX2tleSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgX2xvb3AoX2tleSk7XG4gICAgfVxuXG4gICAgLy8gbm9kZVNpemUgbm93IG9ubHkgY29uc2lkZXJzIHRoZSBzaXplIG9mIHRyYW5zZm9ybWVkIGdyYXBoXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yMiA9IHRydWU7XG4gICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG4gICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5vZGVTaXplID0gbm9kZUluZGV4ZXMuc2l6ZTtcblxuICB2YXIgc3BlY3RyYWxSZXN1bHQgPSB2b2lkIDA7XG5cbiAgLy8gSWYgbnVtYmVyIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIDEgb3IgMiwgZWl0aGVyIFNWRCBvciBwb3dlckl0ZXJhdGlvbiBjYXVzZXMgcHJvYmxlbVxuICAvLyBTbyBza2lwIHNwZWN0cmFsIGFuZCBsYXlvdXQgdGhlIGdyYXBoIHdpdGggY29zZVxuICBpZiAobm9kZVNpemUgPiAyKSB7XG4gICAgLy8gaWYgIyBvZiBub2RlcyBpbiB0cmFuc2Zvcm1lZCBncmFwaCBpcyBzbWFsbGVyIHRoYW4gc2FtcGxlIHNpemUsXG4gICAgLy8gdGhlbiB1c2UgIyBvZiBub2RlcyBhcyBzYW1wbGUgc2l6ZVxuICAgIHNhbXBsZVNpemUgPSBub2RlU2l6ZSA8IG9wdGlvbnMuc2FtcGxlU2l6ZSA/IG5vZGVTaXplIDogb3B0aW9ucy5zYW1wbGVTaXplO1xuXG4gICAgLy8gaW5zdGFudGlhdGVzIHRoZSBwYXJ0aWFsIG1hdHJpY2VzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHNwZWN0cmFsIGxheW91dFxuICAgIGZvciAodmFyIF9pMTQgPSAwOyBfaTE0IDwgbm9kZVNpemU7IF9pMTQrKykge1xuICAgICAgQ1tfaTE0XSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaTE1ID0gMDsgX2kxNSA8IHNhbXBsZVNpemU7IF9pMTUrKykge1xuICAgICAgSU5WW19pMTVdID0gW107XG4gICAgfVxuXG4gICAgLyoqKiogQXBwbHkgc3BlY3RyYWwgbGF5b3V0ICoqKiovXG5cbiAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIiB8fCBvcHRpb25zLnN0ZXAgPT0gXCJhbGxcIikge1xuICAgICAgYWxsQkZTKHNhbXBsaW5nVHlwZSk7XG4gICAgICBzYW1wbGUoKTtcbiAgICAgIHBvd2VySXRlcmF0aW9uKCk7XG5cbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZUluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB4Q29vcmRzLnB1c2goY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KS5wb3NpdGlvbihcInhcIikpO1xuICAgICAgICB5Q29vcmRzLnB1c2goY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KS5wb3NpdGlvbihcInlcIikpO1xuICAgICAgfSk7XG4gICAgICBzcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiB4Q29vcmRzLCB5Q29vcmRzOiB5Q29vcmRzIH07XG4gICAgfVxuICAgIHJldHVybiBzcGVjdHJhbFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3IgPSBub2RlSW5kZXhlcy5rZXlzKCk7XG4gICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGl0ZXJhdG9yLm5leHQoKS52YWx1ZSk7XG4gICAgdmFyIGZpcnN0Tm9kZVBvcyA9IGZpcnN0Tm9kZS5wb3NpdGlvbigpO1xuICAgIHZhciBmaXJzdE5vZGVXaWR0aCA9IGZpcnN0Tm9kZS5vdXRlcldpZHRoKCk7XG4gICAgeENvb3Jkcy5wdXNoKGZpcnN0Tm9kZVBvcy54KTtcbiAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIGlmIChub2RlU2l6ZSA9PSAyKSB7XG4gICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGl0ZXJhdG9yLm5leHQoKS52YWx1ZSk7XG4gICAgICB2YXIgc2Vjb25kTm9kZVdpZHRoID0gc2Vjb25kTm9kZS5vdXRlcldpZHRoKCk7XG4gICAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnggKyBmaXJzdE5vZGVXaWR0aCAvIDIgKyBzZWNvbmROb2RlV2lkdGggLyAyICsgb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgpO1xuICAgICAgeUNvb3Jkcy5wdXNoKGZpcnN0Tm9kZVBvcy55KTtcbiAgICB9XG5cbiAgICBzcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiB4Q29vcmRzLCB5Q29vcmRzOiB5Q29vcmRzIH07XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgc3BlY3RyYWxMYXlvdXQ6IHNwZWN0cmFsTGF5b3V0IH07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1Nzk6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgaW1wbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEyKTtcblxuLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxudmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIoY3l0b3NjYXBlKSB7XG4gIGlmICghY3l0b3NjYXBlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGNhbid0IHJlZ2lzdGVyIGlmIGN5dG9zY2FwZSB1bnNwZWNpZmllZFxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2Zjb3NlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE0MDpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX187XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHQvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTc5KTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgVGhlIEN5dG9zY2FwZSBDb25zb3J0aXVtLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2ZcbiAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIOKAnFNvZnR3YXJl4oCdKSwgdG8gZGVhbCBpblxuICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXNcbiAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkb1xuICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg4oCcQVMgSVPigJ0sIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9zLCBfZTtcbiAgdHJ5IHtcbiAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBfYXJyO1xufVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHtcbiAgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07XG4gIGlmICghaXQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoaXQpIG8gPSBpdDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24gKCkge307XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgIGRpZEVyciA9IGZhbHNlLFxuICAgIGVycjtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCA9IGl0LmNhbGwobyk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0Lm5leHQoKTtcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgZXJyID0gZTtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgX3dpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG52YXIgbmF2aWdhdG9yID0gX3dpbmRvdyA/IF93aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcbl93aW5kb3cgPyBfd2luZG93LmRvY3VtZW50IDogbnVsbDtcbnZhciB0eXBlb2ZzdHIgPSBfdHlwZW9mKCcnKTtcbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcbnZhciB0eXBlb2ZmbiA9IF90eXBlb2YoZnVuY3Rpb24gKCkge30pO1xudmFyIHR5cGVvZmh0bWxlbGUgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihIVE1MRWxlbWVudCk7XG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4kNihvYmouaW5zdGFuY2VTdHJpbmcpID8gb2JqLmluc3RhbmNlU3RyaW5nKCkgOiBudWxsO1xufTtcblxudmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PSB0eXBlb2ZzdHI7XG59O1xudmFyIGZuJDYgPSBmdW5jdGlvbiBmbihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mZm47XG59O1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkob2JqKSB7XG4gIHJldHVybiAhZWxlbWVudE9yQ29sbGVjdGlvbihvYmopICYmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShvYmopIDogb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXkpO1xufTtcbnZhciBwbGFpbk9iamVjdCA9IGZ1bmN0aW9uIHBsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmogJiYgIWFycmF5KG9iaikgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59O1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqO1xufTtcbnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIkMShvYmopICYmIE1hdGguZmxvb3Iob2JqKSA9PT0gb2JqO1xufTtcbnZhciBodG1sRWxlbWVudCA9IGZ1bmN0aW9uIGh0bWxFbGVtZW50KG9iaikge1xuICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZmh0bWxlbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsICE9IG9iaiAmJiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBlbGVtZW50T3JDb2xsZWN0aW9uID0gZnVuY3Rpb24gZWxlbWVudE9yQ29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGVsZW1lbnQob2JqKSB8fCBjb2xsZWN0aW9uKG9iaik7XG59O1xudmFyIGVsZW1lbnQgPSBmdW5jdGlvbiBlbGVtZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmIG9iai5fcHJpdmF0ZS5zaW5nbGU7XG59O1xudmFyIGNvbGxlY3Rpb24gPSBmdW5jdGlvbiBjb2xsZWN0aW9uKG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmICFvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb3JlID0gZnVuY3Rpb24gY29yZShvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb3JlJztcbn07XG52YXIgc3R5bGVzaGVldCA9IGZ1bmN0aW9uIHN0eWxlc2hlZXQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnc3R5bGVzaGVldCc7XG59O1xudmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnZXZlbnQnO1xufTtcbnZhciBlbXB0eVN0cmluZyA9IGZ1bmN0aW9uIGVtcHR5U3RyaW5nKG9iaikge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBpcyBlbXB0eVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gJycgfHwgb2JqLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgIHJldHVybiB0cnVlOyAvLyBlbXB0eSBzdHJpbmcgaXMgZW1wdHlcbiAgfVxuXG4gIHJldHVybiBmYWxzZTsgLy8gb3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93IHdoYXQgd2UndmUgZ290XG59O1xudmFyIGRvbUVsZW1lbnQgPSBmdW5jdGlvbiBkb21FbGVtZW50KG9iaikge1xuICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTsgLy8gd2UncmUgbm90IGluIGEgYnJvd3NlciBzbyBpdCBkb2Vzbid0IG1hdHRlclxuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBib3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94KG9iaikge1xuICByZXR1cm4gcGxhaW5PYmplY3Qob2JqKSAmJiBudW1iZXIkMShvYmoueDEpICYmIG51bWJlciQxKG9iai54MikgJiYgbnVtYmVyJDEob2JqLnkxKSAmJiBudW1iZXIkMShvYmoueTIpO1xufTtcbnZhciBwcm9taXNlID0gZnVuY3Rpb24gcHJvbWlzZShvYmopIHtcbiAgcmV0dXJuIG9iamVjdChvYmopICYmIGZuJDYob2JqLnRoZW4pO1xufTtcbnZhciBtcyA9IGZ1bmN0aW9uIG1zKCkge1xuICByZXR1cm4gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL21zaWV8dHJpZGVudHxlZGdlL2kpO1xufTsgLy8gcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRldGVjdCB0aGlzLi4uXG5cbnZhciBtZW1vaXplJDEgPSBmdW5jdGlvbiBtZW1vaXplKGZuLCBrZXlGbikge1xuICBpZiAoIWtleUZuKSB7XG4gICAga2V5Rm4gPSBmdW5jdGlvbiBrZXlGbigpIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZ3Muam9pbignJCcpO1xuICAgIH07XG4gIH1cbiAgdmFyIG1lbW9pemVkRm4gPSBmdW5jdGlvbiBtZW1vaXplZEZuKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmV0O1xuICAgIHZhciBrID0ga2V5Rm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgdmFyIGNhY2hlID0gbWVtb2l6ZWRGbi5jYWNoZTtcbiAgICBpZiAoIShyZXQgPSBjYWNoZVtrXSkpIHtcbiAgICAgIHJldCA9IGNhY2hlW2tdID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIG1lbW9pemVkRm4uY2FjaGUgPSB7fTtcbiAgcmV0dXJuIG1lbW9pemVkRm47XG59O1xuXG52YXIgY2FtZWwyZGFzaCA9IG1lbW9pemUkMShmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFtBLVpdKS9nLCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiAnLScgKyB2LnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xufSk7XG52YXIgZGFzaDJjYW1lbCA9IG1lbW9pemUkMShmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKC1cXHcpL2csIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHZbMV0udG9VcHBlckNhc2UoKTtcbiAgfSk7XG59KTtcbnZhciBwcmVwZW5kQ2FtZWwgPSBtZW1vaXplJDEoZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59LCBmdW5jdGlvbiAocHJlZml4LCBzdHIpIHtcbiAgcmV0dXJuIHByZWZpeCArICckJyArIHN0cjtcbn0pO1xudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAoZW1wdHlTdHJpbmcoc3RyKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59O1xuXG52YXIgbnVtYmVyID0gJyg/OlstK10/KD86KD86XFxcXGQrfFxcXFxkKlxcXFwuXFxcXGQrKSg/OltFZV1bKy1dP1xcXFxkKyk/KSknO1xudmFyIHJnYmEgPSAncmdiW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPykoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIHJnYmFOb0JhY2tSZWZzID0gJ3JnYlthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGEgPSAnaHNsW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXSkoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGFOb0JhY2tSZWZzID0gJ2hzbFthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXSlcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhleDMgPSAnXFxcXCNbMC05YS1mQS1GXXszfSc7XG52YXIgaGV4NiA9ICdcXFxcI1swLTlhLWZBLUZdezZ9JztcblxudmFyIGFzY2VuZGluZyA9IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmIChhID4gYikge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIC0xICogYXNjZW5kaW5nKGEsIGIpO1xufTtcblxudmFyIGV4dGVuZCA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3NbaV07XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGsgPSBrZXlzW2pdO1xuICAgICAgdGd0W2tdID0gb2JqW2tdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGd0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiXSBmcm9tICNhYmMgb3IgI2FhYmJjY1xudmFyIGhleDJ0dXBsZSA9IGZ1bmN0aW9uIGhleDJ0dXBsZShoZXgpIHtcbiAgaWYgKCEoaGV4Lmxlbmd0aCA9PT0gNCB8fCBoZXgubGVuZ3RoID09PSA3KSB8fCBoZXhbMF0gIT09ICcjJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2hvcnRIZXggPSBoZXgubGVuZ3RoID09PSA0O1xuICB2YXIgciwgZywgYjtcbiAgdmFyIGJhc2UgPSAxNjtcbiAgaWYgKHNob3J0SGV4KSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsxXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFsyXSArIGhleFsyXSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFszXSArIGhleFszXSwgYmFzZSk7XG4gIH0gZWxzZSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsyXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFszXSArIGhleFs0XSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFs1XSArIGhleFs2XSwgYmFzZSk7XG4gIH1cbiAgcmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSBoc2woMCwgMCwgMCkgb3IgaHNsYSgwLCAwLCAwLCAwKVxudmFyIGhzbDJ0dXBsZSA9IGZ1bmN0aW9uIGhzbDJ0dXBsZShoc2wpIHtcbiAgdmFyIHJldDtcbiAgdmFyIGgsIHMsIGwsIGEsIHIsIGcsIGI7XG4gIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICByZXR1cm4gcDtcbiAgfVxuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgaHNsYSArICckJykuZXhlYyhoc2wpO1xuICBpZiAobSkge1xuICAgIC8vIGdldCBodWVcbiAgICBoID0gcGFyc2VJbnQobVsxXSk7XG4gICAgaWYgKGggPCAwKSB7XG4gICAgICBoID0gKDM2MCAtIC0xICogaCAlIDM2MCkgJSAzNjA7XG4gICAgfSBlbHNlIGlmIChoID4gMzYwKSB7XG4gICAgICBoID0gaCAlIDM2MDtcbiAgICB9XG4gICAgaCAvPSAzNjA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIHMgPSBwYXJzZUZsb2F0KG1bMl0pO1xuICAgIGlmIChzIDwgMCB8fCBzID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXR1cmF0aW9uIGlzIFswLCAxMDBdXG4gICAgcyA9IHMgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGwgPSBwYXJzZUZsb2F0KG1bM10pO1xuICAgIGlmIChsIDwgMCB8fCBsID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBsaWdodG5lc3MgaXMgWzAsIDEwMF1cbiAgICBsID0gbCAvIDEwMDsgLy8gbm9ybWFsaXNlIG9uIFswLCAxXVxuXG4gICAgYSA9IG1bNF07XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG4gICAgICBpZiAoYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBhbHBoYSBpcyBbMCwgMV1cbiAgICB9XG5cbiAgICAvLyBub3csIGNvbnZlcnQgdG8gcmdiXG4gICAgLy8gY29kZSBmcm9tIGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHRcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gTWF0aC5yb3VuZChsICogMjU1KTsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgIHIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKSk7XG4gICAgICBnID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGgpKTtcbiAgICAgIGIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKSk7XG4gICAgfVxuICAgIHJldCA9IFtyLCBnLCBiLCBhXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiLCBhXSBmcm9tIHJnYigwLCAwLCAwKSBvciByZ2JhKDAsIDAsIDAsIDApXG52YXIgcmdiMnR1cGxlID0gZnVuY3Rpb24gcmdiMnR1cGxlKHJnYikge1xuICB2YXIgcmV0O1xuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgcmdiYSArICckJykuZXhlYyhyZ2IpO1xuICBpZiAobSkge1xuICAgIHJldCA9IFtdO1xuICAgIHZhciBpc1BjdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgICAgdmFyIGNoYW5uZWwgPSBtW2ldO1xuICAgICAgaWYgKGNoYW5uZWxbY2hhbm5lbC5sZW5ndGggLSAxXSA9PT0gJyUnKSB7XG4gICAgICAgIGlzUGN0W2ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoYW5uZWwgPSBwYXJzZUZsb2F0KGNoYW5uZWwpO1xuICAgICAgaWYgKGlzUGN0W2ldKSB7XG4gICAgICAgIGNoYW5uZWwgPSBjaGFubmVsIC8gMTAwICogMjU1OyAvLyBub3JtYWxpc2UgdG8gWzAsIDI1NV1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiAyNTUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGNoYW5uZWwgdmFsdWVcblxuICAgICAgcmV0LnB1c2goTWF0aC5mbG9vcihjaGFubmVsKSk7XG4gICAgfVxuICAgIHZhciBhdExlYXN0T25lSXNQY3QgPSBpc1BjdFsxXSB8fCBpc1BjdFsyXSB8fCBpc1BjdFszXTtcbiAgICB2YXIgYWxsQXJlUGN0ID0gaXNQY3RbMV0gJiYgaXNQY3RbMl0gJiYgaXNQY3RbM107XG4gICAgaWYgKGF0TGVhc3RPbmVJc1BjdCAmJiAhYWxsQXJlUGN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBtdXN0IGFsbCBiZSBwZXJjZW50IHZhbHVlcyBpZiBvbmUgaXNcblxuICAgIHZhciBhbHBoYSA9IG1bNF07XG4gICAgaWYgKGFscGhhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFscGhhID0gcGFyc2VGbG9hdChhbHBoYSk7XG4gICAgICBpZiAoYWxwaGEgPCAwIHx8IGFscGhhID4gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGludmFsaWQgYWxwaGEgdmFsdWVcblxuICAgICAgcmV0LnB1c2goYWxwaGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufTtcbnZhciBjb2xvcm5hbWUydHVwbGUgPSBmdW5jdGlvbiBjb2xvcm5hbWUydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yc1tjb2xvci50b0xvd2VyQ2FzZSgpXTtcbn07XG52YXIgY29sb3IydHVwbGUgPSBmdW5jdGlvbiBjb2xvcjJ0dXBsZShjb2xvcikge1xuICByZXR1cm4gKGFycmF5KGNvbG9yKSA/IGNvbG9yIDogbnVsbCkgfHwgY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB8fCBoZXgydHVwbGUoY29sb3IpIHx8IHJnYjJ0dXBsZShjb2xvcikgfHwgaHNsMnR1cGxlKGNvbG9yKTtcbn07XG52YXIgY29sb3JzID0ge1xuICAvLyBzcGVjaWFsIGNvbG91ciBuYW1lc1xuICB0cmFuc3BhcmVudDogWzAsIDAsIDAsIDBdLFxuICAvLyBOQiBhbHBoYSA9PT0gMFxuXG4gIC8vIHJlZ3VsYXIgY29sb3Vyc1xuICBhbGljZWJsdWU6IFsyNDAsIDI0OCwgMjU1XSxcbiAgYW50aXF1ZXdoaXRlOiBbMjUwLCAyMzUsIDIxNV0sXG4gIGFxdWE6IFswLCAyNTUsIDI1NV0sXG4gIGFxdWFtYXJpbmU6IFsxMjcsIDI1NSwgMjEyXSxcbiAgYXp1cmU6IFsyNDAsIDI1NSwgMjU1XSxcbiAgYmVpZ2U6IFsyNDUsIDI0NSwgMjIwXSxcbiAgYmlzcXVlOiBbMjU1LCAyMjgsIDE5Nl0sXG4gIGJsYWNrOiBbMCwgMCwgMF0sXG4gIGJsYW5jaGVkYWxtb25kOiBbMjU1LCAyMzUsIDIwNV0sXG4gIGJsdWU6IFswLCAwLCAyNTVdLFxuICBibHVldmlvbGV0OiBbMTM4LCA0MywgMjI2XSxcbiAgYnJvd246IFsxNjUsIDQyLCA0Ml0sXG4gIGJ1cmx5d29vZDogWzIyMiwgMTg0LCAxMzVdLFxuICBjYWRldGJsdWU6IFs5NSwgMTU4LCAxNjBdLFxuICBjaGFydHJldXNlOiBbMTI3LCAyNTUsIDBdLFxuICBjaG9jb2xhdGU6IFsyMTAsIDEwNSwgMzBdLFxuICBjb3JhbDogWzI1NSwgMTI3LCA4MF0sXG4gIGNvcm5mbG93ZXJibHVlOiBbMTAwLCAxNDksIDIzN10sXG4gIGNvcm5zaWxrOiBbMjU1LCAyNDgsIDIyMF0sXG4gIGNyaW1zb246IFsyMjAsIDIwLCA2MF0sXG4gIGN5YW46IFswLCAyNTUsIDI1NV0sXG4gIGRhcmtibHVlOiBbMCwgMCwgMTM5XSxcbiAgZGFya2N5YW46IFswLCAxMzksIDEzOV0sXG4gIGRhcmtnb2xkZW5yb2Q6IFsxODQsIDEzNCwgMTFdLFxuICBkYXJrZ3JheTogWzE2OSwgMTY5LCAxNjldLFxuICBkYXJrZ3JlZW46IFswLCAxMDAsIDBdLFxuICBkYXJrZ3JleTogWzE2OSwgMTY5LCAxNjldLFxuICBkYXJra2hha2k6IFsxODksIDE4MywgMTA3XSxcbiAgZGFya21hZ2VudGE6IFsxMzksIDAsIDEzOV0sXG4gIGRhcmtvbGl2ZWdyZWVuOiBbODUsIDEwNywgNDddLFxuICBkYXJrb3JhbmdlOiBbMjU1LCAxNDAsIDBdLFxuICBkYXJrb3JjaGlkOiBbMTUzLCA1MCwgMjA0XSxcbiAgZGFya3JlZDogWzEzOSwgMCwgMF0sXG4gIGRhcmtzYWxtb246IFsyMzMsIDE1MCwgMTIyXSxcbiAgZGFya3NlYWdyZWVuOiBbMTQzLCAxODgsIDE0M10sXG4gIGRhcmtzbGF0ZWJsdWU6IFs3MiwgNjEsIDEzOV0sXG4gIGRhcmtzbGF0ZWdyYXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3NsYXRlZ3JleTogWzQ3LCA3OSwgNzldLFxuICBkYXJrdHVycXVvaXNlOiBbMCwgMjA2LCAyMDldLFxuICBkYXJrdmlvbGV0OiBbMTQ4LCAwLCAyMTFdLFxuICBkZWVwcGluazogWzI1NSwgMjAsIDE0N10sXG4gIGRlZXBza3libHVlOiBbMCwgMTkxLCAyNTVdLFxuICBkaW1ncmF5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRpbWdyZXk6IFsxMDUsIDEwNSwgMTA1XSxcbiAgZG9kZ2VyYmx1ZTogWzMwLCAxNDQsIDI1NV0sXG4gIGZpcmVicmljazogWzE3OCwgMzQsIDM0XSxcbiAgZmxvcmFsd2hpdGU6IFsyNTUsIDI1MCwgMjQwXSxcbiAgZm9yZXN0Z3JlZW46IFszNCwgMTM5LCAzNF0sXG4gIGZ1Y2hzaWE6IFsyNTUsIDAsIDI1NV0sXG4gIGdhaW5zYm9ybzogWzIyMCwgMjIwLCAyMjBdLFxuICBnaG9zdHdoaXRlOiBbMjQ4LCAyNDgsIDI1NV0sXG4gIGdvbGQ6IFsyNTUsIDIxNSwgMF0sXG4gIGdvbGRlbnJvZDogWzIxOCwgMTY1LCAzMl0sXG4gIGdyYXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JleTogWzEyOCwgMTI4LCAxMjhdLFxuICBncmVlbjogWzAsIDEyOCwgMF0sXG4gIGdyZWVueWVsbG93OiBbMTczLCAyNTUsIDQ3XSxcbiAgaG9uZXlkZXc6IFsyNDAsIDI1NSwgMjQwXSxcbiAgaG90cGluazogWzI1NSwgMTA1LCAxODBdLFxuICBpbmRpYW5yZWQ6IFsyMDUsIDkyLCA5Ml0sXG4gIGluZGlnbzogWzc1LCAwLCAxMzBdLFxuICBpdm9yeTogWzI1NSwgMjU1LCAyNDBdLFxuICBraGFraTogWzI0MCwgMjMwLCAxNDBdLFxuICBsYXZlbmRlcjogWzIzMCwgMjMwLCAyNTBdLFxuICBsYXZlbmRlcmJsdXNoOiBbMjU1LCAyNDAsIDI0NV0sXG4gIGxhd25ncmVlbjogWzEyNCwgMjUyLCAwXSxcbiAgbGVtb25jaGlmZm9uOiBbMjU1LCAyNTAsIDIwNV0sXG4gIGxpZ2h0Ymx1ZTogWzE3MywgMjE2LCAyMzBdLFxuICBsaWdodGNvcmFsOiBbMjQwLCAxMjgsIDEyOF0sXG4gIGxpZ2h0Y3lhbjogWzIyNCwgMjU1LCAyNTVdLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogWzI1MCwgMjUwLCAyMTBdLFxuICBsaWdodGdyYXk6IFsyMTEsIDIxMSwgMjExXSxcbiAgbGlnaHRncmVlbjogWzE0NCwgMjM4LCAxNDRdLFxuICBsaWdodGdyZXk6IFsyMTEsIDIxMSwgMjExXSxcbiAgbGlnaHRwaW5rOiBbMjU1LCAxODIsIDE5M10sXG4gIGxpZ2h0c2FsbW9uOiBbMjU1LCAxNjAsIDEyMl0sXG4gIGxpZ2h0c2VhZ3JlZW46IFszMiwgMTc4LCAxNzBdLFxuICBsaWdodHNreWJsdWU6IFsxMzUsIDIwNiwgMjUwXSxcbiAgbGlnaHRzbGF0ZWdyYXk6IFsxMTksIDEzNiwgMTUzXSxcbiAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksIDEzNiwgMTUzXSxcbiAgbGlnaHRzdGVlbGJsdWU6IFsxNzYsIDE5NiwgMjIyXSxcbiAgbGlnaHR5ZWxsb3c6IFsyNTUsIDI1NSwgMjI0XSxcbiAgbGltZTogWzAsIDI1NSwgMF0sXG4gIGxpbWVncmVlbjogWzUwLCAyMDUsIDUwXSxcbiAgbGluZW46IFsyNTAsIDI0MCwgMjMwXSxcbiAgbWFnZW50YTogWzI1NSwgMCwgMjU1XSxcbiAgbWFyb29uOiBbMTI4LCAwLCAwXSxcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwgMjA1LCAxNzBdLFxuICBtZWRpdW1ibHVlOiBbMCwgMCwgMjA1XSxcbiAgbWVkaXVtb3JjaGlkOiBbMTg2LCA4NSwgMjExXSxcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LCAxMTIsIDIxOV0sXG4gIG1lZGl1bXNlYWdyZWVuOiBbNjAsIDE3OSwgMTEzXSxcbiAgbWVkaXVtc2xhdGVibHVlOiBbMTIzLCAxMDQsIDIzOF0sXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiBbMCwgMjUwLCAxNTRdLFxuICBtZWRpdW10dXJxdW9pc2U6IFs3MiwgMjA5LCAyMDRdLFxuICBtZWRpdW12aW9sZXRyZWQ6IFsxOTksIDIxLCAxMzNdLFxuICBtaWRuaWdodGJsdWU6IFsyNSwgMjUsIDExMl0sXG4gIG1pbnRjcmVhbTogWzI0NSwgMjU1LCAyNTBdLFxuICBtaXN0eXJvc2U6IFsyNTUsIDIyOCwgMjI1XSxcbiAgbW9jY2FzaW46IFsyNTUsIDIyOCwgMTgxXSxcbiAgbmF2YWpvd2hpdGU6IFsyNTUsIDIyMiwgMTczXSxcbiAgbmF2eTogWzAsIDAsIDEyOF0sXG4gIG9sZGxhY2U6IFsyNTMsIDI0NSwgMjMwXSxcbiAgb2xpdmU6IFsxMjgsIDEyOCwgMF0sXG4gIG9saXZlZHJhYjogWzEwNywgMTQyLCAzNV0sXG4gIG9yYW5nZTogWzI1NSwgMTY1LCAwXSxcbiAgb3JhbmdlcmVkOiBbMjU1LCA2OSwgMF0sXG4gIG9yY2hpZDogWzIxOCwgMTEyLCAyMTRdLFxuICBwYWxlZ29sZGVucm9kOiBbMjM4LCAyMzIsIDE3MF0sXG4gIHBhbGVncmVlbjogWzE1MiwgMjUxLCAxNTJdLFxuICBwYWxldHVycXVvaXNlOiBbMTc1LCAyMzgsIDIzOF0sXG4gIHBhbGV2aW9sZXRyZWQ6IFsyMTksIDExMiwgMTQ3XSxcbiAgcGFwYXlhd2hpcDogWzI1NSwgMjM5LCAyMTNdLFxuICBwZWFjaHB1ZmY6IFsyNTUsIDIxOCwgMTg1XSxcbiAgcGVydTogWzIwNSwgMTMzLCA2M10sXG4gIHBpbms6IFsyNTUsIDE5MiwgMjAzXSxcbiAgcGx1bTogWzIyMSwgMTYwLCAyMjFdLFxuICBwb3dkZXJibHVlOiBbMTc2LCAyMjQsIDIzMF0sXG4gIHB1cnBsZTogWzEyOCwgMCwgMTI4XSxcbiAgcmVkOiBbMjU1LCAwLCAwXSxcbiAgcm9zeWJyb3duOiBbMTg4LCAxNDMsIDE0M10sXG4gIHJveWFsYmx1ZTogWzY1LCAxMDUsIDIyNV0sXG4gIHNhZGRsZWJyb3duOiBbMTM5LCA2OSwgMTldLFxuICBzYWxtb246IFsyNTAsIDEyOCwgMTE0XSxcbiAgc2FuZHlicm93bjogWzI0NCwgMTY0LCA5Nl0sXG4gIHNlYWdyZWVuOiBbNDYsIDEzOSwgODddLFxuICBzZWFzaGVsbDogWzI1NSwgMjQ1LCAyMzhdLFxuICBzaWVubmE6IFsxNjAsIDgyLCA0NV0sXG4gIHNpbHZlcjogWzE5MiwgMTkyLCAxOTJdLFxuICBza3libHVlOiBbMTM1LCAyMDYsIDIzNV0sXG4gIHNsYXRlYmx1ZTogWzEwNiwgOTAsIDIwNV0sXG4gIHNsYXRlZ3JheTogWzExMiwgMTI4LCAxNDRdLFxuICBzbGF0ZWdyZXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc25vdzogWzI1NSwgMjUwLCAyNTBdLFxuICBzcHJpbmdncmVlbjogWzAsIDI1NSwgMTI3XSxcbiAgc3RlZWxibHVlOiBbNzAsIDEzMCwgMTgwXSxcbiAgdGFuOiBbMjEwLCAxODAsIDE0MF0sXG4gIHRlYWw6IFswLCAxMjgsIDEyOF0sXG4gIHRoaXN0bGU6IFsyMTYsIDE5MSwgMjE2XSxcbiAgdG9tYXRvOiBbMjU1LCA5OSwgNzFdLFxuICB0dXJxdW9pc2U6IFs2NCwgMjI0LCAyMDhdLFxuICB2aW9sZXQ6IFsyMzgsIDEzMCwgMjM4XSxcbiAgd2hlYXQ6IFsyNDUsIDIyMiwgMTc5XSxcbiAgd2hpdGU6IFsyNTUsIDI1NSwgMjU1XSxcbiAgd2hpdGVzbW9rZTogWzI0NSwgMjQ1LCAyNDVdLFxuICB5ZWxsb3c6IFsyNTUsIDI1NSwgMF0sXG4gIHllbGxvd2dyZWVuOiBbMTU0LCAyMDUsIDUwXVxufTtcblxuLy8gc2V0cyB0aGUgdmFsdWUgaW4gYSBtYXAgKG1hcCBtYXkgbm90IGJlIGJ1aWx0KVxudmFyIHNldE1hcCA9IGZ1bmN0aW9uIHNldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBzZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBpZiAoaSA8IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gZXh0ZW5kIHRoZSBtYXAgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAob2JqW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBvYmpba2V5XSA9IHt9O1xuICAgICAgfVxuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNldCB0aGUgdmFsdWVcbiAgICAgIG9ialtrZXldID0gb3B0aW9ucy52YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGdldHMgdGhlIHZhbHVlIGluIGEgbWFwIGV2ZW4gaWYgaXQncyBub3QgYnVpbHQgaW4gcGxhY2VzXG52YXIgZ2V0TWFwID0gZnVuY3Rpb24gZ2V0TWFwKG9wdGlvbnMpIHtcbiAgdmFyIG9iaiA9IG9wdGlvbnMubWFwO1xuICB2YXIga2V5cyA9IG9wdGlvbnMua2V5cztcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocGxhaW5PYmplY3Qoa2V5KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIGdldCBtYXAgd2l0aCBvYmplY3Qga2V5Jyk7XG4gICAgfVxuICAgIG9iaiA9IG9ialtrZXldO1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG52YXIgaXNPYmplY3RfMSA9IGlzT2JqZWN0O1xuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBjb21tb25qc0dsb2JhbCA9PSAnb2JqZWN0JyAmJiBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBjb21tb25qc0dsb2JhbDtcblxudmFyIF9mcmVlR2xvYmFsID0gZnJlZUdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gX2ZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxudmFyIF9yb290ID0gcm9vdDtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gX3Jvb3QuRGF0ZS5ub3coKTtcbn07XG5cbnZhciBub3dfMSA9IG5vdztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG52YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG52YXIgX3RyaW1tZWRFbmRJbmRleCA9IHRyaW1tZWRFbmRJbmRleDtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdcbiAgICA/IHN0cmluZy5zbGljZSgwLCBfdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxudmFyIF9iYXNlVHJpbSA9IGJhc2VUcmltO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wkMSA9IF9yb290LlN5bWJvbDtcblxudmFyIF9TeW1ib2wgPSBTeW1ib2wkMTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvJDUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSQ0ID0gb2JqZWN0UHJvdG8kNS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nJDEgPSBvYmplY3RQcm90byQ1LnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyQxID0gX1N5bWJvbCA/IF9TeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5JDQuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWckMSksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnJDFdID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nJDEuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWckMV0gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9nZXRSYXdUYWcgPSBnZXRSYXdUYWc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byQ0ID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8kNC50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxudmFyIF9vYmplY3RUb1N0cmluZyA9IG9iamVjdFRvU3RyaW5nO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBfU3ltYm9sID8gX1N5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gX2dldFJhd1RhZyh2YWx1ZSlcbiAgICA6IF9vYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbnZhciBfYmFzZUdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG52YXIgaXNPYmplY3RMaWtlXzEgPSBpc09iamVjdExpa2U7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZV8xKHZhbHVlKSAmJiBfYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxudmFyIGlzU3ltYm9sXzEgPSBpc1N5bWJvbDtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sXzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3RfMSh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdF8xKG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IF9iYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG52YXIgdG9OdW1iZXJfMSA9IHRvTnVtYmVyO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUJDEgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQkMSk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyXzEod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0XzEob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcl8xKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZ1xuICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgOiB0aW1lV2FpdGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3dfMSgpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3dfMSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vd18xKCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbnZhciBkZWJvdW5jZV8xID0gZGVib3VuY2U7XG5cbnZhciBwZXJmb3JtYW5jZSA9IF93aW5kb3cgPyBfd2luZG93LnBlcmZvcm1hbmNlIDogbnVsbDtcbnZhciBwbm93ID0gcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2Uubm93ID8gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG59IDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKTtcbn07XG52YXIgcmFmID0gZnVuY3Rpb24gKCkge1xuICBpZiAoX3dpbmRvdykge1xuICAgIGlmIChfd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIGlmIChmbikge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZuKHBub3coKSk7XG4gICAgICB9LCAxMDAwIC8gNjApO1xuICAgIH1cbiAgfTtcbn0oKTtcbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgcmV0dXJuIHJhZihmbik7XG59O1xudmFyIHBlcmZvcm1hbmNlTm93ID0gcG5vdztcblxudmFyIERFRkFVTFRfSEFTSF9TRUVEID0gOTI2MTtcbnZhciBLID0gNjU1OTk7IC8vIDM3IGFsc28gd29ya3MgcHJldHR5IHdlbGxcbnZhciBERUZBVUxUX0hBU0hfU0VFRF9BTFQgPSA1MzgxO1xudmFyIGhhc2hJdGVyYWJsZUludHMgPSBmdW5jdGlvbiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICB2YXIgaGFzaCA9IHNlZWQ7XG4gIHZhciBlbnRyeTtcbiAgZm9yICg7Oykge1xuICAgIGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgIGlmIChlbnRyeS5kb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaGFzaCA9IGhhc2ggKiBLICsgZW50cnkudmFsdWUgfCAwO1xuICB9XG4gIHJldHVybiBoYXNoO1xufTtcbnZhciBoYXNoSW50ID0gZnVuY3Rpb24gaGFzaEludChudW0pIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEO1xuICAvLyBzZGJtL3N0cmluZy1oYXNoXG4gIHJldHVybiBzZWVkICogSyArIG51bSB8IDA7XG59O1xudmFyIGhhc2hJbnRBbHQgPSBmdW5jdGlvbiBoYXNoSW50QWx0KG51bSkge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRURfQUxUO1xuICAvLyBkamIyL3N0cmluZy1oYXNoXG4gIHJldHVybiAoc2VlZCA8PCA1KSArIHNlZWQgKyBudW0gfCAwO1xufTtcbnZhciBjb21iaW5lSGFzaGVzID0gZnVuY3Rpb24gY29tYmluZUhhc2hlcyhoYXNoMSwgaGFzaDIpIHtcbiAgcmV0dXJuIGhhc2gxICogMHgyMDAwMDAgKyBoYXNoMjtcbn07XG52YXIgY29tYmluZUhhc2hlc0FycmF5ID0gZnVuY3Rpb24gY29tYmluZUhhc2hlc0FycmF5KGhhc2hlcykge1xuICByZXR1cm4gaGFzaGVzWzBdICogMHgyMDAwMDAgKyBoYXNoZXNbMV07XG59O1xudmFyIGhhc2hBcnJheXMgPSBmdW5jdGlvbiBoYXNoQXJyYXlzKGhhc2hlczEsIGhhc2hlczIpIHtcbiAgcmV0dXJuIFtoYXNoSW50KGhhc2hlczFbMF0sIGhhc2hlczJbMF0pLCBoYXNoSW50QWx0KGhhc2hlczFbMV0sIGhhc2hlczJbMV0pXTtcbn07XG52YXIgaGFzaEludHNBcnJheSA9IGZ1bmN0aW9uIGhhc2hJbnRzQXJyYXkoaW50cywgc2VlZCkge1xuICB2YXIgZW50cnkgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gaW50cy5sZW5ndGg7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSBpbnRzW2krK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yLCBzZWVkKTtcbn07XG52YXIgaGFzaFN0cmluZyA9IGZ1bmN0aW9uIGhhc2hTdHJpbmcoc3RyLCBzZWVkKSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICB2YWx1ZTogMCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IsIHNlZWQpO1xufTtcbnZhciBoYXNoU3RyaW5ncyA9IGZ1bmN0aW9uIGhhc2hTdHJpbmdzKCkge1xuICByZXR1cm4gaGFzaFN0cmluZ3NBcnJheShhcmd1bWVudHMpO1xufTtcbnZhciBoYXNoU3RyaW5nc0FycmF5ID0gZnVuY3Rpb24gaGFzaFN0cmluZ3NBcnJheShzdHJzKSB7XG4gIHZhciBoYXNoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3RyID0gc3Ryc1tpXTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaGFzaCA9IGhhc2hTdHJpbmcoc3RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaCA9IGhhc2hTdHJpbmcoc3RyLCBoYXNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59O1xuXG4vKmdsb2JhbCBjb25zb2xlICovXG52YXIgd2FybmluZ3NFbmFibGVkID0gdHJ1ZTtcbnZhciB3YXJuU3VwcG9ydGVkID0gY29uc29sZS53YXJuICE9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxudmFyIHRyYWNlU3VwcG9ydGVkID0gY29uc29sZS50cmFjZSAhPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblxudmFyIE1BWF9JTlQkMSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTE7XG52YXIgdHJ1ZWlmeSA9IGZ1bmN0aW9uIHRydWVpZnkoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBmYWxzaWZ5ID0gZnVuY3Rpb24gZmFsc2lmeSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciB6ZXJvaWZ5ID0gZnVuY3Rpb24gemVyb2lmeSgpIHtcbiAgcmV0dXJuIDA7XG59O1xudmFyIG5vb3AkMSA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbnZhciBlcnJvciA9IGZ1bmN0aW9uIGVycm9yKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn07XG52YXIgd2FybmluZ3MgPSBmdW5jdGlvbiB3YXJuaW5ncyhlbmFibGVkKSB7XG4gIGlmIChlbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICB3YXJuaW5nc0VuYWJsZWQgPSAhIWVuYWJsZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHdhcm5pbmdzRW5hYmxlZDtcbiAgfVxufTtcbnZhciB3YXJuID0gZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAoIXdhcm5pbmdzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHdhcm5TdXBwb3J0ZWQpIHtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIGlmICh0cmFjZVN1cHBvcnRlZCkge1xuICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgIH1cbiAgfVxufTsgLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgcmV0dXJuIGV4dGVuZCh7fSwgb2JqKTtcbn07XG5cbi8vIGdldHMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFyZ3VtZW50XG52YXIgY29weSA9IGZ1bmN0aW9uIGNvcHkob2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgaWYgKGFycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCk7XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3Qob2JqKSkge1xuICAgIHJldHVybiBjbG9uZShvYmopO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn07XG52YXIgY29weUFycmF5JDEgPSBmdW5jdGlvbiBjb3B5QXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnIuc2xpY2UoKTtcbn07XG52YXIgdXVpZCA9IGZ1bmN0aW9uIHV1aWQoYSwgYiAvKiBwbGFjZWhvbGRlcnMgKi8pIHtcbiAgZm9yIChcbiAgLy8gbG9vcCA6KVxuICBiID0gYSA9ICcnO1xuICAvLyBiIC0gcmVzdWx0ICwgYSAtIG51bWVyaWMgbGV0aWFibGVcbiAgYSsrIDwgMzY7XG4gIC8vXG4gIGIgKz0gYSAqIDUxICYgNTIgLy8gaWYgXCJhXCIgaXMgbm90IDkgb3IgMTQgb3IgMTkgb3IgMjRcbiAgP1xuICAvLyAgcmV0dXJuIGEgcmFuZG9tIG51bWJlciBvciA0XG4gIChhIF4gMTUgLy8gaWYgXCJhXCIgaXMgbm90IDE1XG4gID9cbiAgLy8gZ2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGZyb20gMCB0byAxNVxuICA4IF4gTWF0aC5yYW5kb20oKSAqIChhIF4gMjAgPyAxNiA6IDQpIC8vIHVubGVzcyBcImFcIiBpcyAyMCwgaW4gd2hpY2ggY2FzZSBhIHJhbmRvbSBudW1iZXIgZnJvbSA4IHRvIDExXG4gIDogNCAvLyAgb3RoZXJ3aXNlIDRcbiAgKS50b1N0cmluZygxNikgOiAnLScgLy8gIGluIG90aGVyIGNhc2VzIChpZiBcImFcIiBpcyA5LDE0LDE5LDI0KSBpbnNlcnQgXCItXCJcbiAgKSB7XG4gIH1cbiAgcmV0dXJuIGI7XG59O1xudmFyIF9zdGF0aWNFbXB0eU9iamVjdCA9IHt9O1xudmFyIHN0YXRpY0VtcHR5T2JqZWN0ID0gZnVuY3Rpb24gc3RhdGljRW1wdHlPYmplY3QoKSB7XG4gIHJldHVybiBfc3RhdGljRW1wdHlPYmplY3Q7XG59O1xudmFyIGRlZmF1bHRzJGcgPSBmdW5jdGlvbiBkZWZhdWx0cyhfZGVmYXVsdHMpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhfZGVmYXVsdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICB2YXIgZmlsbGVkT3B0cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgb3B0VmFsID0gb3B0cyA9PSBudWxsID8gdW5kZWZpbmVkIDogb3B0c1trZXldO1xuICAgICAgZmlsbGVkT3B0c1trZXldID0gb3B0VmFsID09PSB1bmRlZmluZWQgPyBfZGVmYXVsdHNba2V5XSA6IG9wdFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxlZE9wdHM7XG4gIH07XG59O1xudmFyIHJlbW92ZUZyb21BcnJheSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIGVsZSwgb25lQ29weSkge1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGFycltpXSA9PT0gZWxlKSB7XG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgaWYgKG9uZUNvcHkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xudmFyIGNsZWFyQXJyYXkgPSBmdW5jdGlvbiBjbGVhckFycmF5KGFycikge1xuICBhcnIuc3BsaWNlKDAsIGFyci5sZW5ndGgpO1xufTtcbnZhciBwdXNoID0gZnVuY3Rpb24gcHVzaChhcnIsIG90aGVyQXJyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJBcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWwgPSBvdGhlckFycltpXTtcbiAgICBhcnIucHVzaChlbCk7XG4gIH1cbn07XG52YXIgZ2V0UHJlZml4ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBwcm9wTmFtZSwgcHJlZml4KSB7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcm9wTmFtZSA9IHByZXBlbmRDYW1lbChwcmVmaXgsIHByb3BOYW1lKTsgLy8gZS5nLiAobGFiZWxXaWR0aCwgc291cmNlKSA9PiBzb3VyY2VMYWJlbFdpZHRoXG4gIH1cblxuICByZXR1cm4gb2JqW3Byb3BOYW1lXTtcbn07XG52YXIgc2V0UHJlZml4ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIHNldFByZWZpeGVkUHJvcGVydHkob2JqLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG5cbiAgb2JqW3Byb3BOYW1lXSA9IHZhbHVlO1xufTtcblxuLyogZ2xvYmFsIE1hcCAqL1xudmFyIE9iamVjdE1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9iamVjdE1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT2JqZWN0TWFwKTtcbiAgICB0aGlzLl9vYmogPSB7fTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoT2JqZWN0TWFwLCBbe1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsKSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShrZXkpIHtcbiAgICAgIHRoaXMuX29ialtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fb2JqID0ge307XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpba2V5XTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE9iamVjdE1hcDtcbn0oKTtcbnZhciBNYXAkMiA9IHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnID8gTWFwIDogT2JqZWN0TWFwO1xuXG4vKiBnbG9iYWwgU2V0ICovXG5cbnZhciB1bmRlZiA9IFwidW5kZWZpbmVkXCIgO1xudmFyIE9iamVjdFNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9iamVjdFNldChhcnJheU9yT2JqZWN0U2V0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9iamVjdFNldCk7XG4gICAgdGhpcy5fb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLnNpemUgPSAwO1xuICAgIGlmIChhcnJheU9yT2JqZWN0U2V0ICE9IG51bGwpIHtcbiAgICAgIHZhciBhcnI7XG4gICAgICBpZiAoYXJyYXlPck9iamVjdFNldC5pbnN0YW5jZVN0cmluZyAhPSBudWxsICYmIGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcoKSA9PT0gdGhpcy5pbnN0YW5jZVN0cmluZygpKSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQudG9BcnJheSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyID0gYXJyYXlPck9iamVjdFNldDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkKGFycltpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9jcmVhdGVDbGFzcyhPYmplY3RTZXQsIFt7XG4gICAga2V5OiBcImluc3RhbmNlU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc3RhbmNlU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICdzZXQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG4gICAgICBpZiAob1t2YWxdICE9PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDE7XG4gICAgICAgIHRoaXMuc2l6ZSsrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSh2YWwpIHtcbiAgICAgIHZhciBvID0gdGhpcy5fb2JqO1xuICAgICAgaWYgKG9bdmFsXSA9PT0gMSkge1xuICAgICAgICBvW3ZhbF0gPSAwO1xuICAgICAgICB0aGlzLnNpemUtLTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9vYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKHZhbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialt2YWxdID09PSAxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0FycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX29iaikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmhhcyhrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gT2JqZWN0U2V0O1xufSgpO1xudmFyIFNldCQxID0gKHR5cGVvZiBTZXQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihTZXQpKSAhPT0gdW5kZWYgPyBTZXQgOiBPYmplY3RTZXQ7XG5cbi8vIHJlcHJlc2VudHMgYSBub2RlIG9yIGFuIGVkZ2VcbnZhciBFbGVtZW50ID0gZnVuY3Rpb24gRWxlbWVudChjeSwgcGFyYW1zKSB7XG4gIHZhciByZXN0b3JlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICBpZiAoY3kgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCAhY29yZShjeSkpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGhhdmUgYSBjb3JlIHJlZmVyZW5jZSBhbmQgcGFyYW1ldGVycyBzZXQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGdyb3VwID0gcGFyYW1zLmdyb3VwO1xuXG4gIC8vIHRyeSB0byBhdXRvbWF0aWNhbGx5IGluZmVyIHRoZSBncm91cCBpZiB1bnNwZWNpZmllZFxuICBpZiAoZ3JvdXAgPT0gbnVsbCkge1xuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBwYXJhbXMuZGF0YS5zb3VyY2UgIT0gbnVsbCAmJiBwYXJhbXMuZGF0YS50YXJnZXQgIT0gbnVsbCkge1xuICAgICAgZ3JvdXAgPSAnZWRnZXMnO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cCA9ICdub2Rlcyc7XG4gICAgfVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgZ3JvdXBcbiAgaWYgKGdyb3VwICE9PSAnbm9kZXMnICYmIGdyb3VwICE9PSAnZWRnZXMnKSB7XG4gICAgZXJyb3IoJ0FuIGVsZW1lbnQgbXVzdCBiZSBvZiB0eXBlIGBub2Rlc2Agb3IgYGVkZ2VzYDsgeW91IHNwZWNpZmllZCBgJyArIGdyb3VwICsgJ2AnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBtYWtlIHRoZSBlbGVtZW50IGFycmF5LWxpa2UsIGp1c3QgbGlrZSBhIGNvbGxlY3Rpb25cbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpcztcblxuICAvLyBOT1RFOiB3aGVuIHNvbWV0aGluZyBpcyBhZGRlZCBoZXJlLCBhZGQgYWxzbyB0byBlbGUuanNvbigpXG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY3k6IGN5LFxuICAgIHNpbmdsZTogdHJ1ZSxcbiAgICAvLyBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBlbGVtZW50XG4gICAgZGF0YTogcGFyYW1zLmRhdGEgfHwge30sXG4gICAgLy8gZGF0YSBvYmplY3RcbiAgICBwb3NpdGlvbjogcGFyYW1zLnBvc2l0aW9uIHx8IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICAvLyAoeCwgeSkgcG9zaXRpb24gcGFpclxuICAgIGF1dG9XaWR0aDogdW5kZWZpbmVkLFxuICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgb2Ygbm9kZXMgY2FsY3VsYXRlZCBieSB0aGUgcmVuZGVyZXIgd2hlbiBzZXQgdG8gc3BlY2lhbCAnYXV0bycgdmFsdWVcbiAgICBhdXRvSGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgYXV0b1BhZGRpbmc6IHVuZGVmaW5lZCxcbiAgICBjb21wb3VuZEJvdW5kc0NsZWFuOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBjb21wb3VuZCBkaW1lbnNpb25zIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIHRoZSBuZXh0IHRpbWUgZGltZW5zaW9ucyBhcmUgcmVhZFxuICAgIGxpc3RlbmVyczogW10sXG4gICAgLy8gYXJyYXkgb2YgYm91bmQgbGlzdGVuZXJzXG4gICAgZ3JvdXA6IGdyb3VwLFxuICAgIC8vIHN0cmluZzsgJ25vZGVzJyBvciAnZWRnZXMnXG4gICAgc3R5bGU6IHt9LFxuICAgIC8vIHByb3BlcnRpZXMgYXMgc2V0IGJ5IHRoZSBzdHlsZVxuICAgIHJzdHlsZToge30sXG4gICAgLy8gcHJvcGVydGllcyBmb3Igc3R5bGUgc2VudCBmcm9tIHRoZSByZW5kZXJlciB0byB0aGUgY29yZVxuICAgIHN0eWxlQ3h0czogW10sXG4gICAgLy8gYXBwbGllZCBzdHlsZSBjb250ZXh0cyBmcm9tIHRoZSBzdHlsZXJcbiAgICBzdHlsZUtleXM6IHt9LFxuICAgIC8vIHBlci1ncm91cCBrZXlzIG9mIHN0eWxlIHByb3BlcnR5IHZhbHVlc1xuICAgIHJlbW92ZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBpdCdzIGluc2lkZSB0aGUgdmlzOyB0cnVlIGlmIHJlbW92ZWQgKHNldCB0cnVlIGhlcmUgc2luY2Ugd2UgY2FsbCByZXN0b3JlKVxuICAgIHNlbGVjdGVkOiBwYXJhbXMuc2VsZWN0ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciBpdCdzIHNlbGVjdGVkXG4gICAgc2VsZWN0YWJsZTogcGFyYW1zLnNlbGVjdGFibGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMuc2VsZWN0YWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGl0J3Mgc2VsZWN0YWJsZVxuICAgIGxvY2tlZDogcGFyYW1zLmxvY2tlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGxvY2tlZCAoY2Fubm90IGJlIG1vdmVkKVxuICAgIGdyYWJiZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZ3JhYmJlZCBieSB0aGUgbW91c2U7IHJlbmRlcmVyIHNldHMgdGhpcyBwcml2YXRlbHlcbiAgICBncmFiYmFibGU6IHBhcmFtcy5ncmFiYmFibGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMuZ3JhYmJhYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgY2FuIGJlIGdyYWJiZWRcbiAgICBwYW5uYWJsZTogcGFyYW1zLnBhbm5hYmxlID09PSB1bmRlZmluZWQgPyBncm91cCA9PT0gJ2VkZ2VzJyA/IHRydWUgOiBmYWxzZSA6IHBhcmFtcy5wYW5uYWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGhhcyBwYXNzdGhyb3VnaCBwYW5uaW5nIGVuYWJsZWRcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWN0aXZlIGZyb20gdXNlciBpbnRlcmFjdGlvblxuICAgIGNsYXNzZXM6IG5ldyBTZXQkMSgpLFxuICAgIC8vIG1hcCAoIGNsYXNzTmFtZSA9PiB0cnVlIClcbiAgICBhbmltYXRpb246IHtcbiAgICAgIC8vIG9iamVjdCBmb3IgY3VycmVudGx5LXJ1bm5pbmcgYW5pbWF0aW9uc1xuICAgICAgY3VycmVudDogW10sXG4gICAgICBxdWV1ZTogW11cbiAgICB9LFxuICAgIHJzY3JhdGNoOiB7fSxcbiAgICAvLyBvYmplY3QgaW4gd2hpY2ggdGhlIHJlbmRlcmVyIGNhbiBzdG9yZSBpbmZvcm1hdGlvblxuICAgIHNjcmF0Y2g6IHBhcmFtcy5zY3JhdGNoIHx8IHt9LFxuICAgIC8vIHNjcmF0Y2ggb2JqZWN0c1xuICAgIGVkZ2VzOiBbXSxcbiAgICAvLyBhcnJheSBvZiBjb25uZWN0ZWQgZWRnZXNcbiAgICBjaGlsZHJlbjogW10sXG4gICAgLy8gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBwYXJlbnQ6IHBhcmFtcy5wYXJlbnQgJiYgcGFyYW1zLnBhcmVudC5pc05vZGUoKSA/IHBhcmFtcy5wYXJlbnQgOiBudWxsLFxuICAgIC8vIHBhcmVudCByZWZcbiAgICB0cmF2ZXJzYWxDYWNoZToge30sXG4gICAgLy8gY2FjaGUgb2Ygb3V0cHV0IG9mIHRyYXZlcnNhbCBmdW5jdGlvbnNcbiAgICBiYWNrZ3JvdW5kaW5nOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGJhY2tncm91bmQgaW1hZ2VzIGFyZSBsb2FkaW5nXG4gICAgYmJDYWNoZTogbnVsbCxcbiAgICAvLyBjYWNoZSBvZiB0aGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICBiYkNhY2hlU2hpZnQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICAvLyBzaGlmdCBhcHBsaWVkIHRvIGNhY2hlZCBiYiB0byBiZSBhcHBsaWVkIG9uIG5leHQgZ2V0XG4gICAgYm9keUJvdW5kczogbnVsbCxcbiAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWxlbWVudCBib2R5LCB3L28gb3ZlcmxheVxuICAgIG92ZXJsYXlCb3VuZHM6IG51bGwsXG4gICAgLy8gYm91bmRzIGNhY2hlIG9mIGVsZW1lbnQgYm9keSwgaW5jbHVkaW5nIG92ZXJsYXlcbiAgICBsYWJlbEJvdW5kczoge1xuICAgICAgLy8gYm91bmRzIGNhY2hlIG9mIGxhYmVsc1xuICAgICAgYWxsOiBudWxsLFxuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgbWFpbjogbnVsbFxuICAgIH0sXG4gICAgYXJyb3dCb3VuZHM6IHtcbiAgICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlZGdlIGFycm93c1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgJ21pZC1zb3VyY2UnOiBudWxsLFxuICAgICAgJ21pZC10YXJnZXQnOiBudWxsXG4gICAgfVxuICB9O1xuICBpZiAoX3AucG9zaXRpb24ueCA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueCA9IDA7XG4gIH1cbiAgaWYgKF9wLnBvc2l0aW9uLnkgPT0gbnVsbCkge1xuICAgIF9wLnBvc2l0aW9uLnkgPSAwO1xuICB9XG5cbiAgLy8gcmVuZGVyZWRQb3NpdGlvbiBvdmVycmlkZXMgaWYgc3BlY2lmaWVkXG4gIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbikge1xuICAgIHZhciBycG9zID0gcGFyYW1zLnJlbmRlcmVkUG9zaXRpb247XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIF9wLnBvc2l0aW9uID0ge1xuICAgICAgeDogKHJwb3MueCAtIHBhbi54KSAvIHpvb20sXG4gICAgICB5OiAocnBvcy55IC0gcGFuLnkpIC8gem9vbVxuICAgIH07XG4gIH1cbiAgdmFyIGNsYXNzZXMgPSBbXTtcbiAgaWYgKGFycmF5KHBhcmFtcy5jbGFzc2VzKSkge1xuICAgIGNsYXNzZXMgPSBwYXJhbXMuY2xhc3NlcztcbiAgfSBlbHNlIGlmIChzdHJpbmcocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzLnNwbGl0KC9cXHMrLyk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjbGFzc2VzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjbHMgPSBjbGFzc2VzW2ldO1xuICAgIGlmICghY2xzIHx8IGNscyA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBfcC5jbGFzc2VzLmFkZChjbHMpO1xuICB9XG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuICB2YXIgYnlwYXNzID0gcGFyYW1zLnN0eWxlIHx8IHBhcmFtcy5jc3M7XG4gIGlmIChieXBhc3MpIHtcbiAgICB3YXJuKCdTZXR0aW5nIGEgYHN0eWxlYCBieXBhc3MgYXQgZWxlbWVudCBjcmVhdGlvbiBzaG91bGQgYmUgZG9uZSBvbmx5IHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuICBUcnkgdG8gdXNlIHRoZSBzdHlsZXNoZWV0IGluc3RlYWQuJyk7XG4gICAgdGhpcy5zdHlsZShieXBhc3MpO1xuICB9XG4gIGlmIChyZXN0b3JlID09PSB1bmRlZmluZWQgfHwgcmVzdG9yZSkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG59O1xuXG52YXIgZGVmaW5lU2VhcmNoID0gZnVuY3Rpb24gZGVmaW5lU2VhcmNoKHBhcmFtcykge1xuICBwYXJhbXMgPSB7XG4gICAgYmZzOiBwYXJhbXMuYmZzIHx8ICFwYXJhbXMuZGZzLFxuICAgIGRmczogcGFyYW1zLmRmcyB8fCAhcGFyYW1zLmJmc1xuICB9O1xuXG4gIC8vIGZyb20gcHNldWRvY29kZSBvbiB3aWtpcGVkaWFcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYXJjaEZuKHJvb3RzLCBmbiwgZGlyZWN0ZWQpIHtcbiAgICB2YXIgb3B0aW9ucztcbiAgICBpZiAocGxhaW5PYmplY3Qocm9vdHMpICYmICFlbGVtZW50T3JDb2xsZWN0aW9uKHJvb3RzKSkge1xuICAgICAgb3B0aW9ucyA9IHJvb3RzO1xuICAgICAgcm9vdHMgPSBvcHRpb25zLnJvb3RzIHx8IG9wdGlvbnMucm9vdDtcbiAgICAgIGZuID0gb3B0aW9ucy52aXNpdDtcbiAgICAgIGRpcmVjdGVkID0gb3B0aW9ucy5kaXJlY3RlZDtcbiAgICB9XG4gICAgZGlyZWN0ZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyICYmICFmbiQ2KGZuKSA/IGZuIDogZGlyZWN0ZWQ7XG4gICAgZm4gPSBmbiQ2KGZuKSA/IGZuIDogZnVuY3Rpb24gKCkge307XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgdiA9IHJvb3RzID0gc3RyaW5nKHJvb3RzKSA/IHRoaXMuZmlsdGVyKHJvb3RzKSA6IHJvb3RzO1xuICAgIHZhciBRID0gW107XG4gICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gW107XG4gICAgdmFyIGNvbm5lY3RlZEJ5ID0ge307XG4gICAgdmFyIGlkMmRlcHRoID0ge307XG4gICAgdmFyIFYgPSB7fTtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGZvdW5kO1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG5cbiAgICAvLyBlbnF1ZXVlIHZcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2aSA9IHZbaV07XG4gICAgICB2YXIgdmlJZCA9IHZpLmlkKCk7XG4gICAgICBpZiAodmkuaXNOb2RlKCkpIHtcbiAgICAgICAgUS51bnNoaWZ0KHZpKTtcbiAgICAgICAgaWYgKHBhcmFtcy5iZnMpIHtcbiAgICAgICAgICBWW3ZpSWRdID0gdHJ1ZTtcbiAgICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHZpKTtcbiAgICAgICAgfVxuICAgICAgICBpZDJkZXB0aFt2aUlkXSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIHYgPSBwYXJhbXMuYmZzID8gUS5zaGlmdCgpIDogUS5wb3AoKTtcbiAgICAgIHZhciB2SWQgPSB2LmlkKCk7XG4gICAgICBpZiAocGFyYW1zLmRmcykge1xuICAgICAgICBpZiAoVlt2SWRdKSB7XG4gICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgfVxuICAgICAgICBWW3ZJZF0gPSB0cnVlO1xuICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHYpO1xuICAgICAgfVxuICAgICAgdmFyIGRlcHRoID0gaWQyZGVwdGhbdklkXTtcbiAgICAgIHZhciBwcmV2RWRnZSA9IGNvbm5lY3RlZEJ5W3ZJZF07XG4gICAgICB2YXIgc3JjID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnNvdXJjZSgpIDogbnVsbDtcbiAgICAgIHZhciB0Z3QgPSBwcmV2RWRnZSAhPSBudWxsID8gcHJldkVkZ2UudGFyZ2V0KCkgOiBudWxsO1xuICAgICAgdmFyIHByZXZOb2RlID0gcHJldkVkZ2UgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHYuc2FtZShzcmMpID8gdGd0WzBdIDogc3JjWzBdO1xuICAgICAgdmFyIHJldCA9IHZvaWQgMDtcbiAgICAgIHJldCA9IGZuKHYsIHByZXZFZGdlLCBwcmV2Tm9kZSwgaisrLCBkZXB0aCk7XG4gICAgICBpZiAocmV0ID09PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kID0gdjtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgICB2YXIgdndFZGdlcyA9IHYuY29ubmVjdGVkRWRnZXMoKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuICghZGlyZWN0ZWQgfHwgZS5zb3VyY2UoKS5zYW1lKHYpKSAmJiBlZGdlcy5oYXMoZSk7XG4gICAgICB9KTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHZ3RWRnZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgZSA9IHZ3RWRnZXNbX2kyXTtcbiAgICAgICAgdmFyIHcgPSBlLmNvbm5lY3RlZE5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgcmV0dXJuICFuLnNhbWUodikgJiYgbm9kZXMuaGFzKG4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdJZCA9IHcuaWQoKTtcbiAgICAgICAgaWYgKHcubGVuZ3RoICE9PSAwICYmICFWW3dJZF0pIHtcbiAgICAgICAgICB3ID0gd1swXTtcbiAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgaWYgKHBhcmFtcy5iZnMpIHtcbiAgICAgICAgICAgIFZbd0lkXSA9IHRydWU7XG4gICAgICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25uZWN0ZWRCeVt3SWRdID0gZTtcbiAgICAgICAgICBpZDJkZXB0aFt3SWRdID0gaWQyZGVwdGhbdklkXSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChRLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcCgpO1xuICAgICAgaWYgKF9yZXQgPT09IFwiY29udGludWVcIikgY29udGludWU7XG4gICAgICBpZiAoX3JldCA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9XG4gICAgdmFyIGNvbm5lY3RlZEVsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5vZGUgPSBjb25uZWN0ZWROb2Rlc1tfaV07XG4gICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEJ5W25vZGUuaWQoKV07XG4gICAgICBpZiAoZWRnZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbm5lY3RlZEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICAgIGNvbm5lY3RlZEVsZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGN5LmNvbGxlY3Rpb24oY29ubmVjdGVkRWxlcyksXG4gICAgICBmb3VuZDogY3kuY29sbGVjdGlvbihmb3VuZClcbiAgICB9O1xuICB9O1xufTtcblxuLy8gc2VhcmNoLCBzcGFubmluZyB0cmVlcywgZXRjXG52YXIgZWxlc2ZuJHYgPSB7XG4gIGJyZWFkdGhGaXJzdFNlYXJjaDogZGVmaW5lU2VhcmNoKHtcbiAgICBiZnM6IHRydWVcbiAgfSksXG4gIGRlcHRoRmlyc3RTZWFyY2g6IGRlZmluZVNlYXJjaCh7XG4gICAgZGZzOiB0cnVlXG4gIH0pXG59O1xuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiR2LmJmcyA9IGVsZXNmbiR2LmJyZWFkdGhGaXJzdFNlYXJjaDtcbmVsZXNmbiR2LmRmcyA9IGVsZXNmbiR2LmRlcHRoRmlyc3RTZWFyY2g7XG5cbnZhciBoZWFwJDEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4vLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBIZWFwLCBkZWZhdWx0Q21wLCBmbG9vciwgaGVhcGlmeSwgaGVhcHBvcCwgaGVhcHB1c2gsIGhlYXBwdXNocG9wLCBoZWFwcmVwbGFjZSwgaW5zb3J0LCBtaW4sIG5sYXJnZXN0LCBuc21hbGxlc3QsIHVwZGF0ZUl0ZW0sIF9zaWZ0ZG93biwgX3NpZnR1cDtcblxuICBmbG9vciA9IE1hdGguZmxvb3IsIG1pbiA9IE1hdGgubWluO1xuXG5cbiAgLypcbiAgRGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIGJlIHVzZWRcbiAgICovXG5cbiAgZGVmYXVsdENtcCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICBpZiAoeCA8IHkpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKHggPiB5KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cblxuICAvKlxuICBJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxuICBcbiAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LlxuICBcbiAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgYS5sZW5ndGgpIGJvdW5kIHRoZSBzbGljZVxuICBvZiBhIHRvIGJlIHNlYXJjaGVkLlxuICAgKi9cblxuICBpbnNvcnQgPSBmdW5jdGlvbihhLCB4LCBsbywgaGksIGNtcCkge1xuICAgIHZhciBtaWQ7XG4gICAgaWYgKGxvID09IG51bGwpIHtcbiAgICAgIGxvID0gMDtcbiAgICB9XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAobG8gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgfVxuICAgIGlmIChoaSA9PSBudWxsKSB7XG4gICAgICBoaSA9IGEubGVuZ3RoO1xuICAgIH1cbiAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgbWlkID0gZmxvb3IoKGxvICsgaGkpIC8gMik7XG4gICAgICBpZiAoY21wKHgsIGFbbWlkXSkgPCAwKSB7XG4gICAgICAgIGhpID0gbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKFtdLnNwbGljZS5hcHBseShhLCBbbG8sIGxvIC0gbG9dLmNvbmNhdCh4KSksIHgpO1xuICB9O1xuXG5cbiAgLypcbiAgUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuICAgKi9cblxuICBoZWFwcHVzaCA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgMCwgYXJyYXkubGVuZ3RoIC0gMSwgY21wKTtcbiAgfTtcblxuXG4gIC8qXG4gIFBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cbiAgICovXG5cbiAgaGVhcHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcbiAgICB2YXIgbGFzdGVsdCwgcmV0dXJuaXRlbTtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGxhc3RlbHQgPSBhcnJheS5wb3AoKTtcbiAgICBpZiAoYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5pdGVtID0gYXJyYXlbMF07XG4gICAgICBhcnJheVswXSA9IGxhc3RlbHQ7XG4gICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5pdGVtID0gbGFzdGVsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJldHVybml0ZW07XG4gIH07XG5cblxuICAvKlxuICBQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG4gIFxuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcbiAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQgc2l6ZSBoZWFwLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2Ugb2ZcbiAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcbiAgICAgIGlmIGl0ZW0gPiBhcnJheVswXVxuICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoYXJyYXksIGl0ZW0pXG4gICAqL1xuXG4gIGhlYXByZXBsYWNlID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciByZXR1cm5pdGVtO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuICAgIGFycmF5WzBdID0gaXRlbTtcbiAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIHJldHVybiByZXR1cm5pdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxuICAgKi9cblxuICBoZWFwcHVzaHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgX3JlZjtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGlmIChhcnJheS5sZW5ndGggJiYgY21wKGFycmF5WzBdLCBpdGVtKSA8IDApIHtcbiAgICAgIF9yZWYgPSBbYXJyYXlbMF0sIGl0ZW1dLCBpdGVtID0gX3JlZlswXSwgYXJyYXlbMF0gPSBfcmVmWzFdO1xuICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cblxuICAvKlxuICBUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8oYXJyYXkubGVuZ3RoKSB0aW1lLlxuICAgKi9cblxuICBoZWFwaWZ5ID0gZnVuY3Rpb24oYXJyYXksIGNtcCkge1xuICAgIHZhciBpLCBfaSwgX2xlbiwgX3JlZjEsIF9yZXN1bHRzLCBfcmVzdWx0czE7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBfcmVmMSA9IChmdW5jdGlvbigpIHtcbiAgICAgIF9yZXN1bHRzMSA9IFtdO1xuICAgICAgZm9yICh2YXIgX2ogPSAwLCBfcmVmID0gZmxvb3IoYXJyYXkubGVuZ3RoIC8gMik7IDAgPD0gX3JlZiA/IF9qIDwgX3JlZiA6IF9qID4gX3JlZjsgMCA8PSBfcmVmID8gX2orKyA6IF9qLS0peyBfcmVzdWx0czEucHVzaChfaik7IH1cbiAgICAgIHJldHVybiBfcmVzdWx0czE7XG4gICAgfSkuYXBwbHkodGhpcykucmV2ZXJzZSgpO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgaSA9IF9yZWYxW19pXTtcbiAgICAgIF9yZXN1bHRzLnB1c2goX3NpZnR1cChhcnJheSwgaSwgY21wKSk7XG4gICAgfVxuICAgIHJldHVybiBfcmVzdWx0cztcbiAgfTtcblxuXG4gIC8qXG4gIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIGhlYXAuXG4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cblxuICB1cGRhdGVJdGVtID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciBwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBwb3MgPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIF9zaWZ0ZG93bihhcnJheSwgMCwgcG9zLCBjbXApO1xuICAgIHJldHVybiBfc2lmdHVwKGFycmF5LCBwb3MsIGNtcCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuICAgKi9cblxuICBubGFyZ2VzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgcmVzdWx0LCBfaSwgX2xlbiwgX3JlZjtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pO1xuICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaGVhcGlmeShyZXN1bHQsIGNtcCk7XG4gICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgZWxlbSA9IF9yZWZbX2ldO1xuICAgICAgaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtLCBjbXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoY21wKS5yZXZlcnNlKCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbnNtYWxsZXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGNtcCkge1xuICAgIHZhciBlbGVtLCBsb3MsIHJlc3VsdCwgX2ksIF9qLCBfbGVuLCBfcmVmLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAobiAqIDEwIDw9IGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjbXApO1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgICAgaWYgKGNtcChlbGVtLCBsb3MpIDwgMCkge1xuICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0sIDAsIG51bGwsIGNtcCk7XG4gICAgICAgICAgcmVzdWx0LnBvcCgpO1xuICAgICAgICAgIGxvcyA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkoYXJyYXksIGNtcCk7XG4gICAgX3Jlc3VsdHMgPSBbXTtcbiAgICBmb3IgKF9qID0gMCwgX3JlZjEgPSBtaW4obiwgYXJyYXkubGVuZ3RoKTsgMCA8PSBfcmVmMSA/IF9qIDwgX3JlZjEgOiBfaiA+IF9yZWYxOyAwIDw9IF9yZWYxID8gKytfaiA6IC0tX2opIHtcbiAgICAgIF9yZXN1bHRzLnB1c2goaGVhcHBvcChhcnJheSwgY21wKSk7XG4gICAgfVxuICAgIHJldHVybiBfcmVzdWx0cztcbiAgfTtcblxuICBfc2lmdGRvd24gPSBmdW5jdGlvbihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKSB7XG4gICAgdmFyIG5ld2l0ZW0sIHBhcmVudCwgcGFyZW50cG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgbmV3aXRlbSA9IGFycmF5W3Bvc107XG4gICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKSB7XG4gICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgIHBhcmVudCA9IGFycmF5W3BhcmVudHBvc107XG4gICAgICBpZiAoY21wKG5ld2l0ZW0sIHBhcmVudCkgPCAwKSB7XG4gICAgICAgIGFycmF5W3Bvc10gPSBwYXJlbnQ7XG4gICAgICAgIHBvcyA9IHBhcmVudHBvcztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuICB9O1xuXG4gIF9zaWZ0dXAgPSBmdW5jdGlvbihhcnJheSwgcG9zLCBjbXApIHtcbiAgICB2YXIgY2hpbGRwb3MsIGVuZHBvcywgbmV3aXRlbSwgcmlnaHRwb3MsIHN0YXJ0cG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgZW5kcG9zID0gYXJyYXkubGVuZ3RoO1xuICAgIHN0YXJ0cG9zID0gcG9zO1xuICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuICAgIGNoaWxkcG9zID0gMiAqIHBvcyArIDE7XG4gICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7XG4gICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTtcbiAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcyAmJiAhKGNtcChhcnJheVtjaGlsZHBvc10sIGFycmF5W3JpZ2h0cG9zXSkgPCAwKSkge1xuICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zO1xuICAgICAgfVxuICAgICAgYXJyYXlbcG9zXSA9IGFycmF5W2NoaWxkcG9zXTtcbiAgICAgIHBvcyA9IGNoaWxkcG9zO1xuICAgICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcbiAgICB9XG4gICAgYXJyYXlbcG9zXSA9IG5ld2l0ZW07XG4gICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKTtcbiAgfTtcblxuICBIZWFwID0gKGZ1bmN0aW9uKCkge1xuICAgIEhlYXAucHVzaCA9IGhlYXBwdXNoO1xuXG4gICAgSGVhcC5wb3AgPSBoZWFwcG9wO1xuXG4gICAgSGVhcC5yZXBsYWNlID0gaGVhcHJlcGxhY2U7XG5cbiAgICBIZWFwLnB1c2hwb3AgPSBoZWFwcHVzaHBvcDtcblxuICAgIEhlYXAuaGVhcGlmeSA9IGhlYXBpZnk7XG5cbiAgICBIZWFwLnVwZGF0ZUl0ZW0gPSB1cGRhdGVJdGVtO1xuXG4gICAgSGVhcC5ubGFyZ2VzdCA9IG5sYXJnZXN0O1xuXG4gICAgSGVhcC5uc21hbGxlc3QgPSBuc21hbGxlc3Q7XG5cbiAgICBmdW5jdGlvbiBIZWFwKGNtcCkge1xuICAgICAgdGhpcy5jbXAgPSBjbXAgIT0gbnVsbCA/IGNtcCA6IGRlZmF1bHRDbXA7XG4gICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgfVxuXG4gICAgSGVhcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcHVzaCh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhlYXBwb3AodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1swXTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5pbmRleE9mKHgpICE9PSAtMTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcmVwbGFjZSh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnB1c2hwb3AgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHB1c2hwb3AodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5oZWFwaWZ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaGVhcGlmeSh0aGlzLm5vZGVzLCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdXBkYXRlSXRlbSh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlcyA9IFtdO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoID09PSAwO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGVhcDtcbiAgICAgIGhlYXAgPSBuZXcgSGVhcCgpO1xuICAgICAgaGVhcC5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMCk7XG4gICAgICByZXR1cm4gaGVhcDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMuc2xpY2UoMCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmluc2VydCA9IEhlYXAucHJvdG90eXBlLnB1c2g7XG5cbiAgICBIZWFwLnByb3RvdHlwZS50b3AgPSBIZWFwLnByb3RvdHlwZS5wZWVrO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuZnJvbnQgPSBIZWFwLnByb3RvdHlwZS5wZWVrO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaGFzID0gSGVhcC5wcm90b3R5cGUuY29udGFpbnM7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jb3B5ID0gSGVhcC5wcm90b3R5cGUuY2xvbmU7XG5cbiAgICByZXR1cm4gSGVhcDtcblxuICB9KSgpO1xuXG4gIChmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gICAge1xuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH1cbiAgfSkodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEhlYXA7XG4gIH0pO1xuXG59KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgaGVhcCA9IGhlYXAkMTtcblxudmFyIGRpamtzdHJhRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiR1ID0ge1xuICBkaWprc3RyYTogZnVuY3Rpb24gZGlqa3N0cmEob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgd2VpZ2h0OiBhcmdzWzFdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1syXVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9kaWprc3RyYURlZmF1bHRzID0gZGlqa3N0cmFEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfZGlqa3N0cmFEZWZhdWx0cy5yb290LFxuICAgICAgd2VpZ2h0ID0gX2RpamtzdHJhRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGlqa3N0cmFEZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBzb3VyY2UgPSBzdHJpbmcocm9vdCkgPyB0aGlzLmZpbHRlcihyb290KVswXSA6IHJvb3RbMF07XG4gICAgdmFyIGRpc3QgPSB7fTtcbiAgICB2YXIgcHJldiA9IHt9O1xuICAgIHZhciBrbm93bkRpc3QgPSB7fTtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChub2RlKSB7XG4gICAgICByZXR1cm4gZGlzdFtub2RlLmlkKCldO1xuICAgIH07XG4gICAgdmFyIHNldERpc3QgPSBmdW5jdGlvbiBzZXREaXN0KG5vZGUsIGQpIHtcbiAgICAgIGRpc3Rbbm9kZS5pZCgpXSA9IGQ7XG4gICAgICBRLnVwZGF0ZUl0ZW0obm9kZSk7XG4gICAgfTtcbiAgICB2YXIgUSA9IG5ldyBoZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZ2V0RGlzdChhKSAtIGdldERpc3QoYik7XG4gICAgfSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGRpc3Rbbm9kZS5pZCgpXSA9IG5vZGUuc2FtZShzb3VyY2UpID8gMCA6IEluZmluaXR5O1xuICAgICAgUS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICB2YXIgZGlzdEJldHdlZW4gPSBmdW5jdGlvbiBkaXN0QmV0d2Vlbih1LCB2KSB7XG4gICAgICB2YXIgdXZzID0gKGRpcmVjdGVkID8gdS5lZGdlc1RvKHYpIDogdS5lZGdlc1dpdGgodikpLmludGVyc2VjdChlZGdlcyk7XG4gICAgICB2YXIgc21hbGxlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgdmFyIHNtYWxsZXN0RWRnZTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB1dnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gdXZzW19pXTtcbiAgICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICAgICAgaWYgKF93ZWlnaHQgPCBzbWFsbGVzdERpc3RhbmNlIHx8ICFzbWFsbGVzdEVkZ2UpIHtcbiAgICAgICAgICBzbWFsbGVzdERpc3RhbmNlID0gX3dlaWdodDtcbiAgICAgICAgICBzbWFsbGVzdEVkZ2UgPSBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlZGdlOiBzbWFsbGVzdEVkZ2UsXG4gICAgICAgIGRpc3Q6IHNtYWxsZXN0RGlzdGFuY2VcbiAgICAgIH07XG4gICAgfTtcbiAgICB3aGlsZSAoUS5zaXplKCkgPiAwKSB7XG4gICAgICB2YXIgdSA9IFEucG9wKCk7XG4gICAgICB2YXIgc21hbGxldHNEaXN0ID0gZ2V0RGlzdCh1KTtcbiAgICAgIHZhciB1aWQgPSB1LmlkKCk7XG4gICAgICBrbm93bkRpc3RbdWlkXSA9IHNtYWxsZXRzRGlzdDtcbiAgICAgIGlmIChzbWFsbGV0c0Rpc3QgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIG5laWdoYm9ycyA9IHUubmVpZ2hib3Job29kKCkuaW50ZXJzZWN0KG5vZGVzKTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5laWdoYm9ycy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciB2ID0gbmVpZ2hib3JzW19pMl07XG4gICAgICAgIHZhciB2aWQgPSB2LmlkKCk7XG4gICAgICAgIHZhciB2RGlzdCA9IGRpc3RCZXR3ZWVuKHUsIHYpO1xuICAgICAgICB2YXIgYWx0ID0gc21hbGxldHNEaXN0ICsgdkRpc3QuZGlzdDtcbiAgICAgICAgaWYgKGFsdCA8IGdldERpc3QodikpIHtcbiAgICAgICAgICBzZXREaXN0KHYsIGFsdCk7XG4gICAgICAgICAgcHJldlt2aWRdID0ge1xuICAgICAgICAgICAgbm9kZTogdSxcbiAgICAgICAgICAgIGVkZ2U6IHZEaXN0LmVkZ2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IC8vIGZvclxuICAgIH0gLy8gd2hpbGVcblxuICAgIHJldHVybiB7XG4gICAgICBkaXN0YW5jZVRvOiBmdW5jdGlvbiBkaXN0YW5jZVRvKG5vZGUpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHN0cmluZyhub2RlKSA/IG5vZGVzLmZpbHRlcihub2RlKVswXSA6IG5vZGVbMF07XG4gICAgICAgIHJldHVybiBrbm93bkRpc3RbdGFyZ2V0LmlkKCldO1xuICAgICAgfSxcbiAgICAgIHBhdGhUbzogZnVuY3Rpb24gcGF0aFRvKG5vZGUpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHN0cmluZyhub2RlKSA/IG5vZGVzLmZpbHRlcihub2RlKVswXSA6IG5vZGVbMF07XG4gICAgICAgIHZhciBTID0gW107XG4gICAgICAgIHZhciB1ID0gdGFyZ2V0O1xuICAgICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBTLnVuc2hpZnQodGFyZ2V0KTtcbiAgICAgICAgICB3aGlsZSAocHJldlt1aWRdKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHByZXZbdWlkXTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLmVkZ2UpO1xuICAgICAgICAgICAgUy51bnNoaWZ0KHAubm9kZSk7XG4gICAgICAgICAgICB1ID0gcC5ub2RlO1xuICAgICAgICAgICAgdWlkID0gdS5pZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlcy5zcGF3bihTKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG52YXIgZWxlc2ZuJHQgPSB7XG4gIC8vIGtydXNrYWwncyBhbGdvcml0aG0gKGZpbmRzIG1pbiBzcGFubmluZyB0cmVlLCBhc3N1bWluZyB1bmRpcmVjdGVkIGdyYXBoKVxuICAvLyBpbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAga3J1c2thbDogZnVuY3Rpb24ga3J1c2thbCh3ZWlnaHRGbikge1xuICAgIHdlaWdodEZuID0gd2VpZ2h0Rm4gfHwgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH07XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGZvcmVzdCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIEEgPSBub2RlczsgLy8gYXNzdW1lcyBieUdyb3VwKCkgY3JlYXRlcyBuZXcgY29sbGVjdGlvbnMgdGhhdCBjYW4gYmUgc2FmZWx5IG11dGF0ZWRcblxuICAgIHZhciBmaW5kU2V0SW5kZXggPSBmdW5jdGlvbiBmaW5kU2V0SW5kZXgoZWxlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlcyA9IGZvcmVzdFtpXTtcbiAgICAgICAgaWYgKGVsZXMuaGFzKGVsZSkpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBzdGFydCB3aXRoIG9uZSBmb3Jlc3QgcGVyIG5vZGVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIGZvcmVzdFtpXSA9IHRoaXMuc3Bhd24obm9kZXNbaV0pO1xuICAgIH1cbiAgICB2YXIgUyA9IGVkZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiB3ZWlnaHRGbihhKSAtIHdlaWdodEZuKGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBTLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBTW19pXTtcbiAgICAgIHZhciB1ID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB2ID0gZWRnZS50YXJnZXQoKVswXTtcbiAgICAgIHZhciBzZXRVSW5kZXggPSBmaW5kU2V0SW5kZXgodSk7XG4gICAgICB2YXIgc2V0VkluZGV4ID0gZmluZFNldEluZGV4KHYpO1xuICAgICAgdmFyIHNldFUgPSBmb3Jlc3Rbc2V0VUluZGV4XTtcbiAgICAgIHZhciBzZXRWID0gZm9yZXN0W3NldFZJbmRleF07XG4gICAgICBpZiAoc2V0VUluZGV4ICE9PSBzZXRWSW5kZXgpIHtcbiAgICAgICAgQS5tZXJnZShlZGdlKTtcblxuICAgICAgICAvLyBjb21iaW5lIGZvcmVzdHMgZm9yIHUgYW5kIHZcbiAgICAgICAgc2V0VS5tZXJnZShzZXRWKTtcbiAgICAgICAgZm9yZXN0LnNwbGljZShzZXRWSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQTtcbiAgfVxufTtcblxudmFyIGFTdGFyRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgcm9vdDogbnVsbCxcbiAgZ29hbDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBoZXVyaXN0aWM6IGZ1bmN0aW9uIGhldXJpc3RpYyhlZGdlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJHMgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBhU3RhcjogZnVuY3Rpb24gYVN0YXIob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgX2FTdGFyRGVmYXVsdHMgPSBhU3RhckRlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9hU3RhckRlZmF1bHRzLnJvb3QsXG4gICAgICBnb2FsID0gX2FTdGFyRGVmYXVsdHMuZ29hbCxcbiAgICAgIGhldXJpc3RpYyA9IF9hU3RhckRlZmF1bHRzLmhldXJpc3RpYyxcbiAgICAgIGRpcmVjdGVkID0gX2FTdGFyRGVmYXVsdHMuZGlyZWN0ZWQsXG4gICAgICB3ZWlnaHQgPSBfYVN0YXJEZWZhdWx0cy53ZWlnaHQ7XG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07XG4gICAgZ29hbCA9IGN5LmNvbGxlY3Rpb24oZ29hbClbMF07XG4gICAgdmFyIHNpZCA9IHJvb3QuaWQoKTtcbiAgICB2YXIgdGlkID0gZ29hbC5pZCgpO1xuICAgIHZhciBnU2NvcmUgPSB7fTtcbiAgICB2YXIgZlNjb3JlID0ge307XG4gICAgdmFyIGNsb3NlZFNldElkcyA9IHt9O1xuICAgIHZhciBvcGVuU2V0ID0gbmV3IGhlYXAoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmU2NvcmVbYS5pZCgpXSAtIGZTY29yZVtiLmlkKCldO1xuICAgIH0pO1xuICAgIHZhciBvcGVuU2V0SWRzID0gbmV3IFNldCQxKCk7XG4gICAgdmFyIGNhbWVGcm9tID0ge307XG4gICAgdmFyIGNhbWVGcm9tRWRnZSA9IHt9O1xuICAgIHZhciBhZGRUb09wZW5TZXQgPSBmdW5jdGlvbiBhZGRUb09wZW5TZXQoZWxlLCBpZCkge1xuICAgICAgb3BlblNldC5wdXNoKGVsZSk7XG4gICAgICBvcGVuU2V0SWRzLmFkZChpZCk7XG4gICAgfTtcbiAgICB2YXIgY01pbiwgY01pbklkO1xuICAgIHZhciBwb3BGcm9tT3BlblNldCA9IGZ1bmN0aW9uIHBvcEZyb21PcGVuU2V0KCkge1xuICAgICAgY01pbiA9IG9wZW5TZXQucG9wKCk7XG4gICAgICBjTWluSWQgPSBjTWluLmlkKCk7XG4gICAgICBvcGVuU2V0SWRzW1wiZGVsZXRlXCJdKGNNaW5JZCk7XG4gICAgfTtcbiAgICB2YXIgaXNJbk9wZW5TZXQgPSBmdW5jdGlvbiBpc0luT3BlblNldChpZCkge1xuICAgICAgcmV0dXJuIG9wZW5TZXRJZHMuaGFzKGlkKTtcbiAgICB9O1xuICAgIGFkZFRvT3BlblNldChyb290LCBzaWQpO1xuICAgIGdTY29yZVtzaWRdID0gMDtcbiAgICBmU2NvcmVbc2lkXSA9IGhldXJpc3RpYyhyb290KTtcblxuICAgIC8vIENvdW50ZXJcbiAgICB2YXIgc3RlcHMgPSAwO1xuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgd2hpbGUgKG9wZW5TZXQuc2l6ZSgpID4gMCkge1xuICAgICAgcG9wRnJvbU9wZW5TZXQoKTtcbiAgICAgIHN0ZXBzKys7XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGZvdW5kIG91ciBnb2FsLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICBpZiAoY01pbklkID09PSB0aWQpIHtcbiAgICAgICAgdmFyIHBhdGggPSBbXTtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gZ29hbDtcbiAgICAgICAgdmFyIHBhdGhOb2RlSWQgPSB0aWQ7XG4gICAgICAgIHZhciBwYXRoRWRnZSA9IGNhbWVGcm9tRWRnZVtwYXRoTm9kZUlkXTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIHBhdGgudW5zaGlmdChwYXRoTm9kZSk7XG4gICAgICAgICAgaWYgKHBhdGhFZGdlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhdGgudW5zaGlmdChwYXRoRWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGhOb2RlID0gY2FtZUZyb21bcGF0aE5vZGVJZF07XG4gICAgICAgICAgaWYgKHBhdGhOb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTm9kZUlkID0gcGF0aE5vZGUuaWQoKTtcbiAgICAgICAgICBwYXRoRWRnZSA9IGNhbWVGcm9tRWRnZVtwYXRoTm9kZUlkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgICAgIGRpc3RhbmNlOiBnU2NvcmVbY01pbklkXSxcbiAgICAgICAgICBwYXRoOiB0aGlzLnNwYXduKHBhdGgpLFxuICAgICAgICAgIHN0ZXBzOiBzdGVwc1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY01pbiB0byBwcm9jZXNzZWQgbm9kZXNcbiAgICAgIGNsb3NlZFNldElkc1tjTWluSWRdID0gdHJ1ZTtcblxuICAgICAgLy8gVXBkYXRlIHNjb3JlcyBmb3IgbmVpZ2hib3JzIG9mIGNNaW5cbiAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IGlmIGdyYXBoIGlzIGRpcmVjdGVkIG9yIG5vdFxuICAgICAgdmFyIHZ3RWRnZXMgPSBjTWluLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2d0VkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlID0gdndFZGdlc1tpXTtcblxuICAgICAgICAvLyBlZGdlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZChlLmlkKCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjTWluIG11c3QgYmUgdGhlIHNvdXJjZSBvZiBlZGdlIGlmIGRpcmVjdGVkXG4gICAgICAgIGlmIChkaXJlY3RlZCAmJiBlLmRhdGEoJ3NvdXJjZScpICE9PSBjTWluSWQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd1NyYyA9IGUuc291cmNlKCk7XG4gICAgICAgIHZhciB3VGd0ID0gZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIHcgPSB3U3JjLmlkKCkgIT09IGNNaW5JZCA/IHdTcmMgOiB3VGd0O1xuICAgICAgICB2YXIgd2lkID0gdy5pZCgpO1xuXG4gICAgICAgIC8vIG5vZGUgbXVzdCBiZSBpbiBzZXQgb2YgY2FsbGluZyBlbGVzXG4gICAgICAgIGlmICghdGhpcy5oYXNFbGVtZW50V2l0aElkKHdpZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vZGUgaXMgaW4gY2xvc2VkU2V0LCBpZ25vcmUgaXRcbiAgICAgICAgaWYgKGNsb3NlZFNldElkc1t3aWRdKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGVudGF0aXZlIHNjb3JlIGZvciBub2RlIHdcbiAgICAgICAgdmFyIHRlbXBTY29yZSA9IGdTY29yZVtjTWluSWRdICsgd2VpZ2h0KGUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnU2NvcmUgZm9yIG5vZGUgdyBpZjpcbiAgICAgICAgLy8gICB3IG5vdCBwcmVzZW50IGluIG9wZW5TZXRcbiAgICAgICAgLy8gT1JcbiAgICAgICAgLy8gICB0ZW50YXRpdmUgZ1Njb3JlIGlzIGxlc3MgdGhhbiBwcmV2aW91cyB2YWx1ZVxuXG4gICAgICAgIC8vIHcgbm90IGluIG9wZW5TZXRcbiAgICAgICAgaWYgKCFpc0luT3BlblNldCh3aWQpKSB7XG4gICAgICAgICAgZ1Njb3JlW3dpZF0gPSB0ZW1wU2NvcmU7XG4gICAgICAgICAgZlNjb3JlW3dpZF0gPSB0ZW1wU2NvcmUgKyBoZXVyaXN0aWModyk7XG4gICAgICAgICAgYWRkVG9PcGVuU2V0KHcsIHdpZCk7XG4gICAgICAgICAgY2FtZUZyb21bd2lkXSA9IGNNaW47XG4gICAgICAgICAgY2FtZUZyb21FZGdlW3dpZF0gPSBlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdyBhbHJlYWR5IGluIG9wZW5TZXQsIGJ1dCB3aXRoIGdyZWF0ZXIgZ1Njb3JlXG4gICAgICAgIGlmICh0ZW1wU2NvcmUgPCBnU2NvcmVbd2lkXSkge1xuICAgICAgICAgIGdTY29yZVt3aWRdID0gdGVtcFNjb3JlO1xuICAgICAgICAgIGZTY29yZVt3aWRdID0gdGVtcFNjb3JlICsgaGV1cmlzdGljKHcpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBFbmQgb2YgbmVpZ2hib3JzIHVwZGF0ZVxuICAgIH0gLy8gRW5kIG9mIG1haW4gbG9vcFxuXG4gICAgLy8gSWYgd2UndmUgcmVhY2hlZCBoZXJlLCB0aGVuIHdlJ3ZlIG5vdCByZWFjaGVkIG91ciBnb2FsXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRpc3RhbmNlOiB1bmRlZmluZWQsXG4gICAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgICBzdGVwczogc3RlcHNcbiAgICB9O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJHIgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBmbG95ZFdhcnNoYWxsOiBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9mbG95ZFdhcnNoYWxsRGVmYXVsdCA9IGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHdlaWdodCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC5kaXJlY3RlZDtcbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgTiA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgTnNxID0gTiAqIE47XG4gICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIGF0SW5kZXggPSBmdW5jdGlvbiBhdEluZGV4KGkpIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBkaXN0YW5jZSBtYXRyaXhcbiAgICB2YXIgZGlzdCA9IG5ldyBBcnJheShOc3EpO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgTnNxOyBuKyspIHtcbiAgICAgIHZhciBqID0gbiAlIE47XG4gICAgICB2YXIgaSA9IChuIC0gaikgLyBOO1xuICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgZGlzdFtuXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0W25dID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXRyaXggdXNlZCBmb3IgcGF0aCByZWNvbnN0cnVjdGlvblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG4gICAgdmFyIG5leHQgPSBuZXcgQXJyYXkoTnNxKTtcbiAgICB2YXIgZWRnZU5leHQgPSBuZXcgQXJyYXkoTnNxKTtcblxuICAgIC8vIFByb2Nlc3MgZWRnZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWRnZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGV4Y2x1ZGUgbG9vcHNcblxuICAgICAgdmFyIHMgPSBpbmRleE9mKHNyYyk7XG4gICAgICB2YXIgdCA9IGluZGV4T2YodGd0KTtcbiAgICAgIHZhciBzdCA9IHMgKiBOICsgdDsgLy8gc291cmNlIHRvIHRhcmdldCBpbmRleFxuICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzIGFub3RoZXIgZWRnZSBiZXR3ZWVuIHNhbWUgMiBub2Rlc1xuICAgICAgaWYgKGRpc3Rbc3RdID4gX3dlaWdodCkge1xuICAgICAgICBkaXN0W3N0XSA9IF93ZWlnaHQ7XG4gICAgICAgIG5leHRbc3RdID0gdDtcbiAgICAgICAgZWRnZU5leHRbc3RdID0gZWRnZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgcHJvY2VzcyAncmV2ZXJzZWQnIGVkZ2VcbiAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRzID0gdCAqIE4gKyBzOyAvLyB0YXJnZXQgdG8gc291cmNlIGluZGV4XG5cbiAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiBkaXN0W3RzXSA+IF93ZWlnaHQpIHtcbiAgICAgICAgICBkaXN0W3RzXSA9IF93ZWlnaHQ7XG4gICAgICAgICAgbmV4dFt0c10gPSBzO1xuICAgICAgICAgIGVkZ2VOZXh0W3RzXSA9IGVkZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYWluIGxvb3BcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IE47IGsrKykge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgX2kyKyspIHtcbiAgICAgICAgdmFyIGlrID0gX2kyICogTiArIGs7XG4gICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBOOyBfaisrKSB7XG4gICAgICAgICAgdmFyIGlqID0gX2kyICogTiArIF9qO1xuICAgICAgICAgIHZhciBraiA9IGsgKiBOICsgX2o7XG4gICAgICAgICAgaWYgKGRpc3RbaWtdICsgZGlzdFtral0gPCBkaXN0W2lqXSkge1xuICAgICAgICAgICAgZGlzdFtpal0gPSBkaXN0W2lrXSArIGRpc3Rba2pdO1xuICAgICAgICAgICAgbmV4dFtpal0gPSBuZXh0W2lrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldEFyZ0VsZSA9IGZ1bmN0aW9uIGdldEFyZ0VsZShlbGUpIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKGVsZSkgPyBjeS5maWx0ZXIoZWxlKSA6IGVsZSlbMF07XG4gICAgfTtcbiAgICB2YXIgaW5kZXhPZkFyZ0VsZSA9IGZ1bmN0aW9uIGluZGV4T2ZBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gaW5kZXhPZihnZXRBcmdFbGUoZWxlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgZGlzdGFuY2U6IGZ1bmN0aW9uIGRpc3RhbmNlKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgcmV0dXJuIGRpc3RbaSAqIE4gKyBqXTtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBmdW5jdGlvbiBwYXRoKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgdmFyIGZyb21Ob2RlID0gYXRJbmRleChpKTtcbiAgICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgICByZXR1cm4gZnJvbU5vZGUuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0W2kgKiBOICsgal0gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhdGggPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHZhciBwcmV2ID0gaTtcbiAgICAgICAgdmFyIGVkZ2U7XG4gICAgICAgIHBhdGgubWVyZ2UoZnJvbU5vZGUpO1xuICAgICAgICB3aGlsZSAoaSAhPT0gaikge1xuICAgICAgICAgIHByZXYgPSBpO1xuICAgICAgICAgIGkgPSBuZXh0W2kgKiBOICsgal07XG4gICAgICAgICAgZWRnZSA9IGVkZ2VOZXh0W3ByZXYgKiBOICsgaV07XG4gICAgICAgICAgcGF0aC5tZXJnZShlZGdlKTtcbiAgICAgICAgICBwYXRoLm1lcmdlKGF0SW5kZXgoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBmbG95ZFdhcnNoYWxsXG59OyAvLyBlbGVzZm5cblxudmFyIGJlbGxtYW5Gb3JkRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRxID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYmVsbG1hbkZvcmQ6IGZ1bmN0aW9uIGJlbGxtYW5Gb3JkKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYmVsbG1hbkZvcmREZWZhdWx0cyA9IGJlbGxtYW5Gb3JkRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICB3ZWlnaHQgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgcm9vdCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLnJvb3Q7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcyxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGluZm9NYXAgPSBuZXcgTWFwJDIoKTtcbiAgICB2YXIgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IGZhbHNlO1xuICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlcyA9IFtdO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdOyAvLyBpbiBjYXNlIHNlbGVjdG9yIHBhc3NlZFxuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKG5vZGUpIHtcbiAgICAgIHZhciBvYmogPSBpbmZvTWFwLmdldChub2RlLmlkKCkpO1xuICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIGluZm9NYXAuc2V0KG5vZGUuaWQoKSwgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB2YXIgZ2V0Tm9kZUZyb21UbyA9IGZ1bmN0aW9uIGdldE5vZGVGcm9tVG8odG8pIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKHRvKSA/IGN5LiQodG8pIDogdG8pWzBdO1xuICAgIH07XG4gICAgdmFyIGRpc3RhbmNlVG8gPSBmdW5jdGlvbiBkaXN0YW5jZVRvKHRvKSB7XG4gICAgICByZXR1cm4gZ2V0SW5mbyhnZXROb2RlRnJvbVRvKHRvKSkuZGlzdDtcbiAgICB9O1xuICAgIHZhciBwYXRoVG8gPSBmdW5jdGlvbiBwYXRoVG8odG8pIHtcbiAgICAgIHZhciB0aGlzU3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHJvb3Q7XG4gICAgICB2YXIgZW5kID0gZ2V0Tm9kZUZyb21Ubyh0byk7XG4gICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgdmFyIG5vZGUgPSBlbmQ7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3Bhd24oKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2dldEluZm8gPSBnZXRJbmZvKG5vZGUpLFxuICAgICAgICAgIGVkZ2UgPSBfZ2V0SW5mby5lZGdlLFxuICAgICAgICAgIHByZWQgPSBfZ2V0SW5mby5wcmVkO1xuICAgICAgICBwYXRoLnVuc2hpZnQobm9kZVswXSk7XG4gICAgICAgIGlmIChub2RlLnNhbWUodGhpc1N0YXJ0KSAmJiBwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KGVkZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBwcmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZXMuc3Bhd24ocGF0aCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemF0aW9ucyB7IGRpc3QsIHByZWQsIGVkZ2UgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBpbmZvID0gZ2V0SW5mbyhub2RlKTtcbiAgICAgIGlmIChub2RlLnNhbWUocm9vdCkpIHtcbiAgICAgICAgaW5mby5kaXN0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8uZGlzdCA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaW5mby5wcmVkID0gbnVsbDtcbiAgICAgIGluZm8uZWRnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRWRnZXMgcmVsYXhhdGlvblxuICAgIHZhciByZXBsYWNlZEVkZ2UgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChub2RlMSwgbm9kZTIsIGVkZ2UsIGluZm8xLCBpbmZvMiwgd2VpZ2h0KSB7XG4gICAgICB2YXIgZGlzdCA9IGluZm8xLmRpc3QgKyB3ZWlnaHQ7XG4gICAgICBpZiAoZGlzdCA8IGluZm8yLmRpc3QgJiYgIWVkZ2Uuc2FtZShpbmZvMS5lZGdlKSkge1xuICAgICAgICBpbmZvMi5kaXN0ID0gZGlzdDtcbiAgICAgICAgaW5mbzIucHJlZCA9IG5vZGUxO1xuICAgICAgICBpbmZvMi5lZGdlID0gZWRnZTtcbiAgICAgICAgcmVwbGFjZWRFZGdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBudW1Ob2RlczsgX2krKykge1xuICAgICAgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IG51bUVkZ2VzOyBlKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgICB2YXIgc3JjSW5mbyA9IGdldEluZm8oc3JjKTtcbiAgICAgICAgdmFyIHRndEluZm8gPSBnZXRJbmZvKHRndCk7XG4gICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHNyYywgdGd0LCBlZGdlLCBzcmNJbmZvLCB0Z3RJbmZvLCBfd2VpZ2h0KTtcblxuICAgICAgICAvLyBJZiB1bmRpcmVjdGVkIGdyYXBoLCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAncmV2ZXJzZScgZWRnZVxuICAgICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgICAgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQodGd0LCBzcmMsIGVkZ2UsIHRndEluZm8sIHNyY0luZm8sIF93ZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlcGxhY2VkRWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcGxhY2VkRWRnZSkge1xuICAgICAgLy8gQ2hlY2sgZm9yIG5lZ2F0aXZlIHdlaWdodCBjeWNsZXNcbiAgICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzID0gW107XG4gICAgICBmb3IgKHZhciBfZSA9IDA7IF9lIDwgbnVtRWRnZXM7IF9lKyspIHtcbiAgICAgICAgdmFyIF9lZGdlID0gZWRnZXNbX2VdO1xuICAgICAgICB2YXIgX3NyYyA9IF9lZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgX3RndCA9IF9lZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodDIgPSB3ZWlnaHRGbihfZWRnZSk7XG4gICAgICAgIHZhciBzcmNEaXN0ID0gZ2V0SW5mbyhfc3JjKS5kaXN0O1xuICAgICAgICB2YXIgdGd0RGlzdCA9IGdldEluZm8oX3RndCkuZGlzdDtcbiAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QgfHwgIWRpcmVjdGVkICYmIHRndERpc3QgKyBfd2VpZ2h0MiA8IHNyY0Rpc3QpIHtcbiAgICAgICAgICBpZiAoIWhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUpIHtcbiAgICAgICAgICAgIHdhcm4oJ0dyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlIGZvciBCZWxsbWFuLUZvcmQnKTtcbiAgICAgICAgICAgIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0aW9ucy5maW5kTmVnYXRpdmVXZWlnaHRDeWNsZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB2YXIgbmVnYXRpdmVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF9zcmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiB0Z3REaXN0ICsgX3dlaWdodDIgPCBzcmNEaXN0KSB7XG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZXMucHVzaChfdGd0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBudW1OZWdhdGl2ZU5vZGVzID0gbmVnYXRpdmVOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG51bU5lZ2F0aXZlTm9kZXM7IG4rKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZWdhdGl2ZU5vZGVzW25dO1xuICAgICAgICAgICAgICB2YXIgY3ljbGUgPSBbc3RhcnRdO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oc3RhcnQpLmVkZ2UpO1xuICAgICAgICAgICAgICB2YXIgX25vZGUgPSBnZXRJbmZvKHN0YXJ0KS5wcmVkO1xuICAgICAgICAgICAgICB3aGlsZSAoY3ljbGUuaW5kZXhPZihfbm9kZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChfbm9kZSk7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChnZXRJbmZvKF9ub2RlKS5lZGdlKTtcbiAgICAgICAgICAgICAgICBfbm9kZSA9IGdldEluZm8oX25vZGUpLnByZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3ljbGUgPSBjeWNsZS5zbGljZShjeWNsZS5pbmRleE9mKF9ub2RlKSk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdElkID0gY3ljbGVbMF0uaWQoKTtcbiAgICAgICAgICAgICAgdmFyIHNtYWxsZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMjsgYyA8IGN5Y2xlLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN5Y2xlW2NdLmlkKCkgPCBzbWFsbGVzdElkKSB7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdElkID0gY3ljbGVbY10uaWQoKTtcbiAgICAgICAgICAgICAgICAgIHNtYWxsZXN0SW5kZXggPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjeWNsZSA9IGN5Y2xlLnNsaWNlKHNtYWxsZXN0SW5kZXgpLmNvbmNhdChjeWNsZS5zbGljZSgwLCBzbWFsbGVzdEluZGV4KSk7XG4gICAgICAgICAgICAgIGN5Y2xlLnB1c2goY3ljbGVbMF0pO1xuICAgICAgICAgICAgICB2YXIgY3ljbGVJZCA9IGN5Y2xlLm1hcChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwuaWQoKTtcbiAgICAgICAgICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIGlmIChuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzLmluZGV4T2YoY3ljbGVJZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZXMucHVzaChlbGVzLnNwYXduKGN5Y2xlKSk7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5wdXNoKGN5Y2xlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZGlzdGFuY2VUbyxcbiAgICAgIHBhdGhUbzogcGF0aFRvLFxuICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZTogaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSxcbiAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzOiBuZWdhdGl2ZVdlaWdodEN5Y2xlc1xuICAgIH07XG4gIH0gLy8gYmVsbG1hbkZvcmRcbn07IC8vIGVsZXNmblxuXG52YXIgc3FydDIgPSBNYXRoLnNxcnQoMik7XG5cbi8vIEZ1bmN0aW9uIHdoaWNoIGNvbGFwc2VzIDIgKG1ldGEpIG5vZGVzIGludG8gb25lXG4vLyBVcGRhdGVzIHRoZSByZW1haW5pbmcgZWRnZSBsaXN0c1xuLy8gUmVjZWl2ZXMgYXMgYSBwYXJhbWF0ZXIgdGhlIGVkZ2Ugd2hpY2ggY2F1c2VzIHRoZSBjb2xsYXBzZVxudmFyIGNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoZWRnZUluZGV4LCBub2RlTWFwLCByZW1haW5pbmdFZGdlcykge1xuICBpZiAocmVtYWluaW5nRWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZXJyb3IoXCJLYXJnZXItU3RlaW4gbXVzdCBiZSBydW4gb24gYSBjb25uZWN0ZWQgKHN1YilncmFwaFwiKTtcbiAgfVxuICB2YXIgZWRnZUluZm8gPSByZW1haW5pbmdFZGdlc1tlZGdlSW5kZXhdO1xuICB2YXIgc291cmNlSW4gPSBlZGdlSW5mb1sxXTtcbiAgdmFyIHRhcmdldEluID0gZWRnZUluZm9bMl07XG4gIHZhciBwYXJ0aXRpb24xID0gbm9kZU1hcFtzb3VyY2VJbl07XG4gIHZhciBwYXJ0aXRpb24yID0gbm9kZU1hcFt0YXJnZXRJbl07XG4gIHZhciBuZXdFZGdlcyA9IHJlbWFpbmluZ0VkZ2VzOyAvLyByZS11c2UgYXJyYXlcblxuICAvLyBEZWxldGUgYWxsIGVkZ2VzIGJldHdlZW4gcGFydGl0aW9uMSBhbmQgcGFydGl0aW9uMlxuICBmb3IgKHZhciBpID0gbmV3RWRnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZWRnZSA9IG5ld0VkZ2VzW2ldO1xuICAgIHZhciBzcmMgPSBlZGdlWzFdO1xuICAgIHZhciB0Z3QgPSBlZGdlWzJdO1xuICAgIGlmIChub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjEgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24yIHx8IG5vZGVNYXBbc3JjXSA9PT0gcGFydGl0aW9uMiAmJiBub2RlTWFwW3RndF0gPT09IHBhcnRpdGlvbjEpIHtcbiAgICAgIG5ld0VkZ2VzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbGwgZWRnZXMgcG9pbnRpbmcgdG8gcGFydGl0aW9uMiBzaG91bGQgbm93IHBvaW50IHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5ld0VkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZWRnZSA9IG5ld0VkZ2VzW19pXTtcbiAgICBpZiAoX2VkZ2VbMV0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHNvdXJjZVxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuICAgICAgbmV3RWRnZXNbX2ldWzFdID0gcGFydGl0aW9uMTtcbiAgICB9IGVsc2UgaWYgKF9lZGdlWzJdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICAvLyBDaGVjayB0YXJnZXRcbiAgICAgIG5ld0VkZ2VzW19pXSA9IF9lZGdlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIG5ld0VkZ2VzW19pXVsyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9XG5cbiAgLy8gTW92ZSBhbGwgbm9kZXMgZnJvbSBwYXJ0aXRpb24yIHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZU1hcC5sZW5ndGg7IF9pMisrKSB7XG4gICAgaWYgKG5vZGVNYXBbX2kyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgbm9kZU1hcFtfaTJdID0gcGFydGl0aW9uMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0VkZ2VzO1xufTtcblxuLy8gQ29udHJhY3RzIGEgZ3JhcGggdW50aWwgd2UgcmVhY2ggYSBjZXJ0YWluIG51bWJlciBvZiBtZXRhIG5vZGVzXG52YXIgY29udHJhY3RVbnRpbCA9IGZ1bmN0aW9uIGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzLCBzaXplLCBzaXplTGltaXQpIHtcbiAgd2hpbGUgKHNpemUgPiBzaXplTGltaXQpIHtcbiAgICAvLyBDaG9vc2UgYW4gZWRnZSByYW5kb21seVxuICAgIHZhciBlZGdlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZW1haW5pbmdFZGdlcy5sZW5ndGgpO1xuXG4gICAgLy8gQ29sbGFwc2UgZ3JhcGggYmFzZWQgb24gZWRnZVxuICAgIHJlbWFpbmluZ0VkZ2VzID0gY29sbGFwc2UoZWRnZUluZGV4LCBtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpO1xuICAgIHNpemUtLTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nRWRnZXM7XG59O1xudmFyIGVsZXNmbiRwID0ge1xuICAvLyBDb21wdXRlcyB0aGUgbWluaW11bSBjdXQgb2YgYW4gdW5kaXJlY3RlZCBncmFwaFxuICAvLyBSZXR1cm5zIHRoZSBjb3JyZWN0IGFuc3dlciB3aXRoIGhpZ2ggcHJvYmFiaWxpdHlcbiAga2FyZ2VyU3RlaW46IGZ1bmN0aW9uIGthcmdlclN0ZWluKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIG51bUl0ZXIgPSBNYXRoLmNlaWwoTWF0aC5wb3coTWF0aC5sb2cobnVtTm9kZXMpIC8gTWF0aC5MTjIsIDIpKTtcbiAgICB2YXIgc3RvcFNpemUgPSBNYXRoLmZsb29yKG51bU5vZGVzIC8gc3FydDIpO1xuICAgIGlmIChudW1Ob2RlcyA8IDIpIHtcbiAgICAgIGVycm9yKCdBdCBsZWFzdCAyIG5vZGVzIGFyZSByZXF1aXJlZCBmb3IgS2FyZ2VyLVN0ZWluIGFsZ29yaXRobScpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb3cgc3RvcmUgZWRnZSBkZXN0aW5hdGlvbiBhcyBpbmRleGVzXG4gICAgLy8gRm9ybWF0IGZvciBlYWNoIGVkZ2UgKGVkZ2UgaW5kZXgsIHNvdXJjZSBub2RlIGluZGV4LCB0YXJnZXQgbm9kZSBpbmRleClcbiAgICB2YXIgZWRnZUluZGV4ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUVkZ2VzOyBpKyspIHtcbiAgICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgICBlZGdlSW5kZXhlcy5wdXNoKFtpLCBub2Rlcy5pbmRleE9mKGUuc291cmNlKCkpLCBub2Rlcy5pbmRleE9mKGUudGFyZ2V0KCkpXSk7XG4gICAgfVxuXG4gICAgLy8gV2Ugd2lsbCBzdG9yZSB0aGUgYmVzdCBjdXQgZm91bmQgaGVyZVxuICAgIHZhciBtaW5DdXRTaXplID0gSW5maW5pdHk7XG4gICAgdmFyIG1pbkN1dEVkZ2VJbmRleGVzID0gW107XG4gICAgdmFyIG1pbkN1dE5vZGVNYXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuXG4gICAgLy8gSW5pdGlhbCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgdmFyIG1ldGFOb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgbWV0YU5vZGVNYXAyID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgY29weU5vZGVzTWFwID0gZnVuY3Rpb24gY29weU5vZGVzTWFwKGZyb20sIHRvKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgdG9bX2kzXSA9IGZyb21bX2kzXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPD0gbnVtSXRlcjsgaXRlcisrKSB7XG4gICAgICAvLyBSZXNldCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBudW1Ob2RlczsgX2k0KyspIHtcbiAgICAgICAgbWV0YU5vZGVNYXBbX2k0XSA9IF9pNDtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udHJhY3QgdW50aWwgc3RvcCBwb2ludCAoc3RvcFNpemUgbm9kZXMpXG4gICAgICB2YXIgZWRnZXNTdGF0ZSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VJbmRleGVzLnNsaWNlKCksIG51bU5vZGVzLCBzdG9wU2l6ZSk7XG4gICAgICB2YXIgZWRnZXNTdGF0ZTIgPSBlZGdlc1N0YXRlLnNsaWNlKCk7IC8vIGNvcHlcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgY29sYXBzZWQgbm9kZXMgc3RhdGVcbiAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWV0YU5vZGVNYXAyKTtcblxuICAgICAgLy8gUnVuIDIgaXRlcmF0aW9ucyBzdGFydGluZyBpbiB0aGUgc3RvcCBzdGF0ZVxuICAgICAgdmFyIHJlczEgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCBlZGdlc1N0YXRlLCBzdG9wU2l6ZSwgMik7XG4gICAgICB2YXIgcmVzMiA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAyLCBlZGdlc1N0YXRlMiwgc3RvcFNpemUsIDIpO1xuXG4gICAgICAvLyBJcyBhbnkgb2YgdGhlIDIgcmVzdWx0cyB0aGUgYmVzdCBjdXQgc28gZmFyP1xuICAgICAgaWYgKHJlczEubGVuZ3RoIDw9IHJlczIubGVuZ3RoICYmIHJlczEubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMS5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMTtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzMi5sZW5ndGggPD0gcmVzMS5sZW5ndGggJiYgcmVzMi5sZW5ndGggPCBtaW5DdXRTaXplKSB7XG4gICAgICAgIG1pbkN1dFNpemUgPSByZXMyLmxlbmd0aDtcbiAgICAgICAgbWluQ3V0RWRnZUluZGV4ZXMgPSByZXMyO1xuICAgICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAyLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBtYWluIGxvb3BcblxuICAgIC8vIENvbnN0cnVjdCByZXN1bHRcbiAgICB2YXIgY3V0ID0gdGhpcy5zcGF3bihtaW5DdXRFZGdlSW5kZXhlcy5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlZGdlc1tlWzBdXTtcbiAgICB9KSk7XG4gICAgdmFyIHBhcnRpdGlvbjEgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHBhcnRpdGlvbjIgPSB0aGlzLnNwYXduKCk7XG5cbiAgICAvLyB0cmF2ZXJzZSBtZXRhTm9kZU1hcCBmb3IgYmVzdCBjdXRcbiAgICB2YXIgd2l0bmVzc05vZGVQYXJ0aXRpb24gPSBtaW5DdXROb2RlTWFwWzBdO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG1pbkN1dE5vZGVNYXAubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIHBhcnRpdGlvbklkID0gbWluQ3V0Tm9kZU1hcFtfaTVdO1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tfaTVdO1xuICAgICAgaWYgKHBhcnRpdGlvbklkID09PSB3aXRuZXNzTm9kZVBhcnRpdGlvbikge1xuICAgICAgICBwYXJ0aXRpb24xLm1lcmdlKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydGl0aW9uMi5tZXJnZShub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGlzam9pbnQgc3Vic2V0IG9mIG5vZGVzXG4gICAgdmFyIGNvbnN0cnVjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGNvbnN0cnVjdENvbXBvbmVudChzdWJzZXQpIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5zcGF3bigpO1xuICAgICAgc3Vic2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBlZGdlIGlzIHdpdGhpbiBjYWxsaW5nIGNvbGxlY3Rpb24gYW5kIGVkZ2UgaXMgbm90IGluIGN1dFxuICAgICAgICAgIGlmIChfdGhpcy5jb250YWlucyhlZGdlKSAmJiAhY3V0LmNvbnRhaW5zKGVkZ2UpKSB7XG4gICAgICAgICAgICBjb21wb25lbnQubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9O1xuICAgIHZhciBjb21wb25lbnRzID0gW2NvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24xKSwgY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjIpXTtcbiAgICB2YXIgcmV0ID0ge1xuICAgICAgY3V0OiBjdXQsXG4gICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzLFxuICAgICAgLy8gbi5iLiBwYXJ0aXRpb25zIGFyZSBpbmNsdWRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBhcGkgc3BlY1xuICAgICAgLy8gKGNvdWxkIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbilcbiAgICAgIHBhcnRpdGlvbjE6IHBhcnRpdGlvbjEsXG4gICAgICBwYXJ0aXRpb24yOiBwYXJ0aXRpb24yXG4gICAgfTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGNvcHlQb3NpdGlvbiA9IGZ1bmN0aW9uIGNvcHlQb3NpdGlvbihwKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54LFxuICAgIHk6IHAueVxuICB9O1xufTtcbnZhciBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiA9IGZ1bmN0aW9uIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IHAueCAqIHpvb20gKyBwYW4ueCxcbiAgICB5OiBwLnkgKiB6b29tICsgcGFuLnlcbiAgfTtcbn07XG52YXIgcmVuZGVyZWRUb01vZGVsUG9zaXRpb24gPSBmdW5jdGlvbiByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihwLCB6b29tLCBwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAocC54IC0gcGFuLngpIC8gem9vbSxcbiAgICB5OiAocC55IC0gcGFuLnkpIC8gem9vbVxuICB9O1xufTtcbnZhciBhcnJheTJwb2ludCA9IGZ1bmN0aW9uIGFycmF5MnBvaW50KGFycikge1xuICByZXR1cm4ge1xuICAgIHg6IGFyclswXSxcbiAgICB5OiBhcnJbMV1cbiAgfTtcbn07XG52YXIgbWluID0gZnVuY3Rpb24gbWluKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICBtaW4gPSBNYXRoLm1pbih2YWwsIG1pbik7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59O1xudmFyIG1heCA9IGZ1bmN0aW9uIG1heChhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KHZhbCwgbWF4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn07XG52YXIgbWVhbiA9IGZ1bmN0aW9uIG1lYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIG4gPSAwO1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIHRvdGFsICs9IHZhbDtcbiAgICAgIG4rKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsIC8gbjtcbn07XG52YXIgbWVkaWFuID0gZnVuY3Rpb24gbWVkaWFuKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBjb3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgc29ydCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIGluY2x1ZGVIb2xlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgaWYgKGNvcHkpIHtcbiAgICBhcnIgPSBhcnIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVuZCA8IGFyci5sZW5ndGgpIHtcbiAgICAgIGFyci5zcGxpY2UoZW5kLCBhcnIubGVuZ3RoIC0gZW5kKTtcbiAgICB9XG4gICAgaWYgKGJlZ2luID4gMCkge1xuICAgICAgYXJyLnNwbGljZSgwLCBiZWdpbik7XG4gICAgfVxuICB9XG5cbiAgLy8gYWxsIG5vbiBmaW5pdGUgKGUuZy4gSW5maW5pdHksIE5hTikgZWxlbWVudHMgbXVzdCBiZSAtSW5maW5pdHkgc28gdGhleSBnbyB0byB0aGUgc3RhcnRcbiAgdmFyIG9mZiA9IDA7IC8vIG9mZnNldCBmcm9tIG5vbi1maW5pdGUgdmFsdWVzXG4gIGZvciAodmFyIGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgdiA9IGFycltpXTtcbiAgICBpZiAoaW5jbHVkZUhvbGVzKSB7XG4gICAgICBpZiAoIWlzRmluaXRlKHYpKSB7XG4gICAgICAgIGFycltpXSA9IC1JbmZpbml0eTtcbiAgICAgICAgb2ZmKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3QgcmVtb3ZlIGl0IGlmIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgaG9sZXNcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG4gIGlmIChzb3J0KSB7XG4gICAgYXJyLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTsgLy8gcmVxdWlyZXMgY29weSA9IHRydWUgaWYgeW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmlnXG4gIH1cblxuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IobGVuIC8gMik7XG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgcmV0dXJuIGFyclttaWQgKyAxICsgb2ZmXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGFyclttaWQgLSAxICsgb2ZmXSArIGFyclttaWQgKyBvZmZdKSAvIDI7XG4gIH1cbn07XG52YXIgZGVnMnJhZCA9IGZ1bmN0aW9uIGRlZzJyYWQoZGVnKSB7XG4gIHJldHVybiBNYXRoLlBJICogZGVnIC8gMTgwO1xufTtcbnZhciBnZXRBbmdsZUZyb21EaXNwID0gZnVuY3Rpb24gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpIHtcbiAgcmV0dXJuIE1hdGguYXRhbjIoZGlzcFksIGRpc3BYKSAtIE1hdGguUEkgLyAyO1xufTtcbnZhciBsb2cyID0gTWF0aC5sb2cyIHx8IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xufTtcbnZhciBzaWdudW0gPSBmdW5jdGlvbiBzaWdudW0oeCkge1xuICBpZiAoeCA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBkaXN0ID0gZnVuY3Rpb24gZGlzdChwMSwgcDIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpc3QocDEsIHAyKSk7XG59O1xudmFyIHNxZGlzdCA9IGZ1bmN0aW9uIHNxZGlzdChwMSwgcDIpIHtcbiAgdmFyIGR4ID0gcDIueCAtIHAxLng7XG4gIHZhciBkeSA9IHAyLnkgLSBwMS55O1xuICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59O1xudmFyIGluUGxhY2VTdW1Ob3JtYWxpemUgPSBmdW5jdGlvbiBpblBsYWNlU3VtTm9ybWFsaXplKHYpIHtcbiAgdmFyIGxlbmd0aCA9IHYubGVuZ3RoO1xuXG4gIC8vIEZpcnN0LCBnZXQgc3VtIG9mIGFsbCBlbGVtZW50c1xuICB2YXIgdG90YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gdltpXTtcbiAgfVxuXG4gIC8vIE5vdywgZGl2aWRlIGVhY2ggYnkgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHNcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbmd0aDsgX2krKykge1xuICAgIHZbX2ldID0gdltfaV0gLyB0b3RhbDtcbiAgfVxuICByZXR1cm4gdjtcbn07XG5cbi8vIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Cw6l6aWVyX2N1cnZlI1F1YWRyYXRpY19jdXJ2ZXNcbnZhciBxYmV6aWVyQXQgPSBmdW5jdGlvbiBxYmV6aWVyQXQocDAsIHAxLCBwMiwgdCkge1xuICByZXR1cm4gKDEgLSB0KSAqICgxIC0gdCkgKiBwMCArIDIgKiAoMSAtIHQpICogdCAqIHAxICsgdCAqIHQgKiBwMjtcbn07XG52YXIgcWJlemllclB0QXQgPSBmdW5jdGlvbiBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiB7XG4gICAgeDogcWJlemllckF0KHAwLngsIHAxLngsIHAyLngsIHQpLFxuICAgIHk6IHFiZXppZXJBdChwMC55LCBwMS55LCBwMi55LCB0KVxuICB9O1xufTtcbnZhciBsaW5lQXQgPSBmdW5jdGlvbiBsaW5lQXQocDAsIHAxLCB0LCBkKSB7XG4gIHZhciB2ZWMgPSB7XG4gICAgeDogcDEueCAtIHAwLngsXG4gICAgeTogcDEueSAtIHAwLnlcbiAgfTtcbiAgdmFyIHZlY0Rpc3QgPSBkaXN0KHAwLCBwMSk7XG4gIHZhciBub3JtVmVjID0ge1xuICAgIHg6IHZlYy54IC8gdmVjRGlzdCxcbiAgICB5OiB2ZWMueSAvIHZlY0Rpc3RcbiAgfTtcbiAgdCA9IHQgPT0gbnVsbCA/IDAgOiB0O1xuICBkID0gZCAhPSBudWxsID8gZCA6IHQgKiB2ZWNEaXN0O1xuICByZXR1cm4ge1xuICAgIHg6IHAwLnggKyBub3JtVmVjLnggKiBkLFxuICAgIHk6IHAwLnkgKyBub3JtVmVjLnkgKiBkXG4gIH07XG59O1xudmFyIGJvdW5kID0gZnVuY3Rpb24gYm91bmQobWluLCB2YWwsIG1heCkge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbCkpO1xufTtcblxuLy8gbWFrZXMgYSBmdWxsIGJiICh4MSwgeTEsIHgyLCB5MiwgdywgaCkgZnJvbSBpbXBsaWNpdCBwYXJhbXNcbnZhciBtYWtlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBtYWtlQm91bmRpbmdCb3goYmIpIHtcbiAgaWYgKGJiID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IEluZmluaXR5LFxuICAgICAgeTE6IEluZmluaXR5LFxuICAgICAgeDI6IC1JbmZpbml0eSxcbiAgICAgIHkyOiAtSW5maW5pdHksXG4gICAgICB3OiAwLFxuICAgICAgaDogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAoYmIueDEgIT0gbnVsbCAmJiBiYi55MSAhPSBudWxsKSB7XG4gICAgaWYgKGJiLngyICE9IG51bGwgJiYgYmIueTIgIT0gbnVsbCAmJiBiYi54MiA+PSBiYi54MSAmJiBiYi55MiA+PSBiYi55MSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IGJiLngxLFxuICAgICAgICB5MTogYmIueTEsXG4gICAgICAgIHgyOiBiYi54MixcbiAgICAgICAgeTI6IGJiLnkyLFxuICAgICAgICB3OiBiYi54MiAtIGJiLngxLFxuICAgICAgICBoOiBiYi55MiAtIGJiLnkxXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoYmIudyAhPSBudWxsICYmIGJiLmggIT0gbnVsbCAmJiBiYi53ID49IDAgJiYgYmIuaCA+PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYmIueDEsXG4gICAgICAgIHkxOiBiYi55MSxcbiAgICAgICAgeDI6IGJiLngxICsgYmIudyxcbiAgICAgICAgeTI6IGJiLnkxICsgYmIuaCxcbiAgICAgICAgdzogYmIudyxcbiAgICAgICAgaDogYmIuaFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG52YXIgY29weUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gY29weUJvdW5kaW5nQm94KGJiKSB7XG4gIHJldHVybiB7XG4gICAgeDE6IGJiLngxLFxuICAgIHgyOiBiYi54MixcbiAgICB3OiBiYi53LFxuICAgIHkxOiBiYi55MSxcbiAgICB5MjogYmIueTIsXG4gICAgaDogYmIuaFxuICB9O1xufTtcbnZhciBjbGVhckJvdW5kaW5nQm94ID0gZnVuY3Rpb24gY2xlYXJCb3VuZGluZ0JveChiYikge1xuICBiYi54MSA9IEluZmluaXR5O1xuICBiYi55MSA9IEluZmluaXR5O1xuICBiYi54MiA9IC1JbmZpbml0eTtcbiAgYmIueTIgPSAtSW5maW5pdHk7XG4gIGJiLncgPSAwO1xuICBiYi5oID0gMDtcbn07XG52YXIgc2hpZnRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHNoaWZ0Qm91bmRpbmdCb3goYmIsIGR4LCBkeSkge1xuICByZXR1cm4ge1xuICAgIHgxOiBiYi54MSArIGR4LFxuICAgIHgyOiBiYi54MiArIGR4LFxuICAgIHkxOiBiYi55MSArIGR5LFxuICAgIHkyOiBiYi55MiArIGR5LFxuICAgIHc6IGJiLncsXG4gICAgaDogYmIuaFxuICB9O1xufTtcbnZhciB1cGRhdGVCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHVwZGF0ZUJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIC8vIHVwZGF0ZSBiYjEgd2l0aCBiYjIgYm91bmRzXG5cbiAgYmIxLngxID0gTWF0aC5taW4oYmIxLngxLCBiYjIueDEpO1xuICBiYjEueDIgPSBNYXRoLm1heChiYjEueDIsIGJiMi54Mik7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEueTEgPSBNYXRoLm1pbihiYjEueTEsIGJiMi55MSk7XG4gIGJiMS55MiA9IE1hdGgubWF4KGJiMS55MiwgYmIyLnkyKTtcbiAgYmIxLmggPSBiYjEueTIgLSBiYjEueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgeCwgeSkge1xuICBiYi54MSA9IE1hdGgubWluKGJiLngxLCB4KTtcbiAgYmIueDIgPSBNYXRoLm1heChiYi54MiwgeCk7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi55MSA9IE1hdGgubWluKGJiLnkxLCB5KTtcbiAgYmIueTIgPSBNYXRoLm1heChiYi55MiwgeSk7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94KGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICBiYi54MSAtPSBwYWRkaW5nO1xuICBiYi54MiArPSBwYWRkaW5nO1xuICBiYi55MSAtPSBwYWRkaW5nO1xuICBiYi55MiArPSBwYWRkaW5nO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswXTtcbiAgdmFyIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcbiAgaWYgKHBhZGRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgdG9wID0gcmlnaHQgPSBib3R0b20gPSBsZWZ0ID0gcGFkZGluZ1swXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMikge1xuICAgIHRvcCA9IGJvdHRvbSA9IHBhZGRpbmdbMF07XG4gICAgbGVmdCA9IHJpZ2h0ID0gcGFkZGluZ1sxXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gNCkge1xuICAgIHZhciBfcGFkZGluZyA9IF9zbGljZWRUb0FycmF5KHBhZGRpbmcsIDQpO1xuICAgIHRvcCA9IF9wYWRkaW5nWzBdO1xuICAgIHJpZ2h0ID0gX3BhZGRpbmdbMV07XG4gICAgYm90dG9tID0gX3BhZGRpbmdbMl07XG4gICAgbGVmdCA9IF9wYWRkaW5nWzNdO1xuICB9XG4gIGJiLngxIC09IGxlZnQ7XG4gIGJiLngyICs9IHJpZ2h0O1xuICBiYi55MSAtPSB0b3A7XG4gIGJiLnkyICs9IGJvdHRvbTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xuXG4vLyBhc3NpZ24gdGhlIHZhbHVlcyBvZiBiYjIgaW50byBiYjFcbnZhciBhc3NpZ25Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGFzc2lnbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIGJiMS54MSA9IGJiMi54MTtcbiAgYmIxLnkxID0gYmIyLnkxO1xuICBiYjEueDIgPSBiYjIueDI7XG4gIGJiMS55MiA9IGJiMi55MjtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBib3VuZGluZ0JveGVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYjEsIGJiMikge1xuICAvLyBjYXNlOiBvbmUgYmIgdG8gcmlnaHQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MSA+IGJiMi54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngxID4gYmIxLngyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIHRvIGxlZnQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MiA8IGJiMi54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngyIDwgYmIxLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIGFib3ZlIG90aGVyXG4gIGlmIChiYjEueTIgPCBiYjIueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi55MiA8IGJiMS55MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBiZWxvdyBvdGhlclxuICBpZiAoYmIxLnkxID4gYmIyLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTEgPiBiYjEueTIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBvdGhlcndpc2UsIG11c3QgaGF2ZSBzb21lIG92ZXJsYXBcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBpbkJvdW5kaW5nQm94KGJiLCB4LCB5KSB7XG4gIHJldHVybiBiYi54MSA8PSB4ICYmIHggPD0gYmIueDIgJiYgYmIueTEgPD0geSAmJiB5IDw9IGJiLnkyO1xufTtcbnZhciBwb2ludEluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBwb2ludEluQm91bmRpbmdCb3goYmIsIHB0KSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiLCBwdC54LCBwdC55KTtcbn07XG52YXIgYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngxLCBiYjIueTEpICYmIGluQm91bmRpbmdCb3goYmIxLCBiYjIueDIsIGJiMi55Mik7XG59O1xudmFyIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIHJhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA3ICYmIGFyZ3VtZW50c1s3XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzddIDogJ2F1dG8nO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IHJhZGl1cztcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihjb3JuZXJSYWRpdXMsIGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG4gIHZhciBkb1dpZHRoID0gY29ybmVyUmFkaXVzICE9PSBoYWxmV2lkdGgsXG4gICAgZG9IZWlnaHQgPSBjb3JuZXJSYWRpdXMgIT09IGhhbGZIZWlnaHQ7XG5cbiAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgaWYgKGRvV2lkdGgpIHtcbiAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIGlmIChkb1dpZHRoKSB7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgYm90dG9tU3RhcnRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0ICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWSA9IGJvdHRvbVN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBib3R0b21TdGFydFgsIGJvdHRvbVN0YXJ0WSwgYm90dG9tRW5kWCwgYm90dG9tRW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIExlZnRcbiAge1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gdG9wTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BMZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBUb3AgUmlnaHRcbiAge1xuICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgdG9wUmlnaHRDZW50ZXJYLCB0b3BSaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gUmlnaHRcbiAge1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gTGVmdFxuICB7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbn07XG5cbnZhciBpbkxpbmVWaWNpbml0eSA9IGZ1bmN0aW9uIGluTGluZVZpY2luaXR5KHgsIHksIGx4MSwgbHkxLCBseDIsIGx5MiwgdG9sZXJhbmNlKSB7XG4gIHZhciB0ID0gdG9sZXJhbmNlO1xuICB2YXIgeDEgPSBNYXRoLm1pbihseDEsIGx4Mik7XG4gIHZhciB4MiA9IE1hdGgubWF4KGx4MSwgbHgyKTtcbiAgdmFyIHkxID0gTWF0aC5taW4obHkxLCBseTIpO1xuICB2YXIgeTIgPSBNYXRoLm1heChseTEsIGx5Mik7XG4gIHJldHVybiB4MSAtIHQgPD0geCAmJiB4IDw9IHgyICsgdCAmJiB5MSAtIHQgPD0geSAmJiB5IDw9IHkyICsgdDtcbn07XG52YXIgaW5CZXppZXJWaWNpbml0eSA9IGZ1bmN0aW9uIGluQmV6aWVyVmljaW5pdHkoeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdG9sZXJhbmNlKSB7XG4gIHZhciBiYiA9IHtcbiAgICB4MTogTWF0aC5taW4oeDEsIHgzLCB4MikgLSB0b2xlcmFuY2UsXG4gICAgeDI6IE1hdGgubWF4KHgxLCB4MywgeDIpICsgdG9sZXJhbmNlLFxuICAgIHkxOiBNYXRoLm1pbih5MSwgeTMsIHkyKSAtIHRvbGVyYW5jZSxcbiAgICB5MjogTWF0aC5tYXgoeTEsIHkzLCB5MikgKyB0b2xlcmFuY2VcbiAgfTtcblxuICAvLyBpZiBvdXRzaWRlIHRoZSByb3VnaCBib3VuZGluZyBib3ggZm9yIHRoZSBiZXppZXIsIHRoZW4gaXQgY2FuJ3QgYmUgYSBoaXRcbiAgaWYgKHggPCBiYi54MSB8fCB4ID4gYmIueDIgfHwgeSA8IGJiLnkxIHx8IHkgPiBiYi55Mikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdiZXppZXIgb3V0IG9mIHJvdWdoIGJiJylcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2RvIG1vcmUgZXhwZW5zaXZlIGNoZWNrJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG52YXIgc29sdmVRdWFkcmF0aWMgPSBmdW5jdGlvbiBzb2x2ZVF1YWRyYXRpYyhhLCBiLCBjLCB2YWwpIHtcbiAgYyAtPSB2YWw7XG4gIHZhciByID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChyIDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3FydFIgPSBNYXRoLnNxcnQocik7XG4gIHZhciBkZW5vbSA9IDIgKiBhO1xuICB2YXIgcm9vdDEgPSAoLWIgKyBzcXJ0UikgLyBkZW5vbTtcbiAgdmFyIHJvb3QyID0gKC1iIC0gc3FydFIpIC8gZGVub207XG4gIHJldHVybiBbcm9vdDEsIHJvb3QyXTtcbn07XG52YXIgc29sdmVDdWJpYyA9IGZ1bmN0aW9uIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcmVzdWx0KSB7XG4gIC8vIFNvbHZlcyBhIGN1YmljIGZ1bmN0aW9uLCByZXR1cm5zIHJvb3QgaW4gZm9ybSBbcjEsIGkxLCByMiwgaTIsIHIzLCBpM10sIHdoZXJlXG4gIC8vIHIgaXMgdGhlIHJlYWwgY29tcG9uZW50LCBpIGlzIHRoZSBpbWFnaW5hcnkgY29tcG9uZW50XG5cbiAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENhcmRhbm8gbWV0aG9kIGZyb20gdGhlIHllYXIgMTU0NVxuICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX2Z1bmN0aW9uI1RoZV9uYXR1cmVfb2ZfdGhlX3Jvb3RzXG5cbiAgdmFyIGVwc2lsb24gPSAwLjAwMDAxO1xuXG4gIC8vIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gd2hpbGUga2VlcGluZyB0aGUgb3ZlcmFsbCBleHByZXNzaW9uIGNsb3NlIGluIHZhbHVlXG4gIGlmIChhID09PSAwKSB7XG4gICAgYSA9IGVwc2lsb247XG4gIH1cbiAgYiAvPSBhO1xuICBjIC89IGE7XG4gIGQgLz0gYTtcbiAgdmFyIGRpc2NyaW1pbmFudCwgcSwgciwgZHVtMSwgcywgdCwgdGVybTEsIHIxMztcbiAgcSA9ICgzLjAgKiBjIC0gYiAqIGIpIC8gOS4wO1xuICByID0gLSgyNy4wICogZCkgKyBiICogKDkuMCAqIGMgLSAyLjAgKiAoYiAqIGIpKTtcbiAgciAvPSA1NC4wO1xuICBkaXNjcmltaW5hbnQgPSBxICogcSAqIHEgKyByICogcjtcbiAgcmVzdWx0WzFdID0gMDtcbiAgdGVybTEgPSBiIC8gMy4wO1xuICBpZiAoZGlzY3JpbWluYW50ID4gMCkge1xuICAgIHMgPSByICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCk7XG4gICAgcyA9IHMgPCAwID8gLU1hdGgucG93KC1zLCAxLjAgLyAzLjApIDogTWF0aC5wb3cocywgMS4wIC8gMy4wKTtcbiAgICB0ID0gciAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHQgPSB0IDwgMCA/IC1NYXRoLnBvdygtdCwgMS4wIC8gMy4wKSA6IE1hdGgucG93KHQsIDEuMCAvIDMuMCk7XG4gICAgcmVzdWx0WzBdID0gLXRlcm0xICsgcyArIHQ7XG4gICAgdGVybTEgKz0gKHMgKyB0KSAvIDIuMDtcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtdGVybTE7XG4gICAgdGVybTEgPSBNYXRoLnNxcnQoMy4wKSAqICgtdCArIHMpIC8gMjtcbiAgICByZXN1bHRbM10gPSB0ZXJtMTtcbiAgICByZXN1bHRbNV0gPSAtdGVybTE7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc3VsdFs1XSA9IHJlc3VsdFszXSA9IDA7XG4gIGlmIChkaXNjcmltaW5hbnQgPT09IDApIHtcbiAgICByMTMgPSByIDwgMCA/IC1NYXRoLnBvdygtciwgMS4wIC8gMy4wKSA6IE1hdGgucG93KHIsIDEuMCAvIDMuMCk7XG4gICAgcmVzdWx0WzBdID0gLXRlcm0xICsgMi4wICogcjEzO1xuICAgIHJlc3VsdFs0XSA9IHJlc3VsdFsyXSA9IC0ocjEzICsgdGVybTEpO1xuICAgIHJldHVybjtcbiAgfVxuICBxID0gLXE7XG4gIGR1bTEgPSBxICogcSAqIHE7XG4gIGR1bTEgPSBNYXRoLmFjb3MociAvIE1hdGguc3FydChkdW0xKSk7XG4gIHIxMyA9IDIuMCAqIE1hdGguc3FydChxKTtcbiAgcmVzdWx0WzBdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoZHVtMSAvIDMuMCk7XG4gIHJlc3VsdFsyXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKChkdW0xICsgMi4wICogTWF0aC5QSSkgLyAzLjApO1xuICByZXN1bHRbNF0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDQuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmV0dXJuO1xufTtcbnZhciBzcWRpc3RUb1F1YWRyYXRpY0JlemllciA9IGZ1bmN0aW9uIHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgLy8gRmluZCBtaW5pbXVtIGRpc3RhbmNlIGJ5IHVzaW5nIHRoZSBtaW5pbXVtIG9mIHRoZSBkaXN0YW5jZVxuICAvLyBmdW5jdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludCBhbmQgdGhlIGN1cnZlXG5cbiAgLy8gVGhpcyBnaXZlcyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSByZXN1bHRpbmcgY3ViaWMgZXF1YXRpb25cbiAgLy8gd2hvc2Ugcm9vdHMgdGVsbCB1cyB3aGVyZSBhIHBvc3NpYmxlIG1pbmltdW0gaXNcbiAgLy8gKENvZWZmaWNpZW50cyBhcmUgZGl2aWRlZCBieSA0KVxuXG4gIHZhciBhID0gMS4wICogeDEgKiB4MSAtIDQgKiB4MSAqIHgyICsgMiAqIHgxICogeDMgKyA0ICogeDIgKiB4MiAtIDQgKiB4MiAqIHgzICsgeDMgKiB4MyArIHkxICogeTEgLSA0ICogeTEgKiB5MiArIDIgKiB5MSAqIHkzICsgNCAqIHkyICogeTIgLSA0ICogeTIgKiB5MyArIHkzICogeTM7XG4gIHZhciBiID0gMS4wICogOSAqIHgxICogeDIgLSAzICogeDEgKiB4MSAtIDMgKiB4MSAqIHgzIC0gNiAqIHgyICogeDIgKyAzICogeDIgKiB4MyArIDkgKiB5MSAqIHkyIC0gMyAqIHkxICogeTEgLSAzICogeTEgKiB5MyAtIDYgKiB5MiAqIHkyICsgMyAqIHkyICogeTM7XG4gIHZhciBjID0gMS4wICogMyAqIHgxICogeDEgLSA2ICogeDEgKiB4MiArIHgxICogeDMgLSB4MSAqIHggKyAyICogeDIgKiB4MiArIDIgKiB4MiAqIHggLSB4MyAqIHggKyAzICogeTEgKiB5MSAtIDYgKiB5MSAqIHkyICsgeTEgKiB5MyAtIHkxICogeSArIDIgKiB5MiAqIHkyICsgMiAqIHkyICogeSAtIHkzICogeTtcbiAgdmFyIGQgPSAxLjAgKiB4MSAqIHgyIC0geDEgKiB4MSArIHgxICogeCAtIHgyICogeCArIHkxICogeTIgLSB5MSAqIHkxICsgeTEgKiB5IC0geTIgKiB5O1xuXG4gIC8vIGRlYnVnKFwiY29lZmZpY2llbnRzOiBcIiArIGEgLyBhICsgXCIsIFwiICsgYiAvIGEgKyBcIiwgXCIgKyBjIC8gYSArIFwiLCBcIiArIGQgLyBhKTtcblxuICB2YXIgcm9vdHMgPSBbXTtcblxuICAvLyBVc2UgdGhlIGN1YmljIHNvbHZpbmcgYWxnb3JpdGhtXG4gIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcm9vdHMpO1xuICB2YXIgemVyb1RocmVzaG9sZCA9IDAuMDAwMDAwMTtcbiAgdmFyIHBhcmFtcyA9IFtdO1xuICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXggKz0gMikge1xuICAgIGlmIChNYXRoLmFicyhyb290c1tpbmRleCArIDFdKSA8IHplcm9UaHJlc2hvbGQgJiYgcm9vdHNbaW5kZXhdID49IDAgJiYgcm9vdHNbaW5kZXhdIDw9IDEuMCkge1xuICAgICAgcGFyYW1zLnB1c2gocm9vdHNbaW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgcGFyYW1zLnB1c2goMS4wKTtcbiAgcGFyYW1zLnB1c2goMC4wKTtcbiAgdmFyIG1pbkRpc3RhbmNlU3F1YXJlZCA9IC0xO1xuICB2YXIgY3VyWCwgY3VyWSwgZGlzdFNxdWFyZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VyWCA9IE1hdGgucG93KDEuMCAtIHBhcmFtc1tpXSwgMi4wKSAqIHgxICsgMi4wICogKDEgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeDIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB4MztcbiAgICBjdXJZID0gTWF0aC5wb3coMSAtIHBhcmFtc1tpXSwgMi4wKSAqIHkxICsgMiAqICgxLjAgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeTIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB5MztcbiAgICBkaXN0U3F1YXJlZCA9IE1hdGgucG93KGN1clggLSB4LCAyKSArIE1hdGgucG93KGN1clkgLSB5LCAyKTtcbiAgICAvLyBkZWJ1ZygnZGlzdGFuY2UgZm9yIHBhcmFtICcgKyBwYXJhbXNbaV0gKyBcIjogXCIgKyBNYXRoLnNxcnQoZGlzdFNxdWFyZWQpKTtcbiAgICBpZiAobWluRGlzdGFuY2VTcXVhcmVkID49IDApIHtcbiAgICAgIGlmIChkaXN0U3F1YXJlZCA8IG1pbkRpc3RhbmNlU3F1YXJlZCkge1xuICAgICAgICBtaW5EaXN0YW5jZVNxdWFyZWQgPSBkaXN0U3F1YXJlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5EaXN0YW5jZVNxdWFyZWQ7XG59O1xudmFyIHNxZGlzdFRvRmluaXRlTGluZSA9IGZ1bmN0aW9uIHNxZGlzdFRvRmluaXRlTGluZSh4LCB5LCB4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgb2Zmc2V0ID0gW3ggLSB4MSwgeSAtIHkxXTtcbiAgdmFyIGxpbmUgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG4gIHZhciBsaW5lU3EgPSBsaW5lWzBdICogbGluZVswXSArIGxpbmVbMV0gKiBsaW5lWzFdO1xuICB2YXIgaHlwU3EgPSBvZmZzZXRbMF0gKiBvZmZzZXRbMF0gKyBvZmZzZXRbMV0gKiBvZmZzZXRbMV07XG4gIHZhciBkb3RQcm9kdWN0ID0gb2Zmc2V0WzBdICogbGluZVswXSArIG9mZnNldFsxXSAqIGxpbmVbMV07XG4gIHZhciBhZGpTcSA9IGRvdFByb2R1Y3QgKiBkb3RQcm9kdWN0IC8gbGluZVNxO1xuICBpZiAoZG90UHJvZHVjdCA8IDApIHtcbiAgICByZXR1cm4gaHlwU3E7XG4gIH1cbiAgaWYgKGFkalNxID4gbGluZVNxKSB7XG4gICAgcmV0dXJuICh4IC0geDIpICogKHggLSB4MikgKyAoeSAtIHkyKSAqICh5IC0geTIpO1xuICB9XG4gIHJldHVybiBoeXBTcSAtIGFkalNxO1xufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMgPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSB7XG4gIHZhciB4MSwgeTEsIHgyLCB5MjtcbiAgdmFyIHkzO1xuXG4gIC8vIEludGVyc2VjdCB3aXRoIHZlcnRpY2FsIGxpbmUgdGhyb3VnaCAoeCwgeSlcbiAgdmFyIHVwID0gMDtcbiAgLy8gbGV0IGRvd24gPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB4MSA9IHBvaW50c1tpICogMl07XG4gICAgeTEgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSArIDEgPCBwb2ludHMubGVuZ3RoIC8gMikge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMl07XG4gICAgICB5MiA9IHBvaW50c1soaSArIDEgLSBwb2ludHMubGVuZ3RoIC8gMikgKiAyICsgMV07XG4gICAgfVxuICAgIGlmICh4MSA9PSB4ICYmIHgyID09IHgpIDsgZWxzZSBpZiAoeDEgPj0geCAmJiB4ID49IHgyIHx8IHgxIDw9IHggJiYgeCA8PSB4Mikge1xuICAgICAgeTMgPSAoeCAtIHgxKSAvICh4MiAtIHgxKSAqICh5MiAtIHkxKSArIHkxO1xuICAgICAgaWYgKHkzID4geSkge1xuICAgICAgICB1cCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiggeTMgPCB5ICl7XG4gICAgICAvLyBkb3duKys7XG4gICAgICAvLyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuICBpZiAodXAgJSAyID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHBvaW50SW5zaWRlUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBkaXJlY3Rpb24sIHBhZGRpbmcpIHtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcblxuICAvLyBHaXZlcyBuZWdhdGl2ZSBhbmdsZVxuICB2YXIgYW5nbGU7XG4gIGlmIChkaXJlY3Rpb25bMF0gIT0gbnVsbCkge1xuICAgIGFuZ2xlID0gTWF0aC5hdGFuKGRpcmVjdGlvblsxXSAvIGRpcmVjdGlvblswXSk7XG4gICAgaWYgKGRpcmVjdGlvblswXSA8IDApIHtcbiAgICAgIGFuZ2xlID0gYW5nbGUgKyBNYXRoLlBJIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5nbGUgPSAtYW5nbGUgLSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYW5nbGUgPSBkaXJlY3Rpb247XG4gIH1cbiAgdmFyIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XG4gIHZhciBzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuXG4gIC8vICAgIGNvbnNvbGUubG9nKFwiYmFzZTogXCIgKyBiYXNlUG9pbnRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lZFBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSB3aWR0aCAvIDIgKiAoYmFzZVBvaW50c1tpICogMl0gKiBjb3MgLSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBzaW4pO1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBoZWlnaHQgLyAyICogKGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIGNvcyArIGJhc2VQb2ludHNbaSAqIDJdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gKz0gY2VudGVyWDtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdICs9IGNlbnRlclk7XG4gIH1cbiAgdmFyIHBvaW50cztcbiAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgdmFyIGV4cGFuZGVkTGluZVNldCA9IGV4cGFuZFBvbHlnb24odHJhbnNmb3JtZWRQb2ludHMsIC1wYWRkaW5nKTtcbiAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSB0cmFuc2Zvcm1lZFBvaW50cztcbiAgfVxuICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG59O1xudmFyIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVSb3VuZFBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycykge1xuICB2YXIgY3V0UG9seWdvblBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCAqIDIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcm5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29ybmVyID0gY29ybmVyc1tpXTtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMF0gPSBjb3JuZXIuc3RhcnRYO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAxXSA9IGNvcm5lci5zdGFydFk7XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDJdID0gY29ybmVyLnN0b3BYO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAzXSA9IGNvcm5lci5zdG9wWTtcbiAgICB2YXIgc3F1YXJlZERpc3RhbmNlID0gTWF0aC5wb3coY29ybmVyLmN4IC0geCwgMikgKyBNYXRoLnBvdyhjb3JuZXIuY3kgLSB5LCAyKTtcbiAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IE1hdGgucG93KGNvcm5lci5yYWRpdXMsIDIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRQb2x5Z29uUG9pbnRzKTtcbn07XG52YXIgam9pbkxpbmVzID0gZnVuY3Rpb24gam9pbkxpbmVzKGxpbmVTZXQpIHtcbiAgdmFyIHZlcnRpY2VzID0gbmV3IEFycmF5KGxpbmVTZXQubGVuZ3RoIC8gMik7XG4gIHZhciBjdXJyZW50TGluZVN0YXJ0WCwgY3VycmVudExpbmVTdGFydFksIGN1cnJlbnRMaW5lRW5kWCwgY3VycmVudExpbmVFbmRZO1xuICB2YXIgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQ7IGkrKykge1xuICAgIGN1cnJlbnRMaW5lU3RhcnRYID0gbGluZVNldFtpICogNF07XG4gICAgY3VycmVudExpbmVTdGFydFkgPSBsaW5lU2V0W2kgKiA0ICsgMV07XG4gICAgY3VycmVudExpbmVFbmRYID0gbGluZVNldFtpICogNCArIDJdO1xuICAgIGN1cnJlbnRMaW5lRW5kWSA9IGxpbmVTZXRbaSAqIDQgKyAzXTtcbiAgICBpZiAoaSA8IGxpbmVTZXQubGVuZ3RoIC8gNCAtIDEpIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFsoaSArIDEpICogNF07XG4gICAgICBuZXh0TGluZVN0YXJ0WSA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAyXTtcbiAgICAgIG5leHRMaW5lRW5kWSA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dExpbmVTdGFydFggPSBsaW5lU2V0WzBdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WzFdO1xuICAgICAgbmV4dExpbmVFbmRYID0gbGluZVNldFsyXTtcbiAgICAgIG5leHRMaW5lRW5kWSA9IGxpbmVTZXRbM107XG4gICAgfVxuICAgIHZhciBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdChjdXJyZW50TGluZVN0YXJ0WCwgY3VycmVudExpbmVTdGFydFksIGN1cnJlbnRMaW5lRW5kWCwgY3VycmVudExpbmVFbmRZLCBuZXh0TGluZVN0YXJ0WCwgbmV4dExpbmVTdGFydFksIG5leHRMaW5lRW5kWCwgbmV4dExpbmVFbmRZLCB0cnVlKTtcbiAgICB2ZXJ0aWNlc1tpICogMl0gPSBpbnRlcnNlY3Rpb25bMF07XG4gICAgdmVydGljZXNbaSAqIDIgKyAxXSA9IGludGVyc2VjdGlvblsxXTtcbiAgfVxuICByZXR1cm4gdmVydGljZXM7XG59O1xudmFyIGV4cGFuZFBvbHlnb24gPSBmdW5jdGlvbiBleHBhbmRQb2x5Z29uKHBvaW50cywgcGFkKSB7XG4gIHZhciBleHBhbmRlZExpbmVTZXQgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAqIDIpO1xuICB2YXIgY3VycmVudFBvaW50WCwgY3VycmVudFBvaW50WSwgbmV4dFBvaW50WCwgbmV4dFBvaW50WTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgY3VycmVudFBvaW50WCA9IHBvaW50c1tpICogMl07XG4gICAgY3VycmVudFBvaW50WSA9IHBvaW50c1tpICogMiArIDFdO1xuICAgIGlmIChpIDwgcG9pbnRzLmxlbmd0aCAvIDIgLSAxKSB7XG4gICAgICBuZXh0UG9pbnRYID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIG5leHRQb2ludFkgPSBwb2ludHNbKGkgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1swXTtcbiAgICAgIG5leHRQb2ludFkgPSBwb2ludHNbMV07XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudCBsaW5lOiBbY3VycmVudFBvaW50WCwgY3VycmVudFBvaW50WV0gdG8gW25leHRQb2ludFgsIG5leHRQb2ludFldXG5cbiAgICAvLyBBc3N1bWUgQ0NXIHBvbHlnb24gd2luZGluZ1xuXG4gICAgdmFyIG9mZnNldFggPSBuZXh0UG9pbnRZIC0gY3VycmVudFBvaW50WTtcbiAgICB2YXIgb2Zmc2V0WSA9IC0obmV4dFBvaW50WCAtIGN1cnJlbnRQb2ludFgpO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIG9mZnNldExlbmd0aCA9IE1hdGguc3FydChvZmZzZXRYICogb2Zmc2V0WCArIG9mZnNldFkgKiBvZmZzZXRZKTtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFggPSBvZmZzZXRYIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIHZhciBub3JtYWxpemVkT2Zmc2V0WSA9IG9mZnNldFkgLyBvZmZzZXRMZW5ndGg7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0XSA9IGN1cnJlbnRQb2ludFggKyBub3JtYWxpemVkT2Zmc2V0WCAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAxXSA9IGN1cnJlbnRQb2ludFkgKyBub3JtYWxpemVkT2Zmc2V0WSAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAyXSA9IG5leHRQb2ludFggKyBub3JtYWxpemVkT2Zmc2V0WCAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAzXSA9IG5leHRQb2ludFkgKyBub3JtYWxpemVkT2Zmc2V0WSAqIHBhZDtcbiAgfVxuICByZXR1cm4gZXhwYW5kZWRMaW5lU2V0O1xufTtcbnZhciBpbnRlcnNlY3RMaW5lRWxsaXBzZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIGNlbnRlclgsIGNlbnRlclksIGVsbGlwc2VXcmFkaXVzLCBlbGxpcHNlSHJhZGl1cykge1xuICB2YXIgZGlzcFggPSBjZW50ZXJYIC0geDtcbiAgdmFyIGRpc3BZID0gY2VudGVyWSAtIHk7XG4gIGRpc3BYIC89IGVsbGlwc2VXcmFkaXVzO1xuICBkaXNwWSAvPSBlbGxpcHNlSHJhZGl1cztcbiAgdmFyIGxlbiA9IE1hdGguc3FydChkaXNwWCAqIGRpc3BYICsgZGlzcFkgKiBkaXNwWSk7XG4gIHZhciBuZXdMZW5ndGggPSBsZW4gLSAxO1xuICBpZiAobmV3TGVuZ3RoIDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuUHJvcG9ydGlvbiA9IG5ld0xlbmd0aCAvIGxlbjtcbiAgcmV0dXJuIFsoY2VudGVyWCAtIHgpICogbGVuUHJvcG9ydGlvbiArIHgsIChjZW50ZXJZIC0geSkgKiBsZW5Qcm9wb3J0aW9uICsgeV07XG59O1xudmFyIGNoZWNrSW5FbGxpcHNlID0gZnVuY3Rpb24gY2hlY2tJbkVsbGlwc2UoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgcGFkZGluZykge1xuICB4IC09IGNlbnRlclg7XG4gIHkgLT0gY2VudGVyWTtcbiAgeCAvPSB3aWR0aCAvIDIgKyBwYWRkaW5nO1xuICB5IC89IGhlaWdodCAvIDIgKyBwYWRkaW5nO1xuICByZXR1cm4geCAqIHggKyB5ICogeSA8PSAxO1xufTtcblxuLy8gUmV0dXJucyBpbnRlcnNlY3Rpb25zIG9mIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbSBsaW5lJ3Mgc3RhcnQgcG9pbnRcbnZhciBpbnRlcnNlY3RMaW5lQ2lyY2xlID0gZnVuY3Rpb24gaW50ZXJzZWN0TGluZUNpcmNsZSh4MSwgeTEsIHgyLCB5MiwgY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzKSB7XG4gIC8vIENhbGN1bGF0ZSBkLCBkaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcbiAgdmFyIGQgPSBbeDIgLSB4MSwgeTIgLSB5MV07IC8vIERpcmVjdGlvbiB2ZWN0b3Igb2YgbGluZVxuICB2YXIgZiA9IFt4MSAtIGNlbnRlclgsIHkxIC0gY2VudGVyWV07XG4gIHZhciBhID0gZFswXSAqIGRbMF0gKyBkWzFdICogZFsxXTtcbiAgdmFyIGIgPSAyICogKGZbMF0gKiBkWzBdICsgZlsxXSAqIGRbMV0pO1xuICB2YXIgYyA9IGZbMF0gKiBmWzBdICsgZlsxXSAqIGZbMV0gLSByYWRpdXMgKiByYWRpdXM7XG4gIHZhciBkaXNjcmltaW5hbnQgPSBiICogYiAtIDQgKiBhICogYztcbiAgaWYgKGRpc2NyaW1pbmFudCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHQxID0gKC1iICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCkpIC8gKDIgKiBhKTtcbiAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCkpIC8gKDIgKiBhKTtcbiAgdmFyIHRNaW4gPSBNYXRoLm1pbih0MSwgdDIpO1xuICB2YXIgdE1heCA9IE1hdGgubWF4KHQxLCB0Mik7XG4gIHZhciBpblJhbmdlUGFyYW1zID0gW107XG4gIGlmICh0TWluID49IDAgJiYgdE1pbiA8PSAxKSB7XG4gICAgaW5SYW5nZVBhcmFtcy5wdXNoKHRNaW4pO1xuICB9XG4gIGlmICh0TWF4ID49IDAgJiYgdE1heCA8PSAxKSB7XG4gICAgaW5SYW5nZVBhcmFtcy5wdXNoKHRNYXgpO1xuICB9XG4gIGlmIChpblJhbmdlUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbmVhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzBdICogZFswXSArIHgxO1xuICB2YXIgbmVhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzBdICogZFsxXSArIHkxO1xuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGluUmFuZ2VQYXJhbXNbMF0gPT0gaW5SYW5nZVBhcmFtc1sxXSkge1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblldO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmFySW50ZXJzZWN0aW9uWCA9IGluUmFuZ2VQYXJhbXNbMV0gKiBkWzBdICsgeDE7XG4gICAgICB2YXIgZmFySW50ZXJzZWN0aW9uWSA9IGluUmFuZ2VQYXJhbXNbMV0gKiBkWzFdICsgeTE7XG4gICAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWSwgZmFySW50ZXJzZWN0aW9uWCwgZmFySW50ZXJzZWN0aW9uWV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgfVxufTtcbnZhciBtaWRPZlRocmVlID0gZnVuY3Rpb24gbWlkT2ZUaHJlZShhLCBiLCBjKSB7XG4gIGlmIChiIDw9IGEgJiYgYSA8PSBjIHx8IGMgPD0gYSAmJiBhIDw9IGIpIHtcbiAgICByZXR1cm4gYTtcbiAgfSBlbHNlIGlmIChhIDw9IGIgJiYgYiA8PSBjIHx8IGMgPD0gYiAmJiBiIDw9IGEpIHtcbiAgICByZXR1cm4gYjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYztcbiAgfVxufTtcblxuLy8gKHgxLHkxKT0+KHgyLHkyKSBpbnRlcnNlY3Qgd2l0aCAoeDMseTMpPT4oeDQseTQpXG52YXIgZmluaXRlTGluZXNJbnRlcnNlY3QgPSBmdW5jdGlvbiBmaW5pdGVMaW5lc0ludGVyc2VjdCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIGluZmluaXRlTGluZXMpIHtcbiAgdmFyIGR4MTMgPSB4MSAtIHgzO1xuICB2YXIgZHgyMSA9IHgyIC0geDE7XG4gIHZhciBkeDQzID0geDQgLSB4MztcbiAgdmFyIGR5MTMgPSB5MSAtIHkzO1xuICB2YXIgZHkyMSA9IHkyIC0geTE7XG4gIHZhciBkeTQzID0geTQgLSB5MztcbiAgdmFyIHVhX3QgPSBkeDQzICogZHkxMyAtIGR5NDMgKiBkeDEzO1xuICB2YXIgdWJfdCA9IGR4MjEgKiBkeTEzIC0gZHkyMSAqIGR4MTM7XG4gIHZhciB1X2IgPSBkeTQzICogZHgyMSAtIGR4NDMgKiBkeTIxO1xuICBpZiAodV9iICE9PSAwKSB7XG4gICAgdmFyIHVhID0gdWFfdCAvIHVfYjtcbiAgICB2YXIgdWIgPSB1Yl90IC8gdV9iO1xuICAgIHZhciBmbHB0VGhyZXNob2xkID0gMC4wMDE7XG4gICAgdmFyIF9taW4gPSAwIC0gZmxwdFRocmVzaG9sZDtcbiAgICB2YXIgX21heCA9IDEgKyBmbHB0VGhyZXNob2xkO1xuICAgIGlmIChfbWluIDw9IHVhICYmIHVhIDw9IF9tYXggJiYgX21pbiA8PSB1YiAmJiB1YiA8PSBfbWF4KSB7XG4gICAgICByZXR1cm4gW3gxICsgdWEgKiBkeDIxLCB5MSArIHVhICogZHkyMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaW5maW5pdGVMaW5lcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3gxICsgdWEgKiBkeDIxLCB5MSArIHVhICogZHkyMV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1YV90ID09PSAwIHx8IHViX3QgPT09IDApIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBjb2luY2lkZW50IGxpbmVzLiBDaGVjayBpZiBvdmVybGFwXG5cbiAgICAgIC8vIENoZWNrIGVuZHBvaW50IG9mIHNlY29uZCBsaW5lXG4gICAgICBpZiAobWlkT2ZUaHJlZSh4MSwgeDIsIHg0KSA9PT0geDQpIHtcbiAgICAgICAgcmV0dXJuIFt4NCwgeTRdO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBzdGFydCBwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4MykgPT09IHgzKSB7XG4gICAgICAgIHJldHVybiBbeDMsIHkzXTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5kcG9pbnQgb2YgZmlyc3QgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDMsIHg0LCB4MikgPT09IHgyKSB7XG4gICAgICAgIHJldHVybiBbeDIsIHkyXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFyYWxsZWwsIG5vbi1jb2luY2lkZW50XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59O1xuXG4vLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nIClcbi8vIGludGVyc2VjdCBhIG5vZGUgcG9seWdvbiAocHRzIHRyYW5zZm9ybWVkKVxuLy9cbi8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclkgKVxuLy8gaW50ZXJzZWN0IHRoZSBwb2ludHMgKG5vIHRyYW5zZm9ybSlcbnZhciBwb2x5Z29uSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcbiAgdmFyIGRvVHJhbnNmb3JtID0gdHJ1ZTtcbiAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICBkb1RyYW5zZm9ybSA9IGZhbHNlO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChkb1RyYW5zZm9ybSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSBiYXNlUG9pbnRzW2kgKiAyXSAqIHdpZHRoICsgY2VudGVyWDtcbiAgICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBoZWlnaHQgKyBjZW50ZXJZO1xuICAgIH1cbiAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IGJhc2VQb2ludHM7XG4gIH1cbiAgdmFyIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwb2ludHMubGVuZ3RoIC8gMjsgX2kyKyspIHtcbiAgICBjdXJyZW50WCA9IHBvaW50c1tfaTIgKiAyXTtcbiAgICBjdXJyZW50WSA9IHBvaW50c1tfaTIgKiAyICsgMV07XG4gICAgaWYgKF9pMiA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFggPSBwb2ludHNbKF9pMiArIDEpICogMl07XG4gICAgICBuZXh0WSA9IHBvaW50c1soX2kyICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbMV07XG4gICAgfVxuICAgIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG59O1xudmFyIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lcnMpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIGxpbmVzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoICogMik7XG4gIGNvcm5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29ybmVyLCBpKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDJdID0gY29ybmVyLnN0YXJ0WDtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXNbaSAqIDQgLSAyXSA9IGNvcm5lci5zdGFydFg7XG4gICAgICBsaW5lc1tpICogNCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9XG4gICAgbGluZXNbaSAqIDRdID0gY29ybmVyLnN0b3BYO1xuICAgIGxpbmVzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RvcFk7XG4gICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXIuY3gsIGNvcm5lci5jeSwgY29ybmVyLnJhZGl1cyk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBsaW5lc1tpICogNF0sIGxpbmVzW2kgKiA0ICsgMV0sIGxpbmVzW2kgKiA0ICsgMl0sIGxpbmVzW2kgKiA0ICsgM10sIGZhbHNlKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMikge1xuICAgIHZhciBsb3dlc3RJbnRlcnNlY3Rpb24gPSBbaW50ZXJzZWN0aW9uc1swXSwgaW50ZXJzZWN0aW9uc1sxXV07XG4gICAgdmFyIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblswXSAtIHgsIDIpICsgTWF0aC5wb3cobG93ZXN0SW50ZXJzZWN0aW9uWzFdIC0geSwgMik7XG4gICAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDwgaW50ZXJzZWN0aW9ucy5sZW5ndGggLyAyOyBfaTMrKykge1xuICAgICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGludGVyc2VjdGlvbnNbX2kzICogMl0gLSB4LCAyKSArIE1hdGgucG93KGludGVyc2VjdGlvbnNbX2kzICogMiArIDFdIC0geSwgMik7XG4gICAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IGxvd2VzdFNxdWFyZWREaXN0YW5jZSkge1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMF0gPSBpbnRlcnNlY3Rpb25zW19pMyAqIDJdO1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMV0gPSBpbnRlcnNlY3Rpb25zW19pMyAqIDIgKyAxXTtcbiAgICAgICAgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gc3F1YXJlZERpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0SW50ZXJzZWN0aW9uO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciBzaG9ydGVuSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3Rpb24sIG9mZnNldCwgYW1vdW50KSB7XG4gIHZhciBkaXNwID0gW2ludGVyc2VjdGlvblswXSAtIG9mZnNldFswXSwgaW50ZXJzZWN0aW9uWzFdIC0gb2Zmc2V0WzFdXTtcbiAgdmFyIGxlbmd0aCA9IE1hdGguc3FydChkaXNwWzBdICogZGlzcFswXSArIGRpc3BbMV0gKiBkaXNwWzFdKTtcbiAgdmFyIGxlblJhdGlvID0gKGxlbmd0aCAtIGFtb3VudCkgLyBsZW5ndGg7XG4gIGlmIChsZW5SYXRpbyA8IDApIHtcbiAgICBsZW5SYXRpbyA9IDAuMDAwMDE7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRbMF0gKyBsZW5SYXRpbyAqIGRpc3BbMF0sIG9mZnNldFsxXSArIGxlblJhdGlvICogZGlzcFsxXV07XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSA9IGZ1bmN0aW9uIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZShzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBwb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpO1xuICBwb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUocG9pbnRzKTtcbiAgcmV0dXJuIHBvaW50cztcbn07XG52YXIgZml0UG9seWdvblRvU3F1YXJlID0gZnVuY3Rpb24gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cykge1xuICB2YXIgeCwgeTtcbiAgdmFyIHNpZGVzID0gcG9pbnRzLmxlbmd0aCAvIDI7XG4gIHZhciBtaW5YID0gSW5maW5pdHksXG4gICAgbWluWSA9IEluZmluaXR5LFxuICAgIG1heFggPSAtSW5maW5pdHksXG4gICAgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogaV07XG4gICAgeSA9IHBvaW50c1syICogaSArIDFdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIC8vIHN0cmV0Y2ggZmFjdG9yc1xuICB2YXIgc3ggPSAyIC8gKG1heFggLSBtaW5YKTtcbiAgdmFyIHN5ID0gMiAvIChtYXhZIC0gbWluWSk7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IHNpZGVzOyBfaTQrKykge1xuICAgIHggPSBwb2ludHNbMiAqIF9pNF0gPSBwb2ludHNbMiAqIF9pNF0gKiBzeDtcbiAgICB5ID0gcG9pbnRzWzIgKiBfaTQgKyAxXSA9IHBvaW50c1syICogX2k0ICsgMV0gKiBzeTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cbiAgaWYgKG1pblkgPCAtMSkge1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNpZGVzOyBfaTUrKykge1xuICAgICAgeSA9IHBvaW50c1syICogX2k1ICsgMV0gPSBwb2ludHNbMiAqIF9pNSArIDFdICsgKC0xIC0gbWluWSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIGluY3JlbWVudCA9IDEuMCAvIHNpZGVzICogMiAqIE1hdGguUEk7XG4gIHZhciBzdGFydEFuZ2xlID0gc2lkZXMgJSAyID09PSAwID8gTWF0aC5QSSAvIDIuMCArIGluY3JlbWVudCAvIDIuMCA6IE1hdGguUEkgLyAyLjA7XG4gIHN0YXJ0QW5nbGUgKz0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgcG9pbnRzID0gbmV3IEFycmF5KHNpZGVzICogMik7XG4gIHZhciBjdXJyZW50QW5nbGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIGN1cnJlbnRBbmdsZSA9IGkgKiBpbmNyZW1lbnQgKyBzdGFydEFuZ2xlO1xuICAgIHBvaW50c1syICogaV0gPSBNYXRoLmNvcyhjdXJyZW50QW5nbGUpOyAvLyB4XG4gICAgcG9pbnRzWzIgKiBpICsgMV0gPSBNYXRoLnNpbigtY3VycmVudEFuZ2xlKTsgLy8geVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cztcbn07XG5cbi8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXMsIHVubGVzcyBoYWxmIG9mIHdpZHRoIG9yIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gZGVmYXVsdFxudmFyIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLyA0LCBoZWlnaHQgLyA0LCA4KTtcbn07XG5cbi8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXNcbnZhciBnZXRSb3VuZFBvbHlnb25SYWRpdXMgPSBmdW5jdGlvbiBnZXRSb3VuZFBvbHlnb25SYWRpdXMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLyAxMCwgaGVpZ2h0IC8gMTAsIDgpO1xufTtcbnZhciBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGggPSBmdW5jdGlvbiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSB7XG4gIHJldHVybiA4O1xufTtcbnZhciBiZXppZXJQdHNUb1F1YWRDb2VmZiA9IGZ1bmN0aW9uIGJlemllclB0c1RvUXVhZENvZWZmKHAwLCBwMSwgcDIpIHtcbiAgcmV0dXJuIFtwMCAtIDIgKiBwMSArIHAyLCAyICogKHAxIC0gcDApLCBwMF07XG59O1xuXG4vLyBnZXQgY3VydmUgd2lkdGgsIGhlaWdodCwgYW5kIGNvbnRyb2wgcG9pbnQgcG9zaXRpb24gb2Zmc2V0cyBhcyBhIHBlcmNlbnRhZ2Ugb2Ygbm9kZSBoZWlnaHQgLyB3aWR0aFxudmFyIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZnVuY3Rpb24gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4ge1xuICAgIGhlaWdodE9mZnNldDogTWF0aC5taW4oMTUsIDAuMDUgKiBoZWlnaHQpLFxuICAgIHdpZHRoT2Zmc2V0OiBNYXRoLm1pbigxMDAsIDAuMjUgKiB3aWR0aCksXG4gICAgY3RybFB0T2Zmc2V0UGN0OiAwLjA1XG4gIH07XG59O1xuXG52YXIgcGFnZVJhbmtEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBkYW1waW5nRmFjdG9yOiAwLjgsXG4gIHByZWNpc2lvbjogMC4wMDAwMDEsXG4gIGl0ZXJhdGlvbnM6IDIwMCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9XG59KTtcbnZhciBlbGVzZm4kbyA9IHtcbiAgcGFnZVJhbms6IGZ1bmN0aW9uIHBhZ2VSYW5rKG9wdGlvbnMpIHtcbiAgICB2YXIgX3BhZ2VSYW5rRGVmYXVsdHMgPSBwYWdlUmFua0RlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgZGFtcGluZ0ZhY3RvciA9IF9wYWdlUmFua0RlZmF1bHRzLmRhbXBpbmdGYWN0b3IsXG4gICAgICBwcmVjaXNpb24gPSBfcGFnZVJhbmtEZWZhdWx0cy5wcmVjaXNpb24sXG4gICAgICBpdGVyYXRpb25zID0gX3BhZ2VSYW5rRGVmYXVsdHMuaXRlcmF0aW9ucyxcbiAgICAgIHdlaWdodCA9IF9wYWdlUmFua0RlZmF1bHRzLndlaWdodDtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBudW1Ob2Rlc1NxZCA9IG51bU5vZGVzICogbnVtTm9kZXM7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuXG4gICAgLy8gQ29uc3RydWN0IHRyYW5zcG9zZWQgYWRqYWNlbmN5IG1hdHJpeFxuICAgIC8vIEZpcnN0IGxldHMgaGF2ZSBhIHplcm9lZCBtYXRyaXggb2YgdGhlIHJpZ2h0IHNpemVcbiAgICAvLyBXZSdsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIHN1bSBvZiBlYWNoIGNvbHVtblxuICAgIHZhciBtYXRyaXggPSBuZXcgQXJyYXkobnVtTm9kZXNTcWQpO1xuICAgIHZhciBjb2x1bW5TdW0gPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBhZGRpdGlvbmFsUHJvYiA9ICgxIC0gZGFtcGluZ0ZhY3RvcikgLyBudW1Ob2RlcztcblxuICAgIC8vIENyZWF0ZSBudWxsIG1hdHJpeFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICAgIHZhciBuID0gaSAqIG51bU5vZGVzICsgajtcbiAgICAgICAgbWF0cml4W25dID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbHVtblN1bVtpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gTm93LCBwcm9jZXNzIGVkZ2VzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bUVkZ2VzOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmNJZCA9IGVkZ2UuZGF0YSgnc291cmNlJyk7XG4gICAgICB2YXIgdGd0SWQgPSBlZGdlLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAvLyBEb24ndCBpbmNsdWRlIGxvb3BzIGluIHRoZSBtYXRyaXhcbiAgICAgIGlmIChzcmNJZCA9PT0gdGd0SWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcyA9IG5vZGVzLmluZGV4T2ZJZChzcmNJZCk7XG4gICAgICB2YXIgdCA9IG5vZGVzLmluZGV4T2ZJZCh0Z3RJZCk7XG4gICAgICB2YXIgdyA9IHdlaWdodChlZGdlKTtcbiAgICAgIHZhciBfbiA9IHQgKiBudW1Ob2RlcyArIHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBtYXRyaXhcbiAgICAgIG1hdHJpeFtfbl0gKz0gdztcblxuICAgICAgLy8gVXBkYXRlIGNvbHVtbiBzdW1cbiAgICAgIGNvbHVtblN1bVtzXSArPSB3O1xuICAgIH1cblxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIHByb2JhYmlsaXR5IGJhc2VkIG9uIGRhbXBpbmcgZmFjdG9yXG4gICAgLy8gQWxzbywgdGFrZSBpbnRvIGFjY291bnQgY29sdW1ucyB0aGF0IGhhdmUgc3VtID0gMFxuICAgIHZhciBwID0gMS4wIC8gbnVtTm9kZXMgKyBhZGRpdGlvbmFsUHJvYjsgLy8gU2hvcnRoYW5kXG5cbiAgICAvLyBUcmF2ZXJzZSBtYXRyaXgsIGNvbHVtbiBieSBjb2x1bW5cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgbnVtTm9kZXM7IF9qKyspIHtcbiAgICAgIGlmIChjb2x1bW5TdW1bX2pdID09PSAwKSB7XG4gICAgICAgIC8vIE5vICdsaW5rcycgb3V0IGZyb20gbm9kZSBqdGgsIGFzc3VtZSBlcXVhbCBwcm9iYWJpbGl0eSBmb3IgZWFjaCBwb3NzaWJsZSBub2RlXG4gICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG51bU5vZGVzOyBfaTIrKykge1xuICAgICAgICAgIHZhciBfbjIgPSBfaTIgKiBudW1Ob2RlcyArIF9qO1xuICAgICAgICAgIG1hdHJpeFtfbjJdID0gcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZSBqdGggaGFzIG91dGdvaW5nIGxpbmssIGNvbXB1dGUgbm9ybWFsaXplZCBwcm9iYWJpbGl0aWVzXG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG51bU5vZGVzOyBfaTMrKykge1xuICAgICAgICAgIHZhciBfbjMgPSBfaTMgKiBudW1Ob2RlcyArIF9qO1xuICAgICAgICAgIG1hdHJpeFtfbjNdID0gbWF0cml4W19uM10gLyBjb2x1bW5TdW1bX2pdICsgYWRkaXRpb25hbFByb2I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGRvbWluYW50IGVpZ2VudmVjdG9yIHVzaW5nIHBvd2VyIG1ldGhvZFxuICAgIHZhciBlaWdlbnZlY3RvciA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHRlbXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBwcmV2aW91cztcblxuICAgIC8vIFN0YXJ0IHdpdGggYSB2ZWN0b3Igb2YgYWxsIDEnc1xuICAgIC8vIEFsc28sIGluaXRpYWxpemUgYSBudWxsIHZlY3RvciB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc2hvcnRoYW5kXG4gICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbnVtTm9kZXM7IF9pNCsrKSB7XG4gICAgICBlaWdlbnZlY3RvcltfaTRdID0gMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspIHtcbiAgICAgIC8vIFRlbXAgYXJyYXkgd2l0aCBhbGwgMCdzXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBudW1Ob2RlczsgX2k1KyspIHtcbiAgICAgICAgdGVtcFtfaTVdID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGlwbHkgbWF0cml4IHdpdGggcHJldmlvdXMgcmVzdWx0XG4gICAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBudW1Ob2RlczsgX2k2KyspIHtcbiAgICAgICAgZm9yICh2YXIgX2oyID0gMDsgX2oyIDwgbnVtTm9kZXM7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF9uNCA9IF9pNiAqIG51bU5vZGVzICsgX2oyO1xuICAgICAgICAgIHRlbXBbX2k2XSArPSBtYXRyaXhbX240XSAqIGVpZ2VudmVjdG9yW19qMl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluUGxhY2VTdW1Ob3JtYWxpemUodGVtcCk7XG4gICAgICBwcmV2aW91cyA9IGVpZ2VudmVjdG9yO1xuICAgICAgZWlnZW52ZWN0b3IgPSB0ZW1wO1xuICAgICAgdGVtcCA9IHByZXZpb3VzO1xuICAgICAgdmFyIGRpZmYgPSAwO1xuICAgICAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlIChzcXVhcmVkIG1vZHVsZSkgb2YgYm90aCB2ZWN0b3JzXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBudW1Ob2RlczsgX2k3KyspIHtcbiAgICAgICAgdmFyIGRlbHRhID0gcHJldmlvdXNbX2k3XSAtIGVpZ2VudmVjdG9yW19pN107XG4gICAgICAgIGRpZmYgKz0gZGVsdGEgKiBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZGlmZmVyZW5jZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lyZWQgdGhyZXNob2xkLCBzdG9wIGl0ZXJhdGluZ1xuICAgICAgaWYgKGRpZmYgPCBwcmVjaXNpb24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHJlc3VsdFxuICAgIHZhciByZXMgPSB7XG4gICAgICByYW5rOiBmdW5jdGlvbiByYW5rKG5vZGUpIHtcbiAgICAgICAgbm9kZSA9IGN5LmNvbGxlY3Rpb24obm9kZSlbMF07XG4gICAgICAgIHJldHVybiBlaWdlbnZlY3Rvcltub2Rlcy5pbmRleE9mKG5vZGUpXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH0gLy8gcGFnZVJhbmtcbn07IC8vIGVsZXNmblxuXG52YXIgZGVmYXVsdHMkZiA9IGRlZmF1bHRzJGcoe1xuICByb290OiBudWxsLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgYWxwaGE6IDBcbn0pO1xudmFyIGVsZXNmbiRuID0ge1xuICBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDogZnVuY3Rpb24gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIGlmICghb3B0aW9ucy5kaXJlY3RlZCkge1xuICAgICAgdmFyIGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhEZWdyZWUgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG5cbiAgICAgICAgLy8gYWRkIGN1cnJlbnQgbm9kZSB0byB0aGUgY3VycmVudCBvcHRpb25zIG9iamVjdCBhbmQgY2FsbCBkZWdyZWVDZW50cmFsaXR5XG4gICAgICAgIG9wdGlvbnMucm9vdCA9IG5vZGU7XG4gICAgICAgIHZhciBjdXJyRGVncmVlID0gdGhpcy5kZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpO1xuICAgICAgICBpZiAobWF4RGVncmVlIDwgY3VyckRlZ3JlZS5kZWdyZWUpIHtcbiAgICAgICAgICBtYXhEZWdyZWUgPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgICBkZWdyZWVzW25vZGUuaWQoKV0gPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZ3JlZTogZnVuY3Rpb24gZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4RGVncmVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heERlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG91dGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhJbmRlZ3JlZSA9IDA7XG4gICAgICB2YXIgbWF4T3V0ZGVncmVlID0gMDtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBudW1Ob2RlczsgX2krKykge1xuICAgICAgICB2YXIgX25vZGUgPSBub2Rlc1tfaV07XG4gICAgICAgIHZhciBpZCA9IF9ub2RlLmlkKCk7XG5cbiAgICAgICAgLy8gYWRkIGN1cnJlbnQgbm9kZSB0byB0aGUgY3VycmVudCBvcHRpb25zIG9iamVjdCBhbmQgY2FsbCBkZWdyZWVDZW50cmFsaXR5XG4gICAgICAgIG9wdGlvbnMucm9vdCA9IF9ub2RlO1xuICAgICAgICB2YXIgX2N1cnJEZWdyZWUgPSB0aGlzLmRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXhJbmRlZ3JlZSA8IF9jdXJyRGVncmVlLmluZGVncmVlKSBtYXhJbmRlZ3JlZSA9IF9jdXJyRGVncmVlLmluZGVncmVlO1xuICAgICAgICBpZiAobWF4T3V0ZGVncmVlIDwgX2N1cnJEZWdyZWUub3V0ZGVncmVlKSBtYXhPdXRkZWdyZWUgPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICAgIGluZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgb3V0ZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRlZ3JlZTogZnVuY3Rpb24gaW5kZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhJbmRlZ3JlZSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGluZGVncmVlc1tub2RlLmlkKCldIC8gbWF4SW5kZWdyZWU7XG4gICAgICAgIH0sXG4gICAgICAgIG91dGRlZ3JlZTogZnVuY3Rpb24gb3V0ZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4T3V0ZGVncmVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dGRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heE91dGRlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIC8vIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkXG5cbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIE9wc2FobCdzIHBhcGVyXG4gIC8vIFwiTm9kZSBjZW50cmFsaXR5IGluIHdlaWdodGVkIG5ldHdvcmtzOiBHZW5lcmFsaXppbmcgZGVncmVlIGFuZCBzaG9ydGVzdCBwYXRoc1wiXG4gIC8vIGNoZWNrIHRoZSBoZWFkaW5nIDIgXCJEZWdyZWVcIlxuICBkZWdyZWVDZW50cmFsaXR5OiBmdW5jdGlvbiBkZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkZihvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGNhbGxpbmdFbGVzID0gdGhpcztcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcm9vdCA9IF9vcHRpb25zLnJvb3QsXG4gICAgICB3ZWlnaHQgPSBfb3B0aW9ucy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9vcHRpb25zLmRpcmVjdGVkLFxuICAgICAgYWxwaGEgPSBfb3B0aW9ucy5hbHBoYTtcbiAgICByb290ID0gY3kuY29sbGVjdGlvbihyb290KVswXTtcbiAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICB2YXIgY29ubkVkZ2VzID0gcm9vdC5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihjYWxsaW5nRWxlcyk7XG4gICAgICB2YXIgayA9IGNvbm5FZGdlcy5sZW5ndGg7XG4gICAgICB2YXIgcyA9IDA7XG5cbiAgICAgIC8vIE5vdywgc3VtIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcyArPSB3ZWlnaHQoY29ubkVkZ2VzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZ3JlZTogTWF0aC5wb3coaywgMSAtIGFscGhhKSAqIE1hdGgucG93KHMsIGFscGhhKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVkZ2VzID0gcm9vdC5jb25uZWN0ZWRFZGdlcygpO1xuICAgICAgdmFyIGluY29taW5nID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLnRhcmdldCgpLnNhbWUocm9vdCkgJiYgY2FsbGluZ0VsZXMuaGFzKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3V0Z29pbmcgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2Uuc291cmNlKCkuc2FtZShyb290KSAmJiBjYWxsaW5nRWxlcy5oYXMoZWRnZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBrX2luID0gaW5jb21pbmcubGVuZ3RoO1xuICAgICAgdmFyIGtfb3V0ID0gb3V0Z29pbmcubGVuZ3RoO1xuICAgICAgdmFyIHNfaW4gPSAwO1xuICAgICAgdmFyIHNfb3V0ID0gMDtcblxuICAgICAgLy8gTm93LCBzdW0gaW5jb21pbmcgZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBpbmNvbWluZy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHNfaW4gKz0gd2VpZ2h0KGluY29taW5nW19pMl0pO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3csIHN1bSBvdXRnb2luZyBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG91dGdvaW5nLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgc19vdXQgKz0gd2VpZ2h0KG91dGdvaW5nW19pM10pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZWdyZWU6IE1hdGgucG93KGtfaW4sIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX2luLCBhbHBoYSksXG4gICAgICAgIG91dGRlZ3JlZTogTWF0aC5wb3coa19vdXQsIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX291dCwgYWxwaGEpXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBkZWdyZWVDZW50cmFsaXR5XG59OyAvLyBlbGVzZm5cblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kbi5kYyA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHk7XG5lbGVzZm4kbi5kY24gPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXNlZCA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkO1xuXG52YXIgZGVmYXVsdHMkZSA9IGRlZmF1bHRzJGcoe1xuICBoYXJtb25pYzogdHJ1ZSxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgcm9vdDogbnVsbFxufSk7XG52YXIgZWxlc2ZuJG0gPSB7XG4gIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkOiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZChvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0cyA9IGRlZmF1bHRzJGUob3B0aW9ucyksXG4gICAgICBoYXJtb25pYyA9IF9kZWZhdWx0cy5oYXJtb25pYyxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGNsb3NlbmVzc2VzID0ge307XG4gICAgdmFyIG1heENsb3NlbmVzcyA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBmdyA9IHRoaXMuZmxveWRXYXJzaGFsbCh7XG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgLy8gQ29tcHV0ZSBjbG9zZW5lc3MgZm9yIGV2ZXJ5IG5vZGUgYW5kIGZpbmQgdGhlIG1heGltdW0gY2xvc2VuZXNzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1cnJDbG9zZW5lc3MgPSAwO1xuICAgICAgdmFyIG5vZGVfaSA9IG5vZGVzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaSAhPT0gaikge1xuICAgICAgICAgIHZhciBkID0gZncuZGlzdGFuY2Uobm9kZV9pLCBub2Rlc1tqXSk7XG4gICAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IDEgLyBkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhcm1vbmljKSB7XG4gICAgICAgIGN1cnJDbG9zZW5lc3MgPSAxIC8gY3VyckNsb3NlbmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChtYXhDbG9zZW5lc3MgPCBjdXJyQ2xvc2VuZXNzKSB7XG4gICAgICAgIG1heENsb3NlbmVzcyA9IGN1cnJDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgICBjbG9zZW5lc3Nlc1tub2RlX2kuaWQoKV0gPSBjdXJyQ2xvc2VuZXNzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VuZXNzOiBmdW5jdGlvbiBjbG9zZW5lc3Mobm9kZSkge1xuICAgICAgICBpZiAobWF4Q2xvc2VuZXNzID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSlbMF0uaWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmcm9tIGlzIGEgbm9kZVxuICAgICAgICAgIG5vZGUgPSBub2RlLmlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb3NlbmVzc2VzW25vZGVdIC8gbWF4Q2xvc2VuZXNzO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBjbG9zZW5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzMiA9IGRlZmF1bHRzJGUob3B0aW9ucyksXG4gICAgICByb290ID0gX2RlZmF1bHRzMi5yb290LFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzMi53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0czIuZGlyZWN0ZWQsXG4gICAgICBoYXJtb25pYyA9IF9kZWZhdWx0czIuaGFybW9uaWM7XG4gICAgcm9vdCA9IHRoaXMuZmlsdGVyKHJvb3QpWzBdO1xuXG4gICAgLy8gd2UgbmVlZCBkaXN0YW5jZSBmcm9tIHRoaXMgbm9kZSB0byBldmVyeSBvdGhlciBub2RlXG4gICAgdmFyIGRpamtzdHJhID0gdGhpcy5kaWprc3RyYSh7XG4gICAgICByb290OiByb290LFxuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTtcbiAgICB2YXIgdG90YWxEaXN0YW5jZSA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgICBpZiAoIW4uc2FtZShyb290KSkge1xuICAgICAgICB2YXIgZCA9IGRpamtzdHJhLmRpc3RhbmNlVG8obik7XG4gICAgICAgIGlmIChoYXJtb25pYykge1xuICAgICAgICAgIHRvdGFsRGlzdGFuY2UgKz0gMSAvIGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJtb25pYyA/IHRvdGFsRGlzdGFuY2UgOiAxIC8gdG90YWxEaXN0YW5jZTtcbiAgfSAvLyBjbG9zZW5lc3NDZW50cmFsaXR5XG59OyAvLyBlbGVzZm5cblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kbS5jYyA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHk7XG5lbGVzZm4kbS5jY24gPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXNlZCA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkO1xuXG52YXIgZGVmYXVsdHMkZCA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IG51bGwsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGwgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gdGhlIGFsZ29yaXRobSBpbiB0aGUgcGFwZXIgXCJPbiBWYXJpYW50cyBvZiBTaG9ydGVzdC1QYXRoIEJldHdlZW5uZXNzIENlbnRyYWxpdHkgYW5kIHRoZWlyIEdlbmVyaWMgQ29tcHV0YXRpb25cIiBieSBVbHJpayBCcmFuZGVzXG4gIGJldHdlZW5uZXNzQ2VudHJhbGl0eTogZnVuY3Rpb24gYmV0d2Vlbm5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZChvcHRpb25zKSxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzLndlaWdodDtcbiAgICB2YXIgd2VpZ2h0ZWQgPSB3ZWlnaHQgIT0gbnVsbDtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICAvLyBzdGFydGluZ1xuICAgIHZhciBWID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBBID0ge307XG4gICAgdmFyIF9DID0ge307XG4gICAgdmFyIG1heCA9IDA7XG4gICAgdmFyIEMgPSB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgICBfQ1trZXldID0gdmFsO1xuICAgICAgICBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBfQ1trZXldO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGNvbnRhaW5zIHRoZSBuZWlnaGJvcmhvb2RzIG9mIGV2ZXJ5IG5vZGVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2ID0gVltpXTtcbiAgICAgIHZhciB2aWQgPSB2LmlkKCk7XG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgQVt2aWRdID0gdi5vdXRnb2VycygpLm5vZGVzKCk7IC8vIGdldCBvdXRnb2VycyBvZiBldmVyeSBub2RlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBW3ZpZF0gPSB2Lm9wZW5OZWlnaGJvcmhvb2QoKS5ub2RlcygpOyAvLyBnZXQgbmVpZ2hib3JzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH1cblxuICAgICAgQy5zZXQodmlkLCAwKTtcbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aocykge1xuICAgICAgdmFyIHNpZCA9IFZbc10uaWQoKTtcbiAgICAgIHZhciBTID0gW107IC8vIHN0YWNrXG4gICAgICB2YXIgUCA9IHt9O1xuICAgICAgdmFyIGcgPSB7fTtcbiAgICAgIHZhciBkID0ge307XG4gICAgICB2YXIgUSA9IG5ldyBoZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBkW2FdIC0gZFtiXTtcbiAgICAgIH0pOyAvLyBxdWV1ZVxuXG4gICAgICAvLyBpbml0IGRpY3Rpb25hcmllc1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFYubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBfdmlkID0gVltfaV0uaWQoKTtcbiAgICAgICAgUFtfdmlkXSA9IFtdO1xuICAgICAgICBnW192aWRdID0gMDtcbiAgICAgICAgZFtfdmlkXSA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgZ1tzaWRdID0gMTsgLy8gc2lnbWFcbiAgICAgIGRbc2lkXSA9IDA7IC8vIGRpc3RhbmNlIHRvIHNcblxuICAgICAgUS5wdXNoKHNpZCk7XG4gICAgICB3aGlsZSAoIVEuZW1wdHkoKSkge1xuICAgICAgICB2YXIgX3YgPSBRLnBvcCgpO1xuICAgICAgICBTLnB1c2goX3YpO1xuICAgICAgICBpZiAod2VpZ2h0ZWQpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IEFbX3ZdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgdyA9IEFbX3ZdW2pdO1xuICAgICAgICAgICAgdmFyIHZFbGUgPSBjeS5nZXRFbGVtZW50QnlJZChfdik7XG4gICAgICAgICAgICB2YXIgZWRnZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmICh2RWxlLmVkZ2VzVG8odykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBlZGdlID0gdkVsZS5lZGdlc1RvKHcpWzBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWRnZSA9IHcuZWRnZXNUbyh2RWxlKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0KGVkZ2UpO1xuICAgICAgICAgICAgdyA9IHcuaWQoKTtcbiAgICAgICAgICAgIGlmIChkW3ddID4gZFtfdl0gKyBlZGdlV2VpZ2h0KSB7XG4gICAgICAgICAgICAgIGRbd10gPSBkW192XSArIGVkZ2VXZWlnaHQ7XG4gICAgICAgICAgICAgIGlmIChRLm5vZGVzLmluZGV4T2YodykgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy9pZiB3IGlzIG5vdCBpbiBRXG4gICAgICAgICAgICAgICAgUS5wdXNoKHcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbiBpZiB3IGlzIGluIFFcbiAgICAgICAgICAgICAgICBRLnVwZGF0ZUl0ZW0odyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZ1t3XSA9IDA7XG4gICAgICAgICAgICAgIFBbd10gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkW3ddID09IGRbX3ZdICsgZWRnZVdlaWdodCkge1xuICAgICAgICAgICAgICBnW3ddID0gZ1t3XSArIGdbX3ZdO1xuICAgICAgICAgICAgICBQW3ddLnB1c2goX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgQVtfdl0ubGVuZ3RoOyBfaisrKSB7XG4gICAgICAgICAgICB2YXIgX3cgPSBBW192XVtfal0uaWQoKTtcbiAgICAgICAgICAgIGlmIChkW193XSA9PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBRLnB1c2goX3cpO1xuICAgICAgICAgICAgICBkW193XSA9IGRbX3ZdICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkW193XSA9PSBkW192XSArIDEpIHtcbiAgICAgICAgICAgICAgZ1tfd10gPSBnW193XSArIGdbX3ZdO1xuICAgICAgICAgICAgICBQW193XS5wdXNoKF92KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBlID0ge307XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBWLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgZVtWW19pMl0uaWQoKV0gPSAwO1xuICAgICAgfVxuICAgICAgd2hpbGUgKFMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3cyID0gUy5wb3AoKTtcbiAgICAgICAgZm9yICh2YXIgX2oyID0gMDsgX2oyIDwgUFtfdzJdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgICAgICB2YXIgX3YyID0gUFtfdzJdW19qMl07XG4gICAgICAgICAgZVtfdjJdID0gZVtfdjJdICsgZ1tfdjJdIC8gZ1tfdzJdICogKDEgKyBlW193Ml0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfdzIgIT0gVltzXS5pZCgpKSB7XG4gICAgICAgICAgQy5zZXQoX3cyLCBDLmdldChfdzIpICsgZVtfdzJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgcyA9IDA7IHMgPCBWLmxlbmd0aDsgcysrKSB7XG4gICAgICBfbG9vcChzKTtcbiAgICB9XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIGJldHdlZW5uZXNzOiBmdW5jdGlvbiBiZXR3ZWVubmVzcyhub2RlKSB7XG4gICAgICAgIHZhciBpZCA9IGN5LmNvbGxlY3Rpb24obm9kZSkuaWQoKTtcbiAgICAgICAgcmV0dXJuIEMuZ2V0KGlkKTtcbiAgICAgIH0sXG4gICAgICBiZXR3ZWVubmVzc05vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGJldHdlZW5uZXNzTm9ybWFsaXplZChub2RlKSB7XG4gICAgICAgIGlmIChtYXggPT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZCA9IGN5LmNvbGxlY3Rpb24obm9kZSkuaWQoKTtcbiAgICAgICAgcmV0dXJuIEMuZ2V0KGlkKSAvIG1heDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gYWxpYXNcbiAgICByZXQuYmV0d2Vlbm5lc3NOb3JtYWxpc2VkID0gcmV0LmJldHdlZW5uZXNzTm9ybWFsaXplZDtcbiAgICByZXR1cm4gcmV0O1xuICB9IC8vIGJldHdlZW5uZXNzQ2VudHJhbGl0eVxufTsgLy8gZWxlc2ZuXG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJGwuYmMgPSBlbGVzZm4kbC5iZXR3ZWVubmVzc0NlbnRyYWxpdHk7XG5cbi8vIEltcGxlbWVudGVkIGJ5IFpvZSBYaSBAem9leGkgZm9yIEdTT0MgMjAxNlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGRlZmF1bHRzJGMgPSBkZWZhdWx0cyRnKHtcbiAgZXhwYW5kRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIHRpbWUgb2YgY29tcHV0YXRpb24gYW5kIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgdG8gc29tZSBleHRlbnQ6IE0gKiBNXG4gIGluZmxhdGVGYWN0b3I6IDIsXG4gIC8vIGFmZmVjdHMgY2x1c3RlciBncmFudWxhcml0eSAodGhlIGdyZWF0ZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBjbHVzdGVycyk6IE0oaSxqKSAvIEUoailcbiAgbXVsdEZhY3RvcjogMSxcbiAgLy8gb3B0aW9uYWwgc2VsZiBsb29wcyBmb3IgZWFjaCBub2RlLiBVc2UgYSBuZXV0cmFsIHZhbHVlIHRvIGltcHJvdmUgY2x1c3RlciBjb21wdXRhdGlvbnMuXG4gIG1heEl0ZXJhdGlvbnM6IDIwLFxuICAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBNQ0wgYWxnb3JpdGhtIGluIGEgc2luZ2xlIHJ1blxuICBhdHRyaWJ1dGVzOiBbXG4gIC8vIGF0dHJpYnV0ZXMvZmVhdHVyZXMgdXNlZCB0byBncm91cCBub2RlcywgaWUuIHNpbWlsYXJpdHkgdmFsdWVzIGJldHdlZW4gbm9kZXNcbiAgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfV1cbn0pO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgc2V0T3B0aW9ucyQzID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBkZWZhdWx0cyRjKG9wdGlvbnMpO1xufTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldFNpbWlsYXJpdHkkMSA9IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHkoZWRnZSwgYXR0cmlidXRlcykge1xuICB2YXIgdG90YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0b3RhbCArPSBhdHRyaWJ1dGVzW2ldKGVkZ2UpO1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn07XG52YXIgYWRkTG9vcHMgPSBmdW5jdGlvbiBhZGRMb29wcyhNLCBuLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBNW2kgKiBuICsgaV0gPSB2YWw7XG4gIH1cbn07XG52YXIgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKE0sIG4pIHtcbiAgdmFyIHN1bTtcbiAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbjsgY29sKyspIHtcbiAgICBzdW0gPSAwO1xuICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG47IHJvdysrKSB7XG4gICAgICBzdW0gKz0gTVtyb3cgKiBuICsgY29sXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX3JvdyA9IDA7IF9yb3cgPCBuOyBfcm93KyspIHtcbiAgICAgIE1bX3JvdyAqIG4gKyBjb2xdID0gTVtfcm93ICogbiArIGNvbF0gLyBzdW07XG4gICAgfVxuICB9XG59O1xuXG4vLyBUT0RPOiBibG9ja2VkIG1hdHJpeCBtdWx0aXBsaWNhdGlvbj9cbnZhciBtbXVsdCA9IGZ1bmN0aW9uIG1tdWx0KEEsIEIsIG4pIHtcbiAgdmFyIEMgPSBuZXcgQXJyYXkobiAqIG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBDW2kgKiBuICsgal0gPSAwO1xuICAgIH1cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IG47IF9qKyspIHtcbiAgICAgICAgQ1tpICogbiArIF9qXSArPSBBW2kgKiBuICsga10gKiBCW2sgKiBuICsgX2pdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gQztcbn07XG52YXIgZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKE0sIG4sIGV4cGFuZEZhY3RvciAvKiogcG93ZXIgKiovKSB7XG4gIHZhciBfTSA9IE0uc2xpY2UoMCk7XG4gIGZvciAodmFyIHAgPSAxOyBwIDwgZXhwYW5kRmFjdG9yOyBwKyspIHtcbiAgICBNID0gbW11bHQoTSwgX00sIG4pO1xuICB9XG4gIHJldHVybiBNO1xufTtcbnZhciBpbmZsYXRlID0gZnVuY3Rpb24gaW5mbGF0ZShNLCBuLCBpbmZsYXRlRmFjdG9yIC8qKiByICoqLykge1xuICB2YXIgX00gPSBuZXcgQXJyYXkobiAqIG4pO1xuXG4gIC8vIE0oaSxqKSBeIGluZmxhdGVQb3dlclxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4gKiBuOyBpKyspIHtcbiAgICBfTVtpXSA9IE1hdGgucG93KE1baV0sIGluZmxhdGVGYWN0b3IpO1xuICB9XG4gIG5vcm1hbGl6ZShfTSwgbik7XG4gIHJldHVybiBfTTtcbn07XG52YXIgaGFzQ29udmVyZ2VkID0gZnVuY3Rpb24gaGFzQ29udmVyZ2VkKE0sIF9NLCBuMiwgcm91bmRGYWN0b3IpIHtcbiAgLy8gQ2hlY2sgdGhhdCBib3RoIG1hdHJpY2VzIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgKGksailcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuMjsgaSsrKSB7XG4gICAgdmFyIHYxID0gTWF0aC5yb3VuZChNW2ldICogTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKSkgLyBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpOyAvLyB0cnVuY2F0ZSB0byAncm91bmRGYWN0b3InIGRlY2ltYWwgcGxhY2VzXG4gICAgdmFyIHYyID0gTWF0aC5yb3VuZChfTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTtcbiAgICBpZiAodjEgIT09IHYyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBhc3NpZ24kMiA9IGZ1bmN0aW9uIGFzc2lnbihNLCBuLCBub2RlcywgY3kpIHtcbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGNsdXN0ZXIgPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgLy8gUm93LXdpc2UgYXR0cmFjdG9ycyBhbmQgZWxlbWVudHMgdGhhdCB0aGV5IGF0dHJhY3QgYmVsb25nIGluIHNhbWUgY2x1c3RlclxuICAgICAgaWYgKE1hdGgucm91bmQoTVtpICogbiArIGpdICogMTAwMCkgLyAxMDAwID4gMCkge1xuICAgICAgICBjbHVzdGVyLnB1c2gobm9kZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2x1c3Rlci5sZW5ndGggIT09IDApIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2goY3kuY29sbGVjdGlvbihjbHVzdGVyKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIgaXNEdXBsaWNhdGUgPSBmdW5jdGlvbiBpc0R1cGxpY2F0ZShjMSwgYzIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjMS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghYzJbaV0gfHwgYzFbaV0uaWQoKSAhPT0gYzJbaV0uaWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgcmVtb3ZlRHVwbGljYXRlcyA9IGZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXMoY2x1c3RlcnMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2x1c3RlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChpICE9IGogJiYgaXNEdXBsaWNhdGUoY2x1c3RlcnNbaV0sIGNsdXN0ZXJzW2pdKSkge1xuICAgICAgICBjbHVzdGVycy5zcGxpY2UoaiwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIgbWFya292Q2x1c3RlcmluZyA9IGZ1bmN0aW9uIG1hcmtvdkNsdXN0ZXJpbmcob3B0aW9ucykge1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMuZWRnZXMoKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTpcbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDMob3B0aW9ucyk7XG5cbiAgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlkMnBvc2l0aW9uW25vZGVzW2ldLmlkKCldID0gaTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHN0b2NoYXN0aWMgbWF0cml4IE0gZnJvbSBpbnB1dCBncmFwaCBHIChzaG91bGQgYmUgc3ltbWV0cmljL3VuZGlyZWN0ZWQpXG4gIHZhciBuID0gbm9kZXMubGVuZ3RoLFxuICAgIG4yID0gbiAqIG47XG4gIHZhciBNID0gbmV3IEFycmF5KG4yKSxcbiAgICBfTTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG4yOyBfaSsrKSB7XG4gICAgTVtfaV0gPSAwO1xuICB9XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWRnZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2VdO1xuICAgIHZhciBfaTIgPSBpZDJwb3NpdGlvbltlZGdlLnNvdXJjZSgpLmlkKCldO1xuICAgIHZhciBqID0gaWQycG9zaXRpb25bZWRnZS50YXJnZXQoKS5pZCgpXTtcbiAgICB2YXIgc2ltID0gZ2V0U2ltaWxhcml0eSQxKGVkZ2UsIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgTVtfaTIgKiBuICsgal0gKz0gc2ltOyAvLyBHIHNob3VsZCBiZSBzeW1tZXRyaWMgYW5kIHVuZGlyZWN0ZWRcbiAgICBNW2ogKiBuICsgX2kyXSArPSBzaW07XG4gIH1cblxuICAvLyBCZWdpbiBNYXJrb3YgY2x1c3RlciBhbGdvcml0aG1cblxuICAvLyBTdGVwIDE6IEFkZCBzZWxmIGxvb3BzIHRvIGVhY2ggbm9kZSwgaWUuIGFkZCBtdWx0RmFjdG9yIHRvIG1hdHJpeCBkaWFnb25hbFxuICBhZGRMb29wcyhNLCBuLCBvcHRzLm11bHRGYWN0b3IpO1xuXG4gIC8vIFN0ZXAgMjogTSA9IG5vcm1hbGl6ZSggTSApO1xuICBub3JtYWxpemUoTSwgbik7XG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB3aGlsZSAoaXNTdGlsbE1vdmluZyAmJiBpdGVyYXRpb25zIDwgb3B0cy5tYXhJdGVyYXRpb25zKSB7XG4gICAgaXNTdGlsbE1vdmluZyA9IGZhbHNlO1xuXG4gICAgLy8gU3RlcCAzOlxuICAgIF9NID0gZXhwYW5kKE0sIG4sIG9wdHMuZXhwYW5kRmFjdG9yKTtcblxuICAgIC8vIFN0ZXAgNDpcbiAgICBNID0gaW5mbGF0ZShfTSwgbiwgb3B0cy5pbmZsYXRlRmFjdG9yKTtcblxuICAgIC8vIFN0ZXAgNTogY2hlY2sgdG8gc2VlIGlmIH5zdGVhZHkgc3RhdGUgaGFzIGJlZW4gcmVhY2hlZFxuICAgIGlmICghaGFzQ29udmVyZ2VkKE0sIF9NLCBuMiwgNCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBCdWlsZCBjbHVzdGVycyBmcm9tIG1hdHJpeFxuICB2YXIgY2x1c3RlcnMgPSBhc3NpZ24kMihNLCBuLCBub2RlcywgY3kpO1xuXG4gIC8vIFJlbW92ZSBkdXBsaWNhdGUgY2x1c3RlcnMgZHVlIHRvIHN5bW1ldHJ5IG9mIGdyYXBoIGFuZCBNIG1hdHJpeFxuICBjbHVzdGVycyA9IHJlbW92ZUR1cGxpY2F0ZXMoY2x1c3RlcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmckMSA9IHtcbiAgbWFya292Q2x1c3RlcmluZzogbWFya292Q2x1c3RlcmluZyxcbiAgbWNsOiBtYXJrb3ZDbHVzdGVyaW5nXG59O1xuXG4vLyBDb21tb24gZGlzdGFuY2UgbWV0cmljcyBmb3IgY2x1c3RlcmluZyBhbGdvcml0aG1zXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufTtcbnZhciBhYnNEaWZmID0gZnVuY3Rpb24gYWJzRGlmZihwLCBxKSB7XG4gIHJldHVybiBNYXRoLmFicyhxIC0gcCk7XG59O1xudmFyIGFkZEFic0RpZmYgPSBmdW5jdGlvbiBhZGRBYnNEaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIGFic0RpZmYocCwgcSk7XG59O1xudmFyIGFkZFNxdWFyZWREaWZmID0gZnVuY3Rpb24gYWRkU3F1YXJlZERpZmYodG90YWwsIHAsIHEpIHtcbiAgcmV0dXJuIHRvdGFsICsgTWF0aC5wb3cocSAtIHAsIDIpO1xufTtcbnZhciBzcXJ0ID0gZnVuY3Rpb24gc3FydCh4KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoeCk7XG59O1xudmFyIG1heEFic0RpZmYgPSBmdW5jdGlvbiBtYXhBYnNEaWZmKGN1cnJlbnRNYXgsIHAsIHEpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGN1cnJlbnRNYXgsIGFic0RpZmYocCwgcSkpO1xufTtcbnZhciBnZXREaXN0YW5jZSA9IGZ1bmN0aW9uIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgaW5pdCwgdmlzaXQpIHtcbiAgdmFyIHBvc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IGlkZW50aXR5O1xuICB2YXIgcmV0ID0gaW5pdDtcbiAgdmFyIHAsIHE7XG4gIGZvciAodmFyIGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICBwID0gZ2V0UChkaW0pO1xuICAgIHEgPSBnZXRRKGRpbSk7XG4gICAgcmV0ID0gdmlzaXQocmV0LCBwLCBxKTtcbiAgfVxuICByZXR1cm4gcG9zdChyZXQpO1xufTtcbnZhciBkaXN0YW5jZXMgPSB7XG4gIGV1Y2xpZGVhbjogZnVuY3Rpb24gZXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIGlmIChsZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkU3F1YXJlZERpZmYsIHNxcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3Igc2luZ2xlIGF0dHIgY2FzZSwgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQgc3FydFxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gICAgfVxuICB9LFxuICBzcXVhcmVkRXVjbGlkZWFuOiBmdW5jdGlvbiBzcXVhcmVkRXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmKTtcbiAgfSxcbiAgbWFuaGF0dGFuOiBmdW5jdGlvbiBtYW5oYXR0YW4obGVuZ3RoLCBnZXRQLCBnZXRRKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIC1JbmZpbml0eSwgbWF4QWJzRGlmZik7XG4gIH1cbn07XG5cbi8vIGluIGNhc2UgdGhlIHVzZXIgYWNjaWRlbnRhbGx5IGRvZXNuJ3QgdXNlIGNhbWVsIGNhc2VcbmRpc3RhbmNlc1snc3F1YXJlZC1ldWNsaWRlYW4nXSA9IGRpc3RhbmNlc1snc3F1YXJlZEV1Y2xpZGVhbiddO1xuZGlzdGFuY2VzWydzcXVhcmVkZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmZ1bmN0aW9uIGNsdXN0ZXJpbmdEaXN0YW5jZSAobWV0aG9kLCBsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSkge1xuICB2YXIgaW1wbDtcbiAgaWYgKGZuJDYobWV0aG9kKSkge1xuICAgIGltcGwgPSBtZXRob2Q7XG4gIH0gZWxzZSB7XG4gICAgaW1wbCA9IGRpc3RhbmNlc1ttZXRob2RdIHx8IGRpc3RhbmNlcy5ldWNsaWRlYW47XG4gIH1cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBmbiQ2KG1ldGhvZCkpIHtcbiAgICByZXR1cm4gaW1wbChub2RlUCwgbm9kZVEpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbXBsKGxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbiAgfVxufVxuXG52YXIgZGVmYXVsdHMkYiA9IGRlZmF1bHRzJGcoe1xuICBrOiAyLFxuICBtOiAyLFxuICBzZW5zaXRpdml0eVRocmVzaG9sZDogMC4wMDAxLFxuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIG1heEl0ZXJhdGlvbnM6IDEwLFxuICBhdHRyaWJ1dGVzOiBbXSxcbiAgdGVzdE1vZGU6IGZhbHNlLFxuICB0ZXN0Q2VudHJvaWRzOiBudWxsXG59KTtcbnZhciBzZXRPcHRpb25zJDIgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJGIob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QodHlwZSwgbm9kZSwgY2VudHJvaWQsIGF0dHJpYnV0ZXMsIG1vZGUpIHtcbiAgdmFyIG5vTm9kZVAgPSBtb2RlICE9PSAna01lZG9pZHMnO1xuICB2YXIgZ2V0UCA9IG5vTm9kZVAgPyBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBjZW50cm9pZFtpXTtcbiAgfSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0oY2VudHJvaWQpO1xuICB9O1xuICB2YXIgZ2V0USA9IGZ1bmN0aW9uIGdldFEoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKG5vZGUpO1xuICB9O1xuICB2YXIgbm9kZVAgPSBjZW50cm9pZDtcbiAgdmFyIG5vZGVRID0gbm9kZTtcbiAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbn07XG52YXIgcmFuZG9tQ2VudHJvaWRzID0gZnVuY3Rpb24gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBrLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBuZGltID0gYXR0cmlidXRlcy5sZW5ndGg7XG4gIHZhciBtaW4gPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBtYXggPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBjZW50cm9pZHMgPSBuZXcgQXJyYXkoayk7XG4gIHZhciBjZW50cm9pZCA9IG51bGw7XG5cbiAgLy8gRmluZCBtaW4sIG1heCB2YWx1ZXMgZm9yIGVhY2ggYXR0cmlidXRlIGRpbWVuc2lvblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5kaW07IGkrKykge1xuICAgIG1pbltpXSA9IG5vZGVzLm1pbihhdHRyaWJ1dGVzW2ldKS52YWx1ZTtcbiAgICBtYXhbaV0gPSBub2Rlcy5tYXgoYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gIH1cblxuICAvLyBCdWlsZCBrIGNlbnRyb2lkcywgZWFjaCByZXByZXNlbnRlZCBhcyBhbiBuLWRpbSBmZWF0dXJlIHZlY3RvclxuICBmb3IgKHZhciBjID0gMDsgYyA8IGs7IGMrKykge1xuICAgIGNlbnRyb2lkID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5kaW07IF9pKyspIHtcbiAgICAgIGNlbnRyb2lkW19pXSA9IE1hdGgucmFuZG9tKCkgKiAobWF4W19pXSAtIG1pbltfaV0pICsgbWluW19pXTsgLy8gcmFuZG9tIGluaXRpYWwgdmFsdWVcbiAgICB9XG5cbiAgICBjZW50cm9pZHNbY10gPSBjZW50cm9pZDtcbiAgfVxuICByZXR1cm4gY2VudHJvaWRzO1xufTtcbnZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIGNsYXNzaWZ5KG5vZGUsIGNlbnRyb2lkcywgZGlzdGFuY2UsIGF0dHJpYnV0ZXMsIHR5cGUpIHtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbnRyb2lkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaXN0ID0gZ2V0RGlzdChkaXN0YW5jZSwgbm9kZSwgY2VudHJvaWRzW2ldLCBhdHRyaWJ1dGVzLCB0eXBlKTtcbiAgICBpZiAoZGlzdCA8IG1pbikge1xuICAgICAgbWluID0gZGlzdDtcbiAgICAgIGluZGV4ID0gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufTtcbnZhciBidWlsZENsdXN0ZXIgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXIoY2VudHJvaWQsIG5vZGVzLCBhc3NpZ25tZW50KSB7XG4gIHZhciBjbHVzdGVyID0gW107XG4gIHZhciBub2RlID0gbnVsbDtcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIG5vZGUgPSBub2Rlc1tuXTtcbiAgICBpZiAoYXNzaWdubWVudFtub2RlLmlkKCldID09PSBjZW50cm9pZCkge1xuICAgICAgLy9jb25zb2xlLmxvZyhcIk5vZGUgXCIgKyBub2RlLmlkKCkgKyBcIiBpcyBhc3NvY2lhdGVkIHdpdGggbWVkb2lkICM6IFwiICsgbSk7XG4gICAgICBjbHVzdGVyLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjbHVzdGVyO1xufTtcbnZhciBoYXZlVmFsdWVzQ29udmVyZ2VkID0gZnVuY3Rpb24gaGF2ZVZhbHVlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIHJldHVybiBNYXRoLmFicyh2MiAtIHYxKSA8PSBzZW5zaXRpdml0eVRocmVzaG9sZDtcbn07XG52YXIgaGF2ZU1hdHJpY2VzQ29udmVyZ2VkID0gZnVuY3Rpb24gaGF2ZU1hdHJpY2VzQ29udmVyZ2VkKHYxLCB2Miwgc2Vuc2l0aXZpdHlUaHJlc2hvbGQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgdjFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBkaWZmID0gTWF0aC5hYnModjFbaV1bal0gLSB2MltpXVtqXSk7XG4gICAgICBpZiAoZGlmZiA+IHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHNlZW5CZWZvcmUgPSBmdW5jdGlvbiBzZWVuQmVmb3JlKG5vZGUsIG1lZG9pZHMsIG4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAobm9kZSA9PT0gbWVkb2lkc1tpXSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciByYW5kb21NZWRvaWRzID0gZnVuY3Rpb24gcmFuZG9tTWVkb2lkcyhub2Rlcywgaykge1xuICB2YXIgbWVkb2lkcyA9IG5ldyBBcnJheShrKTtcblxuICAvLyBGb3Igc21hbGwgZGF0YSBzZXRzLCB0aGUgcHJvYmFiaWxpdHkgb2YgbWVkb2lkIGNvbmZsaWN0IGlzIGdyZWF0ZXIsXG4gIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvciBjaG9zZSB0aGlzIG5vZGUgYmVmb3JlLlxuICBpZiAobm9kZXMubGVuZ3RoIDwgNTApIHtcbiAgICAvLyBSYW5kb21seSBzZWxlY3QgayBtZWRvaWRzIGZyb20gdGhlIG4gbm9kZXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2Rlcy5sZW5ndGgpXTtcblxuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBjaG9zZW4gdGhpcyBub2RlIHRvIGJlIGEgbWVkb2lkLCBkb24ndCBjaG9vc2UgaXQgYWdhaW4gKGZvciBzbWFsbCBkYXRhIHNldHMpLlxuICAgICAgLy8gSW5zdGVhZCBjaG9vc2UgYSBkaWZmZXJlbnQgcmFuZG9tIG5vZGUuXG4gICAgICB3aGlsZSAoc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBpKSkge1xuICAgICAgICBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG4gICAgICB9XG4gICAgICBtZWRvaWRzW2ldID0gbm9kZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVsYXRpdmVseSBsYXJnZSBkYXRhIHNldCwgc28gcHJldHR5IHNhZmUgdG8gbm90IGNoZWNrIGFuZCBqdXN0IHNlbGVjdCByYW5kb20gbm9kZXNcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrOyBfaTIrKykge1xuICAgICAgbWVkb2lkc1tfaTJdID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG4gICAgfVxuICB9XG4gIHJldHVybiBtZWRvaWRzO1xufTtcbnZhciBmaW5kQ29zdCA9IGZ1bmN0aW9uIGZpbmRDb3N0KHBvdGVudGlhbE5ld01lZG9pZCwgY2x1c3RlciwgYXR0cmlidXRlcykge1xuICB2YXIgY29zdCA9IDA7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgY2x1c3Rlci5sZW5ndGg7IG4rKykge1xuICAgIGNvc3QgKz0gZ2V0RGlzdCgnbWFuaGF0dGFuJywgY2x1c3RlcltuXSwgcG90ZW50aWFsTmV3TWVkb2lkLCBhdHRyaWJ1dGVzLCAna01lZG9pZHMnKTtcbiAgfVxuICByZXR1cm4gY29zdDtcbn07XG52YXIga01lYW5zID0gZnVuY3Rpb24ga01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBub2RlID0gbnVsbDtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06ICMgb2YgY2x1c3RlcnMsIGRpc3RhbmNlIG1ldHJpYywgZXRjLlxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lYW5zIGFsZ29yaXRobVxuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGNlbnRyb2lkcztcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgY2VudHJvaWQgcG9zaXRpb25zXG4gIGlmIChvcHRzLnRlc3RNb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzLnRlc3RDZW50cm9pZHMgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYSBzZWVkZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gICAgICBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgICB9IGVsc2UgaWYgKF90eXBlb2Yob3B0cy50ZXN0Q2VudHJvaWRzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNlbnRyb2lkcyA9IG9wdHMudGVzdENlbnRyb2lkcztcbiAgICB9IGVsc2Uge1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICB9XG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB3aGlsZSAoaXNTdGlsbE1vdmluZyAmJiBpdGVyYXRpb25zIDwgb3B0cy5tYXhJdGVyYXRpb25zKSB7XG4gICAgLy8gU3RlcCAyOiBBc3NpZ24gbm9kZXMgdG8gdGhlIG5lYXJlc3QgY2VudHJvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIGNlbnRyb2lkcywgb3B0cy5kaXN0YW5jZSwgb3B0cy5hdHRyaWJ1dGVzLCAna01lYW5zJyk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBGb3IgZWFjaCBvZiB0aGUgayBjbHVzdGVycywgdXBkYXRlIGl0cyBjZW50cm9pZFxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IG9wdHMuazsgYysrKSB7XG4gICAgICAvLyBHZXQgYWxsIG5vZGVzIHRoYXQgYmVsb25nIHRvIHRoaXMgY2x1c3RlclxuICAgICAgdmFyIGNsdXN0ZXIgPSBidWlsZENsdXN0ZXIoYywgbm9kZXMsIGFzc2lnbm1lbnQpO1xuICAgICAgaWYgKGNsdXN0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIElmIGNsdXN0ZXIgaXMgZW1wdHksIGJyZWFrIG91dCBlYXJseSAmIG1vdmUgdG8gbmV4dCBjbHVzdGVyXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY2VudHJvaWRzIGJ5IGNhbGN1bGF0aW5nIGF2ZyBvZiBhbGwgbm9kZXMgd2l0aGluIHRoZSBjbHVzdGVyLlxuICAgICAgdmFyIG5kaW0gPSBvcHRzLmF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgICAgdmFyIGNlbnRyb2lkID0gY2VudHJvaWRzW2NdOyAvLyBbIGRpbV8xLCBkaW1fMiwgZGltXzMsIC4uLiAsIGRpbV9uIF1cbiAgICAgIHZhciBuZXdDZW50cm9pZCA9IG5ldyBBcnJheShuZGltKTtcbiAgICAgIHZhciBzdW0gPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICBmb3IgKHZhciBkID0gMDsgZCA8IG5kaW07IGQrKykge1xuICAgICAgICBzdW1bZF0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG5vZGUgPSBjbHVzdGVyW2ldO1xuICAgICAgICAgIHN1bVtkXSArPSBvcHRzLmF0dHJpYnV0ZXNbZF0obm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q2VudHJvaWRbZF0gPSBzdW1bZF0gLyBjbHVzdGVyLmxlbmd0aDtcblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYWxnb3JpdGhtIGhhcyBjb252ZXJnZWQsIGkuZS4gd2hlbiBjZW50cm9pZHMgbm8gbG9uZ2VyIGNoYW5nZVxuICAgICAgICBpZiAoIWhhdmVWYWx1ZXNDb252ZXJnZWQobmV3Q2VudHJvaWRbZF0sIGNlbnRyb2lkW2RdLCBvcHRzLnNlbnNpdGl2aXR5VGhyZXNob2xkKSkge1xuICAgICAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjZW50cm9pZHNbY10gPSBuZXdDZW50cm9pZDtcbiAgICAgIGNsdXN0ZXJzW2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyKTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIga01lZG9pZHMgPSBmdW5jdGlvbiBrTWVkb2lkcyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGstbWVkb2lkcyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBtZWRvaWRzO1xuICB2YXIgYXNzaWdubWVudCA9IHt9O1xuICB2YXIgY3VyQ29zdDtcbiAgdmFyIG1pbkNvc3RzID0gbmV3IEFycmF5KG9wdHMuayk7IC8vIG1pbmltdW0gY29zdCBjb25maWd1cmF0aW9uIGZvciBlYWNoIGNsdXN0ZXJcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgayBtZWRvaWRzXG4gIGlmIChvcHRzLnRlc3RNb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzLnRlc3RDZW50cm9pZHMgPT09ICdudW1iZXInKSA7IGVsc2UgaWYgKF90eXBlb2Yob3B0cy50ZXN0Q2VudHJvaWRzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1lZG9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lZG9pZHMgPSByYW5kb21NZWRvaWRzKG5vZGVzLCBvcHRzLmspO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IG1lZG9pZFxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tuXTtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBjbHVzdGVyIHRoaXMgbm9kZSBiZWxvbmdzIHRvOiBub2RlIGlkID0+IGNsdXN0ZXIgI1xuICAgICAgYXNzaWdubWVudFtub2RlLmlkKCldID0gY2xhc3NpZnkobm9kZSwgbWVkb2lkcywgb3B0cy5kaXN0YW5jZSwgb3B0cy5hdHRyaWJ1dGVzLCAna01lZG9pZHMnKTtcbiAgICB9XG4gICAgaXNTdGlsbE1vdmluZyA9IGZhbHNlO1xuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggbWVkb2lkIG0sIGFuZCBmb3IgZWFjaCBub2RlIGFzc29jaWF0ZWQgd2l0aCBtZWRpb2QgbSxcbiAgICAvLyBzZWxlY3QgdGhlIG5vZGUgd2l0aCB0aGUgbG93ZXN0IGNvbmZpZ3VyYXRpb24gY29zdCBhcyBuZXcgbWVkb2lkLlxuICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbWVkb2lkcy5sZW5ndGg7IG0rKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIG1lZG9pZFxuICAgICAgdmFyIGNsdXN0ZXIgPSBidWlsZENsdXN0ZXIobSwgbm9kZXMsIGFzc2lnbm1lbnQpO1xuICAgICAgaWYgKGNsdXN0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIElmIGNsdXN0ZXIgaXMgZW1wdHksIGJyZWFrIG91dCBlYXJseSAmIG1vdmUgdG8gbmV4dCBjbHVzdGVyXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWluQ29zdHNbbV0gPSBmaW5kQ29zdChtZWRvaWRzW21dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpOyAvLyBvcmlnaW5hbCBjb3N0XG5cbiAgICAgIC8vIFNlbGVjdCBkaWZmZXJlbnQgbWVkb2lkIGlmIGl0cyBjb25maWd1cmF0aW9uIGhhcyB0aGUgbG93ZXN0IGNvc3RcbiAgICAgIGZvciAodmFyIF9uID0gMDsgX24gPCBjbHVzdGVyLmxlbmd0aDsgX24rKykge1xuICAgICAgICBjdXJDb3N0ID0gZmluZENvc3QoY2x1c3Rlcltfbl0sIGNsdXN0ZXIsIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICAgIGlmIChjdXJDb3N0IDwgbWluQ29zdHNbbV0pIHtcbiAgICAgICAgICBtaW5Db3N0c1ttXSA9IGN1ckNvc3Q7XG4gICAgICAgICAgbWVkb2lkc1ttXSA9IGNsdXN0ZXJbX25dO1xuICAgICAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbHVzdGVyc1ttXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIHVwZGF0ZUNlbnRyb2lkcyA9IGZ1bmN0aW9uIHVwZGF0ZUNlbnRyb2lkcyhjZW50cm9pZHMsIG5vZGVzLCBVLCB3ZWlnaHQsIG9wdHMpIHtcbiAgdmFyIG51bWVyYXRvciwgZGVub21pbmF0b3I7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNlbnRyb2lkcy5sZW5ndGg7IGMrKykge1xuICAgICAgd2VpZ2h0W25dW2NdID0gTWF0aC5wb3coVVtuXVtjXSwgb3B0cy5tKTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgX2MgPSAwOyBfYyA8IGNlbnRyb2lkcy5sZW5ndGg7IF9jKyspIHtcbiAgICBmb3IgKHZhciBkaW0gPSAwOyBkaW0gPCBvcHRzLmF0dHJpYnV0ZXMubGVuZ3RoOyBkaW0rKykge1xuICAgICAgbnVtZXJhdG9yID0gMDtcbiAgICAgIGRlbm9taW5hdG9yID0gMDtcbiAgICAgIGZvciAodmFyIF9uMiA9IDA7IF9uMiA8IG5vZGVzLmxlbmd0aDsgX24yKyspIHtcbiAgICAgICAgbnVtZXJhdG9yICs9IHdlaWdodFtfbjJdW19jXSAqIG9wdHMuYXR0cmlidXRlc1tkaW1dKG5vZGVzW19uMl0pO1xuICAgICAgICBkZW5vbWluYXRvciArPSB3ZWlnaHRbX24yXVtfY107XG4gICAgICB9XG4gICAgICBjZW50cm9pZHNbX2NdW2RpbV0gPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjtcbiAgICB9XG4gIH1cbn07XG52YXIgdXBkYXRlTWVtYmVyc2hpcCA9IGZ1bmN0aW9uIHVwZGF0ZU1lbWJlcnNoaXAoVSwgX1UsIGNlbnRyb2lkcywgbm9kZXMsIG9wdHMpIHtcbiAgLy8gU2F2ZSBwcmV2aW91cyBzdGVwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVS5sZW5ndGg7IGkrKykge1xuICAgIF9VW2ldID0gVVtpXS5zbGljZSgpO1xuICB9XG4gIHZhciBzdW0sIG51bWVyYXRvciwgZGVub21pbmF0b3I7XG4gIHZhciBwb3cgPSAyIC8gKG9wdHMubSAtIDEpO1xuICBmb3IgKHZhciBjID0gMDsgYyA8IGNlbnRyb2lkcy5sZW5ndGg7IGMrKykge1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGNlbnRyb2lkcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAvLyBhZ2FpbnN0IGFsbCBvdGhlciBjZW50cm9pZHNcbiAgICAgICAgbnVtZXJhdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2NdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgZGVub21pbmF0b3IgPSBnZXREaXN0KG9wdHMuZGlzdGFuY2UsIG5vZGVzW25dLCBjZW50cm9pZHNba10sIG9wdHMuYXR0cmlidXRlcywgJ2NtZWFucycpO1xuICAgICAgICBzdW0gKz0gTWF0aC5wb3cobnVtZXJhdG9yIC8gZGVub21pbmF0b3IsIHBvdyk7XG4gICAgICB9XG4gICAgICBVW25dW2NdID0gMSAvIHN1bTtcbiAgICB9XG4gIH1cbn07XG52YXIgYXNzaWduJDEgPSBmdW5jdGlvbiBhc3NpZ24obm9kZXMsIFUsIG9wdHMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICBmb3IgKHZhciBjID0gMDsgYyA8IGNsdXN0ZXJzLmxlbmd0aDsgYysrKSB7XG4gICAgY2x1c3RlcnNbY10gPSBbXTtcbiAgfVxuICB2YXIgbWF4O1xuICB2YXIgaW5kZXg7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgVS5sZW5ndGg7IG4rKykge1xuICAgIC8vIGZvciBlYWNoIG5vZGUgKFUgaXMgTiB4IEMgbWF0cml4KVxuICAgIG1heCA9IC1JbmZpbml0eTtcbiAgICBpbmRleCA9IC0xO1xuICAgIC8vIERldGVybWluZSB3aGljaCBjbHVzdGVyIHRoZSBub2RlIGlzIG1vc3QgbGlrZWx5IHRvIGJlbG9uZyBpblxuICAgIGZvciAodmFyIF9jMiA9IDA7IF9jMiA8IFVbMF0ubGVuZ3RoOyBfYzIrKykge1xuICAgICAgaWYgKFVbbl1bX2MyXSA+IG1heCkge1xuICAgICAgICBtYXggPSBVW25dW19jMl07XG4gICAgICAgIGluZGV4ID0gX2MyO1xuICAgICAgfVxuICAgIH1cbiAgICBjbHVzdGVyc1tpbmRleF0ucHVzaChub2Rlc1tuXSk7XG4gIH1cblxuICAvLyBUdXJuIGV2ZXJ5IGFycmF5IGludG8gYSBjb2xsZWN0aW9uIG9mIG5vZGVzXG4gIGZvciAodmFyIF9jMyA9IDA7IF9jMyA8IGNsdXN0ZXJzLmxlbmd0aDsgX2MzKyspIHtcbiAgICBjbHVzdGVyc1tfYzNdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyc1tfYzNdKTtcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGZ1enp5Q01lYW5zID0gZnVuY3Rpb24gZnV6enlDTWVhbnMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gZnV6enkgYy1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzO1xuICB2YXIgY2VudHJvaWRzO1xuICB2YXIgVTtcbiAgdmFyIF9VO1xuICB2YXIgd2VpZ2h0O1xuXG4gIC8vIFN0ZXAgMTogSW5pdGlhbGl6ZSBsZXRpYWJsZXMuXG4gIF9VID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBfVVtpXSA9IG5ldyBBcnJheShvcHRzLmspO1xuICB9XG4gIFUgPSBuZXcgQXJyYXkobm9kZXMubGVuZ3RoKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZXMubGVuZ3RoOyBfaTMrKykge1xuICAgIC8vIE4geCBDIG1hdHJpeFxuICAgIFVbX2kzXSA9IG5ldyBBcnJheShvcHRzLmspO1xuICB9XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICB2YXIgdG90YWwgPSAwO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3B0cy5rOyBqKyspIHtcbiAgICAgIFVbX2k0XVtqXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB0b3RhbCArPSBVW19pNF1bal07XG4gICAgfVxuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBvcHRzLms7IF9qKyspIHtcbiAgICAgIFVbX2k0XVtfal0gPSBVW19pNF1bX2pdIC8gdG90YWw7XG4gICAgfVxuICB9XG4gIGNlbnRyb2lkcyA9IG5ldyBBcnJheShvcHRzLmspO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBvcHRzLms7IF9pNSsrKSB7XG4gICAgY2VudHJvaWRzW19pNV0gPSBuZXcgQXJyYXkob3B0cy5hdHRyaWJ1dGVzLmxlbmd0aCk7XG4gIH1cbiAgd2VpZ2h0ID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG5vZGVzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICB3ZWlnaHRbX2k2XSA9IG5ldyBBcnJheShvcHRzLmspO1xuICB9XG4gIC8vIGVuZCBpbml0IEZDTVxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB3aGlsZSAoaXNTdGlsbE1vdmluZyAmJiBpdGVyYXRpb25zIDwgb3B0cy5tYXhJdGVyYXRpb25zKSB7XG4gICAgaXNTdGlsbE1vdmluZyA9IGZhbHNlO1xuXG4gICAgLy8gU3RlcCAyOiBDYWxjdWxhdGUgdGhlIGNlbnRyb2lkcyBmb3IgZWFjaCBzdGVwLlxuICAgIHVwZGF0ZUNlbnRyb2lkcyhjZW50cm9pZHMsIG5vZGVzLCBVLCB3ZWlnaHQsIG9wdHMpO1xuXG4gICAgLy8gU3RlcCAzOiBVcGRhdGUgdGhlIHBhcnRpdGlvbiBtYXRyaXggVS5cbiAgICB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIGNvbnZlcmdlbmNlLlxuICAgIGlmICghaGF2ZU1hdHJpY2VzQ29udmVyZ2VkKFUsIF9VLCBvcHRzLnNlbnNpdGl2aXR5VGhyZXNob2xkKSkge1xuICAgICAgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuXG4gIC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVycyB3aXRoIGhpZ2hlc3QgcHJvYmFiaWxpdHkuXG4gIGNsdXN0ZXJzID0gYXNzaWduJDEobm9kZXMsIFUsIG9wdHMsIGN5KTtcbiAgcmV0dXJuIHtcbiAgICBjbHVzdGVyczogY2x1c3RlcnMsXG4gICAgZGVncmVlT2ZNZW1iZXJzaGlwOiBVXG4gIH07XG59O1xudmFyIGtDbHVzdGVyaW5nID0ge1xuICBrTWVhbnM6IGtNZWFucyxcbiAga01lZG9pZHM6IGtNZWRvaWRzLFxuICBmdXp6eUNNZWFuczogZnV6enlDTWVhbnMsXG4gIGZjbTogZnV6enlDTWVhbnNcbn07XG5cbi8vIEltcGxlbWVudGVkIGJ5IFpvZSBYaSBAem9leGkgZm9yIEdTT0MgMjAxNlxudmFyIGRlZmF1bHRzJGEgPSBkZWZhdWx0cyRnKHtcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICAvLyBkaXN0YW5jZSBtZXRyaWMgdG8gY29tcGFyZSBub2Rlc1xuICBsaW5rYWdlOiAnbWluJyxcbiAgLy8gbGlua2FnZSBjcml0ZXJpb24gOiBob3cgdG8gZGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGNsdXN0ZXJzIG9mIG5vZGVzXG4gIG1vZGU6ICd0aHJlc2hvbGQnLFxuICAvLyBtb2RlOid0aHJlc2hvbGQnID0+IGNsdXN0ZXJzIG11c3QgYmUgdGhyZXNob2xkIGRpc3RhbmNlIGFwYXJ0XG4gIHRocmVzaG9sZDogSW5maW5pdHksXG4gIC8vIHRoZSBkaXN0YW5jZSB0aHJlc2hvbGRcbiAgLy8gbW9kZTonZGVuZHJvZ3JhbScgPT4gdGhlIG5vZGVzIGFyZSBvcmdhbmlzZWQgYXMgbGVhdmVzIGluIGEgdHJlZSAoc2libGluZ3MgYXJlIGNsb3NlKSwgbWVyZ2luZyBtYWtlcyBjbHVzdGVyc1xuICBhZGREZW5kcm9ncmFtOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byBhZGQgdGhlIGRlbmRyb2dyYW0gdG8gdGhlIGdyYXBoIGZvciB2aXpcbiAgZGVuZHJvZ3JhbURlcHRoOiAwLFxuICAvLyBkZXB0aCBhdCB3aGljaCBkZW5kcm9ncmFtIGJyYW5jaGVzIGFyZSBtZXJnZWQgaW50byB0aGUgcmV0dXJuZWQgY2x1c3RlcnNcbiAgYXR0cmlidXRlczogW10gLy8gYXJyYXkgb2YgYXR0ciBmdW5jdGlvbnNcbn0pO1xuXG52YXIgbGlua2FnZUFsaWFzZXMgPSB7XG4gICdzaW5nbGUnOiAnbWluJyxcbiAgJ2NvbXBsZXRlJzogJ21heCdcbn07XG52YXIgc2V0T3B0aW9ucyQxID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gZGVmYXVsdHMkYShvcHRpb25zKTtcbiAgdmFyIHByZWZlcnJlZEFsaWFzID0gbGlua2FnZUFsaWFzZXNbb3B0cy5saW5rYWdlXTtcbiAgaWYgKHByZWZlcnJlZEFsaWFzICE9IG51bGwpIHtcbiAgICBvcHRzLmxpbmthZ2UgPSBwcmVmZXJyZWRBbGlhcztcbiAgfVxuICByZXR1cm4gb3B0cztcbn07XG52YXIgbWVyZ2VDbG9zZXN0ID0gZnVuY3Rpb24gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpIHtcbiAgLy8gRmluZCB0d28gY2xvc2VzdCBjbHVzdGVycyBmcm9tIGNhY2hlZCBtaW5zXG4gIHZhciBtaW5LZXkgPSAwO1xuICB2YXIgbWluID0gSW5maW5pdHk7XG4gIHZhciBkaXN0O1xuICB2YXIgYXR0cnMgPSBvcHRzLmF0dHJpYnV0ZXM7XG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBjbHVzdGVyc1tpXS5rZXk7XG4gICAgdmFyIF9kaXN0ID0gZGlzdHNba2V5XVttaW5zW2tleV1dO1xuICAgIGlmIChfZGlzdCA8IG1pbikge1xuICAgICAgbWluS2V5ID0ga2V5O1xuICAgICAgbWluID0gX2Rpc3Q7XG4gICAgfVxuICB9XG4gIGlmIChvcHRzLm1vZGUgPT09ICd0aHJlc2hvbGQnICYmIG1pbiA+PSBvcHRzLnRocmVzaG9sZCB8fCBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyAmJiBjbHVzdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGMxID0gaW5kZXhbbWluS2V5XTtcbiAgdmFyIGMyID0gaW5kZXhbbWluc1ttaW5LZXldXTtcbiAgdmFyIG1lcmdlZDtcblxuICAvLyBNZXJnZSB0d28gY2xvc2VzdCBjbHVzdGVyc1xuICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICBsZWZ0OiBjMSxcbiAgICAgIHJpZ2h0OiBjMixcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICB2YWx1ZTogYzEudmFsdWUuY29uY2F0KGMyLnZhbHVlKSxcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfVxuICBjbHVzdGVyc1tjMS5pbmRleF0gPSBtZXJnZWQ7XG4gIGNsdXN0ZXJzLnNwbGljZShjMi5pbmRleCwgMSk7XG4gIGluZGV4W2MxLmtleV0gPSBtZXJnZWQ7XG5cbiAgLy8gVXBkYXRlIGRpc3RhbmNlcyB3aXRoIG5ldyBtZXJnZWQgY2x1c3RlclxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY2x1c3RlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGN1ciA9IGNsdXN0ZXJzW19pXTtcbiAgICBpZiAoYzEua2V5ID09PSBjdXIua2V5KSB7XG4gICAgICBkaXN0ID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtaW4nKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldID4gZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21heCcpIHtcbiAgICAgIGRpc3QgPSBkaXN0c1tjMS5rZXldW2N1ci5rZXldO1xuICAgICAgaWYgKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPCBkaXN0c1tjMi5rZXldW2N1ci5rZXldKSB7XG4gICAgICAgIGRpc3QgPSBkaXN0c1tjMi5rZXldW2N1ci5rZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWVhbicpIHtcbiAgICAgIGRpc3QgPSAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSAqIGMxLnNpemUgKyBkaXN0c1tjMi5rZXldW2N1ci5rZXldICogYzIuc2l6ZSkgLyAoYzEuc2l6ZSArIGMyLnNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZSwgYzEudmFsdWUpO2Vsc2UgZGlzdCA9IGdldERpc3QoY3VyLnZhbHVlWzBdLCBjMS52YWx1ZVswXSk7XG4gICAgfVxuICAgIGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPSBkaXN0c1tjdXIua2V5XVtjMS5rZXldID0gZGlzdDsgLy8gZGlzdGFuY2UgbWF0cml4IGlzIHN5bW1ldHJpY1xuICB9XG5cbiAgLy8gVXBkYXRlIGNhY2hlZCBtaW5zXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGNsdXN0ZXJzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIga2V5MSA9IGNsdXN0ZXJzW19pMl0ua2V5O1xuICAgIGlmIChtaW5zW2tleTFdID09PSBjMS5rZXkgfHwgbWluc1trZXkxXSA9PT0gYzIua2V5KSB7XG4gICAgICB2YXIgX21pbiA9IGtleTE7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrZXkyID0gY2x1c3RlcnNbal0ua2V5O1xuICAgICAgICBpZiAoZGlzdHNba2V5MV1ba2V5Ml0gPCBkaXN0c1trZXkxXVtfbWluXSkge1xuICAgICAgICAgIF9taW4gPSBrZXkyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtaW5zW2tleTFdID0gX21pbjtcbiAgICB9XG4gICAgY2x1c3RlcnNbX2kyXS5pbmRleCA9IF9pMjtcbiAgfVxuXG4gIC8vIENsZWFuIHVwIG1ldGEgZGF0YSB1c2VkIGZvciBjbHVzdGVyaW5nXG4gIGMxLmtleSA9IGMyLmtleSA9IGMxLmluZGV4ID0gYzIuaW5kZXggPSBudWxsO1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZ2V0QWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiBnZXRBbGxDaGlsZHJlbihyb290LCBhcnIsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuO1xuICBpZiAocm9vdC52YWx1ZSkge1xuICAgIGFyci5wdXNoKHJvb3QudmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgYXJyKTtcbiAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgYXJyKTtcbiAgfVxufTtcbnZhciBidWlsZERlbmRyb2dyYW0gPSBmdW5jdGlvbiBidWlsZERlbmRyb2dyYW0ocm9vdCwgY3kpIHtcbiAgaWYgKCFyb290KSByZXR1cm4gJyc7XG4gIGlmIChyb290LmxlZnQgJiYgcm9vdC5yaWdodCkge1xuICAgIHZhciBsZWZ0U3RyID0gYnVpbGREZW5kcm9ncmFtKHJvb3QubGVmdCwgY3kpO1xuICAgIHZhciByaWdodFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LnJpZ2h0LCBjeSk7XG4gICAgdmFyIG5vZGUgPSBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBsZWZ0U3RyICsgJywnICsgcmlnaHRTdHJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogbGVmdFN0cixcbiAgICAgICAgdGFyZ2V0OiBub2RlLmlkKClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogcmlnaHRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgfSBlbHNlIGlmIChyb290LnZhbHVlKSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWUuaWQoKTtcbiAgfVxufTtcbnZhciBidWlsZENsdXN0ZXJzRnJvbVRyZWUgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdCwgaywgY3kpIHtcbiAgaWYgKCFyb290KSByZXR1cm4gW107XG4gIHZhciBsZWZ0ID0gW10sXG4gICAgcmlnaHQgPSBbXSxcbiAgICBsZWF2ZXMgPSBbXTtcbiAgaWYgKGsgPT09IDApIHtcbiAgICAvLyBkb24ndCBjdXQgdHJlZSwgc2ltcGx5IHJldHVybiBhbGwgbm9kZXMgYXMgMSBzaW5nbGUgY2x1c3RlclxuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICBsZWF2ZXMgPSBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlYXZlcyldO1xuICB9IGVsc2UgaWYgKGsgPT09IDEpIHtcbiAgICAvLyBjdXQgYXQgcm9vdFxuXG4gICAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICAgIC8vIGxlYWYgbm9kZVxuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKHJvb3QudmFsdWUpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvb3QubGVmdCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5sZWZ0LCBsZWZ0KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSBnZXRBbGxDaGlsZHJlbihyb290LnJpZ2h0LCByaWdodCk7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24obGVmdCksIGN5LmNvbGxlY3Rpb24ocmlnaHQpXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGxlZnQgPSBidWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdC5sZWZ0LCBrIC0gMSwgY3kpO1xuICAgICAgaWYgKHJvb3QucmlnaHQpIHJpZ2h0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QucmlnaHQsIGsgLSAxLCBjeSk7XG4gICAgICByZXR1cm4gbGVmdC5jb25jYXQocmlnaHQpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcgPSBmdW5jdGlvbiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiBsaW5rYWdlIHR5cGUsIGRpc3RhbmNlIG1ldHJpYywgZXRjLlxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMShvcHRpb25zKTtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QobjEsIG4yKSB7XG4gICAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZShvcHRzLmRpc3RhbmNlLCBhdHRycy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objEpO1xuICAgIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objIpO1xuICAgIH0sIG4xLCBuMik7XG4gIH07XG5cbiAgLy8gQmVnaW4gaGllcmFyY2hpY2FsIGFsZ29yaXRobVxuICB2YXIgY2x1c3RlcnMgPSBbXTtcbiAgdmFyIGRpc3RzID0gW107IC8vIGRpc3RhbmNlcyBiZXR3ZWVuIGVhY2ggcGFpciBvZiBjbHVzdGVyc1xuICB2YXIgbWlucyA9IFtdOyAvLyBjbG9zZXN0IGNsdXN0ZXIgZm9yIGVhY2ggY2x1c3RlclxuICB2YXIgaW5kZXggPSBbXTsgLy8gaGFzaCBvZiBhbGwgY2x1c3RlcnMgYnkga2V5XG5cbiAgLy8gSW4gYWdnbG9tZXJhdGl2ZSAoYm90dG9tLXVwKSBjbHVzdGVyaW5nLCBlYWNoIG5vZGUgc3RhcnRzIGFzIGl0cyBvd24gY2x1c3RlclxuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgdmFyIGNsdXN0ZXIgPSB7XG4gICAgICB2YWx1ZTogb3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScgPyBub2Rlc1tuXSA6IFtub2Rlc1tuXV0sXG4gICAgICBrZXk6IG4sXG4gICAgICBpbmRleDogblxuICAgIH07XG4gICAgY2x1c3RlcnNbbl0gPSBjbHVzdGVyO1xuICAgIGluZGV4W25dID0gY2x1c3RlcjtcbiAgICBkaXN0c1tuXSA9IFtdO1xuICAgIG1pbnNbbl0gPSAwO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcGFpciBvZiBjbHVzdGVyc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gaTsgaisrKSB7XG4gICAgICB2YXIgZGlzdCA9IHZvaWQgMDtcbiAgICAgIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgICAgICAvLyBtb2RlcyBzdG9yZSBjbHVzdGVyIHZhbHVlcyBkaWZmZXJlbnRseVxuICAgICAgICBkaXN0ID0gaSA9PT0gaiA/IEluZmluaXR5IDogZ2V0RGlzdChjbHVzdGVyc1tpXS52YWx1ZSwgY2x1c3RlcnNbal0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWVbMF0sIGNsdXN0ZXJzW2pdLnZhbHVlWzBdKTtcbiAgICAgIH1cbiAgICAgIGRpc3RzW2ldW2pdID0gZGlzdDtcbiAgICAgIGRpc3RzW2pdW2ldID0gZGlzdDtcbiAgICAgIGlmIChkaXN0IDwgZGlzdHNbaV1bbWluc1tpXV0pIHtcbiAgICAgICAgbWluc1tpXSA9IGo7IC8vIENhY2hlIG1pbnM6IGNsb3Nlc3QgY2x1c3RlciB0byBjbHVzdGVyIGkgaXMgY2x1c3RlciBqXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCB0aGUgY2xvc2VzdCBwYWlyIG9mIGNsdXN0ZXJzIGFuZCBtZXJnZSB0aGVtIGludG8gYSBzaW5nbGUgY2x1c3Rlci5cbiAgLy8gVXBkYXRlIGRpc3RhbmNlcyBiZXR3ZWVuIG5ldyBjbHVzdGVyIGFuZCBlYWNoIG9mIHRoZSBvbGQgY2x1c3RlcnMsIGFuZCBsb29wIHVudGlsIHRocmVzaG9sZCByZWFjaGVkLlxuICB2YXIgbWVyZ2VkID0gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpO1xuICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgbWVyZ2VkID0gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpO1xuICB9XG4gIHZhciByZXRDbHVzdGVycztcblxuICAvLyBEZW5kcm9ncmFtIG1vZGUgYnVpbGRzIHRoZSBoaWVyYXJjaHkgYW5kIGFkZHMgaW50ZXJtZWRpYXJ5IG5vZGVzICsgZWRnZXNcbiAgLy8gaW4gYWRkaXRpb24gdG8gcmV0dXJuaW5nIHRoZSBjbHVzdGVycy5cbiAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSB7XG4gICAgcmV0Q2x1c3RlcnMgPSBidWlsZENsdXN0ZXJzRnJvbVRyZWUoY2x1c3RlcnNbMF0sIG9wdHMuZGVuZHJvZ3JhbURlcHRoLCBjeSk7XG4gICAgaWYgKG9wdHMuYWRkRGVuZHJvZ3JhbSkgYnVpbGREZW5kcm9ncmFtKGNsdXN0ZXJzWzBdLCBjeSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBtb2RlIHNpbXBseSByZXR1cm5zIHRoZSBjbHVzdGVyc1xuXG4gICAgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoY2x1c3RlcnMubGVuZ3RoKTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjbHVzdGVyLCBpKSB7XG4gICAgICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICAgICAgY2x1c3Rlci5rZXkgPSBjbHVzdGVyLmluZGV4ID0gbnVsbDtcbiAgICAgIHJldENsdXN0ZXJzW2ldID0gY3kuY29sbGVjdGlvbihjbHVzdGVyLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0Q2x1c3RlcnM7XG59O1xudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSA9IHtcbiAgaGllcmFyY2hpY2FsQ2x1c3RlcmluZzogaGllcmFyY2hpY2FsQ2x1c3RlcmluZyxcbiAgaGNhOiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyQ5ID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgYXR0cmlidXRlcyBiZXR3ZWVuIHR3byBub2Rlc1xuICBwcmVmZXJlbmNlOiAnbWVkaWFuJyxcbiAgLy8gc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIGRhbXBpbmc6IDAuOCxcbiAgLy8gZGFtcGluZyBmYWN0b3IgYmV0d2VlbiBbMC41LCAxKVxuICBtYXhJdGVyYXRpb25zOiAxMDAwLFxuICAvLyBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuXG4gIG1pbkl0ZXJhdGlvbnM6IDEwMCxcbiAgLy8gbWluIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biBpbiBvcmRlciBmb3IgY2x1c3RlcmluZyB0byBzdG9wXG4gIGF0dHJpYnV0ZXM6IFsvLyBmdW5jdGlvbnMgdG8gcXVhbnRpZnkgdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBhbnkgdHdvIHBvaW50c1xuICAgIC8vIGUuZy4gbm9kZSA9PiBub2RlLmRhdGEoJ3dlaWdodCcpXG4gIF1cbn0pO1xudmFyIHNldE9wdGlvbnMgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIGRtcCA9IG9wdGlvbnMuZGFtcGluZztcbiAgdmFyIHByZWYgPSBvcHRpb25zLnByZWZlcmVuY2U7XG4gIGlmICghKDAuNSA8PSBkbXAgJiYgZG1wIDwgMSkpIHtcbiAgICBlcnJvcihcIkRhbXBpbmcgbXVzdCByYW5nZSBvbiBbMC41LCAxKS4gIEdvdDogXCIuY29uY2F0KGRtcCkpO1xuICB9XG4gIHZhciB2YWxpZFByZWZzID0gWydtZWRpYW4nLCAnbWVhbicsICdtaW4nLCAnbWF4J107XG4gIGlmICghKHZhbGlkUHJlZnMuc29tZShmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2ID09PSBwcmVmO1xuICB9KSB8fCBudW1iZXIkMShwcmVmKSkpIHtcbiAgICBlcnJvcihcIlByZWZlcmVuY2UgbXVzdCBiZSBvbmUgb2YgW1wiLmNvbmNhdCh2YWxpZFByZWZzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIFwiJ1wiLmNvbmNhdChwLCBcIidcIik7XG4gICAgfSkuam9pbignLCAnKSwgXCJdIG9yIGEgbnVtYmVyLiAgR290OiBcIikuY29uY2F0KHByZWYpKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdHMkOShvcHRpb25zKTtcbn07XG5cbnZhciBnZXRTaW1pbGFyaXR5ID0gZnVuY3Rpb24gZ2V0U2ltaWxhcml0eSh0eXBlLCBuMSwgbjIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGF0dHIgPSBmdW5jdGlvbiBhdHRyKG4sIGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShuKTtcbiAgfTtcblxuICAvLyBuYiBuZWdhdGl2ZSBiZWNhdXNlIHNpbWlsYXJpdHkgc2hvdWxkIGhhdmUgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgdG8gZGlzdGFuY2VcbiAgcmV0dXJuIC1jbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHIobjEsIGkpO1xuICB9LCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4yLCBpKTtcbiAgfSwgbjEsIG4yKTtcbn07XG52YXIgZ2V0UHJlZmVyZW5jZSA9IGZ1bmN0aW9uIGdldFByZWZlcmVuY2UoUywgcHJlZmVyZW5jZSkge1xuICAvLyBsYXJnZXIgcHJlZmVyZW5jZSA9IGdyZWF0ZXIgIyBvZiBjbHVzdGVyc1xuICB2YXIgcCA9IG51bGw7XG4gIGlmIChwcmVmZXJlbmNlID09PSAnbWVkaWFuJykge1xuICAgIHAgPSBtZWRpYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21lYW4nKSB7XG4gICAgcCA9IG1lYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21pbicpIHtcbiAgICBwID0gbWluKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtYXgnKSB7XG4gICAgcCA9IG1heChTKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDdXN0b20gcHJlZmVyZW5jZSBudW1iZXIsIGFzIHNldCBieSB1c2VyXG4gICAgcCA9IHByZWZlcmVuY2U7XG4gIH1cbiAgcmV0dXJuIHA7XG59O1xudmFyIGZpbmRFeGVtcGxhcnMgPSBmdW5jdGlvbiBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpIHtcbiAgdmFyIGluZGljZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAoUltpICogbiArIGldICsgQVtpICogbiArIGldID4gMCkge1xuICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kaWNlcztcbn07XG52YXIgYXNzaWduQ2x1c3RlcnMgPSBmdW5jdGlvbiBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpIHtcbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgICAgdmFyIGUgPSBleGVtcGxhcnNbZWldO1xuICAgICAgaWYgKFNbaSAqIG4gKyBlXSA+IG1heCkge1xuICAgICAgICBpbmRleCA9IGU7XG4gICAgICAgIG1heCA9IFNbaSAqIG4gKyBlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9laSA9IDA7IF9laSA8IGV4ZW1wbGFycy5sZW5ndGg7IF9laSsrKSB7XG4gICAgY2x1c3RlcnNbZXhlbXBsYXJzW19laV1dID0gZXhlbXBsYXJzW19laV07XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24obiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IGFzc2lnbkNsdXN0ZXJzKG4sIFMsIGV4ZW1wbGFycyk7XG4gIGZvciAodmFyIGVpID0gMDsgZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBlaSsrKSB7XG4gICAgdmFyIGlpID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2NdID09PSBleGVtcGxhcnNbZWldKSB7XG4gICAgICAgIGlpLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtYXhJID0gLTE7XG4gICAgdmFyIG1heFN1bSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlpLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3VtID0gMDtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3VtICs9IFNbaWlbal0gKiBuICsgaWlbaV1dO1xuICAgICAgfVxuICAgICAgaWYgKHN1bSA+IG1heFN1bSkge1xuICAgICAgICBtYXhJID0gaTtcbiAgICAgICAgbWF4U3VtID0gc3VtO1xuICAgICAgfVxuICAgIH1cbiAgICBleGVtcGxhcnNbZWldID0gaWlbbWF4SV07XG4gIH1cbiAgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGFmZmluaXR5UHJvcGFnYXRpb24gPSBmdW5jdGlvbiBhZmZpbml0eVByb3BhZ2F0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBNYXAgZWFjaCBub2RlIHRvIGl0cyBwb3NpdGlvbiBpbiBub2RlIGFycmF5XG4gIHZhciBpZDJwb3NpdGlvbiA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWQycG9zaXRpb25bbm9kZXNbaV0uaWQoKV0gPSBpO1xuICB9XG5cbiAgLy8gQmVnaW4gYWZmaW5pdHkgcHJvcGFnYXRpb24gYWxnb3JpdGhtXG5cbiAgdmFyIG47IC8vIG51bWJlciBvZiBkYXRhIHBvaW50c1xuICB2YXIgbjI7IC8vIHNpemUgb2YgbWF0cmljZXNcbiAgdmFyIFM7IC8vIHNpbWlsYXJpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIHA7IC8vIHByZWZlcmVuY2Uvc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIHZhciBSOyAvLyByZXNwb25zaWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuICB2YXIgQTsgLy8gYXZhaWxhYmlsaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgbiA9IG5vZGVzLmxlbmd0aDtcbiAgbjIgPSBuICogbjtcblxuICAvLyBJbml0aWFsaXplIGFuZCBidWlsZCBTIHNpbWlsYXJpdHkgbWF0cml4XG4gIFMgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbjI7IF9pKyspIHtcbiAgICBTW19pXSA9IC1JbmZpbml0eTsgLy8gZm9yIGNhc2VzIHdoZXJlIHR3byBkYXRhIHBvaW50cyBzaG91bGRuJ3QgYmUgbGlua2VkIHRvZ2V0aGVyXG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuOyBfaTIrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBpZiAoX2kyICE9PSBqKSB7XG4gICAgICAgIFNbX2kyICogbiArIGpdID0gZ2V0U2ltaWxhcml0eShvcHRzLmRpc3RhbmNlLCBub2Rlc1tfaTJdLCBub2Rlc1tqXSwgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQbGFjZSBwcmVmZXJlbmNlcyBvbiB0aGUgZGlhZ29uYWwgb2YgU1xuICBwID0gZ2V0UHJlZmVyZW5jZShTLCBvcHRzLnByZWZlcmVuY2UpO1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBuOyBfaTMrKykge1xuICAgIFNbX2kzICogbiArIF9pM10gPSBwO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBSIHJlc3BvbnNpYmlsaXR5IG1hdHJpeFxuICBSID0gbmV3IEFycmF5KG4yKTtcbiAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbjI7IF9pNCsrKSB7XG4gICAgUltfaTRdID0gMC4wO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgQSA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG4yOyBfaTUrKykge1xuICAgIEFbX2k1XSA9IDAuMDtcbiAgfVxuICB2YXIgb2xkID0gbmV3IEFycmF5KG4pO1xuICB2YXIgUnAgPSBuZXcgQXJyYXkobik7XG4gIHZhciBzZSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbjsgX2k2KyspIHtcbiAgICBvbGRbX2k2XSA9IDAuMDtcbiAgICBScFtfaTZdID0gMC4wO1xuICAgIHNlW19pNl0gPSAwO1xuICB9XG4gIHZhciBlID0gbmV3IEFycmF5KG4gKiBvcHRzLm1pbkl0ZXJhdGlvbnMpO1xuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBlLmxlbmd0aDsgX2k3KyspIHtcbiAgICBlW19pN10gPSAwO1xuICB9XG4gIHZhciBpdGVyO1xuICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgb3B0cy5tYXhJdGVyYXRpb25zOyBpdGVyKyspIHtcbiAgICAvLyBtYWluIGFsZ29yaXRobWljIGxvb3BcblxuICAgIC8vIFVwZGF0ZSBSIHJlc3BvbnNpYmlsaXR5IG1hdHJpeFxuICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG47IF9pOCsrKSB7XG4gICAgICB2YXIgbWF4ID0gLUluZmluaXR5LFxuICAgICAgICBtYXgyID0gLUluZmluaXR5LFxuICAgICAgICBtYXhJID0gLTEsXG4gICAgICAgIEFTID0gMC4wO1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IG47IF9qKyspIHtcbiAgICAgICAgb2xkW19qXSA9IFJbX2k4ICogbiArIF9qXTtcbiAgICAgICAgQVMgPSBBW19pOCAqIG4gKyBfal0gKyBTW19pOCAqIG4gKyBfal07XG4gICAgICAgIGlmIChBUyA+PSBtYXgpIHtcbiAgICAgICAgICBtYXgyID0gbWF4O1xuICAgICAgICAgIG1heCA9IEFTO1xuICAgICAgICAgIG1heEkgPSBfajtcbiAgICAgICAgfSBlbHNlIGlmIChBUyA+IG1heDIpIHtcbiAgICAgICAgICBtYXgyID0gQVM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG47IF9qMisrKSB7XG4gICAgICAgIFJbX2k4ICogbiArIF9qMl0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoU1tfaTggKiBuICsgX2oyXSAtIG1heCkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2oyXTtcbiAgICAgIH1cbiAgICAgIFJbX2k4ICogbiArIG1heEldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIG1heEldIC0gbWF4MikgKyBvcHRzLmRhbXBpbmcgKiBvbGRbbWF4SV07XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIEEgYXZhaWxhYmlsaXR5IG1hdHJpeFxuICAgIGZvciAodmFyIF9pOSA9IDA7IF9pOSA8IG47IF9pOSsrKSB7XG4gICAgICB2YXIgc3VtID0gMDtcbiAgICAgIGZvciAodmFyIF9qMyA9IDA7IF9qMyA8IG47IF9qMysrKSB7XG4gICAgICAgIG9sZFtfajNdID0gQVtfajMgKiBuICsgX2k5XTtcbiAgICAgICAgUnBbX2ozXSA9IE1hdGgubWF4KDAsIFJbX2ozICogbiArIF9pOV0pO1xuICAgICAgICBzdW0gKz0gUnBbX2ozXTtcbiAgICAgIH1cbiAgICAgIHN1bSAtPSBScFtfaTldO1xuICAgICAgUnBbX2k5XSA9IFJbX2k5ICogbiArIF9pOV07XG4gICAgICBzdW0gKz0gUnBbX2k5XTtcbiAgICAgIGZvciAodmFyIF9qNCA9IDA7IF9qNCA8IG47IF9qNCsrKSB7XG4gICAgICAgIEFbX2o0ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiBNYXRoLm1pbigwLCBzdW0gLSBScFtfajRdKSArIG9wdHMuZGFtcGluZyAqIG9sZFtfajRdO1xuICAgICAgfVxuICAgICAgQVtfaTkgKiBuICsgX2k5XSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChzdW0gLSBScFtfaTldKSArIG9wdHMuZGFtcGluZyAqIG9sZFtfaTldO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBjb252ZXJnZW5jZVxuICAgIHZhciBLID0gMDtcbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG47IF9pMTArKykge1xuICAgICAgdmFyIEUgPSBBW19pMTAgKiBuICsgX2kxMF0gKyBSW19pMTAgKiBuICsgX2kxMF0gPiAwID8gMSA6IDA7XG4gICAgICBlW2l0ZXIgJSBvcHRzLm1pbkl0ZXJhdGlvbnMgKiBuICsgX2kxMF0gPSBFO1xuICAgICAgSyArPSBFO1xuICAgIH1cbiAgICBpZiAoSyA+IDAgJiYgKGl0ZXIgPj0gb3B0cy5taW5JdGVyYXRpb25zIC0gMSB8fCBpdGVyID09IG9wdHMubWF4SXRlcmF0aW9ucyAtIDEpKSB7XG4gICAgICB2YXIgX3N1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IG47IF9pMTErKykge1xuICAgICAgICBzZVtfaTExXSA9IDA7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IDA7IF9qNSA8IG9wdHMubWluSXRlcmF0aW9uczsgX2o1KyspIHtcbiAgICAgICAgICBzZVtfaTExXSArPSBlW19qNSAqIG4gKyBfaTExXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VbX2kxMV0gPT09IDAgfHwgc2VbX2kxMV0gPT09IG9wdHMubWluSXRlcmF0aW9ucykge1xuICAgICAgICAgIF9zdW0rKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9zdW0gPT09IG4pIHtcbiAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIGNvbnZlcmdlbmNlXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElkZW50aWZ5IGV4ZW1wbGFycyAoY2x1c3RlciBjZW50ZXJzKVxuICB2YXIgZXhlbXBsYXJzSW5kaWNlcyA9IGZpbmRFeGVtcGxhcnMobiwgUiwgQSk7XG5cbiAgLy8gQXNzaWduIG5vZGVzIHRvIGNsdXN0ZXJzXG4gIHZhciBjbHVzdGVySW5kaWNlcyA9IGFzc2lnbihuLCBTLCBleGVtcGxhcnNJbmRpY2VzKTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG4gIGZvciAodmFyIGMgPSAwOyBjIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbY11dID0gW107XG4gIH1cbiAgZm9yICh2YXIgX2kxMiA9IDA7IF9pMTIgPCBub2Rlcy5sZW5ndGg7IF9pMTIrKykge1xuICAgIHZhciBwb3MgPSBpZDJwb3NpdGlvbltub2Rlc1tfaTEyXS5pZCgpXTtcbiAgICB2YXIgY2x1c3RlckluZGV4ID0gY2x1c3RlckluZGljZXNbcG9zXTtcbiAgICBpZiAoY2x1c3RlckluZGV4ICE9IG51bGwpIHtcbiAgICAgIC8vIHRoZSBub2RlIG1heSBoYXZlIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2x1c3RlciBpZiBubyB2YWxpZCBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkXG4gICAgICBjbHVzdGVyc1tjbHVzdGVySW5kZXhdLnB1c2gobm9kZXNbX2kxMl0pO1xuICAgIH1cbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfYyA9IDA7IF9jIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IF9jKyspIHtcbiAgICByZXRDbHVzdGVyc1tfY10gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbX2NdXSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uJDEgPSB7XG4gIGFmZmluaXR5UHJvcGFnYXRpb246IGFmZmluaXR5UHJvcGFnYXRpb24sXG4gIGFwOiBhZmZpbml0eVByb3BhZ2F0aW9uXG59O1xuXG52YXIgaGllcmhvbHplckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IHVuZGVmaW5lZCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kayA9IHtcbiAgaGllcmhvbHplcjogZnVuY3Rpb24gaGllcmhvbHplcihvcHRpb25zKSB7XG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRpb25zKSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICByb290OiBhcmdzWzBdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1sxXVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9oaWVyaG9semVyRGVmYXVsdHMgPSBoaWVyaG9semVyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5yb290LFxuICAgICAgZGlyZWN0ZWQgPSBfaGllcmhvbHplckRlZmF1bHRzLmRpcmVjdGVkO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgZGZsYWcgPSBmYWxzZTtcbiAgICB2YXIgb2RkSW47XG4gICAgdmFyIG9kZE91dDtcbiAgICB2YXIgc3RhcnRWZXJ0ZXg7XG4gICAgaWYgKHJvb3QpIHN0YXJ0VmVydGV4ID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0uaWQoKSA6IHJvb3RbMF0uaWQoKTtcbiAgICB2YXIgbm9kZXMgPSB7fTtcbiAgICB2YXIgZWRnZXMgPSB7fTtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGluZCA9IGVsZS5pbmRlZ3JlZSh0cnVlKTtcbiAgICAgICAgICB2YXIgb3V0ZCA9IGVsZS5vdXRkZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIGQxID0gaW5kIC0gb3V0ZDtcbiAgICAgICAgICB2YXIgZDIgPSBvdXRkIC0gaW5kO1xuICAgICAgICAgIGlmIChkMSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkSW4pIGRmbGFnID0gdHJ1ZTtlbHNlIG9kZEluID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkT3V0KSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRPdXQgPSBpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQyID4gMSB8fCBkMSA+IDEpIHtcbiAgICAgICAgICAgIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLm91dGdvZXJzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFZGdlKCkpIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW3VuZGVmaW5lZCwgZWxlLnRhcmdldCgpLmlkKCldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICB2YXIgZCA9IGVsZS5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgaWYgKGQgJSAyKSB7XG4gICAgICAgICAgICBpZiAoIW9kZEluKSBvZGRJbiA9IGlkO2Vsc2UgaWYgKCFvZGRPdXQpIG9kZE91dCA9IGlkO2Vsc2UgZGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2Rlc1tpZF0gPSBbXTtcbiAgICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbaWRdLnB1c2goZS5pZCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlc1tpZF0gPSBbZWxlLnNvdXJjZSgpLmlkKCksIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICB0cmFpbDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoZGZsYWcpIHJldHVybiByZXN1bHQ7ZWxzZSBpZiAob2RkT3V0ICYmIG9kZEluKSB7XG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnRWZXJ0ZXggJiYgb2RkT3V0ICE9IHN0YXJ0VmVydGV4ICYmIG9kZEluICE9IHN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICBzdGFydFZlcnRleCA9IG9kZE91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXN0YXJ0VmVydGV4KSBzdGFydFZlcnRleCA9IGVsZXNbMF0uaWQoKTtcbiAgICB9XG4gICAgdmFyIHdhbGsgPSBmdW5jdGlvbiB3YWxrKHYpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHY7XG4gICAgICB2YXIgc3VidG91ciA9IFt2XTtcbiAgICAgIHZhciBhZGosIGFkalRhaWwsIGFkakhlYWQ7XG4gICAgICB3aGlsZSAobm9kZXNbY3VycmVudE5vZGVdLmxlbmd0aCkge1xuICAgICAgICBhZGogPSBub2Rlc1tjdXJyZW50Tm9kZV0uc2hpZnQoKTtcbiAgICAgICAgYWRqVGFpbCA9IGVkZ2VzW2Fkal1bMF07XG4gICAgICAgIGFkakhlYWQgPSBlZGdlc1thZGpdWzFdO1xuICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gYWRqSGVhZCkge1xuICAgICAgICAgIG5vZGVzW2FkakhlYWRdID0gbm9kZXNbYWRqSGVhZF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpIZWFkO1xuICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RlZCAmJiBjdXJyZW50Tm9kZSAhPSBhZGpUYWlsKSB7XG4gICAgICAgICAgbm9kZXNbYWRqVGFpbF0gPSBub2Rlc1thZGpUYWlsXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlICE9IGFkajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGFkalRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgc3VidG91ci51bnNoaWZ0KGFkaik7XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChjdXJyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VidG91cjtcbiAgICB9O1xuICAgIHZhciB0cmFpbCA9IFtdO1xuICAgIHZhciBzdWJ0b3VyID0gW107XG4gICAgc3VidG91ciA9IHdhbGsoc3RhcnRWZXJ0ZXgpO1xuICAgIHdoaWxlIChzdWJ0b3VyLmxlbmd0aCAhPSAxKSB7XG4gICAgICBpZiAobm9kZXNbc3VidG91clswXV0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgICB0cmFpbC51bnNoaWZ0KGVsZXMuZ2V0RWxlbWVudEJ5SWQoc3VidG91ci5zaGlmdCgpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ0b3VyID0gd2FsayhzdWJ0b3VyLnNoaWZ0KCkpLmNvbmNhdChzdWJ0b3VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpOyAvLyBmaW5hbCBub2RlXG5cbiAgICBmb3IgKHZhciBkIGluIG5vZGVzKSB7XG4gICAgICBpZiAobm9kZXNbZF0ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5mb3VuZCA9IHRydWU7XG4gICAgcmVzdWx0LnRyYWlsID0gdGhpcy5zcGF3bih0cmFpbCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQgPSBmdW5jdGlvbiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaWQgPSAwO1xuICB2YXIgZWRnZUNvdW50ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkRWRnZXMgPSB7fTtcbiAgdmFyIGJ1aWxkQ29tcG9uZW50ID0gZnVuY3Rpb24gYnVpbGRDb21wb25lbnQoeCwgeSkge1xuICAgIHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICB2YXIgY3V0c2V0ID0gW107XG4gICAgdmFyIGNvbXBvbmVudCA9IGVsZXMuc3Bhd24oKTtcbiAgICB3aGlsZSAoc3RhY2tbaV0ueCAhPSB4IHx8IHN0YWNrW2ldLnkgIT0geSkge1xuICAgICAgY3V0c2V0LnB1c2goc3RhY2sucG9wKCkuZWRnZSk7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgIGN1dHNldC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBlZGdlLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgY29ubmVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgICAgIGlmICghbm9kZXNbbm9kZUlkXS5jdXRWZXJ0ZXgpIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShjb25uZWN0ZWRFZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH07XG4gIHZhciBiaWNvbm5lY3RlZFNlYXJjaCA9IGZ1bmN0aW9uIGJpY29ubmVjdGVkU2VhcmNoKHJvb3QsIGN1cnJlbnROb2RlLCBwYXJlbnQpIHtcbiAgICBpZiAocm9vdCA9PT0gcGFyZW50KSBlZGdlQ291bnQgKz0gMTtcbiAgICBub2Rlc1tjdXJyZW50Tm9kZV0gPSB7XG4gICAgICBpZDogaWQsXG4gICAgICBsb3c6IGlkKyssXG4gICAgICBjdXRWZXJ0ZXg6IGZhbHNlXG4gICAgfTtcbiAgICB2YXIgZWRnZXMgPSBlbGVzLmdldEVsZW1lbnRCeUlkKGN1cnJlbnROb2RlKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBpZiAoZWRnZXMuc2l6ZSgpID09PSAwKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goZWxlcy5zcGF3bihlbGVzLmdldEVsZW1lbnRCeUlkKGN1cnJlbnROb2RlKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc291cmNlSWQsIHRhcmdldElkLCBvdGhlck5vZGVJZCwgZWRnZUlkO1xuICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBzb3VyY2VJZCA9IGVkZ2Uuc291cmNlKCkuaWQoKTtcbiAgICAgICAgdGFyZ2V0SWQgPSBlZGdlLnRhcmdldCgpLmlkKCk7XG4gICAgICAgIG90aGVyTm9kZUlkID0gc291cmNlSWQgPT09IGN1cnJlbnROb2RlID8gdGFyZ2V0SWQgOiBzb3VyY2VJZDtcbiAgICAgICAgaWYgKG90aGVyTm9kZUlkICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBlZGdlSWQgPSBlZGdlLmlkKCk7XG4gICAgICAgICAgaWYgKCF2aXNpdGVkRWRnZXNbZWRnZUlkXSkge1xuICAgICAgICAgICAgdmlzaXRlZEVkZ2VzW2VkZ2VJZF0gPSB0cnVlO1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHg6IGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgICB5OiBvdGhlck5vZGVJZCxcbiAgICAgICAgICAgICAgZWRnZTogZWRnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKG90aGVyTm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gocm9vdCwgb3RoZXJOb2RlSWQsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0ubG93KTtcbiAgICAgICAgICAgIGlmIChub2Rlc1tjdXJyZW50Tm9kZV0uaWQgPD0gbm9kZXNbb3RoZXJOb2RlSWRdLmxvdykge1xuICAgICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0uY3V0VmVydGV4ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnVpbGRDb21wb25lbnQoY3VycmVudE5vZGUsIG90aGVyTm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmxvdyA9IE1hdGgubWluKG5vZGVzW2N1cnJlbnROb2RlXS5sb3csIG5vZGVzW290aGVyTm9kZUlkXS5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgdmFyIG5vZGVJZCA9IGVsZS5pZCgpO1xuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBlZGdlQ291bnQgPSAwO1xuICAgICAgICBiaWNvbm5lY3RlZFNlYXJjaChub2RlSWQsIG5vZGVJZCk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uY3V0VmVydGV4ID0gZWRnZUNvdW50ID4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgY3V0VmVydGljZXMgPSBPYmplY3Qua2V5cyhub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBub2Rlc1tpZF0uY3V0VmVydGV4O1xuICB9KS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGVsZXMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGVsZXMuc3Bhd24oY3V0VmVydGljZXMpLFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG52YXIgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxID0ge1xuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGJjOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGI6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWRDb21wb25lbnRzOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkXG59O1xuXG52YXIgdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQgPSBmdW5jdGlvbiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBjdXQgPSBlbGVzLnNwYXduKGVsZXMpO1xuICB2YXIgc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaChzb3VyY2VOb2RlSWQpIHtcbiAgICBzdGFjay5wdXNoKHNvdXJjZU5vZGVJZCk7XG4gICAgbm9kZXNbc291cmNlTm9kZUlkXSA9IHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIGxvdzogaW5kZXgrKyxcbiAgICAgIGV4cGxvcmVkOiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChzb3VyY2VOb2RlSWQpLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgIGNvbm5lY3RlZEVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHZhciB0YXJnZXROb2RlSWQgPSBlZGdlLnRhcmdldCgpLmlkKCk7XG4gICAgICBpZiAodGFyZ2V0Tm9kZUlkICE9PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgaWYgKCEodGFyZ2V0Tm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKHRhcmdldE5vZGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub2Rlc1t0YXJnZXROb2RlSWRdLmV4cGxvcmVkKSB7XG4gICAgICAgICAgbm9kZXNbc291cmNlTm9kZUlkXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdywgbm9kZXNbdGFyZ2V0Tm9kZUlkXS5sb3cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKG5vZGVzW3NvdXJjZU5vZGVJZF0uaW5kZXggPT09IG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93KSB7XG4gICAgICB2YXIgY29tcG9uZW50Tm9kZXMgPSBlbGVzLnNwYXduKCk7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBub2RlSWQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29tcG9uZW50Tm9kZXMubWVyZ2UoZWxlcy5nZXRFbGVtZW50QnlJZChub2RlSWQpKTtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5sb3cgPSBub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4O1xuICAgICAgICBub2Rlc1tub2RlSWRdLmV4cGxvcmVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGVJZCA9PT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjb21wb25lbnRFZGdlcyA9IGNvbXBvbmVudE5vZGVzLmVkZ2VzV2l0aChjb21wb25lbnROb2Rlcyk7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50Tm9kZXMubWVyZ2UoY29tcG9uZW50RWRnZXMpO1xuICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICBjdXQgPSBjdXQuZGlmZmVyZW5jZShjb21wb25lbnQpO1xuICAgIH1cbiAgfTtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gZWxlLmlkKCk7XG4gICAgICBpZiAoIShub2RlSWQgaW4gbm9kZXMpKSB7XG4gICAgICAgIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKG5vZGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGN1dCxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDEgPSB7XG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkQ29tcG9uZW50czogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWRcbn07XG5cbnZhciBlbGVzZm4kaiA9IHt9O1xuW2VsZXNmbiR2LCBlbGVzZm4kdSwgZWxlc2ZuJHQsIGVsZXNmbiRzLCBlbGVzZm4kciwgZWxlc2ZuJHEsIGVsZXNmbiRwLCBlbGVzZm4kbywgZWxlc2ZuJG4sIGVsZXNmbiRtLCBlbGVzZm4kbCwgbWFya292Q2x1c3RlcmluZyQxLCBrQ2x1c3RlcmluZywgaGllcmFyY2hpY2FsQ2x1c3RlcmluZyQxLCBhZmZpbml0eVByb3BhZ2F0aW9uJDEsIGVsZXNmbiRrLCBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkJDEsIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChlbGVzZm4kaiwgcHJvcHMpO1xufSk7XG5cbi8qIVxuRW1iZWRkYWJsZSBNaW5pbXVtIFN0cmljdGx5LUNvbXBsaWFudCBQcm9taXNlcy9BKyAxLjEuMSBUaGVuYWJsZVxuQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmFsZiBTLiBFbmdlbHNjaGFsbCAoaHR0cDovL2VuZ2Vsc2NoYWxsLmNvbSlcbkxpY2Vuc2VkIHVuZGVyIFRoZSBNSVQgTGljZW5zZSAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVClcbiovXG5cbi8qICBwcm9taXNlIHN0YXRlcyBbUHJvbWlzZXMvQSsgMi4xXSAgKi9cbnZhciBTVEFURV9QRU5ESU5HID0gMDsgLyogIFtQcm9taXNlcy9BKyAyLjEuMV0gICovXG52YXIgU1RBVEVfRlVMRklMTEVEID0gMTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMl0gICovXG52YXIgU1RBVEVfUkVKRUNURUQgPSAyOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4zXSAgKi9cblxuLyogIHByb21pc2Ugb2JqZWN0IGNvbnN0cnVjdG9yICAqL1xudmFyIGFwaSA9IGZ1bmN0aW9uIGFwaShleGVjdXRvcikge1xuICAvKiAgb3B0aW9uYWxseSBzdXBwb3J0IG5vbi1jb25zdHJ1Y3Rvci9wbGFpbi1mdW5jdGlvbiBjYWxsICAqL1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgYXBpKSkgcmV0dXJuIG5ldyBhcGkoZXhlY3V0b3IpO1xuXG4gIC8qICBpbml0aWFsaXplIG9iamVjdCAgKi9cbiAgdGhpcy5pZCA9ICdUaGVuYWJsZS8xLjAuNyc7XG4gIHRoaXMuc3RhdGUgPSBTVEFURV9QRU5ESU5HOyAvKiAgaW5pdGlhbCBzdGF0ZSAgKi9cbiAgdGhpcy5mdWxmaWxsVmFsdWUgPSB1bmRlZmluZWQ7IC8qICBpbml0aWFsIHZhbHVlICAqLyAvKiAgW1Byb21pc2VzL0ErIDEuMywgMi4xLjIuMl0gICovXG4gIHRoaXMucmVqZWN0UmVhc29uID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCByZWFzb24gKi8gLyogIFtQcm9taXNlcy9BKyAxLjUsIDIuMS4zLjJdICAqL1xuICB0aGlzLm9uRnVsZmlsbGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuICB0aGlzLm9uUmVqZWN0ZWQgPSBbXTsgLyogIGluaXRpYWwgaGFuZGxlcnMgICovXG5cbiAgLyogIHByb3ZpZGUgb3B0aW9uYWwgaW5mb3JtYXRpb24taGlkaW5nIHByb3h5ICAqL1xuICB0aGlzLnByb3h5ID0ge1xuICAgIHRoZW46IHRoaXMudGhlbi5iaW5kKHRoaXMpXG4gIH07XG5cbiAgLyogIHN1cHBvcnQgb3B0aW9uYWwgZXhlY3V0b3IgZnVuY3Rpb24gICovXG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgPT09ICdmdW5jdGlvbicpIGV4ZWN1dG9yLmNhbGwodGhpcywgdGhpcy5mdWxmaWxsLmJpbmQodGhpcyksIHRoaXMucmVqZWN0LmJpbmQodGhpcykpO1xufTtcblxuLyogIHByb21pc2UgQVBJIG1ldGhvZHMgICovXG5hcGkucHJvdG90eXBlID0ge1xuICAvKiAgcHJvbWlzZSByZXNvbHZpbmcgbWV0aG9kcyAgKi9cbiAgZnVsZmlsbDogZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJldHVybiBkZWxpdmVyKHRoaXMsIFNUQVRFX0ZVTEZJTExFRCwgJ2Z1bGZpbGxWYWx1ZScsIHZhbHVlKTtcbiAgfSxcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9SRUpFQ1RFRCwgJ3JlamVjdFJlYXNvbicsIHZhbHVlKTtcbiAgfSxcbiAgLyogIFwiVGhlIHRoZW4gTWV0aG9kXCIgW1Byb21pc2VzL0ErIDEuMSwgMS4yLCAyLjJdICAqL1xuICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgdmFyIGN1cnIgPSB0aGlzO1xuICAgIHZhciBuZXh0ID0gbmV3IGFwaSgpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43XSAgKi9cbiAgICBjdXJyLm9uRnVsZmlsbGVkLnB1c2gocmVzb2x2ZXIob25GdWxmaWxsZWQsIG5leHQsICdmdWxmaWxsJykpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi4yLzIuMi42XSAgKi9cbiAgICBjdXJyLm9uUmVqZWN0ZWQucHVzaChyZXNvbHZlcihvblJlamVjdGVkLCBuZXh0LCAncmVqZWN0JykpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi4zLzIuMi42XSAgKi9cbiAgICBleGVjdXRlKGN1cnIpO1xuICAgIHJldHVybiBuZXh0LnByb3h5OyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LCAzLjNdICAqL1xuICB9XG59O1xuXG4vKiAgZGVsaXZlciBhbiBhY3Rpb24gICovXG52YXIgZGVsaXZlciA9IGZ1bmN0aW9uIGRlbGl2ZXIoY3Vyciwgc3RhdGUsIG5hbWUsIHZhbHVlKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9QRU5ESU5HKSB7XG4gICAgY3Vyci5zdGF0ZSA9IHN0YXRlOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4yLjEsIDIuMS4zLjFdICAqL1xuICAgIGN1cnJbbmFtZV0gPSB2YWx1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMi4yLCAyLjEuMy4yXSAgKi9cbiAgICBleGVjdXRlKGN1cnIpO1xuICB9XG4gIHJldHVybiBjdXJyO1xufTtcblxuLyogIGV4ZWN1dGUgYWxsIGhhbmRsZXJzICAqL1xudmFyIGV4ZWN1dGUgPSBmdW5jdGlvbiBleGVjdXRlKGN1cnIpIHtcbiAgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX0ZVTEZJTExFRCkgZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCAnb25GdWxmaWxsZWQnLCBjdXJyLmZ1bGZpbGxWYWx1ZSk7ZWxzZSBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUkVKRUNURUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uUmVqZWN0ZWQnLCBjdXJyLnJlamVjdFJlYXNvbik7XG59O1xuXG4vKiAgZXhlY3V0ZSBwYXJ0aWN1bGFyIHNldCBvZiBoYW5kbGVycyAgKi9cbnZhciBleGVjdXRlX2hhbmRsZXJzID0gZnVuY3Rpb24gZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCBuYW1lLCB2YWx1ZSkge1xuICAvKiBnbG9iYWwgc2V0SW1tZWRpYXRlOiB0cnVlICovXG4gIC8qIGdsb2JhbCBzZXRUaW1lb3V0OiB0cnVlICovXG5cbiAgLyogIHNob3J0LWNpcmN1aXQgcHJvY2Vzc2luZyAgKi9cbiAgaWYgKGN1cnJbbmFtZV0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgLyogIGl0ZXJhdGUgb3ZlciBhbGwgaGFuZGxlcnMsIGV4YWN0bHkgb25jZSAgKi9cbiAgdmFyIGhhbmRsZXJzID0gY3VycltuYW1lXTtcbiAgY3VycltuYW1lXSA9IFtdOyAvKiAgW1Byb21pc2VzL0ErIDIuMi4yLjMsIDIuMi4zLjNdICAqL1xuICB2YXIgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGFuZGxlcnNbaV0odmFsdWUpO1xuICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuNV0gICovXG4gIH07XG5cbiAgLyogIGV4ZWN1dGUgcHJvY2VkdXJlIGFzeW5jaHJvbm91c2x5ICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMi40LCAzLjFdICAqL1xuICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykgc2V0SW1tZWRpYXRlKGZ1bmMpO2Vsc2Ugc2V0VGltZW91dChmdW5jLCAwKTtcbn07XG5cbi8qICBnZW5lcmF0ZSBhIHJlc29sdmVyIGZ1bmN0aW9uICAqL1xudmFyIHJlc29sdmVyID0gZnVuY3Rpb24gcmVzb2x2ZXIoY2IsIG5leHQsIG1ldGhvZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgLyogIFtQcm9taXNlcy9BKyAyLjIuMSwgMi4yLjcuMywgMi4yLjcuNF0gICovXG4gICAgICBuZXh0W21ldGhvZF0uY2FsbChuZXh0LCB2YWx1ZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMywgMi4yLjcuNF0gICovZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gY2IodmFsdWUpO1xuICAgICAgfSAvKiAgW1Byb21pc2VzL0ErIDIuMi4yLjEsIDIuMi4zLjEsIDIuMi41LCAzLjJdICAqLyBjYXRjaCAoZSkge1xuICAgICAgICBuZXh0LnJlamVjdChlKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4yXSAgKi9cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShuZXh0LCByZXN1bHQpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjFdICAqL1xuICAgIH1cbiAgfTtcbn07XG5cbi8qICBcIlByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmVcIiAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjNdICAqL1xudmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHgpIHtcbiAgLyogIHNhbml0eSBjaGVjayBhcmd1bWVudHMgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjFdICAqL1xuICBpZiAocHJvbWlzZSA9PT0geCB8fCBwcm9taXNlLnByb3h5ID09PSB4KSB7XG4gICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignY2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgc3VyZ2ljYWxseSBjaGVjayBmb3IgYSBcInRoZW5cIiBtZXRob2RcbiAgICAobWFpbmx5IHRvIGp1c3QgY2FsbCB0aGUgXCJnZXR0ZXJcIiBvZiBcInRoZW5cIiBvbmx5IG9uY2UpICAqL1xuICB2YXIgdGhlbjtcbiAgaWYgKF90eXBlb2YoeCkgPT09ICdvYmplY3QnICYmIHggIT09IG51bGwgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdGhlbiA9IHgudGhlbjtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMSwgMy41XSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgIHByb21pc2UucmVqZWN0KGUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjJdICAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qICBoYW5kbGUgb3duIFRoZW5hYmxlcyAgICBbUHJvbWlzZXMvQSsgMi4zLjJdXG4gICAgYW5kIHNpbWlsYXIgXCJ0aGVuYWJsZXNcIiBbUHJvbWlzZXMvQSsgMi4zLjNdICAqL1xuICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLyogIGNhbGwgcmV0cmlldmVkIFwidGhlblwiIG1ldGhvZCAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjNdICAqL1xuICAgICAgdGhlbi5jYWxsKHgsIC8qICByZXNvbHZlUHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjFdICAqL1xuICAgICAgZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBpZiAoeSA9PT0geCkgLyogIFtQcm9taXNlcy9BKyAzLjZdICAqL1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2NpcmN1bGFyIHRoZW5hYmxlIGNoYWluJykpO2Vsc2UgcmVzb2x2ZShwcm9taXNlLCB5KTtcbiAgICAgIH0sIC8qICByZWplY3RQcm9taXNlICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuMl0gICovXG4gICAgICBmdW5jdGlvbiAocikge1xuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuM10gICovXG4gICAgICAgIHByb21pc2UucmVqZWN0KHIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFyZXNvbHZlZCkgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChlKTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjRdICAqL1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qICBoYW5kbGUgb3RoZXIgdmFsdWVzICAqL1xuICBwcm9taXNlLmZ1bGZpbGwoeCk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjQsIDIuMy4zLjRdICAqL1xufTtcblxuLy8gc28gd2UgYWx3YXlzIGhhdmUgUHJvbWlzZS5hbGwoKVxuYXBpLmFsbCA9IGZ1bmN0aW9uIChwcykge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZUFsbCwgcmVqZWN0QWxsKSB7XG4gICAgdmFyIHZhbHMgPSBuZXcgQXJyYXkocHMubGVuZ3RoKTtcbiAgICB2YXIgZG9uZUNvdW50ID0gMDtcbiAgICB2YXIgZnVsZmlsbCA9IGZ1bmN0aW9uIGZ1bGZpbGwoaSwgdmFsKSB7XG4gICAgICB2YWxzW2ldID0gdmFsO1xuICAgICAgZG9uZUNvdW50Kys7XG4gICAgICBpZiAoZG9uZUNvdW50ID09PSBwcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZUFsbCh2YWxzKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIChmdW5jdGlvbiAoaSkge1xuICAgICAgICB2YXIgcCA9IHBzW2ldO1xuICAgICAgICB2YXIgaXNQcm9taXNlID0gcCAhPSBudWxsICYmIHAudGhlbiAhPSBudWxsO1xuICAgICAgICBpZiAoaXNQcm9taXNlKSB7XG4gICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoaSwgdmFsKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3RBbGwoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdmFsID0gcDtcbiAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pKGkpO1xuICAgIH1cbiAgfSk7XG59O1xuYXBpLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiBuZXcgYXBpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXNvbHZlKHZhbCk7XG4gIH0pO1xufTtcbmFwaS5yZWplY3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiBuZXcgYXBpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWplY3QodmFsKTtcbiAgfSk7XG59O1xudmFyIFByb21pc2UkMSA9IHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IFByb21pc2UgOiBhcGk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIEFuaW1hdGlvbiA9IGZ1bmN0aW9uIEFuaW1hdGlvbih0YXJnZXQsIG9wdHMsIG9wdHMyKSB7XG4gIHZhciBpc0NvcmUgPSBjb3JlKHRhcmdldCk7XG4gIHZhciBpc0VsZSA9ICFpc0NvcmU7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSBleHRlbmQoe1xuICAgIGR1cmF0aW9uOiAxMDAwXG4gIH0sIG9wdHMsIG9wdHMyKTtcbiAgX3AudGFyZ2V0ID0gdGFyZ2V0O1xuICBfcC5zdHlsZSA9IF9wLnN0eWxlIHx8IF9wLmNzcztcbiAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gIF9wLmhvb2tlZCA9IGZhbHNlO1xuICBfcC5hcHBseWluZyA9IGZhbHNlO1xuICBfcC5wcm9ncmVzcyA9IDA7XG4gIF9wLmNvbXBsZXRlcyA9IFtdO1xuICBfcC5mcmFtZXMgPSBbXTtcbiAgaWYgKF9wLmNvbXBsZXRlICYmIGZuJDYoX3AuY29tcGxldGUpKSB7XG4gICAgX3AuY29tcGxldGVzLnB1c2goX3AuY29tcGxldGUpO1xuICB9XG4gIGlmIChpc0VsZSkge1xuICAgIHZhciBwb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgICBfcC5zdGFydFBvc2l0aW9uID0gX3Auc3RhcnRQb3NpdGlvbiB8fCB7XG4gICAgICB4OiBwb3MueCxcbiAgICAgIHk6IHBvcy55XG4gICAgfTtcbiAgICBfcC5zdGFydFN0eWxlID0gX3Auc3RhcnRTdHlsZSB8fCB0YXJnZXQuY3koKS5zdHlsZSgpLmdldEFuaW1hdGlvblN0YXJ0U3R5bGUodGFyZ2V0LCBfcC5zdHlsZSk7XG4gIH1cbiAgaWYgKGlzQ29yZSkge1xuICAgIHZhciBwYW4gPSB0YXJnZXQucGFuKCk7XG4gICAgX3Auc3RhcnRQYW4gPSB7XG4gICAgICB4OiBwYW4ueCxcbiAgICAgIHk6IHBhbi55XG4gICAgfTtcbiAgICBfcC5zdGFydFpvb20gPSB0YXJnZXQuem9vbSgpO1xuICB9XG5cbiAgLy8gZm9yIGZ1dHVyZSB0aW1lbGluZS9hbmltYXRpb25zIGltcGxcbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpcztcbn07XG52YXIgYW5pZm4gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuZXh0ZW5kKGFuaWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2FuaW1hdGlvbic7XG4gIH0sXG4gIGhvb2s6IGZ1bmN0aW9uIGhvb2soKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmhvb2tlZCkge1xuICAgICAgLy8gYWRkIHRvIHRhcmdldCdzIGFuaW1hdGlvbiBxdWV1ZVxuICAgICAgdmFyIHE7XG4gICAgICB2YXIgdEFuaSA9IF9wLnRhcmdldC5fcHJpdmF0ZS5hbmltYXRpb247XG4gICAgICBpZiAoX3AucXVldWUpIHtcbiAgICAgICAgcSA9IHRBbmkucXVldWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxID0gdEFuaS5jdXJyZW50O1xuICAgICAgfVxuICAgICAgcS5wdXNoKHRoaXMpO1xuXG4gICAgICAvLyBhZGQgdG8gdGhlIGFuaW1hdGlvbiBsb29wIHBvb2xcbiAgICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKF9wLnRhcmdldCkpIHtcbiAgICAgICAgX3AudGFyZ2V0LmN5KCkuYWRkVG9BbmltYXRpb25Qb29sKF9wLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBfcC5ob29rZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgLy8gYXV0b3Jld2luZFxuICAgIGlmIChfcC5wcm9ncmVzcyA9PT0gMSkge1xuICAgICAgX3AucHJvZ3Jlc3MgPSAwO1xuICAgIH1cbiAgICBfcC5wbGF5aW5nID0gdHJ1ZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7IC8vIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYnkgYW5pbWF0aW9uIGxvb3BcbiAgICBfcC5zdG9wcGVkID0gZmFsc2U7XG4gICAgdGhpcy5ob29rKCk7XG5cbiAgICAvLyB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBzdGFydCB0aGUgYW5pbWF0aW9uLi4uXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheWluZzogZnVuY3Rpb24gcGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wbGF5aW5nO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5hcHBseWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgYXBwbHkgdGhlIGFuaW1hdGlvbiBhdCB0aGlzIHByb2dyZXNzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYXBwbHlpbmc6IGZ1bmN0aW9uIGFwcGx5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmFwcGx5aW5nO1xuICB9LFxuICBwYXVzZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBfcC5zdG9wcGVkID0gdHJ1ZTsgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIGFuaW1hdGlvbiBxdWV1ZXNcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXdpbmQ6IGZ1bmN0aW9uIHJld2luZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygwKTtcbiAgfSxcbiAgZmFzdGZvcndhcmQ6IGZ1bmN0aW9uIGZhc3Rmb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyZXNzKDEpO1xuICB9LFxuICB0aW1lOiBmdW5jdGlvbiB0aW1lKHQpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfcC5wcm9ncmVzcyAqIF9wLmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcyh0IC8gX3AuZHVyYXRpb24pO1xuICAgIH1cbiAgfSxcbiAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIHByb2dyZXNzKHApIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB3YXNQbGF5aW5nID0gX3AucGxheWluZztcbiAgICBpZiAocCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIF9wLnByb2dyZXNzID0gcDtcbiAgICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29tcGxldGVkOiBmdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucHJvZ3Jlc3MgPT09IDE7XG4gIH0sXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gICAgX3AucHJvZ3Jlc3MgPSAxIC0gX3AucHJvZ3Jlc3M7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHZhciBzd2FwID0gZnVuY3Rpb24gc3dhcChhLCBiKSB7XG4gICAgICB2YXIgX3BhID0gX3BbYV07XG4gICAgICBpZiAoX3BhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3BbYV0gPSBfcFtiXTtcbiAgICAgIF9wW2JdID0gX3BhO1xuICAgIH07XG4gICAgc3dhcCgnem9vbScsICdzdGFydFpvb20nKTtcbiAgICBzd2FwKCdwYW4nLCAnc3RhcnRQYW4nKTtcbiAgICBzd2FwKCdwb3NpdGlvbicsICdzdGFydFBvc2l0aW9uJyk7XG5cbiAgICAvLyBzd2FwIHN0eWxlc1xuICAgIGlmIChfcC5zdHlsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IF9wLnN0eWxlW2ldO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHN0YXJ0U3R5bGVQcm9wID0gX3Auc3RhcnRTdHlsZVtuYW1lXTtcbiAgICAgICAgX3Auc3RhcnRTdHlsZVtuYW1lXSA9IHByb3A7XG4gICAgICAgIF9wLnN0eWxlW2ldID0gc3RhcnRTdHlsZVByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHByb21pc2U6IGZ1bmN0aW9uIHByb21pc2UodHlwZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGFycjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgICAgYXJyID0gX3AuZnJhbWVzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBhcnIgPSBfcC5jb21wbGV0ZXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFyci5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuYW5pZm4uY29tcGxldGUgPSBhbmlmbi5jb21wbGV0ZWQ7XG5hbmlmbi5ydW4gPSBhbmlmbi5wbGF5O1xuYW5pZm4ucnVubmluZyA9IGFuaWZuLnBsYXlpbmc7XG5cbnZhciBkZWZpbmUkMyA9IHtcbiAgYW5pbWF0ZWQ6IGZ1bmN0aW9uIGFuaW1hdGVkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlZEltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGVsZSA9IGFsbFswXTtcbiAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5hbmltYXRpb24uY3VycmVudC5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVkXG5cbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYXJRdWV1ZUltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9LFxuICAvLyBjbGVhclF1ZXVlXG5cbiAgZGVsYXk6IGZ1bmN0aW9uIGRlbGF5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgZGVsYXlBbmltYXRpb246IGZ1bmN0aW9uIGRlbGF5QW5pbWF0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbkltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRpb24oe1xuICAgICAgICBkZWxheTogdGltZSxcbiAgICAgICAgZHVyYXRpb246IHRpbWUsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZGVsYXlcblxuICBhbmltYXRpb246IGZ1bmN0aW9uIGFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0aW9uSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgdmFyIGlzQ29yZSA9ICFzZWxmSXNBcnJheUxpa2U7XG4gICAgICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIHZhciBwcm9wZXJ0aWVzRW1wdHkgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5sZW5ndGggPT09IDA7XG4gICAgICBpZiAocHJvcGVydGllc0VtcHR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKGFsbFswXSwgcHJvcGVydGllcyk7IC8vIG5vdGhpbmcgdG8gYW5pbWF0ZVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydGllcy5kdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA0MDA7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHByb3BlcnRpZXMuZHVyYXRpb24pIHtcbiAgICAgICAgY2FzZSAnc2xvdyc6XG4gICAgICAgICAgcHJvcGVydGllcy5kdXJhdGlvbiA9IDYwMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmFzdCc6XG4gICAgICAgICAgcHJvcGVydGllcy5kdXJhdGlvbiA9IDIwMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChpc0VsZXMpIHtcbiAgICAgICAgcHJvcGVydGllcy5zdHlsZSA9IHN0eWxlLmdldFByb3BzTGlzdChwcm9wZXJ0aWVzLnN0eWxlIHx8IHByb3BlcnRpZXMuY3NzKTtcbiAgICAgICAgcHJvcGVydGllcy5jc3MgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzICYmIHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHZhciBycG9zID0gcHJvcGVydGllcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBvc2l0aW9uID0gcmVuZGVyZWRUb01vZGVsUG9zaXRpb24ocnBvcywgem9vbSwgcGFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgcGFuIHcvIHBhbkJ5IGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwcm9wZXJ0aWVzLnBhbkJ5ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHBhbkJ5ID0gcHJvcGVydGllcy5wYW5CeTtcbiAgICAgICAgdmFyIGN5UGFuID0gY3kucGFuKCk7XG4gICAgICAgIHByb3BlcnRpZXMucGFuID0ge1xuICAgICAgICAgIHg6IGN5UGFuLnggKyBwYW5CeS54LFxuICAgICAgICAgIHk6IGN5UGFuLnkgKyBwYW5CeS55XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBjZW50ZXIgaWYgc2V0XG4gICAgICB2YXIgY2VudGVyID0gcHJvcGVydGllcy5jZW50ZXIgfHwgcHJvcGVydGllcy5jZW50cmU7XG4gICAgICBpZiAoaXNDb3JlICYmIGNlbnRlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjZW50ZXJQYW4gPSBjeS5nZXRDZW50ZXJQYW4oY2VudGVyLmVsZXMsIHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmIChjZW50ZXJQYW4gIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gY2VudGVyUGFuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiAmIHpvb20gdy8gZml0IGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwcm9wZXJ0aWVzLmZpdCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBmaXQgPSBwcm9wZXJ0aWVzLmZpdDtcbiAgICAgICAgdmFyIGZpdFZwID0gY3kuZ2V0Rml0Vmlld3BvcnQoZml0LmVsZXMgfHwgZml0LmJvdW5kaW5nQm94LCBmaXQucGFkZGluZyk7XG4gICAgICAgIGlmIChmaXRWcCAhPSBudWxsKSB7XG4gICAgICAgICAgcHJvcGVydGllcy5wYW4gPSBmaXRWcC5wYW47XG4gICAgICAgICAgcHJvcGVydGllcy56b29tID0gZml0VnAuem9vbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSB6b29tICgmIHBvdGVudGlhbGx5IHBhbikgdy8gem9vbSBvYmogaWYgc2V0XG4gICAgICBpZiAoaXNDb3JlICYmIHBsYWluT2JqZWN0KHByb3BlcnRpZXMuem9vbSkpIHtcbiAgICAgICAgdmFyIHZwID0gY3kuZ2V0Wm9vbWVkVmlld3BvcnQocHJvcGVydGllcy56b29tKTtcbiAgICAgICAgaWYgKHZwICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodnAuem9vbWVkKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnpvb20gPSB2cC56b29tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHZwLnBhbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydGllcy56b29tID0gbnVsbDsgLy8gYW4gaW5hdmFsaWQgem9vbSAoZS5nLiBubyBkZWx0YSkgZ2V0cyBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKGFsbFswXSwgcHJvcGVydGllcyk7XG4gICAgfTtcbiAgfSxcbiAgLy8gYW5pbWF0ZVxuXG4gIGFuaW1hdGU6IGZ1bmN0aW9uIGFuaW1hdGUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGVJbXBsKHByb3BlcnRpZXMsIHBhcmFtcykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICBwcm9wZXJ0aWVzID0gZXh0ZW5kKHt9LCBwcm9wZXJ0aWVzLCBwYXJhbXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBtYW51YWxseSBob29rIGFuZCBydW4gdGhlIGFuaW1hdGlvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgdmFyIHF1ZXVlID0gZWxlLmFuaW1hdGVkKCkgJiYgKHByb3BlcnRpZXMucXVldWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wZXJ0aWVzLnF1ZXVlKTtcbiAgICAgICAgdmFyIGFuaSA9IGVsZS5hbmltYXRpb24ocHJvcGVydGllcywgcXVldWUgPyB7XG4gICAgICAgICAgcXVldWU6IHRydWVcbiAgICAgICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGFuaS5wbGF5KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9O1xuICB9LFxuXG4gIC8vIGFuaW1hdGVcblxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzdG9wSW1wbChjbGVhclF1ZXVlLCBqdW1wVG9FbmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGFuaXMgPSBfcC5hbmltYXRpb24uY3VycmVudDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbmlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IGFuaXNbal07XG4gICAgICAgICAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICAgICAgICAgIGlmIChqdW1wVG9FbmQpIHtcbiAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBhbmltYXRpb24gbG9vcCwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gd2lsbCBnbyBzdHJhaWdodCB0byB0aGUgZW5kIGFuZCBiZSByZW1vdmVkXG4gICAgICAgICAgICBhbmlfcC5kdXJhdGlvbiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgdGhlIHF1ZXVlIG9mIGZ1dHVyZSBhbmltYXRpb25zXG4gICAgICAgIGlmIChjbGVhclF1ZXVlKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFqdW1wVG9FbmQpIHtcbiAgICAgICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGhhdmUgdG8gbm90aWZ5ICh0aGUgYW5pbWF0aW9uIGxvb3AgZG9lc24ndCBkbyBpdCBmb3IgdXMgb24gYHN0b3BgKVxuICAgICAgY3kubm90aWZ5KCdkcmF3Jyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9IC8vIHN0b3Bcbn07IC8vIGRlZmluZVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGlzQXJyYXlfMSA9IGlzQXJyYXk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5XzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sXzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG59XG5cbnZhciBfaXNLZXkgPSBpc0tleTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0XzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IF9iYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxudmFyIGlzRnVuY3Rpb25fMSA9IGlzRnVuY3Rpb247XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gX3Jvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG52YXIgX2NvcmVKc0RhdGEgPSBjb3JlSnNEYXRhO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKF9jb3JlSnNEYXRhICYmIF9jb3JlSnNEYXRhLmtleXMgJiYgX2NvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG52YXIgX2lzTWFza2VkID0gaXNNYXNrZWQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8kMSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyQxID0gZnVuY1Byb3RvJDEudG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZyQxLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgX3RvU291cmNlID0gdG9Tb3VyY2U7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvJDMgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSQzID0gb2JqZWN0UHJvdG8kMy5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5JDMpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0XzEodmFsdWUpIHx8IF9pc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uXzEodmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdChfdG9Tb3VyY2UodmFsdWUpKTtcbn1cblxudmFyIF9iYXNlSXNOYXRpdmUgPSBiYXNlSXNOYXRpdmU7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlJDEob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbnZhciBfZ2V0VmFsdWUgPSBnZXRWYWx1ZSQxO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gX2dldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIF9iYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbnZhciBfZ2V0TmF0aXZlID0gZ2V0TmF0aXZlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gX2dldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxudmFyIF9uYXRpdmVDcmVhdGUgPSBuYXRpdmVDcmVhdGU7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IF9uYXRpdmVDcmVhdGUgPyBfbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbnZhciBfaGFzaENsZWFyID0gaGFzaENsZWFyO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgX2hhc2hEZWxldGUgPSBoYXNoRGVsZXRlO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQkMSA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvJDIgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSQyID0gb2JqZWN0UHJvdG8kMi5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKF9uYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEJDEgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5JDIuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG52YXIgX2hhc2hHZXQgPSBoYXNoR2V0O1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8kMSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5JDEgPSBvYmplY3RQcm90byQxLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIF9uYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkkMS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbnZhciBfaGFzaEhhcyA9IGhhc2hIYXM7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKF9uYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxudmFyIF9oYXNoU2V0ID0gaGFzaFNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IF9oYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBfaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IF9oYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gX2hhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBfaGFzaFNldDtcblxudmFyIF9IYXNoID0gSGFzaDtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG52YXIgX2xpc3RDYWNoZUNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5cbi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG52YXIgZXFfMSA9IGVxO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXFfMShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbnZhciBfYXNzb2NJbmRleE9mID0gYXNzb2NJbmRleE9mO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBfYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgX2xpc3RDYWNoZURlbGV0ZSA9IGxpc3RDYWNoZURlbGV0ZTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IF9hc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbnZhciBfbGlzdENhY2hlR2V0ID0gbGlzdENhY2hlR2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gX2Fzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbnZhciBfbGlzdENhY2hlSGFzID0gbGlzdENhY2hlSGFzO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gX2Fzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG52YXIgX2xpc3RDYWNoZVNldCA9IGxpc3RDYWNoZVNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBfbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IF9saXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IF9saXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IF9saXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IF9saXN0Q2FjaGVTZXQ7XG5cbnZhciBfTGlzdENhY2hlID0gTGlzdENhY2hlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwJDEgPSBfZ2V0TmF0aXZlKF9yb290LCAnTWFwJyk7XG5cbnZhciBfTWFwID0gTWFwJDE7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgX0hhc2gsXG4gICAgJ21hcCc6IG5ldyAoX01hcCB8fCBfTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IF9IYXNoXG4gIH07XG59XG5cbnZhciBfbWFwQ2FjaGVDbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxudmFyIF9pc0tleWFibGUgPSBpc0tleWFibGU7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBfaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbnZhciBfZ2V0TWFwRGF0YSA9IGdldE1hcERhdGE7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IF9nZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9tYXBDYWNoZURlbGV0ZSA9IG1hcENhY2hlRGVsZXRlO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG52YXIgX21hcENhY2hlR2V0ID0gbWFwQ2FjaGVHZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG52YXIgX21hcENhY2hlSGFzID0gbWFwQ2FjaGVIYXM7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IF9nZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbnZhciBfbWFwQ2FjaGVTZXQgPSBtYXBDYWNoZVNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IF9tYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IF9tYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBfbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gX21hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IF9tYXBDYWNoZVNldDtcblxudmFyIF9NYXBDYWNoZSA9IE1hcENhY2hlO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBfTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IF9NYXBDYWNoZTtcblxudmFyIG1lbW9pemVfMSA9IG1lbW9pemU7XG5cbi8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbnZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG1lbW9pemVfMShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgX21lbW9pemVDYXBwZWQgPSBtZW1vaXplQ2FwcGVkO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IF9tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG52YXIgX3N0cmluZ1RvUGF0aCA9IHN0cmluZ1RvUGF0aDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9hcnJheU1hcCA9IGFycmF5TWFwO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSQxID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gX1N5bWJvbCA/IF9TeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheV8xKHZhbHVlKSkge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgcmV0dXJuIF9hcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbF8xKHZhbHVlKSkge1xuICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSQxKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbnZhciBfYmFzZVRvU3RyaW5nID0gYmFzZVRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmckMSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogX2Jhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbnZhciB0b1N0cmluZ18xID0gdG9TdHJpbmckMTtcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIF9pc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBfc3RyaW5nVG9QYXRoKHRvU3RyaW5nXzEodmFsdWUpKTtcbn1cblxudmFyIF9jYXN0UGF0aCA9IGNhc3RQYXRoO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2xfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG52YXIgX3RvS2V5ID0gdG9LZXk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gX2Nhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFtfdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxudmFyIF9iYXNlR2V0ID0gYmFzZUdldDtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IF9iYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbn1cblxudmFyIGdldF8xID0gZ2V0O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBfZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBfZGVmaW5lUHJvcGVydHkpIHtcbiAgICBfZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG52YXIgX2Jhc2VBc3NpZ25WYWx1ZSA9IGJhc2VBc3NpZ25WYWx1ZTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXFfMShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBfYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxudmFyIF9hc3NpZ25WYWx1ZSA9IGFzc2lnblZhbHVlO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbnZhciBfaXNJbmRleCA9IGlzSW5kZXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGlmICghaXNPYmplY3RfMShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gX2Nhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gX3RvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdF8xKG9ialZhbHVlKVxuICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICA6IChfaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIF9hc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciBfYmFzZVNldCA9IGJhc2VTZXQ7XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gKiBgcGF0aGAgY3JlYXRpb24uXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICogLy8gPT4gNFxuICpcbiAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAqIC8vID0+IDVcbiAqL1xuZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogX2Jhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG59XG5cbnZhciBzZXRfMSA9IHNldDtcblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbnZhciBfY29weUFycmF5ID0gY29weUFycmF5O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAqXG4gKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gKi9cbmZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICBpZiAoaXNBcnJheV8xKHZhbHVlKSkge1xuICAgIHJldHVybiBfYXJyYXlNYXAodmFsdWUsIF90b0tleSk7XG4gIH1cbiAgcmV0dXJuIGlzU3ltYm9sXzEodmFsdWUpID8gW3ZhbHVlXSA6IF9jb3B5QXJyYXkoX3N0cmluZ1RvUGF0aCh0b1N0cmluZ18xKHZhbHVlKSkpO1xufVxuXG52YXIgdG9QYXRoXzEgPSB0b1BhdGg7XG5cbnZhciBkZWZpbmUkMiA9IHtcbiAgLy8gYWNjZXNzIGRhdGEgZmllbGRcbiAgZGF0YTogZnVuY3Rpb24gZGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgICAgYWxsb3dTZXR0aW5nOiBmYWxzZSxcbiAgICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIGltbXV0YWJsZUtleXM6IHt9LFxuICAgICAgLy8ga2V5ID0+IHRydWUgaWYgaW1tdXRhYmxlXG4gICAgICB1cGRhdGVTdHlsZTogZmFsc2UsXG4gICAgICBiZWZvcmVHZXQ6IGZ1bmN0aW9uIGJlZm9yZUdldChzZWxmKSB7fSxcbiAgICAgIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KHNlbGYsIG9iaikge30sXG4gICAgICBvblNldDogZnVuY3Rpb24gb25TZXQoc2VsZikge30sXG4gICAgICBjYW5TZXQ6IGZ1bmN0aW9uIGNhblNldChzZWxmKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGF0YUltcGwobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgc2luZ2xlID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZlswXSA6IHNlbGY7XG5cbiAgICAgIC8vIC5kYXRhKCdmb28nLCAuLi4pXG4gICAgICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICAgIC8vIHNldCBvciBnZXQgcHJvcGVydHlcbiAgICAgICAgdmFyIGlzUGF0aExpa2UgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTE7IC8vIHRoZXJlIG1pZ2h0IGJlIGEgbm9ybWFsIGZpZWxkIHdpdGggYSBkb3QgXG4gICAgICAgIHZhciBwYXRoID0gaXNQYXRoTGlrZSAmJiB0b1BhdGhfMShuYW1lKTtcblxuICAgICAgICAvLyAuZGF0YSgnZm9vJylcbiAgICAgICAgaWYgKHAuYWxsb3dHZXR0aW5nICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBnZXRcblxuICAgICAgICAgIHZhciByZXQ7XG4gICAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgICAgcC5iZWZvcmVHZXQoc2luZ2xlKTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBwYXRoIGFuZCBhIGZpZWxkIHdpdGggdGhlIHNhbWUgbmFtZSBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBpZiAocGF0aCAmJiBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXQgPSBnZXRfMShzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF0sIHBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0ID0gc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0O1xuXG4gICAgICAgICAgLy8gLmRhdGEoJ2ZvbycsICdiYXInKVxuICAgICAgICB9IGVsc2UgaWYgKHAuYWxsb3dTZXR0aW5nICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBzZXRcbiAgICAgICAgICB2YXIgdmFsaWQgPSAhcC5pbW11dGFibGVLZXlzW25hbWVdO1xuICAgICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF9kZWZpbmVQcm9wZXJ0eSQxKHt9LCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBjaGFuZ2UpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbGwubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgICAgICAgIGlmIChwLmNhblNldChlbGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHNldF8xKGVsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbCBvblNldCBjYWxsYmFja1xuICAgICAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoeyAnZm9vJzogJ2JhcicgfSlcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwga2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBrID0ga2V5c1tfaV07XG4gICAgICAgICAgdiA9IG9ialtrXTtcbiAgICAgICAgICB2YXIgX3ZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trXTtcbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KF9lbGUpKSB7XG4gICAgICAgICAgICAgICAgX2VsZS5fcHJpdmF0ZVtwLmZpZWxkXVtrXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgaWYgKHAuc2V0dGluZ1RyaWdnZXJzRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dCaW5kaW5nICYmIGZuJDYobmFtZSkpIHtcbiAgICAgICAgLy8gYmluZCB0byBldmVudFxuICAgICAgICB2YXIgZm4gPSBuYW1lO1xuICAgICAgICBzZWxmLm9uKHAuYmluZGluZ0V2ZW50LCBmbik7XG5cbiAgICAgICAgLy8gLmRhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93R2V0dGluZyAmJiBuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZ2V0IHdob2xlIG9iamVjdFxuICAgICAgICB2YXIgX3JldDtcbiAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG4gICAgICAgICAgX3JldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmFiaWxpdHlcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9LFxuXG4gIC8vIGRhdGFcblxuICAvLyByZW1vdmUgZGF0YSBmaWVsZFxuICByZW1vdmVEYXRhOiBmdW5jdGlvbiByZW1vdmVEYXRhKHBhcmFtcykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGZpZWxkOiAnZGF0YScsXG4gICAgICBldmVudDogJ2RhdGEnLFxuICAgICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgICAgdHJpZ2dlckV2ZW50OiBmYWxzZSxcbiAgICAgIGltbXV0YWJsZUtleXM6IHt9IC8vIGtleSA9PiB0cnVlIGlmIGltbXV0YWJsZVxuICAgIH07XG5cbiAgICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHJldHVybiBmdW5jdGlvbiByZW1vdmVEYXRhSW1wbChuYW1lcykge1xuICAgICAgdmFyIHAgPSBwYXJhbXM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgLy8gLnJlbW92ZURhdGEoJ2ZvbyBiYXInKVxuICAgICAgaWYgKHN0cmluZyhuYW1lcykpIHtcbiAgICAgICAgLy8gdGhlbiBnZXQgdGhlIGxpc3Qgb2Yga2V5cywgYW5kIGRlbGV0ZSB0aGVtXG4gICAgICAgIHZhciBrZXlzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcbiAgICAgICAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAvLyBkZWxldGUgZWFjaCBub24tZW1wdHkga2V5XG4gICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGVtcHR5U3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdmFsaWQgPSAhcC5pbW11dGFibGVLZXlzW2tleV07IC8vIG5vdCB2YWxpZCBpZiBpbW11dGFibGVcbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlfYSA9IDAsIGxfYSA9IGFsbC5sZW5ndGg7IGlfYSA8IGxfYTsgaV9hKyspIHtcbiAgICAgICAgICAgICAgYWxsW2lfYV0uX3ByaXZhdGVbcC5maWVsZF1ba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLnJlbW92ZURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChuYW1lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRoZW4gZGVsZXRlIGFsbCBrZXlzXG5cbiAgICAgICAgZm9yICh2YXIgX2lfYSA9IDAsIF9sX2EgPSBhbGwubGVuZ3RoOyBfaV9hIDwgX2xfYTsgX2lfYSsrKSB7XG4gICAgICAgICAgdmFyIF9wcml2YXRlRmllbGRzID0gYWxsW19pX2FdLl9wcml2YXRlW3AuZmllbGRdO1xuICAgICAgICAgIHZhciBfa2V5cyA9IE9iamVjdC5rZXlzKF9wcml2YXRlRmllbGRzKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfa2V5cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgICB2YXIgX2tleSA9IF9rZXlzW19pMl07XG4gICAgICAgICAgICB2YXIgdmFsaWRLZXlUb0RlbGV0ZSA9ICFwLmltbXV0YWJsZUtleXNbX2tleV07XG4gICAgICAgICAgICBpZiAodmFsaWRLZXlUb0RlbGV0ZSkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZUZpZWxkc1tfa2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbWFpbnRhaW4gY2hhaW5pbmdcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9IC8vIHJlbW92ZURhdGFcbn07IC8vIGRlZmluZVxuXG52YXIgZGVmaW5lJDEgPSB7XG4gIGV2ZW50QWxpYXNlc09uOiBmdW5jdGlvbiBldmVudEFsaWFzZXNPbihwcm90bykge1xuICAgIHZhciBwID0gcHJvdG87XG4gICAgcC5hZGRMaXN0ZW5lciA9IHAubGlzdGVuID0gcC5iaW5kID0gcC5vbjtcbiAgICBwLnVubGlzdGVuID0gcC51bmJpbmQgPSBwLm9mZiA9IHAucmVtb3ZlTGlzdGVuZXI7XG4gICAgcC50cmlnZ2VyID0gcC5lbWl0O1xuXG4gICAgLy8gdGhpcyBpcyBqdXN0IGEgd3JhcHBlciBhbGlhcyBvZiAub24oKVxuICAgIHAucG9uID0gcC5wcm9taXNlT24gPSBmdW5jdGlvbiAoZXZlbnRzLCBzZWxlY3Rvcikge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlKSB7XG4gICAgICAgICAgc2VsZi5vZmYuYXBwbHkoc2VsZiwgb2ZmQXJncyk7XG4gICAgICAgICAgcmVzb2x2ZShlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG9uQXJncyA9IGFyZ3MuY29uY2F0KFtjYWxsYmFja10pO1xuICAgICAgICB2YXIgb2ZmQXJncyA9IG9uQXJncy5jb25jYXQoW10pO1xuICAgICAgICBzZWxmLm9uLmFwcGx5KHNlbGYsIG9uQXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59OyAvLyBkZWZpbmVcblxuLy8gdXNlIHRoaXMgbW9kdWxlIHRvIGNoZXJyeSBwaWNrIGZ1bmN0aW9ucyBpbnRvIHlvdXIgcHJvdG90eXBlXG52YXIgZGVmaW5lID0ge307XG5bZGVmaW5lJDMsIGRlZmluZSQyLCBkZWZpbmUkMV0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBleHRlbmQoZGVmaW5lLCBtKTtcbn0pO1xuXG52YXIgZWxlc2ZuJGkgPSB7XG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpXG59O1xuXG52YXIgZWxlc2ZuJGggPSB7XG4gIGNsYXNzZXM6IGZ1bmN0aW9uIGNsYXNzZXMoX2NsYXNzZXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgIHNlbGZbMF0uX3ByaXZhdGUuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgICAgcmV0dXJuIHJldC5wdXNoKGNscyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBlbHNlIGlmICghYXJyYXkoX2NsYXNzZXMpKSB7XG4gICAgICAvLyBleHRyYWN0IGNsYXNzZXMgZnJvbSBzdHJpbmdcbiAgICAgIF9jbGFzc2VzID0gKF9jbGFzc2VzIHx8ICcnKS5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7XG5cbiAgICAvLyBjaGVjayBhbmQgdXBkYXRlIGVhY2ggZWxlXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltqXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gX3AuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGVsZSBoYXMgYWxsIG9mIHRoZSBwYXNzZWQgY2xhc3Nlc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIGlmICghZWxlSGFzQ2xhc3MpIHtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGNsYXNzZXMgb3V0c2lkZSBvZiB0aG9zZSBwYXNzZWRcbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZEVsZSkge1xuICAgICAgICBfcC5jbGFzc2VzID0gY2xhc3Nlc1NldDtcbiAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBhZGRDbGFzczogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRydWUpO1xuICB9LFxuICBoYXNDbGFzczogZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZSAhPSBudWxsICYmIGVsZS5fcHJpdmF0ZS5jbGFzc2VzLmhhcyhjbGFzc05hbWUpO1xuICB9LFxuICB0b2dnbGVDbGFzczogZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoY2xhc3NlcywgdG9nZ2xlKSB7XG4gICAgaWYgKCFhcnJheShjbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsYXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNscyA9IGNsYXNzZXNbal07XG4gICAgICAgIHZhciBoYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIHZhciBjaGFuZ2VkTm93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmICFoYXNDbGFzcykge1xuICAgICAgICAgIGVsZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRvZ2dsZSB8fCB0b2dnbGVVbmRlZmQgJiYgaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzW1wiZGVsZXRlXCJdKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG4gICAgfSAvLyBmb3IgaSBlbGVzXG5cbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICBkdXJhdGlvbiA9IDI1MDtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbm90aGluZyB0byBkbyByZWFsbHlcbiAgICB9XG5cbiAgICBzZWxmLmFkZENsYXNzKGNsYXNzZXMpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5yZW1vdmVDbGFzcyhjbGFzc2VzKTtcbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cbn07XG5lbGVzZm4kaC5jbGFzc05hbWUgPSBlbGVzZm4kaC5jbGFzc05hbWVzID0gZWxlc2ZuJGguY2xhc3NlcztcblxuLy8gdG9rZW5zIGluIHRoZSBxdWVyeSBsYW5ndWFnZVxudmFyIHRva2VucyA9IHtcbiAgbWV0YUNoYXI6ICdbXFxcXCFcXFxcXCJcXFxcI1xcXFwkXFxcXCVcXFxcJlxcXFxcXCdcXFxcKFxcXFwpXFxcXCpcXFxcK1xcXFwsXFxcXC5cXFxcL1xcXFw6XFxcXDtcXFxcPFxcXFw9XFxcXD5cXFxcP1xcXFxAXFxcXFtcXFxcXVxcXFxeXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl0nLFxuICAvLyBjaGFycyB3ZSBuZWVkIHRvIGVzY2FwZSBpbiBsZXQgbmFtZXMsIGV0Y1xuICBjb21wYXJhdG9yT3A6ICc9fFxcXFwhPXw+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+IDApIHtcbiAgICAgIHJpZ2h0VmFsID0gcmlnaHRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cbiAgICB2YXIgdG9wVmFsID0gbWluLmhlaWdodC50b3AudmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQudG9wLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgdG9wVmFsID0gdG9wVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciBib3R0b21WYWwgPSBtaW4uaGVpZ2h0LmJvdHRvbS52YWx1ZTtcbiAgICBpZiAobWluLmhlaWdodC5ib3R0b20udW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICBib3R0b21WYWwgPSBib3R0b21WYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG4gICAgdmFyIHdpZHRoQmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLndpZHRoLnZhbCAtIGJiLncsIGxlZnRWYWwsIHJpZ2h0VmFsKTtcbiAgICB2YXIgZGlmZkxlZnQgPSB3aWR0aEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZlJpZ2h0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIHZhciBoZWlnaHRCaWFzRGlmZnMgPSBjb21wdXRlQmlhc1ZhbHVlcyhtaW4uaGVpZ2h0LnZhbCAtIGJiLmgsIHRvcFZhbCwgYm90dG9tVmFsKTtcbiAgICB2YXIgZGlmZlRvcCA9IGhlaWdodEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZkJvdHRvbSA9IGhlaWdodEJpYXNEaWZmcy5iaWFzQ29tcGxlbWVudERpZmY7XG4gICAgX3AuYXV0b1BhZGRpbmcgPSBjb21wdXRlUGFkZGluZ1ZhbHVlcyhiYi53LCBiYi5oLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nJyksIHBhcmVudC5wc3R5bGUoJ3BhZGRpbmctcmVsYXRpdmUtdG8nKS52YWx1ZSk7XG4gICAgX3AuYXV0b1dpZHRoID0gTWF0aC5tYXgoYmIudywgbWluLndpZHRoLnZhbCk7XG4gICAgcG9zLnggPSAoLWRpZmZMZWZ0ICsgYmIueDEgKyBiYi54MiArIGRpZmZSaWdodCkgLyAyO1xuICAgIF9wLmF1dG9IZWlnaHQgPSBNYXRoLm1heChiYi5oLCBtaW4uaGVpZ2h0LnZhbCk7XG4gICAgcG9zLnkgPSAoLWRpZmZUb3AgKyBiYi55MSArIGJiLnkyICsgZGlmZkJvdHRvbSkgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gfHwgZm9yY2UpIHtcbiAgICAgIHVwZGF0ZShlbGUpO1xuICAgICAgaWYgKCFjeS5iYXRjaGluZygpKSB7XG4gICAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG52YXIgbm9uaW5mID0gZnVuY3Rpb24gbm9uaW5mKHgpIHtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB4O1xufTtcbnZhciB1cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoYiwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggemVybyBhcmVhIGJveGVzXG4gIGlmICh4MiAtIHgxID09PSAwIHx8IHkyIC0geTEgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBkb24ndCB1cGRhdGUgd2l0aCBudWxsIGRpbVxuICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHgyID09IG51bGwgfHwgeTIgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBiLngxID0geDEgPCBiLngxID8geDEgOiBiLngxO1xuICBiLngyID0geDIgPiBiLngyID8geDIgOiBiLngyO1xuICBiLnkxID0geTEgPCBiLnkxID8geTEgOiBiLnkxO1xuICBiLnkyID0geTIgPiBiLnkyID8geTIgOiBiLnkyO1xuICBiLncgPSBiLngyIC0gYi54MTtcbiAgYi5oID0gYi55MiAtIGIueTE7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21Cb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQm94KGIsIGIyKSB7XG4gIGlmIChiMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZUJvdW5kcyhiLCBiMi54MSwgYjIueTEsIGIyLngyLCBiMi55Mik7XG59O1xudmFyIHByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBwcmVmaXhlZFByb3BlcnR5KG9iaiwgZmllbGQsIHByZWZpeCkge1xuICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQXJyb3cgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBoYWxmQXJXID0gcnN0eWxlLmFycm93V2lkdGggLyAyO1xuICB2YXIgYXJyb3dUeXBlID0gZWxlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgaWYgKGFycm93VHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgIHggPSByc3R5bGUuc3JjWDtcbiAgICAgIHkgPSByc3R5bGUuc3JjWTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ3RhcmdldCcpIHtcbiAgICAgIHggPSByc3R5bGUudGd0WDtcbiAgICAgIHkgPSByc3R5bGUudGd0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHJzdHlsZS5taWRYO1xuICAgICAgeSA9IHJzdHlsZS5taWRZO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhcnJvdyBib3VuZHNcbiAgICB2YXIgYmJzID0gX3AuYXJyb3dCb3VuZHMgPSBfcC5hcnJvd0JvdW5kcyB8fCB7fTtcbiAgICB2YXIgYmIgPSBiYnNbcHJlZml4XSA9IGJic1twcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0geCAtIGhhbGZBclc7XG4gICAgYmIueTEgPSB5IC0gaGFsZkFyVztcbiAgICBiYi54MiA9IHggKyBoYWxmQXJXO1xuICAgIGJiLnkyID0geSArIGhhbGZBclc7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmIsIDEpO1xuICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJiLngxLCBiYi55MSwgYmIueDIsIGJiLnkyKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTGFiZWwgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcHJlZml4RGFzaDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gIH0gZWxzZSB7XG4gICAgcHJlZml4RGFzaCA9ICcnO1xuICB9XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChsYWJlbCkge1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpO1xuICAgIHZhciBsYWJlbFdpZHRoID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxIZWlnaHQgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxYID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFkgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICAgIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgaGFsZkJvcmRlcldpZHRoID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIHZhciBwYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5PZkVycm9yID0gMjsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgdmFyIGxoID0gbGFiZWxIZWlnaHQ7XG4gICAgdmFyIGx3ID0gbGFiZWxXaWR0aDtcbiAgICB2YXIgbHdfMiA9IGx3IC8gMjtcbiAgICB2YXIgbGhfMiA9IGxoIC8gMjtcbiAgICB2YXIgbHgxLCBseDIsIGx5MSwgbHkyO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGx4MSA9IGxhYmVsWCAtIGx3XzI7XG4gICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoaGFsaWduLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGx4MSA9IGxhYmVsWCAtIGx3O1xuICAgICAgICAgIGx4MiA9IGxhYmVsWDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3XzI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFg7XG4gICAgICAgICAgbHgyID0gbGFiZWxYICsgbHc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHZhbGlnbi52YWx1ZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWSAtIGxoO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaF8yO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNoaWZ0IGJ5IG1hcmdpbiBhbmQgZXhwYW5kIGJ5IG91dGxpbmUgYW5kIGJvcmRlclxuICAgIGx4MSArPSBtYXJnaW5YIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgbHgyICs9IG1hcmdpblggKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjtcbiAgICBseTEgKz0gbWFyZ2luWSAtIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSAtIHBhZGRpbmcgLSBtYXJnaW5PZkVycm9yO1xuICAgIGx5MiArPSBtYXJnaW5ZICsgTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpICsgcGFkZGluZyArIG1hcmdpbk9mRXJyb3I7XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIHVucm90YXRlZCBsYWJlbCBib3VuZHMgc2VwYXJhdGVseVxuICAgIHZhciBiYlByZWZpeCA9IHByZWZpeCB8fCAnbWFpbic7XG4gICAgdmFyIGJicyA9IF9wLmxhYmVsQm91bmRzO1xuICAgIHZhciBiYiA9IGJic1tiYlByZWZpeF0gPSBiYnNbYmJQcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0gbHgxO1xuICAgIGJiLnkxID0gbHkxO1xuICAgIGJiLngyID0gbHgyO1xuICAgIGJiLnkyID0gbHkyO1xuICAgIGJiLncgPSBseDIgLSBseDE7XG4gICAgYmIuaCA9IGx5MiAtIGx5MTtcbiAgICB2YXIgaXNBdXRvcm90YXRlID0gaXNFZGdlICYmIHJvdGF0aW9uLnN0clZhbHVlID09PSAnYXV0b3JvdGF0ZSc7XG4gICAgdmFyIGlzUGZWYWx1ZSA9IHJvdGF0aW9uLnBmVmFsdWUgIT0gbnVsbCAmJiByb3RhdGlvbi5wZlZhbHVlICE9PSAwO1xuICAgIGlmIChpc0F1dG9yb3RhdGUgfHwgaXNQZlZhbHVlKSB7XG4gICAgICB2YXIgdGhldGEgPSBpc0F1dG9yb3RhdGUgPyBwcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpIDogcm90YXRpb24ucGZWYWx1ZTtcbiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICB2YXIgc2luID0gTWF0aC5zaW4odGhldGEpO1xuXG4gICAgICAvLyByb3RhdGlvbiBwb2ludCAoZGVmYXVsdCB2YWx1ZSBmb3IgY2VudGVyLWNlbnRlcilcbiAgICAgIHZhciB4byA9IChseDEgKyBseDIpIC8gMjtcbiAgICAgIHZhciB5byA9IChseTEgKyBseTIpIC8gMjtcbiAgICAgIGlmICghaXNFZGdlKSB7XG4gICAgICAgIHN3aXRjaCAoaGFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB4byA9IGx4MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHhvID0gbHgxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh2YWxpZ24udmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgeW8gPSBseTI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgeW8gPSBseTE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSh4LCB5KSB7XG4gICAgICAgIHggPSB4IC0geG87XG4gICAgICAgIHkgPSB5IC0geW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4gKyB4byxcbiAgICAgICAgICB5OiB4ICogc2luICsgeSAqIGNvcyArIHlvXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgdmFyIHB4MXkxID0gcm90YXRlKGx4MSwgbHkxKTtcbiAgICAgIHZhciBweDF5MiA9IHJvdGF0ZShseDEsIGx5Mik7XG4gICAgICB2YXIgcHgyeTEgPSByb3RhdGUobHgyLCBseTEpO1xuICAgICAgdmFyIHB4MnkyID0gcm90YXRlKGx4MiwgbHkyKTtcbiAgICAgIGx4MSA9IE1hdGgubWluKHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHgyID0gTWF0aC5tYXgocHgxeTEueCwgcHgxeTIueCwgcHgyeTEueCwgcHgyeTIueCk7XG4gICAgICBseTEgPSBNYXRoLm1pbihweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICAgIGx5MiA9IE1hdGgubWF4KHB4MXkxLnksIHB4MXkyLnksIHB4MnkxLnksIHB4MnkyLnkpO1xuICAgIH1cbiAgICB2YXIgYmJQcmVmaXhSb3QgPSBiYlByZWZpeCArICdSb3QnO1xuICAgIHZhciBiYlJvdCA9IGJic1tiYlByZWZpeFJvdF0gPSBiYnNbYmJQcmVmaXhSb3RdIHx8IHt9O1xuICAgIGJiUm90LngxID0gbHgxO1xuICAgIGJiUm90LnkxID0gbHkxO1xuICAgIGJiUm90LngyID0gbHgyO1xuICAgIGJiUm90LnkyID0gbHkyO1xuICAgIGJiUm90LncgPSBseDIgLSBseDE7XG4gICAgYmJSb3QuaCA9IGx5MiAtIGx5MTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICAgIHVwZGF0ZUJvdW5kcyhfcC5sYWJlbEJvdW5kcy5hbGwsIGx4MSwgbHkxLCBseDIsIGx5Mik7XG4gIH1cbiAgcmV0dXJuIGJvdW5kcztcbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbU91dGxpbmUgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBlbGUucHN0eWxlKCdvdXRsaW5lLW9wYWNpdHknKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVXaWR0aCA9IGVsZS5wc3R5bGUoJ291dGxpbmUtd2lkdGgnKS52YWx1ZTtcbiAgaWYgKG91dGxpbmVPcGFjaXR5ID4gMCAmJiBvdXRsaW5lV2lkdGggPiAwKSB7XG4gICAgdmFyIG91dGxpbmVPZmZzZXQgPSBlbGUucHN0eWxlKCdvdXRsaW5lLW9mZnNldCcpLnZhbHVlO1xuICAgIHZhciBub2RlU2hhcGUgPSBlbGUucHN0eWxlKCdzaGFwZScpLnZhbHVlO1xuICAgIHZhciBvdXRsaW5lU2l6ZSA9IG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQ7XG4gICAgdmFyIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogMikgLyBib3VuZHMudztcbiAgICB2YXIgc2NhbGVZID0gKGJvdW5kcy5oICsgb3V0bGluZVNpemUgKiAyKSAvIGJvdW5kcy5oO1xuICAgIHZhciB4T2Zmc2V0ID0gMDtcbiAgICB2YXIgeU9mZnNldCA9IDA7XG4gICAgaWYgKFtcImRpYW1vbmRcIiwgXCJwZW50YWdvblwiLCBcInJvdW5kLXRyaWFuZ2xlXCJdLmluY2x1ZGVzKG5vZGVTaGFwZSkpIHtcbiAgICAgIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogMi40KSAvIGJvdW5kcy53O1xuICAgICAgeU9mZnNldCA9IC1vdXRsaW5lU2l6ZSAvIDMuNjtcbiAgICB9IGVsc2UgaWYgKFtcImNvbmNhdmUtaGV4YWdvblwiLCBcInJob21ib2lkXCIsIFwicmlnaHQtcmhvbWJvaWRcIl0uaW5jbHVkZXMobm9kZVNoYXBlKSkge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiAyLjQpIC8gYm91bmRzLnc7XG4gICAgfSBlbHNlIGlmIChub2RlU2hhcGUgPT09IFwic3RhclwiKSB7XG4gICAgICBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIuOCkgLyBib3VuZHMudztcbiAgICAgIHNjYWxlWSA9IChib3VuZHMuaCArIG91dGxpbmVTaXplICogMi42KSAvIGJvdW5kcy5oO1xuICAgICAgeU9mZnNldCA9IC1vdXRsaW5lU2l6ZSAvIDMuODtcbiAgICB9IGVsc2UgaWYgKG5vZGVTaGFwZSA9PT0gXCJ0cmlhbmdsZVwiKSB7XG4gICAgICBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIuOCkgLyBib3VuZHMudztcbiAgICAgIHNjYWxlWSA9IChib3VuZHMuaCArIG91dGxpbmVTaXplICogMi40KSAvIGJvdW5kcy5oO1xuICAgICAgeU9mZnNldCA9IC1vdXRsaW5lU2l6ZSAvIDEuNDtcbiAgICB9IGVsc2UgaWYgKG5vZGVTaGFwZSA9PT0gXCJ2ZWVcIikge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiA0LjQpIC8gYm91bmRzLnc7XG4gICAgICBzY2FsZVkgPSAoYm91bmRzLmggKyBvdXRsaW5lU2l6ZSAqIDMuOCkgLyBib3VuZHMuaDtcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgKiAuNTtcbiAgICB9XG4gICAgdmFyIGhEZWx0YSA9IGJvdW5kcy5oICogc2NhbGVZIC0gYm91bmRzLmg7XG4gICAgdmFyIHdEZWx0YSA9IGJvdW5kcy53ICogc2NhbGVYIC0gYm91bmRzLnc7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhib3VuZHMsIFtNYXRoLmNlaWwoaERlbHRhIC8gMiksIE1hdGguY2VpbCh3RGVsdGEgLyAyKV0pO1xuICAgIGlmICh4T2Zmc2V0ICE9IDAgfHwgeU9mZnNldCAhPT0gMCkge1xuICAgICAgdmFyIG9Cb3VuZHMgPSBzaGlmdEJvdW5kaW5nQm94KGJvdW5kcywgeE9mZnNldCwgeU9mZnNldCk7XG4gICAgICB1cGRhdGVCb3VuZGluZ0JveChib3VuZHMsIG9Cb3VuZHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIChpbiByYXcgbW9kZWwgcG9zaXRpb24pXG52YXIgYm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0aW9ucykge1xuICB2YXIgY3kgPSBlbGUuX3ByaXZhdGUuY3k7XG4gIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgdmFyIGhlYWRsZXNzID0gY3kuaGVhZGxlc3MoKTtcbiAgdmFyIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBleDEsIGV4MiwgZXkxLCBleTI7IC8vIGV4dHJlbWEgb2YgYm9keSAvIGxpbmVzXG4gIHZhciB4LCB5OyAvLyBub2RlIHBvc1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgbWFudWFsRXhwYW5zaW9uID0gaXNOb2RlICYmIHN0eWxlRW5hYmxlZCA/IGVsZS5wc3R5bGUoJ2JvdW5kcy1leHBhbnNpb24nKS5wZlZhbHVlIDogWzBdO1xuXG4gIC8vIG11c3QgdXNlIGBkaXNwbGF5YCBwcm9wIG9ubHksIGFzIHJlYWRpbmcgYGNvbXBvdW5kLndpZHRoKClgIGNhdXNlcyByZWN1cnNpb25cbiAgLy8gKG90aGVyIGZhY3RvcnMgbGlrZSB3aWR0aCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24gYW55d2F5KVxuICB2YXIgaXNEaXNwbGF5ZWQgPSBmdW5jdGlvbiBpc0Rpc3BsYXllZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlICE9PSAnbm9uZSc7XG4gIH07XG4gIHZhciBkaXNwbGF5ZWQgPSAhc3R5bGVFbmFibGVkIHx8IGlzRGlzcGxheWVkKGVsZSlcblxuICAvLyBtdXN0IHRha2UgaW50byBhY2NvdW50IGNvbm5lY3RlZCBub2RlcyBiL2Mgb2YgaW1wbGljaXQgZWRnZSBoaWRpbmcgb24gZGlzcGxheTpub25lIG5vZGVcbiAgJiYgKCFpc0VkZ2UgfHwgaXNEaXNwbGF5ZWQoZWxlLnNvdXJjZSgpKSAmJiBpc0Rpc3BsYXllZChlbGUudGFyZ2V0KCkpKTtcbiAgaWYgKGRpc3BsYXllZCkge1xuICAgIC8vIGRpc3BsYXllZCBzdWZmaWNlcywgc2luY2Ugd2Ugd2lsbCBmaW5kIHplcm8gYXJlYSBlbGVzIGFueXdheVxuICAgIHZhciBvdmVybGF5T3BhY2l0eSA9IDA7XG4gICAgdmFyIG92ZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICBvdmVybGF5T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ292ZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKG92ZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIG92ZXJsYXlQYWRkaW5nID0gZWxlLnBzdHlsZSgnb3ZlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB1bmRlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciB1bmRlcmxheVBhZGRpbmcgPSAwO1xuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlVW5kZXJsYXlzKSB7XG4gICAgICB1bmRlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1vcGFjaXR5JykudmFsdWU7XG4gICAgICBpZiAodW5kZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIHVuZGVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ3VuZGVybGF5LXBhZGRpbmcnKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBNYXRoLm1heChvdmVybGF5UGFkZGluZywgdW5kZXJsYXlQYWRkaW5nKTtcbiAgICB2YXIgdyA9IDA7XG4gICAgdmFyIHdIYWxmID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB3ID0gZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgd0hhbGYgPSB3IC8gMjtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSAmJiBvcHRpb25zLmluY2x1ZGVOb2Rlcykge1xuICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgeCA9IHBvcy54O1xuICAgICAgeSA9IHBvcy55O1xuICAgICAgdmFyIF93ID0gZWxlLm91dGVyV2lkdGgoKTtcbiAgICAgIHZhciBoYWxmVyA9IF93IC8gMjtcbiAgICAgIHZhciBoID0gZWxlLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgaGFsZkggPSBoIC8gMjtcblxuICAgICAgLy8gaGFuZGxlIG5vZGUgZGltZW5zaW9uc1xuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBleDEgPSB4IC0gaGFsZlc7XG4gICAgICBleDIgPSB4ICsgaGFsZlc7XG4gICAgICBleTEgPSB5IC0gaGFsZkg7XG4gICAgICBleTIgPSB5ICsgaGFsZkg7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVPdXRsaW5lcykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgIWhlYWRsZXNzKSB7XG4gICAgICAgIHZhciBjdXJ2ZVN0eWxlID0gZWxlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS5zdHJWYWx1ZTtcblxuICAgICAgICAvLyBoYW5kbGUgZWRnZSBkaW1lbnNpb25zIChyb3VnaCBib3ggZXN0aW1hdGUpXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBleDEgPSBNYXRoLm1pbihyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXgyID0gTWF0aC5tYXgocnN0eWxlLnNyY1gsIHJzdHlsZS5taWRYLCByc3R5bGUudGd0WCk7XG4gICAgICAgIGV5MSA9IE1hdGgubWluKHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpO1xuICAgICAgICBleTIgPSBNYXRoLm1heChyc3R5bGUuc3JjWSwgcnN0eWxlLm1pZFksIHJzdHlsZS50Z3RZKTtcblxuICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG4gICAgICAgIGV4MSAtPSB3SGFsZjtcbiAgICAgICAgZXgyICs9IHdIYWxmO1xuICAgICAgICBleTEgLT0gd0hhbGY7XG4gICAgICAgIGV5MiArPSB3SGFsZjtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcblxuICAgICAgICAvLyBwcmVjaXNlIGVkZ2VzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICAgIHZhciBocHRzID0gcnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICAgIGlmIChocHRzICYmIGhwdHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBleDEgPSBocHRzWzBdLng7XG4gICAgICAgICAgICBleTEgPSBocHRzWzBdLnk7XG4gICAgICAgICAgICBleDIgPSBocHRzWzFdLng7XG4gICAgICAgICAgICBleTIgPSBocHRzWzFdLnk7XG4gICAgICAgICAgICBpZiAoZXgxID4gZXgyKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gZXgxO1xuICAgICAgICAgICAgICBleDEgPSBleDI7XG4gICAgICAgICAgICAgIGV4MiA9IHRlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcCA9IGV5MTtcbiAgICAgICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgICAgICBleTIgPSBfdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSAtIHdIYWxmLCBleTEgLSB3SGFsZiwgZXgyICsgd0hhbGYsIGV5MiArIHdIYWxmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VydmVTdHlsZSA9PT0gJ2JlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3NlZ21lbnRzJykgfHwgY3VydmVTdHlsZS5lbmRzV2l0aCgndGF4aScpKSB7XG4gICAgICAgICAgdmFyIHB0cztcbiAgICAgICAgICBzd2l0Y2ggKGN1cnZlU3R5bGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICAgICAgICBjYXNlICd1bmJ1bmRsZWQtYmV6aWVyJzpcbiAgICAgICAgICAgICAgcHRzID0gcnN0eWxlLmJlemllclB0cztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWdtZW50cyc6XG4gICAgICAgICAgICBjYXNlICd0YXhpJzpcbiAgICAgICAgICAgIGNhc2UgJ3JvdW5kLXNlZ21lbnRzJzpcbiAgICAgICAgICAgIGNhc2UgJ3JvdW5kLXRheGknOlxuICAgICAgICAgICAgICBwdHMgPSByc3R5bGUubGluZVB0cztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHB0ID0gcHRzW2pdO1xuICAgICAgICAgICAgICBleDEgPSBwdC54IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV4MiA9IHB0LnggKyB3SGFsZjtcbiAgICAgICAgICAgICAgZXkxID0gcHQueSAtIHdIYWxmO1xuICAgICAgICAgICAgICBleTIgPSBwdC55ICsgd0hhbGY7XG4gICAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGJlemllci1saWtlIG9yIHNlZ21lbnQtbGlrZSBlZGdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuXG4gICAgICAgIC8vIGZhbGxiYWNrIG9uIHNvdXJjZSBhbmQgdGFyZ2V0IHBvc2l0aW9uc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICB2YXIgbjEgPSBlbGUuc291cmNlKCk7XG4gICAgICAgIHZhciBuMXBvcyA9IG4xLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuMiA9IGVsZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIG4ycG9zID0gbjIucG9zaXRpb24oKTtcbiAgICAgICAgZXgxID0gbjFwb3MueDtcbiAgICAgICAgZXgyID0gbjJwb3MueDtcbiAgICAgICAgZXkxID0gbjFwb3MueTtcbiAgICAgICAgZXkyID0gbjJwb3MueTtcbiAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgIHZhciBfdGVtcDIgPSBleDE7XG4gICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgIGV4MiA9IF90ZW1wMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgdmFyIF90ZW1wMyA9IGV5MTtcbiAgICAgICAgICBleTEgPSBleTI7XG4gICAgICAgICAgZXkyID0gX3RlbXAzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuICAgICAgICBleDEgLT0gd0hhbGY7XG4gICAgICAgIGV4MiArPSB3SGFsZjtcbiAgICAgICAgZXkxIC09IHdIYWxmO1xuICAgICAgICBleTIgKz0gd0hhbGY7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICB9IC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG4gICAgfSAvLyBlZGdlc1xuXG4gICAgLy8gaGFuZGxlIGVkZ2UgYXJyb3cgc2l6ZVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMgJiYgaXNFZGdlKSB7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtdGFyZ2V0Jyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgIH1cblxuICAgIC8vIGdob3N0XG4gICAgLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHZhciBnaG9zdCA9IGVsZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICAgICAgaWYgKGdob3N0KSB7XG4gICAgICAgIHZhciBneCA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICAgICAgdmFyIGd5ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBib3VuZHMueDEgKyBneCwgYm91bmRzLnkxICsgZ3ksIGJvdW5kcy54MiArIGd4LCBib3VuZHMueTIgKyBneSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSBib2R5IGJvdW5kcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGxhYmVsc1xuICAgIHZhciBiYkJvZHkgPSBfcC5ib2R5Qm91bmRzID0gX3AuYm9keUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYkJvZHksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYkJvZHksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJCb2R5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgLy8gb3ZlcmxheVxuICAgIC8vLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIGV4MSA9IGJvdW5kcy54MTtcbiAgICAgIGV4MiA9IGJvdW5kcy54MjtcbiAgICAgIGV5MSA9IGJvdW5kcy55MTtcbiAgICAgIGV5MiA9IGJvdW5kcy55MjtcbiAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSAtIHBhZGRpbmcsIGV5MSAtIHBhZGRpbmcsIGV4MiArIHBhZGRpbmcsIGV5MiArIHBhZGRpbmcpO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgYm9keSBib3VuZHMgc2VwYXJhdGVseSBmcm9tIHRoZSBsYWJlbHNcbiAgICB2YXIgYmJPdmVybGF5ID0gX3Aub3ZlcmxheUJvdW5kcyA9IF9wLm92ZXJsYXlCb3VuZHMgfHwge307XG4gICAgYXNzaWduQm91bmRpbmdCb3goYmJPdmVybGF5LCBib3VuZHMpO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmJPdmVybGF5LCBtYW51YWxFeHBhbnNpb24pO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiT3ZlcmxheSwgMSk7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIC8vIGhhbmRsZSBsYWJlbCBkaW1lbnNpb25zXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHZhciBiYkxhYmVscyA9IF9wLmxhYmVsQm91bmRzID0gX3AubGFiZWxCb3VuZHMgfHwge307XG4gICAgaWYgKGJiTGFiZWxzLmFsbCAhPSBudWxsKSB7XG4gICAgICBjbGVhckJvdW5kaW5nQm94KGJiTGFiZWxzLmFsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJiTGFiZWxzLmFsbCA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIH1cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZU1haW5MYWJlbHMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3NvdXJjZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVUYXJnZXRMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsICd0YXJnZXQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gc3R5bGUgZW5hYmxlZCBmb3IgbGFiZWxzXG4gIH0gLy8gaWYgZGlzcGxheWVkXG5cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIGlmIChib3VuZHMudyA+IDAgJiYgYm91bmRzLmggPiAwICYmIGRpc3BsYXllZCkge1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYm91bmRzLCBtYW51YWxFeHBhbnNpb24pO1xuXG4gICAgLy8gZXhwYW5kIGJvdW5kcyBieSAxIGJlY2F1c2UgYW50aWFsaWFzaW5nIGNhbiBpbmNyZWFzZSB0aGUgdmlzdWFsL2VmZmVjdGl2ZSBzaXplIGJ5IDEgb24gYWxsIHNpZGVzXG4gICAgZXhwYW5kQm91bmRpbmdCb3goYm91bmRzLCAxKTtcbiAgfVxuICByZXR1cm4gYm91bmRzO1xufTtcbnZhciBnZXRLZXkgPSBmdW5jdGlvbiBnZXRLZXkob3B0cykge1xuICB2YXIgaSA9IDA7XG4gIHZhciB0ZiA9IGZ1bmN0aW9uIHRmKHZhbCkge1xuICAgIHJldHVybiAodmFsID8gMSA6IDApIDw8IGkrKztcbiAgfTtcbiAgdmFyIGtleSA9IDA7XG4gIGtleSArPSB0ZihvcHRzLmluY3VkZU5vZGVzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZUVkZ2VzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZUxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVNYWluTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlT3ZlcmxheXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlT3V0bGluZXMpO1xuICByZXR1cm4ga2V5O1xufTtcbnZhciBnZXRCb3VuZGluZ0JveFBvc0tleSA9IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIHAxID0gZWxlLnNvdXJjZSgpLnBvc2l0aW9uKCk7XG4gICAgdmFyIHAyID0gZWxlLnRhcmdldCgpLnBvc2l0aW9uKCk7XG4gICAgdmFyIHIgPSBmdW5jdGlvbiByKHgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHgpO1xuICAgIH07XG4gICAgcmV0dXJuIGhhc2hJbnRzQXJyYXkoW3IocDEueCksIHIocDEueSksIHIocDIueCksIHIocDIueSldKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBjYWNoZWRCb3VuZGluZ0JveEltcGwgPSBmdW5jdGlvbiBjYWNoZWRCb3VuZGluZ0JveEltcGwoZWxlLCBvcHRzKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGJiO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIga2V5ID0gb3B0cyA9PSBudWxsID8gZGVmQmJPcHRzS2V5IDogZ2V0S2V5KG9wdHMpO1xuICB2YXIgdXNpbmdEZWZPcHRzID0ga2V5ID09PSBkZWZCYk9wdHNLZXk7XG4gIHZhciBjdXJyUG9zS2V5ID0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgdmFyIGlzUG9zS2V5U2FtZSA9IF9wLmJiQ2FjaGVQb3NLZXkgPT09IGN1cnJQb3NLZXk7XG4gIHZhciB1c2VDYWNoZSA9IG9wdHMudXNlQ2FjaGUgJiYgaXNQb3NLZXlTYW1lO1xuICB2YXIgaXNEaXJ0eSA9IGZ1bmN0aW9uIGlzRGlydHkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5iYkNhY2hlID09IG51bGwgfHwgZWxlLl9wcml2YXRlLnN0eWxlRGlydHk7XG4gIH07XG4gIHZhciBuZWVkUmVjYWxjID0gIXVzZUNhY2hlIHx8IGlzRGlydHkoZWxlKSB8fCBpc0VkZ2UgJiYgaXNEaXJ0eShlbGUuc291cmNlKCkpIHx8IGlzRGlydHkoZWxlLnRhcmdldCgpKTtcbiAgaWYgKG5lZWRSZWNhbGMpIHtcbiAgICBpZiAoIWlzUG9zS2V5U2FtZSkge1xuICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSk7XG4gICAgfVxuICAgIGJiID0gYm91bmRpbmdCb3hJbXBsKGVsZSwgZGVmQmJPcHRzKTtcbiAgICBfcC5iYkNhY2hlID0gYmI7XG4gICAgX3AuYmJDYWNoZVBvc0tleSA9IGN1cnJQb3NLZXk7XG4gIH0gZWxzZSB7XG4gICAgYmIgPSBfcC5iYkNhY2hlO1xuICB9XG5cbiAgLy8gbm90IHVzaW5nIGRlZiBvcHRzID0+IG5lZWQgdG8gYnVpbGQgdXAgYmIgZnJvbSBjb21iaW5hdGlvbiBvZiBzdWIgYmJzXG4gIGlmICghdXNpbmdEZWZPcHRzKSB7XG4gICAgdmFyIGlzTm9kZSA9IGVsZS5pc05vZGUoKTtcbiAgICBiYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIGlmIChvcHRzLmluY2x1ZGVOb2RlcyAmJiBpc05vZGUgfHwgb3B0cy5pbmNsdWRlRWRnZXMgJiYgIWlzTm9kZSkge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLm92ZXJsYXlCb3VuZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AuYm9keUJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRzLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzICYmICghaXNFZGdlIHx8IG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscyAmJiBvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLmFsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0cy5pbmNsdWRlTWFpbkxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLm1haW5Sb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5zb3VyY2VSb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy50YXJnZXRSb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG4gIHJldHVybiBiYjtcbn07XG52YXIgZGVmQmJPcHRzID0ge1xuICBpbmNsdWRlTm9kZXM6IHRydWUsXG4gIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgaW5jbHVkZUxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZU1haW5MYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVTb3VyY2VMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVUYXJnZXRMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVPdmVybGF5czogdHJ1ZSxcbiAgaW5jbHVkZVVuZGVybGF5czogdHJ1ZSxcbiAgaW5jbHVkZU91dGxpbmVzOiB0cnVlLFxuICB1c2VDYWNoZTogdHJ1ZVxufTtcbnZhciBkZWZCYk9wdHNLZXkgPSBnZXRLZXkoZGVmQmJPcHRzKTtcbnZhciBmaWxsZWRCYk9wdHMgPSBkZWZhdWx0cyRnKGRlZkJiT3B0cyk7XG5lbGVzZm4kYi5ib3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBib3VuZHM7XG5cbiAgLy8gdGhlIG1haW4gdXNlY2FzZSBpcyBlbGUuYm91bmRpbmdCb3goKSBmb3IgYSBzaW5nbGUgZWxlbWVudCB3aXRoIG5vL2RlZiBvcHRpb25zXG4gIC8vIHNwZWNpZmllZCBzLnQuIHRoZSBjYWNoZSBpcyB1c2VkLCBzbyBjaGVjayBmb3IgdGhpcyBjYXNlIHRvIG1ha2UgaXQgZmFzdGVyIGJ5XG4gIC8vIGF2b2lkaW5nIHRoZSBvdmVyaGVhZCBvZiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb25cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXNbMF0uX3ByaXZhdGUuYmJDYWNoZSAhPSBudWxsICYmICF0aGlzWzBdLl9wcml2YXRlLnN0eWxlRGlydHkgJiYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnVzZUNhY2hlID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy51c2VDYWNoZSA9PT0gdHJ1ZSkpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zID0gZGVmQmJPcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gZmlsbGVkQmJPcHRzKG9wdGlvbnMpO1xuICAgIH1cbiAgICBib3VuZHMgPSBjYWNoZWRCb3VuZGluZ0JveEltcGwodGhpc1swXSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYm91bmRzID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgZGVmQmJPcHRzO1xuICAgIHZhciBvcHRzID0gZmlsbGVkQmJPcHRzKG9wdGlvbnMpO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgY3kgPSBlbGVzLmN5KCk7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5LnN0eWxlRW5hYmxlZCgpO1xuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgY3VyclBvc0tleSA9IGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSk7XG4gICAgICAgIHZhciBpc1Bvc0tleVNhbWUgPSBfcC5iYkNhY2hlUG9zS2V5ID09PSBjdXJyUG9zS2V5O1xuICAgICAgICB2YXIgdXNlQ2FjaGUgPSBvcHRzLnVzZUNhY2hlICYmIGlzUG9zS2V5U2FtZSAmJiAhX3Auc3R5bGVEaXJ0eTtcbiAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29tcG91bmRCb3VuZHMoIW9wdGlvbnMudXNlQ2FjaGUpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9lbGUgPSBlbGVzW19pXTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYm91bmRzLCBjYWNoZWRCb3VuZGluZ0JveEltcGwoX2VsZSwgb3B0cykpO1xuICAgIH1cbiAgfVxuICBib3VuZHMueDEgPSBub25pbmYoYm91bmRzLngxKTtcbiAgYm91bmRzLnkxID0gbm9uaW5mKGJvdW5kcy55MSk7XG4gIGJvdW5kcy54MiA9IG5vbmluZihib3VuZHMueDIpO1xuICBib3VuZHMueTIgPSBub25pbmYoYm91bmRzLnkyKTtcbiAgYm91bmRzLncgPSBub25pbmYoYm91bmRzLngyIC0gYm91bmRzLngxKTtcbiAgYm91bmRzLmggPSBub25pbmYoYm91bmRzLnkyIC0gYm91bmRzLnkxKTtcbiAgcmV0dXJuIGJvdW5kcztcbn07XG5lbGVzZm4kYi5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfcCA9IHRoaXNbaV0uX3ByaXZhdGU7XG4gICAgX3AuYmJDYWNoZSA9IG51bGw7XG4gICAgX3AuYmJDYWNoZVBvc0tleSA9IG51bGw7XG4gICAgX3AuYm9keUJvdW5kcyA9IG51bGw7XG4gICAgX3Aub3ZlcmxheUJvdW5kcyA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuYWxsID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5zb3VyY2UgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnRhcmdldCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMubWFpbiA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuc291cmNlUm90ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy50YXJnZXRSb3QgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLm1haW5Sb3QgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzLnNvdXJjZSA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHMudGFyZ2V0ID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kc1snbWlkLXNvdXJjZSddID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kc1snbWlkLXRhcmdldCddID0gbnVsbDtcbiAgfVxuICB0aGlzLmVtaXRBbmROb3RpZnkoJ2JvdW5kcycpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHByaXZhdGUgaGVscGVyIHRvIGdldCBib3VuZGluZyBib3ggZm9yIGN1c3RvbSBub2RlIHBvc2l0aW9uc1xuLy8gLSBnb29kIGZvciBwZXJmIGluIGNlcnRhaW4gY2FzZXMgYnV0IGN1cnJlbnRseSByZXF1aXJlcyBkaXJ0eWluZyB0aGUgcmVuZGVyZWQgc3R5bGVcbi8vIC0gd291bGQgYmUgYmV0dGVyIHRvIG5vdCBtb2RpZnkgdGhlIG5vZGVzIGJ1dCB0aGUgbm9kZXMgYXJlIHJlYWQgZGlyZWN0bHkgZXZlcnl3aGVyZSBpbiB0aGUgcmVuZGVyZXIuLi5cbi8vIC0gdHJ5IHRvIHVzZSBmb3Igb25seSB0aGluZ3MgbGlrZSBkaXNjcmV0ZSBsYXlvdXRzIHdoZXJlIHRoZSBub2RlIHBvc2l0aW9uIHdvdWxkIGNoYW5nZSBhbnl3YXlcbmVsZXNmbiRiLmJvdW5kaW5nQm94QXQgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgcGFyZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5pc1BhcmVudCgpO1xuICAgIH0pO1xuICAgIG5vZGVzID0gbm9kZXMubm90KHBhcmVudHMpO1xuICB9XG4gIGlmIChwbGFpbk9iamVjdChmbikpIHtcbiAgICB2YXIgb2JqID0gZm47XG4gICAgZm4gPSBmdW5jdGlvbiBmbigpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgfVxuICB2YXIgc3RvcmVPbGRQb3MgPSBmdW5jdGlvbiBzdG9yZU9sZFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuYmJBdE9sZFBvcyA9IGZuKG5vZGUsIGkpO1xuICB9O1xuICB2YXIgZ2V0T2xkUG9zID0gZnVuY3Rpb24gZ2V0T2xkUG9zKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5iYkF0T2xkUG9zO1xuICB9O1xuICBjeS5zdGFydEJhdGNoKCk7XG4gIG5vZGVzLmZvckVhY2goc3RvcmVPbGRQb3MpLnNpbGVudFBvc2l0aW9ucyhmbik7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBwYXJlbnRzLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIHBhcmVudHMudXBkYXRlQ29tcG91bmRCb3VuZHModHJ1ZSk7IC8vIGZvcmNlIHVwZGF0ZSBiL2Mgd2UncmUgaW5zaWRlIGEgYmF0Y2ggY3ljbGVcbiAgfVxuXG4gIHZhciBiYiA9IGNvcHlCb3VuZGluZ0JveCh0aGlzLmJvdW5kaW5nQm94KHtcbiAgICB1c2VDYWNoZTogZmFsc2VcbiAgfSkpO1xuICBub2Rlcy5zaWxlbnRQb3NpdGlvbnMoZ2V0T2xkUG9zKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG5cbiAgY3kuZW5kQmF0Y2goKTtcbiAgcmV0dXJuIGJiO1xufTtcbmZuJDMuYm91bmRpbmdib3ggPSBmbiQzLmJiID0gZm4kMy5ib3VuZGluZ0JveDtcbmZuJDMucmVuZGVyZWRCb3VuZGluZ2JveCA9IGZuJDMucmVuZGVyZWRCb3VuZGluZ0JveDtcbnZhciBib3VuZHMgPSBlbGVzZm4kYjtcblxudmFyIGZuJDIsIGVsZXNmbiRhO1xuZm4kMiA9IGVsZXNmbiRhID0ge307XG52YXIgZGVmaW5lRGltRm5zID0gZnVuY3Rpb24gZGVmaW5lRGltRm5zKG9wdHMpIHtcbiAgb3B0cy51cHBlcmNhc2VOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm5hbWUpO1xuICBvcHRzLmF1dG9OYW1lID0gJ2F1dG8nICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLmxhYmVsTmFtZSA9ICdsYWJlbCcgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMub3V0ZXJOYW1lID0gJ291dGVyJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy51cHBlcmNhc2VPdXRlck5hbWUgPSBjYXBpdGFsaXplKG9wdHMub3V0ZXJOYW1lKTtcbiAgZm4kMltvcHRzLm5hbWVdID0gZnVuY3Rpb24gZGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGN5ID0gX3AuY3k7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5Ll9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgICBpZiAoZWxlKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgICAgICAgIHJldHVybiBfcFtvcHRzLmF1dG9OYW1lXSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gZWxlLnBzdHlsZShvcHRzLm5hbWUpO1xuICAgICAgICBzd2l0Y2ggKGQuc3RyVmFsdWUpIHtcbiAgICAgICAgICBjYXNlICdsYWJlbCc6XG4gICAgICAgICAgICBlbGUucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKCk7XG4gICAgICAgICAgICByZXR1cm4gX3AucnN0eWxlW29wdHMubGFiZWxOYW1lXSB8fCAwO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZC5wZlZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZuJDJbJ291dGVyJyArIG9wdHMudXBwZXJjYXNlTmFtZV0gPSBmdW5jdGlvbiBvdXRlckRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICB2YXIgZGltID0gZWxlW29wdHMubmFtZV0oKTtcbiAgICAgICAgdmFyIGJvcmRlciA9IGVsZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnBmVmFsdWU7IC8vIG4uYi4gMS8yIGVhY2ggc2lkZVxuICAgICAgICB2YXIgcGFkZGluZyA9IDIgKiBlbGUucGFkZGluZygpO1xuICAgICAgICByZXR1cm4gZGltICsgYm9yZGVyICsgcGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VOYW1lXSA9IGZ1bmN0aW9uIHJlbmRlcmVkRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgZCA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICByZXR1cm4gZCAqIHRoaXMuY3koKS56b29tKCk7XG4gICAgfVxuICB9O1xuICBmbiQyWydyZW5kZXJlZCcgKyBvcHRzLnVwcGVyY2FzZU91dGVyTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZE91dGVyRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgb2QgPSBlbGVbb3B0cy5vdXRlck5hbWVdKCk7XG4gICAgICByZXR1cm4gb2QgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbn07XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnd2lkdGgnXG59KTtcbmRlZmluZURpbUZucyh7XG4gIG5hbWU6ICdoZWlnaHQnXG59KTtcbmVsZXNmbiRhLnBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgIGlmIChfcC5hdXRvUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AuYXV0b1BhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ3BhZGRpbmcnKS5wZlZhbHVlO1xuICB9XG59O1xuZWxlc2ZuJGEucGFkZGVkSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS5oZWlnaHQoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbmVsZXNmbiRhLnBhZGRlZFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS53aWR0aCgpICsgMiAqIGVsZS5wYWRkaW5nKCk7XG59O1xudmFyIHdpZHRoSGVpZ2h0ID0gZWxlc2ZuJGE7XG5cbnZhciBpZkVkZ2UgPSBmdW5jdGlvbiBpZkVkZ2UoZWxlLCBnZXRWYWx1ZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlKGVsZSk7XG4gIH1cbn07XG52YXIgaWZFZGdlUmVuZGVyZWRQb3NpdGlvbiA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24oZWxlLCBnZXRQb2ludCkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKGdldFBvaW50KGVsZSksIGN5Lnpvb20oKSwgY3kucGFuKCkpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zID0gZnVuY3Rpb24gaWZFZGdlUmVuZGVyZWRQb3NpdGlvbnMoZWxlLCBnZXRQb2ludHMpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICByZXR1cm4gZ2V0UG9pbnRzKGVsZSkubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocCwgem9vbSwgcGFuKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBjb250cm9sUG9pbnRzID0gZnVuY3Rpb24gY29udHJvbFBvaW50cyhlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldENvbnRyb2xQb2ludHMoZWxlKTtcbn07XG52YXIgc2VnbWVudFBvaW50cyA9IGZ1bmN0aW9uIHNlZ21lbnRQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRTZWdtZW50UG9pbnRzKGVsZSk7XG59O1xudmFyIHNvdXJjZUVuZHBvaW50ID0gZnVuY3Rpb24gc291cmNlRW5kcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRTb3VyY2VFbmRwb2ludChlbGUpO1xufTtcbnZhciB0YXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIHRhcmdldEVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0VGFyZ2V0RW5kcG9pbnQoZWxlKTtcbn07XG52YXIgbWlkcG9pbnQgPSBmdW5jdGlvbiBtaWRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldEVkZ2VNaWRwb2ludChlbGUpO1xufTtcbnZhciBwdHMgPSB7XG4gIGNvbnRyb2xQb2ludHM6IHtcbiAgICBnZXQ6IGNvbnRyb2xQb2ludHMsXG4gICAgbXVsdDogdHJ1ZVxuICB9LFxuICBzZWdtZW50UG9pbnRzOiB7XG4gICAgZ2V0OiBzZWdtZW50UG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc291cmNlRW5kcG9pbnQ6IHtcbiAgICBnZXQ6IHNvdXJjZUVuZHBvaW50XG4gIH0sXG4gIHRhcmdldEVuZHBvaW50OiB7XG4gICAgZ2V0OiB0YXJnZXRFbmRwb2ludFxuICB9LFxuICBtaWRwb2ludDoge1xuICAgIGdldDogbWlkcG9pbnRcbiAgfVxufTtcbnZhciByZW5kZXJlZE5hbWUgPSBmdW5jdGlvbiByZW5kZXJlZE5hbWUobmFtZSkge1xuICByZXR1cm4gJ3JlbmRlcmVkJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpO1xufTtcbnZhciBlZGdlUG9pbnRzID0gT2JqZWN0LmtleXMocHRzKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgbmFtZSkge1xuICB2YXIgc3BlYyA9IHB0c1tuYW1lXTtcbiAgdmFyIHJOYW1lID0gcmVuZGVyZWROYW1lKG5hbWUpO1xuICBvYmpbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlmRWRnZSh0aGlzLCBzcGVjLmdldCk7XG4gIH07XG4gIGlmIChzcGVjLm11bHQpIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKHRoaXMsIHNwZWMuZ2V0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG9ialtyTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaWZFZGdlUmVuZGVyZWRQb3NpdGlvbih0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gb2JqO1xufSwge30pO1xuXG52YXIgZGltZW5zaW9ucyA9IGV4dGVuZCh7fSwgcG9zaXRpb24sIGJvdW5kcywgd2lkdGhIZWlnaHQsIGVkZ2VQb2ludHMpO1xuXG4vKiFcbkV2ZW50IG9iamVjdCBiYXNlZCBvbiBqUXVlcnkgZXZlbnRzLCBNSVQgbGljZW5zZVxuXG5odHRwczovL2pxdWVyeS5vcmcvbGljZW5zZS9cbmh0dHBzOi8vdGxkcmxlZ2FsLmNvbS9saWNlbnNlL21pdC1saWNlbnNlXG5odHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iL21hc3Rlci9zcmMvZXZlbnQuanNcbiovXG5cbnZhciBFdmVudCA9IGZ1bmN0aW9uIEV2ZW50KHNyYywgcHJvcHMpIHtcbiAgdGhpcy5yZWN5Y2xlKHNyYywgcHJvcHMpO1xufTtcbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2V2ZW50JztcbiAgfSxcbiAgcmVjeWNsZTogZnVuY3Rpb24gcmVjeWNsZShzcmMsIHByb3BzKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVybkZhbHNlO1xuICAgIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMucHJldmVudERlZmF1bHQpIHtcbiAgICAgIC8vIEJyb3dzZXIgRXZlbnQgb2JqZWN0XG4gICAgICB0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuICAgICAgLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcbiAgICAgIC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTtcbiAgICB9IGVsc2UgaWYgKHNyYyAhPSBudWxsICYmIHNyYy50eXBlKSB7XG4gICAgICAvLyBQbGFpbiBvYmplY3QgY29udGFpbmluZyBhbGwgZXZlbnQgZGV0YWlsc1xuICAgICAgcHJvcHMgPSBzcmM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW50IHN0cmluZ1xuICAgICAgdGhpcy50eXBlID0gc3JjO1xuICAgIH1cblxuICAgIC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG4gICAgaWYgKHByb3BzICE9IG51bGwpIHtcbiAgICAgIC8vIG1vcmUgZWZmaWNpZW50IHRvIG1hbnVhbGx5IGNvcHkgZmllbGRzIHdlIHVzZVxuICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gcHJvcHMub3JpZ2luYWxFdmVudDtcbiAgICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGUgIT0gbnVsbCA/IHByb3BzLnR5cGUgOiB0aGlzLnR5cGU7XG4gICAgICB0aGlzLmN5ID0gcHJvcHMuY3k7XG4gICAgICB0aGlzLnRhcmdldCA9IHByb3BzLnRhcmdldDtcbiAgICAgIHRoaXMucG9zaXRpb24gPSBwcm9wcy5wb3NpdGlvbjtcbiAgICAgIHRoaXMucmVuZGVyZWRQb3NpdGlvbiA9IHByb3BzLnJlbmRlcmVkUG9zaXRpb247XG4gICAgICB0aGlzLm5hbWVzcGFjZSA9IHByb3BzLm5hbWVzcGFjZTtcbiAgICAgIHRoaXMubGF5b3V0ID0gcHJvcHMubGF5b3V0O1xuICAgIH1cbiAgICBpZiAodGhpcy5jeSAhPSBudWxsICYmIHRoaXMucG9zaXRpb24gIT0gbnVsbCAmJiB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgLy8gY3JlYXRlIGEgcmVuZGVyZWQgcG9zaXRpb24gYmFzZWQgb24gdGhlIHBhc3NlZCBwb3NpdGlvblxuICAgICAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247XG4gICAgICB2YXIgem9vbSA9IHRoaXMuY3kuem9vbSgpO1xuICAgICAgdmFyIHBhbiA9IHRoaXMuY3kucGFuKCk7XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHBvcy54ICogem9vbSArIHBhbi54LFxuICAgICAgICB5OiBwb3MueSAqIHpvb20gKyBwYW4ueVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcbiAgICBpZiAoIWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LFxuICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcbiAgICBpZiAoIWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9LFxuICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9LFxuICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG4gIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZVxufTtcblxudmFyIGV2ZW50UmVnZXggPSAvXihbXi5dKykoXFwuKD86W14uXSspKT8kLzsgLy8gcmVnZXggZm9yIG1hdGNoaW5nIGV2ZW50IHN0cmluZ3MgKGUuZy4gXCJjbGljay5uYW1lc3BhY2VcIilcbnZhciB1bml2ZXJzYWxOYW1lc3BhY2UgPSAnLionOyAvLyBtYXRjaGVzIGFzIGlmIG5vIG5hbWVzcGFjZSBzcGVjaWZpZWQgYW5kIHByZXZlbnRzIHVzZXJzIGZyb20gdW5iaW5kaW5nIGFjY2lkZW50YWxseVxuXG52YXIgZGVmYXVsdHMkOCA9IHtcbiAgcXVhbGlmaWVyQ29tcGFyZTogZnVuY3Rpb24gcXVhbGlmaWVyQ29tcGFyZShxMSwgcTIpIHtcbiAgICByZXR1cm4gcTEgPT09IHEyO1xuICB9LFxuICBldmVudE1hdGNoZXM6IGZ1bmN0aW9uIGV2ZW50TWF0Y2hlcyggLypjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmoqL1xuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKCAvKmNvbnRleHQsIGV2dCovXG4gICkge30sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGNvbnRleHQgLyosIGxpc3RlbmVyLCBldmVudE9iaiovKSB7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH0sXG4gIGJlZm9yZUVtaXQ6IGZ1bmN0aW9uIGJlZm9yZUVtaXQoIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICApIHt9LFxuICBhZnRlckVtaXQ6IGZ1bmN0aW9uIGFmdGVyRW1pdCggLyogY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqICovXG4gICkge30sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCAvKmNvbnRleHQqL1xuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KCAvKmNvbnRleHQqL1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgY29udGV4dDogbnVsbFxufTtcbnZhciBkZWZhdWx0c0tleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0cyQ4KTtcbnZhciBlbXB0eU9wdHMgPSB7fTtcbmZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlbXB0eU9wdHM7XG4gIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIC8vIG1pY3JvLW9wdGltaXNhdGlvbiB2cyBPYmplY3QuYXNzaWduKCkgLS0gcmVkdWNlcyBFbGVtZW50IGluc3RhbnRpYXRpb24gdGltZVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZmF1bHRzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBkZWZhdWx0c0tleXNbaV07XG4gICAgdGhpc1trZXldID0gb3B0c1trZXldIHx8IGRlZmF1bHRzJDhba2V5XTtcbiAgfVxuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMuY29udGV4dDtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy5lbWl0dGluZyA9IDA7XG59XG52YXIgcCA9IEVtaXR0ZXIucHJvdG90eXBlO1xudmFyIGZvckVhY2hFdmVudCA9IGZ1bmN0aW9uIGZvckVhY2hFdmVudChzZWxmLCBoYW5kbGVyLCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgaWYgKGZuJDYocXVhbGlmaWVyKSkge1xuICAgIGNhbGxiYWNrID0gcXVhbGlmaWVyO1xuICAgIHF1YWxpZmllciA9IG51bGw7XG4gIH1cbiAgaWYgKGNvbmZPdmVycmlkZXMpIHtcbiAgICBpZiAoY29uZiA9PSBudWxsKSB7XG4gICAgICBjb25mID0gY29uZk92ZXJyaWRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZiA9IGV4dGVuZCh7fSwgY29uZiwgY29uZk92ZXJyaWRlcyk7XG4gICAgfVxuICB9XG4gIHZhciBldmVudExpc3QgPSBhcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KC9cXHMrLyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2dCA9IGV2ZW50TGlzdFtpXTtcbiAgICBpZiAoZW1wdHlTdHJpbmcoZXZ0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IGV2dC5tYXRjaChldmVudFJlZ2V4KTsgLy8gdHlwZVsubmFtZXNwYWNlXVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgdHlwZSA9IG1hdGNoWzFdO1xuICAgICAgdmFyIG5hbWVzcGFjZSA9IG1hdGNoWzJdID8gbWF0Y2hbMl0gOiBudWxsO1xuICAgICAgdmFyIHJldCA9IGhhbmRsZXIoc2VsZiwgZXZ0LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGFsbG93IGV4aXRpbmcgZWFybHlcbiAgICB9XG4gIH1cbn07XG5cbnZhciBtYWtlRXZlbnRPYmogPSBmdW5jdGlvbiBtYWtlRXZlbnRPYmooc2VsZiwgb2JqKSB7XG4gIHNlbGYuYWRkRXZlbnRGaWVsZHMoc2VsZi5jb250ZXh0LCBvYmopO1xuICByZXR1cm4gbmV3IEV2ZW50KG9iai50eXBlLCBvYmopO1xufTtcbnZhciBmb3JFYWNoRXZlbnRPYmogPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnRPYmooc2VsZiwgaGFuZGxlciwgZXZlbnRzKSB7XG4gIGlmIChldmVudChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBldmVudHMpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBtYWtlRXZlbnRPYmooc2VsZiwgZXZlbnRzKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBldmVudExpc3QgPSBhcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KC9cXHMrLyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2dCA9IGV2ZW50TGlzdFtpXTtcbiAgICBpZiAoZW1wdHlTdHJpbmcoZXZ0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IGV2dC5tYXRjaChldmVudFJlZ2V4KTsgLy8gdHlwZVsubmFtZXNwYWNlXVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgdHlwZSA9IG1hdGNoWzFdO1xuICAgICAgdmFyIG5hbWVzcGFjZSA9IG1hdGNoWzJdID8gbWF0Y2hbMl0gOiBudWxsO1xuICAgICAgdmFyIGV2ZW50T2JqID0gbWFrZUV2ZW50T2JqKHNlbGYsIHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICAgIHRhcmdldDogc2VsZi5jb250ZXh0XG4gICAgICB9KTtcbiAgICAgIGhhbmRsZXIoc2VsZiwgZXZlbnRPYmopO1xuICAgIH1cbiAgfVxufTtcbnAub24gPSBwLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwgY29uZk92ZXJyaWRlcykge1xuICBmb3JFYWNoRXZlbnQodGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpIHtcbiAgICBpZiAoZm4kNihjYWxsYmFjaykpIHtcbiAgICAgIHNlbGYubGlzdGVuZXJzLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIC8vIGZ1bGwgZXZlbnQgc3RyaW5nXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gcnVuXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIC8vIHRoZSBldmVudCB0eXBlIChlLmcuICdjbGljaycpXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICAvLyB0aGUgZXZlbnQgbmFtZXNwYWNlIChlLmcuIFwiLmZvb1wiKVxuICAgICAgICBxdWFsaWZpZXI6IHF1YWxpZmllcixcbiAgICAgICAgLy8gYSByZXN0cmljdGlvbiBvbiB3aGV0aGVyIHRvIG1hdGNoIHRoaXMgZW1pdHRlclxuICAgICAgICBjb25mOiBjb25mIC8vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9LCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5wLm9uZSA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpIHtcbiAgcmV0dXJuIHRoaXMub24oZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCB7XG4gICAgb25lOiB0cnVlXG4gIH0pO1xufTtcbnAucmVtb3ZlTGlzdGVuZXIgPSBwLm9mZiA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgaWYgKHRoaXMuZW1pdHRpbmcgIT09IDApIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IGNvcHlBcnJheSQxKHRoaXMubGlzdGVuZXJzKTtcbiAgfVxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgZm9yRWFjaEV2ZW50KF90aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFjayAvKiwgY29uZiovKSB7XG4gICAgICBpZiAoKGxpc3RlbmVyLnR5cGUgPT09IHR5cGUgfHwgZXZlbnRzID09PSAnKicpICYmICghbmFtZXNwYWNlICYmIGxpc3RlbmVyLm5hbWVzcGFjZSAhPT0gJy4qJyB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IG5hbWVzcGFjZSkgJiYgKCFxdWFsaWZpZXIgfHwgc2VsZi5xdWFsaWZpZXJDb21wYXJlKGxpc3RlbmVyLnF1YWxpZmllciwgcXVhbGlmaWVyKSkgJiYgKCFjYWxsYmFjayB8fCBsaXN0ZW5lci5jYWxsYmFjayA9PT0gY2FsbGJhY2spKSB7XG4gICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuICB9O1xuICBmb3IgKHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xucC5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKCcqJyk7XG59O1xucC5lbWl0ID0gcC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50cywgZXh0cmFQYXJhbXMsIG1hbnVhbENhbGxiYWNrKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcbiAgdmFyIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICB0aGlzLmVtaXR0aW5nKys7XG4gIGlmICghYXJyYXkoZXh0cmFQYXJhbXMpKSB7XG4gICAgZXh0cmFQYXJhbXMgPSBbZXh0cmFQYXJhbXNdO1xuICB9XG4gIGZvckVhY2hFdmVudE9iaih0aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnRPYmopIHtcbiAgICBpZiAobWFudWFsQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgbGlzdGVuZXJzID0gW3tcbiAgICAgICAgZXZlbnQ6IGV2ZW50T2JqLmV2ZW50LFxuICAgICAgICB0eXBlOiBldmVudE9iai50eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IGV2ZW50T2JqLm5hbWVzcGFjZSxcbiAgICAgICAgY2FsbGJhY2s6IG1hbnVhbENhbGxiYWNrXG4gICAgICB9XTtcbiAgICAgIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKGkpIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgIGlmIChsaXN0ZW5lci50eXBlID09PSBldmVudE9iai50eXBlICYmICghbGlzdGVuZXIubmFtZXNwYWNlIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gZXZlbnRPYmoubmFtZXNwYWNlIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gdW5pdmVyc2FsTmFtZXNwYWNlKSAmJiBzZWxmLmV2ZW50TWF0Y2hlcyhzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaikpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbZXZlbnRPYmpdO1xuICAgICAgICBpZiAoZXh0cmFQYXJhbXMgIT0gbnVsbCkge1xuICAgICAgICAgIHB1c2goYXJncywgZXh0cmFQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuYmVmb3JlRW1pdChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG4gICAgICAgIGlmIChsaXN0ZW5lci5jb25mICYmIGxpc3RlbmVyLmNvbmYub25lKSB7XG4gICAgICAgICAgc2VsZi5saXN0ZW5lcnMgPSBzZWxmLmxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsICE9PSBsaXN0ZW5lcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGV4dCA9IHNlbGYuY2FsbGJhY2tDb250ZXh0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgdmFyIHJldCA9IGxpc3RlbmVyLmNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICBzZWxmLmFmdGVyRW1pdChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXZlbnRPYmouc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnRPYmoucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBpZiBsaXN0ZW5lciBtYXRjaGVzXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUxpc3RlbmVyc0JlZm9yZUVtaXQ7IGkrKykge1xuICAgICAgX2xvb3AyKGkpO1xuICAgIH0gLy8gZm9yIGxpc3RlbmVyXG5cbiAgICBpZiAoc2VsZi5idWJibGUoc2VsZi5jb250ZXh0KSAmJiAhZXZlbnRPYmouaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgc2VsZi5wYXJlbnQoc2VsZi5jb250ZXh0KS5lbWl0KGV2ZW50T2JqLCBleHRyYVBhcmFtcyk7XG4gICAgfVxuICB9LCBldmVudHMpO1xuICB0aGlzLmVtaXR0aW5nLS07XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIGVtaXR0ZXJPcHRpb25zJDEgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoZWxlLCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICB2YXIgc2VsZWN0b3IgPSBsaXN0ZW5lci5xdWFsaWZpZXI7XG4gICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbGUgIT09IGV2ZW50T2JqLnRhcmdldCAmJiBlbGVtZW50KGV2ZW50T2JqLnRhcmdldCkgJiYgc2VsZWN0b3IubWF0Y2hlcyhldmVudE9iai50YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGVsZSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gZWxlLmN5KCk7XG4gICAgZXZ0LnRhcmdldCA9IGVsZTtcbiAgfSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoZWxlLCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICByZXR1cm4gbGlzdGVuZXIucXVhbGlmaWVyICE9IG51bGwgPyBldmVudE9iai50YXJnZXQgOiBlbGU7XG4gIH0sXG4gIGJlZm9yZUVtaXQ6IGZ1bmN0aW9uIGJlZm9yZUVtaXQoY29udGV4dCwgbGlzdGVuZXIgLyosIGV2ZW50T2JqKi8pIHtcbiAgICBpZiAobGlzdGVuZXIuY29uZiAmJiBsaXN0ZW5lci5jb25mLm9uY2UpIHtcbiAgICAgIGxpc3RlbmVyLmNvbmYub25jZUNvbGxlY3Rpb24ucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZXZlbnQsIGxpc3RlbmVyLnF1YWxpZmllciwgbGlzdGVuZXIuY2FsbGJhY2spO1xuICAgIH1cbiAgfSxcbiAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpID8gZWxlLnBhcmVudCgpIDogZWxlLmN5KCk7XG4gIH1cbn07XG52YXIgYXJnU2VsZWN0b3IkMSA9IGZ1bmN0aW9uIGFyZ1NlbGVjdG9yKGFyZykge1xuICBpZiAoc3RyaW5nKGFyZykpIHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yKGFyZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfVxufTtcbnZhciBlbGVzZm4kOSA9IHtcbiAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgaWYgKCFfcC5lbWl0dGVyKSB7XG4gICAgICAgIF9wLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0aW9ucyQxLCBlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub24oZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBhcmdTZWwgPSBhcmdTZWxlY3RvciQxKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmU6IGZ1bmN0aW9uIG9uZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBhcmdTZWwgPSBhcmdTZWxlY3RvciQxKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uY2U6IGZ1bmN0aW9uIG9uY2UoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub24oZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrLCB7XG4gICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgIG9uY2VDb2xsZWN0aW9uOiB0aGlzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLmVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBleHRyYVBhcmFtcykge1xuICAgIC8vIGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZW1wdHkgY29sbGVjdGlvbnMgZG9uJ3QgbmVlZCB0byBub3RpZnkgYW55dGhpbmdcblxuICAgIC8vIG5vdGlmeSByZW5kZXJlclxuICAgIHRoaXMuY3koKS5ub3RpZnkoZXZlbnQsIHRoaXMpO1xuICAgIHRoaXMuZW1pdChldmVudCwgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuZGVmaW5lLmV2ZW50QWxpYXNlc09uKGVsZXNmbiQ5KTtcblxudmFyIGVsZXNmbiQ4ID0ge1xuICBub2RlczogZnVuY3Rpb24gbm9kZXMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBlZGdlczogZnVuY3Rpb24gZWRnZXMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0VkZ2UoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICAvLyBpbnRlcm5hbCBoZWxwZXIgdG8gZ2V0IG5vZGVzIGFuZCBlZGdlcyBhcyBzZXBhcmF0ZSBjb2xsZWN0aW9ucyB3aXRoIHNpbmdsZSBpdGVyYXRpb24gb3ZlciBlbGVtZW50c1xuICBieUdyb3VwOiBmdW5jdGlvbiBieUdyb3VwKCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXM6IG5vZGVzLFxuICAgICAgZWRnZXM6IGVkZ2VzXG4gICAgfTtcbiAgfSxcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoX2ZpbHRlciwgdGhpc0FyZykge1xuICAgIGlmIChfZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNoZWNrIHRoaXMgZmlyc3QgYi9jIGl0J3MgdGhlIG1vc3QgY29tbW9uL3BlcmZvcm1hbnQgY2FzZVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChzdHJpbmcoX2ZpbHRlcikgfHwgZWxlbWVudE9yQ29sbGVjdGlvbihfZmlsdGVyKSkge1xuICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcihfZmlsdGVyKS5maWx0ZXIodGhpcyk7XG4gICAgfSBlbHNlIGlmIChmbiQ2KF9maWx0ZXIpKSB7XG4gICAgICB2YXIgZmlsdGVyRWxlcyA9IHRoaXMuc3Bhd24oKTtcbiAgICAgIHZhciBlbGVzID0gdGhpcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIGluY2x1ZGUgPSB0aGlzQXJnID8gX2ZpbHRlci5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiBfZmlsdGVyKGVsZSwgaSwgZWxlcyk7XG4gICAgICAgIGlmIChpbmNsdWRlKSB7XG4gICAgICAgICAgZmlsdGVyRWxlcy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWx0ZXJFbGVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bigpOyAvLyBpZiBub3QgaGFuZGxlZCBieSBhYm92ZSwgZ2l2ZSAnZW0gYW4gZW1wdHkgY29sbGVjdGlvblxuICB9LFxuXG4gIG5vdDogZnVuY3Rpb24gbm90KHRvUmVtb3ZlKSB7XG4gICAgaWYgKCF0b1JlbW92ZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdHJpbmcodG9SZW1vdmUpKSB7XG4gICAgICAgIHRvUmVtb3ZlID0gdGhpcy5maWx0ZXIodG9SZW1vdmUpO1xuICAgICAgfVxuICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJlbW92ZSA9IHRvUmVtb3ZlLmhhcyhlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyZW1vdmUpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfVxuICB9LFxuICBhYnNvbHV0ZUNvbXBsZW1lbnQ6IGZ1bmN0aW9uIGFic29sdXRlQ29tcGxlbWVudCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgcmV0dXJuIGN5Lm11dGFibGVFbGVtZW50cygpLm5vdCh0aGlzKTtcbiAgfSxcbiAgaW50ZXJzZWN0OiBmdW5jdGlvbiBpbnRlcnNlY3Qob3RoZXIpIHtcbiAgICAvLyBpZiBhIHNlbGVjdG9yIGlzIHNwZWNpZmllZCwgdGhlbiBmaWx0ZXIgYnkgaXQgaW5zdGVhZFxuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBvdGhlcjtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgY29sMVNtYWxsZXIgPSB0aGlzLmxlbmd0aCA8IG90aGVyLmxlbmd0aDtcbiAgICB2YXIgY29sUyA9IGNvbDFTbWFsbGVyID8gY29sMSA6IGNvbDI7XG4gICAgdmFyIGNvbEwgPSBjb2wxU21hbGxlciA/IGNvbDIgOiBjb2wxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sUy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGNvbFNbaV07XG4gICAgICBpZiAoY29sTC5oYXMoZWxlKSkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgeG9yOiBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICBvdGhlciA9IGN5LiQob3RoZXIpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChjb2wsIG90aGVyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gY29sW2ldO1xuICAgICAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGluT3RoZXIgPSBvdGhlci5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgICAgICAgaWYgKCFpbk90aGVyKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGQoY29sMSwgY29sMik7XG4gICAgYWRkKGNvbDIsIGNvbDEpO1xuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgZGlmZjogZnVuY3Rpb24gZGlmZihvdGhlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuICAgIHZhciBsZWZ0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciByaWdodCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgYm90aCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgYWRkID0gZnVuY3Rpb24gYWRkKGNvbCwgb3RoZXIsIHJldEVsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBjb2xbaV07XG4gICAgICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgICB2YXIgaW5PdGhlciA9IG90aGVyLmhhc0VsZW1lbnRXaXRoSWQoaWQpO1xuICAgICAgICBpZiAoaW5PdGhlcikge1xuICAgICAgICAgIGJvdGgubWVyZ2UoZWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgYWRkKGNvbDEsIGNvbDIsIGxlZnQpO1xuICAgIGFkZChjb2wyLCBjb2wxLCByaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICByaWdodDogcmlnaHQsXG4gICAgICBib3RoOiBib3RoXG4gICAgfTtcbiAgfSxcbiAgYWRkOiBmdW5jdGlvbiBhZGQodG9BZGQpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmICghdG9BZGQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nKHRvQWRkKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9BZGQ7XG4gICAgICB0b0FkZCA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd25TZWxmKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRvQWRkW2ldO1xuICAgICAgdmFyIGFkZCA9ICF0aGlzLmhhcyhlbGUpO1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgLy8gaW4gcGxhY2UgbWVyZ2Ugb24gY2FsbGluZyBjb2xsZWN0aW9uXG4gIG1lcmdlOiBmdW5jdGlvbiBtZXJnZSh0b0FkZCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGN5ID0gX3AuY3k7XG4gICAgaWYgKCF0b0FkZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0b0FkZCAmJiBzdHJpbmcodG9BZGQpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b0FkZDtcbiAgICAgIHRvQWRkID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIG1hcCA9IF9wLm1hcDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9BZGRFbGUgPSB0b0FkZFtpXTtcbiAgICAgIHZhciBpZCA9IHRvQWRkRWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB2YXIgYWRkID0gIW1hcC5oYXMoaWQpO1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzW2luZGV4XSA9IHRvQWRkRWxlO1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgZWxlOiB0b0FkZEVsZSxcbiAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVubWVyZ2VBdDogZnVuY3Rpb24gdW5tZXJnZUF0KGkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG5cbiAgICAvLyByZW1vdmUgZWxlXG4gICAgdGhpc1tpXSA9IHVuZGVmaW5lZDtcbiAgICBtYXBbXCJkZWxldGVcIl0oaWQpO1xuICAgIHZhciB1bm1lcmdlZExhc3RFbGUgPSBpID09PSB0aGlzLmxlbmd0aCAtIDE7XG5cbiAgICAvLyByZXBsYWNlIGVtcHR5IHNwb3Qgd2l0aCBsYXN0IGVsZSBpbiBjb2xsZWN0aW9uXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiAhdW5tZXJnZWRMYXN0RWxlKSB7XG4gICAgICB2YXIgbGFzdEVsZUkgPSB0aGlzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbGFzdEVsZSA9IHRoaXNbbGFzdEVsZUldO1xuICAgICAgdmFyIGxhc3RFbGVJZCA9IGxhc3RFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHRoaXNbbGFzdEVsZUldID0gdW5kZWZpbmVkO1xuICAgICAgdGhpc1tpXSA9IGxhc3RFbGU7XG4gICAgICBtYXAuc2V0KGxhc3RFbGVJZCwge1xuICAgICAgICBlbGU6IGxhc3RFbGUsXG4gICAgICAgIGluZGV4OiBpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29sbGVjdGlvbiBpcyBub3cgMSBlbGUgc21hbGxlclxuICAgIHRoaXMubGVuZ3RoLS07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBzaW5nbGUgZWxlIGluIHBsYWNlIGluIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlT25lOiBmdW5jdGlvbiB1bm1lcmdlT25lKGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgdmFyIGVudHJ5ID0gbWFwLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIG5vIG5lZWQgdG8gcmVtb3ZlXG4gICAgfVxuXG4gICAgdmFyIGkgPSBlbnRyeS5pbmRleDtcbiAgICB0aGlzLnVubWVyZ2VBdChpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gcmVtb3ZlIGVsZXMgaW4gcGxhY2Ugb24gY2FsbGluZyBjb2xsZWN0aW9uXG4gIHVubWVyZ2U6IGZ1bmN0aW9uIHVubWVyZ2UodG9SZW1vdmUpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmICghdG9SZW1vdmUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodG9SZW1vdmUgJiYgc3RyaW5nKHRvUmVtb3ZlKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9SZW1vdmU7XG4gICAgICB0b1JlbW92ZSA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudW5tZXJnZU9uZSh0b1JlbW92ZVtpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVubWVyZ2VCeTogZnVuY3Rpb24gdW5tZXJnZUJ5KHRvUm1Gbikge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGlmICh0b1JtRm4oZWxlKSkge1xuICAgICAgICB0aGlzLnVubWVyZ2VBdChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1hcDogZnVuY3Rpb24gbWFwKG1hcEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHJldCA9IHRoaXNBcmcgPyBtYXBGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiBtYXBGbihlbGUsIGksIGVsZXMpO1xuICAgICAgYXJyLnB1c2gocmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkge1xuICAgIHZhciB2YWwgPSBpbml0aWFsVmFsdWU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsID0gZm4odmFsLCBlbGVzW2ldLCBpLCBlbGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfSxcbiAgbWF4OiBmdW5jdGlvbiBtYXgodmFsRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgbWF4ID0gLUluZmluaXR5O1xuICAgIHZhciBtYXhFbGU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpc0FyZyA/IHZhbEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IHZhbEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgIG1heCA9IHZhbDtcbiAgICAgICAgbWF4RWxlID0gZWxlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG1heCxcbiAgICAgIGVsZTogbWF4RWxlXG4gICAgfTtcbiAgfSxcbiAgbWluOiBmdW5jdGlvbiBtaW4odmFsRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgbWluID0gSW5maW5pdHk7XG4gICAgdmFyIG1pbkVsZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzQXJnID8gdmFsRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogdmFsRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGlmICh2YWwgPCBtaW4pIHtcbiAgICAgICAgbWluID0gdmFsO1xuICAgICAgICBtaW5FbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbWluLFxuICAgICAgZWxlOiBtaW5FbGVcbiAgICB9O1xuICB9XG59O1xuXG4vLyBhbGlhc2VzXG52YXIgZm4kMSA9IGVsZXNmbiQ4O1xuZm4kMVsndSddID0gZm4kMVsnfCddID0gZm4kMVsnKyddID0gZm4kMS51bmlvbiA9IGZuJDEub3IgPSBmbiQxLmFkZDtcbmZuJDFbJ1xcXFwnXSA9IGZuJDFbJyEnXSA9IGZuJDFbJy0nXSA9IGZuJDEuZGlmZmVyZW5jZSA9IGZuJDEucmVsYXRpdmVDb21wbGVtZW50ID0gZm4kMS5zdWJ0cmFjdCA9IGZuJDEubm90O1xuZm4kMVsnbiddID0gZm4kMVsnJiddID0gZm4kMVsnLiddID0gZm4kMS5hbmQgPSBmbiQxLmludGVyc2VjdGlvbiA9IGZuJDEuaW50ZXJzZWN0O1xuZm4kMVsnXiddID0gZm4kMVsnKCspJ10gPSBmbiQxWycoLSknXSA9IGZuJDEuc3ltbWV0cmljRGlmZmVyZW5jZSA9IGZuJDEuc3ltZGlmZiA9IGZuJDEueG9yO1xuZm4kMS5mbkZpbHRlciA9IGZuJDEuZmlsdGVyRm4gPSBmbiQxLnN0ZEZpbHRlciA9IGZuJDEuZmlsdGVyO1xuZm4kMS5jb21wbGVtZW50ID0gZm4kMS5hYnNjb21wID0gZm4kMS5hYnNvbHV0ZUNvbXBsZW1lbnQ7XG5cbnZhciBlbGVzZm4kNyA9IHtcbiAgaXNOb2RlOiBmdW5jdGlvbiBpc05vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA9PT0gJ25vZGVzJztcbiAgfSxcbiAgaXNFZGdlOiBmdW5jdGlvbiBpc0VkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA9PT0gJ2VkZ2VzJztcbiAgfSxcbiAgaXNMb29wOiBmdW5jdGlvbiBpc0xvb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgJiYgdGhpcy5zb3VyY2UoKVswXSA9PT0gdGhpcy50YXJnZXQoKVswXTtcbiAgfSxcbiAgaXNTaW1wbGU6IGZ1bmN0aW9uIGlzU2ltcGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRnZSgpICYmIHRoaXMuc291cmNlKClbMF0gIT09IHRoaXMudGFyZ2V0KClbMF07XG4gIH0sXG4gIGdyb3VwOiBmdW5jdGlvbiBncm91cCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLmdyb3VwO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAgRWxlbWVudHMgYXJlIGRyYXduIGluIGEgc3BlY2lmaWMgb3JkZXIgYmFzZWQgb24gY29tcG91bmQgZGVwdGggKGxvdyB0byBoaWdoKSwgdGhlIGVsZW1lbnQgdHlwZSAobm9kZXMgYWJvdmUgZWRnZXMpLFxuICogIGFuZCB6LWluZGV4IChsb3cgdG8gaGlnaCkuICBUaGVzZSBzdHlsZXMgYWZmZWN0IGhvdyB0aGlzIGFwcGxpZXM6XG4gKlxuICogIHotY29tcG91bmQtZGVwdGg6IE1heSBiZSBgYm90dG9tIHwgb3JwaGFuIHwgYXV0byB8IHRvcGAuICBUaGUgZmlyc3QgZHJhd24gaXMgYGJvdHRvbWAsIHRoZW4gYG9ycGhhbmAgd2hpY2ggaXMgdGhlXG4gKiAgICAgIHNhbWUgZGVwdGggYXMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvdW5kIGdyYXBoLCBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdCB2YWx1ZSBgYXV0b2Agd2hpY2ggZHJhd3MgaW4gb3JkZXIgZnJvbVxuICogICAgICByb290IHRvIGxlYXZlcyBvZiB0aGUgY29tcG91bmQgZ3JhcGguICBUaGUgbGFzdCBkcmF3biBpcyBgdG9wYC5cbiAqICB6LWluZGV4LWNvbXBhcmU6IE1heSBiZSBgYXV0byB8IG1hbnVhbGAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYXV0b2Agd2hpY2ggYWx3YXlzIGRyYXdzIGVkZ2VzIHVuZGVyIG5vZGVzLlxuICogICAgICBgbWFudWFsYCBpZ25vcmVzIHRoaXMgY29udmVudGlvbiBhbmQgZHJhd3MgYmFzZWQgb24gdGhlIGB6LWluZGV4YCB2YWx1ZSBzZXR0aW5nLlxuICogIHotaW5kZXg6IEFuIGludGVnZXIgdmFsdWUgdGhhdCBhZmZlY3RzIHRoZSByZWxhdGl2ZSBkcmF3IG9yZGVyIG9mIGVsZW1lbnRzLiAgSW4gZ2VuZXJhbCwgYW4gZWxlbWVudCB3aXRoIGEgaGlnaGVyXG4gKiAgICAgIGB6LWluZGV4YCB3aWxsIGJlIGRyYXduIG9uIHRvcCBvZiBhbiBlbGVtZW50IHdpdGggYSBsb3dlciBgei1pbmRleGAuXG4gKi9cbnZhciB6SW5kZXhTb3J0ID0gZnVuY3Rpb24gekluZGV4U29ydChhLCBiKSB7XG4gIHZhciBjeSA9IGEuY3koKTtcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIGZ1bmN0aW9uIGdldERlcHRoKGVsZSkge1xuICAgIHZhciBzdHlsZSA9IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKTtcbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGhhc0NvbXBvdW5kTm9kZXMgPyBlbGUuekRlcHRoKCkgOiAwO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUudmFsdWUgPT09ICdib3R0b20nKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ3RvcCcpIHtcbiAgICAgIHJldHVybiBNQVhfSU5UJDE7XG4gICAgfVxuICAgIC8vICdvcnBoYW4nXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIGRlcHRoRGlmZiA9IGdldERlcHRoKGEpIC0gZ2V0RGVwdGgoYik7XG4gIGlmIChkZXB0aERpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZGVwdGhEaWZmO1xuICB9XG4gIGZ1bmN0aW9uIGdldEVsZURlcHRoKGVsZSkge1xuICAgIHZhciBzdHlsZSA9IGVsZS5wc3R5bGUoJ3otaW5kZXgtY29tcGFyZScpO1xuICAgIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpID8gMSA6IDA7XG4gICAgfVxuICAgIC8vICdtYW51YWwnXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIGVsZURpZmYgPSBnZXRFbGVEZXB0aChhKSAtIGdldEVsZURlcHRoKGIpO1xuICBpZiAoZWxlRGlmZiAhPT0gMCkge1xuICAgIHJldHVybiBlbGVEaWZmO1xuICB9XG4gIHZhciB6RGlmZiA9IGEucHN0eWxlKCd6LWluZGV4JykudmFsdWUgLSBiLnBzdHlsZSgnei1pbmRleCcpLnZhbHVlO1xuICBpZiAoekRpZmYgIT09IDApIHtcbiAgICByZXR1cm4gekRpZmY7XG4gIH1cbiAgLy8gY29tcGFyZSBpbmRpY2VzIGluIHRoZSBjb3JlIChvcmRlciBhZGRlZCB0byBncmFwaCB3LyBsYXN0IG9uIHRvcClcbiAgcmV0dXJuIGEucG9vbEluZGV4KCkgLSBiLnBvb2xJbmRleCgpO1xufTtcblxudmFyIGVsZXNmbiQ2ID0ge1xuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuLCB0aGlzQXJnKSB7XG4gICAgaWYgKGZuJDYoZm4pKSB7XG4gICAgICB2YXIgTiA9IHRoaXMubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICAgIHZhciByZXQgPSB0aGlzQXJnID8gZm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgdGhpc10pIDogZm4oZWxlLCBpLCB0aGlzKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBleGl0IGVhY2ggZWFybHkgb24gcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheS5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH0sXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIHRoaXNTaXplID0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSB0aGlzU2l6ZSArIHN0YXJ0O1xuICAgIH1cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kID0gdGhpc1NpemUgKyBlbmQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA+PSAwICYmIGkgPCBlbmQgJiYgaSA8IHRoaXNTaXplOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGFycmF5KTtcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gIH0sXG4gIGVxOiBmdW5jdGlvbiBlcShpKSB7XG4gICAgcmV0dXJuIHRoaXNbaV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBmaXJzdDogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgcmV0dXJuIHRoaXNbMF0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBsYXN0OiBmdW5jdGlvbiBsYXN0KCkge1xuICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xuICB9LFxuICBub25lbXB0eTogZnVuY3Rpb24gbm9uZW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLmVtcHR5KCk7XG4gIH0sXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoc29ydEZuKSB7XG4gICAgaWYgKCFmbiQ2KHNvcnRGbikpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgc29ydGVkID0gdGhpcy50b0FycmF5KCkuc29ydChzb3J0Rm4pO1xuICAgIHJldHVybiB0aGlzLnNwYXduKHNvcnRlZCk7XG4gIH0sXG4gIHNvcnRCeVpJbmRleDogZnVuY3Rpb24gc29ydEJ5WkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnNvcnQoekluZGV4U29ydCk7XG4gIH0sXG4gIHpEZXB0aDogZnVuY3Rpb24gekRlcHRoKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGxldCBjeSA9IGVsZS5jeSgpO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgZ3JvdXAgPSBfcC5ncm91cDtcbiAgICBpZiAoZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIHZhciBkZXB0aCA9IF9wLmRhdGEucGFyZW50ID8gZWxlLnBhcmVudHMoKS5zaXplKCkgOiAwO1xuICAgICAgaWYgKCFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gTUFYX0lOVCQxIC0gMTsgLy8gY2hpbGRsZXNzIG5vZGVzIGFsd2F5cyBvbiB0b3BcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlcHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgIHZhciBzcmNEZXB0aCA9IHNyYy56RGVwdGgoKTtcbiAgICAgIHZhciB0Z3REZXB0aCA9IHRndC56RGVwdGgoKTtcbiAgICAgIHJldHVybiBNYXRoLm1heChzcmNEZXB0aCwgdGd0RGVwdGgsIDApOyAvLyBkZXB0aCBvZiBkZWVwZXN0IHBhcmVudFxuICAgIH1cbiAgfVxufTtcblxuZWxlc2ZuJDYuZWFjaCA9IGVsZXNmbiQ2LmZvckVhY2g7XG52YXIgZGVmaW5lU3ltYm9sSXRlcmF0b3IgPSBmdW5jdGlvbiBkZWZpbmVTeW1ib2xJdGVyYXRvcigpIHtcbiAgdmFyIHR5cGVvZlVuZGVmID0gXCJ1bmRlZmluZWRcIiA7XG4gIHZhciBpc0l0ZXJhdG9yU3VwcG9ydGVkID0gKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihTeW1ib2wpKSAhPSB0eXBlb2ZVbmRlZiAmJiBfdHlwZW9mKFN5bWJvbC5pdGVyYXRvcikgIT0gdHlwZW9mVW5kZWY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaXNJdGVyYXRvclN1cHBvcnRlZCkge1xuICAgIGVsZXNmbiQ2W1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgdmFyIGVudHJ5ID0ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkkMSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gX3RoaXNbaSsrXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9LCBTeW1ib2wuaXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn07XG5kZWZpbmVTeW1ib2xJdGVyYXRvcigpO1xuXG52YXIgZ2V0TGF5b3V0RGltZW5zaW9uT3B0aW9ucyA9IGRlZmF1bHRzJGcoe1xuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kNSA9IHtcbiAgLy8gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyBub2RlIGRpbWVuc2lvbnMgeyB4LCB5IH0gYmFzZWQgb24gb3B0aW9ucyBnaXZlblxuICBsYXlvdXREaW1lbnNpb25zOiBmdW5jdGlvbiBsYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZ2V0TGF5b3V0RGltZW5zaW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgICB2YXIgZGltcztcbiAgICBpZiAoIXRoaXMudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IDAsXG4gICAgICAgIGg6IDBcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscykge1xuICAgICAgdmFyIGJiRGltID0gdGhpcy5ib3VuZGluZ0JveCgpO1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogYmJEaW0udyxcbiAgICAgICAgaDogYmJEaW0uaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogdGhpcy5vdXRlcldpZHRoKCksXG4gICAgICAgIGg6IHRoaXMub3V0ZXJIZWlnaHQoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdGlzZSB0aGUgZGltZW5zaW9ucyBmb3IgZXh0ZXJuYWwgbGF5b3V0cyAoYXZvaWQgZGl2aXNpb24gYnkgemVybylcbiAgICBpZiAoZGltcy53ID09PSAwIHx8IGRpbXMuaCA9PT0gMCkge1xuICAgICAgZGltcy53ID0gZGltcy5oID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGRpbXM7XG4gIH0sXG4gIC8vIHVzaW5nIHN0YW5kYXJkIGxheW91dCBvcHRpb25zLCBhcHBseSBwb3NpdGlvbiBmdW5jdGlvbiAody8gb3Igdy9vIGFuaW1hdGlvbilcbiAgbGF5b3V0UG9zaXRpb25zOiBmdW5jdGlvbiBsYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBmbikge1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiAhbi5pc1BhcmVudCgpO1xuICAgIH0pO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbGF5b3V0RWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gbm9kZXMgJiBlZGdlc1xuICAgIHZhciBnZXRNZW1vaXplS2V5ID0gZnVuY3Rpb24gZ2V0TWVtb2l6ZUtleShub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5pZCgpO1xuICAgIH07XG4gICAgdmFyIGZuTWVtID0gbWVtb2l6ZSQxKGZuLCBnZXRNZW1vaXplS2V5KTsgLy8gbWVtb2l6ZWQgdmVyc2lvbiBvZiBwb3NpdGlvbiBmdW5jdGlvblxuXG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gICAgbGF5b3V0LmFuaW1hdGlvbnMgPSBbXTtcbiAgICB2YXIgY2FsY3VsYXRlU3BhY2luZyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgbm9kZXNCYiwgcG9zKSB7XG4gICAgICB2YXIgY2VudGVyID0ge1xuICAgICAgICB4OiBub2Rlc0JiLngxICsgbm9kZXNCYi53IC8gMixcbiAgICAgICAgeTogbm9kZXNCYi55MSArIG5vZGVzQmIuaCAvIDJcbiAgICAgIH07XG4gICAgICB2YXIgc3BhY2luZ1ZlY3RvciA9IHtcbiAgICAgICAgLy8gc2NhbGUgZnJvbSBjZW50ZXIgb2YgYm91bmRpbmcgYm94IChub3QgbmVjZXNzYXJpbHkgMCwwKVxuICAgICAgICB4OiAocG9zLnggLSBjZW50ZXIueCkgKiBzcGFjaW5nLFxuICAgICAgICB5OiAocG9zLnkgLSBjZW50ZXIueSkgKiBzcGFjaW5nXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyBzcGFjaW5nVmVjdG9yLngsXG4gICAgICAgIHk6IGNlbnRlci55ICsgc3BhY2luZ1ZlY3Rvci55XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHVzZVNwYWNpbmdGYWN0b3IgPSBvcHRpb25zLnNwYWNpbmdGYWN0b3IgJiYgb3B0aW9ucy5zcGFjaW5nRmFjdG9yICE9PSAxO1xuICAgIHZhciBzcGFjaW5nQmIgPSBmdW5jdGlvbiBzcGFjaW5nQmIoKSB7XG4gICAgICBpZiAoIXVzZVNwYWNpbmdGYWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IGZuTWVtKG5vZGUsIGkpO1xuICAgICAgICBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHBvcy54LCBwb3MueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmI7XG4gICAgfTtcbiAgICB2YXIgYmIgPSBzcGFjaW5nQmIoKTtcbiAgICB2YXIgZ2V0RmluYWxQb3MgPSBtZW1vaXplJDEoZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgIHZhciBuZXdQb3MgPSBmbk1lbShub2RlLCBpKTtcbiAgICAgIGlmICh1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHZhciBzcGFjaW5nID0gTWF0aC5hYnMob3B0aW9ucy5zcGFjaW5nRmFjdG9yKTtcbiAgICAgICAgbmV3UG9zID0gY2FsY3VsYXRlU3BhY2luZyhzcGFjaW5nLCBiYiwgbmV3UG9zKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSAhPSBudWxsKSB7XG4gICAgICAgIG5ld1BvcyA9IG9wdGlvbnMudHJhbnNmb3JtKG5vZGUsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3UG9zO1xuICAgIH0sIGdldE1lbW9pemVLZXkpO1xuICAgIGlmIChvcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIG5ld1BvcyA9IGdldEZpbmFsUG9zKG5vZGUsIGkpO1xuICAgICAgICB2YXIgYW5pbWF0ZU5vZGUgPSBvcHRpb25zLmFuaW1hdGVGaWx0ZXIgPT0gbnVsbCB8fCBvcHRpb25zLmFuaW1hdGVGaWx0ZXIobm9kZSwgaSk7XG4gICAgICAgIGlmIChhbmltYXRlTm9kZSkge1xuICAgICAgICAgIHZhciBhbmkgPSBub2RlLmFuaW1hdGlvbih7XG4gICAgICAgICAgICBwb3NpdGlvbjogbmV3UG9zLFxuICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGF5b3V0LmFuaW1hdGlvbnMucHVzaChhbmkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUucG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZml0KSB7XG4gICAgICAgIHZhciBmaXRBbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIGZpdDoge1xuICAgICAgICAgICAgYm91bmRpbmdCb3g6IGxheW91dEVsZXMuYm91bmRpbmdCb3hBdChnZXRGaW5hbFBvcyksXG4gICAgICAgICAgICBwYWRkaW5nOiBvcHRpb25zLnBhZGRpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goZml0QW5pKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy56b29tICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgem9vbVBhbkFuaSA9IGN5LmFuaW1hdGlvbih7XG4gICAgICAgICAgem9vbTogb3B0aW9ucy56b29tLFxuICAgICAgICAgIHBhbjogb3B0aW9ucy5wYW4sXG4gICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0LmFuaW1hdGlvbnMucHVzaCh6b29tUGFuQW5pKTtcbiAgICAgIH1cbiAgICAgIGxheW91dC5hbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaSkge1xuICAgICAgICByZXR1cm4gYW5pLnBsYXkoKTtcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgICAgUHJvbWlzZSQxLmFsbChsYXlvdXQuYW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24gKGFuaSkge1xuICAgICAgICByZXR1cm4gYW5pLnByb21pc2UoKTtcbiAgICAgIH0pKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZXMucG9zaXRpb25zKGdldEZpbmFsUG9zKTtcbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICBjeS5maXQob3B0aW9ucy5lbGVzLCBvcHRpb25zLnBhZGRpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuem9vbSAhPSBudWxsKSB7XG4gICAgICAgIGN5Lnpvb20ob3B0aW9ucy56b29tKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnBhbikge1xuICAgICAgICBjeS5wYW4ob3B0aW9ucy5wYW4pO1xuICAgICAgfVxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBsYXlvdXQ6IGZ1bmN0aW9uIGxheW91dChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHJldHVybiBjeS5tYWtlTGF5b3V0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgZWxlczogdGhpc1xuICAgIH0pKTtcbiAgfVxufTtcblxuLy8gYWxpYXNlczpcbmVsZXNmbiQ1LmNyZWF0ZUxheW91dCA9IGVsZXNmbiQ1Lm1ha2VMYXlvdXQgPSBlbGVzZm4kNS5sYXlvdXQ7XG5cbmZ1bmN0aW9uIHN0eWxlQ2FjaGUoa2V5LCBmbiwgZWxlKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGNhY2hlID0gX3Auc3R5bGVDYWNoZSA9IF9wLnN0eWxlQ2FjaGUgfHwgW107XG4gIHZhciB2YWw7XG4gIGlmICgodmFsID0gY2FjaGVba2V5XSkgIT0gbnVsbCkge1xuICAgIHJldHVybiB2YWw7XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gY2FjaGVba2V5XSA9IGZuKGVsZSk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuZnVuY3Rpb24gY2FjaGVTdHlsZUZ1bmN0aW9uKGtleSwgZm4pIHtcbiAga2V5ID0gaGFzaFN0cmluZyhrZXkpO1xuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkU3R5bGVGdW5jdGlvbihlbGUpIHtcbiAgICByZXR1cm4gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpO1xuICB9O1xufVxuZnVuY3Rpb24gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKGtleSwgZm4pIHtcbiAga2V5ID0gaGFzaFN0cmluZyhrZXkpO1xuICB2YXIgc2VsZkZuID0gZnVuY3Rpb24gc2VsZkZuKGVsZSkge1xuICAgIHJldHVybiBmbi5jYWxsKGVsZSk7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBzdHlsZUNhY2hlKGtleSwgc2VsZkZuLCBlbGUpO1xuICAgIH1cbiAgfTtcbn1cbnZhciBlbGVzZm4kNCA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG4gICAgaWYgKHJlbmRlcmVyICYmIHN0eWxlRW5hYmxlZCkge1xuICAgICAgcmVuZGVyZXIucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHRoaXMsIHVzZUNhY2hlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRpcnR5U3R5bGVDYWNoZTogZnVuY3Rpb24gZGlydHlTdHlsZUNhY2hlKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgZGlydHkgPSBmdW5jdGlvbiBkaXJ0eShlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuc3R5bGVDYWNoZSA9IG51bGw7XG4gICAgfTtcbiAgICBpZiAoY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICB2YXIgZWxlcztcbiAgICAgIGVsZXMgPSB0aGlzLnNwYXduU2VsZigpLm1lcmdlKHRoaXMuZGVzY2VuZGFudHMoKSkubWVyZ2UodGhpcy5wYXJlbnRzKCkpO1xuICAgICAgZWxlcy5tZXJnZShlbGVzLmNvbm5lY3RlZEVkZ2VzKCkpO1xuICAgICAgZWxlcy5mb3JFYWNoKGRpcnR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgZGlydHkoZWxlKTtcbiAgICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChkaXJ0eSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIGZ1bGx5IHVwZGF0ZXMgKHJlY2FsY3VsYXRlcykgdGhlIHN0eWxlIGZvciB0aGUgZWxlbWVudHNcbiAgdXBkYXRlU3R5bGU6IGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKGN5LmJhdGNoaW5nKCkpIHtcbiAgICAgIHZhciBiRWxlcyA9IGN5Ll9wcml2YXRlLmJhdGNoU3R5bGVFbGVzO1xuICAgICAgYkVsZXMubWVyZ2UodGhpcyk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmcgYW5kIGV4aXQgZWFybHkgd2hlbiBiYXRjaGluZ1xuICAgIH1cblxuICAgIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIHVwZGF0ZWRFbGVzID0gdGhpcztcbiAgICBub3RpZnlSZW5kZXJlciA9IG5vdGlmeVJlbmRlcmVyIHx8IG5vdGlmeVJlbmRlcmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgLy8gdGhlbiBhZGQgZXZlcnl0aGluZyB1cCBhbmQgZG93biBmb3IgY29tcG91bmQgc2VsZWN0b3IgY2hlY2tzXG4gICAgICB1cGRhdGVkRWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgfVxuXG4gICAgLy8gbGV0IGNoYW5nZWRFbGVzID0gc3R5bGUuYXBwbHkoIHVwZGF0ZWRFbGVzICk7XG4gICAgdmFyIGNoYW5nZWRFbGVzID0gdXBkYXRlZEVsZXM7XG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgcmVuZGVyZXIga25vdyB3ZSBjaGFuZ2VkIHN0eWxlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRFbGVzLmVtaXQoJ3N0eWxlJyk7IC8vIGp1c3QgZmlyZSB0aGUgZXZlbnRcbiAgICB9XG5cbiAgICB1cGRhdGVkRWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgLy8gcHJpdmF0ZTogY2xlYXJzIGRpcnR5IGZsYWcgYW5kIHJlY2FsY3VsYXRlcyBzdHlsZVxuICBjbGVhblN0eWxlOiBmdW5jdGlvbiBjbGVhblN0eWxlKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAoZWxlLl9wcml2YXRlLnN0eWxlRGlydHkpIHtcbiAgICAgICAgLy8gbi5iLiB0aGlzIGZsYWcgc2hvdWxkIGJlIHNldCBiZWZvcmUgYXBwbHkoKSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgcmVjdXJzaW9uXG4gICAgICAgIGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5ID0gZmFsc2U7XG4gICAgICAgIGN5LnN0eWxlKCkuYXBwbHkoZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIGdldCB0aGUgaW50ZXJuYWwgcGFyc2VkIHN0eWxlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICBwYXJzZWRTdHlsZTogZnVuY3Rpb24gcGFyc2VkU3R5bGUocHJvcGVydHkpIHtcbiAgICB2YXIgaW5jbHVkZU5vbkRlZmF1bHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZWxlKSB7XG4gICAgICB0aGlzLmNsZWFuU3R5bGUoKTtcbiAgICAgIHZhciBvdmVycmlkZGVuU3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGVbcHJvcGVydHldO1xuICAgICAgaWYgKG92ZXJyaWRkZW5TdHlsZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZGVuU3R5bGU7XG4gICAgICB9IGVsc2UgaWYgKGluY2x1ZGVOb25EZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBjeS5zdHlsZSgpLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG51bWVyaWNTdHlsZTogZnVuY3Rpb24gbnVtZXJpY1N0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKCFlbGUuY3koKS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgcHN0eWxlID0gZWxlLnBzdHlsZShwcm9wZXJ0eSk7XG4gICAgICByZXR1cm4gcHN0eWxlLnBmVmFsdWUgIT09IHVuZGVmaW5lZCA/IHBzdHlsZS5wZlZhbHVlIDogcHN0eWxlLnZhbHVlO1xuICAgIH1cbiAgfSxcbiAgbnVtZXJpY1N0eWxlVW5pdHM6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZVVuaXRzKHByb3BlcnR5KSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKCFlbGUuY3koKS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZShwcm9wZXJ0eSkudW5pdHM7XG4gICAgfVxuICB9LFxuICAvLyBnZXQgdGhlIHNwZWNpZmllZCBjc3MgcHJvcGVydHkgYXMgYSByZW5kZXJlZCB2YWx1ZSAoaS5lLiBvbi1zY3JlZW4gdmFsdWUpXG4gIC8vIG9yIGdldCB0aGUgd2hvbGUgcmVuZGVyZWQgc3R5bGUgaWYgbm8gcHJvcGVydHkgc3BlY2lmaWVkIChOQiBkb2Vzbid0IGFsbG93IHNldHRpbmcpXG4gIHJlbmRlcmVkU3R5bGU6IGZ1bmN0aW9uIHJlbmRlcmVkU3R5bGUocHJvcGVydHkpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBjeS5zdHlsZSgpLmdldFJlbmRlcmVkU3R5bGUoZWxlLCBwcm9wZXJ0eSk7XG4gICAgfVxuICB9LFxuICAvLyByZWFkIHRoZSBjYWxjdWxhdGVkIGNzcyBzdHlsZSBvZiB0aGUgZWxlbWVudCBvciBvdmVycmlkZSB0aGUgc3R5bGUgKHZpYSBhIGJ5cGFzcylcbiAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlVHJhbnNpdGlvbnMgPSBmYWxzZTtcbiAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgICAgLy8gdGhlbiBleHRlbmQgdGhlIGJ5cGFzc1xuICAgICAgdmFyIHByb3BzID0gbmFtZTtcbiAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIHByb3BzLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG4gICAgfSBlbHNlIGlmIChzdHJpbmcobmFtZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBzdHlsZVxuICAgICAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICAgICAgaWYgKGVsZSkge1xuICAgICAgICAgIHJldHVybiBzdHlsZS5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9uID0+IGNhbid0IGdldCBhbnkgdmFsdWVcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZW4gc2V0IHRoZSBieXBhc3Mgd2l0aCB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgc3R5bGUuYXBwbHlCeXBhc3ModGhpcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2VsZSA9IHRoaXNbMF07XG4gICAgICBpZiAoX2VsZSkge1xuICAgICAgICByZXR1cm4gc3R5bGUuZ2V0UmF3U3R5bGUoX2VsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9uID0+IGNhbid0IGdldCBhbnkgdmFsdWVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICByZW1vdmVTdHlsZTogZnVuY3Rpb24gcmVtb3ZlU3R5bGUobmFtZXMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciB1cGRhdGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuICAgIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGlmIChuYW1lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHN0eWxlLnJlbW92ZUFsbEJ5cGFzc2VzKGVsZSwgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lcyA9IG5hbWVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIF9lbGUyID0gZWxlc1tfaV07XG4gICAgICAgIHN0eWxlLnJlbW92ZUJ5cGFzc2VzKF9lbGUyLCBuYW1lcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMuY3NzKCdkaXNwbGF5JywgJ2VsZW1lbnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBoaWRlOiBmdW5jdGlvbiBoaWRlKCkge1xuICAgIHRoaXMuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBlZmZlY3RpdmVPcGFjaXR5OiBmdW5jdGlvbiBlZmZlY3RpdmVPcGFjaXR5KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgdmFyIHBhcmVudE9wYWNpdHkgPSBlbGUucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gICAgICBpZiAoIWhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudE9wYWNpdHk7XG4gICAgICB9XG4gICAgICB2YXIgcGFyZW50cyA9ICFfcC5kYXRhLnBhcmVudCA/IG51bGwgOiBlbGUucGFyZW50cygpO1xuICAgICAgaWYgKHBhcmVudHMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbaV07XG4gICAgICAgICAgdmFyIG9wYWNpdHkgPSBwYXJlbnQucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gICAgICAgICAgcGFyZW50T3BhY2l0eSA9IG9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50T3BhY2l0eTtcbiAgICB9XG4gIH0sXG4gIHRyYW5zcGFyZW50OiBmdW5jdGlvbiB0cmFuc3BhcmVudCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGVsZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICBpZiAoIWhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZSA9PT0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYmFja2dyb3VuZGluZzogZnVuY3Rpb24gYmFja2dyb3VuZGluZygpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmJhY2tncm91bmRpbmcgPyB0cnVlIDogZmFsc2U7XG4gIH1cbn07XG5mdW5jdGlvbiBjaGVja0NvbXBvdW5kKGVsZSwgcGFyZW50T2spIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGFyZW50cyA9IF9wLmRhdGEucGFyZW50ID8gZWxlLnBhcmVudHMoKSA6IG51bGw7XG4gIGlmIChwYXJlbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcbiAgICAgIGlmICghcGFyZW50T2socGFyZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oc3BlY3MpIHtcbiAgdmFyIG9rID0gc3BlY3Mub2s7XG4gIHZhciBlZGdlT2tWaWFOb2RlID0gc3BlY3MuZWRnZU9rVmlhTm9kZSB8fCBzcGVjcy5vaztcbiAgdmFyIHBhcmVudE9rID0gc3BlY3MucGFyZW50T2sgfHwgc3BlY3Mub2s7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBpZiAoIW9rKGVsZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICByZXR1cm4gIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZChlbGUsIHBhcmVudE9rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgICAgIHJldHVybiBlZGdlT2tWaWFOb2RlKHNyYykgJiYgKCFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQoc3JjLCBlZGdlT2tWaWFOb2RlKSkgJiYgKHNyYyA9PT0gdGd0IHx8IGVkZ2VPa1ZpYU5vZGUodGd0KSAmJiAoIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZCh0Z3QsIGVkZ2VPa1ZpYU5vZGUpKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxudmFyIGVsZVRha2VzVXBTcGFjZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlVGFrZXNVcFNwYWNlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlID09PSAnZWxlbWVudCcgJiYgZWxlLndpZHRoKCkgIT09IDAgJiYgKGVsZS5pc05vZGUoKSA/IGVsZS5oZWlnaHQoKSAhPT0gMCA6IHRydWUpO1xufSk7XG5lbGVzZm4kNC50YWtlc1VwU3BhY2UgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ3Rha2VzVXBTcGFjZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZVRha2VzVXBTcGFjZVxufSkpO1xudmFyIGVsZUludGVyYWN0aXZlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVJbnRlcmFjdGl2ZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ2V2ZW50cycpLnZhbHVlID09PSAneWVzJyAmJiBlbGUucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGVUYWtlc1VwU3BhY2UoZWxlKTtcbn0pO1xudmFyIHBhcmVudEludGVyYWN0aXZlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdwYXJlbnRJbnRlcmFjdGl2ZScsIGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgcmV0dXJuIHBhcmVudC5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZVRha2VzVXBTcGFjZShwYXJlbnQpO1xufSk7XG5lbGVzZm4kNC5pbnRlcmFjdGl2ZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbignaW50ZXJhY3RpdmUnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVJbnRlcmFjdGl2ZSxcbiAgcGFyZW50T2s6IHBhcmVudEludGVyYWN0aXZlLFxuICBlZGdlT2tWaWFOb2RlOiBlbGVUYWtlc1VwU3BhY2Vcbn0pKTtcbmVsZXNmbiQ0Lm5vbmludGVyYWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmludGVyYWN0aXZlKCk7XG4gIH1cbn07XG52YXIgZWxlVmlzaWJsZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlVmlzaWJsZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZS5wc3R5bGUoJ29wYWNpdHknKS5wZlZhbHVlICE9PSAwICYmIGVsZVRha2VzVXBTcGFjZShlbGUpO1xufSk7XG52YXIgZWRnZVZpc2libGVWaWFOb2RlID0gZWxlVGFrZXNVcFNwYWNlO1xuZWxlc2ZuJDQudmlzaWJsZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbigndmlzaWJsZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZVZpc2libGUsXG4gIGVkZ2VPa1ZpYU5vZGU6IGVkZ2VWaXNpYmxlVmlhTm9kZVxufSkpO1xuZWxlc2ZuJDQuaGlkZGVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnZpc2libGUoKTtcbiAgfVxufTtcbmVsZXNmbiQ0LmlzQnVuZGxlZEJlemllciA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbignaXNCdW5kbGVkQmV6aWVyJywgZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY3koKS5zdHlsZUVuYWJsZWQoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gIXRoaXMucmVtb3ZlZCgpICYmIHRoaXMucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlID09PSAnYmV6aWVyJyAmJiB0aGlzLnRha2VzVXBTcGFjZSgpO1xufSk7XG5lbGVzZm4kNC5ieXBhc3MgPSBlbGVzZm4kNC5jc3MgPSBlbGVzZm4kNC5zdHlsZTtcbmVsZXNmbiQ0LnJlbmRlcmVkQ3NzID0gZWxlc2ZuJDQucmVuZGVyZWRTdHlsZTtcbmVsZXNmbiQ0LnJlbW92ZUJ5cGFzcyA9IGVsZXNmbiQ0LnJlbW92ZUNzcyA9IGVsZXNmbiQ0LnJlbW92ZVN0eWxlO1xuZWxlc2ZuJDQucHN0eWxlID0gZWxlc2ZuJDQucGFyc2VkU3R5bGU7XG5cbnZhciBlbGVzZm4kMyA9IHt9O1xuZnVuY3Rpb24gZGVmaW5lU3dpdGNoRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGNoYW5nZWRFbGVzID0gW107XG5cbiAgICAvLyBlLmcuIGN5Lm5vZGVzKCkuc2VsZWN0KCBkYXRhLCBoYW5kbGVyIClcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhciBkYXRhID0gYXJnc1swXTtcbiAgICAgIHZhciBoYW5kbGVyID0gYXJnc1sxXTtcbiAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBkYXRhLCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvLyBlLmcuIGN5Lm5vZGVzKCkuc2VsZWN0KCBoYW5kbGVyIClcbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBmbiQ2KGFyZ3NbMF0pKSB7XG4gICAgICB2YXIgX2hhbmRsZXIgPSBhcmdzWzBdO1xuICAgICAgdGhpcy5vbihwYXJhbXMuZXZlbnQsIF9oYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvLyBlLmcuIGN5Lm5vZGVzKCkuc2VsZWN0KClcbiAgICAvLyBlLmcuIChwcml2YXRlKSBjeS5ub2RlcygpLnNlbGVjdChbJ3RhcHNlbGVjdCddKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3MubGVuZ3RoID09PSAxICYmIGFycmF5KGFyZ3NbMF0pKSB7XG4gICAgICB2YXIgYWRkbEV2ZW50cyA9IGFyZ3MubGVuZ3RoID09PSAxID8gYXJnc1swXSA6IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICAgIHZhciBhYmxlID0gIXBhcmFtcy5hYmxlRmllbGQgfHwgZWxlLl9wcml2YXRlW3BhcmFtcy5hYmxlRmllbGRdO1xuICAgICAgICB2YXIgY2hhbmdlZCA9IGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdICE9IHBhcmFtcy52YWx1ZTtcbiAgICAgICAgaWYgKHBhcmFtcy5vdmVycmlkZUFibGUpIHtcbiAgICAgICAgICB2YXIgb3ZlcnJpZGVBYmxlID0gcGFyYW1zLm92ZXJyaWRlQWJsZShlbGUpO1xuICAgICAgICAgIGlmIChvdmVycmlkZUFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWJsZSA9IG92ZXJyaWRlQWJsZTtcbiAgICAgICAgICAgIGlmICghb3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSAvLyB0byBzYXZlIGN5Y2xlcyBhc3N1bWUgbm90IGFibGUgZm9yIGFsbCBvbiBvdmVycmlkZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhYmxlKSB7XG4gICAgICAgICAgZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gPSBwYXJhbXMudmFsdWU7XG4gICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNoYW5nZWRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkQ29sbCA9IHRoaXMuc3Bhd24oY2hhbmdlZEVsZXMpO1xuICAgICAgY2hhbmdlZENvbGwudXBkYXRlU3R5bGUoKTsgLy8gY2hhbmdlIG9mIHN0YXRlID0+IHBvc3NpYmxlIGNoYW5nZSBvZiBzdHlsZVxuICAgICAgY2hhbmdlZENvbGwuZW1pdChwYXJhbXMuZXZlbnQpO1xuICAgICAgaWYgKGFkZGxFdmVudHMpIHtcbiAgICAgICAgY2hhbmdlZENvbGwuZW1pdChhZGRsRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hTZXQocGFyYW1zKSB7XG4gIGVsZXNmbiQzW3BhcmFtcy5maWVsZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHBhcmFtcy5vdmVycmlkZUZpZWxkKSB7XG4gICAgICAgIHZhciB2YWwgPSBwYXJhbXMub3ZlcnJpZGVGaWVsZChlbGUpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF07XG4gICAgfVxuICB9O1xuICBlbGVzZm4kM1twYXJhbXMub25dID0gZGVmaW5lU3dpdGNoRnVuY3Rpb24oe1xuICAgIGV2ZW50OiBwYXJhbXMub24sXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBlbGVzZm4kM1twYXJhbXMub2ZmXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9mZixcbiAgICBmaWVsZDogcGFyYW1zLmZpZWxkLFxuICAgIGFibGVGaWVsZDogcGFyYW1zLmFibGVGaWVsZCxcbiAgICBvdmVycmlkZUFibGU6IHBhcmFtcy5vdmVycmlkZUFibGUsXG4gICAgdmFsdWU6IGZhbHNlXG4gIH0pO1xufVxuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdsb2NrZWQnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvbG9jaygpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdsb2NrJyxcbiAgb2ZmOiAndW5sb2NrJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2dyYWJiYWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bmdyYWJpZnkoKSB8fCBlbGUucGFubmFibGUoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2dyYWJpZnknLFxuICBvZmY6ICd1bmdyYWJpZnknXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0ZWQnLFxuICBhYmxlRmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVBYmxlOiBmdW5jdGlvbiBvdmVycmlkZUFibGUoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0JyxcbiAgb2ZmOiAndW5zZWxlY3QnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0aWZ5JyxcbiAgb2ZmOiAndW5zZWxlY3RpZnknXG59KTtcbmVsZXNmbiQzLmRlc2VsZWN0ID0gZWxlc2ZuJDMudW5zZWxlY3Q7XG5lbGVzZm4kMy5ncmFiYmVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgfVxufTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnYWN0aXZlJyxcbiAgb246ICdhY3RpdmF0ZScsXG4gIG9mZjogJ3VuYWN0aXZhdGUnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAncGFubmFibGUnLFxuICBvbjogJ3BhbmlmeScsXG4gIG9mZjogJ3VucGFuaWZ5J1xufSk7XG5lbGVzZm4kMy5pbmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5fcHJpdmF0ZS5hY3RpdmU7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kMiA9IHt9O1xuXG4vLyBEQUcgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBkZWZpbmVEYWdFeHRyZW1pdHkgPSBmdW5jdGlvbiBkZWZpbmVEYWdFeHRyZW1pdHkocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkYWdFeHRyZW1pdHlJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciByZXQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZGlzcXVhbGlmaWVkID0gZmFsc2U7XG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICBpZiAocGFyYW1zLm5vSW5jb21pbmdFZGdlcyAmJiB0Z3QgPT09IGVsZSAmJiBzcmMgIT09IGVsZSB8fCBwYXJhbXMubm9PdXRnb2luZ0VkZ2VzICYmIHNyYyA9PT0gZWxlICYmIHRndCAhPT0gZWxlKSB7XG4gICAgICAgICAgZGlzcXVhbGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNxdWFsaWZpZWQpIHtcbiAgICAgICAgcmV0LnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0LCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdPbmVIb3AgPSBmdW5jdGlvbiBkZWZpbmVEYWdPbmVIb3AocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIG9FbGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5vdXRnb2luZyAmJiBzcmMgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaCh0Z3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5pbmNvbWluZyAmJiB0Z3QgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKG9FbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdBbGxIb3BzID0gZnVuY3Rpb24gZGVmaW5lRGFnQWxsSG9wcyhwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgc0VsZXMgPSBbXTtcbiAgICB2YXIgc0VsZXNJZHMgPSB7fTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgbmV4dCA9IHBhcmFtcy5vdXRnb2luZyA/IGVsZXMub3V0Z29lcnMoKSA6IGVsZXMuaW5jb21lcnMoKTtcbiAgICAgIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiBub25lIGxlZnRcblxuICAgICAgdmFyIG5ld05leHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbiA9IG5leHRbaV07XG4gICAgICAgIHZhciBuaWQgPSBuLmlkKCk7XG4gICAgICAgIGlmICghc0VsZXNJZHNbbmlkXSkge1xuICAgICAgICAgIHNFbGVzSWRzW25pZF0gPSB0cnVlO1xuICAgICAgICAgIHNFbGVzLnB1c2gobik7XG4gICAgICAgICAgbmV3TmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghbmV3TmV4dCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiB0b3VjaGVkIGFsbCBvdXRnb2VycyBhbHJlYWR5XG5cbiAgICAgIGVsZXMgPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihzRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG5lbGVzZm4kMi5jbGVhclRyYXZlcnNhbENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldLl9wcml2YXRlLnRyYXZlcnNhbENhY2hlID0gbnVsbDtcbiAgfVxufTtcbmV4dGVuZChlbGVzZm4kMiwge1xuICAvLyBnZXQgdGhlIHJvb3Qgbm9kZXMgaW4gdGhlIERBR1xuICByb290czogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub0luY29taW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIGdldCB0aGUgbGVhZiBub2RlcyBpbiB0aGUgREFHXG4gIGxlYXZlczogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub091dGdvaW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBjaGlsZHJlbiBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPWVkZ2VzPT4gb3V0Z29pbmcgbm9kZXNcbiAgb3V0Z29lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksICdvdXRnb2VycycpLFxuICAvLyBha2EgREFHIGRlc2NlbmRhbnRzXG4gIHN1Y2Nlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgcGFyZW50cyBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPD1lZGdlcz0gaW5jb21pbmcgbm9kZXNcbiAgaW5jb21lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSksICdpbmNvbWVycycpLFxuICAvLyBha2EgREFHIGFuY2VzdG9yc1xuICBwcmVkZWNlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIGluY29taW5nOiB0cnVlXG4gIH0pXG59KTtcblxuLy8gTmVpZ2hib3VyaG9vZCBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBuZWlnaGJvcmhvb2Q6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBmb3IgYWxsIG5vZGVzXG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpO1xuXG4gICAgICAvLyBmb3IgZWFjaCBjb25uZWN0ZWQgZWRnZSwgYWRkIHRoZSBlZGdlIGFuZCB0aGUgb3RoZXIgbm9kZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBvdGhlck5vZGUgPSBub2RlID09PSBzcmMgPyB0Z3QgOiBzcmM7XG5cbiAgICAgICAgLy8gbmVlZCBjaGVjayBpbiBjYXNlIG9mIGxvb3BcbiAgICAgICAgaWYgKG90aGVyTm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChvdGhlck5vZGVbMF0pOyAvLyBhZGQgbm9kZSAxIGhvcCBhd2F5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgY29ubmVjdGVkIGVkZ2VcbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICduZWlnaGJvcmhvb2QnKSxcbiAgY2xvc2VkTmVpZ2hib3Job29kOiBmdW5jdGlvbiBjbG9zZWROZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2QoKS5hZGQodGhpcykuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgb3Blbk5laWdoYm9yaG9vZDogZnVuY3Rpb24gb3Blbk5laWdoYm9yaG9vZChzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm5laWdoYm9yaG9vZChzZWxlY3Rvcik7XG4gIH1cbn0pO1xuXG4vLyBhbGlhc2VzXG5lbGVzZm4kMi5uZWlnaGJvdXJob29kID0gZWxlc2ZuJDIubmVpZ2hib3Job29kO1xuZWxlc2ZuJDIuY2xvc2VkTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLmNsb3NlZE5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLm9wZW5OZWlnaGJvdXJob29kID0gZWxlc2ZuJDIub3Blbk5laWdoYm9yaG9vZDtcblxuLy8gRWRnZSBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBzb3VyY2U6IGNhY2hlKGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgc3JjO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHNyYyA9IGVsZS5fcHJpdmF0ZS5zb3VyY2UgfHwgZWxlLmN5KCkuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gc3JjICYmIHNlbGVjdG9yID8gc3JjLmZpbHRlcihzZWxlY3RvcikgOiBzcmM7XG4gIH0sICdzb3VyY2UnKSxcbiAgdGFyZ2V0OiBjYWNoZShmdW5jdGlvbiB0YXJnZXRJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHRndDtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB0Z3QgPSBlbGUuX3ByaXZhdGUudGFyZ2V0IHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRndCAmJiBzZWxlY3RvciA/IHRndC5maWx0ZXIoc2VsZWN0b3IpIDogdGd0O1xuICB9LCAndGFyZ2V0JyksXG4gIHNvdXJjZXM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAnc291cmNlJ1xuICB9KSxcbiAgdGFyZ2V0czogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICd0YXJnZXQnXG4gIH0pXG59KTtcbmZ1bmN0aW9uIGRlZmluZVNvdXJjZUZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gc291cmNlSW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBzcmMgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmF0dHJdO1xuICAgICAgaWYgKHNyYykge1xuICAgICAgICBzb3VyY2VzLnB1c2goc3JjKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc291cmNlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kMiwge1xuICBlZGdlc1dpdGg6IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKCksICdlZGdlc1dpdGgnKSxcbiAgZWRnZXNUbzogY2FjaGUoZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24oe1xuICAgIHRoaXNJc1NyYzogdHJ1ZVxuICB9KSwgJ2VkZ2VzVG8nKVxufSk7XG5mdW5jdGlvbiBkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGVkZ2VzV2l0aEltcGwob3RoZXJOb2Rlcykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHAgPSBwYXJhbXMgfHwge307XG5cbiAgICAvLyBnZXQgZWxlbWVudHMgaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWRcbiAgICBpZiAoc3RyaW5nKG90aGVyTm9kZXMpKSB7XG4gICAgICBvdGhlck5vZGVzID0gY3kuJChvdGhlck5vZGVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaCA9IDA7IGggPCBvdGhlck5vZGVzLmxlbmd0aDsgaCsrKSB7XG4gICAgICB2YXIgZWRnZXMgPSBvdGhlck5vZGVzW2hdLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgICB2YXIgZWRnZURhdGEgPSBlZGdlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0aGlzVG9PdGhlciA9IHRoaXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS5zb3VyY2UpICYmIG90aGVyTm9kZXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS50YXJnZXQpO1xuICAgICAgICB2YXIgb3RoZXJUb1RoaXMgPSBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIGVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlciA9IHRoaXNUb090aGVyIHx8IG90aGVyVG9UaGlzO1xuICAgICAgICBpZiAoIWVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRoaXNJc1NyYyB8fCBwLnRoaXNJc1RndCkge1xuICAgICAgICAgIGlmIChwLnRoaXNJc1NyYyAmJiAhdGhpc1RvT3RoZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocC50aGlzSXNUZ3QgJiYgIW90aGVyVG9UaGlzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpO1xuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbm5lY3RlZEVkZ2VzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gZWxlc1tpXTtcbiAgICAgIGlmICghbm9kZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHJldEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZEVkZ2VzJyksXG4gIGNvbm5lY3RlZE5vZGVzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWRnZS5pc0VkZ2UoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnNvdXJjZSgpWzBdKTtcbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnRhcmdldCgpWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZE5vZGVzJyksXG4gIHBhcmFsbGVsRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbigpLCAncGFyYWxsZWxFZGdlcycpLFxuICBjb2RpcmVjdGVkRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbih7XG4gICAgY29kaXJlY3RlZDogdHJ1ZVxuICB9KSwgJ2NvZGlyZWN0ZWRFZGdlcycpXG59KTtcbmZ1bmN0aW9uIGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbihwYXJhbXMpIHtcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGNvZGlyZWN0ZWQ6IGZhbHNlXG4gIH07XG4gIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbGxlbEVkZ2VzSW1wbChzZWxlY3Rvcikge1xuICAgIC8vIG1pY3JvLW9wdGltaXNlZCBmb3IgcmVuZGVyZXJcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gICAgdmFyIHAgPSBwYXJhbXM7XG5cbiAgICAvLyBsb29rIGF0IGFsbCB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZTEgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBlZGdlMV9wID0gZWRnZTEuX3ByaXZhdGU7XG4gICAgICB2YXIgc3JjMSA9IGVkZ2UxX3Auc291cmNlO1xuICAgICAgdmFyIHNyY2lkMSA9IHNyYzEuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciB0Z3RpZDEgPSBlZGdlMV9wLmRhdGEudGFyZ2V0O1xuICAgICAgdmFyIHNyY0VkZ2VzMSA9IHNyYzEuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIC8vIGxvb2sgYXQgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBzcmMgbm9kZSBvZiB0aGlzIGVkZ2VcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3JjRWRnZXMxLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlMiA9IHNyY0VkZ2VzMVtqXTtcbiAgICAgICAgdmFyIGVkZ2UyZGF0YSA9IGVkZ2UyLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0Z3RpZDIgPSBlZGdlMmRhdGEudGFyZ2V0O1xuICAgICAgICB2YXIgc3JjaWQyID0gZWRnZTJkYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIGNvZGlyZWN0ZWQgPSB0Z3RpZDIgPT09IHRndGlkMSAmJiBzcmNpZDIgPT09IHNyY2lkMTtcbiAgICAgICAgdmFyIG9wcGRpcmVjdGVkID0gc3JjaWQxID09PSB0Z3RpZDIgJiYgdGd0aWQxID09PSBzcmNpZDI7XG4gICAgICAgIGlmIChwLmNvZGlyZWN0ZWQgJiYgY29kaXJlY3RlZCB8fCAhcC5jb2RpcmVjdGVkICYmIChjb2RpcmVjdGVkIHx8IG9wcGRpcmVjdGVkKSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZTIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4vLyBNaXNjIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbXBvbmVudHM6IGZ1bmN0aW9uIGNvbXBvbmVudHMocm9vdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgdmFyIHVudmlzaXRlZCA9IHJvb3QgPT0gbnVsbCA/IHNlbGYubm9kZXMoKSA6IHJvb3Qubm9kZXMoKTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgIGlmIChyb290ICE9IG51bGwgJiYgdW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIC8vIHJvb3QgbWF5IGNvbnRhaW4gb25seSBlZGdlc1xuICAgICAgdW52aXNpdGVkID0gcm9vdC5zb3VyY2VzKCk7IC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIG5vZGUgdG8gdXNlICh1bmRpcmVjdGVkKSwgc28ganVzdCB1c2UgdGhlIHNvdXJjZSBzaWRlc1xuICAgIH1cblxuICAgIHZhciB2aXNpdEluQ29tcG9uZW50ID0gZnVuY3Rpb24gdmlzaXRJbkNvbXBvbmVudChub2RlLCBjb21wb25lbnQpIHtcbiAgICAgIHZpc2l0ZWQubWVyZ2Uobm9kZSk7XG4gICAgICB1bnZpc2l0ZWQudW5tZXJnZShub2RlKTtcbiAgICAgIGNvbXBvbmVudC5tZXJnZShub2RlKTtcbiAgICB9O1xuICAgIGlmICh1bnZpc2l0ZWQuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuIHNlbGYuc3Bhd24oKTtcbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBlYWNoIGl0ZXJhdGlvbiB5aWVsZHMgYSBjb21wb25lbnRcbiAgICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgY29tcG9uZW50cy5wdXNoKGNtcHQpO1xuICAgICAgdmFyIHJvb3QgPSB1bnZpc2l0ZWRbMF07XG4gICAgICB2aXNpdEluQ29tcG9uZW50KHJvb3QsIGNtcHQpO1xuICAgICAgc2VsZi5iZnMoe1xuICAgICAgICBkaXJlY3RlZDogZmFsc2UsXG4gICAgICAgIHJvb3RzOiByb290LFxuICAgICAgICB2aXNpdDogZnVuY3Rpb24gdmlzaXQodikge1xuICAgICAgICAgIHJldHVybiB2aXNpdEluQ29tcG9uZW50KHYsIGNtcHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNtcHQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIC8vIGNvbm5lY3RlZEVkZ2VzKCkgdXN1YWxseSBjYWNoZWRcbiAgICAgICAgICBpZiAoc2VsZi5oYXMoZSkgJiYgY21wdC5oYXMoZS5zb3VyY2UoKSkgJiYgY21wdC5oYXMoZS50YXJnZXQoKSkpIHtcbiAgICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgICBjbXB0Lm1lcmdlKGUpOyAvLyBmb3JFYWNoKCkgb25seSBjb25zaWRlcnMgbm9kZXMgLS0gc2V0cyBOIGF0IGNhbGwgdGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGRvIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfSB3aGlsZSAodW52aXNpdGVkLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9LFxuICBjb21wb25lbnQ6IGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICByZXR1cm4gZWxlLmN5KCkubXV0YWJsZUVsZW1lbnRzKCkuY29tcG9uZW50cyhlbGUpWzBdO1xuICB9XG59KTtcbmVsZXNmbiQyLmNvbXBvbmVudHNPZiA9IGVsZXNmbiQyLmNvbXBvbmVudHM7XG5cbi8vIHJlcHJlc2VudHMgYSBzZXQgb2Ygbm9kZXMsIGVkZ2VzLCBvciBib3RoIHRvZ2V0aGVyXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIENvbGxlY3Rpb24oY3ksIGVsZW1lbnRzKSB7XG4gIHZhciB1bmlxdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICB2YXIgcmVtb3ZlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gIGlmIChjeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXJyb3IoJ0EgY29sbGVjdGlvbiBtdXN0IGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvcmUnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hcCA9IG5ldyBNYXAkMigpO1xuICB2YXIgY3JlYXRlZEVsZW1lbnRzID0gZmFsc2U7XG4gIGlmICghZWxlbWVudHMpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuICB9IGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgcGxhaW5PYmplY3QoZWxlbWVudHNbMF0pICYmICFlbGVtZW50KGVsZW1lbnRzWzBdKSkge1xuICAgIGNyZWF0ZWRFbGVtZW50cyA9IHRydWU7XG5cbiAgICAvLyBtYWtlIGVsZW1lbnRzIGZyb20ganNvbiBhbmQgcmVzdG9yZSBhbGwgYXQgb25jZSBsYXRlclxuICAgIHZhciBlbGVzID0gW107XG4gICAgdmFyIGVsZXNJZHMgPSBuZXcgU2V0JDEoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGpzb24gPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChqc29uLmRhdGEgPT0gbnVsbCkge1xuICAgICAgICBqc29uLmRhdGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBfZGF0YSA9IGpzb24uZGF0YTtcblxuICAgICAgLy8gbWFrZSBzdXJlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudHMgaGF2ZSB2YWxpZCBpZHNcbiAgICAgIGlmIChfZGF0YS5pZCA9PSBudWxsKSB7XG4gICAgICAgIF9kYXRhLmlkID0gdXVpZCgpO1xuICAgICAgfSBlbHNlIGlmIChjeS5oYXNFbGVtZW50V2l0aElkKF9kYXRhLmlkKSB8fCBlbGVzSWRzLmhhcyhfZGF0YS5pZCkpIHtcbiAgICAgICAgY29udGludWU7IC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIHByaW9yIGlkIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIHZhciBlbGUgPSBuZXcgRWxlbWVudChjeSwganNvbiwgZmFsc2UpO1xuICAgICAgZWxlcy5wdXNoKGVsZSk7XG4gICAgICBlbGVzSWRzLmFkZChfZGF0YS5pZCk7XG4gICAgfVxuICAgIGVsZW1lbnRzID0gZWxlcztcbiAgfVxuICB0aGlzLmxlbmd0aCA9IDA7XG4gIGZvciAodmFyIF9pID0gMCwgX2wgPSBlbGVtZW50cy5sZW5ndGg7IF9pIDwgX2w7IF9pKyspIHtcbiAgICB2YXIgZWxlbWVudCQxID0gZWxlbWVudHNbX2ldWzBdOyAvLyBbMF0gaW4gY2FzZSBlbGVtZW50cyBpcyBhbiBhcnJheSBvZiBjb2xsZWN0aW9ucywgcmF0aGVyIHRoYW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudCQxID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaWQgPSBlbGVtZW50JDEuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICBpZiAoIXVuaXF1ZSB8fCAhbWFwLmhhcyhpZCkpIHtcbiAgICAgIGlmICh1bmlxdWUpIHtcbiAgICAgICAgbWFwLnNldChpZCwge1xuICAgICAgICAgIGluZGV4OiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICBlbGU6IGVsZW1lbnQkMVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXNbdGhpcy5sZW5ndGhdID0gZWxlbWVudCQxO1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gIH1cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBlbGVzOiB0aGlzLFxuICAgIGN5OiBjeSxcbiAgICBnZXQgbWFwKCkge1xuICAgICAgaWYgKHRoaXMubGF6eU1hcCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVidWlsZE1hcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubGF6eU1hcDtcbiAgICB9LFxuICAgIHNldCBtYXAobSkge1xuICAgICAgdGhpcy5sYXp5TWFwID0gbTtcbiAgICB9LFxuICAgIHJlYnVpbGRNYXA6IGZ1bmN0aW9uIHJlYnVpbGRNYXAoKSB7XG4gICAgICB2YXIgbSA9IHRoaXMubGF6eU1hcCA9IG5ldyBNYXAkMigpO1xuICAgICAgdmFyIGVsZXMgPSB0aGlzLmVsZXM7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIF9lbGUgPSBlbGVzW19pMl07XG4gICAgICAgIG0uc2V0KF9lbGUuaWQoKSwge1xuICAgICAgICAgIGluZGV4OiBfaTIsXG4gICAgICAgICAgZWxlOiBfZWxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgaWYgKHVuaXF1ZSkge1xuICAgIHRoaXMuX3ByaXZhdGUubWFwID0gbWFwO1xuICB9XG5cbiAgLy8gcmVzdG9yZSB0aGUgZWxlbWVudHMgaWYgd2UgY3JlYXRlZCB0aGVtIGZyb20ganNvblxuICBpZiAoY3JlYXRlZEVsZW1lbnRzICYmICFyZW1vdmVkKSB7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbi8vIEZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLyBrZWVwIHRoZSBwcm90b3R5cGVzIGluIHN5bmMgKGFuIGVsZW1lbnQgaGFzIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcyBhIGNvbGxlY3Rpb24pXG4vLyBhbmQgdXNlIGVsZWZuIGFuZCBlbGVzZm4gYXMgc2hvcnRoYW5kcyB0byB0aGUgcHJvdG90eXBlc1xudmFyIGVsZXNmbiQxID0gRWxlbWVudC5wcm90b3R5cGUgPSBDb2xsZWN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXJyYXkucHJvdG90eXBlKTtcbmVsZXNmbiQxLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2NvbGxlY3Rpb24nO1xufTtcbmVsZXNmbiQxLnNwYXduID0gZnVuY3Rpb24gKGVsZXMsIHVuaXF1ZSkge1xuICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5jeSgpLCBlbGVzLCB1bmlxdWUpO1xufTtcbmVsZXNmbiQxLnNwYXduU2VsZiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuc3Bhd24odGhpcyk7XG59O1xuZWxlc2ZuJDEuY3kgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xufTtcbmVsZXNmbiQxLnJlbmRlcmVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jeS5yZW5kZXJlcigpO1xufTtcbmVsZXNmbiQxLmVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzWzBdO1xufTtcbmVsZXNmbiQxLmNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChjb2xsZWN0aW9uKHRoaXMpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSB7XG4gICAgLy8gYW4gZWxlbWVudFxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCBbdGhpc10pO1xuICB9XG59O1xuZWxlc2ZuJDEudW5pcXVlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5fcHJpdmF0ZS5jeSwgdGhpcywgdHJ1ZSk7XG59O1xuZWxlc2ZuJDEuaGFzRWxlbWVudFdpdGhJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmhhcyhpZCk7XG59O1xuZWxlc2ZuJDEuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbnRyeSA9IHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCk7XG4gIHJldHVybiBlbnRyeSA/IGVudHJ5LmVsZSA6IG5ldyBDb2xsZWN0aW9uKGN5KTsgLy8gZ2V0IGVsZSBvciBlbXB0eSBjb2xsZWN0aW9uXG59O1xuXG5lbGVzZm4kMS4kaWQgPSBlbGVzZm4kMS5nZXRFbGVtZW50QnlJZDtcbmVsZXNmbiQxLnBvb2xJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgdmFyIGlkID0gdGhpc1swXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gZWxlcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5pbmRleE9mID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgaWQgPSBlbGVbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuaW5kZXhPZklkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5qc29uID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgZWxlID0gdGhpcy5lbGVtZW50KCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKGVsZSA9PSBudWxsICYmIG9iaikge1xuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIGNhbid0IHNldCB0byBubyBlbGVzXG5cbiAgaWYgKGVsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSAvLyBjYW4ndCBnZXQgZnJvbSBubyBlbGVzXG5cbiAgdmFyIHAgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgLy8gc2V0XG5cbiAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICBlbGUuZGF0YShvYmouZGF0YSk7XG4gICAgICB2YXIgX2RhdGEyID0gcC5kYXRhO1xuICAgICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICAvLyBzb3VyY2UgYW5kIHRhcmdldCBhcmUgaW1tdXRhYmxlIHZpYSBkYXRhKClcbiAgICAgICAgdmFyIG1vdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNwZWMgPSB7fTtcbiAgICAgICAgdmFyIHNyYyA9IG9iai5kYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IG9iai5kYXRhLnRhcmdldDtcbiAgICAgICAgaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSBfZGF0YTIuc291cmNlKSB7XG4gICAgICAgICAgc3BlYy5zb3VyY2UgPSAnJyArIHNyYzsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGd0ICE9IG51bGwgJiYgdGd0ICE9IF9kYXRhMi50YXJnZXQpIHtcbiAgICAgICAgICBzcGVjLnRhcmdldCA9ICcnICsgdGd0OyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb3ZlKSB7XG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoc3BlYyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbmV3UGFyZW50VmFsU3BlY2QgPSAoJ3BhcmVudCcgaW4gb2JqLmRhdGEpO1xuICAgICAgICB2YXIgcGFyZW50ID0gb2JqLmRhdGEucGFyZW50O1xuICAgICAgICBpZiAobmV3UGFyZW50VmFsU3BlY2QgJiYgKHBhcmVudCAhPSBudWxsIHx8IF9kYXRhMi5wYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50ICE9IF9kYXRhMi5wYXJlbnQpIHtcbiAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGNhbid0IHNldCB1bmRlZmluZWQgaW1wZXJhdGl2ZWx5LCBzbyB1c2UgbnVsbFxuICAgICAgICAgICAgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSAnJyArIHBhcmVudDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGUgPSBlbGUubW92ZSh7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvYmoucG9zaXRpb24pIHtcbiAgICAgIGVsZS5wb3NpdGlvbihvYmoucG9zaXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlnbm9yZSBncm91cCAtLSBpbW11dGFibGVcblxuICAgIHZhciBjaGVja1N3aXRjaCA9IGZ1bmN0aW9uIGNoZWNrU3dpdGNoKGssIHRydWVGbk5hbWUsIGZhbHNlRm5OYW1lKSB7XG4gICAgICB2YXIgb2JqX2sgPSBvYmpba107XG4gICAgICBpZiAob2JqX2sgIT0gbnVsbCAmJiBvYmpfayAhPT0gcFtrXSkge1xuICAgICAgICBpZiAob2JqX2spIHtcbiAgICAgICAgICBlbGVbdHJ1ZUZuTmFtZV0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVbZmFsc2VGbk5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNoZWNrU3dpdGNoKCdyZW1vdmVkJywgJ3JlbW92ZScsICdyZXN0b3JlJyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGVkJywgJ3NlbGVjdCcsICd1bnNlbGVjdCcpO1xuICAgIGNoZWNrU3dpdGNoKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGlmeScsICd1bnNlbGVjdGlmeScpO1xuICAgIGNoZWNrU3dpdGNoKCdsb2NrZWQnLCAnbG9jaycsICd1bmxvY2snKTtcbiAgICBjaGVja1N3aXRjaCgnZ3JhYmJhYmxlJywgJ2dyYWJpZnknLCAndW5ncmFiaWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3Bhbm5hYmxlJywgJ3BhbmlmeScsICd1bnBhbmlmeScpO1xuICAgIGlmIChvYmouY2xhc3NlcyAhPSBudWxsKSB7XG4gICAgICBlbGUuY2xhc3NlcyhvYmouY2xhc3Nlcyk7XG4gICAgfVxuICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBnZXRcblxuICAgIHZhciBqc29uID0ge1xuICAgICAgZGF0YTogY29weShwLmRhdGEpLFxuICAgICAgcG9zaXRpb246IGNvcHkocC5wb3NpdGlvbiksXG4gICAgICBncm91cDogcC5ncm91cCxcbiAgICAgIHJlbW92ZWQ6IHAucmVtb3ZlZCxcbiAgICAgIHNlbGVjdGVkOiBwLnNlbGVjdGVkLFxuICAgICAgc2VsZWN0YWJsZTogcC5zZWxlY3RhYmxlLFxuICAgICAgbG9ja2VkOiBwLmxvY2tlZCxcbiAgICAgIGdyYWJiYWJsZTogcC5ncmFiYmFibGUsXG4gICAgICBwYW5uYWJsZTogcC5wYW5uYWJsZSxcbiAgICAgIGNsYXNzZXM6IG51bGxcbiAgICB9O1xuICAgIGpzb24uY2xhc3NlcyA9ICcnO1xuICAgIHZhciBpID0gMDtcbiAgICBwLmNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xzKSB7XG4gICAgICByZXR1cm4ganNvbi5jbGFzc2VzICs9IGkrKyA9PT0gMCA/IGNscyA6ICcgJyArIGNscztcbiAgICB9KTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxufTtcbmVsZXNmbiQxLmpzb25zID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIGpzb25zLnB1c2goanNvbik7XG4gIH1cbiAgcmV0dXJuIGpzb25zO1xufTtcbmVsZXNmbiQxLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBlbGVzQXJyID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBqc29uID0gZWxlLmpzb24oKTtcbiAgICB2YXIgY2xvbmUgPSBuZXcgRWxlbWVudChjeSwganNvbiwgZmFsc2UpOyAvLyBOQiBubyByZXN0b3JlXG5cbiAgICBlbGVzQXJyLnB1c2goY2xvbmUpO1xuICB9XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbihjeSwgZWxlc0Fycik7XG59O1xuZWxlc2ZuJDEuY29weSA9IGVsZXNmbiQxLmNsb25lO1xuZWxlc2ZuJDEucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgYWRkVG9Qb29sID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeSA9IHNlbGYuY3koKTtcbiAgdmFyIGN5X3AgPSBjeS5fcHJpdmF0ZTtcblxuICAvLyBjcmVhdGUgYXJyYXlzIG9mIG5vZGVzIGFuZCBlZGdlcywgc2luY2Ugd2UgbmVlZCB0b1xuICAvLyByZXN0b3JlIHRoZSBub2RlcyBmaXJzdFxuICB2YXIgbm9kZXMgPSBbXTtcbiAgdmFyIGVkZ2VzID0gW107XG4gIHZhciBlbGVtZW50cztcbiAgZm9yICh2YXIgX2kzID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBfaTMgPCBsOyBfaTMrKykge1xuICAgIHZhciBlbGUgPSBzZWxmW19pM107XG4gICAgaWYgKGFkZFRvUG9vbCAmJiAhZWxlLnJlbW92ZWQoKSkge1xuICAgICAgLy8gZG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBlbGVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGtlZXAgbm9kZXMgZmlyc3QgaW4gdGhlIGFycmF5IGFuZCBlZGdlcyBhZnRlclxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIC8vIHB1dCB0byBmcm9udCBvZiBhcnJheSBpZiBub2RlXG4gICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHB1dCB0byBlbmQgb2YgYXJyYXkgaWYgZWRnZVxuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuICBlbGVtZW50cyA9IG5vZGVzLmNvbmNhdChlZGdlcyk7XG4gIHZhciBpO1xuICB2YXIgcmVtb3ZlRnJvbUVsZW1lbnRzID0gZnVuY3Rpb24gcmVtb3ZlRnJvbUVsZW1lbnRzKCkge1xuICAgIGVsZW1lbnRzLnNwbGljZShpLCAxKTtcbiAgICBpLS07XG4gIH07XG5cbiAgLy8gbm93LCByZXN0b3JlIGVhY2ggZWxlbWVudFxuICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2VsZTIgPSBlbGVtZW50c1tpXTtcbiAgICB2YXIgX3ByaXZhdGUgPSBfZWxlMi5fcHJpdmF0ZTtcbiAgICB2YXIgX2RhdGEzID0gX3ByaXZhdGUuZGF0YTtcblxuICAgIC8vIHRoZSB0cmF2ZXJzYWwgY2FjaGUgc2hvdWxkIHN0YXJ0IGZyZXNoIHdoZW4gZWxlIGlzIGFkZGVkXG4gICAgX2VsZTIuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuXG4gICAgLy8gc2V0IGlkIGFuZCB2YWxpZGF0ZVxuICAgIGlmICghYWRkVG9Qb29sICYmICFfcHJpdmF0ZS5yZW1vdmVkKSA7IGVsc2UgaWYgKF9kYXRhMy5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfZGF0YTMuaWQgPSB1dWlkKCk7XG4gICAgfSBlbHNlIGlmIChudW1iZXIkMShfZGF0YTMuaWQpKSB7XG4gICAgICBfZGF0YTMuaWQgPSAnJyArIF9kYXRhMy5pZDsgLy8gbm93IGl0J3MgYSBzdHJpbmdcbiAgICB9IGVsc2UgaWYgKGVtcHR5U3RyaW5nKF9kYXRhMy5pZCkgfHwgIXN0cmluZyhfZGF0YTMuaWQpKSB7XG4gICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWxlbWVudCB3aXRoIGludmFsaWQgc3RyaW5nIElEIGAnICsgX2RhdGEzLmlkICsgJ2AnKTtcblxuICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgaXQgaGFzIGVtcHR5IHN0cmluZyBhcyBpZCBvciBub24tc3RyaW5nIGlkXG4gICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YTMuaWQpKSB7XG4gICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgc2Vjb25kIGVsZW1lbnQgd2l0aCBJRCBgJyArIF9kYXRhMy5pZCArICdgJyk7XG5cbiAgICAgIC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIG9uZSBhbHJlYWR5IGhhcyB0aGF0IGlkXG4gICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaWQgPSBfZGF0YTMuaWQ7IC8vIGlkIGlzIGZpbmFsaXNlZCwgbm93IGxldCdzIGtlZXAgYSByZWZcblxuICAgIGlmIChfZWxlMi5pc05vZGUoKSkge1xuICAgICAgLy8gZXh0cmEgY2hlY2tzIGZvciBub2Rlc1xuICAgICAgdmFyIHBvcyA9IF9wcml2YXRlLnBvc2l0aW9uO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIG5vZGVzIGhhdmUgYSBkZWZpbmVkIHBvc2l0aW9uXG5cbiAgICAgIGlmIChwb3MueCA9PSBudWxsKSB7XG4gICAgICAgIHBvcy54ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChwb3MueSA9PSBudWxsKSB7XG4gICAgICAgIHBvcy55ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9lbGUyLmlzRWRnZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIGVkZ2VzXG5cbiAgICAgIHZhciBlZGdlID0gX2VsZTI7XG4gICAgICB2YXIgZmllbGRzID0gWydzb3VyY2UnLCAndGFyZ2V0J107XG4gICAgICB2YXIgZmllbGRzTGVuZ3RoID0gZmllbGRzLmxlbmd0aDtcbiAgICAgIHZhciBiYWRTb3VyY2VPclRhcmdldCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHNMZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbal07XG4gICAgICAgIHZhciB2YWwgPSBfZGF0YTNbZmllbGRdO1xuICAgICAgICBpZiAobnVtYmVyJDEodmFsKSkge1xuICAgICAgICAgIHZhbCA9IF9kYXRhM1tmaWVsZF0gPSAnJyArIF9kYXRhM1tmaWVsZF07IC8vIG5vdyBzdHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGlmIHNvdXJjZSBvciB0YXJnZXQgaXMgbm90IGRlZmluZWQgcHJvcGVybHlcbiAgICAgICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWRnZSBgJyArIGlkICsgJ2Agd2l0aCB1bnNwZWNpZmllZCAnICsgZmllbGQpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghY3kuaGFzRWxlbWVudFdpdGhJZCh2YWwpKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVkZ2UgaWYgb25lIG9mIGl0cyBub2RlcyBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggbm9uZXhpc3RhbnQgJyArIGZpZWxkICsgJyBgJyArIHZhbCArICdgJyk7XG4gICAgICAgICAgYmFkU291cmNlT3JUYXJnZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmFkU291cmNlT3JUYXJnZXQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBjYW4ndCBjcmVhdGUgdGhpc1xuXG4gICAgICB2YXIgc3JjID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnNvdXJjZSk7XG4gICAgICB2YXIgdGd0ID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnRhcmdldCk7XG5cbiAgICAgIC8vIG9ubHkgb25lIGVkZ2UgaW4gbm9kZSBpZiBsb29wXG4gICAgICBpZiAoc3JjLnNhbWUodGd0KSkge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNyYy5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB0Z3QuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICAgIGVkZ2UuX3ByaXZhdGUuc291cmNlID0gc3JjO1xuICAgICAgZWRnZS5fcHJpdmF0ZS50YXJnZXQgPSB0Z3Q7XG4gICAgfSAvLyBpZiBpcyBlZGdlXG5cbiAgICAvLyBjcmVhdGUgbW9jayBpZHMgLyBpbmRleGVzIG1hcHMgZm9yIGVsZW1lbnQgc28gaXQgY2FuIGJlIHVzZWQgbGlrZSBjb2xsZWN0aW9uc1xuICAgIF9wcml2YXRlLm1hcCA9IG5ldyBNYXAkMigpO1xuICAgIF9wcml2YXRlLm1hcC5zZXQoaWQsIHtcbiAgICAgIGVsZTogX2VsZTIsXG4gICAgICBpbmRleDogMFxuICAgIH0pO1xuICAgIF9wcml2YXRlLnJlbW92ZWQgPSBmYWxzZTtcbiAgICBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICBjeS5hZGRUb1Bvb2woX2VsZTIpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWFjaCBlbGVtZW50XG5cbiAgLy8gZG8gY29tcG91bmQgbm9kZSBzYW5pdHkgY2hlY2tzXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAvLyBlYWNoIG5vZGVcbiAgICB2YXIgbm9kZSA9IG5vZGVzW19pNF07XG4gICAgdmFyIF9kYXRhNCA9IG5vZGUuX3ByaXZhdGUuZGF0YTtcbiAgICBpZiAobnVtYmVyJDEoX2RhdGE0LnBhcmVudCkpIHtcbiAgICAgIC8vIHRoZW4gYXV0b21ha2Ugc3RyaW5nXG4gICAgICBfZGF0YTQucGFyZW50ID0gJycgKyBfZGF0YTQucGFyZW50O1xuICAgIH1cbiAgICB2YXIgcGFyZW50SWQgPSBfZGF0YTQucGFyZW50O1xuICAgIHZhciBzcGVjaWZpZWRQYXJlbnQgPSBwYXJlbnRJZCAhPSBudWxsO1xuICAgIGlmIChzcGVjaWZpZWRQYXJlbnQgfHwgbm9kZS5fcHJpdmF0ZS5wYXJlbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wcml2YXRlLnBhcmVudCA/IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShub2RlLl9wcml2YXRlLnBhcmVudCkgOiBjeS5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50LmVtcHR5KCkpIHtcbiAgICAgICAgLy8gbm9uLWV4aXN0YW50IHBhcmVudDsganVzdCByZW1vdmUgaXRcbiAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50WzBdLnJlbW92ZWQoKSkge1xuICAgICAgICB3YXJuKCdOb2RlIGFkZGVkIHdpdGggbWlzc2luZyBwYXJlbnQsIHJlZmVyZW5jZSB0byBwYXJlbnQgcmVtb3ZlZCcpO1xuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2VsZkFzUGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICAgd2hpbGUgKCFhbmNlc3Rvci5lbXB0eSgpKSB7XG4gICAgICAgICAgaWYgKG5vZGUuc2FtZShhbmNlc3RvcikpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgc2VsZiBhcyBwYXJlbnQgYW5kIHJlbW92ZSBmcm9tIGRhdGFcbiAgICAgICAgICAgIHNlbGZBc1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkOyAvLyByZW1vdmUgcGFyZW50IHJlZmVyZW5jZVxuXG4gICAgICAgICAgICAvLyBleGl0IG9yIHdlIGxvb3AgZm9yZXZlclxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmQXNQYXJlbnQpIHtcbiAgICAgICAgICAvLyBjb25uZWN0IHdpdGggY2hpbGRyZW5cbiAgICAgICAgICBwYXJlbnRbMF0uX3ByaXZhdGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IHBhcmVudFswXTtcblxuICAgICAgICAgIC8vIGxldCB0aGUgY29yZSBrbm93IHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaFxuICAgICAgICAgIGN5X3AuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZWxzZVxuICAgIH0gLy8gaWYgc3BlY2lmaWVkIHBhcmVudFxuICB9IC8vIGZvciBlYWNoIG5vZGVcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciByZXN0b3JlZCA9IGVsZW1lbnRzLmxlbmd0aCA9PT0gc2VsZi5sZW5ndGggPyBzZWxmIDogbmV3IENvbGxlY3Rpb24oY3ksIGVsZW1lbnRzKTtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCByZXN0b3JlZC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2VsZTMgPSByZXN0b3JlZFtfaTVdO1xuICAgICAgaWYgKF9lbGUzLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgICBfZWxlMy5wYXJhbGxlbEVkZ2VzKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciB0aGUgY29ubmVjdGVkIG5vZGVzXG4gICAgICBfZWxlMy5zb3VyY2UoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgICBfZWxlMy50YXJnZXQoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgfVxuICAgIHZhciB0b1VwZGF0ZVN0eWxlO1xuICAgIGlmIChjeV9wLmhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSBjeS5jb2xsZWN0aW9uKCkubWVyZ2UocmVzdG9yZWQpLm1lcmdlKHJlc3RvcmVkLmNvbm5lY3RlZE5vZGVzKCkpLm1lcmdlKHJlc3RvcmVkLnBhcmVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9VcGRhdGVTdHlsZSA9IHJlc3RvcmVkO1xuICAgIH1cbiAgICB0b1VwZGF0ZVN0eWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpLnVwZGF0ZVN0eWxlKG5vdGlmeVJlbmRlcmVyKTtcbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXRBbmROb3RpZnkoJ2FkZCcpO1xuICAgIH0gZWxzZSBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICByZXN0b3JlZC5lbWl0KCdhZGQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGY7IC8vIGNoYWluYWJpbGl0eVxufTtcblxuZWxlc2ZuJDEucmVtb3ZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgZWxlLl9wcml2YXRlLnJlbW92ZWQ7XG59O1xuZWxlc2ZuJDEuaW5zaWRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZSAmJiAhZWxlLl9wcml2YXRlLnJlbW92ZWQ7XG59O1xuZWxlc2ZuJDEucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciByZW1vdmVGcm9tUG9vbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgZWxlc1RvUmVtb3ZlID0gW107XG4gIHZhciBlbGVzVG9SZW1vdmVJZHMgPSB7fTtcbiAgdmFyIGN5ID0gc2VsZi5fcHJpdmF0ZS5jeTtcblxuICAvLyBhZGQgY29ubmVjdGVkIGVkZ2VzXG4gIGZ1bmN0aW9uIGFkZENvbm5lY3RlZEVkZ2VzKG5vZGUpIHtcbiAgICB2YXIgZWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChlZGdlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gYWRkIGRlc2NlbmRhbnQgbm9kZXNcbiAgZnVuY3Rpb24gYWRkQ2hpbGRyZW4obm9kZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgYWRkKGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYWRkKGVsZSkge1xuICAgIHZhciBhbHJlYWR5QWRkZWQgPSBlbGVzVG9SZW1vdmVJZHNbZWxlLmlkKCldO1xuICAgIGlmIChyZW1vdmVGcm9tUG9vbCAmJiBlbGUucmVtb3ZlZCgpIHx8IGFscmVhZHlBZGRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzVG9SZW1vdmVJZHNbZWxlLmlkKCldID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgZWxlc1RvUmVtb3ZlLnB1c2goZWxlKTsgLy8gbm9kZXMgYXJlIHJlbW92ZWQgbGFzdFxuXG4gICAgICBhZGRDb25uZWN0ZWRFZGdlcyhlbGUpO1xuICAgICAgYWRkQ2hpbGRyZW4oZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlLnVuc2hpZnQoZWxlKTsgLy8gZWRnZXMgYXJlIHJlbW92ZWQgZmlyc3RcbiAgICB9XG4gIH1cblxuICAvLyBtYWtlIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICAvLyAobWF5IGJlIHJlbW92aW5nIG1vcmUgdGhhbiBzcGVjaWZpZWQgZHVlIHRvIGNvbm5lY3RlZCBlZGdlcyBldGMpXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgIGFkZChlbGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZUVkZ2VSZWYobm9kZSwgZWRnZSkge1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgcmVtb3ZlRnJvbUFycmF5KGNvbm5lY3RlZEVkZ2VzLCBlZGdlKTtcblxuICAgIC8vIHJlbW92aW5nIGFuIGVkZ2VzIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGUgZm9yIGl0cyBub2Rlc1xuICAgIG5vZGUuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVBhcmFsbGVsUmVmKHBsbEVkZ2UpIHtcbiAgICAvLyByZW1vdmluZyBhbiBlZGdlIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGVzIGZvciB0aGUgcGFyYWxsZWwgZWRnZXNcbiAgICBwbGxFZGdlLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgfVxuICB2YXIgYWx0ZXJlZFBhcmVudHMgPSBbXTtcbiAgYWx0ZXJlZFBhcmVudHMuaWRzID0ge307XG4gIGZ1bmN0aW9uIHJlbW92ZUNoaWxkUmVmKHBhcmVudCwgZWxlKSB7XG4gICAgZWxlID0gZWxlWzBdO1xuICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgdmFyIHBpZCA9IHBhcmVudC5pZCgpO1xuICAgIHJlbW92ZUZyb21BcnJheShjaGlsZHJlbiwgZWxlKTsgLy8gcmVtb3ZlIHBhcmVudCA9PiBjaGlsZCByZWZcblxuICAgIGVsZS5fcHJpdmF0ZS5wYXJlbnQgPSBudWxsOyAvLyByZW1vdmUgY2hpbGQgPT4gcGFyZW50IHJlZlxuXG4gICAgaWYgKCFhbHRlcmVkUGFyZW50cy5pZHNbcGlkXSkge1xuICAgICAgYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0gPSB0cnVlO1xuICAgICAgYWx0ZXJlZFBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgfVxuICBzZWxmLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICBjeS5yZW1vdmVGcm9tUG9vbChlbGVzVG9SZW1vdmUpOyAvLyByZW1vdmUgZnJvbSBjb3JlIHBvb2xcbiAgfVxuXG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGVsZXNUb1JlbW92ZS5sZW5ndGg7IF9pNisrKSB7XG4gICAgdmFyIF9lbGU0ID0gZWxlc1RvUmVtb3ZlW19pNl07XG4gICAgaWYgKF9lbGU0LmlzRWRnZSgpKSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGlzIGVkZ2UgaW4gaXRzIGNvbm5lY3RlZCBub2Rlc1xuICAgICAgdmFyIHNyYyA9IF9lbGU0LnNvdXJjZSgpWzBdO1xuICAgICAgdmFyIHRndCA9IF9lbGU0LnRhcmdldCgpWzBdO1xuICAgICAgcmVtb3ZlRWRnZVJlZihzcmMsIF9lbGU0KTtcbiAgICAgIHJlbW92ZUVkZ2VSZWYodGd0LCBfZWxlNCk7XG4gICAgICB2YXIgcGxsRWRnZXMgPSBfZWxlNC5wYXJhbGxlbEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBsbEVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwbGxFZGdlID0gcGxsRWRnZXNbal07XG4gICAgICAgIHJlbW92ZVBhcmFsbGVsUmVmKHBsbEVkZ2UpO1xuICAgICAgICBpZiAocGxsRWRnZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgICAgIHBsbEVkZ2UuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byBwYXJlbnRcbiAgICAgIHZhciBwYXJlbnQgPSBfZWxlNC5wYXJlbnQoKTtcbiAgICAgIGlmIChwYXJlbnQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJlbW92ZUNoaWxkUmVmKHBhcmVudCwgX2VsZTQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICAgIC8vIG1hcmsgYXMgcmVtb3ZlZFxuICAgICAgX2VsZTQuX3ByaXZhdGUucmVtb3ZlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaCBvciBub3RcbiAgdmFyIGVsZXNTdGlsbEluc2lkZSA9IGN5Ll9wcml2YXRlLmVsZW1lbnRzO1xuICBjeS5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzID0gZmFsc2U7XG4gIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IGVsZXNTdGlsbEluc2lkZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgdmFyIF9lbGU1ID0gZWxlc1N0aWxsSW5zaWRlW19pN107XG4gICAgaWYgKF9lbGU1LmlzUGFyZW50KCkpIHtcbiAgICAgIGN5Ll9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXMgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciByZW1vdmVkRWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXNUb1JlbW92ZSk7XG4gIGlmIChyZW1vdmVkRWxlbWVudHMuc2l6ZSgpID4gMCkge1xuICAgIC8vIG11c3QgbWFudWFsbHkgbm90aWZ5IHNpbmNlIHRyaWdnZXIgd29uJ3QgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IG9uY2UgcmVtb3ZlZFxuXG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICByZW1vdmVkRWxlbWVudHMuZW1pdEFuZE5vdGlmeSgncmVtb3ZlJyk7XG4gICAgfSBlbHNlIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgcmVtb3ZlZEVsZW1lbnRzLmVtaXQoJ3JlbW92ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoZSBwYXJlbnRzIHdobyB3ZXJlIG1vZGlmaWVkIGJ5IHRoZSByZW1vdmFsIG5lZWQgdGhlaXIgc3R5bGUgdXBkYXRlZFxuICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBhbHRlcmVkUGFyZW50cy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgdmFyIF9lbGU2ID0gYWx0ZXJlZFBhcmVudHNbX2k4XTtcbiAgICBpZiAoIXJlbW92ZUZyb21Qb29sIHx8ICFfZWxlNi5yZW1vdmVkKCkpIHtcbiAgICAgIF9lbGU2LnVwZGF0ZVN0eWxlKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW1vdmVkRWxlbWVudHM7XG59O1xuZWxlc2ZuJDEubW92ZSA9IGZ1bmN0aW9uIChzdHJ1Y3QpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gIC8vIGp1c3QgY2xlYW4gdXAgcmVmcywgY2FjaGVzLCBldGMuIGluIHRoZSBzYW1lIHdheSBhcyB3aGVuIHJlbW92aW5nIGFuZCB0aGVuIHJlc3RvcmluZ1xuICAvLyAob3VyIGNhbGxzIHRvIHJlbW92ZS9yZXN0b3JlIGRvIG5vdCByZW1vdmUgZnJvbSB0aGUgZ3JhcGggb3IgbWFrZSBldmVudHMpXG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGZhbHNlO1xuICB2YXIgbW9kaWZ5UG9vbCA9IGZhbHNlO1xuICB2YXIgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhpZCkge1xuICAgIHJldHVybiBpZCA9PSBudWxsID8gaWQgOiAnJyArIGlkO1xuICB9OyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIGlmIChzdHJ1Y3Quc291cmNlICE9PSB1bmRlZmluZWQgfHwgc3RydWN0LnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHNyY0lkID0gdG9TdHJpbmcoc3RydWN0LnNvdXJjZSk7XG4gICAgdmFyIHRndElkID0gdG9TdHJpbmcoc3RydWN0LnRhcmdldCk7XG4gICAgdmFyIHNyY0V4aXN0cyA9IHNyY0lkICE9IG51bGwgJiYgY3kuaGFzRWxlbWVudFdpdGhJZChzcmNJZCk7XG4gICAgdmFyIHRndEV4aXN0cyA9IHRndElkICE9IG51bGwgJiYgY3kuaGFzRWxlbWVudFdpdGhJZCh0Z3RJZCk7XG4gICAgaWYgKHNyY0V4aXN0cyB8fCB0Z3RFeGlzdHMpIHtcbiAgICAgIGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIHN0eWxlIHVwZGF0ZXNcbiAgICAgICAgZWxlcy5yZW1vdmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBjbGVhbiB1cCByZWZzIGV0Yy5cbiAgICAgICAgZWxlcy5lbWl0QW5kTm90aWZ5KCdtb3Zlb3V0Jyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICAgIHZhciBfZGF0YTUgPSBlbGUuX3ByaXZhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICAgICAgICBpZiAoc3JjRXhpc3RzKSB7XG4gICAgICAgICAgICAgIF9kYXRhNS5zb3VyY2UgPSBzcmNJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0Z3RFeGlzdHMpIHtcbiAgICAgICAgICAgICAgX2RhdGE1LnRhcmdldCA9IHRndElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbGVzLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG5cbiAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZScpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdHJ1Y3QucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBtb3ZlIG5vZGUgdG8gbmV3IHBhcmVudFxuICAgIHZhciBwYXJlbnRJZCA9IHRvU3RyaW5nKHN0cnVjdC5wYXJlbnQpO1xuICAgIHZhciBwYXJlbnRFeGlzdHMgPSBwYXJlbnRJZCA9PT0gbnVsbCB8fCBjeS5oYXNFbGVtZW50V2l0aElkKHBhcmVudElkKTtcbiAgICBpZiAocGFyZW50RXhpc3RzKSB7XG4gICAgICB2YXIgcGlkVG9Bc3NpZ24gPSBwYXJlbnRJZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHBhcmVudElkO1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICB2YXIgdXBkYXRlZCA9IGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG4gICAgICAgIHVwZGF0ZWQuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE2ID0gZWxlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgICAgX2RhdGE2LnBhcmVudCA9IHBpZFRvQXNzaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVkLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG5cbiAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZScpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5bZWxlc2ZuJGosIGVsZXNmbiRpLCBlbGVzZm4kaCwgZWxlc2ZuJGcsIGVsZXNmbiRmLCBkYXRhLCBlbGVzZm4kZCwgZGltZW5zaW9ucywgZWxlc2ZuJDksIGVsZXNmbiQ4LCBlbGVzZm4kNywgZWxlc2ZuJDYsIGVsZXNmbiQ1LCBlbGVzZm4kNCwgZWxlc2ZuJDMsIGVsZXNmbiQyXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJDEsIHByb3BzKTtcbn0pO1xuXG52YXIgY29yZWZuJDkgPSB7XG4gIGFkZDogZnVuY3Rpb24gYWRkKG9wdHMpIHtcbiAgICB2YXIgZWxlbWVudHM7XG4gICAgdmFyIGN5ID0gdGhpcztcblxuICAgIC8vIGFkZCB0aGUgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihvcHRzKSkge1xuICAgICAgdmFyIGVsZXMgPSBvcHRzO1xuICAgICAgaWYgKGVsZXMuX3ByaXZhdGUuY3kgPT09IGN5KSB7XG4gICAgICAgIC8vIHNhbWUgaW5zdGFuY2UgPT4ganVzdCByZXN0b3JlXG4gICAgICAgIGVsZW1lbnRzID0gZWxlcy5yZXN0b3JlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UsIGNvcHkgZnJvbSBqc29uXG4gICAgICAgIHZhciBqc29ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICBqc29ucy5wdXNoKGVsZS5qc29uKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIGpzb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IGFuIGFycmF5IG9mIG9wdGlvbnNcbiAgICBlbHNlIGlmIChhcnJheShvcHRzKSkge1xuICAgICAgdmFyIF9qc29ucyA9IG9wdHM7XG4gICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBfanNvbnMpO1xuICAgIH1cblxuICAgIC8vIHNwZWNpZnkgdmlhIG9wdHMubm9kZXMgYW5kIG9wdHMuZWRnZXNcbiAgICBlbHNlIGlmIChwbGFpbk9iamVjdChvcHRzKSAmJiAoYXJyYXkob3B0cy5ub2RlcykgfHwgYXJyYXkob3B0cy5lZGdlcykpKSB7XG4gICAgICB2YXIgZWxlc0J5R3JvdXAgPSBvcHRzO1xuICAgICAgdmFyIF9qc29uczIgPSBbXTtcbiAgICAgIHZhciBncnMgPSBbJ25vZGVzJywgJ2VkZ2VzJ107XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIGlsID0gZ3JzLmxlbmd0aDsgX2kgPCBpbDsgX2krKykge1xuICAgICAgICB2YXIgZ3JvdXAgPSBncnNbX2ldO1xuICAgICAgICB2YXIgZWxlc0FycmF5ID0gZWxlc0J5R3JvdXBbZ3JvdXBdO1xuICAgICAgICBpZiAoYXJyYXkoZWxlc0FycmF5KSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqbCA9IGVsZXNBcnJheS5sZW5ndGg7IGogPCBqbDsgaisrKSB7XG4gICAgICAgICAgICB2YXIganNvbiA9IGV4dGVuZCh7XG4gICAgICAgICAgICAgIGdyb3VwOiBncm91cFxuICAgICAgICAgICAgfSwgZWxlc0FycmF5W2pdKTtcbiAgICAgICAgICAgIF9qc29uczIucHVzaChqc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIF9qc29uczIpO1xuICAgIH1cblxuICAgIC8vIHNwZWNpZnkgb3B0aW9ucyBmb3Igb25lIGVsZW1lbnRcbiAgICBlbHNlIHtcbiAgICAgIHZhciBfanNvbiA9IG9wdHM7XG4gICAgICBlbGVtZW50cyA9IG5ldyBFbGVtZW50KGN5LCBfanNvbikuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKGNvbGxlY3Rpb24pIHtcbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihjb2xsZWN0aW9uKSkgOyBlbHNlIGlmIChzdHJpbmcoY29sbGVjdGlvbikpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGNvbGxlY3Rpb247XG4gICAgICBjb2xsZWN0aW9uID0gdGhpcy4kKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVtb3ZlKCk7XG4gIH1cbn07XG5cbi8qIGdsb2JhbCBGbG9hdDMyQXJyYXkgKi9cblxuLyohIEJlemllciBjdXJ2ZSBmdW5jdGlvbiBnZW5lcmF0b3IuIENvcHlyaWdodCBHYWV0YW4gUmVuYXVkZWF1LiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDdWJpY0JlemllcihtWDEsIG1ZMSwgbVgyLCBtWTIpIHtcbiAgdmFyIE5FV1RPTl9JVEVSQVRJT05TID0gNCxcbiAgICBORVdUT05fTUlOX1NMT1BFID0gMC4wMDEsXG4gICAgU1VCRElWSVNJT05fUFJFQ0lTSU9OID0gMC4wMDAwMDAxLFxuICAgIFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TID0gMTAsXG4gICAga1NwbGluZVRhYmxlU2l6ZSA9IDExLFxuICAgIGtTYW1wbGVTdGVwU2l6ZSA9IDEuMCAvIChrU3BsaW5lVGFibGVTaXplIC0gMS4wKSxcbiAgICBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJztcblxuICAvKiBNdXN0IGNvbnRhaW4gZm91ciBhcmd1bWVudHMuICovXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSA0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyogQXJndW1lbnRzIG11c3QgYmUgbnVtYmVycy4gKi9cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gXCJudW1iZXJcIiB8fCBpc05hTihhcmd1bWVudHNbaV0pIHx8ICFpc0Zpbml0ZShhcmd1bWVudHNbaV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyogWCB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgWzAsIDFdIHJhbmdlLiAqL1xuICBtWDEgPSBNYXRoLm1pbihtWDEsIDEpO1xuICBtWDIgPSBNYXRoLm1pbihtWDIsIDEpO1xuICBtWDEgPSBNYXRoLm1heChtWDEsIDApO1xuICBtWDIgPSBNYXRoLm1heChtWDIsIDApO1xuICB2YXIgbVNhbXBsZVZhbHVlcyA9IGZsb2F0MzJBcnJheVN1cHBvcnRlZCA/IG5ldyBGbG9hdDMyQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSkgOiBuZXcgQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSk7XG4gIGZ1bmN0aW9uIEEoYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMS4wIC0gMy4wICogYUEyICsgMy4wICogYUExO1xuICB9XG4gIGZ1bmN0aW9uIEIoYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMy4wICogYUEyIC0gNi4wICogYUExO1xuICB9XG4gIGZ1bmN0aW9uIEMoYUExKSB7XG4gICAgcmV0dXJuIDMuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBjYWxjQmV6aWVyKGFULCBhQTEsIGFBMikge1xuICAgIHJldHVybiAoKEEoYUExLCBhQTIpICogYVQgKyBCKGFBMSwgYUEyKSkgKiBhVCArIEMoYUExKSkgKiBhVDtcbiAgfVxuICBmdW5jdGlvbiBnZXRTbG9wZShhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMy4wICogQShhQTEsIGFBMikgKiBhVCAqIGFUICsgMi4wICogQihhQTEsIGFBMikgKiBhVCArIEMoYUExKTtcbiAgfVxuICBmdW5jdGlvbiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgYUd1ZXNzVCkge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBORVdUT05fSVRFUkFUSU9OUzsgKytfaSkge1xuICAgICAgdmFyIGN1cnJlbnRTbG9wZSA9IGdldFNsb3BlKGFHdWVzc1QsIG1YMSwgbVgyKTtcbiAgICAgIGlmIChjdXJyZW50U2xvcGUgPT09IDAuMCkge1xuICAgICAgICByZXR1cm4gYUd1ZXNzVDtcbiAgICAgIH1cbiAgICAgIHZhciBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgbVgxLCBtWDIpIC0gYVg7XG4gICAgICBhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuICAgIH1cbiAgICByZXR1cm4gYUd1ZXNzVDtcbiAgfVxuICBmdW5jdGlvbiBjYWxjU2FtcGxlVmFsdWVzKCkge1xuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGtTcGxpbmVUYWJsZVNpemU7ICsrX2kyKSB7XG4gICAgICBtU2FtcGxlVmFsdWVzW19pMl0gPSBjYWxjQmV6aWVyKF9pMiAqIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBiaW5hcnlTdWJkaXZpZGUoYVgsIGFBLCBhQikge1xuICAgIHZhciBjdXJyZW50WCxcbiAgICAgIGN1cnJlbnRULFxuICAgICAgaSA9IDA7XG4gICAgZG8ge1xuICAgICAgY3VycmVudFQgPSBhQSArIChhQiAtIGFBKSAvIDIuMDtcbiAgICAgIGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0gYVg7XG4gICAgICBpZiAoY3VycmVudFggPiAwLjApIHtcbiAgICAgICAgYUIgPSBjdXJyZW50VDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFBID0gY3VycmVudFQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoTWF0aC5hYnMoY3VycmVudFgpID4gU1VCRElWSVNJT05fUFJFQ0lTSU9OICYmICsraSA8IFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TKTtcbiAgICByZXR1cm4gY3VycmVudFQ7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0VEZvclgoYVgpIHtcbiAgICB2YXIgaW50ZXJ2YWxTdGFydCA9IDAuMCxcbiAgICAgIGN1cnJlbnRTYW1wbGUgPSAxLFxuICAgICAgbGFzdFNhbXBsZSA9IGtTcGxpbmVUYWJsZVNpemUgLSAxO1xuICAgIGZvciAoOyBjdXJyZW50U2FtcGxlICE9PSBsYXN0U2FtcGxlICYmIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0gPD0gYVg7ICsrY3VycmVudFNhbXBsZSkge1xuICAgICAgaW50ZXJ2YWxTdGFydCArPSBrU2FtcGxlU3RlcFNpemU7XG4gICAgfVxuICAgIC0tY3VycmVudFNhbXBsZTtcbiAgICB2YXIgZGlzdCA9IChhWCAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pIC8gKG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZSArIDFdIC0gbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSksXG4gICAgICBndWVzc0ZvclQgPSBpbnRlcnZhbFN0YXJ0ICsgZGlzdCAqIGtTYW1wbGVTdGVwU2l6ZSxcbiAgICAgIGluaXRpYWxTbG9wZSA9IGdldFNsb3BlKGd1ZXNzRm9yVCwgbVgxLCBtWDIpO1xuICAgIGlmIChpbml0aWFsU2xvcGUgPj0gTkVXVE9OX01JTl9TTE9QRSkge1xuICAgICAgcmV0dXJuIG5ld3RvblJhcGhzb25JdGVyYXRlKGFYLCBndWVzc0ZvclQpO1xuICAgIH0gZWxzZSBpZiAoaW5pdGlhbFNsb3BlID09PSAwLjApIHtcbiAgICAgIHJldHVybiBndWVzc0ZvclQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiaW5hcnlTdWJkaXZpZGUoYVgsIGludGVydmFsU3RhcnQsIGludGVydmFsU3RhcnQgKyBrU2FtcGxlU3RlcFNpemUpO1xuICAgIH1cbiAgfVxuICB2YXIgX3ByZWNvbXB1dGVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHByZWNvbXB1dGUoKSB7XG4gICAgX3ByZWNvbXB1dGVkID0gdHJ1ZTtcbiAgICBpZiAobVgxICE9PSBtWTEgfHwgbVgyICE9PSBtWTIpIHtcbiAgICAgIGNhbGNTYW1wbGVWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgdmFyIGYgPSBmdW5jdGlvbiBmKGFYKSB7XG4gICAgaWYgKCFfcHJlY29tcHV0ZWQpIHtcbiAgICAgIHByZWNvbXB1dGUoKTtcbiAgICB9XG4gICAgaWYgKG1YMSA9PT0gbVkxICYmIG1YMiA9PT0gbVkyKSB7XG4gICAgICByZXR1cm4gYVg7XG4gICAgfVxuICAgIGlmIChhWCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChhWCA9PT0gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiBjYWxjQmV6aWVyKGdldFRGb3JYKGFYKSwgbVkxLCBtWTIpO1xuICB9O1xuICBmLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICB4OiBtWDEsXG4gICAgICB5OiBtWTFcbiAgICB9LCB7XG4gICAgICB4OiBtWDIsXG4gICAgICB5OiBtWTJcbiAgICB9XTtcbiAgfTtcbiAgdmFyIHN0ciA9IFwiZ2VuZXJhdGVCZXppZXIoXCIgKyBbbVgxLCBtWTEsIG1YMiwgbVkyXSArIFwiKVwiO1xuICBmLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzdHI7XG4gIH07XG4gIHJldHVybiBmO1xufVxuXG4vKiEgUnVuZ2UtS3V0dGEgc3ByaW5nIHBoeXNpY3MgZnVuY3Rpb24gZ2VuZXJhdG9yLiBBZGFwdGVkIGZyb20gRnJhbWVyLmpzLCBjb3B5cmlnaHQgS29lbiBCb2suIE1JVCBMaWNlbnNlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlICovXG4vKiBHaXZlbiBhIHRlbnNpb24sIGZyaWN0aW9uLCBhbmQgZHVyYXRpb24sIGEgc2ltdWxhdGlvbiBhdCA2MEZQUyB3aWxsIGZpcnN0IHJ1biB3aXRob3V0IGEgZGVmaW5lZCBkdXJhdGlvbiBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0aC4gQSBzZWNvbmQgcGFzc1xuICAgdGhlbiBhZGp1c3RzIHRoZSB0aW1lIGRlbHRhIC0tIHVzaW5nIHRoZSByZWxhdGlvbiBiZXR3ZWVuIGFjdHVhbCB0aW1lIGFuZCBkdXJhdGlvbiAtLSB0byBjYWxjdWxhdGUgdGhlIHBhdGggZm9yIHRoZSBkdXJhdGlvbi1jb25zdHJhaW5lZCBhbmltYXRpb24uICovXG52YXIgZ2VuZXJhdGVTcHJpbmdSSzQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIC1zdGF0ZS50ZW5zaW9uICogc3RhdGUueCAtIHN0YXRlLmZyaWN0aW9uICogc3RhdGUudjtcbiAgfVxuICBmdW5jdGlvbiBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoaW5pdGlhbFN0YXRlLCBkdCwgZGVyaXZhdGl2ZSkge1xuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHg6IGluaXRpYWxTdGF0ZS54ICsgZGVyaXZhdGl2ZS5keCAqIGR0LFxuICAgICAgdjogaW5pdGlhbFN0YXRlLnYgKyBkZXJpdmF0aXZlLmR2ICogZHQsXG4gICAgICB0ZW5zaW9uOiBpbml0aWFsU3RhdGUudGVuc2lvbixcbiAgICAgIGZyaWN0aW9uOiBpbml0aWFsU3RhdGUuZnJpY3Rpb25cbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkeDogc3RhdGUudixcbiAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNwcmluZ0ludGVncmF0ZVN0YXRlKHN0YXRlLCBkdCkge1xuICAgIHZhciBhID0ge1xuICAgICAgICBkeDogc3RhdGUudixcbiAgICAgICAgZHY6IHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKVxuICAgICAgfSxcbiAgICAgIGIgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBhKSxcbiAgICAgIGMgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBiKSxcbiAgICAgIGQgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0LCBjKSxcbiAgICAgIGR4ZHQgPSAxLjAgLyA2LjAgKiAoYS5keCArIDIuMCAqIChiLmR4ICsgYy5keCkgKyBkLmR4KSxcbiAgICAgIGR2ZHQgPSAxLjAgLyA2LjAgKiAoYS5kdiArIDIuMCAqIChiLmR2ICsgYy5kdikgKyBkLmR2KTtcbiAgICBzdGF0ZS54ID0gc3RhdGUueCArIGR4ZHQgKiBkdDtcbiAgICBzdGF0ZS52ID0gc3RhdGUudiArIGR2ZHQgKiBkdDtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNwcmluZ1JLNEZhY3RvcnkodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKSB7XG4gICAgdmFyIGluaXRTdGF0ZSA9IHtcbiAgICAgICAgeDogLTEsXG4gICAgICAgIHY6IDAsXG4gICAgICAgIHRlbnNpb246IG51bGwsXG4gICAgICAgIGZyaWN0aW9uOiBudWxsXG4gICAgICB9LFxuICAgICAgcGF0aCA9IFswXSxcbiAgICAgIHRpbWVfbGFwc2VkID0gMCxcbiAgICAgIHRvbGVyYW5jZSA9IDEgLyAxMDAwMCxcbiAgICAgIERUID0gMTYgLyAxMDAwLFxuICAgICAgaGF2ZV9kdXJhdGlvbixcbiAgICAgIGR0LFxuICAgICAgbGFzdF9zdGF0ZTtcbiAgICB0ZW5zaW9uID0gcGFyc2VGbG9hdCh0ZW5zaW9uKSB8fCA1MDA7XG4gICAgZnJpY3Rpb24gPSBwYXJzZUZsb2F0KGZyaWN0aW9uKSB8fCAyMDtcbiAgICBkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG51bGw7XG4gICAgaW5pdFN0YXRlLnRlbnNpb24gPSB0ZW5zaW9uO1xuICAgIGluaXRTdGF0ZS5mcmljdGlvbiA9IGZyaWN0aW9uO1xuICAgIGhhdmVfZHVyYXRpb24gPSBkdXJhdGlvbiAhPT0gbnVsbDtcblxuICAgIC8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIHRpbWUgaXQgdGFrZXMgZm9yIHRoaXMgYW5pbWF0aW9uIHRvIGNvbXBsZXRlIHdpdGggdGhlIHByb3ZpZGVkIGNvbmRpdGlvbnMuICovXG4gICAgaWYgKGhhdmVfZHVyYXRpb24pIHtcbiAgICAgIC8qIFJ1biB0aGUgc2ltdWxhdGlvbiB3aXRob3V0IGEgZHVyYXRpb24uICovXG4gICAgICB0aW1lX2xhcHNlZCA9IHNwcmluZ1JLNEZhY3RvcnkodGVuc2lvbiwgZnJpY3Rpb24pO1xuICAgICAgLyogQ29tcHV0ZSB0aGUgYWRqdXN0ZWQgdGltZSBkZWx0YS4gKi9cbiAgICAgIGR0ID0gdGltZV9sYXBzZWQgLyBkdXJhdGlvbiAqIERUO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdCA9IERUO1xuICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICAvKiBOZXh0L3N0ZXAgZnVuY3Rpb24gLiovXG4gICAgICBsYXN0X3N0YXRlID0gc3ByaW5nSW50ZWdyYXRlU3RhdGUobGFzdF9zdGF0ZSB8fCBpbml0U3RhdGUsIGR0KTtcbiAgICAgIC8qIFN0b3JlIHRoZSBwb3NpdGlvbi4gKi9cbiAgICAgIHBhdGgucHVzaCgxICsgbGFzdF9zdGF0ZS54KTtcbiAgICAgIHRpbWVfbGFwc2VkICs9IDE2O1xuICAgICAgLyogSWYgdGhlIGNoYW5nZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCwgYnJlYWsuICovXG4gICAgICBpZiAoIShNYXRoLmFicyhsYXN0X3N0YXRlLngpID4gdG9sZXJhbmNlICYmIE1hdGguYWJzKGxhc3Rfc3RhdGUudikgPiB0b2xlcmFuY2UpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIElmIGR1cmF0aW9uIGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gdGhlIGFjdHVhbCB0aW1lIHJlcXVpcmVkIGZvciBjb21wbGV0aW5nIHRoaXMgYW5pbWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBhIGNsb3N1cmUgdGhhdCBob2xkcyB0aGVcbiAgICAgICBjb21wdXRlZCBwYXRoIGFuZCByZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIHBvc2l0aW9uIGFjY29yZGluZyB0byBhIGdpdmVuIHBlcmNlbnRDb21wbGV0ZS4gKi9cbiAgICByZXR1cm4gIWhhdmVfZHVyYXRpb24gPyB0aW1lX2xhcHNlZCA6IGZ1bmN0aW9uIChwZXJjZW50Q29tcGxldGUpIHtcbiAgICAgIHJldHVybiBwYXRoW3BlcmNlbnRDb21wbGV0ZSAqIChwYXRoLmxlbmd0aCAtIDEpIHwgMF07XG4gICAgfTtcbiAgfTtcbn0oKTtcblxudmFyIGN1YmljQmV6aWVyID0gZnVuY3Rpb24gY3ViaWNCZXppZXIodDEsIHAxLCB0MiwgcDIpIHtcbiAgdmFyIGJlemllciA9IGdlbmVyYXRlQ3ViaWNCZXppZXIodDEsIHAxLCB0MiwgcDIpO1xuICByZXR1cm4gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogYmV6aWVyKHBlcmNlbnQpO1xuICB9O1xufTtcbnZhciBlYXNpbmdzID0ge1xuICAnbGluZWFyJzogZnVuY3Rpb24gbGluZWFyKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogcGVyY2VudDtcbiAgfSxcbiAgLy8gZGVmYXVsdCBlYXNpbmdzXG4gICdlYXNlJzogY3ViaWNCZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKSxcbiAgJ2Vhc2UtaW4nOiBjdWJpY0JlemllcigwLjQyLCAwLCAxLCAxKSxcbiAgJ2Vhc2Utb3V0JzogY3ViaWNCZXppZXIoMCwgMCwgMC41OCwgMSksXG4gICdlYXNlLWluLW91dCc6IGN1YmljQmV6aWVyKDAuNDIsIDAsIDAuNTgsIDEpLFxuICAvLyBzaW5lXG4gICdlYXNlLWluLXNpbmUnOiBjdWJpY0JlemllcigwLjQ3LCAwLCAwLjc0NSwgMC43MTUpLFxuICAnZWFzZS1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuMzksIDAuNTc1LCAwLjU2NSwgMSksXG4gICdlYXNlLWluLW91dC1zaW5lJzogY3ViaWNCZXppZXIoMC40NDUsIDAuMDUsIDAuNTUsIDAuOTUpLFxuICAvLyBxdWFkXG4gICdlYXNlLWluLXF1YWQnOiBjdWJpY0JlemllcigwLjU1LCAwLjA4NSwgMC42OCwgMC41MyksXG4gICdlYXNlLW91dC1xdWFkJzogY3ViaWNCZXppZXIoMC4yNSwgMC40NiwgMC40NSwgMC45NCksXG4gICdlYXNlLWluLW91dC1xdWFkJzogY3ViaWNCZXppZXIoMC40NTUsIDAuMDMsIDAuNTE1LCAwLjk1NSksXG4gIC8vIGN1YmljXG4gICdlYXNlLWluLWN1YmljJzogY3ViaWNCZXppZXIoMC41NSwgMC4wNTUsIDAuNjc1LCAwLjE5KSxcbiAgJ2Vhc2Utb3V0LWN1YmljJzogY3ViaWNCZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWN1YmljJzogY3ViaWNCZXppZXIoMC42NDUsIDAuMDQ1LCAwLjM1NSwgMSksXG4gIC8vIHF1YXJ0XG4gICdlYXNlLWluLXF1YXJ0JzogY3ViaWNCZXppZXIoMC44OTUsIDAuMDMsIDAuNjg1LCAwLjIyKSxcbiAgJ2Vhc2Utb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC4xNjUsIDAuODQsIDAuNDQsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVhcnQnOiBjdWJpY0JlemllcigwLjc3LCAwLCAwLjE3NSwgMSksXG4gIC8vIHF1aW50XG4gICdlYXNlLWluLXF1aW50JzogY3ViaWNCZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSxcbiAgJ2Vhc2Utb3V0LXF1aW50JzogY3ViaWNCZXppZXIoMC4yMywgMSwgMC4zMiwgMSksXG4gICdlYXNlLWluLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuODYsIDAsIDAuMDcsIDEpLFxuICAvLyBleHBvXG4gICdlYXNlLWluLWV4cG8nOiBjdWJpY0JlemllcigwLjk1LCAwLjA1LCAwLjc5NSwgMC4wMzUpLFxuICAnZWFzZS1vdXQtZXhwbyc6IGN1YmljQmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpLFxuICAnZWFzZS1pbi1vdXQtZXhwbyc6IGN1YmljQmV6aWVyKDEsIDAsIDAsIDEpLFxuICAvLyBjaXJjXG4gICdlYXNlLWluLWNpcmMnOiBjdWJpY0JlemllcigwLjYsIDAuMDQsIDAuOTgsIDAuMzM1KSxcbiAgJ2Vhc2Utb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjA3NSwgMC44MiwgMC4xNjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtY2lyYyc6IGN1YmljQmV6aWVyKDAuNzg1LCAwLjEzNSwgMC4xNSwgMC44NiksXG4gIC8vIHVzZXIgcGFyYW0gZWFzaW5ncy4uLlxuXG4gICdzcHJpbmcnOiBmdW5jdGlvbiBzcHJpbmcodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKSB7XG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAvLyBjYW4ndCBnZXQgYSBzcHJpbmcgdy8gZHVyYXRpb24gMFxuICAgICAgcmV0dXJuIGVhc2luZ3MubGluZWFyOyAvLyBkdXJhdGlvbiAwID0+IGp1bXAgdG8gZW5kIHNvIGltcGwgZG9lc24ndCBtYXR0ZXJcbiAgICB9XG5cbiAgICB2YXIgc3ByaW5nID0gZ2VuZXJhdGVTcHJpbmdSSzQodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBzcHJpbmcocGVyY2VudCk7XG4gICAgfTtcbiAgfSxcbiAgJ2N1YmljLWJlemllcic6IGN1YmljQmV6aWVyXG59O1xuXG5mdW5jdGlvbiBnZXRFYXNlZFZhbHVlKHR5cGUsIHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZ0ZuKSB7XG4gIGlmIChwZXJjZW50ID09PSAxKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cbiAgdmFyIHZhbCA9IGVhc2luZ0ZuKHN0YXJ0LCBlbmQsIHBlcmNlbnQpO1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBpZiAodHlwZS5yb3VuZFZhbHVlIHx8IHR5cGUuY29sb3IpIHtcbiAgICB2YWwgPSBNYXRoLnJvdW5kKHZhbCk7XG4gIH1cbiAgaWYgKHR5cGUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBNYXRoLm1heCh2YWwsIHR5cGUubWluKTtcbiAgfVxuICBpZiAodHlwZS5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWluKHZhbCwgdHlwZS5tYXgpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShwcm9wLCBzcGVjKSB7XG4gIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCB8fCBwcm9wLnZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwgJiYgKHNwZWMgPT0gbnVsbCB8fCBzcGVjLnR5cGUudW5pdHMgIT09ICclJykpIHtcbiAgICAgIHJldHVybiBwcm9wLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwcm9wLnZhbHVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxufVxuZnVuY3Rpb24gZWFzZShzdGFydFByb3AsIGVuZFByb3AsIHBlcmNlbnQsIGVhc2luZ0ZuLCBwcm9wU3BlYykge1xuICB2YXIgdHlwZSA9IHByb3BTcGVjICE9IG51bGwgPyBwcm9wU3BlYy50eXBlIDogbnVsbDtcbiAgaWYgKHBlcmNlbnQgPCAwKSB7XG4gICAgcGVyY2VudCA9IDA7XG4gIH0gZWxzZSBpZiAocGVyY2VudCA+IDEpIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfVxuICB2YXIgc3RhcnQgPSBnZXRWYWx1ZShzdGFydFByb3AsIHByb3BTcGVjKTtcbiAgdmFyIGVuZCA9IGdldFZhbHVlKGVuZFByb3AsIHByb3BTcGVjKTtcbiAgaWYgKG51bWJlciQxKHN0YXJ0KSAmJiBudW1iZXIkMShlbmQpKSB7XG4gICAgcmV0dXJuIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICB9IGVsc2UgaWYgKGFycmF5KHN0YXJ0KSAmJiBhcnJheShlbmQpKSB7XG4gICAgdmFyIGVhc2VkQXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzaSA9IHN0YXJ0W2ldO1xuICAgICAgdmFyIGVpID0gZW5kW2ldO1xuICAgICAgaWYgKHNpICE9IG51bGwgJiYgZWkgIT0gbnVsbCkge1xuICAgICAgICB2YXIgdmFsID0gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzaSwgZWksIHBlcmNlbnQsIGVhc2luZ0ZuKTtcbiAgICAgICAgZWFzZWRBcnIucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWFzZWRBcnIucHVzaChlaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlYXNlZEFycjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzdGVwJDEoc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcbiAgdmFyIF9wID0gc2VsZi5fcHJpdmF0ZTtcbiAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICB2YXIgcEVhc2luZyA9IGFuaV9wLmVhc2luZztcbiAgdmFyIHN0YXJ0VGltZSA9IGFuaV9wLnN0YXJ0VGltZTtcbiAgdmFyIGN5ID0gaXNDb3JlID8gc2VsZiA6IHNlbGYuY3koKTtcbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgaWYgKCFhbmlfcC5lYXNpbmdJbXBsKSB7XG4gICAgaWYgKHBFYXNpbmcgPT0gbnVsbCkge1xuICAgICAgLy8gdXNlIGRlZmF1bHRcbiAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzWydsaW5lYXInXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBkZWZpbmUgdy8gbmFtZVxuICAgICAgdmFyIGVhc2luZ1ZhbHM7XG4gICAgICBpZiAoc3RyaW5nKHBFYXNpbmcpKSB7XG4gICAgICAgIHZhciBlYXNpbmdQcm9wID0gc3R5bGUucGFyc2UoJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJywgcEVhc2luZyk7XG4gICAgICAgIGVhc2luZ1ZhbHMgPSBlYXNpbmdQcm9wLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlbiBhc3N1bWUgcHJlcGFyc2VkIGFycmF5XG4gICAgICAgIGVhc2luZ1ZhbHMgPSBwRWFzaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG5hbWUsIGFyZ3M7XG4gICAgICBpZiAoc3RyaW5nKGVhc2luZ1ZhbHMpKSB7XG4gICAgICAgIG5hbWUgPSBlYXNpbmdWYWxzO1xuICAgICAgICBhcmdzID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lID0gZWFzaW5nVmFsc1sxXTtcbiAgICAgICAgYXJncyA9IGVhc2luZ1ZhbHMuc2xpY2UoMikubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgcmV0dXJuICtuO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gY3JlYXRlIHdpdGggYXJnc1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3NwcmluZycpIHtcbiAgICAgICAgICBhcmdzLnB1c2goYW5pX3AuZHVyYXRpb24pOyAvLyBuZWVkIGR1cmF0aW9uIHRvIGdlbmVyYXRlIHNwcmluZ1xuICAgICAgICB9XG5cbiAgICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdGF0aWMgaW1wbCBieSBuYW1lXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZWFzaW5nID0gYW5pX3AuZWFzaW5nSW1wbDtcbiAgdmFyIHBlcmNlbnQ7XG4gIGlmIChhbmlfcC5kdXJhdGlvbiA9PT0gMCkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9IGVsc2Uge1xuICAgIHBlcmNlbnQgPSAobm93IC0gc3RhcnRUaW1lKSAvIGFuaV9wLmR1cmF0aW9uO1xuICB9XG4gIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgIHBlcmNlbnQgPSBhbmlfcC5wcm9ncmVzcztcbiAgfVxuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIGlmIChhbmlfcC5kZWxheSA9PSBudWxsKSB7XG4gICAgLy8gdGhlbiB1cGRhdGVcblxuICAgIHZhciBzdGFydFBvcyA9IGFuaV9wLnN0YXJ0UG9zaXRpb247XG4gICAgdmFyIGVuZFBvcyA9IGFuaV9wLnBvc2l0aW9uO1xuICAgIGlmIChlbmRQb3MgJiYgaXNFbGVzICYmICFzZWxmLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgbmV3UG9zID0ge307XG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueCwgZW5kUG9zLngpKSB7XG4gICAgICAgIG5ld1Bvcy54ID0gZWFzZShzdGFydFBvcy54LCBlbmRQb3MueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBvcy55LCBlbmRQb3MueSkpIHtcbiAgICAgICAgbmV3UG9zLnkgPSBlYXNlKHN0YXJ0UG9zLnksIGVuZFBvcy55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5wb3NpdGlvbihuZXdQb3MpO1xuICAgIH1cbiAgICB2YXIgc3RhcnRQYW4gPSBhbmlfcC5zdGFydFBhbjtcbiAgICB2YXIgZW5kUGFuID0gYW5pX3AucGFuO1xuICAgIHZhciBwYW4gPSBfcC5wYW47XG4gICAgdmFyIGFuaW1hdGluZ1BhbiA9IGVuZFBhbiAhPSBudWxsICYmIGlzQ29yZTtcbiAgICBpZiAoYW5pbWF0aW5nUGFuKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueCwgZW5kUGFuLngpKSB7XG4gICAgICAgIHBhbi54ID0gZWFzZShzdGFydFBhbi54LCBlbmRQYW4ueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBhbi55LCBlbmRQYW4ueSkpIHtcbiAgICAgICAgcGFuLnkgPSBlYXNlKHN0YXJ0UGFuLnksIGVuZFBhbi55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCdwYW4nKTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0Wm9vbSA9IGFuaV9wLnN0YXJ0Wm9vbTtcbiAgICB2YXIgZW5kWm9vbSA9IGFuaV9wLnpvb207XG4gICAgdmFyIGFuaW1hdGluZ1pvb20gPSBlbmRab29tICE9IG51bGwgJiYgaXNDb3JlO1xuICAgIGlmIChhbmltYXRpbmdab29tKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRab29tLCBlbmRab29tKSkge1xuICAgICAgICBfcC56b29tID0gYm91bmQoX3AubWluWm9vbSwgZWFzZShzdGFydFpvb20sIGVuZFpvb20sIHBlcmNlbnQsIGVhc2luZyksIF9wLm1heFpvb20pO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCd6b29tJyk7XG4gICAgfVxuICAgIGlmIChhbmltYXRpbmdQYW4gfHwgYW5pbWF0aW5nWm9vbSkge1xuICAgICAgc2VsZi5lbWl0KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICB2YXIgcHJvcHMgPSBhbmlfcC5zdHlsZTtcbiAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoID4gMCAmJiBpc0VsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgZW5kID0gcHJvcDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gYW5pX3Auc3RhcnRTdHlsZVtfbmFtZV07XG4gICAgICAgIHZhciBwcm9wU3BlYyA9IHN0eWxlLnByb3BlcnRpZXNbc3RhcnQubmFtZV07XG4gICAgICAgIHZhciBlYXNlZFZhbCA9IGVhc2Uoc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nLCBwcm9wU3BlYyk7XG4gICAgICAgIHN0eWxlLm92ZXJyaWRlQnlwYXNzKHNlbGYsIF9uYW1lLCBlYXNlZFZhbCk7XG4gICAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgICBzZWxmLmVtaXQoJ3N0eWxlJyk7XG4gICAgfSAvLyBpZlxuICB9XG5cbiAgYW5pX3AucHJvZ3Jlc3MgPSBwZXJjZW50O1xuICByZXR1cm4gcGVyY2VudDtcbn1cbmZ1bmN0aW9uIHZhbGlkKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09IG51bGwgfHwgZW5kID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG51bWJlciQxKHN0YXJ0KSAmJiBudW1iZXIkMShlbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzdGFydEFuaW1hdGlvbihzZWxmLCBhbmksIG5vdywgaXNDb3JlKSB7XG4gIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgYW5pX3Auc3RhcnRlZCA9IHRydWU7XG4gIGFuaV9wLnN0YXJ0VGltZSA9IG5vdyAtIGFuaV9wLnByb2dyZXNzICogYW5pX3AuZHVyYXRpb247XG59XG5cbmZ1bmN0aW9uIHN0ZXBBbGwobm93LCBjeSkge1xuICB2YXIgZWxlcyA9IGN5Ll9wcml2YXRlLmFuaUVsZXM7XG4gIHZhciBkb25lRWxlcyA9IFtdO1xuICBmdW5jdGlvbiBzdGVwT25lKGVsZSwgaXNDb3JlKSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjdXJyZW50ID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgdmFyIHF1ZXVlID0gX3AuYW5pbWF0aW9uLnF1ZXVlO1xuICAgIHZhciByYW5BbmlzID0gZmFsc2U7XG5cbiAgICAvLyBpZiBub3RoaW5nIGN1cnJlbnRseSBhbmltYXRpbmcsIGdldCBzb21ldGhpbmcgZnJvbSB0aGUgcXVldWVcbiAgICBpZiAoY3VycmVudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBuZXh0ID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uIGNhbGxiYWNrcyhfY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKHZhciBqID0gX2NhbGxiYWNrcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB2YXIgY2IgPSBfY2FsbGJhY2tzW2pdO1xuICAgICAgICBjYigpO1xuICAgICAgfVxuICAgICAgX2NhbGxiYWNrcy5zcGxpY2UoMCwgX2NhbGxiYWNrcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICAvLyBzdGVwIGFuZCByZW1vdmUgaWYgZG9uZVxuICAgIGZvciAodmFyIGkgPSBjdXJyZW50Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYW5pID0gY3VycmVudFtpXTtcbiAgICAgIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgICAgIGlmIChhbmlfcC5zdG9wcGVkKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghYW5pX3AucGxheWluZyAmJiAhYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFuIGFwcGx5KCkgd2hpbGUgcGxheWluZyBzaG91bGRuJ3QgZG8gYW55dGhpbmdcbiAgICAgIGlmIChhbmlfcC5wbGF5aW5nICYmIGFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGFuaV9wLmFwcGx5aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWFuaV9wLnN0YXJ0ZWQpIHtcbiAgICAgICAgc3RhcnRBbmltYXRpb24oZWxlLCBhbmksIG5vdyk7XG4gICAgICB9XG4gICAgICBzdGVwJDEoZWxlLCBhbmksIG5vdywgaXNDb3JlKTtcbiAgICAgIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2tzKGFuaV9wLmZyYW1lcyk7XG4gICAgICBpZiAoYW5pX3Auc3RlcCAhPSBudWxsKSB7XG4gICAgICAgIGFuaV9wLnN0ZXAobm93KTtcbiAgICAgIH1cbiAgICAgIGlmIChhbmkuY29tcGxldGVkKCkpIHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGFuaV9wLmhvb2tlZCA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgY2FsbGJhY2tzKGFuaV9wLmNvbXBsZXRlcyk7XG4gICAgICB9XG4gICAgICByYW5BbmlzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpc0NvcmUgJiYgY3VycmVudC5sZW5ndGggPT09IDAgJiYgcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBkb25lRWxlcy5wdXNoKGVsZSk7XG4gICAgfVxuICAgIHJldHVybiByYW5BbmlzO1xuICB9IC8vIHN0ZXBFbGVtZW50XG5cbiAgLy8gaGFuZGxlIGFsbCBlbGVzXG4gIHZhciByYW5FbGVBbmkgPSBmYWxzZTtcbiAgZm9yICh2YXIgZSA9IDA7IGUgPCBlbGVzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbZV07XG4gICAgdmFyIGhhbmRsZWRUaGlzRWxlID0gc3RlcE9uZShlbGUpO1xuICAgIHJhbkVsZUFuaSA9IHJhbkVsZUFuaSB8fCBoYW5kbGVkVGhpc0VsZTtcbiAgfSAvLyBlYWNoIGVsZW1lbnRcblxuICB2YXIgcmFuQ29yZUFuaSA9IHN0ZXBPbmUoY3ksIHRydWUpO1xuXG4gIC8vIG5vdGlmeSByZW5kZXJlclxuICBpZiAocmFuRWxlQW5pIHx8IHJhbkNvcmVBbmkpIHtcbiAgICBpZiAoZWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjeS5ub3RpZnkoJ2RyYXcnLCBlbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3kubm90aWZ5KCdkcmF3Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gbGlzdCBvZiBjdXJyZW50bHkgYW5pbWF0aW5nIGlmIGl0cyBxdWV1ZXMgYXJlIGVtcHR5XG4gIGVsZXMudW5tZXJnZShkb25lRWxlcyk7XG4gIGN5LmVtaXQoJ3N0ZXAnKTtcbn0gLy8gc3RlcEFsbFxuXG52YXIgY29yZWZuJDggPSB7XG4gIC8vIHB1bGwgaW4gYW5pbWF0aW9uIGZ1bmN0aW9uc1xuICBhbmltYXRlOiBkZWZpbmUuYW5pbWF0ZSgpLFxuICBhbmltYXRpb246IGRlZmluZS5hbmltYXRpb24oKSxcbiAgYW5pbWF0ZWQ6IGRlZmluZS5hbmltYXRlZCgpLFxuICBjbGVhclF1ZXVlOiBkZWZpbmUuY2xlYXJRdWV1ZSgpLFxuICBkZWxheTogZGVmaW5lLmRlbGF5KCksXG4gIGRlbGF5QW5pbWF0aW9uOiBkZWZpbmUuZGVsYXlBbmltYXRpb24oKSxcbiAgc3RvcDogZGVmaW5lLnN0b3AoKSxcbiAgYWRkVG9BbmltYXRpb25Qb29sOiBmdW5jdGlvbiBhZGRUb0FuaW1hdGlvblBvb2woZWxlcykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBubyBzdHlsZSB1c2VkXG5cbiAgICBjeS5fcHJpdmF0ZS5hbmlFbGVzLm1lcmdlKGVsZXMpO1xuICB9LFxuICBzdG9wQW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gc3RvcEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IGZhbHNlO1xuICB9LFxuICBzdGFydEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uTG9vcCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5Ll9wcml2YXRlLmFuaW1hdGlvbnNSdW5uaW5nID0gdHJ1ZTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXZlIGN5Y2xlcyB3aGVuIG5vIHN0eWxlIHVzZWRcblxuICAgIC8vIE5CIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGV4ZWMgaW4gaGVhZGxlc3MgZW52aXJvbm1lbnRzIGlmIHN0eWxlIGVuYWJsZWRcbiAgICAvLyBhbmQgZXhwbGljaXQgY3kuZGVzdHJveSgpIGlzIG5lY2Vzc2FyeSB0byBzdG9wIHRoZSBsb29wXG5cbiAgICBmdW5jdGlvbiBoZWFkbGVzc1N0ZXAoKSB7XG4gICAgICBpZiAoIWN5Ll9wcml2YXRlLmFuaW1hdGlvbnNSdW5uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBhbmltYXRpb25TdGVwKG5vdykge1xuICAgICAgICBzdGVwQWxsKG5vdywgY3kpO1xuICAgICAgICBoZWFkbGVzc1N0ZXAoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci5iZWZvcmVSZW5kZXIpIHtcbiAgICAgIC8vIGxldCB0aGUgcmVuZGVyZXIgc2NoZWR1bGUgYW5pbWF0aW9uc1xuICAgICAgcmVuZGVyZXIuYmVmb3JlUmVuZGVyKGZ1bmN0aW9uIHJlbmRlcmVyQW5pbWF0aW9uU3RlcCh3aWxsRHJhdywgbm93KSB7XG4gICAgICAgIHN0ZXBBbGwobm93LCBjeSk7XG4gICAgICB9LCByZW5kZXJlci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmFuaW1hdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBtYW5hZ2UgdGhlIGFuaW1hdGlvbiBsb29wIG91cnNlbHZlc1xuICAgICAgaGVhZGxlc3NTdGVwKCk7IC8vIGZpcnN0IGNhbGxcbiAgICB9XG4gIH1cbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyA9IHtcbiAgcXVhbGlmaWVyQ29tcGFyZTogZnVuY3Rpb24gcXVhbGlmaWVyQ29tcGFyZShzZWxlY3RvcjEsIHNlbGVjdG9yMikge1xuICAgIGlmIChzZWxlY3RvcjEgPT0gbnVsbCB8fCBzZWxlY3RvcjIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMSA9PSBudWxsICYmIHNlbGVjdG9yMiA9PSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxLnNhbWVUZXh0KHNlbGVjdG9yMik7XG4gICAgfVxuICB9LFxuICBldmVudE1hdGNoZXM6IGZ1bmN0aW9uIGV2ZW50TWF0Y2hlcyhjeSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbGlzdGVuZXIucXVhbGlmaWVyO1xuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gY3kgIT09IGV2ZW50T2JqLnRhcmdldCAmJiBlbGVtZW50KGV2ZW50T2JqLnRhcmdldCkgJiYgc2VsZWN0b3IubWF0Y2hlcyhldmVudE9iai50YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGN5LCBldnQpIHtcbiAgICBldnQuY3kgPSBjeTtcbiAgICBldnQudGFyZ2V0ID0gY3k7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGN5LCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICByZXR1cm4gbGlzdGVuZXIucXVhbGlmaWVyICE9IG51bGwgPyBldmVudE9iai50YXJnZXQgOiBjeTtcbiAgfVxufTtcbnZhciBhcmdTZWxlY3RvciA9IGZ1bmN0aW9uIGFyZ1NlbGVjdG9yKGFyZykge1xuICBpZiAoc3RyaW5nKGFyZykpIHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yKGFyZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfVxufTtcbnZhciBlbGVzZm4gPSB7XG4gIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgIF9wLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0aW9ucywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVtaXR0ZXI7XG4gIH0sXG4gIG9uOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsZWN0b3Ioc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUxpc3RlbmVyKGV2ZW50cywgYXJnU2VsZWN0b3Ioc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmU6IGZ1bmN0aW9uIG9uZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsZWN0b3Ioc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcykge1xuICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXRBbmROb3RpZnk6IGZ1bmN0aW9uIGVtaXRBbmROb3RpZnkoZXZlbnQsIGVsZXMpIHtcbiAgICB0aGlzLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMubm90aWZ5KGV2ZW50LCBlbGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZS5ldmVudEFsaWFzZXNPbihlbGVzZm4pO1xuXG52YXIgY29yZWZuJDcgPSB7XG4gIHBuZzogZnVuY3Rpb24gcG5nKG9wdGlvbnMpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiByZW5kZXJlci5wbmcob3B0aW9ucyk7XG4gIH0sXG4gIGpwZzogZnVuY3Rpb24ganBnKG9wdGlvbnMpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuYmcgPSBvcHRpb25zLmJnIHx8ICcjZmZmJztcbiAgICByZXR1cm4gcmVuZGVyZXIuanBnKG9wdGlvbnMpO1xuICB9XG59O1xuY29yZWZuJDcuanBlZyA9IGNvcmVmbiQ3LmpwZztcblxudmFyIGNvcmVmbiQ2ID0ge1xuICBsYXlvdXQ6IGZ1bmN0aW9uIGxheW91dChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICBlcnJvcignTGF5b3V0IG9wdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5uYW1lID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGBuYW1lYCBtdXN0IGJlIHNwZWNpZmllZCB0byBtYWtlIGEgbGF5b3V0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgIHZhciBMYXlvdXQgPSBjeS5leHRlbnNpb24oJ2xheW91dCcsIG5hbWUpO1xuICAgIGlmIChMYXlvdXQgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ05vIHN1Y2ggbGF5b3V0IGAnICsgbmFtZSArICdgIGZvdW5kLiAgRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD8nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVsZXM7XG4gICAgaWYgKHN0cmluZyhvcHRpb25zLmVsZXMpKSB7XG4gICAgICBlbGVzID0gY3kuJChvcHRpb25zLmVsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzID0gb3B0aW9ucy5lbGVzICE9IG51bGwgPyBvcHRpb25zLmVsZXMgOiBjeS4kKCk7XG4gICAgfVxuICAgIHZhciBsYXlvdXQgPSBuZXcgTGF5b3V0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgY3k6IGN5LFxuICAgICAgZWxlczogZWxlc1xuICAgIH0pKTtcbiAgICByZXR1cm4gbGF5b3V0O1xuICB9XG59O1xuY29yZWZuJDYuY3JlYXRlTGF5b3V0ID0gY29yZWZuJDYubWFrZUxheW91dCA9IGNvcmVmbiQ2LmxheW91dDtcblxudmFyIGNvcmVmbiQ1ID0ge1xuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeShldmVudE5hbWUsIGV2ZW50RWxlcykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKHRoaXMuYmF0Y2hpbmcoKSkge1xuICAgICAgX3AuYmF0Y2hOb3RpZmljYXRpb25zID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zIHx8IHt9O1xuICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdIHx8IHRoaXMuY29sbGVjdGlvbigpO1xuICAgICAgaWYgKGV2ZW50RWxlcyAhPSBudWxsKSB7XG4gICAgICAgIGVsZXMubWVyZ2UoZXZlbnRFbGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjsgLy8gbm90aWZpY2F0aW9ucyBhcmUgZGlzYWJsZWQgZHVyaW5nIGJhdGNoaW5nXG4gICAgfVxuXG4gICAgaWYgKCFfcC5ub3RpZmljYXRpb25zRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBvbiBkaXNhYmxlZFxuXG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpO1xuXG4gICAgLy8gZXhpdCBpZiBkZXN0cm95KCkgY2FsbGVkIG9uIGNvcmUgb3IgcmVuZGVyZXIgaW4gYmV0d2VlbiBmcmFtZXMgIzE0OTkgIzE1MjhcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQoKSB8fCAhcmVuZGVyZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSwgZXZlbnRFbGVzKTtcbiAgfSxcbiAgbm90aWZpY2F0aW9uczogZnVuY3Rpb24gbm90aWZpY2F0aW9ucyhib29sKSB7XG4gICAgdmFyIHAgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwLm5vdGlmaWNhdGlvbnNFbmFibGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwLm5vdGlmaWNhdGlvbnNFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG5vTm90aWZpY2F0aW9uczogZnVuY3Rpb24gbm9Ob3RpZmljYXRpb25zKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyh0cnVlKTtcbiAgfSxcbiAgYmF0Y2hpbmc6IGZ1bmN0aW9uIGJhdGNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmJhdGNoQ291bnQgPiAwO1xuICB9LFxuICBzdGFydEJhdGNoOiBmdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT0gbnVsbCkge1xuICAgICAgX3AuYmF0Y2hDb3VudCA9IDA7XG4gICAgfVxuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICBfcC5iYXRjaFN0eWxlRWxlcyA9IHRoaXMuY29sbGVjdGlvbigpO1xuICAgICAgX3AuYmF0Y2hOb3RpZmljYXRpb25zID0ge307XG4gICAgfVxuICAgIF9wLmJhdGNoQ291bnQrKztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW5kQmF0Y2g6IGZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfcC5iYXRjaENvdW50LS07XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBmb3IgZGlydHkgZWxlc1xuICAgICAgX3AuYmF0Y2hTdHlsZUVsZXMudXBkYXRlU3R5bGUoKTtcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIoKTtcblxuICAgICAgLy8gbm90aWZ5IHRoZSByZW5kZXJlciBvZiBxdWV1ZWQgZWxlcyBhbmQgZXZlbnQgdHlwZXNcbiAgICAgIE9iamVjdC5rZXlzKF9wLmJhdGNoTm90aWZpY2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHZhciBlbGVzID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV07XG4gICAgICAgIGlmIChlbGVzLmVtcHR5KCkpIHtcbiAgICAgICAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBlbGVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBiYXRjaDogZnVuY3Rpb24gYmF0Y2goY2FsbGJhY2spIHtcbiAgICB0aGlzLnN0YXJ0QmF0Y2goKTtcbiAgICBjYWxsYmFjaygpO1xuICAgIHRoaXMuZW5kQmF0Y2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGJhdGNoRGF0YTogZnVuY3Rpb24gYmF0Y2hEYXRhKG1hcCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKG1hcCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICAgIHZhciBkYXRhID0gbWFwW2lkXTtcbiAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgZWxlLmRhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciByZW5kZXJlckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGhpZGVFZGdlc09uVmlld3BvcnQ6IGZhbHNlLFxuICB0ZXh0dXJlT25WaWV3cG9ydDogZmFsc2UsXG4gIG1vdGlvbkJsdXI6IGZhbHNlLFxuICBtb3Rpb25CbHVyT3BhY2l0eTogMC4wNSxcbiAgcGl4ZWxSYXRpbzogdW5kZWZpbmVkLFxuICBkZXNrdG9wVGFwVGhyZXNob2xkOiA0LFxuICB0b3VjaFRhcFRocmVzaG9sZDogOCxcbiAgd2hlZWxTZW5zaXRpdml0eTogMSxcbiAgZGVidWc6IGZhbHNlLFxuICBzaG93RnBzOiBmYWxzZVxufSk7XG52YXIgY29yZWZuJDQgPSB7XG4gIHJlbmRlclRvOiBmdW5jdGlvbiByZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgICB2YXIgciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgci5yZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW5kZXJlcjogZnVuY3Rpb24gcmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gIH0sXG4gIGZvcmNlUmVuZGVyOiBmdW5jdGlvbiBmb3JjZVJlbmRlcigpIHtcbiAgICB0aGlzLm5vdGlmeSgnZHJhdycpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICB0aGlzLmludmFsaWRhdGVTaXplKCk7XG4gICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdyZXNpemUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgaW5pdFJlbmRlcmVyOiBmdW5jdGlvbiBpbml0UmVuZGVyZXIob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIFJlbmRlcmVyUHJvdG8gPSBjeS5leHRlbnNpb24oJ3JlbmRlcmVyJywgb3B0aW9ucy5uYW1lKTtcbiAgICBpZiAoUmVuZGVyZXJQcm90byA9PSBudWxsKSB7XG4gICAgICBlcnJvcihcIkNhbiBub3QgaW5pdGlhbGlzZTogTm8gc3VjaCByZW5kZXJlciBgXCIuY29uY2F0KG9wdGlvbnMubmFtZSwgXCJgIGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBpbXBvcnQgaXQgYW5kIGBjeXRvc2NhcGUudXNlKClgIGl0P1wiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcIllvdSBoYXZlIHNldCBhIGN1c3RvbSB3aGVlbCBzZW5zaXRpdml0eS4gIFRoaXMgd2lsbCBtYWtlIHlvdXIgYXBwIHpvb20gdW5uYXR1cmFsbHkgd2hlbiB1c2luZyBtYWluc3RyZWFtIG1pY2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgb25seSBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCB5b3VyIHVzZXJzIHdpbGwgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIGFuZCBPUyBjb25maWd1cmF0aW9uIGFzIHlvdXIgY3VycmVudCBtYWNoaW5lLlwiKTtcbiAgICB9XG4gICAgdmFyIHJPcHRzID0gcmVuZGVyZXJEZWZhdWx0cyhvcHRpb25zKTtcbiAgICByT3B0cy5jeSA9IGN5O1xuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyUHJvdG8ock9wdHMpO1xuICAgIHRoaXMubm90aWZ5KCdpbml0Jyk7XG4gIH0sXG4gIGRlc3Ryb3lSZW5kZXJlcjogZnVuY3Rpb24gZGVzdHJveVJlbmRlcmVyKCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kubm90aWZ5KCdkZXN0cm95Jyk7IC8vIGRlc3Ryb3kgdGhlIHJlbmRlcmVyXG5cbiAgICB2YXIgZG9tRWxlID0gY3kuY29udGFpbmVyKCk7XG4gICAgaWYgKGRvbUVsZSkge1xuICAgICAgZG9tRWxlLl9jeXJlZyA9IG51bGw7XG4gICAgICB3aGlsZSAoZG9tRWxlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkb21FbGUucmVtb3ZlQ2hpbGQoZG9tRWxlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5fcHJpdmF0ZS5yZW5kZXJlciA9IG51bGw7IC8vIHRvIGJlIGV4dHJhIHNhZmUsIHJlbW92ZSB0aGUgcmVmXG4gICAgY3kubXV0YWJsZUVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBfcC5yc2NyYXRjaCA9IHt9O1xuICAgICAgX3AucnN0eWxlID0ge307XG4gICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgfSk7XG4gIH0sXG4gIG9uUmVuZGVyOiBmdW5jdGlvbiBvblJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9uKCdyZW5kZXInLCBmbik7XG4gIH0sXG4gIG9mZlJlbmRlcjogZnVuY3Rpb24gb2ZmUmVuZGVyKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMub2ZmKCdyZW5kZXInLCBmbik7XG4gIH1cbn07XG5jb3JlZm4kNC5pbnZhbGlkYXRlRGltZW5zaW9ucyA9IGNvcmVmbiQ0LnJlc2l6ZTtcblxudmFyIGNvcmVmbiQzID0ge1xuICAvLyBnZXQgYSBjb2xsZWN0aW9uXG4gIC8vIC0gZW1wdHkgY29sbGVjdGlvbiBvbiBubyBhcmdzXG4gIC8vIC0gY29sbGVjdGlvbiBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhcGggb24gc2VsZWN0b3IgYXJnXG4gIC8vIC0gZ3VhcmFudGVlIGEgcmV0dXJuZWQgY29sbGVjdGlvbiB3aGVuIGVsZW1lbnRzIG9yIGNvbGxlY3Rpb24gc3BlY2lmaWVkXG4gIGNvbGxlY3Rpb246IGZ1bmN0aW9uIGNvbGxlY3Rpb24oZWxlcywgb3B0cykge1xuICAgIGlmIChzdHJpbmcoZWxlcykpIHtcbiAgICAgIHJldHVybiB0aGlzLiQoZWxlcyk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGVsZXMpKSB7XG4gICAgICByZXR1cm4gZWxlcy5jb2xsZWN0aW9uKCk7XG4gICAgfSBlbHNlIGlmIChhcnJheShlbGVzKSkge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLCBlbGVzLCBvcHRzLnVuaXF1ZSwgb3B0cy5yZW1vdmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMpO1xuICB9LFxuICBub2RlczogZnVuY3Rpb24gbm9kZXMoc2VsZWN0b3IpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVkZ2VzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBlZGdlcztcbiAgfSxcbiAgLy8gc2VhcmNoIHRoZSBncmFwaCBsaWtlIGpRdWVyeVxuICAkOiBmdW5jdGlvbiAkKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLl9wcml2YXRlLmVsZW1lbnRzO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVsZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZXMuc3Bhd25TZWxmKCk7XG4gICAgfVxuICB9LFxuICBtdXRhYmxlRWxlbWVudHM6IGZ1bmN0aW9uIG11dGFibGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuY29yZWZuJDMuZWxlbWVudHMgPSBjb3JlZm4kMy5maWx0ZXIgPSBjb3JlZm4kMy4kO1xuXG52YXIgc3R5Zm4kOCA9IHt9O1xuXG4vLyBrZXlzIGZvciBzdHlsZSBibG9ja3MsIGUuZy4gdHRmZnR0XG52YXIgVFJVRSA9ICd0JztcbnZhciBGQUxTRSA9ICdmJztcblxuLy8gKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBjYWxjdWxhdGlvbilcbi8vIGFwcGx5IHRoZSBzdHlsZSB0byB0aGUgZWxlbWVudCBiYXNlZCBvblxuLy8gLSBpdHMgYnlwYXNzXG4vLyAtIHdoYXQgc2VsZWN0b3JzIG1hdGNoIGl0XG5zdHlmbiQ4LmFwcGx5ID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgY3kgPSBfcC5jeTtcbiAgdmFyIHVwZGF0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICBmb3IgKHZhciBpZSA9IDA7IGllIDwgZWxlcy5sZW5ndGg7IGllKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpZV07XG4gICAgdmFyIGN4dE1ldGEgPSBzZWxmLmdldENvbnRleHRNZXRhKGVsZSk7XG4gICAgaWYgKGN4dE1ldGEuZW1wdHkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY3h0U3R5bGUgPSBzZWxmLmdldENvbnRleHRTdHlsZShjeHRNZXRhKTtcbiAgICB2YXIgYXBwID0gc2VsZi5hcHBseUNvbnRleHRTdHlsZShjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKTtcbiAgICBpZiAoZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUpIHtcbiAgICAgIHNlbGYudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBhcHAuZGlmZlByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgaGludHNEaWZmID0gc2VsZi51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKGhpbnRzRGlmZikge1xuICAgICAgdXBkYXRlZEVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlbWVudHNcblxuICByZXR1cm4gdXBkYXRlZEVsZXM7XG59O1xuc3R5Zm4kOC5nZXRQcm9wZXJ0aWVzRGlmZiA9IGZ1bmN0aW9uIChvbGRDeHRLZXksIG5ld0N4dEtleSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjYWNoZSA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzID0gc2VsZi5fcHJpdmF0ZS5wcm9wRGlmZnMgfHwge307XG4gIHZhciBkdWFsQ3h0S2V5ID0gb2xkQ3h0S2V5ICsgJy0nICsgbmV3Q3h0S2V5O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZHVhbEN4dEtleV07XG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG4gIHZhciBkaWZmUHJvcHMgPSBbXTtcbiAgdmFyIGFkZGVkUHJvcCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3h0ID0gc2VsZltpXTtcbiAgICB2YXIgb2xkSGFzQ3h0ID0gb2xkQ3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBuZXdIYXNDeHQgPSBuZXdDeHRLZXlbaV0gPT09IFRSVUU7XG4gICAgdmFyIGN4dEhhc0RpZmZlZCA9IG9sZEhhc0N4dCAhPT0gbmV3SGFzQ3h0O1xuICAgIHZhciBjeHRIYXNNYXBwZWRQcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGN4dEhhc0RpZmZlZCB8fCBuZXdIYXNDeHQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgIHZhciBwcm9wcyA9IHZvaWQgMDtcbiAgICAgIGlmIChjeHRIYXNEaWZmZWQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gc3VmZmljZXMgYi9jIG1hcHBlZFByb3BlcnRpZXMgaXMgYSBzdWJzZXQgb2YgcHJvcGVydGllc1xuICAgICAgfSBlbHNlIGlmIChjeHRIYXNEaWZmZWQpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gbmVlZCB0byBjaGVjayB0aGVtIGFsbFxuICAgICAgfSBlbHNlIGlmIChjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzOyAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgbWFwcGVkXG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG5cbiAgICAgICAgLy8gaWYgYSBsYXRlciBjb250ZXh0IG92ZXJyaWRlcyB0aGlzIHByb3BlcnR5LCB0aGVuIHRoZSBmYWN0IHRoYXQgdGhpcyBjb250ZXh0IGhhcyBzd2l0Y2hlZC9kaWZmZWQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgLy8gKHNlbWkgZXhwZW5zaXZlIGNoZWNrIHNpbmNlIGl0IG1ha2VzIHRoaXMgZnVuY3Rpb24gTyhuXjIpIG9uIGNvbnRleHQgbGVuZ3RoLCBidXQgd29ydGggaXQgc2luY2Ugb3ZlcmFsbCByZXN1bHRcbiAgICAgICAgLy8gaXMgY2FjaGVkKVxuICAgICAgICB2YXIgbGF0ZXJDeHRPdmVycmlkZXMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgayA9IGkgKyAxOyBrIDwgc2VsZi5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIHZhciBsYXRlckN4dCA9IHNlbGZba107XG4gICAgICAgICAgdmFyIGhhc0xhdGVyQ3h0ID0gbmV3Q3h0S2V5W2tdID09PSBUUlVFO1xuICAgICAgICAgIGlmICghaGFzTGF0ZXJDeHQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gLy8gY2FuJ3Qgb3ZlcnJpZGUgdW5sZXNzIHRoZSBjb250ZXh0IGlzIGFjdGl2ZVxuXG4gICAgICAgICAgbGF0ZXJDeHRPdmVycmlkZXMgPSBsYXRlckN4dC5wcm9wZXJ0aWVzW3Byb3AubmFtZV0gIT0gbnVsbDtcbiAgICAgICAgICBpZiAobGF0ZXJDeHRPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gLy8gZXhpdCBlYXJseSBhcyBsb25nIGFzIG9uZSBsYXRlciBjb250ZXh0IG92ZXJyaWRlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhZGRlZFByb3BbbmFtZV0gJiYgIWxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgYWRkZWRQcm9wW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBkaWZmUHJvcHMucHVzaChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgcHJvcHNcbiAgICB9IC8vIGlmXG4gIH0gLy8gZm9yIGNvbnRleHRzXG5cbiAgY2FjaGVbZHVhbEN4dEtleV0gPSBkaWZmUHJvcHM7XG4gIHJldHVybiBkaWZmUHJvcHM7XG59O1xuc3R5Zm4kOC5nZXRDb250ZXh0TWV0YSA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3h0S2V5ID0gJyc7XG4gIHZhciBkaWZmUHJvcHM7XG4gIHZhciBwcmV2S2V5ID0gZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5IHx8ICcnO1xuXG4gIC8vIGdldCB0aGUgY3h0IGtleVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IHNlbGZbaV07XG4gICAgdmFyIGNvbnRleHRTZWxlY3Rvck1hdGNoZXMgPSBjb250ZXh0LnNlbGVjdG9yICYmIGNvbnRleHQuc2VsZWN0b3IubWF0Y2hlcyhlbGUpOyAvLyBOQjogY29udGV4dC5zZWxlY3RvciBtYXkgYmUgbnVsbCBmb3IgJ2NvcmUnXG5cbiAgICBpZiAoY29udGV4dFNlbGVjdG9yTWF0Y2hlcykge1xuICAgICAgY3h0S2V5ICs9IFRSVUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN4dEtleSArPSBGQUxTRTtcbiAgICB9XG4gIH0gLy8gZm9yIGNvbnRleHRcblxuICBkaWZmUHJvcHMgPSBzZWxmLmdldFByb3BlcnRpZXNEaWZmKHByZXZLZXksIGN4dEtleSk7XG4gIGVsZS5fcHJpdmF0ZS5zdHlsZUN4dEtleSA9IGN4dEtleTtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGN4dEtleSxcbiAgICBkaWZmUHJvcE5hbWVzOiBkaWZmUHJvcHMsXG4gICAgZW1wdHk6IGRpZmZQcm9wcy5sZW5ndGggPT09IDBcbiAgfTtcbn07XG5cbi8vIGdldHMgYSBjb21wdXRlZCBlbGUgc3R5bGUgb2JqZWN0IGJhc2VkIG9uIG1hdGNoZWQgY29udGV4dHNcbnN0eWZuJDguZ2V0Q29udGV4dFN0eWxlID0gZnVuY3Rpb24gKGN4dE1ldGEpIHtcbiAgdmFyIGN4dEtleSA9IGN4dE1ldGEua2V5O1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeHRTdHlsZXMgPSB0aGlzLl9wcml2YXRlLmNvbnRleHRTdHlsZXMgPSB0aGlzLl9wcml2YXRlLmNvbnRleHRTdHlsZXMgfHwge307XG5cbiAgLy8gaWYgYWxyZWFkeSBjb21wdXRlZCBzdHlsZSwgcmV0dXJuZWQgY2FjaGVkIGNvcHlcbiAgaWYgKGN4dFN0eWxlc1tjeHRLZXldKSB7XG4gICAgcmV0dXJuIGN4dFN0eWxlc1tjeHRLZXldO1xuICB9XG4gIHZhciBzdHlsZSA9IHtcbiAgICBfcHJpdmF0ZToge1xuICAgICAga2V5OiBjeHRLZXlcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSBzZWxmW2ldO1xuICAgIHZhciBoYXNDeHQgPSBjeHRLZXlbaV0gPT09IFRSVUU7XG4gICAgaWYgKCFoYXNDeHQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGN4dC5wcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IGN4dC5wcm9wZXJ0aWVzW2pdO1xuICAgICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7XG4gICAgfVxuICB9XG4gIGN4dFN0eWxlc1tjeHRLZXldID0gc3R5bGU7XG4gIHJldHVybiBzdHlsZTtcbn07XG5zdHlmbiQ4LmFwcGx5Q29udGV4dFN0eWxlID0gZnVuY3Rpb24gKGN4dE1ldGEsIGN4dFN0eWxlLCBlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgZGlmZlByb3BzID0gY3h0TWV0YS5kaWZmUHJvcE5hbWVzO1xuICB2YXIgcmV0RGlmZlByb3BzID0ge307XG4gIHZhciB0eXBlcyA9IHNlbGYudHlwZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZlByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRpZmZQcm9wTmFtZSA9IGRpZmZQcm9wc1tpXTtcbiAgICB2YXIgY3h0UHJvcCA9IGN4dFN0eWxlW2RpZmZQcm9wTmFtZV07XG4gICAgdmFyIGVsZVByb3AgPSBlbGUucHN0eWxlKGRpZmZQcm9wTmFtZSk7XG4gICAgaWYgKCFjeHRQcm9wKSB7XG4gICAgICAvLyBubyBjb250ZXh0IHByb3AgbWVhbnMgZGVsZXRlXG4gICAgICBpZiAoIWVsZVByb3ApIHtcbiAgICAgICAgY29udGludWU7IC8vIG5vIGV4aXN0aW5nIHByb3AgbWVhbnMgbm90aGluZyBuZWVkcyB0byBiZSByZW1vdmVkXG4gICAgICAgIC8vIG5iIGFmZmVjdHMgaW5pdGlhbCBhcHBsaWNhdGlvbiBvbiBtYXBwZWQgdmFsdWVzIGxpa2UgY29udHJvbC1wb2ludC1kaXN0YW5jZXNcbiAgICAgIH0gZWxzZSBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgZGVsZXRlQnlwYXNzZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN4dFByb3AgPSB7XG4gICAgICAgICAgbmFtZTogZGlmZlByb3BOYW1lLFxuICAgICAgICAgIFwiZGVsZXRlXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYXZlIGN5Y2xlcyB3aGVuIHRoZSBjb250ZXh0IHByb3AgZG9lc24ndCBuZWVkIHRvIGJlIGFwcGxpZWRcbiAgICBpZiAoZWxlUHJvcCA9PT0gY3h0UHJvcCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gc2F2ZSBjeWNsZXMgd2hlbiBhIG1hcHBlZCBjb250ZXh0IHByb3AgZG9lc24ndCBuZWVkIHRvIGJlIGFwcGxpZWRcbiAgICBpZiAoY3h0UHJvcC5tYXBwZWQgPT09IHR5cGVzLmZuIC8vIGNvbnRleHQgcHJvcCBpcyBmdW5jdGlvbiBtYXBwZXJcbiAgICAmJiBlbGVQcm9wICE9IG51bGwgLy8gc29tZSBwcm9wcyBjYW4gYmUgbnVsbCBldmVuIGJ5IGRlZmF1bHQgKGUuZy4gYSBwcm9wIHRoYXQgb3ZlcnJpZGVzIGFub3RoZXIgb25lKVxuICAgICYmIGVsZVByb3AubWFwcGluZyAhPSBudWxsIC8vIGVsZSBwcm9wIGlzIGEgY29uY3JldGUgdmFsdWUgZnJvbSBmcm9tIGEgbWFwcGVyXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nLnZhbHVlID09PSBjeHRQcm9wLnZhbHVlIC8vIHRoZSBjdXJyZW50IHByb3Agb24gdGhlIGVsZSBpcyBhIGZsYXQgcHJvcCB2YWx1ZSBmb3IgdGhlIGZ1bmN0aW9uIG1hcHBlclxuICAgICkge1xuICAgICAgLy8gTkIgZG9uJ3Qgd3JpdGUgdG8gY3h0UHJvcCwgYXMgaXQncyBzaGFyZWQgYW1vbmcgZWxlcyAoc3RvcmVkIGluIHN0eWxlc2hlZXQpXG4gICAgICB2YXIgbWFwcGluZyA9IGVsZVByb3AubWFwcGluZzsgLy8gY2FuIHdyaXRlIHRvIG1hcHBpbmcsIGFzIGl0J3MgYSBwZXItZWxlIGNvcHlcbiAgICAgIHZhciBmblZhbHVlID0gbWFwcGluZy5mblZhbHVlID0gY3h0UHJvcC52YWx1ZShlbGUpOyAvLyB0ZW1wb3JhcmlseSBjYWNoZSB0aGUgdmFsdWUgaW4gY2FzZSBvZiBhIG1pc3NcblxuICAgICAgaWYgKGZuVmFsdWUgPT09IG1hcHBpbmcucHJldkZuVmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXREaWZmUHJvcCA9IHJldERpZmZQcm9wc1tkaWZmUHJvcE5hbWVdID0ge1xuICAgICAgcHJldjogZWxlUHJvcFxuICAgIH07XG4gICAgc2VsZi5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgY3h0UHJvcCk7XG4gICAgcmV0RGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoZGlmZlByb3BOYW1lKTtcbiAgICBpZiAocmV0RGlmZlByb3AubmV4dCAmJiByZXREaWZmUHJvcC5uZXh0LmJ5cGFzcykge1xuICAgICAgcmV0RGlmZlByb3AubmV4dCA9IHJldERpZmZQcm9wLm5leHQuYnlwYXNzZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZGlmZlByb3BzOiByZXREaWZmUHJvcHNcbiAgfTtcbn07XG5zdHlmbiQ4LnVwZGF0ZVN0eWxlSGludHMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcE5hbWVzID0gc2VsZi5wcm9wZXJ0eUdyb3VwTmFtZXM7XG4gIHZhciBwcm9wR3JLZXlzID0gc2VsZi5wcm9wZXJ0eUdyb3VwS2V5cztcbiAgdmFyIHByb3BIYXNoID0gZnVuY3Rpb24gcHJvcEhhc2goZWxlLCBwcm9wTmFtZXMsIHNlZWRLZXkpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRQcm9wZXJ0aWVzSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSk7XG4gIH07XG4gIHZhciBvbGRTdHlsZUtleSA9IF9wLnN0eWxlS2V5O1xuICBpZiAoZWxlLnJlbW92ZWQoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaXNOb2RlID0gX3AuZ3JvdXAgPT09ICdub2Rlcyc7XG5cbiAgLy8gZ2V0IHRoZSBzdHlsZSBrZXkgaGFzaGVzIHBlciBwcm9wIGdyb3VwXG4gIC8vIGJ1dCBsYXppbHkgLS0gb25seSB1c2Ugbm9uLWRlZmF1bHQgcHJvcCB2YWx1ZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaGFzaGVzXG4gIC8vXG5cbiAgdmFyIG92ZXJyaWRkZW5TdHlsZXMgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKG92ZXJyaWRkZW5TdHlsZXMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BHcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JLZXkgPSBwcm9wR3JLZXlzW2ldO1xuICAgIF9wLnN0eWxlS2V5c1tncktleV0gPSBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF07XG4gIH1cbiAgdmFyIHVwZGF0ZUdyS2V5MSA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5MSh2YWwsIGdyS2V5KSB7XG4gICAgcmV0dXJuIF9wLnN0eWxlS2V5c1tncktleV1bMF0gPSBoYXNoSW50KHZhbCwgX3Auc3R5bGVLZXlzW2dyS2V5XVswXSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleTIgPSBmdW5jdGlvbiB1cGRhdGVHcktleTIodmFsLCBncktleSkge1xuICAgIHJldHVybiBfcC5zdHlsZUtleXNbZ3JLZXldWzFdID0gaGFzaEludEFsdCh2YWwsIF9wLnN0eWxlS2V5c1tncktleV1bMV0pO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXkgPSBmdW5jdGlvbiB1cGRhdGVHcktleSh2YWwsIGdyS2V5KSB7XG4gICAgdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpO1xuICAgIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5V1N0ciA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5V1N0cihzdHJWYWwsIGdyS2V5KSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHJWYWwubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjaCA9IHN0clZhbC5jaGFyQ29kZUF0KGopO1xuICAgICAgdXBkYXRlR3JLZXkxKGNoLCBncktleSk7XG4gICAgICB1cGRhdGVHcktleTIoY2gsIGdyS2V5KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gLSBoYXNoaW5nIHdvcmtzIG9uIDMyIGJpdCBpbnRzIGIvYyB3ZSB1c2UgYml0d2lzZSBvcHNcbiAgLy8gLSBzbWFsbCBudW1iZXJzIGdldCBjdXQgb2ZmIChlLmcuIDAuMTIzIGlzIHNlZW4gYXMgMCBieSB0aGUgaGFzaGluZyBmdW5jdGlvbilcbiAgLy8gLSByYWlzZSB1cCBzbWFsbCBudW1iZXJzIHNvIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSBzZWVuIGJ5IGhhc2hpbmdcbiAgLy8gLSBtYWtlIHNtYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gYSBub3JtYWwgdmFsdWUgdG8gYXZvaWQgY29sbGlzaW9uc1xuICAvLyAtIHdvcmtzIGluIHByYWN0aWNlIGFuZCBpdCdzIHJlbGF0aXZlbHkgY2hlYXBcbiAgdmFyIE4gPSAyMDAwMDAwMDAwO1xuICB2YXIgY2xlYW5OdW0gPSBmdW5jdGlvbiBjbGVhbk51bSh2YWwpIHtcbiAgICByZXR1cm4gLTEyOCA8IHZhbCAmJiB2YWwgPCAxMjggJiYgTWF0aC5mbG9vcih2YWwpICE9PSB2YWwgPyBOIC0gKHZhbCAqIDEwMjQgfCAwKSA6IHZhbDtcbiAgfTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb3BOYW1lcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgbmFtZSA9IHByb3BOYW1lc1tfaV07XG4gICAgdmFyIHBhcnNlZFByb3AgPSBvdmVycmlkZGVuU3R5bGVzW25hbWVdO1xuICAgIGlmIChwYXJzZWRQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgcHJvcEluZm8gPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgdmFyIHR5cGUgPSBwcm9wSW5mby50eXBlO1xuICAgIHZhciBfZ3JLZXkgPSBwcm9wSW5mby5ncm91cEtleTtcbiAgICB2YXIgbm9ybWFsaXplZE51bWJlclZhbCA9IHZvaWQgMDtcbiAgICBpZiAocHJvcEluZm8uaGFzaE92ZXJyaWRlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwcm9wSW5mby5oYXNoT3ZlcnJpZGUoZWxlLCBwYXJzZWRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZFByb3AucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBub3JtYWxpemVkTnVtYmVyVmFsID0gcGFyc2VkUHJvcC5wZlZhbHVlO1xuICAgIH1cblxuICAgIC8vIG1pZ2h0IG5vdCBiZSBhIG51bWJlciBpZiBpdCBhbGxvd3MgZW51bXNcbiAgICB2YXIgbnVtYmVyVmFsID0gcHJvcEluZm8uZW51bXMgPT0gbnVsbCA/IHBhcnNlZFByb3AudmFsdWUgOiBudWxsO1xuICAgIHZhciBoYXZlTm9ybU51bSA9IG5vcm1hbGl6ZWROdW1iZXJWYWwgIT0gbnVsbDtcbiAgICB2YXIgaGF2ZVVuaXRlZE51bSA9IG51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlTnVtID0gaGF2ZU5vcm1OdW0gfHwgaGF2ZVVuaXRlZE51bTtcbiAgICB2YXIgdW5pdHMgPSBwYXJzZWRQcm9wLnVuaXRzO1xuXG4gICAgLy8gbnVtYmVycyBhcmUgY2hlYXBlciB0byBoYXNoIHRoYW4gc3RyaW5nc1xuICAgIC8vIDEgaGFzaCBvcCB2cyBuIGhhc2ggb3BzIChmb3IgbGVuZ3RoIG4gc3RyaW5nKVxuICAgIGlmICh0eXBlLm51bWJlciAmJiBoYXZlTnVtICYmICF0eXBlLm11bHRpcGxlKSB7XG4gICAgICB2YXIgdiA9IGhhdmVOb3JtTnVtID8gbm9ybWFsaXplZE51bWJlclZhbCA6IG51bWJlclZhbDtcbiAgICAgIHVwZGF0ZUdyS2V5KGNsZWFuTnVtKHYpLCBfZ3JLZXkpO1xuICAgICAgaWYgKCFoYXZlTm9ybU51bSAmJiB1bml0cyAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZUdyS2V5V1N0cih1bml0cywgX2dyS2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlR3JLZXlXU3RyKHBhcnNlZFByb3Auc3RyVmFsdWUsIF9ncktleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gb3ZlcmFsbCBzdHlsZSBrZXlcbiAgLy9cblxuICB2YXIgaGFzaCA9IFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcHJvcEdyS2V5cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9ncktleTIgPSBwcm9wR3JLZXlzW19pMl07XG4gICAgdmFyIGdySGFzaCA9IF9wLnN0eWxlS2V5c1tfZ3JLZXkyXTtcbiAgICBoYXNoWzBdID0gaGFzaEludChnckhhc2hbMF0sIGhhc2hbMF0pO1xuICAgIGhhc2hbMV0gPSBoYXNoSW50QWx0KGdySGFzaFsxXSwgaGFzaFsxXSk7XG4gIH1cbiAgX3Auc3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzKGhhc2hbMF0sIGhhc2hbMV0pO1xuXG4gIC8vIGxhYmVsIGRpbXNcbiAgLy9cblxuICB2YXIgc2sgPSBfcC5zdHlsZUtleXM7XG4gIF9wLmxhYmVsRGltc0tleSA9IGNvbWJpbmVIYXNoZXNBcnJheShzay5sYWJlbERpbWVuc2lvbnMpO1xuICB2YXIgbGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ2xhYmVsJ10sIHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gIF9wLmxhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGxhYmVsS2V5cyk7XG4gIF9wLmxhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgbGFiZWxLZXlzKSk7XG4gIGlmICghaXNOb2RlKSB7XG4gICAgdmFyIHNvdXJjZUxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydzb3VyY2UtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC5zb3VyY2VMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShzb3VyY2VMYWJlbEtleXMpO1xuICAgIF9wLnNvdXJjZUxhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgc291cmNlTGFiZWxLZXlzKSk7XG4gICAgdmFyIHRhcmdldExhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWyd0YXJnZXQtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC50YXJnZXRMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheSh0YXJnZXRMYWJlbEtleXMpO1xuICAgIF9wLnRhcmdldExhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgdGFyZ2V0TGFiZWxLZXlzKSk7XG4gIH1cblxuICAvLyBub2RlXG4gIC8vXG5cbiAgaWYgKGlzTm9kZSkge1xuICAgIHZhciBfcCRzdHlsZUtleXMgPSBfcC5zdHlsZUtleXMsXG4gICAgICBub2RlQm9keSA9IF9wJHN0eWxlS2V5cy5ub2RlQm9keSxcbiAgICAgIG5vZGVCb3JkZXIgPSBfcCRzdHlsZUtleXMubm9kZUJvcmRlcixcbiAgICAgIG5vZGVPdXRsaW5lID0gX3Akc3R5bGVLZXlzLm5vZGVPdXRsaW5lLFxuICAgICAgYmFja2dyb3VuZEltYWdlID0gX3Akc3R5bGVLZXlzLmJhY2tncm91bmRJbWFnZSxcbiAgICAgIGNvbXBvdW5kID0gX3Akc3R5bGVLZXlzLmNvbXBvdW5kLFxuICAgICAgcGllID0gX3Akc3R5bGVLZXlzLnBpZTtcbiAgICB2YXIgbm9kZUtleXMgPSBbbm9kZUJvZHksIG5vZGVCb3JkZXIsIG5vZGVPdXRsaW5lLCBiYWNrZ3JvdW5kSW1hZ2UsIGNvbXBvdW5kLCBwaWVdLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIGsgIT0gbnVsbDtcbiAgICB9KS5yZWR1Y2UoaGFzaEFycmF5cywgW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdKTtcbiAgICBfcC5ub2RlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KG5vZGVLZXlzKTtcbiAgICBfcC5oYXNQaWUgPSBwaWUgIT0gbnVsbCAmJiBwaWVbMF0gIT09IERFRkFVTFRfSEFTSF9TRUVEICYmIHBpZVsxXSAhPT0gREVGQVVMVF9IQVNIX1NFRURfQUxUO1xuICB9XG4gIHJldHVybiBvbGRTdHlsZUtleSAhPT0gX3Auc3R5bGVLZXk7XG59O1xuc3R5Zm4kOC5jbGVhclN0eWxlSGludHMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgX3Auc3R5bGVDeHRLZXkgPSAnJztcbiAgX3Auc3R5bGVLZXlzID0ge307XG4gIF9wLnN0eWxlS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxLZXkgPSBudWxsO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxLZXkgPSBudWxsO1xuICBfcC5zb3VyY2VMYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxLZXkgPSBudWxsO1xuICBfcC50YXJnZXRMYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3Aubm9kZUtleSA9IG51bGw7XG4gIF9wLmhhc1BpZSA9IG51bGw7XG59O1xuXG4vLyBhcHBseSBhIHByb3BlcnR5IHRvIHRoZSBzdHlsZSAoZm9yIGludGVybmFsIHVzZSlcbi8vIHJldHVybnMgd2hldGhlciBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuLy9cbi8vIG5vdywgdGhpcyBmdW5jdGlvbiBmbGF0dGVucyB0aGUgcHJvcGVydHksIGFuZCBoZXJlJ3MgaG93OlxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgYnlwYXNzOiB0cnVlLCBkZWxldGVCeXBhc3M6IHRydWUgfVxuLy8gbm8gcHJvcGVydHkgaXMgZ2VuZXJhdGVkLCBpbnN0ZWFkIHRoZSBieXBhc3MgcHJvcGVydHkgaW4gdGhlXG4vLyBlbGVtZW50J3Mgc3R5bGUgaXMgcmVwbGFjZWQgYnkgd2hhdCdzIHBvaW50ZWQgdG8gYnkgdGhlIGBieXBhc3NlZGBcbi8vIGZpZWxkIGluIHRoZSBieXBhc3MgcHJvcGVydHkgKGkuZS4gcmVzdG9yaW5nIHRoZSBwcm9wZXJ0eSB0aGVcbi8vIGJ5cGFzcyB3YXMgb3ZlcnJpZGluZylcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IG1hcHBlZDogdHJ1dGh5IH1cbi8vIHRoZSBnZW5lcmF0ZWQgZmxhdHRlbmVkUHJvcDp7IG1hcHBpbmc6IHByb3AgfVxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgYnlwYXNzOiB0cnVlIH1cbi8vIHRoZSBnZW5lcmF0ZWQgZmxhdHRlbmVkUHJvcDp7IGJ5cGFzc2VkOiBwYXJzZWRQcm9wIH1cbnN0eWZuJDguYXBwbHlQYXJzZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlbGUsIHBhcnNlZFByb3ApIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcCA9IHBhcnNlZFByb3A7XG4gIHZhciBzdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgdmFyIGZsYXRQcm9wO1xuICB2YXIgdHlwZXMgPSBzZWxmLnR5cGVzO1xuICB2YXIgdHlwZSA9IHNlbGYucHJvcGVydGllc1twcm9wLm5hbWVdLnR5cGU7XG4gIHZhciBwcm9wSXNCeXBhc3MgPSBwcm9wLmJ5cGFzcztcbiAgdmFyIG9yaWdQcm9wID0gc3R5bGVbcHJvcC5uYW1lXTtcbiAgdmFyIG9yaWdQcm9wSXNCeXBhc3MgPSBvcmlnUHJvcCAmJiBvcmlnUHJvcC5ieXBhc3M7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGZsYXRQcm9wTWFwcGluZyA9ICdtYXBwaW5nJztcbiAgdmFyIGdldFZhbCA9IGZ1bmN0aW9uIGdldFZhbChwKSB7XG4gICAgaWYgKHAgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChwLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHAucGZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHAudmFsdWU7XG4gICAgfVxuICB9O1xuICB2YXIgY2hlY2tUcmlnZ2VycyA9IGZ1bmN0aW9uIGNoZWNrVHJpZ2dlcnMoKSB7XG4gICAgdmFyIGZyb21WYWwgPSBnZXRWYWwob3JpZ1Byb3ApO1xuICAgIHZhciB0b1ZhbCA9IGdldFZhbChwcm9wKTtcbiAgICBzZWxmLmNoZWNrVHJpZ2dlcnMoZWxlLCBwcm9wLm5hbWUsIGZyb21WYWwsIHRvVmFsKTtcbiAgfTtcblxuICAvLyBlZGdlIHNhbml0eSBjaGVja3MgdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20gbWFraW5nIHNlcmlvdXMgbWlzdGFrZXNcbiAgaWYgKHBhcnNlZFByb3AubmFtZSA9PT0gJ2N1cnZlLXN0eWxlJyAmJiBlbGUuaXNFZGdlKCkgJiYgKFxuICAvLyBsb29wcyBtdXN0IGJlIGJ1bmRsZWQgYmV6aWVyc1xuICBwYXJzZWRQcm9wLnZhbHVlICE9PSAnYmV6aWVyJyAmJiBlbGUuaXNMb29wKCkgfHxcbiAgLy8gZWRnZXMgY29ubmVjdGVkIHRvIGNvbXBvdW5kIG5vZGVzIGNhbiBub3QgYmUgaGF5c3RhY2tzXG4gIHBhcnNlZFByb3AudmFsdWUgPT09ICdoYXlzdGFjaycgJiYgKGVsZS5zb3VyY2UoKS5pc1BhcmVudCgpIHx8IGVsZS50YXJnZXQoKS5pc1BhcmVudCgpKSkpIHtcbiAgICBwcm9wID0gcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UocGFyc2VkUHJvcC5uYW1lLCAnYmV6aWVyJywgcHJvcElzQnlwYXNzKTtcbiAgfVxuICBpZiAocHJvcFtcImRlbGV0ZVwiXSkge1xuICAgIC8vIGRlbGV0ZSB0aGUgcHJvcGVydHkgYW5kIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvbiBmYWxzZXkgdmFsdWVcbiAgICBzdHlsZVtwcm9wLm5hbWVdID0gdW5kZWZpbmVkO1xuICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAocHJvcC5kZWxldGVCeXBhc3NlZCkge1xuICAgIC8vIGRlbGV0ZSB0aGUgcHJvcGVydHkgdGhhdCB0aGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gY2FuJ3QgZGVsZXRlIGlmIG5vIHByb3BcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gZGVsZXRlIGJ5cGFzc2VkXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzZWRcbiAgICB9XG4gIH1cblxuICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBieXBhc3NcbiAgaWYgKHByb3AuZGVsZXRlQnlwYXNzKSB7XG4gICAgLy8gdGhlbiB0aGlzIHByb3BlcnR5IGlzIGp1c3QgaGVyZSB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIGRlbGV0ZVxuICAgIGlmICghb3JpZ1Byb3ApIHtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBwcm9wZXJ0eSBpcyBhbHJlYWR5IG5vdCBkZWZpbmVkXG4gICAgfSBlbHNlIGlmIChvcmlnUHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIHRoZW4gcmVwbGFjZSB0aGUgYnlwYXNzIHByb3BlcnR5IHdpdGggdGhlIG9yaWdpbmFsXG4gICAgICAvLyBiZWNhdXNlIHRoZSBieXBhc3NlZCBwcm9wZXJ0eSB3YXMgYWxyZWFkeSBhcHBsaWVkIChhbmQgdGhlcmVmb3JlIHBhcnNlZCksIHdlIGNhbiBqdXN0IHJlcGxhY2UgaXQgKG5vIHJlYXBwbHlpbmcgbmVjZXNzYXJ5KVxuICAgICAgc3R5bGVbcHJvcC5uYW1lXSA9IG9yaWdQcm9wLmJ5cGFzc2VkO1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UncmUgdW5zdWNjZXNzZnVsIGRlbGV0aW5nIHRoZSBieXBhc3NcbiAgICB9XG4gIH1cblxuICB2YXIgcHJpbnRNYXBwaW5nRXJyID0gZnVuY3Rpb24gcHJpbnRNYXBwaW5nRXJyKCkge1xuICAgIHdhcm4oJ0RvIG5vdCBhc3NpZ24gbWFwcGluZ3MgdG8gZWxlbWVudHMgd2l0aG91dCBjb3JyZXNwb25kaW5nIGRhdGEgKGkuZS4gZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBoYXMgbm8gbWFwcGluZyBmb3IgcHJvcGVydHkgYCcgKyBwcm9wLm5hbWUgKyAnYCB3aXRoIGRhdGEgZmllbGQgYCcgKyBwcm9wLmZpZWxkICsgJ2ApOyB0cnkgYSBgWycgKyBwcm9wLmZpZWxkICsgJ11gIHNlbGVjdG9yIHRvIGxpbWl0IHNjb3BlIHRvIGVsZW1lbnRzIHdpdGggYCcgKyBwcm9wLmZpZWxkICsgJ2AgZGVmaW5lZCcpO1xuICB9O1xuXG4gIC8vIHB1dCB0aGUgcHJvcGVydHkgaW4gdGhlIHN0eWxlIG9iamVjdHNcbiAgc3dpdGNoIChwcm9wLm1hcHBlZCkge1xuICAgIC8vIGZsYXR0ZW4gdGhlIHByb3BlcnR5IGlmIG1hcHBlZFxuICAgIGNhc2UgdHlwZXMubWFwRGF0YTpcbiAgICAgIHtcbiAgICAgICAgLy8gZmxhdHRlbiB0aGUgZmllbGQgKGUuZy4gZGF0YS5mb28uYmFyKVxuICAgICAgICB2YXIgZmllbGRzID0gcHJvcC5maWVsZC5zcGxpdCgnLicpO1xuICAgICAgICB2YXIgZmllbGRWYWwgPSBfcC5kYXRhO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggJiYgZmllbGRWYWw7IGkrKykge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICBmaWVsZFZhbCA9IGZpZWxkVmFsW2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGRWYWwgPT0gbnVsbCkge1xuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGVyY2VudDtcbiAgICAgICAgaWYgKCFudW1iZXIkMShmaWVsZFZhbCkpIHtcbiAgICAgICAgICAvLyB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgd2FybignRG8gbm90IHVzZSBjb250aW51b3VzIG1hcHBlcnMgd2l0aG91dCBzcGVjaWZ5aW5nIG51bWVyaWMgZGF0YSAoaS5lLiBgJyArIHByb3AuZmllbGQgKyAnOiAnICsgZmllbGRWYWwgKyAnYCBmb3IgYCcgKyBlbGUuaWQoKSArICdgIGlzIG5vbi1udW1lcmljKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgZmllbGRXaWR0aCA9IHByb3AuZmllbGRNYXggLSBwcm9wLmZpZWxkTWluO1xuICAgICAgICAgIGlmIChmaWVsZFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBzYWZldHkgY2hlY2sgLS0gbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBhcyBubyBwcm9wcyBvZiB6ZXJvIHJhbmdlIHNob3VsZCBiZSBwYXNzZWQgaGVyZVxuICAgICAgICAgICAgcGVyY2VudCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmNlbnQgPSAoZmllbGRWYWwgLSBwcm9wLmZpZWxkTWluKSAvIGZpZWxkV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGJvdW5kIHBlcmNlbnQgdmFsdWVcbiAgICAgICAgaWYgKHBlcmNlbnQgPCAwKSB7XG4gICAgICAgICAgcGVyY2VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDEpIHtcbiAgICAgICAgICBwZXJjZW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZS5jb2xvcikge1xuICAgICAgICAgIHZhciByMSA9IHByb3AudmFsdWVNaW5bMF07XG4gICAgICAgICAgdmFyIHIyID0gcHJvcC52YWx1ZU1heFswXTtcbiAgICAgICAgICB2YXIgZzEgPSBwcm9wLnZhbHVlTWluWzFdO1xuICAgICAgICAgIHZhciBnMiA9IHByb3AudmFsdWVNYXhbMV07XG4gICAgICAgICAgdmFyIGIxID0gcHJvcC52YWx1ZU1pblsyXTtcbiAgICAgICAgICB2YXIgYjIgPSBwcm9wLnZhbHVlTWF4WzJdO1xuICAgICAgICAgIHZhciBhMSA9IHByb3AudmFsdWVNaW5bM10gPT0gbnVsbCA/IDEgOiBwcm9wLnZhbHVlTWluWzNdO1xuICAgICAgICAgIHZhciBhMiA9IHByb3AudmFsdWVNYXhbM10gPT0gbnVsbCA/IDEgOiBwcm9wLnZhbHVlTWF4WzNdO1xuICAgICAgICAgIHZhciBjbHIgPSBbTWF0aC5yb3VuZChyMSArIChyMiAtIHIxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGcxICsgKGcyIC0gZzEpICogcGVyY2VudCksIE1hdGgucm91bmQoYjEgKyAoYjIgLSBiMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChhMSArIChhMiAtIGExKSAqIHBlcmNlbnQpXTtcbiAgICAgICAgICBmbGF0UHJvcCA9IHtcbiAgICAgICAgICAgIC8vIGNvbG91cnMgYXJlIHNpbXBsZSwgc28ganVzdCBjcmVhdGUgdGhlIGZsYXQgcHJvcGVydHkgaW5zdGVhZCBvZiBleHBlbnNpdmUgc3RyaW5nIHBhcnNpbmdcbiAgICAgICAgICAgIGJ5cGFzczogcHJvcC5ieXBhc3MsXG4gICAgICAgICAgICAvLyB3ZSdyZSBhIGJ5cGFzcyBpZiB0aGUgbWFwcGluZyBwcm9wZXJ0eSBpcyBhIGJ5cGFzc1xuICAgICAgICAgICAgbmFtZTogcHJvcC5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IGNscixcbiAgICAgICAgICAgIHN0clZhbHVlOiAncmdiKCcgKyBjbHJbMF0gKyAnLCAnICsgY2xyWzFdICsgJywgJyArIGNsclsyXSArICcpJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZS5udW1iZXIpIHtcbiAgICAgICAgICB2YXIgY2FsY1ZhbHVlID0gcHJvcC52YWx1ZU1pbiArIChwcm9wLnZhbHVlTWF4IC0gcHJvcC52YWx1ZU1pbikgKiBwZXJjZW50O1xuICAgICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIGNhbGNWYWx1ZSwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjYW4gb25seSBtYXAgdG8gY29sb3VycyBhbmQgbnVtYmVyc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IHRoZSBwcm9wZXJ0eSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBkaXJlY3QgbWFwcGluZ1xuICAgIGNhc2UgdHlwZXMuZGF0YTpcbiAgICAgIHtcbiAgICAgICAgLy8gZmxhdHRlbiB0aGUgZmllbGQgKGUuZy4gZGF0YS5mb28uYmFyKVxuICAgICAgICB2YXIgX2ZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIF9maWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IF9maWVsZHMubGVuZ3RoICYmIF9maWVsZFZhbDsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkID0gX2ZpZWxkc1tfaTNdO1xuICAgICAgICAgIF9maWVsZFZhbCA9IF9maWVsZFZhbFtfZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfZmllbGRWYWwgIT0gbnVsbCkge1xuICAgICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIF9maWVsZFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHR5cGVzLmZuOlxuICAgICAge1xuICAgICAgICB2YXIgZm4gPSBwcm9wLnZhbHVlO1xuICAgICAgICB2YXIgZm5SZXRWYWwgPSBwcm9wLmZuVmFsdWUgIT0gbnVsbCA/IHByb3AuZm5WYWx1ZSA6IGZuKGVsZSk7IC8vIGNoZWNrIGZvciBjYWNoZWQgdmFsdWUgYmVmb3JlIGNhbGxpbmcgZnVuY3Rpb25cblxuICAgICAgICBwcm9wLnByZXZGblZhbHVlID0gZm5SZXRWYWw7XG4gICAgICAgIGlmIChmblJldFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgd2FybignQ3VzdG9tIGZ1bmN0aW9uIG1hcHBlcnMgbWF5IG5vdCByZXR1cm4gbnVsbCAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIG51bGwpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIGZuUmV0VmFsLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIGludmFsaWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdHlwZSAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIGludmFsaWQpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBjb3B5KHByb3ApOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGp1c3Qgc2V0IHRoZSBwcm9wZXJ0eVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBub3QgYSB2YWxpZCBtYXBwaW5nXG4gIH1cblxuICAvLyBpZiB0aGUgcHJvcGVydHkgaXMgYSBieXBhc3MgcHJvcGVydHksIHRoZW4gbGluayB0aGUgcmVzdWx0YW50IHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCBvbmVcbiAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHRoaXMgYnlwYXNzIG92ZXJyaWRlcyB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3AuYnlwYXNzZWQ7IC8vIHN0ZWFsIGJ5cGFzc2VkIHByb3AgZnJvbSBvbGQgYnlwYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gbGluayB0aGUgb3JpZyBwcm9wIHRvIHRoZSBuZXcgYnlwYXNzXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3A7XG4gICAgfVxuICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wOyAvLyBhbmQgc2V0XG4gIH0gZWxzZSB7XG4gICAgLy8gcHJvcCBpcyBub3QgYnlwYXNzXG4gICAgaWYgKG9yaWdQcm9wSXNCeXBhc3MpIHtcbiAgICAgIC8vIHRoZW4ga2VlcCB0aGUgb3JpZyBwcm9wIChzaW5jZSBpdCdzIGEgYnlwYXNzKSBhbmQgbGluayB0byB0aGUgbmV3IHByb3BcbiAgICAgIG9yaWdQcm9wLmJ5cGFzc2VkID0gcHJvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBqdXN0IHJlcGxhY2UgdGhlIG9sZCBwcm9wIHdpdGggdGhlIG5ldyBvbmVcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBjaGVja1RyaWdnZXJzKCk7XG4gIHJldHVybiB0cnVlO1xufTtcbnN0eWZuJDguY2xlYW5FbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzLCBrZWVwQnlwYXNzZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdGhpcy5jbGVhclN0eWxlSGludHMoZWxlKTtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIGlmICgha2VlcEJ5cGFzc2VzKSB7XG4gICAgICBlbGUuX3ByaXZhdGUuc3R5bGUgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICAgICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BOYW1lc1tqXTtcbiAgICAgICAgdmFyIGVsZVByb3AgPSBzdHlsZVtwcm9wTmFtZV07XG4gICAgICAgIGlmIChlbGVQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgICAgIGVsZVByb3AuYnlwYXNzZWQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZVtwcm9wTmFtZV0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gdXBkYXRlcyB0aGUgdmlzdWFsIHN0eWxlIGZvciBhbGwgZWxlbWVudHMgKHVzZWZ1bCBmb3IgbWFudWFsIHN0eWxlIG1vZGlmaWNhdGlvbiBhZnRlciBpbml0KVxuc3R5Zm4kOC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIGVsZXMudXBkYXRlU3R5bGUoKTtcbn07XG5cbi8vIGRpZmZQcm9wcyA6IHsgbmFtZSA9PiB7IHByZXYsIG5leHQgfSB9XG5zdHlmbiQ4LnVwZGF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gKGVsZSwgZGlmZlByb3BzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcHJvcHMgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXByb3BlcnR5JykudmFsdWU7XG4gIHZhciBkdXJhdGlvbiA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tZHVyYXRpb24nKS5wZlZhbHVlO1xuICB2YXIgZGVsYXkgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWRlbGF5JykucGZWYWx1ZTtcbiAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgZHVyYXRpb24gPiAwKSB7XG4gICAgdmFyIHN0eWxlID0ge307XG5cbiAgICAvLyBidWlsZCB1cCB0aGUgc3R5bGUgdG8gYW5pbWF0ZSB0b3dhcmRzXG4gICAgdmFyIGFueVByZXYgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgdmFyIHN0eVByb3AgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3BdO1xuICAgICAgaWYgKCFkaWZmUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2UHJvcCA9IGRpZmZQcm9wLnByZXY7XG4gICAgICB2YXIgZnJvbVByb3AgPSBwcmV2UHJvcDtcbiAgICAgIHZhciB0b1Byb3AgPSBkaWZmUHJvcC5uZXh0ICE9IG51bGwgPyBkaWZmUHJvcC5uZXh0IDogc3R5UHJvcDtcbiAgICAgIHZhciBkaWZmID0gZmFsc2U7XG4gICAgICB2YXIgaW5pdFZhbCA9IHZvaWQgMDtcbiAgICAgIHZhciBpbml0RHQgPSAwLjAwMDAwMTsgLy8gZGVsdGEgdGltZSAlIHZhbHVlIGZvciBpbml0VmFsIChhbGxvd3MgYW5pbWF0aW5nIG91dCBvZiBpbml0IHplcm8gb3BhY2l0eSlcblxuICAgICAgaWYgKCFmcm9tUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc2lkZXIgcHggdmFsdWVzXG4gICAgICBpZiAobnVtYmVyJDEoZnJvbVByb3AucGZWYWx1ZSkgJiYgbnVtYmVyJDEodG9Qcm9wLnBmVmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AucGZWYWx1ZSAtIGZyb21Qcm9wLnBmVmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5wZlZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBudW1lcmljYWwgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKG51bWJlciQxKGZyb21Qcm9wLnZhbHVlKSAmJiBudW1iZXIkMSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AudmFsdWUgLSBmcm9tUHJvcC52YWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBjb2xvdXIgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKGFycmF5KGZyb21Qcm9wLnZhbHVlKSAmJiBhcnJheSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSBmcm9tUHJvcC52YWx1ZVswXSAhPT0gdG9Qcm9wLnZhbHVlWzBdIHx8IGZyb21Qcm9wLnZhbHVlWzFdICE9PSB0b1Byb3AudmFsdWVbMV0gfHwgZnJvbVByb3AudmFsdWVbMl0gIT09IHRvUHJvcC52YWx1ZVsyXTtcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnN0clZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgdmFsdWUgaXMgZ29vZCBmb3IgYW4gYW5pbWF0aW9uIG9ubHkgaWYgaXQncyBkaWZmZXJlbnRcbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHN0eWxlW3Byb3BdID0gdG9Qcm9wLnN0clZhbHVlOyAvLyB0byB2YWxcbiAgICAgICAgdGhpcy5hcHBseUJ5cGFzcyhlbGUsIHByb3AsIGluaXRWYWwpOyAvLyBmcm9tIHZhbFxuICAgICAgICBhbnlQcmV2ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBpZiBwcm9wcyBhbGxvdyBhbmlcblxuICAgIC8vIGNhbid0IHRyYW5zaXRpb24gaWYgdGhlcmUncyBub3RoaW5nIHByZXZpb3VzIHRvIHRyYW5zaXRpb24gZnJvbVxuICAgIGlmICghYW55UHJldikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfcC50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIGVsZS5kZWxheUFuaW1hdGlvbihkZWxheSkucGxheSgpLnByb21pc2UoKS50aGVuKHJlc29sdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGVsZS5hbmltYXRpb24oe1xuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZWFzaW5nOiBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicpLnZhbHVlLFxuICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgIH0pLnBsYXkoKS5wcm9taXNlKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBpZiggIWlzQnlwYXNzICl7XG4gICAgICBzZWxmLnJlbW92ZUJ5cGFzc2VzKGVsZSwgcHJvcHMpO1xuICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgICAvLyB9XG5cbiAgICAgIF9wLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChfcC50cmFuc2l0aW9uaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTtcbiAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZ2V0VHJpZ2dlciwgb25UcmlnZ2VyKSB7XG4gIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgdHJpZ2dlckNoZWNrID0gZ2V0VHJpZ2dlcihwcm9wKTtcbiAgaWYgKHRyaWdnZXJDaGVjayAhPSBudWxsICYmIHRyaWdnZXJDaGVjayhmcm9tVmFsdWUsIHRvVmFsdWUpKSB7XG4gICAgb25UcmlnZ2VyKHByb3ApO1xuICB9XG59O1xuc3R5Zm4kOC5jaGVja1pPcmRlclRyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNaT3JkZXI7XG4gIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5fcHJpdmF0ZS5jeS5ub3RpZnkoJ3pvcmRlcicsIGVsZSk7XG4gIH0pO1xufTtcbnN0eWZuJDguY2hlY2tCb3VuZHNUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzQm91bmRzO1xuICB9LCBmdW5jdGlvbiAocHJvcCkge1xuICAgIGVsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBlbGUuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG5cbiAgICAvLyBpZiB0aGUgcHJvcCBjaGFuZ2UgbWFrZXMgdGhlIGJiIG9mIHBsbCBiZXppZXIgZWRnZXMgaW52YWxpZCxcbiAgICAvLyB0aGVuIGRpcnR5IHRoZSBwbGwgZWRnZSBiYiBjYWNoZSBhcyB3ZWxsXG4gICAgaWYgKFxuICAgIC8vIG9ubHkgZm9yIGJlemllcnMgLS0gc28gcGVyZm9ybWFuY2Ugb2Ygb3RoZXIgZWRnZXMgaXNuJ3QgYWZmZWN0ZWRcbiAgICBwcm9wLnRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEJlemllcnMgJiYgbmFtZSA9PT0gJ2N1cnZlLXN0eWxlJyAmJiAoZnJvbVZhbHVlID09PSAnYmV6aWVyJyB8fCB0b1ZhbHVlID09PSAnYmV6aWVyJykpIHtcbiAgICAgIGVsZS5wYXJhbGxlbEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAocGxsRWRnZSkge1xuICAgICAgICBpZiAocGxsRWRnZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgICAgIHBsbEVkZ2UuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocHJvcC50cmlnZ2Vyc0JvdW5kc09mQ29ubmVjdGVkRWRnZXMgJiYgbmFtZSA9PT0gJ2Rpc3BsYXknICYmIChmcm9tVmFsdWUgPT09ICdub25lJyB8fCB0b1ZhbHVlID09PSAnbm9uZScpKSB7XG4gICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIGVkZ2UuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnN0eWZuJDguY2hlY2tUcmlnZ2VycyA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICBlbGUuZGlydHlTdHlsZUNhY2hlKCk7XG4gIHRoaXMuY2hlY2taT3JkZXJUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKTtcbiAgdGhpcy5jaGVja0JvdW5kc1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xufTtcblxudmFyIHN0eWZuJDcgPSB7fTtcblxuLy8gYnlwYXNzZXMgYXJlIGFwcGxpZWQgdG8gYW4gZXhpc3Rpbmcgc3R5bGUgb24gYW4gZWxlbWVudCwgYW5kIGp1c3QgdGFja2VkIG9uIHRlbXBvcmFyaWx5XG4vLyByZXR1cm5zIHRydWUgaWZmIGFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBhdCBsZWFzdCAxIHNwZWNpZmllZCBwcm9wZXJ0eVxuc3R5Zm4kNy5hcHBseUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSwgdXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcHMgPSBbXTtcbiAgdmFyIGlzQnlwYXNzID0gdHJ1ZTtcblxuICAvLyBwdXQgYWxsIHRoZSBwcm9wZXJ0aWVzIChjYW4gc3BlY2lmeSBvbmUgb3IgbWFueSkgaW4gYW4gYXJyYXkgYWZ0ZXIgcGFyc2luZyB0aGVtXG4gIGlmIChuYW1lID09PSAnKicgfHwgbmFtZSA9PT0gJyoqJykge1xuICAgIC8vIGFwcGx5IHRvIGFsbCBwcm9wZXJ0eSBuYW1lc1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShfbmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgICBpZiAocGFyc2VkUHJvcCkge1xuICAgICAgICAgIHByb3BzLnB1c2gocGFyc2VkUHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSB0aGUgc2luZ2xlIHByb3BlcnR5XG4gICAgdmFyIF9wYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgaWYgKF9wYXJzZWRQcm9wKSB7XG4gICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAvLyB0aGVuIHBhcnNlIGVhY2ggcHJvcGVydHlcbiAgICB2YXIgc3BlY2lmaWVkUHJvcHMgPSBuYW1lO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25zID0gdmFsdWU7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3BlY2lmaWVkUHJvcHMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuYW1lcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbmFtZTIgPSBuYW1lc1tfaV07XG4gICAgICB2YXIgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbX25hbWUyXTtcbiAgICAgIGlmIChfdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0cnkgY2FtZWwgY2FzZSBuYW1lIHRvb1xuICAgICAgICBfdmFsdWUgPSBzcGVjaWZpZWRQcm9wc1tkYXNoMmNhbWVsKF9uYW1lMildO1xuICAgICAgfVxuICAgICAgaWYgKF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcGFyc2VkUHJvcDIgPSB0aGlzLnBhcnNlKF9uYW1lMiwgX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKF9wYXJzZWRQcm9wMikge1xuICAgICAgICAgIHByb3BzLnB1c2goX3BhcnNlZFByb3AyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjYW4ndCBkbyBhbnl0aGluZyB3aXRob3V0IHdlbGwgZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2UndmUgZmFpbGVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBwcm9wZXJ0aWVzXG4gIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBub3csIGFwcGx5IHRoZSBieXBhc3MgcHJvcGVydGllcyBvbiB0aGUgZWxlbWVudHNcbiAgdmFyIHJldCA9IGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc3VjY2VzZnVsIGJ5cGFzcyBhcHBsaWVkXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIC8vIGZvciBlYWNoIGVsZVxuICAgIHZhciBlbGUgPSBlbGVzW19pMl07XG4gICAgdmFyIGRpZmZQcm9wcyA9IHt9O1xuICAgIHZhciBkaWZmUHJvcCA9IHZvaWQgMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAvLyBmb3IgZWFjaCBwcm9wXG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tqXTtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKF9wcm9wLm5hbWUpO1xuICAgICAgICBkaWZmUHJvcCA9IGRpZmZQcm9wc1tfcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0ID0gdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgY29weShfcHJvcCkpIHx8IHJldDtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgaWYgKHJldCkge1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgdGhpcy51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGRpZmZQcm9wcywgaXNCeXBhc3MpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlc1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBvbmx5IHVzZWZ1bCBpbiBzcGVjaWZpYyBjYXNlcyBsaWtlIGFuaW1hdGlvblxuc3R5Zm4kNy5vdmVycmlkZUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gY2FtZWwyZGFzaChuYW1lKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHByb3AgPSBlbGUuX3ByaXZhdGUuc3R5bGVbbmFtZV07XG4gICAgdmFyIHR5cGUgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV0udHlwZTtcbiAgICB2YXIgaXNDb2xvciA9IHR5cGUuY29sb3I7XG4gICAgdmFyIGlzTXVsdGkgPSB0eXBlLm11dGlwbGU7XG4gICAgdmFyIG9sZFZhbHVlID0gIXByb3AgPyBudWxsIDogcHJvcC5wZlZhbHVlICE9IG51bGwgPyBwcm9wLnBmVmFsdWUgOiBwcm9wLnZhbHVlO1xuICAgIGlmICghcHJvcCB8fCAhcHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIG5lZWQgYSBieXBhc3MgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBwcm9wLnBmVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAncmdiKCcgKyB2YWx1ZS5qb2luKCcsJykgKyAnKSc7XG4gICAgICB9IGVsc2UgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgcHJvcC5zdHJWYWx1ZSA9IHZhbHVlLmpvaW4oJyAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tUcmlnZ2VycyhlbGUsIG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSk7XG4gIH1cbn07XG5zdHlmbiQ3LnJlbW92ZUFsbEJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUJ5cGFzc2VzKGVsZXMsIHRoaXMucHJvcGVydHlOYW1lcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xufTtcbnN0eWZuJDcucmVtb3ZlQnlwYXNzZXMgPSBmdW5jdGlvbiAoZWxlcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2pdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3BzW2ldO1xuICAgICAgdmFyIHByb3AgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgICBpZiAoIXByZXZQcm9wIHx8ICFwcmV2UHJvcC5ieXBhc3MpIHtcbiAgICAgICAgLy8gaWYgYSBieXBhc3MgZG9lc24ndCBleGlzdCBmb3IgdGhlIHByb3AsIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9ICcnOyAvLyBlbXB0eSA9PiByZW1vdmUgYnlwYXNzXG4gICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3AubmFtZV0gPSB7XG4gICAgICAgIHByZXY6IHByZXZQcm9wXG4gICAgICB9O1xuICAgICAgdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgcGFyc2VkUHJvcCk7XG4gICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgIH0gLy8gZm9yIHByb3BzXG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcbn07XG5cbnZhciBzdHlmbiQ2ID0ge307XG5cbi8vIGdldHMgd2hhdCBhbiBlbSBzaXplIGNvcnJlc3BvbmRzIHRvIGluIHBpeGVscyByZWxhdGl2ZSB0byBhIGRvbSBlbGVtZW50XG5zdHlmbiQ2LmdldEVtU2l6ZUluUGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHggPSB0aGlzLmNvbnRhaW5lckNzcygnZm9udC1zaXplJyk7XG4gIGlmIChweCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocHgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxOyAvLyBmb3IgaGVhZGxlc3NcbiAgfVxufTtcblxuLy8gZ2V0cyBjc3MgcHJvcGVydHkgZnJvbSB0aGUgY29yZSBjb250YWluZXJcbnN0eWZuJDYuY29udGFpbmVyQ3NzID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBkb21FbGVtZW50ID0gY3kuY29udGFpbmVyKCk7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSBjeS53aW5kb3coKTtcbiAgaWYgKGNvbnRhaW5lcldpbmRvdyAmJiBkb21FbGVtZW50ICYmIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpO1xuICB9XG59O1xuXG52YXIgc3R5Zm4kNSA9IHt9O1xuXG4vLyBnZXRzIHRoZSByZW5kZXJlZCBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSZW5kZXJlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcCkge1xuICBpZiAocHJvcCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmdldFJhd1N0eWxlKGVsZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbi8vIGdldHMgdGhlIHJhdyBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSYXdTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHJzdHlsZSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzZWxmLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AubmFtZSwgaXNSZW5kZXJlZFZhbCk7XG4gICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgcnN0eWxlW3Byb3AubmFtZV0gPSB2YWw7XG4gICAgICAgIHJzdHlsZVtkYXNoMmNhbWVsKHByb3AubmFtZSldID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnN0eWxlO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRJbmRleGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBwcm9wZXJ0eSwgc3VicHJvcGVydHksIGluZGV4KSB7XG4gIHZhciBwc3R5bGUgPSBlbGUucHN0eWxlKHByb3BlcnR5KVtzdWJwcm9wZXJ0eV1baW5kZXhdO1xuICByZXR1cm4gcHN0eWxlICE9IG51bGwgPyBwc3R5bGUgOiBlbGUuY3koKS5zdHlsZSgpLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSlbc3VicHJvcGVydHldWzBdO1xufTtcbnN0eWZuJDUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24gKGVsZSwgcHJvcE5hbWUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgIGlmIChwcm9wLmFsaWFzKSB7XG4gICAgICBwcm9wID0gcHJvcC5wb2ludHNUbztcbiAgICB9XG4gICAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gICAgdmFyIHN0eWxlUHJvcCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdHlsZVByb3AudmFsdWUsXG4gICAgICAgIHVuaXRzID0gc3R5bGVQcm9wLnVuaXRzLFxuICAgICAgICBzdHJWYWx1ZSA9IHN0eWxlUHJvcC5zdHJWYWx1ZTtcbiAgICAgIGlmIChpc1JlbmRlcmVkVmFsICYmIHR5cGUubnVtYmVyICYmIHZhbHVlICE9IG51bGwgJiYgbnVtYmVyJDEodmFsdWUpKSB7XG4gICAgICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgICAgICB2YXIgZ2V0UmVuZGVyZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFJlbmRlcmVkVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAqIHpvb207XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyA9IGZ1bmN0aW9uIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbCwgdW5pdHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZWRWYWx1ZSh2YWwpICsgdW5pdHM7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBpc0FycmF5VmFsdWUgPSBhcnJheSh2YWx1ZSk7XG4gICAgICAgIHZhciBoYXZlVW5pdHMgPSBpc0FycmF5VmFsdWUgPyB1bml0cy5ldmVyeShmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1ICE9IG51bGw7XG4gICAgICAgIH0pIDogdW5pdHMgIT0gbnVsbDtcbiAgICAgICAgaWYgKGhhdmVVbml0cykge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHYsIHVuaXRzW2ldKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbHVlLCB1bml0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2KSA/IHYgOiAnJyArIGdldFJlbmRlcmVkVmFsdWUodik7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJyArIGdldFJlbmRlcmVkVmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdHJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5zdHlmbiQ1LmdldEFuaW1hdGlvblN0YXJ0U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBhbmlQcm9wcykge1xuICB2YXIgcnN0eWxlID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYW5pUHJvcCA9IGFuaVByb3BzW2ldO1xuICAgIHZhciBuYW1lID0gYW5pUHJvcC5uYW1lO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKG5hbWUpO1xuICAgIGlmIChzdHlsZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhlbiBtYWtlIGEgcHJvcCBvZiBpdFxuICAgICAgaWYgKHBsYWluT2JqZWN0KHN0eWxlUHJvcCkpIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3Auc3RyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICByc3R5bGVbbmFtZV0gPSBzdHlsZVByb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXRQcm9wc0xpc3QgPSBmdW5jdGlvbiAocHJvcHNPYmopIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnN0eWxlID0gW107XG4gIHZhciBzdHlsZSA9IHByb3BzT2JqO1xuICB2YXIgcHJvcHMgPSBzZWxmLnByb3BlcnRpZXM7XG4gIGlmIChzdHlsZSkge1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHN0eWxlW25hbWVdO1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tuYW1lXSB8fCBwcm9wc1tjYW1lbDJkYXNoKG5hbWUpXTtcbiAgICAgIHZhciBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgdmFsKTtcbiAgICAgIGlmIChzdHlsZVByb3ApIHtcbiAgICAgICAgcnN0eWxlLnB1c2goc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJzdHlsZTtcbn07XG5zdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaCA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lcywgc2VlZCkge1xuICB2YXIgaGFzaCA9IHNlZWQuc2xpY2UoKTtcbiAgdmFyIG5hbWUsIHZhbCwgc3RyVmFsLCBjaFZhbDtcbiAgdmFyIGksIGo7XG4gIGZvciAoaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBuYW1lID0gcHJvcE5hbWVzW2ldO1xuICAgIHZhbCA9IGVsZS5wc3R5bGUobmFtZSwgZmFsc2UpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh2YWwucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBoYXNoWzBdID0gaGFzaEludChjaFZhbCwgaGFzaFswXSk7XG4gICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0clZhbCA9IHZhbC5zdHJWYWx1ZTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJWYWwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hWYWwgPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcbnN0eWZuJDUuZ2V0UHJvcGVydGllc0hhc2ggPSBzdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaDtcblxudmFyIHN0eWZuJDQgPSB7fTtcbnN0eWZuJDQuYXBwZW5kRnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IGpzb25baV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnN0eWxlIHx8IGNvbnRleHQuY3NzO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2pdO1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBzdHlsZS5jc3MobmFtZSwgdmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn07XG5cbi8vIGFjY2Vzc2libGUgY3kuc3R5bGUoKSBmdW5jdGlvblxuc3R5Zm4kNC5mcm9tSnNvbiA9IGZ1bmN0aW9uIChqc29uKSB7XG4gIHZhciBzdHlsZSA9IHRoaXM7XG4gIHN0eWxlLnJlc2V0VG9EZWZhdWx0KCk7XG4gIHN0eWxlLmFwcGVuZEZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBnZXQganNvbiBmcm9tIGN5LnN0eWxlKCkgYXBpXG5zdHlmbiQ0Lmpzb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqc29uID0gW107XG4gIGZvciAodmFyIGkgPSB0aGlzLmRlZmF1bHRMZW5ndGg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHRoaXNbaV07XG4gICAgdmFyIHNlbGVjdG9yID0gY3h0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzO1xuICAgIHZhciBjc3MgPSB7fTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgY3NzW3Byb3AubmFtZV0gPSBwcm9wLnN0clZhbHVlO1xuICAgIH1cbiAgICBqc29uLnB1c2goe1xuICAgICAgc2VsZWN0b3I6ICFzZWxlY3RvciA/ICdjb3JlJyA6IHNlbGVjdG9yLnRvU3RyaW5nKCksXG4gICAgICBzdHlsZTogY3NzXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59O1xuXG52YXIgc3R5Zm4kMyA9IHt9O1xuc3R5Zm4kMy5hcHBlbmRGcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdHlsZSA9IHRoaXM7XG4gIHZhciByZW1haW5pbmcgPSAnJyArIHN0cmluZztcbiAgdmFyIHNlbEFuZEJsb2NrU3RyO1xuICB2YXIgYmxvY2tSZW07XG4gIHZhciBwcm9wQW5kVmFsU3RyO1xuXG4gIC8vIHJlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBzdHlsZSBzdHJpbmdcbiAgcmVtYWluaW5nID0gcmVtYWluaW5nLnJlcGxhY2UoL1svXVsqXShcXHN8LikrP1sqXVsvXS9nLCAnJyk7XG4gIGZ1bmN0aW9uIHJlbW92ZVNlbEFuZEJsb2NrRnJvbVJlbWFpbmluZygpIHtcbiAgICAvLyByZW1vdmUgdGhlIHBhcnNlZCBzZWxlY3RvciBhbmQgYmxvY2sgZnJvbSB0aGUgcmVtYWluaW5nIHRleHQgdG8gcGFyc2VcbiAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA+IHNlbEFuZEJsb2NrU3RyLmxlbmd0aCkge1xuICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nLnN1YnN0cihzZWxBbmRCbG9ja1N0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1haW5pbmcgPSAnJztcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlUHJvcEFuZFZhbEZyb21SZW0oKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgcHJvcGVydHkgYW5kIHZhbHVlIGZyb20gdGhlIHJlbWFpbmluZyBibG9jayB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKGJsb2NrUmVtLmxlbmd0aCA+IHByb3BBbmRWYWxTdHIubGVuZ3RoKSB7XG4gICAgICBibG9ja1JlbSA9IGJsb2NrUmVtLnN1YnN0cihwcm9wQW5kVmFsU3RyLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJsb2NrUmVtID0gJyc7XG4gICAgfVxuICB9XG4gIGZvciAoOzspIHtcbiAgICB2YXIgbm90aGluZ0xlZnRUb1BhcnNlID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKiQvKTtcbiAgICBpZiAobm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlbEFuZEJsb2NrID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKigoPzoufFxccykrPylcXHMqXFx7KCg/Oi58XFxzKSs/KVxcfS8pO1xuICAgIGlmICghc2VsQW5kQmxvY2spIHtcbiAgICAgIHdhcm4oJ0hhbHRpbmcgc3R5bGVzaGVldCBwYXJzaW5nOiBTdHJpbmcgc3R5bGVzaGVldCBjb250YWlucyBtb3JlIHRvIHBhcnNlIGJ1dCBubyBzZWxlY3RvciBhbmQgYmxvY2sgZm91bmQgaW46ICcgKyByZW1haW5pbmcpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHNlbEFuZEJsb2NrU3RyID0gc2VsQW5kQmxvY2tbMF07XG5cbiAgICAvLyBwYXJzZSB0aGUgc2VsZWN0b3JcbiAgICB2YXIgc2VsZWN0b3JTdHIgPSBzZWxBbmRCbG9ja1sxXTtcbiAgICBpZiAoc2VsZWN0b3JTdHIgIT09ICdjb3JlJykge1xuICAgICAgdmFyIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICAgIGlmIChzZWxlY3Rvci5pbnZhbGlkKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHBhcnNpbmcgb2YgYmxvY2s6IEludmFsaWQgc2VsZWN0b3IgZm91bmQgaW4gc3RyaW5nIHN0eWxlc2hlZXQ6ICcgKyBzZWxlY3RvclN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHNlbGVjdG9yIGFuZCBibG9ja1xuICAgICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcGFyc2UgdGhlIGJsb2NrIG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlc1xuICAgIHZhciBibG9ja1N0ciA9IHNlbEFuZEJsb2NrWzJdO1xuICAgIHZhciBpbnZhbGlkQmxvY2sgPSBmYWxzZTtcbiAgICBibG9ja1JlbSA9IGJsb2NrU3RyO1xuICAgIHZhciBwcm9wcyA9IFtdO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHZhciBfbm90aGluZ0xlZnRUb1BhcnNlID0gYmxvY2tSZW0ubWF0Y2goL15cXHMqJC8pO1xuICAgICAgaWYgKF9ub3RoaW5nTGVmdFRvUGFyc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcEFuZFZhbCA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiguKz8pXFxzKjpcXHMqKC4rPykoPzpcXHMqO3xcXHMqJCkvKTtcbiAgICAgIGlmICghcHJvcEFuZFZhbCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIGZvcm1hdHRpbmcgb2Ygc3R5bGUgcHJvcGVydHkgYW5kIHZhbHVlIGRlZmluaXRpb25zIGZvdW5kIGluOicgKyBibG9ja1N0cik7XG4gICAgICAgIGludmFsaWRCbG9jayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcHJvcEFuZFZhbFN0ciA9IHByb3BBbmRWYWxbMF07XG4gICAgICB2YXIgcHJvcFN0ciA9IHByb3BBbmRWYWxbMV07XG4gICAgICB2YXIgdmFsU3RyID0gcHJvcEFuZFZhbFsyXTtcbiAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BTdHJdO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHByb3BlcnR5OiBJbnZhbGlkIHByb3BlcnR5IG5hbWUgaW46ICcgKyBwcm9wQW5kVmFsU3RyKTtcblxuICAgICAgICAvLyBza2lwIHRoaXMgcHJvcGVydHkgaW4gdGhlIGJsb2NrXG4gICAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHBhcnNlZFByb3AgPSBzdHlsZS5wYXJzZShwcm9wU3RyLCB2YWxTdHIpO1xuICAgICAgaWYgKCFwYXJzZWRQcm9wKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHByb3BlcnR5OiBJbnZhbGlkIHByb3BlcnR5IGRlZmluaXRpb24gaW46ICcgKyBwcm9wQW5kVmFsU3RyKTtcblxuICAgICAgICAvLyBza2lwIHRoaXMgcHJvcGVydHkgaW4gdGhlIGJsb2NrXG4gICAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgIG5hbWU6IHByb3BTdHIsXG4gICAgICAgIHZhbDogdmFsU3RyXG4gICAgICB9KTtcbiAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgfVxuICAgIGlmIChpbnZhbGlkQmxvY2spIHtcbiAgICAgIHJlbW92ZVNlbEFuZEJsb2NrRnJvbVJlbWFpbmluZygpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gcHV0IHRoZSBwYXJzZWQgYmxvY2sgaW4gdGhlIHN0eWxlXG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfcHJvcCA9IHByb3BzW2ldO1xuICAgICAgc3R5bGUuY3NzKF9wcm9wLm5hbWUsIF9wcm9wLnZhbCk7XG4gICAgfVxuICAgIHJlbW92ZVNlbEFuZEJsb2NrRnJvbVJlbWFpbmluZygpO1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn07XG5zdHlmbiQzLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBzdHlsZSA9IHRoaXM7XG4gIHN0eWxlLnJlc2V0VG9EZWZhdWx0KCk7XG4gIHN0eWxlLmFwcGVuZEZyb21TdHJpbmcoc3RyaW5nKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxudmFyIHN0eWZuJDIgPSB7fTtcbihmdW5jdGlvbiAoKSB7XG4gIHZhciBudW1iZXIkMSA9IG51bWJlcjtcbiAgdmFyIHJnYmEgPSByZ2JhTm9CYWNrUmVmcztcbiAgdmFyIGhzbGEgPSBoc2xhTm9CYWNrUmVmcztcbiAgdmFyIGhleDMkMSA9IGhleDM7XG4gIHZhciBoZXg2JDEgPSBoZXg2O1xuICB2YXIgZGF0YSA9IGZ1bmN0aW9uIGRhdGEocHJlZml4KSB7XG4gICAgcmV0dXJuICdeJyArIHByZWZpeCArICdcXFxccypcXFxcKFxcXFxzKihbXFxcXHdcXFxcLl0rKVxcXFxzKlxcXFwpJCc7XG4gIH07XG4gIHZhciBtYXBEYXRhID0gZnVuY3Rpb24gbWFwRGF0YShwcmVmaXgpIHtcbiAgICB2YXIgbWFwQXJnID0gbnVtYmVyJDEgKyAnfFxcXFx3K3wnICsgcmdiYSArICd8JyArIGhzbGEgKyAnfCcgKyBoZXgzJDEgKyAnfCcgKyBoZXg2JDE7XG4gICAgcmV0dXJuICdeJyArIHByZWZpeCArICdcXFxccypcXFxcKChbXFxcXHdcXFxcLl0rKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqXFxcXCxcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBtYXBBcmcgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBtYXBBcmcgKyAnKVxcXFwpJCc7XG4gIH07XG4gIHZhciB1cmxSZWdleGVzID0gWydedXJsXFxcXHMqXFxcXChcXFxccypbXFwnXCJdPyguKz8pW1xcJ1wiXT9cXFxccypcXFxcKSQnLCAnXihub25lKSQnLCAnXiguKykkJ107XG5cbiAgLy8gZWFjaCB2aXN1YWwgc3R5bGUgcHJvcGVydHkgaGFzIGEgdHlwZSBhbmQgbmVlZHMgdG8gYmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byBpdFxuICBzdHlmbiQyLnR5cGVzID0ge1xuICAgIHRpbWU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHVuaXRzOiAnc3xtcycsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnbXMnXG4gICAgfSxcbiAgICBwZXJjZW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJSdcbiAgICB9LFxuICAgIHBlcmNlbnRhZ2VzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJScsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgemVyb09uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBuT25lT25lTnVtYmVyOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIG5vbk5lZ2F0aXZlSW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIG5vbk5lZ2F0aXZlTnVtYmVyOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0bGVzczogdHJ1ZVxuICAgIH0sXG4gICAgcG9zaXRpb246IHtcbiAgICAgIGVudW1zOiBbJ3BhcmVudCcsICdvcmlnaW4nXVxuICAgIH0sXG4gICAgbm9kZVNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIGVudW1zOiBbJ2xhYmVsJ11cbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIG51bWJlcnM6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aXZlTnVtYmVyOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHN0cmljdE1pbjogdHJ1ZVxuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwXG4gICAgfSxcbiAgICBiaWRpcmVjdGlvbmFsU2l6ZToge1xuICAgICAgbnVtYmVyOiB0cnVlXG4gICAgfSxcbiAgICAvLyBhbGxvd3MgbmVnYXRpdmVcbiAgICBiaWRpcmVjdGlvbmFsU2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICAvLyBhbGxvd3MgbmVnYXRpdmVcbiAgICBiaWRpcmVjdGlvbmFsU2l6ZXM6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICAvLyBhbGxvd3MgbmVnYXRpdmVcbiAgICBzaXplTWF5YmVQZXJjZW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWVcbiAgICB9LFxuICAgIGF4aXNEaXJlY3Rpb246IHtcbiAgICAgIGVudW1zOiBbJ2hvcml6b250YWwnLCAnbGVmdHdhcmQnLCAncmlnaHR3YXJkJywgJ3ZlcnRpY2FsJywgJ3Vwd2FyZCcsICdkb3dud2FyZCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHBhZGRpbmdSZWxhdGl2ZVRvOiB7XG4gICAgICBlbnVtczogWyd3aWR0aCcsICdoZWlnaHQnLCAnYXZlcmFnZScsICdtaW4nLCAnbWF4J11cbiAgICB9LFxuICAgIGJnV0g6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIGVudW1zOiBbJ2F1dG8nXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1Bvczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnaW5uZXInLCAnaW5jbHVkZS1wYWRkaW5nJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdSZXBlYXQ6IHtcbiAgICAgIGVudW1zOiBbJ3JlcGVhdCcsICdyZXBlYXQteCcsICdyZXBlYXQteScsICduby1yZXBlYXQnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0ZpdDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICdjb250YWluJywgJ2NvdmVyJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDcm9zc09yaWdpbjoge1xuICAgICAgZW51bXM6IFsnYW5vbnltb3VzJywgJ3VzZS1jcmVkZW50aWFscycsICdudWxsJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDbGlwOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ25vZGUnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0NvbnRhaW5tZW50OiB7XG4gICAgICBlbnVtczogWydpbnNpZGUnLCAnb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yOiB7XG4gICAgICBjb2xvcjogdHJ1ZVxuICAgIH0sXG4gICAgY29sb3JzOiB7XG4gICAgICBjb2xvcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmaWxsOiB7XG4gICAgICBlbnVtczogWydzb2xpZCcsICdsaW5lYXItZ3JhZGllbnQnLCAncmFkaWFsLWdyYWRpZW50J11cbiAgICB9LFxuICAgIGJvb2w6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddXG4gICAgfSxcbiAgICBib29sczoge1xuICAgICAgZW51bXM6IFsneWVzJywgJ25vJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbGluZVN0eWxlOiB7XG4gICAgICBlbnVtczogWydzb2xpZCcsICdkb3R0ZWQnLCAnZGFzaGVkJ11cbiAgICB9LFxuICAgIGxpbmVDYXA6IHtcbiAgICAgIGVudW1zOiBbJ2J1dHQnLCAncm91bmQnLCAnc3F1YXJlJ11cbiAgICB9LFxuICAgIGxpbmVQb3NpdGlvbjoge1xuICAgICAgZW51bXM6IFsnY2VudGVyJywgJ2luc2lkZScsICdvdXRzaWRlJ11cbiAgICB9LFxuICAgIGxpbmVKb2luOiB7XG4gICAgICBlbnVtczogWydyb3VuZCcsICdiZXZlbCcsICdtaXRlciddXG4gICAgfSxcbiAgICBib3JkZXJTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCcsICdkb3VibGUnXVxuICAgIH0sXG4gICAgY3VydmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnYmV6aWVyJywgJ3VuYnVuZGxlZC1iZXppZXInLCAnaGF5c3RhY2snLCAnc2VnbWVudHMnLCAnc3RyYWlnaHQnLCAnc3RyYWlnaHQtdHJpYW5nbGUnLCAndGF4aScsICdyb3VuZC1zZWdtZW50cycsICdyb3VuZC10YXhpJ11cbiAgICB9LFxuICAgIHJhZGl1c1R5cGU6IHtcbiAgICAgIGVudW1zOiBbJ2FyYy1yYWRpdXMnLCAnaW5mbHVlbmNlLXJhZGl1cyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGZvbnRGYW1pbHk6IHtcbiAgICAgIHJlZ2V4OiAnXihbXFxcXHctIFxcXFxcIl0rKD86XFxcXHMqLFxcXFxzKltcXFxcdy0gXFxcXFwiXSspKikkJ1xuICAgIH0sXG4gICAgZm9udFN0eWxlOiB7XG4gICAgICBlbnVtczogWydpdGFsaWMnLCAnbm9ybWFsJywgJ29ibGlxdWUnXVxuICAgIH0sXG4gICAgZm9udFdlaWdodDoge1xuICAgICAgZW51bXM6IFsnbm9ybWFsJywgJ2JvbGQnLCAnYm9sZGVyJywgJ2xpZ2h0ZXInLCAnMTAwJywgJzIwMCcsICczMDAnLCAnNDAwJywgJzUwMCcsICc2MDAnLCAnODAwJywgJzkwMCcsIDEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwLCA2MDAsIDcwMCwgODAwLCA5MDBdXG4gICAgfSxcbiAgICB0ZXh0RGVjb3JhdGlvbjoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICd1bmRlcmxpbmUnLCAnb3ZlcmxpbmUnLCAnbGluZS10aHJvdWdoJ11cbiAgICB9LFxuICAgIHRleHRUcmFuc2Zvcm06IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndXBwZXJjYXNlJywgJ2xvd2VyY2FzZSddXG4gICAgfSxcbiAgICB0ZXh0V3JhcDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICd3cmFwJywgJ2VsbGlwc2lzJ11cbiAgICB9LFxuICAgIHRleHRPdmVyZmxvd1dyYXA6IHtcbiAgICAgIGVudW1zOiBbJ3doaXRlc3BhY2UnLCAnYW55d2hlcmUnXVxuICAgIH0sXG4gICAgdGV4dEJhY2tncm91bmRTaGFwZToge1xuICAgICAgZW51bXM6IFsncmVjdGFuZ2xlJywgJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZSddXG4gICAgfSxcbiAgICBub2RlU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnY3V0cmVjdGFuZ2xlJywgJ2N1dC1yZWN0YW5nbGUnLCAnYm90dG9tcm91bmRyZWN0YW5nbGUnLCAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsICdiYXJyZWwnLCAnZWxsaXBzZScsICd0cmlhbmdsZScsICdyb3VuZC10cmlhbmdsZScsICdzcXVhcmUnLCAncGVudGFnb24nLCAncm91bmQtcGVudGFnb24nLCAnaGV4YWdvbicsICdyb3VuZC1oZXhhZ29uJywgJ2NvbmNhdmVoZXhhZ29uJywgJ2NvbmNhdmUtaGV4YWdvbicsICdoZXB0YWdvbicsICdyb3VuZC1oZXB0YWdvbicsICdvY3RhZ29uJywgJ3JvdW5kLW9jdGFnb24nLCAndGFnJywgJ3JvdW5kLXRhZycsICdzdGFyJywgJ2RpYW1vbmQnLCAncm91bmQtZGlhbW9uZCcsICd2ZWUnLCAncmhvbWJvaWQnLCAncmlnaHQtcmhvbWJvaWQnLCAncG9seWdvbiddXG4gICAgfSxcbiAgICBvdmVybGF5U2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZScsICdlbGxpcHNlJ11cbiAgICB9LFxuICAgIGNvcm5lclJhZGl1czoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdHM6ICdweHxlbScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncHgnLFxuICAgICAgZW51bXM6IFsnYXV0byddXG4gICAgfSxcbiAgICBjb21wb3VuZEluY2x1ZGVMYWJlbHM6IHtcbiAgICAgIGVudW1zOiBbJ2luY2x1ZGUnLCAnZXhjbHVkZSddXG4gICAgfSxcbiAgICBhcnJvd1NoYXBlOiB7XG4gICAgICBlbnVtczogWyd0ZWUnLCAndHJpYW5nbGUnLCAndHJpYW5nbGUtdGVlJywgJ2NpcmNsZS10cmlhbmdsZScsICd0cmlhbmdsZS1jcm9zcycsICd0cmlhbmdsZS1iYWNrY3VydmUnLCAndmVlJywgJ3NxdWFyZScsICdjaXJjbGUnLCAnZGlhbW9uZCcsICdjaGV2cm9uJywgJ25vbmUnXVxuICAgIH0sXG4gICAgYXJyb3dGaWxsOiB7XG4gICAgICBlbnVtczogWydmaWxsZWQnLCAnaG9sbG93J11cbiAgICB9LFxuICAgIGFycm93V2lkdGg6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnJXxweHxlbScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncHgnLFxuICAgICAgZW51bXM6IFsnbWF0Y2gtbGluZSddXG4gICAgfSxcbiAgICBkaXNwbGF5OiB7XG4gICAgICBlbnVtczogWydlbGVtZW50JywgJ25vbmUnXVxuICAgIH0sXG4gICAgdmlzaWJpbGl0eToge1xuICAgICAgZW51bXM6IFsnaGlkZGVuJywgJ3Zpc2libGUnXVxuICAgIH0sXG4gICAgekNvbXBvdW5kRGVwdGg6IHtcbiAgICAgIGVudW1zOiBbJ2JvdHRvbScsICdvcnBoYW4nLCAnYXV0bycsICd0b3AnXVxuICAgIH0sXG4gICAgekluZGV4Q29tcGFyZToge1xuICAgICAgZW51bXM6IFsnYXV0bycsICdtYW51YWwnXVxuICAgIH0sXG4gICAgdmFsaWduOiB7XG4gICAgICBlbnVtczogWyd0b3AnLCAnY2VudGVyJywgJ2JvdHRvbSddXG4gICAgfSxcbiAgICBoYWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J11cbiAgICB9LFxuICAgIGp1c3RpZmljYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0JywgJ2F1dG8nXVxuICAgIH0sXG4gICAgdGV4dDoge1xuICAgICAgc3RyaW5nOiB0cnVlXG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ2RhdGEnKVxuICAgIH0sXG4gICAgbGF5b3V0RGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdsYXlvdXREYXRhJylcbiAgICB9LFxuICAgIHNjcmF0Y2g6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnc2NyYXRjaCcpXG4gICAgfSxcbiAgICBtYXBEYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcERhdGEnKVxuICAgIH0sXG4gICAgbWFwTGF5b3V0RGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBMYXlvdXREYXRhJylcbiAgICB9LFxuICAgIG1hcFNjcmF0Y2g6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwU2NyYXRjaCcpXG4gICAgfSxcbiAgICBmbjoge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIGZuOiB0cnVlXG4gICAgfSxcbiAgICB1cmw6IHtcbiAgICAgIHJlZ2V4ZXM6IHVybFJlZ2V4ZXMsXG4gICAgICBzaW5nbGVSZWdleE1hdGNoVmFsdWU6IHRydWVcbiAgICB9LFxuICAgIHVybHM6IHtcbiAgICAgIHJlZ2V4ZXM6IHVybFJlZ2V4ZXMsXG4gICAgICBzaW5nbGVSZWdleE1hdGNoVmFsdWU6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgcHJvcExpc3Q6IHtcbiAgICAgIHByb3BMaXN0OiB0cnVlXG4gICAgfSxcbiAgICBhbmdsZToge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdHM6ICdkZWd8cmFkJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdyYWQnXG4gICAgfSxcbiAgICB0ZXh0Um90YXRpb246IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJyxcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnYXV0b3JvdGF0ZSddXG4gICAgfSxcbiAgICBwb2x5Z29uUG9pbnRMaXN0OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIGV2ZW5NdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG1pbjogLTEsXG4gICAgICBtYXg6IDEsXG4gICAgICB1bml0bGVzczogdHJ1ZVxuICAgIH0sXG4gICAgZWRnZURpc3RhbmNlczoge1xuICAgICAgZW51bXM6IFsnaW50ZXJzZWN0aW9uJywgJ25vZGUtcG9zaXRpb24nLCAnZW5kcG9pbnRzJ11cbiAgICB9LFxuICAgIGVkZ2VFbmRwb2ludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICB1bml0czogJyV8cHh8ZW18ZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncHgnLFxuICAgICAgZW51bXM6IFsnaW5zaWRlLXRvLW5vZGUnLCAnb3V0c2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcsICdvdXRzaWRlLXRvLWxpbmUnLCAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJ10sXG4gICAgICBzaW5nbGVFbnVtOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFyciwgdW5pdHNBcnIpIHtcbiAgICAgICAgc3dpdGNoICh2YWxBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgLy8gY2FuIGJlICUgb3IgcHggb25seVxuICAgICAgICAgICAgcmV0dXJuIHVuaXRzQXJyWzBdICE9PSAnZGVnJyAmJiB1bml0c0FyclswXSAhPT0gJ3JhZCcgJiYgdW5pdHNBcnJbMV0gIT09ICdkZWcnICYmIHVuaXRzQXJyWzFdICE9PSAncmFkJztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAvLyBjYW4gYmUgZW51bSwgZGVnLCBvciByYWQgb25seVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2YWxBcnJbMF0pIHx8IHVuaXRzQXJyWzBdID09PSAnZGVnJyB8fCB1bml0c0FyclswXSA9PT0gJ3JhZCc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZWFzaW5nOiB7XG4gICAgICByZWdleGVzOiBbJ14oc3ByaW5nKVxcXFxzKlxcXFwoXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwpJCcsICdeKGN1YmljLWJlemllcilcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwpJCddLFxuICAgICAgZW51bXM6IFsnbGluZWFyJywgJ2Vhc2UnLCAnZWFzZS1pbicsICdlYXNlLW91dCcsICdlYXNlLWluLW91dCcsICdlYXNlLWluLXNpbmUnLCAnZWFzZS1vdXQtc2luZScsICdlYXNlLWluLW91dC1zaW5lJywgJ2Vhc2UtaW4tcXVhZCcsICdlYXNlLW91dC1xdWFkJywgJ2Vhc2UtaW4tb3V0LXF1YWQnLCAnZWFzZS1pbi1jdWJpYycsICdlYXNlLW91dC1jdWJpYycsICdlYXNlLWluLW91dC1jdWJpYycsICdlYXNlLWluLXF1YXJ0JywgJ2Vhc2Utb3V0LXF1YXJ0JywgJ2Vhc2UtaW4tb3V0LXF1YXJ0JywgJ2Vhc2UtaW4tcXVpbnQnLCAnZWFzZS1vdXQtcXVpbnQnLCAnZWFzZS1pbi1vdXQtcXVpbnQnLCAnZWFzZS1pbi1leHBvJywgJ2Vhc2Utb3V0LWV4cG8nLCAnZWFzZS1pbi1vdXQtZXhwbycsICdlYXNlLWluLWNpcmMnLCAnZWFzZS1vdXQtY2lyYycsICdlYXNlLWluLW91dC1jaXJjJ11cbiAgICB9LFxuICAgIGdyYWRpZW50RGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWyd0by1ib3R0b20nLCAndG8tdG9wJywgJ3RvLWxlZnQnLCAndG8tcmlnaHQnLCAndG8tYm90dG9tLXJpZ2h0JywgJ3RvLWJvdHRvbS1sZWZ0JywgJ3RvLXRvcC1yaWdodCcsICd0by10b3AtbGVmdCcsICd0by1yaWdodC1ib3R0b20nLCAndG8tbGVmdC1ib3R0b20nLCAndG8tcmlnaHQtdG9wJywgJ3RvLWxlZnQtdG9wJyAvLyBkaWZmZXJlbnQgb3JkZXJcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgYm91bmRzRXhwYW5zaW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHZhbEFyci5sZW5ndGg7XG4gICAgICAgIHJldHVybiBsZW5ndGggPT09IDEgfHwgbGVuZ3RoID09PSAyIHx8IGxlbmd0aCA9PT0gNDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkaWZmID0ge1xuICAgIHplcm9Ob25aZXJvOiBmdW5jdGlvbiB6ZXJvTm9uWmVybyh2YWwxLCB2YWwyKSB7XG4gICAgICBpZiAoKHZhbDEgPT0gbnVsbCB8fCB2YWwyID09IG51bGwpICYmIHZhbDEgIT09IHZhbDIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIG51bGwgY2FzZXMgY291bGQgcmVwcmVzZW50IGFueSB2YWx1ZVxuICAgICAgfVxuICAgICAgaWYgKHZhbDEgPT0gMCAmJiB2YWwyICE9IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbDEgIT0gMCAmJiB2YWwyID09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBhbnk6IGZ1bmN0aW9uIGFueSh2YWwxLCB2YWwyKSB7XG4gICAgICByZXR1cm4gdmFsMSAhPSB2YWwyO1xuICAgIH0sXG4gICAgZW1wdHlOb25FbXB0eTogZnVuY3Rpb24gZW1wdHlOb25FbXB0eShzdHIxLCBzdHIyKSB7XG4gICAgICB2YXIgZW1wdHkxID0gZW1wdHlTdHJpbmcoc3RyMSk7XG4gICAgICB2YXIgZW1wdHkyID0gZW1wdHlTdHJpbmcoc3RyMik7XG4gICAgICByZXR1cm4gZW1wdHkxICYmICFlbXB0eTIgfHwgIWVtcHR5MSAmJiBlbXB0eTI7XG4gICAgfVxuICB9O1xuXG4gIC8vIGRlZmluZSB2aXN1YWwgc3R5bGUgcHJvcGVydGllc1xuICAvL1xuICAvLyAtIG4uYi4gYWRkaW5nIGEgbmV3IGdyb3VwIG9mIHByb3BzIG1heSByZXF1aXJlIHVwZGF0ZXMgdG8gdXBkYXRlU3R5bGVIaW50cygpXG4gIC8vIC0gYWRkaW5nIG5ldyBwcm9wcyB0byBhbiBleGlzdGluZyBncm91cCBnZXRzIGhhbmRsZWQgYXV0b21hdGljYWxseVxuXG4gIHZhciB0ID0gc3R5Zm4kMi50eXBlcztcbiAgdmFyIG1haW5MYWJlbCA9IFt7XG4gICAgbmFtZTogJ2xhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmVtcHR5Tm9uRW1wdHlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgc291cmNlTGFiZWwgPSBbe1xuICAgIG5hbWU6ICdzb3VyY2UtbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdGFyZ2V0TGFiZWwgPSBbe1xuICAgIG5hbWU6ICd0YXJnZXQtbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgbGFiZWxEaW1lbnNpb25zID0gW3tcbiAgICBuYW1lOiAnZm9udC1mYW1pbHknLFxuICAgIHR5cGU6IHQuZm9udEZhbWlseSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXN0eWxlJyxcbiAgICB0eXBlOiB0LmZvbnRTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXdlaWdodCcsXG4gICAgdHlwZTogdC5mb250V2VpZ2h0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtdHJhbnNmb3JtJyxcbiAgICB0eXBlOiB0LnRleHRUcmFuc2Zvcm0sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRXcmFwLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3ZlcmZsb3ctd3JhcCcsXG4gICAgdHlwZTogdC50ZXh0T3ZlcmZsb3dXcmFwLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWF4LXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1oZWlnaHQnLFxuICAgIHR5cGU6IHQucG9zaXRpdmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgY29tbW9uTGFiZWwgPSBbe1xuICAgIG5hbWU6ICd0ZXh0LXZhbGlnbicsXG4gICAgdHlwZTogdC52YWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1oYWxpZ24nLFxuICAgIHR5cGU6IHQuaGFsaWduLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnLFxuICAgIHR5cGU6IHQudGV4dEJhY2tncm91bmRTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWp1c3RpZmljYXRpb24nLFxuICAgIHR5cGU6IHQuanVzdGlmaWNhdGlvblxuICB9XTtcbiAgdmFyIGJlaGF2aW9yID0gW3tcbiAgICBuYW1lOiAnZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ldmVudHMnLFxuICAgIHR5cGU6IHQuYm9vbCxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB2aXNpYmlsaXR5ID0gW3tcbiAgICBuYW1lOiAnZGlzcGxheScsXG4gICAgdHlwZTogdC5kaXNwbGF5LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZkNvbm5lY3RlZEVkZ2VzOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAndmlzaWJpbGl0eScsXG4gICAgdHlwZTogdC52aXNpYmlsaXR5LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ29wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXpvb21lZC1mb250LXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ3otY29tcG91bmQtZGVwdGgnLFxuICAgIHR5cGU6IHQuekNvbXBvdW5kRGVwdGgsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnei1pbmRleC1jb21wYXJlJyxcbiAgICB0eXBlOiB0LnpJbmRleENvbXBhcmUsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnei1pbmRleCcsXG4gICAgdHlwZTogdC5udW1iZXIsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgb3ZlcmxheSA9IFt7XG4gICAgbmFtZTogJ292ZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktc2hhcGUnLFxuICAgIHR5cGU6IHQub3ZlcmxheVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktY29ybmVyLXJhZGl1cycsXG4gICAgdHlwZTogdC5jb3JuZXJSYWRpdXNcbiAgfV07XG4gIHZhciB1bmRlcmxheSA9IFt7XG4gICAgbmFtZTogJ3VuZGVybGF5LXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LXNoYXBlJyxcbiAgICB0eXBlOiB0Lm92ZXJsYXlTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1jb3JuZXItcmFkaXVzJyxcbiAgICB0eXBlOiB0LmNvcm5lclJhZGl1c1xuICB9XTtcbiAgdmFyIHRyYW5zaXRpb24gPSBbe1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgICB0eXBlOiB0LnByb3BMaXN0XG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kZWxheScsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLFxuICAgIHR5cGU6IHQuZWFzaW5nXG4gIH1dO1xuICB2YXIgbm9kZVNpemVIYXNoT3ZlcnJpZGUgPSBmdW5jdGlvbiBub2RlU2l6ZUhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApIHtcbiAgICBpZiAocGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIC1lbGUucG9vbEluZGV4KCk7IC8vIG5vIGhhc2gga2V5IGhpdHMgaXMgdXNpbmcgbGFiZWwgc2l6ZSAoaGl0cmF0ZSBmb3IgcGVyZiBwcm9iYWJseSBsb3cgYW55d2F5KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VkUHJvcC5wZlZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIG5vZGVCb2R5ID0gW3tcbiAgICBuYW1lOiAnaGVpZ2h0JyxcbiAgICB0eXBlOiB0Lm5vZGVTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICBoYXNoT3ZlcnJpZGU6IG5vZGVTaXplSGFzaE92ZXJyaWRlXG4gIH0sIHtcbiAgICBuYW1lOiAnd2lkdGgnLFxuICAgIHR5cGU6IHQubm9kZVNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIGhhc2hPdmVycmlkZTogbm9kZVNpemVIYXNoT3ZlcnJpZGVcbiAgfSwge1xuICAgIG5hbWU6ICdzaGFwZScsXG4gICAgdHlwZTogdC5ub2RlU2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2hhcGUtcG9seWdvbi1wb2ludHMnLFxuICAgIHR5cGU6IHQucG9seWdvblBvaW50TGlzdCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb3JuZXItcmFkaXVzJyxcbiAgICB0eXBlOiB0LmNvcm5lclJhZGl1c1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ibGFja2VuJyxcbiAgICB0eXBlOiB0Lm5PbmVPbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJyxcbiAgICB0eXBlOiB0LmNvbG9yc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnLFxuICAgIHR5cGU6IHQucGVyY2VudGFnZXNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5ncmFkaWVudERpcmVjdGlvblxuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LnBhZGRpbmdSZWxhdGl2ZVRvLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JvdW5kcy1leHBhbnNpb24nLFxuICAgIHR5cGU6IHQuYm91bmRzRXhwYW5zaW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIG5vZGVCb3JkZXIgPSBbe1xuICAgIG5hbWU6ICdib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWNhcCcsXG4gICAgdHlwZTogdC5saW5lQ2FwXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWpvaW4nLFxuICAgIHR5cGU6IHQubGluZUpvaW5cbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItZGFzaC1wYXR0ZXJuJyxcbiAgICB0eXBlOiB0Lm51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItZGFzaC1vZmZzZXQnLFxuICAgIHR5cGU6IHQubnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLXBvc2l0aW9uJyxcbiAgICB0eXBlOiB0LmxpbmVQb3NpdGlvblxuICB9XTtcbiAgdmFyIG5vZGVPdXRsaW5lID0gW3tcbiAgICBuYW1lOiAnb3V0bGluZS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGVcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLW9mZnNldCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGJhY2tncm91bmRJbWFnZSA9IFt7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UnLFxuICAgIHR5cGU6IHQudXJsc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nLFxuICAgIHR5cGU6IHQuYmdDcm9zc09yaWdpblxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnLFxuICAgIHR5cGU6IHQuYmdDb250YWlubWVudFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJyxcbiAgICB0eXBlOiB0LmJvb2xzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1wb3NpdGlvbi14JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1wb3NpdGlvbi15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5iZ1JlbGF0aXZlVG9cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5iZ1JlbGF0aXZlVG9cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXJlcGVhdCcsXG4gICAgdHlwZTogdC5iZ1JlcGVhdFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZml0JyxcbiAgICB0eXBlOiB0LmJnRml0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1jbGlwJyxcbiAgICB0eXBlOiB0LmJnQ2xpcFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtd2lkdGgnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0JyxcbiAgICB0eXBlOiB0LmJnV0hcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC14JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vZmZzZXQteScsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9XTtcbiAgdmFyIGNvbXBvdW5kID0gW3tcbiAgICBuYW1lOiAncG9zaXRpb24nLFxuICAgIHR5cGU6IHQucG9zaXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnLFxuICAgIHR5cGU6IHQuY29tcG91bmRJbmNsdWRlTGFiZWxzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLWxlZnQnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgtYmlhcy1yaWdodCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtdG9wJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodC1iaWFzLWJvdHRvbScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGVkZ2VMaW5lID0gW3tcbiAgICBuYW1lOiAnbGluZS1zdHlsZScsXG4gICAgdHlwZTogdC5saW5lU3R5bGVcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1maWxsJyxcbiAgICB0eXBlOiB0LmZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWNhcCcsXG4gICAgdHlwZTogdC5saW5lQ2FwXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtcGF0dGVybicsXG4gICAgdHlwZTogdC5udW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1kYXNoLW9mZnNldCcsXG4gICAgdHlwZTogdC5udW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJyxcbiAgICB0eXBlOiB0LmNvbG9yc1xuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnLFxuICAgIHR5cGU6IHQucGVyY2VudGFnZXNcbiAgfSwge1xuICAgIG5hbWU6ICdjdXJ2ZS1zdHlsZScsXG4gICAgdHlwZTogdC5jdXJ2ZVN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAnaGF5c3RhY2stcmFkaXVzJyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtZW5kcG9pbnQnLFxuICAgIHR5cGU6IHQuZWRnZUVuZHBvaW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cycsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LXJhZGlpJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAncmFkaXVzLXR5cGUnLFxuICAgIHR5cGU6IHQucmFkaXVzVHlwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLXR1cm4nLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuLW1pbi1kaXN0YW5jZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmF4aXNEaXJlY3Rpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS1yYWRpdXMnLFxuICAgIHR5cGU6IHQubnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2VkZ2UtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmVkZ2VEaXN0YW5jZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctc2NhbGUnLFxuICAgIHR5cGU6IHQucG9zaXRpdmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbG9vcC1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbG9vcC1zd2VlcCcsXG4gICAgdHlwZTogdC5hbmdsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGdob3N0ID0gW3tcbiAgICBuYW1lOiAnZ2hvc3QnLFxuICAgIHR5cGU6IHQuYm9vbCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdnaG9zdC1vZmZzZXQteCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdnaG9zdC1vZmZzZXQteScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdnaG9zdC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfV07XG4gIHZhciBjb3JlID0gW3tcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnYWN0aXZlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYWN0aXZlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRzaWRlLXRleHR1cmUtYmctb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuXG4gIC8vIHBpZSBiYWNrZ3JvdW5kcyBmb3Igbm9kZXNcbiAgdmFyIHBpZSA9IFtdO1xuICBzdHlmbiQyLnBpZUJhY2tncm91bmROID0gMTY7IC8vIGJlY2F1c2UgdGhlIHBpZSBwcm9wZXJ0aWVzIGFyZSBudW1iZXJlZCwgZ2l2ZSBhY2Nlc3MgdG8gYSBjb25zdGFudCBOIChmb3IgcmVuZGVyZXIgdXNlKVxuICBwaWUucHVzaCh7XG4gICAgbmFtZTogJ3BpZS1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnRcbiAgfSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgIHBpZS5wdXNoKHtcbiAgICAgIG5hbWU6ICdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtY29sb3InLFxuICAgICAgdHlwZTogdC5jb2xvclxuICAgIH0pO1xuICAgIHBpZS5wdXNoKHtcbiAgICAgIG5hbWU6ICdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtc2l6ZScsXG4gICAgICB0eXBlOiB0LnBlcmNlbnRcbiAgICB9KTtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gICAgfSk7XG4gIH1cblxuICAvLyBlZGdlIGFycm93c1xuICB2YXIgZWRnZUFycm93ID0gW107XG4gIHZhciBhcnJvd1ByZWZpeGVzID0gc3R5Zm4kMi5hcnJvd1ByZWZpeGVzID0gWydzb3VyY2UnLCAnbWlkLXNvdXJjZScsICd0YXJnZXQnLCAnbWlkLXRhcmdldCddO1xuICBbe1xuICAgIG5hbWU6ICdhcnJvdy1zaGFwZScsXG4gICAgdHlwZTogdC5hcnJvd1NoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctZmlsbCcsXG4gICAgdHlwZTogdC5hcnJvd0ZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy13aWR0aCcsXG4gICAgdHlwZTogdC5hcnJvd1dpZHRoXG4gIH1dLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBhcnJvd1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnLScgKyBwcm9wLm5hbWU7XG4gICAgICB2YXIgdHlwZSA9IHByb3AudHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHMgPSBwcm9wLnRyaWdnZXJzQm91bmRzO1xuICAgICAgZWRnZUFycm93LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB0cmlnZ2Vyc0JvdW5kczogdHJpZ2dlcnNCb3VuZHNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCB7fSk7XG4gIHZhciBwcm9wcyA9IHN0eWZuJDIucHJvcGVydGllcyA9IFtdLmNvbmNhdChiZWhhdmlvciwgdHJhbnNpdGlvbiwgdmlzaWJpbGl0eSwgb3ZlcmxheSwgdW5kZXJsYXksIGdob3N0LCBjb21tb25MYWJlbCwgbGFiZWxEaW1lbnNpb25zLCBtYWluTGFiZWwsIHNvdXJjZUxhYmVsLCB0YXJnZXRMYWJlbCwgbm9kZUJvZHksIG5vZGVCb3JkZXIsIG5vZGVPdXRsaW5lLCBiYWNrZ3JvdW5kSW1hZ2UsIHBpZSwgY29tcG91bmQsIGVkZ2VMaW5lLCBlZGdlQXJyb3csIGNvcmUpO1xuICB2YXIgcHJvcEdyb3VwcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cHMgPSB7XG4gICAgLy8gY29tbW9uIHRvIGFsbCBlbGVzXG4gICAgYmVoYXZpb3I6IGJlaGF2aW9yLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIHVuZGVybGF5OiB1bmRlcmxheSxcbiAgICBnaG9zdDogZ2hvc3QsXG4gICAgLy8gbGFiZWxzXG4gICAgY29tbW9uTGFiZWw6IGNvbW1vbkxhYmVsLFxuICAgIGxhYmVsRGltZW5zaW9uczogbGFiZWxEaW1lbnNpb25zLFxuICAgIG1haW5MYWJlbDogbWFpbkxhYmVsLFxuICAgIHNvdXJjZUxhYmVsOiBzb3VyY2VMYWJlbCxcbiAgICB0YXJnZXRMYWJlbDogdGFyZ2V0TGFiZWwsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgIG5vZGVCb2R5OiBub2RlQm9keSxcbiAgICBub2RlQm9yZGVyOiBub2RlQm9yZGVyLFxuICAgIG5vZGVPdXRsaW5lOiBub2RlT3V0bGluZSxcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IGJhY2tncm91bmRJbWFnZSxcbiAgICBwaWU6IHBpZSxcbiAgICBjb21wb3VuZDogY29tcG91bmQsXG4gICAgLy8gZWRnZSBwcm9wc1xuICAgIGVkZ2VMaW5lOiBlZGdlTGluZSxcbiAgICBlZGdlQXJyb3c6IGVkZ2VBcnJvdyxcbiAgICBjb3JlOiBjb3JlXG4gIH07XG4gIHZhciBwcm9wR3JvdXBOYW1lcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cE5hbWVzID0ge307XG4gIHZhciBwcm9wR3JvdXBLZXlzID0gc3R5Zm4kMi5wcm9wZXJ0eUdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKHByb3BHcm91cHMpO1xuICBwcm9wR3JvdXBLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHByb3BHcm91cE5hbWVzW2tleV0gPSBwcm9wR3JvdXBzW2tleV0ubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5uYW1lO1xuICAgIH0pO1xuICAgIHByb3BHcm91cHNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5ncm91cEtleSA9IGtleTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gZGVmaW5lIGFsaWFzZXNcbiAgdmFyIGFsaWFzZXMgPSBzdHlmbiQyLmFsaWFzZXMgPSBbe1xuICAgIG5hbWU6ICdjb250ZW50JyxcbiAgICBwb2ludHNUbzogJ2xhYmVsJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtcmFkaXVzJyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtcmFkaWknXG4gIH0sIHtcbiAgICBuYW1lOiAnZWRnZS10ZXh0LXJvdGF0aW9uJyxcbiAgICBwb2ludHNUbzogJ3RleHQtcm90YXRpb24nXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1sZWZ0JyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yaWdodCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctdG9wJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1ib3R0b20nLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfV07XG5cbiAgLy8gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuICBzdHlmbiQyLnByb3BlcnR5TmFtZXMgPSBwcm9wcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5uYW1lO1xuICB9KTtcblxuICAvLyBhbGxvdyBhY2Nlc3Mgb2YgcHJvcGVydGllcyBieSBuYW1lICggZS5nLiBzdHlsZS5wcm9wZXJ0aWVzLmhlaWdodCApXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9wcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcHJvcCA9IHByb3BzW19pXTtcbiAgICBwcm9wc1twcm9wLm5hbWVdID0gcHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxuXG4gIC8vIG1hcCBhbGlhc2VzXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGFsaWFzZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBhbGlhcyA9IGFsaWFzZXNbX2kyXTtcbiAgICB2YXIgcG9pbnRzVG9Qcm9wID0gcHJvcHNbYWxpYXMucG9pbnRzVG9dO1xuICAgIHZhciBhbGlhc1Byb3AgPSB7XG4gICAgICBuYW1lOiBhbGlhcy5uYW1lLFxuICAgICAgYWxpYXM6IHRydWUsXG4gICAgICBwb2ludHNUbzogcG9pbnRzVG9Qcm9wXG4gICAgfTtcblxuICAgIC8vIGFkZCBhbGlhcyBwcm9wIGZvciBwYXJzaW5nXG4gICAgcHJvcHMucHVzaChhbGlhc1Byb3ApO1xuICAgIHByb3BzW2FsaWFzLm5hbWVdID0gYWxpYXNQcm9wOyAvLyBhbGxvdyBsb29rdXAgYnkgbmFtZVxuICB9XG59KSgpO1xuXG5zdHlmbiQyLmdldERlZmF1bHRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLmdldERlZmF1bHRQcm9wZXJ0aWVzKClbbmFtZV07XG59O1xuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgaWYgKF9wLmRlZmF1bHRQcm9wZXJ0aWVzICE9IG51bGwpIHtcbiAgICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG4gIH1cbiAgdmFyIHJhd1Byb3BzID0gZXh0ZW5kKHtcbiAgICAvLyBjb3JlIHByb3BzXG4gICAgJ3NlbGVjdGlvbi1ib3gtY29sb3InOiAnI2RkZCcsXG4gICAgJ3NlbGVjdGlvbi1ib3gtb3BhY2l0eSc6IDAuNjUsXG4gICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogJyNhYWEnLFxuICAgICdzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCc6IDEsXG4gICAgJ2FjdGl2ZS1iZy1jb2xvcic6ICdibGFjaycsXG4gICAgJ2FjdGl2ZS1iZy1vcGFjaXR5JzogMC4xNSxcbiAgICAnYWN0aXZlLWJnLXNpemUnOiAzMCxcbiAgICAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJzogJyMwMDAnLFxuICAgICdvdXRzaWRlLXRleHR1cmUtYmctb3BhY2l0eSc6IDAuMTI1LFxuICAgIC8vIGNvbW1vbiBub2RlL2VkZ2UgcHJvcHNcbiAgICAnZXZlbnRzJzogJ3llcycsXG4gICAgJ3RleHQtZXZlbnRzJzogJ25vJyxcbiAgICAndGV4dC12YWxpZ24nOiAndG9wJyxcbiAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcbiAgICAndGV4dC1qdXN0aWZpY2F0aW9uJzogJ2F1dG8nLFxuICAgICdsaW5lLWhlaWdodCc6IDEsXG4gICAgJ2NvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LW91dGxpbmUtY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtb3V0bGluZS13aWR0aCc6IDAsXG4gICAgJ3RleHQtb3V0bGluZS1vcGFjaXR5JzogMSxcbiAgICAndGV4dC1vcGFjaXR5JzogMSxcbiAgICAndGV4dC1kZWNvcmF0aW9uJzogJ25vbmUnLFxuICAgICd0ZXh0LXRyYW5zZm9ybSc6ICdub25lJyxcbiAgICAndGV4dC13cmFwJzogJ25vbmUnLFxuICAgICd0ZXh0LW92ZXJmbG93LXdyYXAnOiAnd2hpdGVzcGFjZScsXG4gICAgJ3RleHQtbWF4LXdpZHRoJzogOTk5OSxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eSc6IDAsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1zaGFwZSc6ICdyZWN0YW5nbGUnLFxuICAgICd0ZXh0LWJhY2tncm91bmQtcGFkZGluZyc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLW9wYWNpdHknOiAwLFxuICAgICd0ZXh0LWJvcmRlci13aWR0aCc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAndGV4dC1ib3JkZXItY29sb3InOiAnIzAwMCcsXG4gICAgJ2ZvbnQtZmFtaWx5JzogJ0hlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYnLFxuICAgICdmb250LXN0eWxlJzogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IDE2LFxuICAgICdtaW4tem9vbWVkLWZvbnQtc2l6ZSc6IDAsXG4gICAgJ3RleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICd0YXJnZXQtdGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAndmlzaWJpbGl0eSc6ICd2aXNpYmxlJyxcbiAgICAnZGlzcGxheSc6ICdlbGVtZW50JyxcbiAgICAnb3BhY2l0eSc6IDEsXG4gICAgJ3otY29tcG91bmQtZGVwdGgnOiAnYXV0bycsXG4gICAgJ3otaW5kZXgtY29tcGFyZSc6ICdhdXRvJyxcbiAgICAnei1pbmRleCc6IDAsXG4gICAgJ2xhYmVsJzogJycsXG4gICAgJ3RleHQtbWFyZ2luLXgnOiAwLFxuICAgICd0ZXh0LW1hcmdpbi15JzogMCxcbiAgICAnc291cmNlLWxhYmVsJzogJycsXG4gICAgJ3NvdXJjZS10ZXh0LW9mZnNldCc6IDAsXG4gICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi14JzogMCxcbiAgICAnc291cmNlLXRleHQtbWFyZ2luLXknOiAwLFxuICAgICd0YXJnZXQtbGFiZWwnOiAnJyxcbiAgICAndGFyZ2V0LXRleHQtb2Zmc2V0JzogMCxcbiAgICAndGFyZ2V0LXRleHQtbWFyZ2luLXgnOiAwLFxuICAgICd0YXJnZXQtdGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ292ZXJsYXktb3BhY2l0eSc6IDAsXG4gICAgJ292ZXJsYXktY29sb3InOiAnIzAwMCcsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LXNoYXBlJzogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgJ292ZXJsYXktY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAndW5kZXJsYXktb3BhY2l0eSc6IDAsXG4gICAgJ3VuZGVybGF5LWNvbG9yJzogJyMwMDAnLFxuICAgICd1bmRlcmxheS1wYWRkaW5nJzogMTAsXG4gICAgJ3VuZGVybGF5LXNoYXBlJzogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgJ3VuZGVybGF5LWNvcm5lci1yYWRpdXMnOiAnYXV0bycsXG4gICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnbm9uZScsXG4gICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAwLFxuICAgICd0cmFuc2l0aW9uLWRlbGF5JzogMCxcbiAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnbGluZWFyJyxcbiAgICAvLyBub2RlIHByb3BzXG4gICAgJ2JhY2tncm91bmQtYmxhY2tlbic6IDAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzk5OScsXG4gICAgJ2JhY2tncm91bmQtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nOiAnYW5vbnltb3VzJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JzogMSxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCc6ICdpbnNpZGUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZyc6ICd5ZXMnLFxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnOiAnNTAlJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtb2Zmc2V0LXgnOiAwLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC15JzogMCxcbiAgICAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLFxuICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdub25lJyxcbiAgICAnYmFja2dyb3VuZC1jbGlwJzogJ25vZGUnLFxuICAgICdiYWNrZ3JvdW5kLXdpZHRoJzogJ2F1dG8nLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodCc6ICdhdXRvJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdib3JkZXItb3BhY2l0eSc6IDEsXG4gICAgJ2JvcmRlci13aWR0aCc6IDAsXG4gICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2JvcmRlci1kYXNoLXBhdHRlcm4nOiBbNCwgMl0sXG4gICAgJ2JvcmRlci1kYXNoLW9mZnNldCc6IDAsXG4gICAgJ2JvcmRlci1jYXAnOiAnYnV0dCcsXG4gICAgJ2JvcmRlci1qb2luJzogJ21pdGVyJyxcbiAgICAnYm9yZGVyLXBvc2l0aW9uJzogJ2NlbnRlcicsXG4gICAgJ291dGxpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ291dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ291dGxpbmUtd2lkdGgnOiAwLFxuICAgICdvdXRsaW5lLW9mZnNldCc6IDAsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdoZWlnaHQnOiAzMCxcbiAgICAnd2lkdGgnOiAzMCxcbiAgICAnc2hhcGUnOiAnZWxsaXBzZScsXG4gICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAxLCAtMSwgICAxLCAxLCAgIC0xLCAxJyxcbiAgICAnY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAnYm91bmRzLWV4cGFuc2lvbic6IDAsXG4gICAgLy8gbm9kZSBncmFkaWVudFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbic6ICd0by1ib3R0b20nLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAvLyBnaG9zdCBwcm9wc1xuICAgICdnaG9zdCc6ICdubycsXG4gICAgJ2dob3N0LW9mZnNldC15JzogMCxcbiAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAwLFxuICAgICdnaG9zdC1vcGFjaXR5JzogMCxcbiAgICAvLyBjb21wb3VuZCBwcm9wc1xuICAgICdwYWRkaW5nJzogMCxcbiAgICAncGFkZGluZy1yZWxhdGl2ZS10byc6ICd3aWR0aCcsXG4gICAgJ3Bvc2l0aW9uJzogJ29yaWdpbicsXG4gICAgJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2luY2x1ZGUnLFxuICAgICdtaW4td2lkdGgnOiAwLFxuICAgICdtaW4td2lkdGgtYmlhcy1sZWZ0JzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiAwLFxuICAgICdtaW4taGVpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodC1iaWFzLXRvcCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiAwXG4gIH0sIHtcbiAgICAvLyBub2RlIHBpZSBiZ1xuICAgICdwaWUtc2l6ZSc6ICcxMDAlJ1xuICB9LCBbe1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdmFsdWU6ICdibGFjaydcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1zaXplJyxcbiAgICB2YWx1ZTogJzAlJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BpZS17e2l9fS1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHZhbHVlOiAxXG4gIH1dLnJlZHVjZShmdW5jdGlvbiAoY3NzLCBwcm9wKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3AubmFtZS5yZXBsYWNlKCd7e2l9fScsIGkpO1xuICAgICAgdmFyIHZhbCA9IHByb3AudmFsdWU7XG4gICAgICBjc3NbbmFtZV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSwge1xuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICAnbGluZS1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ2xpbmUtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY2FwJzogJ2J1dHQnLFxuICAgICdsaW5lLW9wYWNpdHknOiAxLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAnY29udHJvbC1wb2ludC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtZGlzdGFuY2VzJzogMjAsXG4gICAgJ3NlZ21lbnQtcmFkaWknOiAxNSxcbiAgICAncmFkaXVzLXR5cGUnOiAnYXJjLXJhZGl1cycsXG4gICAgJ3RheGktdHVybic6ICc1MCUnLFxuICAgICd0YXhpLXJhZGl1cyc6IDE1LFxuICAgICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJzogMTAsXG4gICAgJ3RheGktZGlyZWN0aW9uJzogJ2F1dG8nLFxuICAgICdlZGdlLWRpc3RhbmNlcyc6ICdpbnRlcnNlY3Rpb24nLFxuICAgICdjdXJ2ZS1zdHlsZSc6ICdoYXlzdGFjaycsXG4gICAgJ2hheXN0YWNrLXJhZGl1cyc6IDAsXG4gICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAnbG9vcC1kaXJlY3Rpb24nOiAnLTQ1ZGVnJyxcbiAgICAnbG9vcC1zd2VlcCc6ICctOTBkZWcnLFxuICAgICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3NvdXJjZS1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICd0YXJnZXQtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAnbGluZS1kYXNoLXBhdHRlcm4nOiBbNiwgM10sXG4gICAgJ2xpbmUtZGFzaC1vZmZzZXQnOiAwXG4gIH0sIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB2YWx1ZTogJ25vbmUnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHZhbHVlOiAnIzk5OSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB2YWx1ZTogJ2ZpbGxlZCdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy13aWR0aCcsXG4gICAgdmFsdWU6IDFcbiAgfV0ucmVkdWNlKGZ1bmN0aW9uIChjc3MsIHByb3ApIHtcbiAgICBzdHlmbiQyLmFycm93UHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICB2YXIgbmFtZSA9IHByZWZpeCArICctJyArIHByb3AubmFtZTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSk7XG4gIHZhciBwYXJzZWRQcm9wcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChwcm9wLnBvaW50c1RvKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdmFyIHZhbCA9IHJhd1Byb3BzW25hbWVdO1xuICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWwpO1xuICAgIHBhcnNlZFByb3BzW25hbWVdID0gcGFyc2VkUHJvcDtcbiAgfVxuICBfcC5kZWZhdWx0UHJvcGVydGllcyA9IHBhcnNlZFByb3BzO1xuICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG59O1xuc3R5Zm4kMi5hZGREZWZhdWx0U3R5bGVzaGVldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZWxlY3RvcignOnBhcmVudCcpLmNzcyh7XG4gICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3BhZGRpbmcnOiAxMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZWVlJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNjY2MnLFxuICAgICdib3JkZXItd2lkdGgnOiAxXG4gIH0pLnNlbGVjdG9yKCdlZGdlJykuY3NzKHtcbiAgICAnd2lkdGgnOiAzXG4gIH0pLnNlbGVjdG9yKCc6bG9vcCcpLmNzcyh7XG4gICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcidcbiAgfSkuc2VsZWN0b3IoJ2VkZ2U6Y29tcG91bmQnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1saW5lJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZSdcbiAgfSkuc2VsZWN0b3IoJzpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ2xpbmUtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtc291cmNlLWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtdGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknXG4gIH0pLnNlbGVjdG9yKCc6cGFyZW50OnNlbGVjdGVkJykuY3NzKHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQ0NFMUY5JyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNhZWM4ZTUnXG4gIH0pLnNlbGVjdG9yKCc6YWN0aXZlJykuY3NzKHtcbiAgICAnb3ZlcmxheS1jb2xvcic6ICdibGFjaycsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLjI1XG4gIH0pO1xuICB0aGlzLmRlZmF1bHRMZW5ndGggPSB0aGlzLmxlbmd0aDtcbn07XG5cbnZhciBzdHlmbiQxID0ge307XG5cbi8vIGEgY2FjaGluZyBsYXllciBmb3IgcHJvcGVydHkgcGFyc2luZ1xuc3R5Zm4kMS5wYXJzZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBmdW5jdGlvbiB2YWx1ZXMgY2FuJ3QgYmUgY2FjaGVkIGluIGFsbCBjYXNlcywgYW5kIHRoZXJlIGlzbid0IG11Y2ggYmVuZWZpdCBvZiBjYWNoaW5nIHRoZW0gYW55d2F5XG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cbiAgdmFyIGZsYXRLZXkgPSBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycgfHwgcHJvcElzRmxhdCA9PT0gdHJ1ZSB8fCBwcm9wSXNGbGF0ID09PSBmYWxzZSB8fCBwcm9wSXNGbGF0ID09IG51bGwgPyAnZG9udGNhcmUnIDogcHJvcElzRmxhdDtcbiAgdmFyIGJ5cGFzc0tleSA9IHByb3BJc0J5cGFzcyA/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/IHNxRGlzdCA6IG1pblNxRGlzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tOb2RlKG5vZGUpIHtcbiAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSArIDIgKiBub2RlVGhyZXNob2xkO1xuICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaHcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICAgIHZhciBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gICAgdmFyIHJzID0gbm9kZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICBpZiAocG9zLnggLSBodyA8PSB4ICYmIHggPD0gcG9zLnggKyBodyAvLyBiYiBjaGVjayB4XG4gICAgJiYgcG9zLnkgLSBoaCA8PSB5ICYmIHkgPD0gcG9zLnkgKyBoaCAvLyBiYiBjaGVjayB5XG4gICAgKSB7XG4gICAgICB2YXIgc2hhcGUgPSByLm5vZGVTaGFwZXNbc2VsZi5nZXROb2RlU2hhcGUobm9kZSldO1xuICAgICAgaWYgKHNoYXBlLmNoZWNrUG9pbnQoeCwgeSwgMCwgd2lkdGgsIGhlaWdodCwgcG9zLngsIHBvcy55LCBjb3JuZXJSYWRpdXMsIHJzKSkge1xuICAgICAgICBhZGRFbGUobm9kZSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjaGVja0VkZ2UoZWRnZSkge1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gICAgdmFyIHN0eWxlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBzY2FsZSA9IGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgIHZhciB3aWR0aCA9IHN0eWxlV2lkdGggLyAyICsgZWRnZVRocmVzaG9sZDsgLy8gbW9yZSBsaWtlIGEgZGlzdGFuY2UgcmFkaXVzIGZyb20gY2VudHJlXG4gICAgdmFyIHdpZHRoU3EgPSB3aWR0aCAqIHdpZHRoO1xuICAgIHZhciB3aWR0aDIgPSB3aWR0aCAqIDI7XG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcURpc3Q7XG4gICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnIHx8IHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnIHx8IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyAzIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmIChpbkxpbmVWaWNpbml0eSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHdpZHRoMikgJiYgd2lkdGhTcSA+IChzcURpc3QgPSBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdKSkpIHtcbiAgICAgICAgICBhZGRFbGUoZWRnZSwgc3FEaXN0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSArIDUgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKGluQmV6aWVyVmljaW5pdHkoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCBwdHNbaSArIDRdLCBwdHNbaSArIDVdLCB3aWR0aDIpICYmIHdpZHRoU3EgPiAoc3FEaXN0ID0gc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCBwdHNbaSArIDRdLCBwdHNbaSArIDVdKSkpIHtcbiAgICAgICAgICBhZGRFbGUoZWRnZSwgc3FEaXN0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIGNsb3NlIHRvIHRoZSBlZGdlIGJ1dCBkaWRuJ3QgaGl0IGl0LCBtYXliZSB3ZSBoaXQgaXRzIGFycm93c1xuXG4gICAgdmFyIHNyYyA9IHNyYyB8fCBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IHRndCB8fCBfcC50YXJnZXQ7XG4gICAgdmFyIGFyU2l6ZSA9IHNlbGYuZ2V0QXJyb3dXaWR0aChzdHlsZVdpZHRoLCBzY2FsZSk7XG4gICAgdmFyIGFycm93cyA9IFt7XG4gICAgICBuYW1lOiAnc291cmNlJyxcbiAgICAgIHg6IHJzLmFycm93U3RhcnRYLFxuICAgICAgeTogcnMuYXJyb3dTdGFydFksXG4gICAgICBhbmdsZTogcnMuc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICd0YXJnZXQnLFxuICAgICAgeDogcnMuYXJyb3dFbmRYLFxuICAgICAgeTogcnMuYXJyb3dFbmRZLFxuICAgICAgYW5nbGU6IHJzLnRndEFycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnbWlkLXNvdXJjZScsXG4gICAgICB4OiBycy5taWRYLFxuICAgICAgeTogcnMubWlkWSxcbiAgICAgIGFuZ2xlOiBycy5taWRzcmNBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC10YXJnZXQnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkdGd0QXJyb3dBbmdsZVxuICAgIH1dO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXIgPSBhcnJvd3NbaV07XG4gICAgICB2YXIgc2hhcGUgPSByLmFycm93U2hhcGVzW2VkZ2UucHN0eWxlKGFyLm5hbWUgKyAnLWFycm93LXNoYXBlJykudmFsdWVdO1xuICAgICAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgICBpZiAoc2hhcGUucm91Z2hDb2xsaWRlKHgsIHksIGFyU2l6ZSwgYXIuYW5nbGUsIHtcbiAgICAgICAgeDogYXIueCxcbiAgICAgICAgeTogYXIueVxuICAgICAgfSwgZWRnZVdpZHRoLCBlZGdlVGhyZXNob2xkKSAmJiBzaGFwZS5jb2xsaWRlKHgsIHksIGFyU2l6ZSwgYXIuYW5nbGUsIHtcbiAgICAgICAgeDogYXIueCxcbiAgICAgICAgeTogYXIueVxuICAgICAgfSwgZWRnZVdpZHRoLCBlZGdlVGhyZXNob2xkKSkge1xuICAgICAgICBhZGRFbGUoZWRnZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvciBjb21wb3VuZCBncmFwaHMsIGhpdHRpbmcgZWRnZSBtYXkgYWN0dWFsbHkgd2FudCBhIGNvbm5lY3RlZCBub2RlIGluc3RlYWQgKGIvYyBlZGdlIG1heSBoYXZlIGdyZWF0ZXIgei1pbmRleCBwcmVjZWRlbmNlKVxuICAgIGlmIChoYXNDb21wb3VuZHMgJiYgbmVhci5sZW5ndGggPiAwKSB7XG4gICAgICBjaGVja05vZGUoc3JjKTtcbiAgICAgIGNoZWNrTm9kZSh0Z3QpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcmVwcm9wKG9iaiwgbmFtZSwgcHJlKSB7XG4gICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBuYW1lLCBwcmUpO1xuICB9XG4gIGZ1bmN0aW9uIGNoZWNrTGFiZWwoZWxlLCBwcmVmaXgpIHtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIHRoID0gbGFiZWxUaHJlc2hvbGQ7XG4gICAgdmFyIHByZWZpeERhc2g7XG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgcHJlZml4RGFzaCA9IHByZWZpeCArICctJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4RGFzaCA9ICcnO1xuICAgIH1cbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgYmIgPSBfcC5sYWJlbEJvdW5kc1twcmVmaXggfHwgJ21haW4nXTtcbiAgICB2YXIgdGV4dCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICdsYWJlbCcpLnZhbHVlO1xuICAgIHZhciBldmVudHNFbmFibGVkID0gZWxlLnBzdHlsZSgndGV4dC1ldmVudHMnKS5zdHJWYWx1ZSA9PT0gJ3llcyc7XG4gICAgaWYgKCFldmVudHNFbmFibGVkIHx8ICF0ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBseCA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBseSA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbFknLCBwcmVmaXgpO1xuICAgIHZhciB0aGV0YSA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcbiAgICB2YXIgb3ggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG95ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBseDEgPSBiYi54MSAtIHRoIC0gb3g7IC8vICgtb3gsIC1veSkgYXMgYmIgYWxyZWFkeSBpbmNsdWRlcyBtYXJnaW5cbiAgICB2YXIgbHgyID0gYmIueDIgKyB0aCAtIG94OyAvLyBhbmQgcm90YXRpb24gaXMgYWJvdXQgKGx4LCBseSlcbiAgICB2YXIgbHkxID0gYmIueTEgLSB0aCAtIG95O1xuICAgIHZhciBseTIgPSBiYi55MiArIHRoIC0gb3k7XG4gICAgaWYgKHRoZXRhKSB7XG4gICAgICB2YXIgY29zID0gTWF0aC5jb3ModGhldGEpO1xuICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHRoZXRhKTtcbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIGx4O1xuICAgICAgICB5ID0geSAtIGx5O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgbHgsXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyBseVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICB2YXIgcG9pbnRzID0gW1xuICAgICAgLy8gd2l0aCB0aGUgbWFyZ2luIGFkZGVkIGFmdGVyIHRoZSByb3RhdGlvbiBpcyBhcHBsaWVkXG4gICAgICBweDF5MS54ICsgb3gsIHB4MXkxLnkgKyBveSwgcHgyeTEueCArIG94LCBweDJ5MS55ICsgb3ksIHB4MnkyLnggKyBveCwgcHgyeTIueSArIG95LCBweDF5Mi54ICsgb3gsIHB4MXkyLnkgKyBveV07XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkbyBhIGNoZWFwZXIgYmIgY2hlY2tcbiAgICAgIGlmIChpbkJvdW5kaW5nQm94KGJiLCB4LCB5KSkge1xuICAgICAgICBhZGRFbGUoZWxlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSBlbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gcmV2ZXJzZSBvcmRlciBmb3IgcHJlY2VkZW5jZVxuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGNoZWNrTm9kZShlbGUpIHx8IGNoZWNrTGFiZWwoZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBlZGdlXG4gICAgICBjaGVja0VkZ2UoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUsICdzb3VyY2UnKSB8fCBjaGVja0xhYmVsKGVsZSwgJ3RhcmdldCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVhcjtcbn07XG5cbi8vICdHaXZlIG1lIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIGJveCdcbkJScCRlLmdldEFsbEluQm94ID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gIHZhciBlbGVzID0gdGhpcy5nZXRDYWNoZWRaU29ydGVkRWxlcygpLmludGVyYWN0aXZlO1xuICB2YXIgYm94ID0gW107XG4gIHZhciB4MWMgPSBNYXRoLm1pbih4MSwgeDIpO1xuICB2YXIgeDJjID0gTWF0aC5tYXgoeDEsIHgyKTtcbiAgdmFyIHkxYyA9IE1hdGgubWluKHkxLCB5Mik7XG4gIHZhciB5MmMgPSBNYXRoLm1heCh5MSwgeTIpO1xuICB4MSA9IHgxYztcbiAgeDIgPSB4MmM7XG4gIHkxID0geTFjO1xuICB5MiA9IHkyYztcbiAgdmFyIGJveEJiID0gbWFrZUJvdW5kaW5nQm94KHtcbiAgICB4MTogeDEsXG4gICAgeTE6IHkxLFxuICAgIHgyOiB4MixcbiAgICB5MjogeTJcbiAgfSk7XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlID0gZWxlO1xuICAgICAgdmFyIG5vZGVCYiA9IG5vZGUuYm91bmRpbmdCb3goe1xuICAgICAgICBpbmNsdWRlTm9kZXM6IHRydWUsXG4gICAgICAgIGluY2x1ZGVFZGdlczogZmFsc2UsXG4gICAgICAgIGluY2x1ZGVMYWJlbHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJveEJiLCBub2RlQmIpICYmICFib3VuZGluZ0JveEluQm91bmRpbmdCb3gobm9kZUJiLCBib3hCYikpIHtcbiAgICAgICAgYm94LnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlID0gZWxlO1xuICAgICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgICAgaWYgKHJzLnN0YXJ0WCAhPSBudWxsICYmIHJzLnN0YXJ0WSAhPSBudWxsICYmICFpbkJvdW5kaW5nQm94KGJveEJiLCBycy5zdGFydFgsIHJzLnN0YXJ0WSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocnMuZW5kWCAhPSBudWxsICYmIHJzLmVuZFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycgfHwgcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgdmFyIHB0cyA9IF9wLnJzdHlsZS5iZXppZXJQdHMgfHwgX3AucnN0eWxlLmxpbmVQdHMgfHwgX3AucnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICB2YXIgYWxsSW5zaWRlID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXBvaW50SW5Cb3VuZGluZ0JveChib3hCYiwgcHRzW2ldKSkge1xuICAgICAgICAgICAgYWxsSW5zaWRlID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbEluc2lkZSkge1xuICAgICAgICAgIGJveC5wdXNoKGVkZ2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snIHx8IHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgIGJveC5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYm94O1xufTtcblxudmFyIEJScCRkID0ge307XG5CUnAkZC5jYWxjdWxhdGVBcnJvd0FuZ2xlcyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBpc0hheXN0YWNrID0gcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjayc7XG4gIHZhciBpc0JlemllciA9IHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJztcbiAgdmFyIGlzTXVsdGliZXppZXIgPSBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJztcbiAgdmFyIGlzU2VnbWVudHMgPSBycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIGlzQ29tcG91bmQgPSBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJztcbiAgdmFyIGlzU2VsZiA9IHJzLmVkZ2VUeXBlID09PSAnc2VsZic7XG5cbiAgLy8gRGlzcGxhY2VtZW50IGdpdmVzIGRpcmVjdGlvbiBmb3IgYXJyb3doZWFkIG9yaWVudGF0aW9uXG4gIHZhciBkaXNwWCwgZGlzcFk7XG4gIHZhciBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgbWlkWCwgbWlkWTtcbiAgaWYgKGlzSGF5c3RhY2spIHtcbiAgICBzdGFydFggPSBycy5oYXlzdGFja1B0c1swXTtcbiAgICBzdGFydFkgPSBycy5oYXlzdGFja1B0c1sxXTtcbiAgICBlbmRYID0gcnMuaGF5c3RhY2tQdHNbMl07XG4gICAgZW5kWSA9IHJzLmhheXN0YWNrUHRzWzNdO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0WCA9IHJzLmFycm93U3RhcnRYO1xuICAgIHN0YXJ0WSA9IHJzLmFycm93U3RhcnRZO1xuICAgIGVuZFggPSBycy5hcnJvd0VuZFg7XG4gICAgZW5kWSA9IHJzLmFycm93RW5kWTtcbiAgfVxuICBtaWRYID0gcnMubWlkWDtcbiAgbWlkWSA9IHJzLm1pZFk7XG5cbiAgLy8gc291cmNlXG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIHJzLnNlZ3B0c1swXTtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIHJzLnNlZ3B0c1sxXTtcbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmIHx8IGlzQmV6aWVyKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgYlggPSBxYmV6aWVyQXQocHRzWzBdLCBwdHNbMl0sIHB0c1s0XSwgMC4xKTtcbiAgICB2YXIgYlkgPSBxYmV6aWVyQXQocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgMC4xKTtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIGJYO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gYlk7XG4gIH0gZWxzZSB7XG4gICAgZGlzcFggPSBzdGFydFggLSBtaWRYO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gbWlkWTtcbiAgfVxuICBycy5zcmNBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xuXG4gIC8vIG1pZCB0YXJnZXRcbiAgLy9cblxuICB2YXIgbWlkWCA9IHJzLm1pZFg7XG4gIHZhciBtaWRZID0gcnMubWlkWTtcbiAgaWYgKGlzSGF5c3RhY2spIHtcbiAgICBtaWRYID0gKHN0YXJ0WCArIGVuZFgpIC8gMjtcbiAgICBtaWRZID0gKHN0YXJ0WSArIGVuZFkpIC8gMjtcbiAgfVxuICBkaXNwWCA9IGVuZFggLSBzdGFydFg7XG4gIGRpc3BZID0gZW5kWSAtIHN0YXJ0WTtcbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIGlmIChwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgZGlzcFggPSBwdHNbaTJdIC0gcHRzW2kxXTtcbiAgICAgIGRpc3BZID0gcHRzW2kyICsgMV0gLSBwdHNbaTEgKyAxXTtcbiAgICB9IGVsc2UgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgIGRpc3BYID0gcnMubWlkVmVjdG9yWzFdO1xuICAgICAgZGlzcFkgPSAtcnMubWlkVmVjdG9yWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgY3B0cyA9IHJzLmN0cmxwdHM7XG4gICAgdmFyIGJwMHgsIGJwMHk7XG4gICAgdmFyIGJwMXgsIGJwMXk7XG4gICAgaWYgKGNwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIHZhciBwMCA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gc3RhcnRwdFxuICAgICAgdmFyIGljID0gcDAgKyAyO1xuICAgICAgdmFyIHAxID0gaWMgKyAyO1xuICAgICAgYnAweCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjApO1xuICAgICAgYnAweSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjApO1xuICAgICAgYnAxeCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjAwMDEpO1xuICAgICAgYnAxeSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjAwMDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaWMgPSBwdHMubGVuZ3RoIC8gMiAtIDE7IC8vIGN0cnB0XG4gICAgICB2YXIgcDAgPSBpYyAtIDI7IC8vIHN0YXJ0cHRcbiAgICAgIHZhciBwMSA9IGljICsgMjsgLy8gZW5kcHRcblxuICAgICAgYnAweCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjQ5OTkpO1xuICAgICAgYnAweSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjQ5OTkpO1xuICAgICAgYnAxeCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjUpO1xuICAgICAgYnAxeSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjUpO1xuICAgIH1cbiAgICBkaXNwWCA9IGJwMXggLSBicDB4O1xuICAgIGRpc3BZID0gYnAxeSAtIGJwMHk7XG4gIH1cbiAgcnMubWlkdGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbiAgcnMubWlkRGlzcFggPSBkaXNwWDtcbiAgcnMubWlkRGlzcFkgPSBkaXNwWTtcblxuICAvLyBtaWQgc291cmNlXG4gIC8vXG5cbiAgZGlzcFggKj0gLTE7XG4gIGRpc3BZICo9IC0xO1xuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkgOyBlbHNlIGlmICghcnMuaXNSb3VuZCkge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgdmFyIGkzID0gaTIgKyAyO1xuICAgICAgZGlzcFggPSAtKHB0c1tpM10gLSBwdHNbaTJdKTtcbiAgICAgIGRpc3BZID0gLShwdHNbaTMgKyAxXSAtIHB0c1tpMiArIDFdKTtcbiAgICB9XG4gIH1cbiAgcnMubWlkc3JjQXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcblxuICAvLyB0YXJnZXRcbiAgLy9cblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIGRpc3BYID0gZW5kWCAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMl07XG4gICAgZGlzcFkgPSBlbmRZIC0gcnMuc2VncHRzW3JzLnNlZ3B0cy5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmIHx8IGlzQmV6aWVyKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgbCA9IHB0cy5sZW5ndGg7XG4gICAgdmFyIGJYID0gcWJlemllckF0KHB0c1tsIC0gNl0sIHB0c1tsIC0gNF0sIHB0c1tsIC0gMl0sIDAuOSk7XG4gICAgdmFyIGJZID0gcWJlemllckF0KHB0c1tsIC0gNV0sIHB0c1tsIC0gM10sIHB0c1tsIC0gMV0sIDAuOSk7XG4gICAgZGlzcFggPSBlbmRYIC0gYlg7XG4gICAgZGlzcFkgPSBlbmRZIC0gYlk7XG4gIH0gZWxzZSB7XG4gICAgZGlzcFggPSBlbmRYIC0gbWlkWDtcbiAgICBkaXNwWSA9IGVuZFkgLSBtaWRZO1xuICB9XG4gIHJzLnRndEFycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG59O1xuQlJwJGQuZ2V0QXJyb3dXaWR0aCA9IEJScCRkLmdldEFycm93SGVpZ2h0ID0gZnVuY3Rpb24gKGVkZ2VXaWR0aCwgc2NhbGUpIHtcbiAgdmFyIGNhY2hlID0gdGhpcy5hcnJvd1dpZHRoQ2FjaGUgPSB0aGlzLmFycm93V2lkdGhDYWNoZSB8fCB7fTtcbiAgdmFyIGNhY2hlZFZhbCA9IGNhY2hlW2VkZ2VXaWR0aCArICcsICcgKyBzY2FsZV07XG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG4gIGNhY2hlZFZhbCA9IE1hdGgubWF4KE1hdGgucG93KGVkZ2VXaWR0aCAqIDEzLjM3LCAwLjkpLCAyOSkgKiBzY2FsZTtcbiAgY2FjaGVbZWRnZVdpZHRoICsgJywgJyArIHNjYWxlXSA9IGNhY2hlZFZhbDtcbiAgcmV0dXJuIGNhY2hlZFZhbDtcbn07XG5cbi8qKlxuICogRXhwbGFpbmVkIGJ5IEJsaW5kbWFuNjcgYXQgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ0ODU2OTI1LzExMDI4ODI4XG4gKi9cblxuLy8gRGVjbGFyZSByZXVzZWQgdmFyaWFibGUgdG8gYXZvaWQgcmVhbGxvY2F0aW5nIHZhcmlhYmxlcyBldmVyeSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWRcbnZhciB4LFxuICB5LFxuICB2MSA9IHt9LFxuICB2MiA9IHt9LFxuICBzaW5BLFxuICBzaW5BOTAsXG4gIHJhZERpcmVjdGlvbixcbiAgZHJhd0RpcmVjdGlvbixcbiAgYW5nbGUsXG4gIGhhbGZBbmdsZSxcbiAgY1JhZGl1cyxcbiAgbGVuT3V0LFxuICByYWRpdXMsXG4gIGxpbWl0O1xudmFyIHN0YXJ0WCwgc3RhcnRZLCBzdG9wWCwgc3RvcFk7XG52YXIgbGFzdFBvaW50O1xuXG4vLyBjb252ZXJ0IDIgcG9pbnRzIGludG8gdmVjdG9yIGZvcm0sIHBvbGFyIGZvcm0sIGFuZCBub3JtYWxpc2VkXG52YXIgYXNWZWMgPSBmdW5jdGlvbiBhc1ZlYyhwLCBwcCwgdikge1xuICB2LnggPSBwcC54IC0gcC54O1xuICB2LnkgPSBwcC55IC0gcC55O1xuICB2LmxlbiA9IE1hdGguc3FydCh2LnggKiB2LnggKyB2LnkgKiB2LnkpO1xuICB2Lm54ID0gdi54IC8gdi5sZW47XG4gIHYubnkgPSB2LnkgLyB2LmxlbjtcbiAgdi5hbmcgPSBNYXRoLmF0YW4yKHYubnksIHYubngpO1xufTtcbnZhciBpbnZlcnRWZWMgPSBmdW5jdGlvbiBpbnZlcnRWZWMob3JpZ2luYWxWLCBpbnZlcnRlZFYpIHtcbiAgaW52ZXJ0ZWRWLnggPSBvcmlnaW5hbFYueCAqIC0xO1xuICBpbnZlcnRlZFYueSA9IG9yaWdpbmFsVi55ICogLTE7XG4gIGludmVydGVkVi5ueCA9IG9yaWdpbmFsVi5ueCAqIC0xO1xuICBpbnZlcnRlZFYubnkgPSBvcmlnaW5hbFYubnkgKiAtMTtcbiAgaW52ZXJ0ZWRWLmFuZyA9IG9yaWdpbmFsVi5hbmcgPiAwID8gLShNYXRoLlBJIC0gb3JpZ2luYWxWLmFuZykgOiBNYXRoLlBJICsgb3JpZ2luYWxWLmFuZztcbn07XG52YXIgY2FsY0Nvcm5lckFyYyA9IGZ1bmN0aW9uIGNhbGNDb3JuZXJBcmMocHJldmlvdXNQb2ludCwgY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHJhZGl1c01heCwgaXNBcmNSYWRpdXMpIHtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDFcbiAgcHJldmlvdXNQb2ludCAhPT0gbGFzdFBvaW50ID8gYXNWZWMoY3VycmVudFBvaW50LCBwcmV2aW91c1BvaW50LCB2MSkgOiBpbnZlcnRWZWModjIsIHYxKTsgLy8gQXZvaWQgcmVjYWxjdWxhdGluZyB2ZWMgaWYgaXQgaXMgdGhlIGludmVydCBvZiB0aGUgbGFzdCBvbmUgY2FsY3VsYXRlZFxuICBhc1ZlYyhjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgdjIpO1xuICBzaW5BID0gdjEubnggKiB2Mi5ueSAtIHYxLm55ICogdjIubng7XG4gIHNpbkE5MCA9IHYxLm54ICogdjIubnggLSB2MS5ueSAqIC12Mi5ueTtcbiAgYW5nbGUgPSBNYXRoLmFzaW4oTWF0aC5tYXgoLTEsIE1hdGgubWluKDEsIHNpbkEpKSk7XG4gIGlmIChNYXRoLmFicyhhbmdsZSkgPCAxZS02KSB7XG4gICAgeCA9IGN1cnJlbnRQb2ludC54O1xuICAgIHkgPSBjdXJyZW50UG9pbnQueTtcbiAgICBjUmFkaXVzID0gcmFkaXVzID0gMDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICByYWREaXJlY3Rpb24gPSAxO1xuICBkcmF3RGlyZWN0aW9uID0gZmFsc2U7XG4gIGlmIChzaW5BOTAgPCAwKSB7XG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgYW5nbGUgPSBNYXRoLlBJICsgYW5nbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gTWF0aC5QSSAtIGFuZ2xlO1xuICAgICAgcmFkRGlyZWN0aW9uID0gLTE7XG4gICAgICBkcmF3RGlyZWN0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFuZ2xlID4gMCkge1xuICAgICAgcmFkRGlyZWN0aW9uID0gLTE7XG4gICAgICBkcmF3RGlyZWN0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnRQb2ludC5yYWRpdXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IGN1cnJlbnRQb2ludC5yYWRpdXM7XG4gIH0gZWxzZSB7XG4gICAgcmFkaXVzID0gcmFkaXVzTWF4O1xuICB9XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCAyXG4gIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMjtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxpbWl0ID0gTWF0aC5taW4odjEubGVuIC8gMiwgdjIubGVuIC8gMik7XG4gIGlmIChpc0FyY1JhZGl1cykge1xuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQYXJ0IDNcbiAgICBsZW5PdXQgPSBNYXRoLmFicyhNYXRoLmNvcyhoYWxmQW5nbGUpICogcmFkaXVzIC8gTWF0aC5zaW4oaGFsZkFuZ2xlKSk7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3BlY2lhbCBwYXJ0IEFcbiAgICBpZiAobGVuT3V0ID4gbGltaXQpIHtcbiAgICAgIGxlbk91dCA9IGxpbWl0O1xuICAgICAgY1JhZGl1cyA9IE1hdGguYWJzKGxlbk91dCAqIE1hdGguc2luKGhhbGZBbmdsZSkgLyBNYXRoLmNvcyhoYWxmQW5nbGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY1JhZGl1cyA9IHJhZGl1cztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuT3V0ID0gTWF0aC5taW4obGltaXQsIHJhZGl1cyk7XG4gICAgY1JhZGl1cyA9IE1hdGguYWJzKGxlbk91dCAqIE1hdGguc2luKGhhbGZBbmdsZSkgLyBNYXRoLmNvcyhoYWxmQW5nbGUpKTtcbiAgfVxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDRcbiAgc3RvcFggPSBjdXJyZW50UG9pbnQueCArIHYyLm54ICogbGVuT3V0O1xuICBzdG9wWSA9IGN1cnJlbnRQb2ludC55ICsgdjIubnkgKiBsZW5PdXQ7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCA1XG4gIHggPSBzdG9wWCAtIHYyLm55ICogY1JhZGl1cyAqIHJhZERpcmVjdGlvbjtcbiAgeSA9IHN0b3BZICsgdjIubnggKiBjUmFkaXVzICogcmFkRGlyZWN0aW9uO1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEFkZGl0aW9uYWwgUGFydCA6IGNhbGN1bGF0ZSBzdGFydCBwb2ludCBFXG4gIHN0YXJ0WCA9IGN1cnJlbnRQb2ludC54ICsgdjEubnggKiBsZW5PdXQ7XG4gIHN0YXJ0WSA9IGN1cnJlbnRQb2ludC55ICsgdjEubnkgKiBsZW5PdXQ7XG5cbiAgLy8gU2F2ZSBsYXN0IHBvaW50IHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgdmVjdG9yIHdoZW4gbm90IG5lZWRlZFxuICBsYXN0UG9pbnQgPSBjdXJyZW50UG9pbnQ7XG59O1xuXG4vKipcbiAqIERyYXcgY29ybmVyIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRSb3VuZENvcm5lcn1cbiAqXG4gKiBAcGFyYW0gY3R4IDpDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAqIEBwYXJhbSByb3VuZENvcm5lciB7e2N4Om51bWJlciwgY3k6bnVtYmVyLCByYWRpdXM6bnVtYmVyLCBlbmRBbmdsZTogbnVtYmVyLCBzdGFydEFuZ2xlOiBudW1iZXIsIGNvdW50ZXJDbG9ja3dpc2U6IGJvb2xlYW59fVxuICovXG5mdW5jdGlvbiBkcmF3UHJlcGFyZWRSb3VuZENvcm5lcihjdHgsIHJvdW5kQ29ybmVyKSB7XG4gIGlmIChyb3VuZENvcm5lci5yYWRpdXMgPT09IDApIGN0eC5saW5lVG8ocm91bmRDb3JuZXIuY3gsIHJvdW5kQ29ybmVyLmN5KTtlbHNlIGN0eC5hcmMocm91bmRDb3JuZXIuY3gsIHJvdW5kQ29ybmVyLmN5LCByb3VuZENvcm5lci5yYWRpdXMsIHJvdW5kQ29ybmVyLnN0YXJ0QW5nbGUsIHJvdW5kQ29ybmVyLmVuZEFuZ2xlLCByb3VuZENvcm5lci5jb3VudGVyQ2xvY2t3aXNlKTtcbn1cblxuLyoqXG4gKiBHZXQgcm91bmQgY29ybmVyIGZyb20gYSBwb2ludCBhbmQgaXRzIHByZXZpb3VzIGFuZCBuZXh0IG5laWdoYm91cnMgaW4gYSBwYXRoXG4gKlxuICogQHBhcmFtIHByZXZpb3VzUG9pbnQge3t4OiBudW1iZXIsIHk6bnVtYmVyLCByYWRpdXM6IG51bWJlcj99fVxuICogQHBhcmFtIGN1cnJlbnRQb2ludCB7e3g6IG51bWJlciwgeTpudW1iZXIsIHJhZGl1czogbnVtYmVyP319XG4gKiBAcGFyYW0gbmV4dFBvaW50IHt7eDogbnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOiBudW1iZXI/fX1cbiAqIEBwYXJhbSByYWRpdXNNYXggOm51bWJlclxuICogQHBhcmFtIGlzQXJjUmFkaXVzIDpib29sZWFuXG4gKiBAcmV0dXJuIHt7XG4gKiBjeDpudW1iZXIsIGN5Om51bWJlciwgcmFkaXVzOm51bWJlcixcbiAqIHN0YXJ0WDpudW1iZXIsIHN0YXJ0WTpudW1iZXIsXG4gKiBzdG9wWDpudW1iZXIsIHN0b3BZOiBudW1iZXIsXG4gKiBlbmRBbmdsZTogbnVtYmVyLCBzdGFydEFuZ2xlOiBudW1iZXIsIGNvdW50ZXJDbG9ja3dpc2U6IGJvb2xlYW5cbiAqIH19XG4gKi9cbmZ1bmN0aW9uIGdldFJvdW5kQ29ybmVyKHByZXZpb3VzUG9pbnQsIGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCByYWRpdXNNYXgpIHtcbiAgdmFyIGlzQXJjUmFkaXVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICBpZiAocmFkaXVzTWF4ID09PSAwIHx8IGN1cnJlbnRQb2ludC5yYWRpdXMgPT09IDApIHJldHVybiB7XG4gICAgY3g6IGN1cnJlbnRQb2ludC54LFxuICAgIGN5OiBjdXJyZW50UG9pbnQueSxcbiAgICByYWRpdXM6IDAsXG4gICAgc3RhcnRYOiBjdXJyZW50UG9pbnQueCxcbiAgICBzdGFydFk6IGN1cnJlbnRQb2ludC55LFxuICAgIHN0b3BYOiBjdXJyZW50UG9pbnQueCxcbiAgICBzdG9wWTogY3VycmVudFBvaW50LnksXG4gICAgc3RhcnRBbmdsZTogdW5kZWZpbmVkLFxuICAgIGVuZEFuZ2xlOiB1bmRlZmluZWQsXG4gICAgY291bnRlckNsb2Nrd2lzZTogdW5kZWZpbmVkXG4gIH07XG4gIGNhbGNDb3JuZXJBcmMocHJldmlvdXNQb2ludCwgY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHJhZGl1c01heCwgaXNBcmNSYWRpdXMpO1xuICByZXR1cm4ge1xuICAgIGN4OiB4LFxuICAgIGN5OiB5LFxuICAgIHJhZGl1czogY1JhZGl1cyxcbiAgICBzdGFydFg6IHN0YXJ0WCxcbiAgICBzdGFydFk6IHN0YXJ0WSxcbiAgICBzdG9wWDogc3RvcFgsXG4gICAgc3RvcFk6IHN0b3BZLFxuICAgIHN0YXJ0QW5nbGU6IHYxLmFuZyArIE1hdGguUEkgLyAyICogcmFkRGlyZWN0aW9uLFxuICAgIGVuZEFuZ2xlOiB2Mi5hbmcgLSBNYXRoLlBJIC8gMiAqIHJhZERpcmVjdGlvbixcbiAgICBjb3VudGVyQ2xvY2t3aXNlOiBkcmF3RGlyZWN0aW9uXG4gIH07XG59XG5cbnZhciBCUnAkYyA9IHt9O1xuQlJwJGMuZmluZE1pZHB0UHRzRXRjID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIHZhciBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMsXG4gICAgaW50ZXJzZWN0aW9uUHRzID0gcGFpckluZm8uaW50ZXJzZWN0aW9uUHRzLFxuICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcGFpckluZm8udmVjdG9yTm9ybUludmVyc2U7XG4gIHZhciBtaWRwdFB0cztcblxuICAvLyBuLmIuIGFzc3VtZXMgYWxsIGVkZ2VzIGluIGJlemllciBidW5kbGUgaGF2ZSBzYW1lIGVuZHBvaW50cyBzcGVjaWZpZWRcbiAgdmFyIHNyY01hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1lbmRwb2ludCcpO1xuICB2YXIgdGd0TWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWVuZHBvaW50Jyk7XG4gIHZhciBoYXZlTWFudWFsRW5kUHRzID0gc3JjTWFuRW5kcHQudW5pdHMgIT0gbnVsbCAmJiB0Z3RNYW5FbmRwdC51bml0cyAhPSBudWxsO1xuICB2YXIgcmVjYWxjVmVjdG9yTm9ybUludmVyc2UgPSBmdW5jdGlvbiByZWNhbGNWZWN0b3JOb3JtSW52ZXJzZSh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHZhciBkeSA9IHkyIC0geTE7XG4gICAgdmFyIGR4ID0geDIgLSB4MTtcbiAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IC1keSAvIGwsXG4gICAgICB5OiBkeCAvIGxcbiAgICB9O1xuICB9O1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICBzd2l0Y2ggKGVkZ2VEaXN0YW5jZXMpIHtcbiAgICBjYXNlICdub2RlLXBvc2l0aW9uJzpcbiAgICAgIG1pZHB0UHRzID0gcG9zUHRzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW50ZXJzZWN0aW9uJzpcbiAgICAgIG1pZHB0UHRzID0gaW50ZXJzZWN0aW9uUHRzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kcG9pbnRzJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGhhdmVNYW51YWxFbmRQdHMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkbWFudWFsRW5kcHRUb1B4ID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS5zb3VyY2UoKVswXSwgc3JjTWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4MiA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeCwgMiksXG4gICAgICAgICAgICB4MSA9IF90aGlzJG1hbnVhbEVuZHB0VG9QeDJbMF0sXG4gICAgICAgICAgICB5MSA9IF90aGlzJG1hbnVhbEVuZHB0VG9QeDJbMV07XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeDMgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeChlZGdlLnRhcmdldCgpWzBdLCB0Z3RNYW5FbmRwdCksXG4gICAgICAgICAgICBfdGhpcyRtYW51YWxFbmRwdFRvUHg0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkbWFudWFsRW5kcHRUb1B4MywgMiksXG4gICAgICAgICAgICB4MiA9IF90aGlzJG1hbnVhbEVuZHB0VG9QeDRbMF0sXG4gICAgICAgICAgICB5MiA9IF90aGlzJG1hbnVhbEVuZHB0VG9QeDRbMV07XG4gICAgICAgICAgdmFyIGVuZFB0cyA9IHtcbiAgICAgICAgICAgIHgxOiB4MSxcbiAgICAgICAgICAgIHkxOiB5MSxcbiAgICAgICAgICAgIHgyOiB4MixcbiAgICAgICAgICAgIHkyOiB5MlxuICAgICAgICAgIH07XG4gICAgICAgICAgdmVjdG9yTm9ybUludmVyc2UgPSByZWNhbGNWZWN0b3JOb3JtSW52ZXJzZSh4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgbWlkcHRQdHMgPSBlbmRQdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybihcIkVkZ2UgXCIuY29uY2F0KGVkZ2UuaWQoKSwgXCIgaGFzIGVkZ2UtZGlzdGFuY2VzOmVuZHBvaW50cyBzcGVjaWZpZWQgd2l0aG91dCBtYW51YWwgZW5kcG9pbnRzIHNwZWNpZmllZCB2aWEgc291cmNlLWVuZHBvaW50IGFuZCB0YXJnZXQtZW5kcG9pbnQuICBGYWxsaW5nIGJhY2sgb24gZWRnZS1kaXN0YW5jZXM6aW50ZXJzZWN0aW9uIChkZWZhdWx0KS5cIikpO1xuICAgICAgICAgIG1pZHB0UHRzID0gaW50ZXJzZWN0aW9uUHRzOyAvLyBiYWNrIHRvIGRlZmF1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbWlkcHRQdHM6IG1pZHB0UHRzLFxuICAgIHZlY3Rvck5vcm1JbnZlcnNlOiB2ZWN0b3JOb3JtSW52ZXJzZVxuICB9O1xufTtcbkJScCRjLmZpbmRIYXlzdGFja1BvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgIGlmICghcnMuaGF5c3RhY2spIHtcbiAgICAgIHZhciBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcbiAgICAgIHJzLnNvdXJjZSA9IHtcbiAgICAgICAgeDogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICB5OiBNYXRoLnNpbihhbmdsZSlcbiAgICAgIH07XG4gICAgICBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcbiAgICAgIHJzLnRhcmdldCA9IHtcbiAgICAgICAgeDogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICB5OiBNYXRoLnNpbihhbmdsZSlcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3JjUG9zID0gc3JjLnBvc2l0aW9uKCk7XG4gICAgdmFyIHRndFBvcyA9IHRndC5wb3NpdGlvbigpO1xuICAgIHZhciBzcmNXID0gc3JjLndpZHRoKCk7XG4gICAgdmFyIHRndFcgPSB0Z3Qud2lkdGgoKTtcbiAgICB2YXIgc3JjSCA9IHNyYy5oZWlnaHQoKTtcbiAgICB2YXIgdGd0SCA9IHRndC5oZWlnaHQoKTtcbiAgICB2YXIgcmFkaXVzID0gZWRnZS5wc3R5bGUoJ2hheXN0YWNrLXJhZGl1cycpLnZhbHVlO1xuICAgIHZhciBoYWxmUmFkaXVzID0gcmFkaXVzIC8gMjsgLy8gYi9jIGhhdmUgdG8gaGFsZiB3aWR0aC9oZWlnaHRcblxuICAgIHJzLmhheXN0YWNrUHRzID0gcnMuYWxscHRzID0gW3JzLnNvdXJjZS54ICogc3JjVyAqIGhhbGZSYWRpdXMgKyBzcmNQb3MueCwgcnMuc291cmNlLnkgKiBzcmNIICogaGFsZlJhZGl1cyArIHNyY1Bvcy55LCBycy50YXJnZXQueCAqIHRndFcgKiBoYWxmUmFkaXVzICsgdGd0UG9zLngsIHJzLnRhcmdldC55ICogdGd0SCAqIGhhbGZSYWRpdXMgKyB0Z3RQb3MueV07XG4gICAgcnMubWlkWCA9IChycy5hbGxwdHNbMF0gKyBycy5hbGxwdHNbMl0pIC8gMjtcbiAgICBycy5taWRZID0gKHJzLmFsbHB0c1sxXSArIHJzLmFsbHB0c1szXSkgLyAyO1xuXG4gICAgLy8gYWx3YXlzIG92ZXJyaWRlIGFzIGhheXN0YWNrIGluIGNhc2Ugc2V0IHRvIGRpZmZlcmVudCB0eXBlIHByZXZpb3VzbHlcbiAgICBycy5lZGdlVHlwZSA9ICdoYXlzdGFjayc7XG4gICAgcnMuaGF5c3RhY2sgPSB0cnVlO1xuICAgIHRoaXMuc3RvcmVFZGdlUHJvamVjdGlvbnMoZWRnZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhlZGdlKTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMoZWRnZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhlZGdlKTtcbiAgfVxufTtcbkJScCRjLmZpbmRTZWdtZW50c1BvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICAvLyBTZWdtZW50cyAobXVsdGlwbGUgc3RyYWlnaHQgbGluZXMpXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHNlZ21lbnRXcyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LXdlaWdodHMnKTtcbiAgdmFyIHNlZ21lbnREcyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LWRpc3RhbmNlcycpO1xuICB2YXIgc2VnbWVudFJzID0gZWRnZS5wc3R5bGUoJ3NlZ21lbnQtcmFkaWknKTtcbiAgdmFyIHNlZ21lbnRUcyA9IGVkZ2UucHN0eWxlKCdyYWRpdXMtdHlwZScpO1xuICB2YXIgc2VnbWVudHNOID0gTWF0aC5taW4oc2VnbWVudFdzLnBmVmFsdWUubGVuZ3RoLCBzZWdtZW50RHMucGZWYWx1ZS5sZW5ndGgpO1xuICB2YXIgbGFzdFJhZGl1cyA9IHNlZ21lbnRScy5wZlZhbHVlW3NlZ21lbnRScy5wZlZhbHVlLmxlbmd0aCAtIDFdO1xuICB2YXIgbGFzdFJhZGl1c1R5cGUgPSBzZWdtZW50VHMucGZWYWx1ZVtzZWdtZW50VHMucGZWYWx1ZS5sZW5ndGggLSAxXTtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICBycy5zZWdwdHMgPSBbXTtcbiAgcnMucmFkaWkgPSBbXTtcbiAgcnMuaXNBcmNSYWRpdXMgPSBbXTtcbiAgZm9yICh2YXIgcyA9IDA7IHMgPCBzZWdtZW50c047IHMrKykge1xuICAgIHZhciB3ID0gc2VnbWVudFdzLnBmVmFsdWVbc107XG4gICAgdmFyIGQgPSBzZWdtZW50RHMucGZWYWx1ZVtzXTtcbiAgICB2YXIgdzEgPSAxIC0gdztcbiAgICB2YXIgdzIgPSB3O1xuICAgIHZhciBfdGhpcyRmaW5kTWlkcHRQdHNFdGMgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0Yy5taWRwdFB0cyxcbiAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjLnZlY3Rvck5vcm1JbnZlcnNlO1xuICAgIHZhciBhZGp1c3RlZE1pZHB0ID0ge1xuICAgICAgeDogbWlkcHRQdHMueDEgKiB3MSArIG1pZHB0UHRzLngyICogdzIsXG4gICAgICB5OiBtaWRwdFB0cy55MSAqIHcxICsgbWlkcHRQdHMueTIgKiB3MlxuICAgIH07XG4gICAgcnMuc2VncHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGQsIGFkanVzdGVkTWlkcHQueSArIHZlY3Rvck5vcm1JbnZlcnNlLnkgKiBkKTtcbiAgICBycy5yYWRpaS5wdXNoKHNlZ21lbnRScy5wZlZhbHVlW3NdICE9PSB1bmRlZmluZWQgPyBzZWdtZW50UnMucGZWYWx1ZVtzXSA6IGxhc3RSYWRpdXMpO1xuICAgIHJzLmlzQXJjUmFkaXVzLnB1c2goKHNlZ21lbnRUcy5wZlZhbHVlW3NdICE9PSB1bmRlZmluZWQgPyBzZWdtZW50VHMucGZWYWx1ZVtzXSA6IGxhc3RSYWRpdXNUeXBlKSA9PT0gJ2FyYy1yYWRpdXMnKTtcbiAgfVxufTtcbkJScCRjLmZpbmRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgLy8gU2VsZi1lZGdlXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGRpckNvdW50cyA9IHBhaXJJbmZvLmRpckNvdW50cyxcbiAgICBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3M7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGxvb3BEaXIgPSBlZGdlLnBzdHlsZSgnbG9vcC1kaXJlY3Rpb24nKS5wZlZhbHVlO1xuICB2YXIgbG9vcFN3cCA9IGVkZ2UucHN0eWxlKCdsb29wLXN3ZWVwJykucGZWYWx1ZTtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgcnMuZWRnZVR5cGUgPSAnc2VsZic7XG4gIHZhciBqID0gaTtcbiAgdmFyIGxvb3BEaXN0ID0gc3RlcFNpemU7XG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cbiAgdmFyIGxvb3BBbmdsZSA9IGxvb3BEaXIgLSBNYXRoLlBJIC8gMjtcbiAgdmFyIG91dEFuZ2xlID0gbG9vcEFuZ2xlIC0gbG9vcFN3cCAvIDI7XG4gIHZhciBpbkFuZ2xlID0gbG9vcEFuZ2xlICsgbG9vcFN3cCAvIDI7XG5cbiAgLy8gaW5jcmVhc2UgYnkgc3RlcCBzaXplIGZvciBvdmVybGFwcGluZyBsb29wcywga2V5ZWQgb24gZGlyZWN0aW9uIGFuZCBzd2VlcCB2YWx1ZXNcbiAgdmFyIGRjID0gU3RyaW5nKGxvb3BEaXIgKyAnXycgKyBsb29wU3dwKTtcbiAgaiA9IGRpckNvdW50c1tkY10gPT09IHVuZGVmaW5lZCA/IGRpckNvdW50c1tkY10gPSAwIDogKytkaXJDb3VudHNbZGNdO1xuICBycy5jdHJscHRzID0gW3NyY1Bvcy54ICsgTWF0aC5jb3Mob3V0QW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueCArIE1hdGguY29zKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihpbkFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSldO1xufTtcbkJScCRjLmZpbmRDb21wb3VuZExvb3BQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8sIGksIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAvLyBDb21wb3VuZCBlZGdlXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnY29tcG91bmQnO1xuICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgIHRndFBvcyA9IHBhaXJJbmZvLnRndFBvcyxcbiAgICBzcmNXID0gcGFpckluZm8uc3JjVyxcbiAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICB0Z3RXID0gcGFpckluZm8udGd0VyxcbiAgICB0Z3RIID0gcGFpckluZm8udGd0SDtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG4gIHZhciBsb29wVyA9IDUwO1xuICB2YXIgbG9vcGFQb3MgPSB7XG4gICAgeDogc3JjUG9zLnggLSBzcmNXIC8gMixcbiAgICB5OiBzcmNQb3MueSAtIHNyY0ggLyAyXG4gIH07XG4gIHZhciBsb29wYlBvcyA9IHtcbiAgICB4OiB0Z3RQb3MueCAtIHRndFcgLyAyLFxuICAgIHk6IHRndFBvcy55IC0gdGd0SCAvIDJcbiAgfTtcbiAgdmFyIGxvb3BQb3MgPSB7XG4gICAgeDogTWF0aC5taW4obG9vcGFQb3MueCwgbG9vcGJQb3MueCksXG4gICAgeTogTWF0aC5taW4obG9vcGFQb3MueSwgbG9vcGJQb3MueSlcbiAgfTtcblxuICAvLyBhdm9pZHMgY2FzZXMgd2l0aCBpbXBvc3NpYmxlIGJlemllcnNcbiAgdmFyIG1pbkNvbXBvdW5kU3RyZXRjaCA9IDAuNTtcbiAgdmFyIGNvbXBvdW5kU3RyZXRjaEEgPSBNYXRoLm1heChtaW5Db21wb3VuZFN0cmV0Y2gsIE1hdGgubG9nKHNyY1cgKiAwLjAxKSk7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hCID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyh0Z3RXICogMC4wMSkpO1xuICBycy5jdHJscHRzID0gW2xvb3BQb3MueCwgbG9vcFBvcy55IC0gKDEgKyBNYXRoLnBvdyhsb29wVywgMS4xMikgLyAxMDApICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSAqIGNvbXBvdW5kU3RyZXRjaEEsIGxvb3BQb3MueCAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hCLCBsb29wUG9zLnldO1xufTtcbkJScCRjLmZpbmRTdHJhaWdodEVkZ2VQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICAvLyBTdHJhaWdodCBlZGdlIHdpdGhpbiBidW5kbGVcblxuICBlZGdlLl9wcml2YXRlLnJzY3JhdGNoLmVkZ2VUeXBlID0gJ3N0cmFpZ2h0Jztcbn07XG5CUnAkYy5maW5kQmV6aWVyUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHRXcyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXdlaWdodHMnKTtcbiAgdmFyIGJlemllck4gPSBjdHJscHREaXN0cyAmJiBjdHJscHRXcyA/IE1hdGgubWluKGN0cmxwdERpc3RzLnZhbHVlLmxlbmd0aCwgY3RybHB0V3MudmFsdWUubGVuZ3RoKSA6IDE7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgY3RybHB0V2VpZ2h0ID0gY3RybHB0V3MudmFsdWVbMF07XG5cbiAgLy8gKE11bHRpKWJlemllclxuXG4gIHZhciBtdWx0aSA9IGVkZ2VJc1VuYnVuZGxlZDtcbiAgcnMuZWRnZVR5cGUgPSBtdWx0aSA/ICdtdWx0aWJlemllcicgOiAnYmV6aWVyJztcbiAgcnMuY3RybHB0cyA9IFtdO1xuICBmb3IgKHZhciBiID0gMDsgYiA8IGJlemllck47IGIrKykge1xuICAgIHZhciBub3JtY3RybHB0RGlzdCA9ICgwLjUgLSBwYWlySW5mby5lbGVzLmxlbmd0aCAvIDIgKyBpKSAqIHN0ZXBTaXplICogKGVkZ2VJc1N3YXBwZWQgPyAtMSA6IDEpO1xuICAgIHZhciBtYW5jdHJscHREaXN0ID0gdm9pZCAwO1xuICAgIHZhciBzaWduID0gc2lnbnVtKG5vcm1jdHJscHREaXN0KTtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbYl0gOiBzdGVwU2l6ZTsgLy8gZmFsbCBiYWNrIG9uIHN0ZXAgc2l6ZVxuICAgICAgY3RybHB0V2VpZ2h0ID0gY3RybHB0V3MudmFsdWVbYl07XG4gICAgfVxuICAgIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICAgIC8vIG11bHRpIG9yIHNpbmdsZSB1bmJ1bmRsZWRcbiAgICAgIG1hbmN0cmxwdERpc3QgPSBjdHJscHREaXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdCAhPT0gdW5kZWZpbmVkID8gc2lnbiAqIGN0cmxwdERpc3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBkaXN0YW5jZUZyb21NaWRwb2ludCA9IG1hbmN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IG1hbmN0cmxwdERpc3QgOiBub3JtY3RybHB0RGlzdDtcbiAgICB2YXIgdzEgPSAxIC0gY3RybHB0V2VpZ2h0O1xuICAgIHZhciB3MiA9IGN0cmxwdFdlaWdodDtcbiAgICB2YXIgX3RoaXMkZmluZE1pZHB0UHRzRXRjMiA9IHRoaXMuZmluZE1pZHB0UHRzRXRjKGVkZ2UsIHBhaXJJbmZvKSxcbiAgICAgIG1pZHB0UHRzID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjMi5taWRwdFB0cyxcbiAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjMi52ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICB2YXIgYWRqdXN0ZWRNaWRwdCA9IHtcbiAgICAgIHg6IG1pZHB0UHRzLngxICogdzEgKyBtaWRwdFB0cy54MiAqIHcyLFxuICAgICAgeTogbWlkcHRQdHMueTEgKiB3MSArIG1pZHB0UHRzLnkyICogdzJcbiAgICB9O1xuICAgIHJzLmN0cmxwdHMucHVzaChhZGp1c3RlZE1pZHB0LnggKyB2ZWN0b3JOb3JtSW52ZXJzZS54ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQsIGFkanVzdGVkTWlkcHQueSArIHZlY3Rvck5vcm1JbnZlcnNlLnkgKiBkaXN0YW5jZUZyb21NaWRwb2ludCk7XG4gIH1cbn07XG5CUnAkYy5maW5kVGF4aVBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICAvLyBUYXhpY2FiIGdlb21ldHJ5IHdpdGggdHdvIHR1cm5zIG1heGltdW1cblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBycy5lZGdlVHlwZSA9ICdzZWdtZW50cyc7XG4gIHZhciBWRVJUSUNBTCA9ICd2ZXJ0aWNhbCc7XG4gIHZhciBIT1JJWk9OVEFMID0gJ2hvcml6b250YWwnO1xuICB2YXIgTEVGVFdBUkQgPSAnbGVmdHdhcmQnO1xuICB2YXIgUklHSFRXQVJEID0gJ3JpZ2h0d2FyZCc7XG4gIHZhciBET1dOV0FSRCA9ICdkb3dud2FyZCc7XG4gIHZhciBVUFdBUkQgPSAndXB3YXJkJztcbiAgdmFyIEFVVE8gPSAnYXV0byc7XG4gIHZhciBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMsXG4gICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgc3JjSCA9IHBhaXJJbmZvLnNyY0gsXG4gICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBlZGdlRGlzdGFuY2VzID0gZWRnZS5wc3R5bGUoJ2VkZ2UtZGlzdGFuY2VzJykudmFsdWU7XG4gIHZhciBkSW5jbHVkZXNOb2RlQm9keSA9IGVkZ2VEaXN0YW5jZXMgIT09ICdub2RlLXBvc2l0aW9uJztcbiAgdmFyIHRheGlEaXIgPSBlZGdlLnBzdHlsZSgndGF4aS1kaXJlY3Rpb24nKS52YWx1ZTtcbiAgdmFyIHJhd1RheGlEaXIgPSB0YXhpRGlyOyAvLyB1bnByb2Nlc3NlZCB2YWx1ZVxuICB2YXIgdGF4aVR1cm4gPSBlZGdlLnBzdHlsZSgndGF4aS10dXJuJyk7XG4gIHZhciB0dXJuSXNQZXJjZW50ID0gdGF4aVR1cm4udW5pdHMgPT09ICclJztcbiAgdmFyIHRheGlUdXJuUGZWYWwgPSB0YXhpVHVybi5wZlZhbHVlO1xuICB2YXIgdHVybklzTmVnYXRpdmUgPSB0YXhpVHVyblBmVmFsIDwgMDsgLy8gaS5lLiBmcm9tIHRhcmdldCBzaWRlXG4gIHZhciBtaW5EID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybi1taW4tZGlzdGFuY2UnKS5wZlZhbHVlO1xuICB2YXIgZHcgPSBkSW5jbHVkZXNOb2RlQm9keSA/IChzcmNXICsgdGd0VykgLyAyIDogMDtcbiAgdmFyIGRoID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjSCArIHRndEgpIC8gMiA6IDA7XG4gIHZhciBwZHggPSBwb3NQdHMueDIgLSBwb3NQdHMueDE7XG4gIHZhciBwZHkgPSBwb3NQdHMueTIgLSBwb3NQdHMueTE7XG5cbiAgLy8gdGFrZSBhd2F5IHRoZSBlZmZlY3RpdmUgdy9oIGZyb20gdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGVsdGEgdmFsdWVcbiAgdmFyIHN1YkRXSCA9IGZ1bmN0aW9uIHN1YkRXSChkeHksIGR3aCkge1xuICAgIGlmIChkeHkgPiAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoZHh5IC0gZHdoLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hdGgubWluKGR4eSArIGR3aCwgMCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHggPSBzdWJEV0gocGR4LCBkdyk7XG4gIHZhciBkeSA9IHN1YkRXSChwZHksIGRoKTtcbiAgdmFyIGlzRXhwbGljaXREaXIgPSBmYWxzZTtcbiAgaWYgKHJhd1RheGlEaXIgPT09IEFVVE8pIHtcbiAgICB0YXhpRGlyID0gTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpID8gSE9SSVpPTlRBTCA6IFZFUlRJQ0FMO1xuICB9IGVsc2UgaWYgKHJhd1RheGlEaXIgPT09IFVQV0FSRCB8fCByYXdUYXhpRGlyID09PSBET1dOV0FSRCkge1xuICAgIHRheGlEaXIgPSBWRVJUSUNBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBMRUZUV0FSRCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQpIHtcbiAgICB0YXhpRGlyID0gSE9SSVpPTlRBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfVxuICB2YXIgaXNWZXJ0ID0gdGF4aURpciA9PT0gVkVSVElDQUw7XG4gIHZhciBsID0gaXNWZXJ0ID8gZHkgOiBkeDtcbiAgdmFyIHBsID0gaXNWZXJ0ID8gcGR5IDogcGR4O1xuICB2YXIgc2duTCA9IHNpZ251bShwbCk7XG4gIHZhciBmb3JjZWREaXIgPSBmYWxzZTtcbiAgaWYgKCEoaXNFeHBsaWNpdERpciAmJiAodHVybklzUGVyY2VudCB8fCB0dXJuSXNOZWdhdGl2ZSkpIC8vIGZvcmNpbmcgaW4gdGhpcyBjYXNlIHdvdWxkIGNhdXNlIHdlaXJkIGdyb3dpbmcgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAmJiAocmF3VGF4aURpciA9PT0gRE9XTldBUkQgJiYgcGwgPCAwIHx8IHJhd1RheGlEaXIgPT09IFVQV0FSRCAmJiBwbCA+IDAgfHwgcmF3VGF4aURpciA9PT0gTEVGVFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IFJJR0hUV0FSRCAmJiBwbCA8IDApKSB7XG4gICAgc2duTCAqPSAtMTtcbiAgICBsID0gc2duTCAqIE1hdGguYWJzKGwpO1xuICAgIGZvcmNlZERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGQ7XG4gIGlmICh0dXJuSXNQZXJjZW50KSB7XG4gICAgdmFyIHAgPSB0YXhpVHVyblBmVmFsIDwgMCA/IDEgKyB0YXhpVHVyblBmVmFsIDogdGF4aVR1cm5QZlZhbDtcbiAgICBkID0gcCAqIGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGsgPSB0YXhpVHVyblBmVmFsIDwgMCA/IGwgOiAwO1xuICAgIGQgPSBrICsgdGF4aVR1cm5QZlZhbCAqIHNnbkw7XG4gIH1cbiAgdmFyIGdldElzVG9vQ2xvc2UgPSBmdW5jdGlvbiBnZXRJc1Rvb0Nsb3NlKGQpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZCkgPCBtaW5EIHx8IE1hdGguYWJzKGQpID49IE1hdGguYWJzKGwpO1xuICB9O1xuICB2YXIgaXNUb29DbG9zZVNyYyA9IGdldElzVG9vQ2xvc2UoZCk7XG4gIHZhciBpc1Rvb0Nsb3NlVGd0ID0gZ2V0SXNUb29DbG9zZShNYXRoLmFicyhsKSAtIE1hdGguYWJzKGQpKTtcbiAgdmFyIGlzVG9vQ2xvc2UgPSBpc1Rvb0Nsb3NlU3JjIHx8IGlzVG9vQ2xvc2VUZ3Q7XG4gIGlmIChpc1Rvb0Nsb3NlICYmICFmb3JjZWREaXIpIHtcbiAgICAvLyBub24taWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIC8vIHZlcnRpY2FsIGZhbGxiYWNrc1xuICAgICAgdmFyIGxTaGFwZUluc2lkZVNyYyA9IE1hdGguYWJzKHBsKSA8PSBzcmNIIC8gMjtcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVUZ3QgPSBNYXRoLmFicyhwZHgpIDw9IHRndFcgLyAyO1xuICAgICAgaWYgKGxTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeCA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIHkxID0gcG9zUHRzLnkxLFxuICAgICAgICAgIHkyID0gcG9zUHRzLnkyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeCwgeTEsIHgsIHkyXTtcbiAgICAgIH0gZWxzZSBpZiAobFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQpXG4gICAgICAgIHZhciB5ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgeDEgPSBwb3NQdHMueDEsXG4gICAgICAgICAgeDIgPSBwb3NQdHMueDI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFt4MSwgeSwgeDIsIHldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSBmYWxsYmFjayAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCB3aXRoIHRyZWUgc2libGluZ3MpXG4gICAgICAgIHJzLnNlZ3B0cyA9IFtwb3NQdHMueDEsIHBvc1B0cy55Ml07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvcml6b250YWwgZmFsbGJhY2tzXG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVNyYyA9IE1hdGguYWJzKHBsKSA8PSBzcmNXIC8gMjtcbiAgICAgIHZhciBfbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR5KSA8PSB0Z3RIIC8gMjtcbiAgICAgIGlmIChfbFNoYXBlSW5zaWRlU3JjKSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3kgPSAocG9zUHRzLnkxICsgcG9zUHRzLnkyKSAvIDI7XG4gICAgICAgIHZhciBfeCA9IHBvc1B0cy54MSxcbiAgICAgICAgICBfeDIgPSBwb3NQdHMueDI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeCwgX3ksIF94MiwgX3ldO1xuICAgICAgfSBlbHNlIGlmIChfbFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIGhvcml6b250YWwgWi1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3gzID0gKHBvc1B0cy54MSArIHBvc1B0cy54MikgLyAyO1xuICAgICAgICB2YXIgX3kyID0gcG9zUHRzLnkxLFxuICAgICAgICAgIF95MyA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW194MywgX3kyLCBfeDMsIF95M107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMLXNoYXBlICh0dXJuIGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQsIGJ1dCB3b3JrcyB3ZWxsIGZvciB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngyLCBwb3NQdHMueTFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBpZGVhbCByb3V0aW5nXG4gICAgaWYgKGlzVmVydCkge1xuICAgICAgdmFyIF95NCA9IHBvc1B0cy55MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNIIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeDQgPSBwb3NQdHMueDEsXG4gICAgICAgIF94NSA9IHBvc1B0cy54MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDQsIF95NCwgX3g1LCBfeTRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsXG4gICAgICB2YXIgX3g2ID0gcG9zUHRzLngxICsgZCArIChkSW5jbHVkZXNOb2RlQm9keSA/IHNyY1cgLyAyICogc2duTCA6IDApO1xuICAgICAgdmFyIF95NSA9IHBvc1B0cy55MSxcbiAgICAgICAgX3k2ID0gcG9zUHRzLnkyO1xuICAgICAgcnMuc2VncHRzID0gW194NiwgX3k1LCBfeDYsIF95Nl07XG4gICAgfVxuICB9XG4gIGlmIChycy5pc1JvdW5kKSB7XG4gICAgdmFyIHJhZGl1cyA9IGVkZ2UucHN0eWxlKCd0YXhpLXJhZGl1cycpLnZhbHVlO1xuICAgIHZhciBpc0FyY1JhZGl1cyA9IGVkZ2UucHN0eWxlKCdyYWRpdXMtdHlwZScpLnZhbHVlWzBdID09PSAnYXJjLXJhZGl1cyc7XG4gICAgcnMucmFkaWkgPSBuZXcgQXJyYXkocnMuc2VncHRzLmxlbmd0aCAvIDIpLmZpbGwocmFkaXVzKTtcbiAgICBycy5pc0FyY1JhZGl1cyA9IG5ldyBBcnJheShycy5zZWdwdHMubGVuZ3RoIC8gMikuZmlsbChpc0FyY1JhZGl1cyk7XG4gIH1cbn07XG5CUnAkYy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgLy8gY2FuIG9ubHkgY29ycmVjdCBiZXppZXJzIGZvciBub3cuLi5cbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJykge1xuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MsXG4gICAgICB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MsXG4gICAgICBzcmNXID0gcGFpckluZm8uc3JjVyxcbiAgICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgICB0Z3RIID0gcGFpckluZm8udGd0SCxcbiAgICAgIHNyY1NoYXBlID0gcGFpckluZm8uc3JjU2hhcGUsXG4gICAgICB0Z3RTaGFwZSA9IHBhaXJJbmZvLnRndFNoYXBlLFxuICAgICAgc3JjQ29ybmVyUmFkaXVzID0gcGFpckluZm8uc3JjQ29ybmVyUmFkaXVzLFxuICAgICAgdGd0Q29ybmVyUmFkaXVzID0gcGFpckluZm8udGd0Q29ybmVyUmFkaXVzLFxuICAgICAgc3JjUnMgPSBwYWlySW5mby5zcmNScyxcbiAgICAgIHRndFJzID0gcGFpckluZm8udGd0UnM7XG4gICAgdmFyIGJhZFN0YXJ0ID0gIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSk7XG4gICAgdmFyIGJhZEFTdGFydCA9ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WCkgfHwgIW51bWJlciQxKHJzLmFycm93U3RhcnRZKTtcbiAgICB2YXIgYmFkRW5kID0gIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKTtcbiAgICB2YXIgYmFkQUVuZCA9ICFudW1iZXIkMShycy5hcnJvd0VuZFgpIHx8ICFudW1iZXIkMShycy5hcnJvd0VuZFkpO1xuICAgIHZhciBtaW5DcEFEaXN0RmFjdG9yID0gMztcbiAgICB2YXIgYXJyb3dXID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMuYXJyb3dTaGFwZVdpZHRoO1xuICAgIHZhciBtaW5DcEFEaXN0ID0gbWluQ3BBRGlzdEZhY3RvciAqIGFycm93VztcbiAgICB2YXIgc3RhcnRBQ3BEaXN0ID0gZGlzdCh7XG4gICAgICB4OiBycy5jdHJscHRzWzBdLFxuICAgICAgeTogcnMuY3RybHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IHJzLnN0YXJ0WCxcbiAgICAgIHk6IHJzLnN0YXJ0WVxuICAgIH0pO1xuICAgIHZhciBjbG9zZVN0YXJ0QUNwID0gc3RhcnRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgZW5kQUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5lbmRYLFxuICAgICAgeTogcnMuZW5kWVxuICAgIH0pO1xuICAgIHZhciBjbG9zZUVuZEFDcCA9IGVuZEFDcERpc3QgPCBtaW5DcEFEaXN0O1xuICAgIHZhciBvdmVybGFwcGluZyA9IGZhbHNlO1xuICAgIGlmIChiYWRTdGFydCB8fCBiYWRBU3RhcnQgfHwgY2xvc2VTdGFydEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHNyYyBjZW50cmUgdG8gb3V0c2lkZSB0aGUgc3JjIHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG4gICAgICB2YXIgY3BEID0ge1xuICAgICAgICAvLyBkZWx0YVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdIC0gc3JjUG9zLngsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gLSBzcmNQb3MueVxuICAgICAgfTtcbiAgICAgIHZhciBjcEwgPSBNYXRoLnNxcnQoY3BELnggKiBjcEQueCArIGNwRC55ICogY3BELnkpOyAvLyBsZW5ndGggb2YgbGluZVxuICAgICAgdmFyIGNwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBjcEQueCAvIGNwTCxcbiAgICAgICAgeTogY3BELnkgLyBjcExcbiAgICAgIH07XG4gICAgICB2YXIgcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgY3BQcm9qID0ge1xuICAgICAgICAvLyAqMiByYWRpdXMgZ3VhcmFudGVlcyBvdXRzaWRlIHNoYXBlXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gKyBjcE0ueCAqIDIgKiByYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBjcE0ueSAqIDIgKiByYWRpdXNcbiAgICAgIH07XG4gICAgICB2YXIgc3JjQ3RybFB0SW50biA9IHNyY1NoYXBlLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzcmNXLCBzcmNILCBjcFByb2oueCwgY3BQcm9qLnksIDAsIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgICAgaWYgKGNsb3NlU3RhcnRBQ3ApIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHJzLmN0cmxwdHNbMF0gKyBjcE0ueCAqIChtaW5DcEFEaXN0IC0gc3RhcnRBQ3BEaXN0KTtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHJzLmN0cmxwdHNbMV0gKyBjcE0ueSAqIChtaW5DcEFEaXN0IC0gc3RhcnRBQ3BEaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBzcmNDdHJsUHRJbnRuWzBdICsgY3BNLnggKiBtaW5DcEFEaXN0O1xuICAgICAgICBycy5jdHJscHRzWzFdID0gc3JjQ3RybFB0SW50blsxXSArIGNwTS55ICogbWluQ3BBRGlzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhZEVuZCB8fCBiYWRBRW5kIHx8IGNsb3NlRW5kQUNwKSB7XG4gICAgICBvdmVybGFwcGluZyA9IHRydWU7XG5cbiAgICAgIC8vIHByb2plY3QgY29udHJvbCBwb2ludCBhbG9uZyBsaW5lIGZyb20gdGd0IGNlbnRyZSB0byBvdXRzaWRlIHRoZSB0Z3Qgc2hhcGVcbiAgICAgIC8vIChvdGhlcndpc2UgaW50ZXJzZWN0aW9uIHdpbGwgeWllbGQgbm90aGluZylcbiAgICAgIHZhciBfY3BEID0ge1xuICAgICAgICAvLyBkZWx0YVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdIC0gdGd0UG9zLngsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gLSB0Z3RQb3MueVxuICAgICAgfTtcbiAgICAgIHZhciBfY3BMID0gTWF0aC5zcXJ0KF9jcEQueCAqIF9jcEQueCArIF9jcEQueSAqIF9jcEQueSk7IC8vIGxlbmd0aCBvZiBsaW5lXG4gICAgICB2YXIgX2NwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBfY3BELnggLyBfY3BMLFxuICAgICAgICB5OiBfY3BELnkgLyBfY3BMXG4gICAgICB9O1xuICAgICAgdmFyIF9yYWRpdXMgPSBNYXRoLm1heChzcmNXLCBzcmNIKTtcbiAgICAgIHZhciBfY3BQcm9qID0ge1xuICAgICAgICAvLyAqMiByYWRpdXMgZ3VhcmFudGVlcyBvdXRzaWRlIHNoYXBlXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gKyBfY3BNLnggKiAyICogX3JhZGl1cyxcbiAgICAgICAgeTogcnMuY3RybHB0c1sxXSArIF9jcE0ueSAqIDIgKiBfcmFkaXVzXG4gICAgICB9O1xuICAgICAgdmFyIHRndEN0cmxQdEludG4gPSB0Z3RTaGFwZS5pbnRlcnNlY3RMaW5lKHRndFBvcy54LCB0Z3RQb3MueSwgdGd0VywgdGd0SCwgX2NwUHJvai54LCBfY3BQcm9qLnksIDAsIHRndENvcm5lclJhZGl1cywgdGd0UnMpO1xuICAgICAgaWYgKGNsb3NlRW5kQUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgX2NwTS54ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAobWluQ3BBRGlzdCAtIGVuZEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHRndEN0cmxQdEludG5bMF0gKyBfY3BNLnggKiBtaW5DcEFEaXN0O1xuICAgICAgICBycy5jdHJscHRzWzFdID0gdGd0Q3RybFB0SW50blsxXSArIF9jcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVybGFwcGluZykge1xuICAgICAgLy8gcmVjYWxjIGVuZHB0c1xuICAgICAgdGhpcy5maW5kRW5kcG9pbnRzKGVkZ2UpO1xuICAgIH1cbiAgfVxufTtcbkJScCRjLnN0b3JlQWxscHRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuICAgIGZvciAodmFyIGIgPSAwOyBiICsgMSA8IHJzLmN0cmxwdHMubGVuZ3RoOyBiICs9IDIpIHtcbiAgICAgIC8vIGN0cmwgcHQgaXRzZWxmXG4gICAgICBycy5hbGxwdHMucHVzaChycy5jdHJscHRzW2JdLCBycy5jdHJscHRzW2IgKyAxXSk7XG5cbiAgICAgIC8vIHRoZSBtaWRwdCBiZXR3ZWVuIGN0cmxwdHMgYXMgaW50ZXJtZWRpYXRlIGRlc3RpbmF0aW9uIHB0c1xuICAgICAgaWYgKGIgKyAzIDwgcnMuY3RybHB0cy5sZW5ndGgpIHtcbiAgICAgICAgcnMuYWxscHRzLnB1c2goKHJzLmN0cmxwdHNbYl0gKyBycy5jdHJscHRzW2IgKyAyXSkgLyAyLCAocnMuY3RybHB0c1tiICsgMV0gKyBycy5jdHJscHRzW2IgKyAzXSkgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgdmFyIG0sIG10O1xuICAgIGlmIChycy5jdHJscHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSB7XG4gICAgICBtID0gcnMuYWxscHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgcnMubWlkWCA9IHJzLmFsbHB0c1ttXTtcbiAgICAgIHJzLm1pZFkgPSBycy5hbGxwdHNbbSArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gcnMuYWxscHRzLmxlbmd0aCAvIDIgLSAzO1xuICAgICAgbXQgPSAwLjU7XG4gICAgICBycy5taWRYID0gcWJlemllckF0KHJzLmFsbHB0c1ttXSwgcnMuYWxscHRzW20gKyAyXSwgcnMuYWxscHRzW20gKyA0XSwgbXQpO1xuICAgICAgcnMubWlkWSA9IHFiZXppZXJBdChycy5hbGxwdHNbbSArIDFdLCBycy5hbGxwdHNbbSArIDNdLCBycy5hbGxwdHNbbSArIDVdLCBtdCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnKSB7XG4gICAgLy8gbmVlZCB0byBjYWxjIHRoZXNlIGFmdGVyIGVuZHB0c1xuICAgIHJzLmFsbHB0cyA9IFtycy5zdGFydFgsIHJzLnN0YXJ0WSwgcnMuZW5kWCwgcnMuZW5kWV07XG5cbiAgICAvLyBkZWZhdWx0IG1pZHB0IGZvciBsYWJlbHMgZXRjXG4gICAgcnMubWlkWCA9IChycy5zdGFydFggKyBycy5lbmRYICsgcnMuYXJyb3dTdGFydFggKyBycy5hcnJvd0VuZFgpIC8gNDtcbiAgICBycy5taWRZID0gKHJzLnN0YXJ0WSArIHJzLmVuZFkgKyBycy5hcnJvd1N0YXJ0WSArIHJzLmFycm93RW5kWSkgLyA0O1xuICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuICAgIHJzLmFsbHB0cy5wdXNoLmFwcGx5KHJzLmFsbHB0cywgcnMuc2VncHRzKTtcbiAgICBycy5hbGxwdHMucHVzaChycy5lbmRYLCBycy5lbmRZKTtcbiAgICBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgcnMucm91bmRDb3JuZXJzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMjsgaSArIDMgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIHJhZGl1cyA9IHJzLnJhZGlpW2kgLyAyIC0gMV07XG4gICAgICAgIHZhciBpc0FyY1JhZGl1cyA9IHJzLmlzQXJjUmFkaXVzW2kgLyAyIC0gMV07XG4gICAgICAgIHJzLnJvdW5kQ29ybmVycy5wdXNoKGdldFJvdW5kQ29ybmVyKHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaSAtIDJdLFxuICAgICAgICAgIHk6IHJzLmFsbHB0c1tpIC0gMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdLFxuICAgICAgICAgIHJhZGl1czogcmFkaXVzXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaSArIDJdLFxuICAgICAgICAgIHk6IHJzLmFsbHB0c1tpICsgM11cbiAgICAgICAgfSwgcmFkaXVzLCBpc0FyY1JhZGl1cykpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocnMuc2VncHRzLmxlbmd0aCAlIDQgPT09IDApIHtcbiAgICAgIHZhciBpMiA9IHJzLnNlZ3B0cy5sZW5ndGggLyAyO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgcnMubWlkWCA9IChycy5zZWdwdHNbaTFdICsgcnMuc2VncHRzW2kyXSkgLyAyO1xuICAgICAgcnMubWlkWSA9IChycy5zZWdwdHNbaTEgKyAxXSArIHJzLnNlZ3B0c1tpMiArIDFdKSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfaSA9IHJzLnNlZ3B0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIGlmICghcnMuaXNSb3VuZCkge1xuICAgICAgICBycy5taWRYID0gcnMuc2VncHRzW19pXTtcbiAgICAgICAgcnMubWlkWSA9IHJzLnNlZ3B0c1tfaSArIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICAgIHg6IHJzLnNlZ3B0c1tfaV0sXG4gICAgICAgICAgeTogcnMuc2VncHRzW19pICsgMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNvcm5lciA9IHJzLnJvdW5kQ29ybmVyc1tfaSAvIDJdO1xuICAgICAgICB2YXIgdiA9IFtwb2ludC54IC0gY29ybmVyLmN4LCBwb2ludC55IC0gY29ybmVyLmN5XTtcbiAgICAgICAgdmFyIGZhY3RvciA9IGNvcm5lci5yYWRpdXMgLyBNYXRoLnNxcnQoTWF0aC5wb3codlswXSwgMikgKyBNYXRoLnBvdyh2WzFdLCAyKSk7XG4gICAgICAgIHYgPSB2Lm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHJldHVybiBjICogZmFjdG9yO1xuICAgICAgICB9KTtcbiAgICAgICAgcnMubWlkWCA9IGNvcm5lci5jeCArIHZbMF07XG4gICAgICAgIHJzLm1pZFkgPSBjb3JuZXIuY3kgKyB2WzFdO1xuICAgICAgICBycy5taWRWZWN0b3IgPSB2O1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbkJScCRjLmNoZWNrRm9ySW52YWxpZEVkZ2VXYXJuaW5nID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgaWYgKHJzLm5vZGVzT3ZlcmxhcCB8fCBudW1iZXIkMShycy5zdGFydFgpICYmIG51bWJlciQxKHJzLnN0YXJ0WSkgJiYgbnVtYmVyJDEocnMuZW5kWCkgJiYgbnVtYmVyJDEocnMuZW5kWSkpIHtcbiAgICBycy5sb2dnZWRFcnIgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXJzLmxvZ2dlZEVycikge1xuICAgICAgcnMubG9nZ2VkRXJyID0gdHJ1ZTtcbiAgICAgIHdhcm4oJ0VkZ2UgYCcgKyBlZGdlLmlkKCkgKyAnYCBoYXMgaW52YWxpZCBlbmRwb2ludHMgYW5kIHNvIGl0IGlzIGltcG9zc2libGUgdG8gZHJhdy4gIEFkanVzdCB5b3VyIGVkZ2Ugc3R5bGUgKGUuZy4gY29udHJvbCBwb2ludHMpIGFjY29yZGluZ2x5IG9yIHVzZSBhbiBhbHRlcm5hdGl2ZSBlZGdlIHR5cGUuICBUaGlzIGlzIGV4cGVjdGVkIGJlaGF2aW91ciB3aGVuIHRoZSBzb3VyY2Ugbm9kZSBhbmQgdGhlIHRhcmdldCBub2RlIG92ZXJsYXAuJyk7XG4gICAgfVxuICB9XG59O1xuQlJwJGMuZmluZEVkZ2VDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2VzKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGlmICghZWRnZXMgfHwgZWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIGhhc2hUYWJsZSA9IHtcbiAgICBtYXA6IG5ldyBNYXAkMigpLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KHBhaXJJZCkge1xuICAgICAgdmFyIG1hcDIgPSB0aGlzLm1hcC5nZXQocGFpcklkWzBdKTtcbiAgICAgIGlmIChtYXAyICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hcDIuZ2V0KHBhaXJJZFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHBhaXJJZCwgdmFsKSB7XG4gICAgICB2YXIgbWFwMiA9IHRoaXMubWFwLmdldChwYWlySWRbMF0pO1xuICAgICAgaWYgKG1hcDIgPT0gbnVsbCkge1xuICAgICAgICBtYXAyID0gbmV3IE1hcCQyKCk7XG4gICAgICAgIHRoaXMubWFwLnNldChwYWlySWRbMF0sIG1hcDIpO1xuICAgICAgfVxuICAgICAgbWFwMi5zZXQocGFpcklkWzFdLCB2YWwpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHBhaXJJZHMgPSBbXTtcbiAgdmFyIGhheXN0YWNrRWRnZXMgPSBbXTtcblxuICAvLyBjcmVhdGUgYSB0YWJsZSBvZiBlZGdlIChzcmMsIHRndCkgPT4gbGlzdCBvZiBlZGdlcyBiZXR3ZWVuIHRoZW1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuXG4gICAgLy8gaWdub3JlIGVkZ2VzIHdobyBhcmUgbm90IHRvIGJlIGRpc3BsYXllZFxuICAgIC8vIHRoZXkgc2hvdWxkbid0IHRha2UgdXAgc3BhY2VcbiAgICBpZiAoZWRnZS5yZW1vdmVkKCkgfHwgIWVkZ2UudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgaGF5c3RhY2tFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBlZGdlSXNVbmJ1bmRsZWQgPSBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZS5lbmRzV2l0aCgnc2VnbWVudHMnKSB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQnIHx8IGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScgfHwgY3VydmVTdHlsZS5lbmRzV2l0aCgndGF4aScpO1xuICAgIHZhciBlZGdlSXNCZXppZXIgPSBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ2Jlemllcic7XG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcmNJbmRleCA9IHNyYy5wb29sSW5kZXgoKTtcbiAgICB2YXIgdGd0SW5kZXggPSB0Z3QucG9vbEluZGV4KCk7XG4gICAgdmFyIHBhaXJJZCA9IFtzcmNJbmRleCwgdGd0SW5kZXhdLnNvcnQoKTtcbiAgICB2YXIgdGFibGVFbnRyeSA9IGhhc2hUYWJsZS5nZXQocGFpcklkKTtcbiAgICBpZiAodGFibGVFbnRyeSA9PSBudWxsKSB7XG4gICAgICB0YWJsZUVudHJ5ID0ge1xuICAgICAgICBlbGVzOiBbXVxuICAgICAgfTtcbiAgICAgIGhhc2hUYWJsZS5zZXQocGFpcklkLCB0YWJsZUVudHJ5KTtcbiAgICAgIHBhaXJJZHMucHVzaChwYWlySWQpO1xuICAgIH1cbiAgICB0YWJsZUVudHJ5LmVsZXMucHVzaChlZGdlKTtcbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc1VuYnVuZGxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChlZGdlSXNCZXppZXIpIHtcbiAgICAgIHRhYmxlRW50cnkuaGFzQmV6aWVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3IgZWFjaCBwYWlyIChzcmMsIHRndCksIGNyZWF0ZSB0aGUgY3RybCBwdHNcbiAgLy8gTmVzdGVkIGZvciBsb29wIGlzIE9LOyB0b3RhbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgYm90aCBsb29wcyA9IGVkZ2VDb3VudFxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChwKSB7XG4gICAgdmFyIHBhaXJJZCA9IHBhaXJJZHNbcF07XG4gICAgdmFyIHBhaXJJbmZvID0gaGFzaFRhYmxlLmdldChwYWlySWQpO1xuICAgIHZhciBzd2FwcGVkcGFpckluZm8gPSB2b2lkIDA7XG4gICAgaWYgKCFwYWlySW5mby5oYXNVbmJ1bmRsZWQpIHtcbiAgICAgIHZhciBwbGxFZGdlcyA9IHBhaXJJbmZvLmVsZXNbMF0ucGFyYWxsZWxFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5pc0J1bmRsZWRCZXppZXIoKTtcbiAgICAgIH0pO1xuICAgICAgY2xlYXJBcnJheShwYWlySW5mby5lbGVzKTtcbiAgICAgIHBsbEVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhaXJJbmZvLmVsZXMucHVzaChlZGdlKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmb3IgZWFjaCBwYWlyIGlkLCB0aGUgZWRnZXMgc2hvdWxkIGJlIHNvcnRlZCBieSBpbmRleFxuICAgICAgcGFpckluZm8uZWxlcy5zb3J0KGZ1bmN0aW9uIChlZGdlMSwgZWRnZTIpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UxLnBvb2xJbmRleCgpIC0gZWRnZTIucG9vbEluZGV4KCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGZpcnN0RWRnZSA9IHBhaXJJbmZvLmVsZXNbMF07XG4gICAgdmFyIHNyYyA9IGZpcnN0RWRnZS5zb3VyY2UoKTtcbiAgICB2YXIgdGd0ID0gZmlyc3RFZGdlLnRhcmdldCgpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHNyYy90Z3QgZGlzdGluY3Rpb24gaXMgY29uc2lzdGVudCB3LnIudC4gcGFpcklkXG4gICAgaWYgKHNyYy5wb29sSW5kZXgoKSA+IHRndC5wb29sSW5kZXgoKSkge1xuICAgICAgdmFyIHRlbXAgPSBzcmM7XG4gICAgICBzcmMgPSB0Z3Q7XG4gICAgICB0Z3QgPSB0ZW1wO1xuICAgIH1cbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zID0gc3JjLnBvc2l0aW9uKCk7XG4gICAgdmFyIHRndFBvcyA9IHBhaXJJbmZvLnRndFBvcyA9IHRndC5wb3NpdGlvbigpO1xuICAgIHZhciBzcmNXID0gcGFpckluZm8uc3JjVyA9IHNyYy5vdXRlcldpZHRoKCk7XG4gICAgdmFyIHNyY0ggPSBwYWlySW5mby5zcmNIID0gc3JjLm91dGVySGVpZ2h0KCk7XG4gICAgdmFyIHRndFcgPSBwYWlySW5mby50Z3RXID0gdGd0Lm91dGVyV2lkdGgoKTtcbiAgICB2YXIgdGd0SCA9IHBhaXJJbmZvLnRndEggPSB0Z3Qub3V0ZXJIZWlnaHQoKTtcbiAgICB2YXIgc3JjU2hhcGUgPSBwYWlySW5mby5zcmNTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUoc3JjKV07XG4gICAgdmFyIHRndFNoYXBlID0gcGFpckluZm8udGd0U2hhcGUgPSByLm5vZGVTaGFwZXNbX3RoaXMuZ2V0Tm9kZVNoYXBlKHRndCldO1xuICAgIHZhciBzcmNDb3JuZXJSYWRpdXMgPSBwYWlySW5mby5zcmNDb3JuZXJSYWRpdXMgPSBzcmMucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWUgPT09ICdhdXRvJyA/ICdhdXRvJyA6IHNyYy5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciB0Z3RDb3JuZXJSYWRpdXMgPSBwYWlySW5mby50Z3RDb3JuZXJSYWRpdXMgPSB0Z3QucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWUgPT09ICdhdXRvJyA/ICdhdXRvJyA6IHRndC5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciB0Z3RScyA9IHBhaXJJbmZvLnRndFJzID0gdGd0Ll9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBzcmNScyA9IHBhaXJJbmZvLnNyY1JzID0gc3JjLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHBhaXJJbmZvLmRpckNvdW50cyA9IHtcbiAgICAgICdub3J0aCc6IDAsXG4gICAgICAnd2VzdCc6IDAsXG4gICAgICAnc291dGgnOiAwLFxuICAgICAgJ2Vhc3QnOiAwLFxuICAgICAgJ25vcnRod2VzdCc6IDAsXG4gICAgICAnc291dGh3ZXN0JzogMCxcbiAgICAgICdub3J0aGVhc3QnOiAwLFxuICAgICAgJ3NvdXRoZWFzdCc6IDBcbiAgICB9O1xuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBhaXJJbmZvLmVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgdmFyIF9lZGdlID0gcGFpckluZm8uZWxlc1tfaTJdO1xuICAgICAgdmFyIHJzID0gX2VkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgX2N1cnZlU3R5bGUgPSBfZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gICAgICB2YXIgX2VkZ2VJc1VuYnVuZGxlZCA9IF9jdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgX2N1cnZlU3R5bGUuZW5kc1dpdGgoJ3NlZ21lbnRzJykgfHwgX2N1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKTtcblxuICAgICAgLy8gd2hldGhlciB0aGUgbm9ybWFsaXNlZCBwYWlyIG9yZGVyIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBlZGdlJ3Mgc3JjLXRndCBvcmRlclxuICAgICAgdmFyIGVkZ2VJc1N3YXBwZWQgPSAhc3JjLnNhbWUoX2VkZ2Uuc291cmNlKCkpO1xuICAgICAgaWYgKCFwYWlySW5mby5jYWxjdWxhdGVkSW50ZXJzZWN0aW9uICYmIHNyYyAhPT0gdGd0ICYmIChwYWlySW5mby5oYXNCZXppZXIgfHwgcGFpckluZm8uaGFzVW5idW5kbGVkKSkge1xuICAgICAgICBwYWlySW5mby5jYWxjdWxhdGVkSW50ZXJzZWN0aW9uID0gdHJ1ZTtcblxuICAgICAgICAvLyBwdCBvdXRzaWRlIHNyYyBzaGFwZSB0byBjYWxjIGRpc3RhbmNlL2Rpc3BsYWNlbWVudCBmcm9tIHNyYyB0byB0Z3RcbiAgICAgICAgdmFyIHNyY091dHNpZGUgPSBzcmNTaGFwZS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjVywgc3JjSCwgdGd0UG9zLngsIHRndFBvcy55LCAwLCBzcmNDb3JuZXJSYWRpdXMsIHNyY1JzKTtcbiAgICAgICAgdmFyIHNyY0ludG4gPSBwYWlySW5mby5zcmNJbnRuID0gc3JjT3V0c2lkZTtcblxuICAgICAgICAvLyBwdCBvdXRzaWRlIHRndCBzaGFwZSB0byBjYWxjIGRpc3RhbmNlL2Rpc3BsYWNlbWVudCBmcm9tIHNyYyB0byB0Z3RcbiAgICAgICAgdmFyIHRndE91dHNpZGUgPSB0Z3RTaGFwZS5pbnRlcnNlY3RMaW5lKHRndFBvcy54LCB0Z3RQb3MueSwgdGd0VywgdGd0SCwgc3JjUG9zLngsIHNyY1Bvcy55LCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICAgICAgdmFyIHRndEludG4gPSBwYWlySW5mby50Z3RJbnRuID0gdGd0T3V0c2lkZTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyA9IHtcbiAgICAgICAgICB4MTogc3JjT3V0c2lkZVswXSxcbiAgICAgICAgICB4MjogdGd0T3V0c2lkZVswXSxcbiAgICAgICAgICB5MTogc3JjT3V0c2lkZVsxXSxcbiAgICAgICAgICB5MjogdGd0T3V0c2lkZVsxXVxuICAgICAgICB9O1xuICAgICAgICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzID0ge1xuICAgICAgICAgIHgxOiBzcmNQb3MueCxcbiAgICAgICAgICB4MjogdGd0UG9zLngsXG4gICAgICAgICAgeTE6IHNyY1Bvcy55LFxuICAgICAgICAgIHkyOiB0Z3RQb3MueVxuICAgICAgICB9O1xuICAgICAgICB2YXIgZHkgPSB0Z3RPdXRzaWRlWzFdIC0gc3JjT3V0c2lkZVsxXTtcbiAgICAgICAgdmFyIGR4ID0gdGd0T3V0c2lkZVswXSAtIHNyY091dHNpZGVbMF07XG4gICAgICAgIHZhciBsID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgICAgdmFyIHZlY3RvciA9IHBhaXJJbmZvLnZlY3RvciA9IHtcbiAgICAgICAgICB4OiBkeCxcbiAgICAgICAgICB5OiBkeVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdmVjdG9yTm9ybSA9IHBhaXJJbmZvLnZlY3Rvck5vcm0gPSB7XG4gICAgICAgICAgeDogdmVjdG9yLnggLyBsLFxuICAgICAgICAgIHk6IHZlY3Rvci55IC8gbFxuICAgICAgICB9O1xuICAgICAgICB2YXIgdmVjdG9yTm9ybUludmVyc2UgPSB7XG4gICAgICAgICAgeDogLXZlY3Rvck5vcm0ueSxcbiAgICAgICAgICB5OiB2ZWN0b3JOb3JtLnhcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBpZiBub2RlIHNoYXBlcyBvdmVybGFwLCB0aGVuIG5vIGN0cmwgcHRzIHRvIGRyYXdcbiAgICAgICAgcGFpckluZm8ubm9kZXNPdmVybGFwID0gIW51bWJlciQxKGwpIHx8IHRndFNoYXBlLmNoZWNrUG9pbnQoc3JjT3V0c2lkZVswXSwgc3JjT3V0c2lkZVsxXSwgMCwgdGd0VywgdGd0SCwgdGd0UG9zLngsIHRndFBvcy55LCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKSB8fCBzcmNTaGFwZS5jaGVja1BvaW50KHRndE91dHNpZGVbMF0sIHRndE91dHNpZGVbMV0sIDAsIHNyY1csIHNyY0gsIHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgICAgIHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlID0gdmVjdG9yTm9ybUludmVyc2U7XG4gICAgICAgIHN3YXBwZWRwYWlySW5mbyA9IHtcbiAgICAgICAgICBub2Rlc092ZXJsYXA6IHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCxcbiAgICAgICAgICBkaXJDb3VudHM6IHBhaXJJbmZvLmRpckNvdW50cyxcbiAgICAgICAgICBjYWxjdWxhdGVkSW50ZXJzZWN0aW9uOiB0cnVlLFxuICAgICAgICAgIGhhc0JlemllcjogcGFpckluZm8uaGFzQmV6aWVyLFxuICAgICAgICAgIGhhc1VuYnVuZGxlZDogcGFpckluZm8uaGFzVW5idW5kbGVkLFxuICAgICAgICAgIGVsZXM6IHBhaXJJbmZvLmVsZXMsXG4gICAgICAgICAgc3JjUG9zOiB0Z3RQb3MsXG4gICAgICAgICAgdGd0UG9zOiBzcmNQb3MsXG4gICAgICAgICAgc3JjVzogdGd0VyxcbiAgICAgICAgICBzcmNIOiB0Z3RILFxuICAgICAgICAgIHRndFc6IHNyY1csXG4gICAgICAgICAgdGd0SDogc3JjSCxcbiAgICAgICAgICBzcmNJbnRuOiB0Z3RJbnRuLFxuICAgICAgICAgIHRndEludG46IHNyY0ludG4sXG4gICAgICAgICAgc3JjU2hhcGU6IHRndFNoYXBlLFxuICAgICAgICAgIHRndFNoYXBlOiBzcmNTaGFwZSxcbiAgICAgICAgICBwb3NQdHM6IHtcbiAgICAgICAgICAgIHgxOiBwb3NQdHMueDIsXG4gICAgICAgICAgICB5MTogcG9zUHRzLnkyLFxuICAgICAgICAgICAgeDI6IHBvc1B0cy54MSxcbiAgICAgICAgICAgIHkyOiBwb3NQdHMueTFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGludGVyc2VjdGlvblB0czoge1xuICAgICAgICAgICAgeDE6IGludGVyc2VjdGlvblB0cy54MixcbiAgICAgICAgICAgIHkxOiBpbnRlcnNlY3Rpb25QdHMueTIsXG4gICAgICAgICAgICB4MjogaW50ZXJzZWN0aW9uUHRzLngxLFxuICAgICAgICAgICAgeTI6IGludGVyc2VjdGlvblB0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm06IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybS55XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3JOb3JtSW52ZXJzZToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm1JbnZlcnNlLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybUludmVyc2UueVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXNzZWRQYWlySW5mbyA9IGVkZ2VJc1N3YXBwZWQgPyBzd2FwcGVkcGFpckluZm8gOiBwYWlySW5mbztcbiAgICAgIHJzLm5vZGVzT3ZlcmxhcCA9IHBhc3NlZFBhaXJJbmZvLm5vZGVzT3ZlcmxhcDtcbiAgICAgIHJzLnNyY0ludG4gPSBwYXNzZWRQYWlySW5mby5zcmNJbnRuO1xuICAgICAgcnMudGd0SW50biA9IHBhc3NlZFBhaXJJbmZvLnRndEludG47XG4gICAgICBycy5pc1JvdW5kID0gX2N1cnZlU3R5bGUuc3RhcnRzV2l0aCgncm91bmQnKTtcbiAgICAgIGlmIChoYXNDb21wb3VuZHMgJiYgKHNyYy5pc1BhcmVudCgpIHx8IHNyYy5pc0NoaWxkKCkgfHwgdGd0LmlzUGFyZW50KCkgfHwgdGd0LmlzQ2hpbGQoKSkgJiYgKHNyYy5wYXJlbnRzKCkuYW55U2FtZSh0Z3QpIHx8IHRndC5wYXJlbnRzKCkuYW55U2FtZShzcmMpIHx8IHNyYy5zYW1lKHRndCkgJiYgc3JjLmlzUGFyZW50KCkpKSB7XG4gICAgICAgIF90aGlzLmZpbmRDb21wb3VuZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBfdGhpcy5maW5kTG9vcFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8sIF9pMiwgX2VkZ2VJc1VuYnVuZGxlZCk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpKSB7XG4gICAgICAgIF90aGlzLmZpbmRTZWdtZW50c1BvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZS5lbmRzV2l0aCgndGF4aScpKSB7XG4gICAgICAgIF90aGlzLmZpbmRUYXhpUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQnIHx8ICFfZWRnZUlzVW5idW5kbGVkICYmIHBhaXJJbmZvLmVsZXMubGVuZ3RoICUgMiA9PT0gMSAmJiBfaTIgPT09IE1hdGguZmxvb3IocGFpckluZm8uZWxlcy5sZW5ndGggLyAyKSkge1xuICAgICAgICBfdGhpcy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzKF9lZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmZpbmRCZXppZXJQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpO1xuICAgICAgfVxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG4gICAgICBfdGhpcy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICBfdGhpcy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhfZWRnZSk7XG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKF9lZGdlKTtcbiAgICB9IC8vIGZvciBwYWlyIGVkZ2VzXG4gIH07XG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKHApO1xuICB9IC8vIGZvciBwYWlyIGlkc1xuXG4gIC8vIGhheXN0YWNrcyBhdm9pZCB0aGUgZXhwZW5zZSBvZiBwYWlySW5mbyBzdHVmZiAoaW50ZXJzZWN0aW9ucyBldGMuKVxuICB0aGlzLmZpbmRIYXlzdGFja1BvaW50cyhoYXlzdGFja0VkZ2VzKTtcbn07XG5mdW5jdGlvbiBnZXRQdHMocHRzKSB7XG4gIHZhciByZXRQdHMgPSBbXTtcbiAgaWYgKHB0cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHggPSBwdHNbaV07XG4gICAgdmFyIHkgPSBwdHNbaSArIDFdO1xuICAgIHJldFB0cy5wdXNoKHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldFB0cztcbn1cbkJScCRjLmdldFNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuc2VncHRzKTtcbiAgfVxufTtcbkJScCRjLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ2JlemllcicgfHwgdHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCB0eXBlID09PSAnc2VsZicgfHwgdHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuY3RybHB0cyk7XG4gIH1cbn07XG5CUnAkYy5nZXRFZGdlTWlkcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBycy5taWRYLFxuICAgIHk6IHJzLm1pZFlcbiAgfTtcbn07XG5cbnZhciBCUnAkYiA9IHt9O1xuQlJwJGIubWFudWFsRW5kcHRUb1B4ID0gZnVuY3Rpb24gKG5vZGUsIHByb3ApIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgbnBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIHcgPSBub2RlLm91dGVyV2lkdGgoKTtcbiAgdmFyIGggPSBub2RlLm91dGVySGVpZ2h0KCk7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChwcm9wLnZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBwID0gW3Byb3AucGZWYWx1ZVswXSwgcHJvcC5wZlZhbHVlWzFdXTtcbiAgICBpZiAocHJvcC51bml0c1swXSA9PT0gJyUnKSB7XG4gICAgICBwWzBdID0gcFswXSAqIHc7XG4gICAgfVxuICAgIGlmIChwcm9wLnVuaXRzWzFdID09PSAnJScpIHtcbiAgICAgIHBbMV0gPSBwWzFdICogaDtcbiAgICB9XG4gICAgcFswXSArPSBucG9zLng7XG4gICAgcFsxXSArPSBucG9zLnk7XG4gICAgcmV0dXJuIHA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFuZ2xlID0gcHJvcC5wZlZhbHVlWzBdO1xuICAgIGFuZ2xlID0gLU1hdGguUEkgLyAyICsgYW5nbGU7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2tcblxuICAgIHZhciBsID0gMiAqIE1hdGgubWF4KHcsIGgpO1xuICAgIHZhciBfcCA9IFtucG9zLnggKyBNYXRoLmNvcyhhbmdsZSkgKiBsLCBucG9zLnkgKyBNYXRoLnNpbihhbmdsZSkgKiBsXTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5pbnRlcnNlY3RMaW5lKG5wb3MueCwgbnBvcy55LCB3LCBoLCBfcFswXSwgX3BbMV0sIDAsIG5vZGUucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWUgPT09ICdhdXRvJyA/ICdhdXRvJyA6IG5vZGUucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZSwgcnMpO1xuICB9XG59O1xuQlJwJGIuZmluZEVuZHBvaW50cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGludGVyc2VjdDtcbiAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlKClbMF07XG4gIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpWzBdO1xuICB2YXIgc3JjUG9zID0gc291cmNlLnBvc2l0aW9uKCk7XG4gIHZhciB0Z3RQb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgdmFyIHRndEFyU2hhcGUgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciBzcmNBclNoYXBlID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgdGd0RGlzdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIHNyY0Rpc3QgPSBlZGdlLnBzdHlsZSgnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScpLnBmVmFsdWU7XG4gIHZhciBzcmNScyA9IHNvdXJjZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHRndFJzID0gdGFyZ2V0Ll9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgZXQgPSBycy5lZGdlVHlwZTtcbiAgdmFyIHRheGkgPSBjdXJ2ZVN0eWxlID09PSAndGF4aSc7XG4gIHZhciBzZWxmID0gZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJztcbiAgdmFyIGJlemllciA9IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBzZWxmO1xuICB2YXIgbXVsdGkgPSBldCAhPT0gJ2Jlemllcic7XG4gIHZhciBsaW5lcyA9IGV0ID09PSAnc3RyYWlnaHQnIHx8IGV0ID09PSAnc2VnbWVudHMnO1xuICB2YXIgc2VnbWVudHMgPSBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIGhhc0VuZHB0cyA9IGJlemllciB8fCBtdWx0aSB8fCBsaW5lcztcbiAgdmFyIG92ZXJyaWRlRW5kcHRzID0gc2VsZiB8fCB0YXhpO1xuICB2YXIgc3JjTWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgnc291cmNlLWVuZHBvaW50Jyk7XG4gIHZhciBzcmNNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiBzcmNNYW5FbmRwdC52YWx1ZTtcbiAgdmFyIHNyY0Nvcm5lclJhZGl1cyA9IHNvdXJjZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc291cmNlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciB0Z3RNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHRndE1hbkVuZHB0LnZhbHVlO1xuICB2YXIgdGd0Q29ybmVyUmFkaXVzID0gdGFyZ2V0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiB0YXJnZXQucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgcnMuc3JjTWFuRW5kcHQgPSBzcmNNYW5FbmRwdDtcbiAgcnMudGd0TWFuRW5kcHQgPSB0Z3RNYW5FbmRwdDtcbiAgdmFyIHAxOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gdGFyZ2V0IHNpZGVcbiAgdmFyIHAyOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gc291cmNlIHNpZGVcblxuICB2YXIgcDFfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggdGFyZ2V0IHNoYXBlXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICBpZiAoYmV6aWVyKSB7XG4gICAgdmFyIGNwU3RhcnQgPSBbcnMuY3RybHB0c1swXSwgcnMuY3RybHB0c1sxXV07XG4gICAgdmFyIGNwRW5kID0gbXVsdGkgPyBbcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDJdLCBycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMV1dIDogY3BTdGFydDtcbiAgICBwMSA9IGNwRW5kO1xuICAgIHAyID0gY3BTdGFydDtcbiAgfSBlbHNlIGlmIChsaW5lcykge1xuICAgIHZhciBzcmNBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFt0Z3RQb3MueCwgdGd0UG9zLnldIDogcnMuc2VncHRzLnNsaWNlKDAsIDIpO1xuICAgIHZhciB0Z3RBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFtzcmNQb3MueCwgc3JjUG9zLnldIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cbiAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeCh0YXJnZXQsIHRndE1hbkVuZHB0KTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy50Z3RJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IHAxO1xuICAgIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICAgIH1cbiAgICBpbnRlcnNlY3QgPSByLm5vZGVTaGFwZXNbdGhpcy5nZXROb2RlU2hhcGUodGFyZ2V0KV0uaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRhcmdldC5vdXRlcldpZHRoKCksIHRhcmdldC5vdXRlckhlaWdodCgpLCBwMV9pWzBdLCBwMV9pWzFdLCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgICBpZiAodmEgPT09ICd0b3AnKSB7XG4gICAgICAgIGx5IC09IGxoMjtcbiAgICAgIH0gZWxzZSBpZiAodmEgPT09ICdib3R0b20nKSB7XG4gICAgICAgIGx5ICs9IGxoMjtcbiAgICAgIH1cbiAgICAgIHZhciBoYSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgICBpZiAoaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBseCAtPSBsdzI7XG4gICAgICB9IGVsc2UgaWYgKGhhID09PSAncmlnaHQnKSB7XG4gICAgICAgIGx4ICs9IGx3MjtcbiAgICAgIH1cbiAgICAgIHZhciBsYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAxX2lbMF0sIHAxX2lbMV0sIFtseCAtIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSAtIGxoMiwgbHggKyBsdzIsIGx5ICsgbGgyLCBseCAtIGx3MiwgbHkgKyBsaDJdLCB0Z3RQb3MueCwgdGd0UG9zLnkpO1xuICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHJlZlB0ID0gc3JjUG9zO1xuICAgICAgICB2YXIgaW50U3FkaXN0ID0gc3FkaXN0KHJlZlB0LCBhcnJheTJwb2ludChpbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIGxhYkludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQobGFiZWxJbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIG1pblNxRGlzdCA9IGludFNxZGlzdDtcbiAgICAgICAgaWYgKGxhYkludFNxZGlzdCA8IGludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IGxhYmVsSW50ZXJzZWN0O1xuICAgICAgICAgIG1pblNxRGlzdCA9IGxhYkludFNxZGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMikge1xuICAgICAgICAgIHZhciBsYWJJbnQyU3FEaXN0ID0gc3FkaXN0KHJlZlB0LCB7XG4gICAgICAgICAgICB4OiBsYWJlbEludGVyc2VjdFsyXSxcbiAgICAgICAgICAgIHk6IGxhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGxhYkludDJTcURpc3QgPCBtaW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtsYWJlbEludGVyc2VjdFsyXSwgbGFiZWxJbnRlcnNlY3RbM11dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgYXJyb3dFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHRndERpc3QpO1xuICB2YXIgZWRnZUVuZCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMSwgci5hcnJvd1NoYXBlc1t0Z3RBclNoYXBlXS5nYXAoZWRnZSkgKyB0Z3REaXN0KTtcbiAgcnMuZW5kWCA9IGVkZ2VFbmRbMF07XG4gIHJzLmVuZFkgPSBlZGdlRW5kWzFdO1xuICBycy5hcnJvd0VuZFggPSBhcnJvd0VuZFswXTtcbiAgcnMuYXJyb3dFbmRZID0gYXJyb3dFbmRbMV07XG4gIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ2luc2lkZS10by1ub2RlJykge1xuICAgIGludGVyc2VjdCA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0LnVuaXRzKSB7XG4gICAgaW50ZXJzZWN0ID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoc291cmNlLCBzcmNNYW5FbmRwdCk7XG4gIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnKSB7XG4gICAgaW50ZXJzZWN0ID0gcnMuc3JjSW50bjsgLy8gdXNlIGNhY2hlZCB2YWx1ZSBmcm9tIGN0cmxwdCBjYWxjXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcpIHtcbiAgICAgIHAyX2kgPSBwMjtcbiAgICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHAyX2kgPSBbdGd0UG9zLngsIHRndFBvcy55XTtcbiAgICB9XG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHNvdXJjZSldLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzb3VyY2Uub3V0ZXJXaWR0aCgpLCBzb3VyY2Uub3V0ZXJIZWlnaHQoKSwgcDJfaVswXSwgcDJfaVsxXSwgMCwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciBzcnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgX2x3ID0gc3JzLmxhYmVsV2lkdGg7XG4gICAgICB2YXIgX2xoID0gc3JzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIF9seCA9IHNycy5sYWJlbFg7XG4gICAgICB2YXIgX2x5ID0gc3JzLmxhYmVsWTtcbiAgICAgIHZhciBfbHcyID0gX2x3IC8gMjtcbiAgICAgIHZhciBfbGgyID0gX2xoIC8gMjtcbiAgICAgIHZhciBfdmEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKF92YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgX2x5IC09IF9saDI7XG4gICAgICB9IGVsc2UgaWYgKF92YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgX2x5ICs9IF9saDI7XG4gICAgICB9XG4gICAgICB2YXIgX2hhID0gc291cmNlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuICAgICAgdmFyIF9sYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAyX2lbMF0sIHAyX2lbMV0sIFtfbHggLSBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgKyBfbGgyLCBfbHggLSBfbHcyLCBfbHkgKyBfbGgyXSwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3JlZlB0ID0gdGd0UG9zO1xuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX2xhYkludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KF9sYWJlbEludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX21pblNxRGlzdCA9IF9pbnRTcWRpc3Q7XG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9sYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIF9sYWJJbnQyU3FEaXN0ID0gc3FkaXN0KF9yZWZQdCwge1xuICAgICAgICAgICAgeDogX2xhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogX2xhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9sYWJJbnQyU3FEaXN0IDwgX21pblNxRGlzdCkge1xuICAgICAgICAgICAgaW50ZXJzZWN0ID0gW19sYWJlbEludGVyc2VjdFsyXSwgX2xhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG4gIGlmIChoYXNFbmRwdHMpIHtcbiAgICBpZiAoIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSkgfHwgIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKSkge1xuICAgICAgcnMuYmFkTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzLmJhZExpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYi5nZXRTb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMF0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzFdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgICAgeTogcnMuYXJyb3dTdGFydFlcbiAgICAgIH07XG4gIH1cbn07XG5CUnAkYi5nZXRUYXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMl0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzNdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICAgIHk6IHJzLmFycm93RW5kWVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIEJScCRhID0ge307XG5mdW5jdGlvbiBwdXNoQmV6aWVyUHRzKHIsIGVkZ2UsIHB0cykge1xuICB2YXIgcWJlemllckF0JDEgPSBmdW5jdGlvbiBxYmV6aWVyQXQkMShwMSwgcDIsIHAzLCB0KSB7XG4gICAgcmV0dXJuIHFiZXppZXJBdChwMSwgcDIsIHAzLCB0KTtcbiAgfTtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHIuYmV6aWVyUHJvalBjdHNbaV07XG4gICAgYnB0cy5wdXNoKHtcbiAgICAgIHg6IHFiZXppZXJBdCQxKHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIHApLFxuICAgICAgeTogcWJlemllckF0JDEocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgcClcbiAgICB9KTtcbiAgfVxufVxuQlJwJGEuc3RvcmVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG5cbiAgLy8gY2xlYXIgdGhlIGNhY2hlZCBwb2ludHMgc3RhdGVcbiAgX3AucnN0eWxlLmJlemllclB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5saW5lUHRzID0gbnVsbDtcbiAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gbnVsbDtcbiAgaWYgKGV0ID09PSAnbXVsdGliZXppZXInIHx8IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnKSB7XG4gICAgX3AucnN0eWxlLmJlemllclB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgcHVzaEJlemllclB0cyh0aGlzLCBlZGdlLCBycy5hbGxwdHMuc2xpY2UoaSwgaSArIDYpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdzZWdtZW50cycpIHtcbiAgICB2YXIgbHB0cyA9IF9wLnJzdHlsZS5saW5lUHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyAxIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBscHRzLnB1c2goe1xuICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgMV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldCA9PT0gJ2hheXN0YWNrJykge1xuICAgIHZhciBocHRzID0gcnMuaGF5c3RhY2tQdHM7XG4gICAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gW3tcbiAgICAgIHg6IGhwdHNbMF0sXG4gICAgICB5OiBocHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogaHB0c1syXSxcbiAgICAgIHk6IGhwdHNbM11cbiAgICB9XTtcbiAgfVxuICBfcC5yc3R5bGUuYXJyb3dXaWR0aCA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbn07XG5CUnAkYS5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB0aGlzLmZpbmRFZGdlQ29udHJvbFBvaW50cyhlZGdlcyk7XG59O1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQgKi9cblxudmFyIEJScCQ5ID0ge307XG5CUnAkOS5yZWNhbGN1bGF0ZU5vZGVMYWJlbFByb2plY3Rpb24gPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgY29udGVudCA9IG5vZGUucHN0eWxlKCdsYWJlbCcpLnN0clZhbHVlO1xuICBpZiAoZW1wdHlTdHJpbmcoY29udGVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHRleHRYLCB0ZXh0WTtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICB2YXIgbm9kZVBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIHRleHRIYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRWYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC12YWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHN3aXRjaCAodGV4dEhhbGlnbikge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggLSBub2RlV2lkdGggLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54ICsgbm9kZVdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBjZW50ZXJcbiAgICAgIHRleHRYID0gbm9kZVBvcy54O1xuICB9XG4gIHN3aXRjaCAodGV4dFZhbGlnbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSAtIG5vZGVIZWlnaHQgLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSArIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIG1pZGRsZVxuICAgICAgdGV4dFkgPSBub2RlUG9zLnk7XG4gIH1cbiAgcnMubGFiZWxYID0gdGV4dFg7XG4gIHJzLmxhYmVsWSA9IHRleHRZO1xuICByc3R5bGUubGFiZWxYID0gdGV4dFg7XG4gIHJzdHlsZS5sYWJlbFkgPSB0ZXh0WTtcbiAgdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhub2RlKTtcbiAgdGhpcy5hcHBseUxhYmVsRGltZW5zaW9ucyhub2RlKTtcbn07XG52YXIgbGluZUFuZ2xlRnJvbURlbHRhID0gZnVuY3Rpb24gbGluZUFuZ2xlRnJvbURlbHRhKGR4LCBkeSkge1xuICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCk7XG4gIGlmIChkeCA9PT0gMCAmJiBhbmdsZSA8IDApIHtcbiAgICBhbmdsZSA9IGFuZ2xlICogLTE7XG4gIH1cbiAgcmV0dXJuIGFuZ2xlO1xufTtcbnZhciBsaW5lQW5nbGUgPSBmdW5jdGlvbiBsaW5lQW5nbGUocDAsIHAxKSB7XG4gIHZhciBkeCA9IHAxLnggLSBwMC54O1xuICB2YXIgZHkgPSBwMS55IC0gcDAueTtcbiAgcmV0dXJuIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpO1xufTtcbnZhciBiZXppZXJBbmdsZSA9IGZ1bmN0aW9uIGJlemllckFuZ2xlKHAwLCBwMSwgcDIsIHQpIHtcbiAgdmFyIHQwID0gYm91bmQoMCwgdCAtIDAuMDAxLCAxKTtcbiAgdmFyIHQxID0gYm91bmQoMCwgdCArIDAuMDAxLCAxKTtcbiAgdmFyIGxwMCA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQwKTtcbiAgdmFyIGxwMSA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQxKTtcbiAgcmV0dXJuIGxpbmVBbmdsZShscDAsIGxwMSk7XG59O1xuQlJwJDkucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBwO1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGVudCA9IHtcbiAgICBtaWQ6IGVkZ2UucHN0eWxlKCdsYWJlbCcpLnN0clZhbHVlLFxuICAgIHNvdXJjZTogZWRnZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpLnN0clZhbHVlLFxuICAgIHRhcmdldDogZWRnZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpLnN0clZhbHVlXG4gIH07XG4gIGlmIChjb250ZW50Lm1pZCB8fCBjb250ZW50LnNvdXJjZSB8fCBjb250ZW50LnRhcmdldCkgOyBlbHNlIHtcbiAgICByZXR1cm47IC8vIG5vIGxhYmVscyA9PiBubyBjYWxjc1xuICB9XG5cbiAgLy8gYWRkIGNlbnRlciBwb2ludCB0byBzdHlsZSBzbyBib3VuZGluZyBib3ggY2FsY3VsYXRpb25zIGNhbiB1c2UgaXRcbiAgLy9cbiAgcCA9IHtcbiAgICB4OiBycy5taWRYLFxuICAgIHk6IHJzLm1pZFlcbiAgfTtcbiAgdmFyIHNldFJzID0gZnVuY3Rpb24gc2V0UnMocHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgfTtcbiAgc2V0UnMoJ2xhYmVsWCcsIG51bGwsIHAueCk7XG4gIHNldFJzKCdsYWJlbFknLCBudWxsLCBwLnkpO1xuICB2YXIgbWlkQW5nbGUgPSBsaW5lQW5nbGVGcm9tRGVsdGEocnMubWlkRGlzcFgsIHJzLm1pZERpc3BZKTtcbiAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgbnVsbCwgbWlkQW5nbGUpO1xuICB2YXIgY3JlYXRlQ29udHJvbFBvaW50SW5mbyA9IGZ1bmN0aW9uIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8oKSB7XG4gICAgaWYgKGNyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUpIHtcbiAgICAgIHJldHVybiBjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlO1xuICAgIH0gLy8gdXNlIGNhY2hlIHNvIG9ubHkgMXggcGVyIGVkZ2VcblxuICAgIHZhciBjdHJscHRzID0gW107XG5cbiAgICAvLyBzdG9yZSBlYWNoIGN0cmxwdCBpbmZvIGluaXRcbiAgICBmb3IgKHZhciBpID0gMDsgaSArIDUgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHZhciBwMCA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2ldLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdXG4gICAgICB9O1xuICAgICAgdmFyIHAxID0ge1xuICAgICAgICB4OiBycy5hbGxwdHNbaSArIDJdLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICB9OyAvLyBjdHJscHRcbiAgICAgIHZhciBwMiA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyA0XSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyA1XVxuICAgICAgfTtcbiAgICAgIGN0cmxwdHMucHVzaCh7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICBwMjogcDIsXG4gICAgICAgIHN0YXJ0RGlzdDogMCxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICBzZWdtZW50czogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgYnB0cyA9IF9wLnJzdHlsZS5iZXppZXJQdHM7XG4gICAgdmFyIG5Qcm9qcyA9IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoO1xuICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3AsIHAwLCBwMSwgdDAsIHQxKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGlzdChwMCwgcDEpO1xuICAgICAgdmFyIHByZXZTZWdtZW50ID0gY3Auc2VnbWVudHNbY3Auc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgc2VnbWVudCA9IHtcbiAgICAgICAgcDA6IHAwLFxuICAgICAgICBwMTogcDEsXG4gICAgICAgIHQwOiB0MCxcbiAgICAgICAgdDE6IHQxLFxuICAgICAgICBzdGFydERpc3Q6IHByZXZTZWdtZW50ID8gcHJldlNlZ21lbnQuc3RhcnREaXN0ICsgcHJldlNlZ21lbnQubGVuZ3RoIDogMCxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhcbiAgICAgIH07XG4gICAgICBjcC5zZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgY3AubGVuZ3RoICs9IGxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgZWFjaCBjdHJscHQgd2l0aCBzZWdtZW50IGluZm9cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY3RybHB0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBjcCA9IGN0cmxwdHNbX2ldO1xuICAgICAgdmFyIHByZXZDcCA9IGN0cmxwdHNbX2kgLSAxXTtcbiAgICAgIGlmIChwcmV2Q3ApIHtcbiAgICAgICAgY3Auc3RhcnREaXN0ID0gcHJldkNwLnN0YXJ0RGlzdCArIHByZXZDcC5sZW5ndGg7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBjcC5wMCwgYnB0c1tfaSAqIG5Qcm9qc10sIDAsIHIuYmV6aWVyUHJvalBjdHNbMF0pOyAvLyBmaXJzdFxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5Qcm9qcyAtIDE7IGorKykge1xuICAgICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgal0sIGJwdHNbX2kgKiBuUHJvanMgKyBqICsgMV0sIHIuYmV6aWVyUHJvalBjdHNbal0sIHIuYmV6aWVyUHJvalBjdHNbaiArIDFdKTtcbiAgICAgIH1cbiAgICAgIGFkZFNlZ21lbnQoY3AsIGJwdHNbX2kgKiBuUHJvanMgKyBuUHJvanMgLSAxXSwgY3AucDIsIHIuYmV6aWVyUHJvalBjdHNbblByb2pzIC0gMV0sIDEpOyAvLyBsYXN0XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUgPSBjdHJscHRzO1xuICB9O1xuICB2YXIgY2FsY3VsYXRlRW5kUHJvamVjdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGFuZ2xlO1xuICAgIHZhciBpc1NyYyA9IHByZWZpeCA9PT0gJ3NvdXJjZSc7XG4gICAgaWYgKCFjb250ZW50W3ByZWZpeF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctdGV4dC1vZmZzZXQnKS5wZlZhbHVlO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjcHMgPSBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkO1xuICAgICAgICAgIHZhciBzdGFydERpc3QgPSAwO1xuICAgICAgICAgIHZhciB0b3RhbERpc3QgPSAwO1xuXG4gICAgICAgICAgLy8gZmluZCB0aGUgc2VnbWVudCB3ZSdyZSBvblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgX2NwID0gY3BzW2lzU3JjID8gaSA6IGNwcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9jcC5zZWdtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX3NlZyA9IF9jcC5zZWdtZW50c1tpc1NyYyA/IGogOiBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMSAtIGpdO1xuICAgICAgICAgICAgICB2YXIgbGFzdFNlZyA9IGkgPT09IGNwcy5sZW5ndGggLSAxICYmIGogPT09IF9jcC5zZWdtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICBzdGFydERpc3QgPSB0b3RhbERpc3Q7XG4gICAgICAgICAgICAgIHRvdGFsRGlzdCArPSBfc2VnLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHRvdGFsRGlzdCA+PSBvZmZzZXQgfHwgbGFzdFNlZykge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0ge1xuICAgICAgICAgICAgICAgICAgY3A6IF9jcCxcbiAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IF9zZWdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBjcCA9IHNlbGVjdGVkLmNwO1xuICAgICAgICAgIHZhciBzZWcgPSBzZWxlY3RlZC5zZWdtZW50O1xuICAgICAgICAgIHZhciB0U2VnbWVudCA9IChvZmZzZXQgLSBzdGFydERpc3QpIC8gc2VnLmxlbmd0aDtcbiAgICAgICAgICB2YXIgc2VnRHQgPSBzZWcudDEgLSBzZWcudDA7XG4gICAgICAgICAgdmFyIHQgPSBpc1NyYyA/IHNlZy50MCArIHNlZ0R0ICogdFNlZ21lbnQgOiBzZWcudDEgLSBzZWdEdCAqIHRTZWdtZW50O1xuICAgICAgICAgIHQgPSBib3VuZCgwLCB0LCAxKTtcbiAgICAgICAgICBwID0gcWJlemllclB0QXQoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYW5nbGUgPSBiZXppZXJBbmdsZShjcC5wMCwgY3AucDEsIGNwLnAyLCB0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnc3RyYWlnaHQnOlxuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGQgPSAwLFxuICAgICAgICAgICAgZGksXG4gICAgICAgICAgICBkMDtcbiAgICAgICAgICB2YXIgcDAsIHAxO1xuICAgICAgICAgIHZhciBsID0gcnMuYWxscHRzLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgKyAzIDwgbDsgX2kyICs9IDIpIHtcbiAgICAgICAgICAgIGlmIChpc1NyYykge1xuICAgICAgICAgICAgICBwMCA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgMV1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcDEgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMiArIDJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tfaTIgKyAzXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW2wgLSAyIC0gX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbbCAtIDEgLSBfaTJdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gNCAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAzIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGkgPSBkaXN0KHAwLCBwMSk7XG4gICAgICAgICAgICBkMCA9IGQ7XG4gICAgICAgICAgICBkICs9IGRpO1xuICAgICAgICAgICAgaWYgKGQgPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcEQgPSBvZmZzZXQgLSBkMDtcbiAgICAgICAgICB2YXIgX3QgPSBwRCAvIGRpO1xuICAgICAgICAgIF90ID0gYm91bmQoMCwgX3QsIDEpO1xuICAgICAgICAgIHAgPSBsaW5lQXQocDAsIHAxLCBfdCk7XG4gICAgICAgICAgYW5nbGUgPSBsaW5lQW5nbGUocDAsIHAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRScygnbGFiZWxYJywgcHJlZml4LCBwLngpO1xuICAgIHNldFJzKCdsYWJlbFknLCBwcmVmaXgsIHAueSk7XG4gICAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgcHJlZml4LCBhbmdsZSk7XG4gIH07XG4gIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24oJ3NvdXJjZScpO1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCd0YXJnZXQnKTtcbiAgdGhpcy5hcHBseUxhYmVsRGltZW5zaW9ucyhlZGdlKTtcbn07XG5CUnAkOS5hcHBseUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSk7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB0aGlzLmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMoZWxlLCAnc291cmNlJyk7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3RhcmdldCcpO1xuICB9XG59O1xuQlJwJDkuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciB0ZXh0ID0gdGhpcy5nZXRMYWJlbFRleHQoZWxlLCBwcmVmaXgpO1xuICB2YXIgbGFiZWxEaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXh0KTtcbiAgdmFyIGxpbmVIZWlnaHQgPSBlbGUucHN0eWxlKCdsaW5lLWhlaWdodCcpLnBmVmFsdWU7XG4gIHZhciB0ZXh0V3JhcCA9IGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnN0clZhbHVlO1xuICB2YXIgbGluZXMgPSBnZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpIHx8IFtdO1xuICB2YXIgbnVtTGluZXMgPSB0ZXh0V3JhcCAhPT0gJ3dyYXAnID8gMSA6IE1hdGgubWF4KGxpbmVzLmxlbmd0aCwgMSk7XG4gIHZhciBub3JtUGVyTGluZUhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgLyBudW1MaW5lcztcbiAgdmFyIGxhYmVsTGluZUhlaWdodCA9IG5vcm1QZXJMaW5lSGVpZ2h0ICogbGluZUhlaWdodDtcbiAgdmFyIHdpZHRoID0gbGFiZWxEaW1zLndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gbGFiZWxEaW1zLmhlaWdodCArIChudW1MaW5lcyAtIDEpICogKGxpbmVIZWlnaHQgLSAxKSAqIG5vcm1QZXJMaW5lSGVpZ2h0O1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4LCBoZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4LCBsYWJlbExpbmVIZWlnaHQpO1xufTtcbkJScCQ5LmdldExhYmVsVGV4dCA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwZmQgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHBmZCArICdsYWJlbCcpLnN0clZhbHVlO1xuICB2YXIgdGV4dFRyYW5zZm9ybSA9IGVsZS5wc3R5bGUoJ3RleHQtdHJhbnNmb3JtJykudmFsdWU7XG4gIHZhciByc2NyYXRjaCA9IGZ1bmN0aW9uIHJzY3JhdGNoKHByb3BOYW1lLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGZvciBlbXB0eSB0ZXh0LCBza2lwIGFsbCBwcm9jZXNzaW5nXG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbm9uZScpIDsgZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbG93ZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgdmFyIHdyYXBTdHlsZSA9IGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlO1xuICBpZiAod3JhcFN0eWxlID09PSAnd3JhcCcpIHtcbiAgICB2YXIgbGFiZWxLZXkgPSByc2NyYXRjaCgnbGFiZWxLZXknKTtcblxuICAgIC8vIHNhdmUgcmVjYWxjIGlmIHRoZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyBiZWZvcmVcbiAgICBpZiAobGFiZWxLZXkgIT0gbnVsbCAmJiByc2NyYXRjaCgnbGFiZWxXcmFwS2V5JykgPT09IGxhYmVsS2V5KSB7XG4gICAgICByZXR1cm4gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnKTtcbiAgICB9XG4gICAgdmFyIHp3c3AgPSBcIlxcdTIwMEJcIjtcbiAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICB2YXIgbWF4VyA9IGVsZS5wc3R5bGUoJ3RleHQtbWF4LXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgb3ZlcmZsb3cgPSBlbGUucHN0eWxlKCd0ZXh0LW92ZXJmbG93LXdyYXAnKS52YWx1ZTtcbiAgICB2YXIgb3ZlcmZsb3dBbnkgPSBvdmVyZmxvdyA9PT0gJ2FueXdoZXJlJztcbiAgICB2YXIgd3JhcHBlZExpbmVzID0gW107XG4gICAgdmFyIHdvcmRzUmVnZXggPSAvW1xcc1xcdTIwMGJdKy87XG4gICAgdmFyIHdvcmRTZXBhcmF0b3IgPSBvdmVyZmxvd0FueSA/ICcnIDogJyAnO1xuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICB2YXIgbGluZURpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGxpbmUpO1xuICAgICAgdmFyIGxpbmVXID0gbGluZURpbXMud2lkdGg7XG4gICAgICBpZiAob3ZlcmZsb3dBbnkpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnNwbGl0KCcnKS5qb2luKHp3c3ApO1xuICAgICAgICBsaW5lID0gcHJvY2Vzc2VkTGluZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lVyA+IG1heFcpIHtcbiAgICAgICAgLy8gbGluZSBpcyB0b28gbG9uZ1xuICAgICAgICB2YXIgd29yZHMgPSBsaW5lLnNwbGl0KHdvcmRzUmVnZXgpO1xuICAgICAgICB2YXIgc3VibGluZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciB3ID0gMDsgdyA8IHdvcmRzLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1t3XTtcbiAgICAgICAgICB2YXIgdGVzdExpbmUgPSBzdWJsaW5lLmxlbmd0aCA9PT0gMCA/IHdvcmQgOiBzdWJsaW5lICsgd29yZFNlcGFyYXRvciArIHdvcmQ7XG4gICAgICAgICAgdmFyIHRlc3REaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXN0TGluZSk7XG4gICAgICAgICAgdmFyIHRlc3RXID0gdGVzdERpbXMud2lkdGg7XG4gICAgICAgICAgaWYgKHRlc3RXIDw9IG1heFcpIHtcbiAgICAgICAgICAgIC8vIHdvcmQgZml0cyBvbiBjdXJyZW50IGxpbmVcbiAgICAgICAgICAgIHN1YmxpbmUgKz0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdvcmQgc3RhcnRzIG5ldyBsaW5lXG4gICAgICAgICAgICBpZiAoc3VibGluZSkge1xuICAgICAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YmxpbmUgPSB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIHJlbWFpbmluZyB0ZXh0LCBwdXQgaXQgaW4gYSB3cmFwcGVkIGxpbmVcbiAgICAgICAgaWYgKCFzdWJsaW5lLm1hdGNoKC9eW1xcc1xcdTIwMGJdKyQvKSkge1xuICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsaW5lIGlzIGFscmVhZHkgc2hvcnQgZW5vdWdoXG4gICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH0gLy8gZm9yXG5cbiAgICByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCB3cmFwcGVkTGluZXMpO1xuICAgIHRleHQgPSByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkVGV4dCcsIHdyYXBwZWRMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScsIGxhYmVsS2V5KTtcbiAgfSBlbHNlIGlmICh3cmFwU3R5bGUgPT09ICdlbGxpcHNpcycpIHtcbiAgICB2YXIgX21heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGVsbGlwc2l6ZWQgPSAnJztcbiAgICB2YXIgZWxsaXBzaXMgPSBcIlxcdTIwMjZcIjtcbiAgICB2YXIgaW5jTGFzdENoID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGV4dCkud2lkdGggPCBfbWF4Vykge1xuICAgICAgLy8gdGhlIGxhYmVsIGFscmVhZHkgZml0c1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdpZHRoV2l0aE5leHRDaCA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgZWxsaXBzaXplZCArIHRleHRbaV0gKyBlbGxpcHNpcykud2lkdGg7XG4gICAgICBpZiAod2lkdGhXaXRoTmV4dENoID4gX21heFcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlbGxpcHNpemVkICs9IHRleHRbaV07XG4gICAgICBpZiAoaSA9PT0gdGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGluY0xhc3RDaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaW5jTGFzdENoKSB7XG4gICAgICBlbGxpcHNpemVkICs9IGVsbGlwc2lzO1xuICAgIH1cbiAgICByZXR1cm4gZWxsaXBzaXplZDtcbiAgfSAvLyBpZiBlbGxpcHNpemVcblxuICByZXR1cm4gdGV4dDtcbn07XG5CUnAkOS5nZXRMYWJlbEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBqdXN0aWZpY2F0aW9uID0gZWxlLnBzdHlsZSgndGV4dC1qdXN0aWZpY2F0aW9uJykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0SGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcbiAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdhdXRvJykge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHN3aXRjaCAodGV4dEhhbGlnbikge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBqdXN0aWZpY2F0aW9uO1xuICB9XG59O1xuQlJwJDkuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZSwgdGV4dCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjYWNoZUtleSA9IGhhc2hTdHJpbmcodGV4dCwgZWxlLl9wcml2YXRlLmxhYmVsRGltc0tleSk7XG4gIHZhciBjYWNoZSA9IHIubGFiZWxEaW1DYWNoZSB8fCAoci5sYWJlbERpbUNhY2hlID0gW10pO1xuICB2YXIgZXhpc3RpbmdWYWwgPSBjYWNoZVtjYWNoZUtleV07XG4gIGlmIChleGlzdGluZ1ZhbCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nVmFsO1xuICB9XG4gIHZhciBwYWRkaW5nID0gMDsgLy8gYWRkIHBhZGRpbmcgYXJvdW5kIHRleHQgZGltcywgYXMgdGhlIG1lYXN1cmVtZW50IGlzbid0IHRoYXQgYWNjdXJhdGVcbiAgdmFyIGZTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgZmFtaWx5ID0gZWxlLnBzdHlsZSgnZm9udC1mYW1pbHknKS5zdHJWYWx1ZTtcbiAgdmFyIHdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBjYW52YXMgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhcztcbiAgdmFyIGMyZCA9IHRoaXMubGFiZWxDYWxjQ2FudmFzQ29udGV4dDtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGMyZCA9IHRoaXMubGFiZWxDYWxjQ2FudmFzQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBkcyA9IGNhbnZhcy5zdHlsZTtcbiAgICBkcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZHMubGVmdCA9ICctOTk5OXB4JztcbiAgICBkcy50b3AgPSAnLTk5OTlweCc7XG4gICAgZHMuekluZGV4ID0gJy0xJztcbiAgICBkcy52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgZHMucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgfVxuICBjMmQuZm9udCA9IFwiXCIuY29uY2F0KGZTdHlsZSwgXCIgXCIpLmNvbmNhdCh3ZWlnaHQsIFwiIFwiKS5jb25jYXQoc2l6ZSwgXCJweCBcIikuY29uY2F0KGZhbWlseSk7XG4gIHZhciB3aWR0aCA9IDA7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsaW5lID0gbGluZXNbaV07XG4gICAgdmFyIG1ldHJpY3MgPSBjMmQubWVhc3VyZVRleHQobGluZSk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwobWV0cmljcy53aWR0aCk7XG4gICAgdmFyIGggPSBzaXplO1xuICAgIHdpZHRoID0gTWF0aC5tYXgodywgd2lkdGgpO1xuICAgIGhlaWdodCArPSBoO1xuICB9XG4gIHdpZHRoICs9IHBhZGRpbmc7XG4gIGhlaWdodCArPSBwYWRkaW5nO1xuICByZXR1cm4gY2FjaGVbY2FjaGVLZXldID0ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIHByZWZpeERhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciByb3RTdHIgPSByb3Quc3RyVmFsdWU7XG4gIGlmIChyb3RTdHIgPT09ICdub25lJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGlzRWRnZSAmJiByb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiBycy5sYWJlbEF1dG9BbmdsZTtcbiAgfSBlbHNlIGlmIChyb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByb3QucGZWYWx1ZTtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGVzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHJzLmxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlKTtcbiAgaWYgKGlzRWRnZSkge1xuICAgIHJzLnNvdXJjZUxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAnc291cmNlJyk7XG4gICAgcnMudGFyZ2V0TGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcblxudmFyIEJScCQ4ID0ge307XG52YXIgVE9PX1NNQUxMX0NVVF9SRUNUID0gMjg7XG52YXIgd2FybmVkQ3V0UmVjdCA9IGZhbHNlO1xuQlJwJDguZ2V0Tm9kZVNoYXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgaWYgKHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyAmJiAobm9kZS53aWR0aCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUIHx8IG5vZGUuaGVpZ2h0KCkgPCBUT09fU01BTExfQ1VUX1JFQ1QpKSB7XG4gICAgaWYgKCF3YXJuZWRDdXRSZWN0KSB7XG4gICAgICB3YXJuKCdUaGUgYGN1dHJlY3RhbmdsZWAgbm9kZSBzaGFwZSBjYW4gbm90IGJlIHVzZWQgYXQgc21hbGwgc2l6ZXMgc28gYHJlY3RhbmdsZWAgaXMgdXNlZCBpbnN0ZWFkJyk7XG4gICAgICB3YXJuZWRDdXRSZWN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICB9XG4gIGlmIChub2RlLmlzUGFyZW50KCkpIHtcbiAgICBpZiAoc2hhcGUgPT09ICdyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2JhcnJlbCcpIHtcbiAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICAgIH1cbiAgfVxuICBpZiAoc2hhcGUgPT09ICdwb2x5Z29uJykge1xuICAgIHZhciBwb2ludHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS52YWx1ZTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzLm1ha2VQb2x5Z29uKHBvaW50cykubmFtZTtcbiAgfVxuICByZXR1cm4gc2hhcGU7XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcbkJScCQ3LnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGVsZXMpIHtcbiAgICB2YXIgZGlydHlTdHlsZUNhY2hlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBlbGVzVG9VcGRhdGUubWVyZ2UoZWxlcyk7XG4gICAgaWYgKGRpcnR5U3R5bGVDYWNoZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByLmJpbmRlcihjeSkub24oJ2JvdW5kcy4qIGRpcnR5LionLCBmdW5jdGlvbiBvbkRpcnR5Qm91bmRzKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUpO1xuICB9KS5vbignc3R5bGUuKiBiYWNrZ3JvdW5kLionLCBmdW5jdGlvbiBvbkRpcnR5U3R5bGUoZSkge1xuICAgIHZhciBlbGUgPSBlLnRhcmdldDtcbiAgICBlbnF1ZXVlKGVsZSwgZmFsc2UpO1xuICB9KTtcbiAgdmFyIHVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gdXBkYXRlRWxlQ2FsY3Mod2lsbERyYXcpIHtcbiAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgIHZhciBmbnMgPSByLm9uVXBkYXRlRWxlQ2FsY3NGbnM7XG5cbiAgICAgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBoYXZlIHVwLXRvLWRhdGUgc3R5bGUgKGUuZy4gc3R5bGVzaGVldCBtYXBwZXJzKVxuICAgICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHJlbmRlcmVkIHN0eWxlIChhbmQgcHN0eWxlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgeWV0KVxuICAgICAgZWxlc1RvVXBkYXRlLmNsZWFuU3R5bGUoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzVG9VcGRhdGVbaV07XG4gICAgICAgIHZhciByc3R5bGUgPSBlbGUuX3ByaXZhdGUucnN0eWxlO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpICYmICFyc3R5bGUuY2xlYW5Db25uZWN0ZWQpIHtcbiAgICAgICAgICBlbnF1ZXVlKGVsZS5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm5zKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGZuID0gZm5zW19pXTtcbiAgICAgICAgICBmbih3aWxsRHJhdywgZWxlc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWxlc1RvVXBkYXRlKTtcbiAgICAgIGVsZXNUb1VwZGF0ZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG4gIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlRWxlQ2FsY3ModHJ1ZSk7XG4gIH07XG4gIHIuYmVmb3JlUmVuZGVyKHVwZGF0ZUVsZUNhbGNzLCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlQ2FsY3MpO1xufTtcbkJScCQ3Lm9uVXBkYXRlRWxlQ2FsY3MgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyB8fCBbXTtcbiAgZm5zLnB1c2goZm4pO1xufTtcbkJScCQ3LnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVzLCB1c2VDYWNoZSkge1xuICB2YXIgaXNDbGVhbkNvbm5lY3RlZCA9IGZ1bmN0aW9uIGlzQ2xlYW5Db25uZWN0ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5yc3R5bGUuY2xlYW5Db25uZWN0ZWQ7XG4gIH07XG4gIHZhciBlZGdlcyA9IFtdO1xuICB2YXIgbm9kZXMgPSBbXTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgdXNlZCBmb3IgY2FsY3Mgd2hlbiBkZXN0cm95ZWQsIGUuZy4gZWxlLmJvdW5kaW5nQm94KClcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gdXNlIGNhY2hlIGJ5IGRlZmF1bHQgZm9yIHBlcmZcbiAgaWYgKHVzZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICB1c2VDYWNoZSA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG5cbiAgICAvLyBhbiBlZGdlIG1heSBiZSBpbXBsaWNpdGx5IGRpcnR5IGIvYyBvZiBvbmUgb2YgaXRzIGNvbm5lY3RlZCBub2Rlc1xuICAgIC8vIChhbmQgYSByZXF1ZXN0IGZvciByZWNhbGMgbWF5IGNvbWUgaW4gYmV0d2VlbiBmcmFtZXMpXG4gICAgaWYgKGVsZS5pc0VkZ2UoKSAmJiAoIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnNvdXJjZSgpKSB8fCAhaXNDbGVhbkNvbm5lY3RlZChlbGUudGFyZ2V0KCkpKSkge1xuICAgICAgcnN0eWxlLmNsZWFuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gb25seSB1cGRhdGUgaWYgZGlydHkgYW5kIGluIGdyYXBoXG4gICAgaWYgKHVzZUNhY2hlICYmIHJzdHlsZS5jbGVhbiB8fCBlbGUucmVtb3ZlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IHVwZGF0ZSBpZiBub3QgZGlzcGxheTogbm9uZVxuICAgIGlmIChlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgPT09ICdub25lJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChfcC5ncm91cCA9PT0gJ25vZGVzJykge1xuICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlZGdlc1xuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByc3R5bGUuY2xlYW4gPSB0cnVlO1xuICB9XG5cbiAgLy8gdXBkYXRlIG5vZGUgZGF0YSBmcm9tIHByb2plY3Rpb25zXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2VsZSA9IG5vZGVzW19pMl07XG4gICAgdmFyIF9wMiA9IF9lbGUuX3ByaXZhdGU7XG4gICAgdmFyIF9yc3R5bGUgPSBfcDIucnN0eWxlO1xuICAgIHZhciBwb3MgPSBfZWxlLnBvc2l0aW9uKCk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZU5vZGVMYWJlbFByb2plY3Rpb24oX2VsZSk7XG4gICAgX3JzdHlsZS5ub2RlWCA9IHBvcy54O1xuICAgIF9yc3R5bGUubm9kZVkgPSBwb3MueTtcbiAgICBfcnN0eWxlLm5vZGVXID0gX2VsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICBfcnN0eWxlLm5vZGVIID0gX2VsZS5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWU7XG4gIH1cbiAgdGhpcy5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyhlZGdlcyk7XG5cbiAgLy8gdXBkYXRlIGVkZ2UgZGF0YSBmcm9tIHByb2plY3Rpb25zXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGVkZ2VzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgX2VsZTIgPSBlZGdlc1tfaTNdO1xuICAgIHZhciBfcDMgPSBfZWxlMi5fcHJpdmF0ZTtcbiAgICB2YXIgX3JzdHlsZTIgPSBfcDMucnN0eWxlO1xuICAgIHZhciBycyA9IF9wMy5yc2NyYXRjaDtcblxuICAgIC8vIHVwZGF0ZSByc3R5bGUgcG9zaXRpb25zXG4gICAgX3JzdHlsZTIuc3JjWCA9IHJzLmFycm93U3RhcnRYO1xuICAgIF9yc3R5bGUyLnNyY1kgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBfcnN0eWxlMi50Z3RYID0gcnMuYXJyb3dFbmRYO1xuICAgIF9yc3R5bGUyLnRndFkgPSBycy5hcnJvd0VuZFk7XG4gICAgX3JzdHlsZTIubWlkWCA9IHJzLm1pZFg7XG4gICAgX3JzdHlsZTIubWlkWSA9IHJzLm1pZFk7XG4gICAgX3JzdHlsZTIubGFiZWxBbmdsZSA9IHJzLmxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIuc291cmNlTGFiZWxBbmdsZSA9IHJzLnNvdXJjZUxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIudGFyZ2V0TGFiZWxBbmdsZSA9IHJzLnRhcmdldExhYmVsQW5nbGU7XG4gIH1cbn07XG5cbnZhciBCUnAkNiA9IHt9O1xuQlJwJDYudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGVzID0gdGhpcy5jYWNoZWRaU29ydGVkRWxlcztcbiAgaWYgKCFlbGVzKSB7XG4gICAgLy8ganVzdCBsZXQgdGhpcyBiZSByZWNhbGN1bGF0ZWQgb24gdGhlIG5leHQgeiBzb3J0IHRpY2tcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlcy5kcmFnID0gW107XG4gIGVsZXMubm9uZHJhZyA9IFtdO1xuICB2YXIgZ3JhYlRhcmdldHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHJzID0gZWxlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIGlmIChlbGUuZ3JhYmJlZCgpICYmICFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgZ3JhYlRhcmdldHMucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAocnMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVsZXMuZHJhZy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMubm9uZHJhZy5wdXNoKGVsZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHV0IHRoZSBncmFiIHRhcmdldCBub2RlcyBsYXN0IHNvIGl0J3Mgb24gdG9wIG9mIGl0cyBuZWlnaGJvdXJob29kXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhYlRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZ3JhYlRhcmdldHNbaV07XG4gICAgZWxlcy5kcmFnLnB1c2goZWxlKTtcbiAgfVxufTtcbkJScCQ2LmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYWNoZWRaU29ydGVkRWxlcyA9IG51bGw7XG59O1xuQlJwJDYuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoZm9yY2VSZWNhbGMpIHtcbiAgaWYgKGZvcmNlUmVjYWxjIHx8ICF0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLmN5Lm11dGFibGVFbGVtZW50cygpLnRvQXJyYXkoKTtcbiAgICBlbGVzLnNvcnQoekluZGV4U29ydCk7XG4gICAgZWxlcy5pbnRlcmFjdGl2ZSA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaW50ZXJhY3RpdmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gZWxlcztcbiAgICB0aGlzLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH0gZWxzZSB7XG4gICAgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG4gIH1cbiAgcmV0dXJuIGVsZXM7XG59O1xuXG52YXIgQlJwJDUgPSB7fTtcbltCUnAkZSwgQlJwJGQsIEJScCRjLCBCUnAkYiwgQlJwJGEsIEJScCQ5LCBCUnAkOCwgQlJwJDcsIEJScCQ2XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwJDUsIHByb3BzKTtcbn0pO1xuXG52YXIgQlJwJDQgPSB7fTtcbkJScCQ0LmdldENhY2hlZEltYWdlID0gZnVuY3Rpb24gKHVybCwgY3Jvc3NPcmlnaW4sIG9uTG9hZCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpbWFnZUNhY2hlID0gci5pbWFnZUNhY2hlID0gci5pbWFnZUNhY2hlIHx8IHt9O1xuICB2YXIgY2FjaGUgPSBpbWFnZUNhY2hlW3VybF07XG4gIGlmIChjYWNoZSkge1xuICAgIGlmICghY2FjaGUuaW1hZ2UuY29tcGxldGUpIHtcbiAgICAgIGNhY2hlLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGUuaW1hZ2U7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGUgPSBpbWFnZUNhY2hlW3VybF0gPSBpbWFnZUNhY2hlW3VybF0gfHwge307XG4gICAgdmFyIGltYWdlID0gY2FjaGUuaW1hZ2UgPSBuZXcgSW1hZ2UoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpbWFnZS5lcnJvciA9IHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyAjMTU4MiBzYWZhcmkgZG9lc24ndCBsb2FkIGRhdGEgdXJpcyB3aXRoIGNyb3NzT3JpZ2luIHByb3Blcmx5XG4gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgIHZhciBkYXRhVXJpUHJlZml4ID0gJ2RhdGE6JztcbiAgICB2YXIgaXNEYXRhVXJpID0gdXJsLnN1YnN0cmluZygwLCBkYXRhVXJpUHJlZml4Lmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVVyaVByZWZpeDtcbiAgICBpZiAoIWlzRGF0YVVyaSkge1xuICAgICAgLy8gaWYgY3Jvc3NvcmlnaW4gaXMgJ251bGwnKHN0cmluZ2lmaWVkKSwgdGhlbiBtYW51YWxseSBzZXQgaXQgdG8gbnVsbCBcbiAgICAgIGNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW4gPT09ICdudWxsJyA/IG51bGwgOiBjcm9zc09yaWdpbjtcbiAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47IC8vIHByZXZlbnQgdGFpbnRlZCBjYW52YXNcbiAgICB9XG5cbiAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIGltYWdlO1xuICB9XG59O1xuXG52YXIgQlJwJDMgPSB7fTtcblxuLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIFJlc2l6ZU9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyICovXG5cbkJScCQzLnJlZ2lzdGVyQmluZGluZyA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbMV0pOyAvLyBjb3B5XG4gIHZhciBiID0gdGhpcy5iaW5kZXIodGFyZ2V0KTtcbiAgcmV0dXJuIGIub24uYXBwbHkoYiwgYXJncyk7XG59O1xuQlJwJDMuYmluZGVyID0gZnVuY3Rpb24gKHRndCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgdGd0SXNEb20gPSB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdyB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudCB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudC5ib2R5IHx8IGRvbUVsZW1lbnQodGd0KTtcbiAgaWYgKHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID09IG51bGwpIHtcbiAgICAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29udGFpbmVyV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWRcbiAgICB9XG4gICAgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmU7XG4gIH1cbiAgdmFyIG9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgaWYgKHRndElzRG9tICYmIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzKSB7XG4gICAgICAvLyByZXBsYWNlIHVzZUNhcHR1cmUgdy8gb3B0cyBvYmpcbiAgICAgIGFyZ3NbMl0gPSB7XG4gICAgICAgIGNhcHR1cmU6IHVzZUNhcHR1cmUgIT0gbnVsbCA/IHVzZUNhcHR1cmUgOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICByLmJpbmRpbmdzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgKHRndC5hZGRFdmVudExpc3RlbmVyIHx8IHRndC5vbikuYXBwbHkodGd0LCBhcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvbjogb24sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogb24sXG4gICAgYWRkTGlzdGVuZXI6IG9uLFxuICAgIGJpbmQ6IG9uXG4gIH07XG59O1xuQlJwJDMubm9kZUlzRHJhZ2dhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5pc05vZGUoKSAmJiAhbm9kZS5sb2NrZWQoKSAmJiBub2RlLmdyYWJiYWJsZSgpO1xufTtcbkJScCQzLm5vZGVJc0dyYWJiYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiB0aGlzLm5vZGVJc0RyYWdnYWJsZShub2RlKSAmJiBub2RlLmludGVyYWN0aXZlKCk7XG59O1xuQlJwJDMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfTtcbiAgdmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzKHRhcmdldCwgbmFtZXMsIGUsIHBvc2l0aW9uKSB7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICB0YXJnZXQgPSByLmN5O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdGFyZ2V0LmVtaXQoe1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiBuYW1lLFxuICAgICAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGlzTXVsdFNlbEtleURvd24gPSBmdW5jdGlvbiBpc011bHRTZWxLZXlEb3duKGUpIHtcbiAgICByZXR1cm4gZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5OyAvLyBtYXliZSBlLmFsdEtleVxuICB9O1xuXG4gIHZhciBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaCA9IGZ1bmN0aW9uIGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKGRvd24sIGRvd25zKSB7XG4gICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuICAgIGlmIChyLmN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBkb3duICYmIGRvd24ucGFubmFibGUoKSkge1xuICAgICAgLy8gYSBncmFiYmFibGUgY29tcG91bmQgbm9kZSBiZWxvdyB0aGUgZWxlID0+IG5vIHBhc3N0aHJvdWdoIHBhbm5pbmdcbiAgICAgIGZvciAodmFyIGkgPSAwOyBkb3ducyAmJiBpIDwgZG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRvd24gPSBkb3duc1tpXTtcblxuICAgICAgICAvL2lmIGFueSBwYXJlbnQgbm9kZSBpbiBldmVudCBoaWVyYXJjaHkgaXNuJ3QgcGFubmFibGUsIHJlamVjdCBwYXNzdGhyb3VnaFxuICAgICAgICBpZiAoZG93bi5pc05vZGUoKSAmJiBkb3duLmlzUGFyZW50KCkgJiYgIWRvd24ucGFubmFibGUoKSkge1xuICAgICAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbG93UGFzc3Rocm91Z2g7XG4gIH07XG4gIHZhciBzZXRHcmFiYmVkID0gZnVuY3Rpb24gc2V0R3JhYmJlZChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUuZ3JhYmJlZCA9IHRydWU7XG4gIH07XG4gIHZhciBzZXRGcmVlZCA9IGZ1bmN0aW9uIHNldEZyZWVkKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gIH07XG4gIHZhciBzZXRJbkRyYWdMYXllciA9IGZ1bmN0aW9uIHNldEluRHJhZ0xheWVyKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbkRyYWdMYXllciA9IHRydWU7XG4gIH07XG4gIHZhciBzZXRPdXREcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRPdXREcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gIH07XG4gIHZhciBzZXRHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gc2V0R3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIHJlbW92ZUdyYWJUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVHcmFiVGFyZ2V0KGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pc0dyYWJUYXJnZXQgPSBmYWxzZTtcbiAgfTtcbiAgdmFyIGFkZFRvRHJhZ0xpc3QgPSBmdW5jdGlvbiBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cykge1xuICAgIHZhciBsaXN0ID0gb3B0cy5hZGRUb0xpc3Q7XG4gICAgdmFyIGxpc3RIYXNFbGUgPSBsaXN0LmhhcyhlbGUpO1xuICAgIGlmICghbGlzdEhhc0VsZSAmJiBlbGUuZ3JhYmJhYmxlKCkgJiYgIWVsZS5sb2NrZWQoKSkge1xuICAgICAgbGlzdC5tZXJnZShlbGUpO1xuICAgICAgc2V0R3JhYmJlZChlbGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNoaWxkIG5vZGVzIGFuZCBpbm5lciBlZGdlc1xuICAvLyBvZiBhIGNvbXBvdW5kIG5vZGUgdG8gYmUgZHJhZ2dlZCBhcyB3ZWxsIGFzIHRoZSBncmFiYmVkIGFuZCBzZWxlY3RlZCBub2Rlc1xuICB2YXIgYWRkRGVzY2VuZGFudHNUb0RyYWcgPSBmdW5jdGlvbiBhZGREZXNjZW5kYW50c1RvRHJhZyhub2RlLCBvcHRzKSB7XG4gICAgaWYgKCFub2RlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyID09IG51bGwgJiYgb3B0cy5hZGRUb0xpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm90aGluZyB0byBkb1xuXG4gICAgdmFyIGlubmVyTm9kZXMgPSBub2RlLmRlc2NlbmRhbnRzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGlubmVyTm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBpbm5lck5vZGVzLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgYWRkVG9EcmFnTGlzdChpbm5lck5vZGVzLCBvcHRzKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYWRkcyB0aGUgZ2l2ZW4gbm9kZXMgYW5kIGl0cyBuZWlnaGJvdXJob29kIHRvIHRoZSBkcmFnIGxheWVyXG4gIHZhciBhZGROb2Rlc1RvRHJhZyA9IGZ1bmN0aW9uIGFkZE5vZGVzVG9EcmFnKG5vZGVzLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBub2Rlcy5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgbm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBub2Rlcy5uZWlnaGJvcmhvb2QoKS5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICByZXR1cm4gIWhhc0NvbXBvdW5kTm9kZXMgfHwgZWxlLmlzRWRnZSgpO1xuICAgICAgfSkuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhZGREZXNjZW5kYW50c1RvRHJhZyhub2Rlcywgb3B0cyk7IC8vIGFsd2F5cyBhZGQgdG8gZHJhZ1xuXG4gICAgLy8gYWxzbyBhZGQgbm9kZXMgYW5kIGVkZ2VzIHJlbGF0ZWQgdG8gdGhlIHRvcG1vc3QgYW5jZXN0b3JcbiAgICB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2Rlcywge1xuICAgICAgaW5EcmFnTGF5ZXI6IG9wdHMuaW5EcmFnTGF5ZXJcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07XG4gIHZhciBhZGROb2RlVG9EcmFnID0gYWRkTm9kZXNUb0RyYWc7XG4gIHZhciBmcmVlRHJhZ2dlZEVsZW1lbnRzID0gZnVuY3Rpb24gZnJlZURyYWdnZWRFbGVtZW50cyhncmFiYmVkRWxlcykge1xuICAgIGlmICghZ3JhYmJlZEVsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBqdXN0IGdvIG92ZXIgYWxsIGVsZW1lbnRzIHJhdGhlciB0aGFuIGRvaW5nIGEgYnVuY2ggb2YgKHBvc3NpYmx5IGV4cGVuc2l2ZSkgdHJhdmVyc2Fsc1xuICAgIHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHNldEZyZWVkKGVsZSk7XG4gICAgICBzZXRPdXREcmFnTGF5ZXIoZWxlKTtcbiAgICAgIHJlbW92ZUdyYWJUYXJnZXQoZWxlKTtcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07XG5cbiAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBhbmNlc3RvciBub2RlcyBhbmQgZWRnZXMgc2hvdWxkIGdvXG4gIC8vIHRvIHRoZSBkcmFnIGxheWVyIChvciBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGRyYWcgbGF5ZXIpLlxuICB2YXIgdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2RlLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIgPT0gbnVsbCAmJiBvcHRzLmFkZFRvTGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBub3RoaW5nIHRvIGRvXG5cbiAgICBpZiAoIW5vZGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmaW5kIHRvcC1sZXZlbCBwYXJlbnRcbiAgICB2YXIgcGFyZW50ID0gbm9kZS5hbmNlc3RvcnMoKS5vcnBoYW5zKCk7XG5cbiAgICAvLyBubyBwYXJlbnQgbm9kZTogbm8gbm9kZXMgdG8gYWRkIHRvIHRoZSBkcmFnIGxheWVyXG4gICAgaWYgKHBhcmVudC5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBub2RlcyA9IHBhcmVudC5kZXNjZW5kYW50cygpLnNwYXduU2VsZigpLm1lcmdlKHBhcmVudCkudW5tZXJnZShub2RlKS51bm1lcmdlKG5vZGUuZGVzY2VuZGFudHMoKSk7XG4gICAgdmFyIGVkZ2VzID0gbm9kZXMuY29ubmVjdGVkRWRnZXMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgZWRnZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICB2YXIgYmx1ckFjdGl2ZURvbUVsZW1lbnQgPSBmdW5jdGlvbiBibHVyQWN0aXZlRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciAhPSBudWxsKSB7XG4gICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYXZlTXV0YXRpb25zQXBpID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgaGF2ZVJlc2l6ZU9ic2VydmVyQXBpID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcblxuICAvLyB3YXRjaCBmb3Igd2hlbiB0aGUgY3kgY29udGFpbmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9tXG4gIGlmIChoYXZlTXV0YXRpb25zQXBpKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRucykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbXV0biA9IG11dG5zW2ldO1xuICAgICAgICB2YXIgck5vZGVzID0gbXV0bi5yZW1vdmVkTm9kZXM7XG4gICAgICAgIGlmIChyTm9kZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHJOb2RlID0gck5vZGVzW2pdO1xuICAgICAgICAgICAgaWYgKHJOb2RlID09PSByLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICByLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHIuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHIucmVtb3ZlT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lci5wYXJlbnROb2RlLCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnRE9NTm9kZVJlbW92ZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgci5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIG9uUmVzaXplID0gZGVib3VuY2VfMShmdW5jdGlvbiAoKSB7XG4gICAgci5jeS5yZXNpemUoKTtcbiAgfSwgMTAwKTtcbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuc3R5bGVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvLyBhdXRvIHJlc2l6ZVxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdyZXNpemUnLCBvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaGF2ZVJlc2l6ZU9ic2VydmVyQXBpKSB7XG4gICAgci5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lcik7XG4gIH1cbiAgdmFyIGZvckVhY2hVcCA9IGZ1bmN0aW9uIGZvckVhY2hVcChkb21FbGUsIGZuKSB7XG4gICAgd2hpbGUgKGRvbUVsZSAhPSBudWxsKSB7XG4gICAgICBmbihkb21FbGUpO1xuICAgICAgZG9tRWxlID0gZG9tRWxlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9O1xuICB2YXIgaW52YWxpZGF0ZUNvb3JkcyA9IGZ1bmN0aW9uIGludmFsaWRhdGVDb29yZHMoKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgfTtcbiAgZm9yRWFjaFVwKHIuY29udGFpbmVyLCBmdW5jdGlvbiAoZG9tRWxlKSB7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAndHJhbnNpdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ2FuaW1hdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3Njcm9sbCcsIGludmFsaWRhdGVDb29yZHMpO1xuICB9KTtcblxuICAvLyBzdG9wIHJpZ2h0IGNsaWNrIG1lbnUgZnJvbSBhcHBlYXJpbmcgb24gY3lcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gZnVuY3Rpb24gaW5Cb3hTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHIuc2VsZWN0aW9uWzRdICE9PSAwO1xuICB9O1xuICB2YXIgZXZlbnRJbkNvbnRhaW5lciA9IGZ1bmN0aW9uIGV2ZW50SW5Db250YWluZXIoZSkge1xuICAgIC8vIHNhdmUgY3ljbGVzIGlmIG1vdXNlIGV2ZW50cyBhcmVuJ3QgdG8gYmUgY2FwdHVyZWRcbiAgICB2YXIgY29udGFpbmVyUGFnZUNvb3JkcyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgIHZhciB4ID0gY29udGFpbmVyUGFnZUNvb3Jkc1swXTtcbiAgICB2YXIgeSA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMV07XG4gICAgdmFyIHdpZHRoID0gY29udGFpbmVyUGFnZUNvb3Jkc1syXTtcbiAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUGFnZUNvb3Jkc1szXTtcbiAgICB2YXIgcG9zaXRpb25zID0gZS50b3VjaGVzID8gZS50b3VjaGVzIDogW2VdO1xuICAgIHZhciBhdExlYXN0T25lUG9zSW5zaWRlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcG9zaXRpb25zW2ldO1xuICAgICAgaWYgKHggPD0gcC5jbGllbnRYICYmIHAuY2xpZW50WCA8PSB4ICsgd2lkdGggJiYgeSA8PSBwLmNsaWVudFkgJiYgcC5jbGllbnRZIDw9IHkgKyBoZWlnaHQpIHtcbiAgICAgICAgYXRMZWFzdE9uZVBvc0luc2lkZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWF0TGVhc3RPbmVQb3NJbnNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGNvbnRhaW5lciA9IHIuY29udGFpbmVyO1xuICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICB2YXIgdFBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgIHZhciBjb250YWluZXJJc1RhcmdldCA9IGZhbHNlO1xuICAgIHdoaWxlICh0UGFyZW50KSB7XG4gICAgICBpZiAodFBhcmVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lcklzVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0UGFyZW50ID0gdFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRhaW5lcklzVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBpZiB0YXJnZXQgaXMgb3V0aXNkZSBjeSBjb250YWluZXIsIHRoZW4gdGhpcyBldmVudCBpcyBub3QgZm9yIHVzXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBQcmltYXJ5IGtleVxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIG1vdXNlZG93bkhhbmRsZXIoZSkge1xuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLmhvdmVyRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmhvdmVyRGF0YS53aGljaCA9IGUud2hpY2g7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IHBvcztcbiAgICByLmhvdmVyRGF0YS5tZG93bkdQb3MgPSBncG9zO1xuICAgIHZhciBjaGVja0ZvclRhcGhvbGQgPSBmdW5jdGlvbiBjaGVja0ZvclRhcGhvbGQoKSB7XG4gICAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQoci5ob3ZlckRhdGEudGFwaG9sZFRpbWVvdXQpO1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGVsZSA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgICAgICAgaWYgKGVsZSkge1xuICAgICAgICAgICAgZWxlLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwaG9sZCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBob2xkJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgci50YXBob2xkRHVyYXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBSaWdodCBjbGljayBidXR0b25cbiAgICBpZiAoZS53aGljaCA9PSAzKSB7XG4gICAgICByLmhvdmVyRGF0YS5jeHRTdGFydGVkID0gdHJ1ZTtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgICBuZWFyLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgci5ob3ZlckRhdGEuZG93biA9IG5lYXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICByLmhvdmVyRGF0YS5kb3duVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBQcmltYXJ5IGJ1dHRvblxuICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSAxKSB7XG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVsZW1lbnQgZHJhZ2dpbmdcbiAgICAgIHtcbiAgICAgICAgLy8gSWYgc29tZXRoaW5nIGlzIHVuZGVyIHRoZSBjdXJzb3IgYW5kIGl0IGlzIGRyYWdnYWJsZSwgcHJlcGFyZSB0byBncmFiIGl0XG4gICAgICAgIGlmIChuZWFyICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoci5ub2RlSXNHcmFiYmFibGUobmVhcikpIHtcbiAgICAgICAgICAgIHZhciBtYWtlRXZlbnQgPSBmdW5jdGlvbiBtYWtlRXZlbnQodHlwZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciB0cmlnZ2VyR3JhYiA9IGZ1bmN0aW9uIHRyaWdnZXJHcmFiKGVsZSkge1xuICAgICAgICAgICAgICBlbGUuZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2V0R3JhYlRhcmdldChuZWFyKTtcbiAgICAgICAgICAgIGlmICghbmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIGFkZE5vZGVUb0RyYWcobmVhciwge1xuICAgICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSkuZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IGN5LiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLnNlbGVjdGVkKCkgJiYgci5ub2RlSXNHcmFiYmFibGUoZWxlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKHNlbGVjdGVkTm9kZXMsIHtcbiAgICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVtZW50c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYm9uJykpO1xuICAgICAgICAgICAgICBzZWxlY3RlZE5vZGVzLmZvckVhY2godHJpZ2dlckdyYWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgci5ob3ZlckRhdGEuZG93biA9IG5lYXI7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd25zID0gbmVhcnM7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd25UaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2Vkb3duJywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9IGVsc2UgaWYgKG5lYXIucGFubmFibGUoKSkge1xuICAgICAgICBzZWxlY3RbNF0gPSAxOyAvLyBmb3IgZnV0dXJlIHBhblxuICAgICAgfVxuXG4gICAgICBjaGVja0ZvclRhcGhvbGQoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbiBib3ggY29vcmRpbmF0ZXNcbiAgICBzZWxlY3RbMF0gPSBzZWxlY3RbMl0gPSBwb3NbMF07XG4gICAgc2VsZWN0WzFdID0gc2VsZWN0WzNdID0gcG9zWzFdO1xuICB9LCBmYWxzZSk7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ21vdXNlbW92ZScsIGZ1bmN0aW9uIG1vdXNlbW92ZUhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgY2FwdHVyZSA9IHIuaG92ZXJEYXRhLmNhcHR1cmU7XG4gICAgaWYgKCFjYXB0dXJlICYmICFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIGdwb3MgPSBbZS5jbGllbnRYLCBlLmNsaWVudFldO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZ3Bvc1swXSwgZ3Bvc1sxXSk7XG4gICAgdmFyIG1kb3duUG9zID0gci5ob3ZlckRhdGEubWRvd25Qb3M7XG4gICAgdmFyIG1kb3duR1BvcyA9IHIuaG92ZXJEYXRhLm1kb3duR1BvcztcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXIgPSBudWxsO1xuICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZyAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB9XG4gICAgdmFyIGxhc3QgPSByLmhvdmVyRGF0YS5sYXN0O1xuICAgIHZhciBkb3duID0gci5ob3ZlckRhdGEuZG93bjtcbiAgICB2YXIgZGlzcCA9IFtwb3NbMF0gLSBzZWxlY3RbMl0sIHBvc1sxXSAtIHNlbGVjdFszXV07XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgdmFyIGlzT3ZlclRocmVzaG9sZERyYWc7XG4gICAgaWYgKG1kb3duR1Bvcykge1xuICAgICAgdmFyIGR4ID0gZ3Bvc1swXSAtIG1kb3duR1Bvc1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gZ3Bvc1sxXSAtIG1kb3duR1Bvc1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyA9IGlzT3ZlclRocmVzaG9sZERyYWcgPSBkaXN0MiA+PSByLmRlc2t0b3BUYXBUaHJlc2hvbGQyO1xuICAgIH1cbiAgICB2YXIgbXVsdFNlbEtleURvd24gPSBpc011bHRTZWxLZXlEb3duKGUpO1xuICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHVwZGF0ZURyYWdEZWx0YSA9IGZ1bmN0aW9uIHVwZGF0ZURyYWdEZWx0YSgpIHtcbiAgICAgIHZhciBkcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGEgfHwgW107XG4gICAgICBpZiAoZHJhZ0RlbHRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzBdKTtcbiAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnRGVsdGFbMF0gKz0gZGlzcFswXTtcbiAgICAgICAgZHJhZ0RlbHRhWzFdICs9IGRpc3BbMV07XG4gICAgICB9XG4gICAgfTtcbiAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlbW92ZScsICd2bW91c2Vtb3ZlJywgJ3RhcGRyYWcnXSwgZSwge1xuICAgICAgeDogcG9zWzBdLFxuICAgICAgeTogcG9zWzFdXG4gICAgfSk7XG4gICAgdmFyIGdvSW50b0JveE1vZGUgPSBmdW5jdGlvbiBnb0ludG9Cb3hNb2RlKCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnYm94c3RhcnQnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9O1xuXG4gICAgLy8gdHJpZ2dlciBjb250ZXh0IGRyYWcgaWYgcm1vdXNlIGRvd25cbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDMpIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG92ZXIgdGhyZXNob2xkXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2N4dGRyYWcnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ291dCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5ob3ZlckRhdGEuY3h0T3ZlciA9IG5lYXI7XG4gICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdjeHRkcmFnb3ZlcicsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRyYWcgcGFubmluZyB0aGUgZW50aXJlIGdyYXBoXG4gICAgfSBlbHNlIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgaWYgKGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgICAgdmFyIGRlbHRhUDtcbiAgICAgICAgaWYgKHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuKSB7XG4gICAgICAgICAgdmFyIG1kUG9zID0gci5ob3ZlckRhdGEubWRvd25Qb3M7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogKHBvc1swXSAtIG1kUG9zWzBdKSAqIHpvb20sXG4gICAgICAgICAgICB5OiAocG9zWzFdIC0gbWRQb3NbMV0pICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgICAgci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWx0YVAgPSB7XG4gICAgICAgICAgICB4OiBkaXNwWzBdICogem9vbSxcbiAgICAgICAgICAgIHk6IGRpc3BbMV0gKiB6b29tXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjeS5wYW5CeShkZWx0YVApO1xuICAgICAgICBjeS5lbWl0KCdkcmFncGFuJyk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkcyByZXByb2plY3QgZHVlIHRvIHBhbiBjaGFuZ2luZyB2aWV3cG9ydFxuICAgICAgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcblxuICAgICAgLy8gQ2hlY2tzIHByaW1hcnkgYnV0dG9uIGRvd24gJiBvdXQgb2YgdGltZSAmIG1vdXNlIG5vdCBtb3ZlZCBtdWNoXG4gICAgfSBlbHNlIGlmIChzZWxlY3RbNF0gPT0gMSAmJiAoZG93biA9PSBudWxsIHx8IGRvd24ucGFubmFibGUoKSkpIHtcbiAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpICYmIChtdWx0U2VsS2V5RG93biB8fCAhY3kucGFubmluZ0VuYWJsZWQoKSB8fCAhY3kudXNlclBhbm5pbmdFbmFibGVkKCkpKSB7XG4gICAgICAgICAgZ29JbnRvQm94TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goZG93biwgci5ob3ZlckRhdGEuZG93bnMpO1xuICAgICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbiA9IHRydWU7XG4gICAgICAgICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gYXJyYXkycG9pbnQobWRvd25Qb3MpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoKCFkb3duIHx8ICFkb3duLmdyYWJiZWQoKSkgJiYgbmVhciAhPSBsYXN0KSB7XG4gICAgICAgIGlmIChsYXN0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhsYXN0LCBbJ21vdXNlb3V0JywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2VvdmVyJywgJ3RhcGRyYWdvdmVyJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAvLyB0aGVuIHdlIGNhbiB0YWtlIGFjdGlvblxuXG4gICAgICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgLy8gdGhlbiBzZWxlY3Rpb24gb3ZlcnJpZGVzXG4gICAgICAgICAgICBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSkge1xuICAgICAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgICAgICAgIGRvd24uZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdmcmVlJyk7XG4gICAgICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgICAgICBkb3duLmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ29JbnRvQm94TW9kZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSAmJiByLm5vZGVJc0RyYWdnYWJsZShkb3duKSkge1xuICAgICAgICAgICAgLy8gZHJhZyBub2RlXG4gICAgICAgICAgICB2YXIganVzdFN0YXJ0ZWREcmFnID0gIXIuZHJhZ0RhdGEuZGlkRHJhZztcbiAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLmRyYWdEYXRhLmRpZERyYWcgPSB0cnVlOyAvLyBpbmRpY2F0ZSB0aGF0IHdlIGFjdHVhbGx5IGRpZCBkcmFnIHRoZSBub2RlXG5cbiAgICAgICAgICAgIC8vIG5vdywgYWRkIHRoZSBlbGVtZW50cyB0byB0aGUgZHJhZyBsYXllciBpZiBub3QgZG9uZSBhbHJlYWR5XG4gICAgICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcykge1xuICAgICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhkcmFnZ2VkRWxlbWVudHMsIHtcbiAgICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0b3RhbFNoaWZ0ID0ge1xuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKG51bWJlciQxKGRpc3BbMF0pICYmIG51bWJlciQxKGRpc3BbMV0pKSB7XG4gICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkaXNwWzBdO1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZGlzcFsxXTtcbiAgICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICAgIHZhciBkcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGE7XG4gICAgICAgICAgICAgICAgaWYgKGRyYWdEZWx0YSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMF0pICYmIG51bWJlciQxKGRyYWdEZWx0YVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkcmFnRGVsdGFbMF07XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZHJhZ0RlbHRhWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KCdwb3NpdGlvbiBkcmFnJyk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBzYXZlIGRyYWcgZGVsdGEgZm9yIHdoZW4gd2UgYWN0dWFsbHkgc3RhcnQgZHJhZ2dpbmcgc28gdGhlIHJlbGF0aXZlIGdyYWIgcG9zIGlzIGNvbnN0YW50XG4gICAgICAgICAgdXBkYXRlRHJhZ0RlbHRhKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcHJldmVudCB0aGUgZHJhZ2dpbmcgZnJvbSB0cmlnZ2VyaW5nIHRleHQgc2VsZWN0aW9uIG9uIHRoZSBwYWdlXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgfVxuICAgIHNlbGVjdFsyXSA9IHBvc1swXTtcbiAgICBzZWxlY3RbM10gPSBwb3NbMV07XG4gICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuICB2YXIgY2xpY2tUaW1lb3V0LCBkaWREb3VibGVDbGljaywgcHJldkNsaWNrVGltZVN0YW1wO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdtb3VzZXVwJywgZnVuY3Rpb24gbW91c2V1cEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgY2FwdHVyZSA9IHIuaG92ZXJEYXRhLmNhcHR1cmU7XG4gICAgaWYgKCFjYXB0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHIuaG92ZXJEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG4gICAgaWYgKHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbikge1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQgPSB0cnVlO1xuICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDsgLy8gbm90IGFjdGl2ZSBiZyBub3dcblxuICAgIGlmIChkb3duKSB7XG4gICAgICBkb3duLnVuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZG93bikge1xuICAgICAgICBkb3duLmVtaXQoY3h0RXZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmICghci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCkge1xuICAgICAgICB2YXIgY3h0VGFwID0ge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2N4dHRhcCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICBkb3duLmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dFRhcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcbiAgICAgIHIuaG92ZXJEYXRhLndoaWNoID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAxKSB7XG4gICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2V1cCcsICd0YXBlbmQnLCAndm1vdXNldXAnXSwgZSwge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAoIXIuZHJhZ0RhdGEuZGlkRHJhZyAmJlxuICAgICAgLy8gZGlkbid0IG1vdmUgYSBub2RlIGFyb3VuZFxuICAgICAgIXIuaG92ZXJEYXRhLmRyYWdnZWQgJiZcbiAgICAgIC8vIGRpZG4ndCBwYW5cbiAgICAgICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcgJiZcbiAgICAgIC8vIG5vdCBib3ggc2VsZWN0aW9uXG4gICAgICAhci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyAvLyBkaWRuJ3QgbW92ZSB0b28gbXVjaFxuICAgICAgKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wiY2xpY2tcIiwgXCJ0YXBcIiwgXCJ2Y2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH0pO1xuICAgICAgICBkaWREb3VibGVDbGljayA9IGZhbHNlO1xuICAgICAgICBpZiAoZS50aW1lU3RhbXAgLSBwcmV2Q2xpY2tUaW1lU3RhbXAgPD0gY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKSB7XG4gICAgICAgICAgY2xpY2tUaW1lb3V0ICYmIGNsZWFyVGltZW91dChjbGlja1RpbWVvdXQpO1xuICAgICAgICAgIGRpZERvdWJsZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgICBwcmV2Q2xpY2tUaW1lU3RhbXAgPSBudWxsO1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wiZGJsY2xpY2tcIiwgXCJkYmx0YXBcIiwgXCJ2ZGJsY2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRpZERvdWJsZUNsaWNrKSByZXR1cm47XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcIm9uZWNsaWNrXCIsIFwib25ldGFwXCIsIFwidm9uZWNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpO1xuICAgICAgICAgIHByZXZDbGlja1RpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERlc2VsZWN0IGFsbCBlbGVtZW50cyBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSB1bmRlciB0aGUgbW91c2UgY3Vyc29yIGFuZCB3ZSBhcmVuJ3QgZHJhZ2dpbmcgc29tZXRoaW5nXG4gICAgICBpZiAoZG93biA9PSBudWxsIC8vIG5vdCBtb3VzZWRvd24gb24gbm9kZVxuICAgICAgJiYgIXIuZHJhZ0RhdGEuZGlkRHJhZyAvLyBkaWRuJ3QgbW92ZSB0aGUgbm9kZSBhcm91bmRcbiAgICAgICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcgLy8gbm90IGJveCBzZWxlY3Rpb25cbiAgICAgICYmICFyLmhvdmVyRGF0YS5kcmFnZ2VkIC8vIGRpZG4ndCBwYW5cbiAgICAgICYmICFpc011bHRTZWxLZXlEb3duKGUpKSB7XG4gICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgaWYgKGRyYWdnZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGRyYWdnZWRFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2luZ2xlIHNlbGVjdGlvblxuICAgICAgaWYgKG5lYXIgPT0gZG93biAmJiAhci5kcmFnRGF0YS5kaWREcmFnICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCAmJiBuZWFyLl9wcml2YXRlLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIDsgZWxzZSBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnYWRkaXRpdmUnIHx8IG11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgIG5lYXIudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShuZWFyKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgICBuZWFyLnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgdmFyIGJveCA9IGN5LmNvbGxlY3Rpb24oci5nZXRBbGxJbkJveChzZWxlY3RbMF0sIHNlbGVjdFsxXSwgc2VsZWN0WzJdLCBzZWxlY3RbM10pKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgaWYgKGJveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2JveGVuZCcsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGVsZVdvdWxkQmVTZWxlY3RlZCA9IGZ1bmN0aW9uIGVsZVdvdWxkQmVTZWxlY3RlZChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKSAmJiAhZWxlLnNlbGVjdGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScpIHtcbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKGJveCkudW5zZWxlY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYm94LmVtaXQoJ2JveCcpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQoJ2JveHNlbGVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWx3YXlzIG5lZWQgcmVkcmF3IGluIGNhc2UgZWxlcyB1bnNlbGVjdGFibGVcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGRyYWcgcGFuXG4gICAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG4gICAgICBpZiAoIXNlbGVjdFs0XSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHZhciBkb3duV2FzR3JhYmJlZCA9IGRvd24gJiYgZG93bi5ncmFiYmVkKCk7XG4gICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGRvd25XYXNHcmFiYmVkKSB7XG4gICAgICAgICAgZG93bi5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIGRvd24uZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBlbHNlIG5vdCByaWdodCBtb3VzZVxuXG4gICAgc2VsZWN0WzRdID0gMDtcbiAgICByLmhvdmVyRGF0YS5kb3duID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS5jeHRTdGFydGVkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuc2VsZWN0aW5nID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyA9IGZhbHNlO1xuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gbnVsbDtcbiAgfSwgZmFsc2UpO1xuICB2YXIgd2hlZWxIYW5kbGVyID0gZnVuY3Rpb24gd2hlZWxIYW5kbGVyKGUpIHtcbiAgICBpZiAoci5zY3JvbGxpbmdQYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB3aGlsZSBzY3JvbGxpbmcsIGlnbm9yZSB3aGVlbC10by16b29tXG5cbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB2YXIgcnBvcyA9IFtwb3NbMF0gKiB6b29tICsgcGFuLngsIHBvc1sxXSAqIHpvb20gKyBwYW4ueV07XG4gICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZyB8fCByLmhvdmVyRGF0YS5jeHRTdGFydGVkIHx8IGluQm94U2VsZWN0aW9uKCkpIHtcbiAgICAgIC8vIGlmIHBhbiBkcmFnZ2luZyBvciBjeHQgZHJhZ2dpbmcsIHdoZWVsIG1vdmVtZW50cyBtYWtlIG5vIHpvb21cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQoci5kYXRhLndoZWVsVGltZW91dCk7XG4gICAgICByLmRhdGEud2hlZWxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHIuZGF0YS53aGVlbFpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCAxNTApO1xuICAgICAgdmFyIGRpZmY7XG4gICAgICBpZiAoZS5kZWx0YVkgIT0gbnVsbCkge1xuICAgICAgICBkaWZmID0gZS5kZWx0YVkgLyAtMjUwO1xuICAgICAgfSBlbHNlIGlmIChlLndoZWVsRGVsdGFZICE9IG51bGwpIHtcbiAgICAgICAgZGlmZiA9IGUud2hlZWxEZWx0YVkgLyAxMDAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlmZiA9IGUud2hlZWxEZWx0YSAvIDEwMDA7XG4gICAgICB9XG4gICAgICBkaWZmID0gZGlmZiAqIHIud2hlZWxTZW5zaXRpdml0eTtcbiAgICAgIHZhciBuZWVkc1doZWVsRml4ID0gZS5kZWx0YU1vZGUgPT09IDE7XG4gICAgICBpZiAobmVlZHNXaGVlbEZpeCkge1xuICAgICAgICAvLyBmaXhlcyBzbG93IHdoZWVsIGV2ZW50cyBvbiBmZi9saW51eCBhbmQgZmYvd2luZG93c1xuICAgICAgICBkaWZmICo9IDMzO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1pvb20gPSBjeS56b29tKCkgKiBNYXRoLnBvdygxMCwgZGlmZik7XG4gICAgICBpZiAoZS50eXBlID09PSAnZ2VzdHVyZWNoYW5nZScpIHtcbiAgICAgICAgbmV3Wm9vbSA9IHIuZ2VzdHVyZVN0YXJ0Wm9vbSAqIGUuc2NhbGU7XG4gICAgICB9XG4gICAgICBjeS56b29tKHtcbiAgICAgICAgbGV2ZWw6IG5ld1pvb20sXG4gICAgICAgIHJlbmRlcmVkUG9zaXRpb246IHtcbiAgICAgICAgICB4OiBycG9zWzBdLFxuICAgICAgICAgIHk6IHJwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjeS5lbWl0KGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnID8gJ3BpbmNoem9vbScgOiAnc2Nyb2xsem9vbScpO1xuICAgIH1cbiAgfTtcblxuICAvLyBGdW5jdGlvbnMgdG8gaGVscCB3aXRoIHdoZXRoZXIgbW91c2Ugd2hlZWwgc2hvdWxkIHRyaWdnZXIgem9vbWluZ1xuICAvLyAtLVxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3doZWVsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcblxuICAvLyBkaXNhYmxlIG5vbnN0YW5kYXJkIHdoZWVsIGV2ZW50c1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNld2hlZWwnLCB3aGVlbEhhbmRsZXIsIHRydWUpO1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ0RPTU1vdXNlU2Nyb2xsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTsgLy8gb2xkZXIgZmlyZWZveFxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ3Njcm9sbCcsIGZ1bmN0aW9uIHNjcm9sbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByLnNjcm9sbGluZ1BhZ2UgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dChyLnNjcm9sbGluZ1BhZ2VUaW1lb3V0KTtcbiAgICByLnNjcm9sbGluZ1BhZ2VUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLnNjcm9sbGluZ1BhZ2UgPSBmYWxzZTtcbiAgICB9LCAyNTApO1xuICB9LCB0cnVlKTtcblxuICAvLyBkZXNrdG9wIHNhZmFyaSBwaW5jaCB0byB6b29tIHN0YXJ0XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnZ2VzdHVyZXN0YXJ0JywgZnVuY3Rpb24gZ2VzdHVyZVN0YXJ0SGFuZGxlcihlKSB7XG4gICAgci5nZXN0dXJlU3RhcnRab29tID0gci5jeS56b29tKCk7XG4gICAgaWYgKCFyLmhhc1RvdWNoU3RhcnRlZCkge1xuICAgICAgLy8gZG9uJ3QgYWZmZWN0IHRvdWNoIGRldmljZXMgbGlrZSBpcGhvbmVcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIHRydWUpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2dlc3R1cmVjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICB3aGVlbEhhbmRsZXIoZSk7XG4gICAgfVxuICB9LCB0cnVlKTtcblxuICAvLyBGdW5jdGlvbnMgdG8gaGVscCB3aXRoIGhhbmRsaW5nIG1vdXNlb3V0L21vdXNlb3ZlciBvbiB0aGUgQ3l0b3NjYXBlIGNvbnRhaW5lclxuICAvLyBIYW5kbGUgbW91c2VvdXQgb24gQ3l0b3NjYXBlIGNvbnRhaW5lclxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3V0JywgZnVuY3Rpb24gbW91c2VPdXRIYW5kbGVyKGUpIHtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICByLmN5LmVtaXQoe1xuICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgIHR5cGU6ICdtb3VzZW91dCcsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2VvdmVyJywgZnVuY3Rpb24gbW91c2VPdmVySGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdmVyJyxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9XG4gICAgfSk7XG4gIH0sIGZhbHNlKTtcbiAgdmFyIGYxeDEsIGYxeTEsIGYyeDEsIGYyeTE7IC8vIHN0YXJ0aW5nIHBvaW50cyBmb3IgcGluY2gtdG8tem9vbVxuICB2YXIgZGlzdGFuY2UxLCBkaXN0YW5jZTFTcTsgLy8gaW5pdGlhbCBkaXN0YW5jZSBiZXR3ZWVuIGZpbmdlciAxIGFuZCBmaW5nZXIgMiBmb3IgcGluY2gtdG8tem9vbVxuICB2YXIgY2VudGVyMSwgbW9kZWxDZW50ZXIxOyAvLyBjZW50ZXIgcG9pbnQgb24gc3RhcnQgcGluY2ggdG8gem9vbVxuICB2YXIgb2Zmc2V0TGVmdCwgb2Zmc2V0VG9wO1xuICB2YXIgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodDtcbiAgdmFyIHR3b0ZpbmdlcnNTdGFydEluc2lkZTtcbiAgdmFyIGRpc3RhbmNlID0gZnVuY3Rpb24gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKSk7XG4gIH07XG4gIHZhciBkaXN0YW5jZVNxID0gZnVuY3Rpb24gZGlzdGFuY2VTcSh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiAoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSk7XG4gIH07XG4gIHZhciB0b3VjaHN0YXJ0SGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd0b3VjaHN0YXJ0JywgdG91Y2hzdGFydEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaHN0YXJ0SGFuZGxlcihlKSB7XG4gICAgci5oYXNUb3VjaFN0YXJ0ZWQgPSB0cnVlO1xuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBibHVyQWN0aXZlRG9tRWxlbWVudCgpO1xuICAgIHIudG91Y2hEYXRhLmNhcHR1cmUgPSB0cnVlO1xuICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBub3cgPSByLnRvdWNoRGF0YS5ub3c7XG4gICAgdmFyIGVhcmxpZXIgPSByLnRvdWNoRGF0YS5lYXJsaWVyO1xuICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgLy8gcmVjb3JkIHN0YXJ0aW5nIHBvaW50cyBmb3IgcGluY2gtdG8tem9vbVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhyLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXMpO1xuICAgICAgdmFyIG9mZnNldHMgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgICAgIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgICAgIGNvbnRhaW5lcldpZHRoID0gb2Zmc2V0c1syXTtcbiAgICAgIGNvbnRhaW5lckhlaWdodCA9IG9mZnNldHNbM107XG4gICAgICBmMXgxID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjF5MSA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgZjJ4MSA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICAgIGYyeTEgPSBlLnRvdWNoZXNbMV0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHR3b0ZpbmdlcnNTdGFydEluc2lkZSA9IDAgPD0gZjF4MSAmJiBmMXgxIDw9IGNvbnRhaW5lcldpZHRoICYmIDAgPD0gZjJ4MSAmJiBmMngxIDw9IGNvbnRhaW5lcldpZHRoICYmIDAgPD0gZjF5MSAmJiBmMXkxIDw9IGNvbnRhaW5lckhlaWdodCAmJiAwIDw9IGYyeTEgJiYgZjJ5MSA8PSBjb250YWluZXJIZWlnaHQ7XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgIGRpc3RhbmNlMSA9IGRpc3RhbmNlKGYxeDEsIGYxeTEsIGYyeDEsIGYyeTEpO1xuICAgICAgZGlzdGFuY2UxU3EgPSBkaXN0YW5jZVNxKGYxeDEsIGYxeTEsIGYyeDEsIGYyeTEpO1xuICAgICAgY2VudGVyMSA9IFsoZjF4MSArIGYyeDEpIC8gMiwgKGYxeTEgKyBmMnkxKSAvIDJdO1xuICAgICAgbW9kZWxDZW50ZXIxID0gWyhjZW50ZXIxWzBdIC0gcGFuLngpIC8gem9vbSwgKGNlbnRlcjFbMV0gLSBwYW4ueSkgLyB6b29tXTtcblxuICAgICAgLy8gY29uc2lkZXIgY29udGV4dCB0YXBcbiAgICAgIHZhciBjeHREaXN0VGhyZXNob2xkID0gMjAwO1xuICAgICAgdmFyIGN4dERpc3RUaHJlc2hvbGRTcSA9IGN4dERpc3RUaHJlc2hvbGQgKiBjeHREaXN0VGhyZXNob2xkO1xuICAgICAgaWYgKGRpc3RhbmNlMVNxIDwgY3h0RGlzdFRocmVzaG9sZFNxICYmICFlLnRvdWNoZXNbMl0pIHtcbiAgICAgICAgdmFyIG5lYXIxID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgICB2YXIgbmVhcjIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMl0sIG5vd1szXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChuZWFyMSAmJiBuZWFyMS5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIxLmFjdGl2YXRlKCkuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMTtcbiAgICAgICAgfSBlbHNlIGlmIChuZWFyMiAmJiBuZWFyMi5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIyLmFjdGl2YXRlKCkuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgci50b3VjaERhdGEuY3h0ID0gdHJ1ZTtcbiAgICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgLy8gaWdub3JlXG5cbiAgICAgIC8vIHNhZmFyaSBvbiBpb3MgcGFucyB0aGUgcGFnZSBvdGhlcndpc2UgKG5vcm1hbGx5IHlvdSBzaG91bGQgYmUgYWJsZSB0byBwcmV2ZW50ZGVmYXVsdCBvbiB0b3VjaG1vdmUuLi4pXG4gICAgICBpZiAoY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1sxXSkgOyBlbHNlIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBuZWFycyA9IHIuZmluZE5lYXJlc3RFbGVtZW50cyhub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB2YXIgbmVhciA9IG5lYXJzWzBdO1xuICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnRzID0gbmVhcnM7XG4gICAgICAgIGlmIChyLm5vZGVJc0dyYWJiYWJsZShuZWFyKSkge1xuICAgICAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IG51bGw7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKG5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgLy8gcmVzZXQgZHJhZyBlbGVtZW50cywgc2luY2UgbmVhciB3aWxsIGJlIGFkZGVkIGFnYWluXG5cbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMgPSBjeS4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RlZCgpICYmIHIubm9kZUlzR3JhYmJhYmxlKGVsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKHNlbGVjdGVkTm9kZXMsIHtcbiAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZE5vZGVUb0RyYWcobmVhciwge1xuICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0R3JhYlRhcmdldChuZWFyKTtcbiAgICAgICAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYm9uJykpO1xuICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGVzKSB7XG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgbi5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ3RvdWNoc3RhcnQnLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgeTogbm93WzFdXG4gICAgICB9KTtcbiAgICAgIGlmIChuZWFyID09IG51bGwpIHtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0ge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFwLCB0YXBob2xkXG4gICAgICAvLyAtLS0tLVxuXG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaFN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgY2xlYXJUaW1lb3V0KHIudG91Y2hEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIudG91Y2hEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID09PSBmYWxzZSAmJiAhci5waW5jaGluZyAvLyBpZiBwaW5jaGluZywgdGhlbiB0YXBob2xkIHVuc2VsZWN0IHNob3VsZG4ndCB0YWtlIGVmZmVjdFxuICAgICAgICAmJiAhci50b3VjaERhdGEuc2VsZWN0aW5nIC8vIGJveCBzZWxlY3Rpb24gc2hvdWxkbid0IGFsbG93IHRhcGhvbGQgdGhyb3VnaFxuICAgICAgICApIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHIudG91Y2hEYXRhLnN0YXJ0LCBbJ3RhcGhvbGQnXSwgZSwge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIudGFwaG9sZER1cmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPj0gMSkge1xuICAgICAgdmFyIHNQb3MgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc1Bvc1tpXSA9IGVhcmxpZXJbaV0gPSBub3dbaV07XG4gICAgICB9XG4gICAgICB2YXIgdG91Y2gwID0gZS50b3VjaGVzWzBdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbdG91Y2gwLmNsaWVudFgsIHRvdWNoMC5jbGllbnRZXTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNobW92ZUhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaG1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLnRvdWNoRGF0YS5jYXB0dXJlO1xuICAgIGlmICghY2FwdHVyZSAmJiAhZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cbiAgICB2YXIgc3RhcnRHUG9zID0gci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb247XG4gICAgdmFyIGlzT3ZlclRocmVzaG9sZERyYWc7XG4gICAgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzWzBdICYmIHN0YXJ0R1Bvcykge1xuICAgICAgdmFyIGRpc3AgPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGRpc3Bbal0gPSBub3dbal0gLSBlYXJsaWVyW2pdO1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBzdGFydEdQb3NbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gc3RhcnRHUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICBpc092ZXJUaHJlc2hvbGREcmFnID0gZGlzdDIgPj0gci50b3VjaFRhcFRocmVzaG9sZDI7XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBzd2lwZSBjYW5jZWxsaW5nXG4gICAgaWYgKGNhcHR1cmUgJiYgci50b3VjaERhdGEuY3h0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgZjF4MiA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjF5MiA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGYyeDIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYyeTIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIC8vIHZhciBkaXN0YW5jZTIgPSBkaXN0YW5jZSggZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5MiApO1xuICAgICAgdmFyIGRpc3RhbmNlMlNxID0gZGlzdGFuY2VTcShmMXgyLCBmMXkyLCBmMngyLCBmMnkyKTtcbiAgICAgIHZhciBmYWN0b3JTcSA9IGRpc3RhbmNlMlNxIC8gZGlzdGFuY2UxU3E7XG4gICAgICB2YXIgZGlzdFRocmVzaG9sZCA9IDE1MDtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkU3EgPSBkaXN0VGhyZXNob2xkICogZGlzdFRocmVzaG9sZDtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGQgPSAxLjU7XG4gICAgICB2YXIgZmFjdG9yVGhyZXNob2xkU3EgPSBmYWN0b3JUaHJlc2hvbGQgKiBmYWN0b3JUaHJlc2hvbGQ7XG5cbiAgICAgIC8vIGNhbmNlbCBjdHggZ2VzdHVyZXMgaWYgdGhlIGRpc3RhbmNlIGIvdCB0aGUgZmluZ2VycyBpbmNyZWFzZXNcbiAgICAgIGlmIChmYWN0b3JTcSA+PSBmYWN0b3JUaHJlc2hvbGRTcSB8fCBkaXN0YW5jZTJTcSA+PSBkaXN0VGhyZXNob2xkU3EpIHtcbiAgICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXBlbmQnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KGN4dEV2dCk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnRleHQgc3dpcGVcbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHRPdmVyIHx8IG5lYXIgIT09IHIudG91Y2hEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgICByLnRvdWNoRGF0YS5jeHRPdmVyLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHRkcmFnb3V0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgci50b3VjaERhdGEuY3h0T3ZlciA9IG5lYXI7XG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBib3ggc2VsZWN0aW9uXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubGFzdFRocmVlVG91Y2ggPSArbmV3IERhdGUoKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2JveHN0YXJ0JyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSB0cnVlO1xuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDAgfHwgc2VsZWN0WzBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VsZWN0WzBdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzO1xuICAgICAgICBzZWxlY3RbMV0gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMyArIDE7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMyArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RbMl0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuXG4gICAgICAvLyBwaW5jaCB0byB6b29tXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1sxXSAmJiAhci50b3VjaERhdGEuZGlkU2VsZWN0IC8vIGRvbid0IGFsbG93IGJveCBzZWxlY3Rpb24gdG8gZGVncmFkZSB0byBwaW5jaC10by16b29tXG4gICAgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAvLyB0d28gZmluZ2VycyA9PiBwaW5jaCB0byB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgaWYgKGRyYWdnZWRFbGVzKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRyYWdnZWRFbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGRlX3AgPSBkcmFnZ2VkRWxlc1tpXS5fcHJpdmF0ZTtcbiAgICAgICAgICBkZV9wLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgICBkZV9wLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcblxuICAgICAgLy8gKHgyLCB5MikgZm9yIGZpbmdlcnMgMSBhbmQgMlxuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYxeTIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBmMngyID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZGlzdGFuY2UyID0gZGlzdGFuY2UoZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5Mik7XG4gICAgICAvLyB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICAvLyB2YXIgZmFjdG9yID0gTWF0aC5zcXJ0KCBkaXN0YW5jZTJTcSApIC8gTWF0aC5zcXJ0KCBkaXN0YW5jZTFTcSApO1xuICAgICAgdmFyIGZhY3RvciA9IGRpc3RhbmNlMiAvIGRpc3RhbmNlMTtcbiAgICAgIGlmICh0d29GaW5nZXJzU3RhcnRJbnNpZGUpIHtcbiAgICAgICAgLy8gZGVsdGEgZmluZ2VyMVxuICAgICAgICB2YXIgZGYxeCA9IGYxeDIgLSBmMXgxO1xuICAgICAgICB2YXIgZGYxeSA9IGYxeTIgLSBmMXkxO1xuXG4gICAgICAgIC8vIGRlbHRhIGZpbmdlciAyXG4gICAgICAgIHZhciBkZjJ4ID0gZjJ4MiAtIGYyeDE7XG4gICAgICAgIHZhciBkZjJ5ID0gZjJ5MiAtIGYyeTE7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRpb24gaXMgdGhlIG5vcm1hbGlzZWQgdmVjdG9yIG9mIHRoZSB0d28gZmluZ2VycyBtb3ZlbWVudFxuICAgICAgICAvLyBpLmUuIHNvIHBpbmNoaW5nIGNhbmNlbHMgb3V0IGFuZCBtb3ZpbmcgdG9nZXRoZXIgcGFuc1xuICAgICAgICB2YXIgdHggPSAoZGYxeCArIGRmMngpIC8gMjtcbiAgICAgICAgdmFyIHR5ID0gKGRmMXkgKyBkZjJ5KSAvIDI7XG5cbiAgICAgICAgLy8gbm93IGNhbGN1bGF0ZSB0aGUgem9vbVxuICAgICAgICB2YXIgem9vbTEgPSBjeS56b29tKCk7XG4gICAgICAgIHZhciB6b29tMiA9IHpvb20xICogZmFjdG9yO1xuICAgICAgICB2YXIgcGFuMSA9IGN5LnBhbigpO1xuXG4gICAgICAgIC8vIHRoZSBtb2RlbCBjZW50ZXIgcG9pbnQgY29udmVydGVkIHRvIHRoZSBjdXJyZW50IHJlbmRlcmVkIHBvc1xuICAgICAgICB2YXIgY3RyeCA9IG1vZGVsQ2VudGVyMVswXSAqIHpvb20xICsgcGFuMS54O1xuICAgICAgICB2YXIgY3RyeSA9IG1vZGVsQ2VudGVyMVsxXSAqIHpvb20xICsgcGFuMS55O1xuICAgICAgICB2YXIgcGFuMiA9IHtcbiAgICAgICAgICB4OiAtem9vbTIgLyB6b29tMSAqIChjdHJ4IC0gcGFuMS54IC0gdHgpICsgY3RyeCxcbiAgICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChjdHJ5IC0gcGFuMS55IC0gdHkpICsgY3RyeVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHJlbW92ZSBkcmFnZ2VkIGVsZXNcbiAgICAgICAgaWYgKF9zdGFydCAmJiBfc3RhcnQuYWN0aXZlKCkpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgX3N0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdmcmVlJyk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgX3N0YXJ0LmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN5LnZpZXdwb3J0KHtcbiAgICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgICBwYW46IHBhbjIsXG4gICAgICAgICAgY2FuY2VsT25GYWlsZWRab29tOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjeS5lbWl0KCdwaW5jaHpvb20nKTtcbiAgICAgICAgZGlzdGFuY2UxID0gZGlzdGFuY2UyO1xuICAgICAgICBmMXgxID0gZjF4MjtcbiAgICAgICAgZjF5MSA9IGYxeTI7XG4gICAgICAgIGYyeDEgPSBmMngyO1xuICAgICAgICBmMnkxID0gZjJ5MjtcbiAgICAgICAgci5waW5jaGluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLXByb2plY3RcbiAgICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1swXSAmJiAhci50b3VjaERhdGEuZGlkU2VsZWN0IC8vIGRvbid0IGFsbG93IGJveCBzZWxlY3Rpb24gdG8gZGVncmFkZSB0byBzaW5nbGUgZmluZ2VyIGV2ZW50cyBsaWtlIHBhbm5pbmdcbiAgICApIHtcbiAgICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgICAgdmFyIGxhc3QgPSByLnRvdWNoRGF0YS5sYXN0O1xuICAgICAgdmFyIG5lYXI7XG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5zd2lwZVBhbm5pbmcpIHtcbiAgICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlICYmIHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBkcmFnZ2luZyBub2Rlc1xuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCAmJiByLm5vZGVJc0RyYWdnYWJsZShzdGFydCkpIHtcbiAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAvLyB0aGVuIGRyYWdnaW5nIGNhbiBoYXBwZW5cbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG4gICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoZHJhZ2dlZEVsZXMsIHtcbiAgICAgICAgICAgICAgaW5EcmFnTGF5ZXI6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLmRyYWdEYXRhLmRpZERyYWcgPSB0cnVlO1xuICAgICAgICAgIHZhciB0b3RhbFNoaWZ0ID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChudW1iZXIkMShkaXNwWzBdKSAmJiBudW1iZXIkMShkaXNwWzFdKSkge1xuICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRpc3BbMF07XG4gICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZGlzcFsxXTtcbiAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICAgIHZhciBkcmFnRGVsdGEgPSByLnRvdWNoRGF0YS5kcmFnRGVsdGE7XG4gICAgICAgICAgICAgIGlmIChkcmFnRGVsdGEgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzBdKSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRyYWdEZWx0YVswXTtcbiAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZHJhZ0RlbHRhWzFdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IHRydWU7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuc2lsZW50U2hpZnQodG90YWxTaGlmdCkuZW1pdCgncG9zaXRpb24gZHJhZycpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzBdID09IGVhcmxpZXJbMF0gJiYgci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblsxXSA9PSBlYXJsaWVyWzFdKSB7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2Uga2VlcCB0cmFjayBvZiBkcmFnIGRlbHRhIGZvciBsYXRlclxuICAgICAgICAgIHZhciBkcmFnRGVsdGEgPSByLnRvdWNoRGF0YS5kcmFnRGVsdGEgPSByLnRvdWNoRGF0YS5kcmFnRGVsdGEgfHwgW107XG4gICAgICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICAgICAgZHJhZ0RlbHRhWzFdICs9IGRpc3BbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRvdWNobW92ZVxuICAgICAge1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0IHx8IG5lYXIsIFsndG91Y2htb3ZlJywgJ3RhcGRyYWcnLCAndm1vdXNlbW92ZSddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCghc3RhcnQgfHwgIXN0YXJ0LmdyYWJiZWQoKSkgJiYgbmVhciAhPSBsYXN0KSB7XG4gICAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3V0JyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGRyYWdvdmVyJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5sYXN0ID0gbmVhcjtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgdG8gY2FuY2VsIHRhcGhvbGRcbiAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG5vd1tpXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uW2ldICYmIGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwYW5uaW5nXG4gICAgICBpZiAoY2FwdHVyZSAmJiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydC5wYW5uYWJsZSgpKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goc3RhcnQsIHIudG91Y2hEYXRhLnN0YXJ0cyk7XG4gICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmICghci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSBhcnJheTJwb2ludChyLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgICAgICBjeS5wYW5CeSh7XG4gICAgICAgICAgICAgIHg6IGRpc3BbMF0gKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KCdkcmFncGFuJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgICByLnN3aXBlUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgICBjeS5wYW5CeSh7XG4gICAgICAgICAgICAgIHg6IGR4ICogem9vbSxcbiAgICAgICAgICAgICAgeTogZHkgKiB6b29tXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN5LmVtaXQoJ2RyYWdwYW4nKTtcbiAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZS1wcm9qZWN0XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICBlYXJsaWVyW2pdID0gbm93W2pdO1xuICAgIH1cblxuICAgIC8vIHRoZSBhY3RpdmUgYmcgaW5kaWNhdG9yIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gbWFraW5nIGEgc3dpcGUgdGhhdCBpcyBuZWl0aGVyIGZvciBkcmFnZ2luZyBub2RlcyBvciBwYW5uaW5nXG4gICAgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDAgJiYgIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5zd2lwZVBhbm5pbmcgJiYgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uICE9IG51bGwpIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuICB2YXIgdG91Y2hjYW5jZWxIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaGNhbmNlbCcsIHRvdWNoY2FuY2VsSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoY2FuY2VsSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgIHIudG91Y2hEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgdG91Y2hlbmRIYW5kbGVyLCBkaWREb3VibGVUb3VjaCwgdG91Y2hUaW1lb3V0LCBwcmV2VG91Y2hUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hlbmRIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgdmFyIGNhcHR1cmUgPSByLnRvdWNoRGF0YS5jYXB0dXJlO1xuICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHIuc3dpcGVQYW5uaW5nID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgdmFyIGN0eFRhcGVuZDtcbiAgICBpZiAoci50b3VjaERhdGEuY3h0KSB7XG4gICAgICBjdHhUYXBlbmQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHR0YXBlbmQnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChzdGFydCkge1xuICAgICAgICBzdGFydC5lbWl0KGN0eFRhcGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN0eFRhcGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXIudG91Y2hEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN0eFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQoY3R4VGFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5jeHQgPSBmYWxzZTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbm8gbW9yZSBib3ggc2VsZWN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhyZWUgZmluZ2Vyc1xuICAgIGlmICghZS50b3VjaGVzWzJdICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiByLnRvdWNoRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgdmFyIGJveCA9IGN5LmNvbGxlY3Rpb24oci5nZXRBbGxJbkJveChzZWxlY3RbMF0sIHNlbGVjdFsxXSwgc2VsZWN0WzJdLCBzZWxlY3RbM10pKTtcbiAgICAgIHNlbGVjdFswXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFsxXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFsyXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFszXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgY3kuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdib3hlbmQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKSAmJiAhZWxlLnNlbGVjdGVkKCk7XG4gICAgICB9O1xuICAgICAgYm94LmVtaXQoJ2JveCcpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQoJ2JveHNlbGVjdCcpO1xuICAgICAgaWYgKGJveC5ub25lbXB0eSgpKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgfVxuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1sxXSkgOyBlbHNlIGlmIChlLnRvdWNoZXNbMF0pIDsgZWxzZSBpZiAoIWUudG91Y2hlc1swXSkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBzdGFydFdhc0dyYWJiZWQgPSBzdGFydC5fcHJpdmF0ZS5ncmFiYmVkO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVzKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICBpZiAoc3RhcnRXYXNHcmFiYmVkKSB7XG4gICAgICAgICAgc3RhcnQuZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIHN0YXJ0LmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gLSBub3dbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gLSBub3dbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIHZhciByZGlzdDIgPSBkaXN0MiAqIHpvb20gKiB6b29tO1xuXG4gICAgICAvLyBUYXAgZXZlbnQsIHJvdWdobHkgc2FtZSBhcyBtb3VzZSBjbGljayBldmVudCBmb3IgdG91Y2hcbiAgICAgIGlmICghci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCkge1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgY3kuJCgnOnNlbGVjdGVkJykudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RhcCcsICd2Y2xpY2snXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZVRvdWNoID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZUb3VjaFRpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlVG91Y2ggPSB0cnVlO1xuICAgICAgICAgIHByZXZUb3VjaFRpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWydkYmx0YXAnLCAndmRibGNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRpZERvdWJsZVRvdWNoKSByZXR1cm47XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ29uZXRhcCcsICd2b25lY2xpY2snXSwgZSwge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKTtcbiAgICAgICAgICBwcmV2VG91Y2hUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHRvdWNoZWQgbm9kZSwgb25seSBpZiBpdCBoYXNuJ3QgYmVlbiBkcmFnZ2VkIHBhc3QgYSBjZXJ0YWluIGRpc3RhbmNlXG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBkcmFnIG5vZGVzIGFyb3VuZFxuICAgICAgJiYgc3RhcnQuX3ByaXZhdGUuc2VsZWN0YWJsZSAmJiByZGlzdDIgPCByLnRvdWNoVGFwVGhyZXNob2xkMiAmJiAhci5waW5jaGluZyAvLyBwaW5jaCB0byB6b29tIHNob3VsZCBub3QgYWZmZWN0IHNlbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKHN0YXJ0KS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RhcnQuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgc3RhcnQudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG4gICAgci5kcmFnRGF0YS5kaWREcmFnID0gZmFsc2U7IC8vIHJlc2V0IGZvciBuZXh0IHRvdWNoc3RhcnRcblxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByLnRvdWNoRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24gPSBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IG51bGw7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB0aGUgb2xkIHN0YXJ0IGdsb2JhbCBwb3MnbiBtYXkgbm90IGJlIHRoZSBzYW1lIGZpbmdlciB0aGF0IHJlbWFpbnNcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZXTtcbiAgICAgIH1cbiAgICAgIHIucGluY2hpbmcgPSBmYWxzZTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvL3IucmVkcmF3KCk7XG4gIH0sIGZhbHNlKTtcblxuICAvLyBmYWxsYmFjayBjb21wYXRpYmlsaXR5IGxheWVyIGZvciBtcyBwb2ludGVyIGV2ZW50c1xuICBpZiAodHlwZW9mIFRvdWNoRXZlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHBvaW50ZXJzID0gW107XG4gICAgdmFyIG1ha2VUb3VjaCA9IGZ1bmN0aW9uIG1ha2VUb3VjaChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgZm9yY2U6IDEsXG4gICAgICAgIGlkZW50aWZpZXI6IGUucG9pbnRlcklkLFxuICAgICAgICBwYWdlWDogZS5wYWdlWCxcbiAgICAgICAgcGFnZVk6IGUucGFnZVksXG4gICAgICAgIHJhZGl1c1g6IGUud2lkdGggLyAyLFxuICAgICAgICByYWRpdXNZOiBlLmhlaWdodCAvIDIsXG4gICAgICAgIHNjcmVlblg6IGUuc2NyZWVuWCxcbiAgICAgICAgc2NyZWVuWTogZS5zY3JlZW5ZLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIG1ha2VQb2ludGVyID0gZnVuY3Rpb24gbWFrZVBvaW50ZXIoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIHRvdWNoOiBtYWtlVG91Y2goZSlcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgYWRkUG9pbnRlciA9IGZ1bmN0aW9uIGFkZFBvaW50ZXIoZSkge1xuICAgICAgcG9pbnRlcnMucHVzaChtYWtlUG9pbnRlcihlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcCA9IHBvaW50ZXJzW2ldO1xuICAgICAgICBpZiAocC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkKSB7XG4gICAgICAgICAgcG9pbnRlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHVwZGF0ZVBvaW50ZXIgPSBmdW5jdGlvbiB1cGRhdGVQb2ludGVyKGUpIHtcbiAgICAgIHZhciBwID0gcG9pbnRlcnMuZmlsdGVyKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLmV2ZW50LnBvaW50ZXJJZCA9PT0gZS5wb2ludGVySWQ7XG4gICAgICB9KVswXTtcbiAgICAgIHAuZXZlbnQgPSBlO1xuICAgICAgcC50b3VjaCA9IG1ha2VUb3VjaChlKTtcbiAgICB9O1xuICAgIHZhciBhZGRUb3VjaGVzVG9FdmVudCA9IGZ1bmN0aW9uIGFkZFRvdWNoZXNUb0V2ZW50KGUpIHtcbiAgICAgIGUudG91Y2hlcyA9IHBvaW50ZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC50b3VjaDtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHBvaW50ZXJJc01vdXNlID0gZnVuY3Rpb24gcG9pbnRlcklzTW91c2UoZSkge1xuICAgICAgcmV0dXJuIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZS5wb2ludGVyVHlwZSA9PT0gNDtcbiAgICB9O1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcmRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFkZFBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoc3RhcnRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcnVwJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGVuZEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyY2FuY2VsJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGNhbmNlbEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVybW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdXBkYXRlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2htb3ZlSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIEJScCQyID0ge307XG5CUnAkMi5nZW5lcmF0ZVBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdwb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIHRoaXMucG9pbnRzLCBub2RlWCwgbm9kZVksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlRWxsaXBzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snZWxsaXBzZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdlbGxpcHNlJyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIgKyBwYWRkaW5nLCBoZWlnaHQgLyAyICsgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1tuYW1lXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBvaW50czogcG9pbnRzLFxuICAgIGdldE9yQ3JlYXRlQ29ybmVyczogZnVuY3Rpb24gZ2V0T3JDcmVhdGVDb3JuZXJzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsIGZpZWxkKSB7XG4gICAgICBpZiAocnNbZmllbGRdICE9PSB1bmRlZmluZWQgJiYgcnNbZmllbGQgKyAnLWN4J10gPT09IGNlbnRlclggJiYgcnNbZmllbGQgKyAnLWN5J10gPT09IGNlbnRlclkpIHtcbiAgICAgICAgcmV0dXJuIHJzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICAgIHJzW2ZpZWxkXSA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICByc1tmaWVsZCArICctY3gnXSA9IGNlbnRlclg7XG4gICAgICByc1tmaWVsZCArICctY3knXSA9IGNlbnRlclk7XG4gICAgICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gICAgICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFBvbHlnb25SYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgcCA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pKyspIHtcbiAgICAgICAgcFtfaV0gPSB7XG4gICAgICAgICAgeDogY2VudGVyWCArIGhhbGZXICogcG9pbnRzW19pICogMl0sXG4gICAgICAgICAgeTogY2VudGVyWSArIGhhbGZIICogcG9pbnRzW19pICogMiArIDFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgaSxcbiAgICAgICAgcDEsXG4gICAgICAgIHAyLFxuICAgICAgICBwMyxcbiAgICAgICAgbGVuID0gcC5sZW5ndGg7XG4gICAgICBwMSA9IHBbbGVuIC0gMV07XG4gICAgICAvLyBmb3IgZWFjaCBwb2ludFxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHAyID0gcFtpICUgbGVuXTtcbiAgICAgICAgcDMgPSBwWyhpICsgMSkgJSBsZW5dO1xuICAgICAgICByc1tmaWVsZF1baV0gPSBnZXRSb3VuZENvcm5lcihwMSwgcDIsIHAzLCBjb3JuZXJSYWRpdXMpO1xuICAgICAgICBwMSA9IHAyO1xuICAgICAgICBwMiA9IHAzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJzW2ZpZWxkXTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdyb3VuZC1wb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMsIHRoaXMuZ2V0T3JDcmVhdGVDb3JuZXJzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsICdkcmF3Q29ybmVycycpKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMsIHJzKSB7XG4gICAgICByZXR1cm4gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsICdjb3JuZXJzJykpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMsIHJzKSB7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVSb3VuZFBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMuZ2V0T3JDcmVhdGVDb3JuZXJzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsICdjb3JuZXJzJykpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZVJvdW5kUmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydyb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1sncm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZywgY29ybmVyUmFkaXVzKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgIGNvcm5lclJhZGl1cyA9IE1hdGgubWluKGhhbGZXaWR0aCwgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAgIHZhciBkaWFtID0gY29ybmVyUmFkaXVzICogMjtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIGRpYW0sIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHRvcCBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQ3V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydjdXQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ2N1dHJlY3RhbmdsZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdjdXQtcmVjdGFuZ2xlJyxcbiAgICBjb3JuZXJMZW5ndGg6IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBudWxsLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgZ2VuZXJhdGVDdXRUcmlhbmdsZVB0czogZnVuY3Rpb24gZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjbCA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gdGhpcy5jb3JuZXJMZW5ndGggOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoO1xuXG4gICAgICAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgdHJpYW5nbGUgcHQgb24gWzQsIDVdXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3BMZWZ0OiBbeEJlZ2luLCB5QmVnaW4gKyBjbCwgeEJlZ2luICsgY2wsIHlCZWdpbiwgeEJlZ2luICsgY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgdG9wUmlnaHQ6IFt4RW5kIC0gY2wsIHlCZWdpbiwgeEVuZCwgeUJlZ2luICsgY2wsIHhFbmQgLSBjbCwgeUJlZ2luICsgY2xdLFxuICAgICAgICBib3R0b21SaWdodDogW3hFbmQsIHlFbmQgLSBjbCwgeEVuZCAtIGNsLCB5RW5kLCB4RW5kIC0gY2wsIHlFbmQgLSBjbF0sXG4gICAgICAgIGJvdHRvbUxlZnQ6IFt4QmVnaW4gKyBjbCwgeUVuZCwgeEJlZ2luLCB5RW5kIC0gY2wsIHhCZWdpbiArIGNsLCB5RW5kIC0gY2xdXG4gICAgICB9O1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGNQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSwgY29ybmVyUmFkaXVzKTtcbiAgICAgIHZhciBwdHMgPSBbXS5jb25jYXQuYXBwbHkoW10sIFtjUHRzLnRvcExlZnQuc3BsaWNlKDAsIDQpLCBjUHRzLnRvcFJpZ2h0LnNwbGljZSgwLCA0KSwgY1B0cy5ib3R0b21SaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tTGVmdC5zcGxpY2UoMCwgNCldKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGNsID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyB0aGlzLmNvcm5lckxlbmd0aCA6IGNvcm5lclJhZGl1cztcbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogY2wsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIDIgKiBjbCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBjdXRUcmlhbmdsZVB0cyA9IHRoaXMuZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMudG9wTGVmdCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcFJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tUmlnaHQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy5ib3R0b21MZWZ0KTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVCYXJyZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JhcnJlbCddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdiYXJyZWwnLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIC8vIHVzZSB0d28gZml4ZWQgdCB2YWx1ZXMgZm9yIHRoZSBiZXppZXIgY3VydmUgYXBwcm94aW1hdGlvblxuXG4gICAgICB2YXIgdDAgPSAwLjE1O1xuICAgICAgdmFyIHQxID0gMC41O1xuICAgICAgdmFyIHQyID0gMC44NTtcbiAgICAgIHZhciBiUHRzID0gdGhpcy5nZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCArIDIgKiBwYWRkaW5nLCBoZWlnaHQgKyAyICogcGFkZGluZywgbm9kZVgsIG5vZGVZKTtcbiAgICAgIHZhciBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzID0gZnVuY3Rpb24gYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhwdHMpIHtcbiAgICAgICAgLy8gYXBwcm94aW1hdGUgY3VydmUgcHRzIGJhc2VkIG9uIHRoZSB0d28gdCB2YWx1ZXNcbiAgICAgICAgdmFyIG0wID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDApO1xuICAgICAgICB2YXIgbTEgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0MSk7XG4gICAgICAgIHZhciBtMiA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQyKTtcbiAgICAgICAgcmV0dXJuIFtwdHNbMF0sIHB0c1sxXSwgbTAueCwgbTAueSwgbTEueCwgbTEueSwgbTIueCwgbTIueSwgcHRzWzRdLCBwdHNbNV1dO1xuICAgICAgfTtcbiAgICAgIHZhciBwdHMgPSBbXS5jb25jYXQoYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcExlZnQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMudG9wUmlnaHQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMuYm90dG9tUmlnaHQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMuYm90dG9tTGVmdCkpO1xuICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIHB0cywgbm9kZVgsIG5vZGVZKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQmFycmVsQmV6aWVyUHRzOiBmdW5jdGlvbiBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoO1xuICAgICAgdmFyIGN1cnZlQ29uc3RhbnRzID0gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCk7XG4gICAgICB2YXIgaE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgICB2YXIgY3RybFB0WE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdpZHRoO1xuXG4gICAgICAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgY29udHJvbCBwdCBvbiBbNCwgNV1cbiAgICAgIHZhciBwdHMgPSB7XG4gICAgICAgIHRvcExlZnQ6IFt4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQsIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luICsgd09mZnNldCwgeUJlZ2luXSxcbiAgICAgICAgdG9wUmlnaHQ6IFt4RW5kIC0gd09mZnNldCwgeUJlZ2luLCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0XSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gaE9mZnNldCwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhFbmQgLSB3T2Zmc2V0LCB5RW5kXSxcbiAgICAgICAgYm90dG9tTGVmdDogW3hCZWdpbiArIHdPZmZzZXQsIHlFbmQsIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGhPZmZzZXRdXG4gICAgICB9O1xuICAgICAgcHRzLnRvcExlZnQuaXNUb3AgPSB0cnVlO1xuICAgICAgcHRzLnRvcFJpZ2h0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy5ib3R0b21MZWZ0LmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgIHB0cy5ib3R0b21SaWdodC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICByZXR1cm4gcHRzO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuXG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGhPZmZzZXQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIDIgKiB3T2Zmc2V0LCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGJhcnJlbEN1cnZlUHRzID0gdGhpcy5nZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgIHZhciBnZXRDdXJ2ZVQgPSBmdW5jdGlvbiBnZXRDdXJ2ZVQoeCwgeSwgY3VydmVQdHMpIHtcbiAgICAgICAgdmFyIHgwID0gY3VydmVQdHNbNF07XG4gICAgICAgIHZhciB4MSA9IGN1cnZlUHRzWzJdO1xuICAgICAgICB2YXIgeDIgPSBjdXJ2ZVB0c1swXTtcbiAgICAgICAgdmFyIHkwID0gY3VydmVQdHNbNV07XG4gICAgICAgIC8vIHZhciB5MSA9IGN1cnZlUHRzWyAzIF07XG4gICAgICAgIHZhciB5MiA9IGN1cnZlUHRzWzFdO1xuICAgICAgICB2YXIgeE1pbiA9IE1hdGgubWluKHgwLCB4Mik7XG4gICAgICAgIHZhciB4TWF4ID0gTWF0aC5tYXgoeDAsIHgyKTtcbiAgICAgICAgdmFyIHlNaW4gPSBNYXRoLm1pbih5MCwgeTIpO1xuICAgICAgICB2YXIgeU1heCA9IE1hdGgubWF4KHkwLCB5Mik7XG4gICAgICAgIGlmICh4TWluIDw9IHggJiYgeCA8PSB4TWF4ICYmIHlNaW4gPD0geSAmJiB5IDw9IHlNYXgpIHtcbiAgICAgICAgICB2YXIgY29lZmYgPSBiZXppZXJQdHNUb1F1YWRDb2VmZih4MCwgeDEsIHgyKTtcbiAgICAgICAgICB2YXIgcm9vdHMgPSBzb2x2ZVF1YWRyYXRpYyhjb2VmZlswXSwgY29lZmZbMV0sIGNvZWZmWzJdLCB4KTtcbiAgICAgICAgICB2YXIgdmFsaWRSb290cyA9IHJvb3RzLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgcmV0dXJuIDAgPD0gciAmJiByIDw9IDE7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHZhbGlkUm9vdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkUm9vdHNbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIHZhciBjdXJ2ZVJlZ2lvbnMgPSBPYmplY3Qua2V5cyhiYXJyZWxDdXJ2ZVB0cyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnZlUmVnaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29ybmVyID0gY3VydmVSZWdpb25zW2ldO1xuICAgICAgICB2YXIgY29ybmVyUHRzID0gYmFycmVsQ3VydmVQdHNbY29ybmVyXTtcbiAgICAgICAgdmFyIHQgPSBnZXRDdXJ2ZVQoeCwgeSwgY29ybmVyUHRzKTtcbiAgICAgICAgaWYgKHQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB5MCA9IGNvcm5lclB0c1s1XTtcbiAgICAgICAgdmFyIHkxID0gY29ybmVyUHRzWzNdO1xuICAgICAgICB2YXIgeTIgPSBjb3JuZXJQdHNbMV07XG4gICAgICAgIHZhciBiZXpZID0gcWJlemllckF0KHkwLCB5MSwgeTIsIHQpO1xuICAgICAgICBpZiAoY29ybmVyUHRzLmlzVG9wICYmIGJlelkgPD0geSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3JuZXJQdHMuaXNCb3R0b20gJiYgeSA8PSBiZXpZKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snYm90dG9tLXJvdW5kLXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydib3R0b21yb3VuZHJlY3RhbmdsZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSAod2lkdGggLyAyICsgcGFkZGluZyk7XG4gICAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSAoaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG4gICAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcEludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG4gICAgICBpZiAodG9wSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0b3BJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBkaWFtID0gMiAqIGNvcm5lclJhZGl1cztcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIGRpYW0sIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG5vbi1yb3VuZGVkIHRvcCBzaWRlXG4gICAgICB2YXIgb3V0ZXJXaWR0aCA9IHdpZHRoIC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIG91dGVySGVpZ2h0ID0gaGVpZ2h0IC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIHBvaW50cyA9IFtjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0LCBjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSwgY2VudGVyWCArIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZIC0gb3V0ZXJIZWlnaHRdO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5yZWdpc3Rlck5vZGVTaGFwZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlU2hhcGVzID0gdGhpcy5ub2RlU2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG4gIHRoaXMuZ2VuZXJhdGVFbGxpcHNlKCk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRyaWFuZ2xlJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDMsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JlY3RhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSk7XG4gIG5vZGVTaGFwZXNbJ3NxdWFyZSddID0gbm9kZVNoYXBlc1sncmVjdGFuZ2xlJ107XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQ3V0UmVjdGFuZ2xlKCk7XG4gIHRoaXMuZ2VuZXJhdGVCYXJyZWwoKTtcbiAgdGhpcy5nZW5lcmF0ZUJvdHRvbVJvdW5kcmVjdGFuZ2xlKCk7XG4gIHtcbiAgICB2YXIgZGlhbW9uZFBvaW50cyA9IFswLCAxLCAxLCAwLCAwLCAtMSwgLTEsIDBdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdkaWFtb25kJywgZGlhbW9uZFBvaW50cyk7XG4gICAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICB9XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdwZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXBlbnRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDUsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hleGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNiwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1oZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGVwdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignb2N0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg4LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLW9jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB2YXIgc3RhcjVQb2ludHMgPSBuZXcgQXJyYXkoMjApO1xuICB7XG4gICAgdmFyIG91dGVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCAwKTtcbiAgICB2YXIgaW5uZXJQb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDUsIE1hdGguUEkgLyA1KTtcblxuICAgIC8vIE91dGVyIHJhZGl1cyBpcyAxOyBpbm5lciByYWRpdXMgb2Ygc3RhciBpcyBzbWFsbGVyXG4gICAgdmFyIGlubmVyUmFkaXVzID0gMC41ICogKDMgLSBNYXRoLnNxcnQoNSkpO1xuICAgIGlubmVyUmFkaXVzICo9IDEuNTc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbm5lclBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyXSAqPSBpbm5lclJhZGl1cztcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyICsgMV0gKj0gaW5uZXJSYWRpdXM7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjAgLyA0OyBpKyspIHtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0XSA9IG91dGVyUG9pbnRzW2kgKiAyXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMV0gPSBvdXRlclBvaW50c1tpICogMiArIDFdO1xuICAgICAgc3RhcjVQb2ludHNbaSAqIDQgKyAyXSA9IGlubmVyUG9pbnRzW2kgKiAyXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgM10gPSBpbm5lclBvaW50c1tpICogMiArIDFdO1xuICAgIH1cbiAgfVxuICBzdGFyNVBvaW50cyA9IGZpdFBvbHlnb25Ub1NxdWFyZShzdGFyNVBvaW50cyk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdzdGFyJywgc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndmVlJywgWy0xLCAtMSwgMCwgLTAuMzMzLCAxLCAtMSwgMCwgMV0pO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncmhvbWJvaWQnLCBbLTEsIC0xLCAwLjMzMywgLTEsIDEsIDEsIC0wLjMzMywgMV0pO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncmlnaHQtcmhvbWJvaWQnLCBbLTAuMzMzLCAtMSwgMSwgLTEsIDAuMzMzLCAxLCAtMSwgMV0pO1xuICB0aGlzLm5vZGVTaGFwZXNbJ2NvbmNhdmVoZXhhZ29uJ10gPSB0aGlzLmdlbmVyYXRlUG9seWdvbignY29uY2F2ZS1oZXhhZ29uJywgWy0xLCAtMC45NSwgLTAuNzUsIDAsIC0xLCAwLjk1LCAxLCAwLjk1LCAwLjc1LCAwLCAxLCAtMC45NV0pO1xuICB7XG4gICAgdmFyIHRhZ1BvaW50cyA9IFstMSwgLTEsIDAuMjUsIC0xLCAxLCAwLCAwLjI1LCAxLCAtMSwgMV07XG4gICAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3RhZycsIHRhZ1BvaW50cyk7XG4gICAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtdGFnJywgdGFnUG9pbnRzKTtcbiAgfVxuICBub2RlU2hhcGVzLm1ha2VQb2x5Z29uID0gZnVuY3Rpb24gKHBvaW50cykge1xuICAgIC8vIHVzZSBjYWNoaW5nIG9uIHVzZXItc3BlY2lmaWVkIHBvbHlnb25zIHNvIHRoZXkgYXJlIGFzIGZhc3QgYXMgbmF0aXZlIHNoYXBlc1xuXG4gICAgdmFyIGtleSA9IHBvaW50cy5qb2luKCckJyk7XG4gICAgdmFyIG5hbWUgPSAncG9seWdvbi0nICsga2V5O1xuICAgIHZhciBzaGFwZTtcbiAgICBpZiAoc2hhcGUgPSB0aGlzW25hbWVdKSB7XG4gICAgICAvLyBnb3QgY2FjaGVkIHNoYXBlXG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGFuZCBjYWNoZSBuZXcgc2hhcGVcbiAgICByZXR1cm4gcmVuZGVyZXIuZ2VuZXJhdGVQb2x5Z29uKG5hbWUsIHBvaW50cyk7XG4gIH07XG59O1xuXG52YXIgQlJwJDEgPSB7fTtcbkJScCQxLnRpbWVUb1JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVkcmF3VG90YWxUaW1lIC8gdGhpcy5yZWRyYXdDb3VudDtcbn07XG5CUnAkMS5yZWRyYXcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCBzdGF0aWNFbXB0eU9iamVjdCgpO1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gMDtcbiAgfVxuICBpZiAoci5sYXN0UmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0UmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdERyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmxhc3REcmF3VGltZSA9IDA7XG4gIH1cbiAgci5yZXF1ZXN0ZWRGcmFtZSA9IHRydWU7XG4gIHIucmVuZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuQlJwJDEuYmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKGZuLCBwcmlvcml0eSkge1xuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYWRkIHRpY2sgY2FsbGJhY2tzIHdoZW4gZGVzdHJveWVkXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJpb3JpdHkgPT0gbnVsbCkge1xuICAgIGVycm9yKCdQcmlvcml0eSBpcyBub3Qgb3B0aW9uYWwgZm9yIGJlZm9yZVJlbmRlcicpO1xuICB9XG4gIHZhciBjYnMgPSB0aGlzLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcbiAgY2JzLnB1c2goe1xuICAgIGZuOiBmbixcbiAgICBwcmlvcml0eTogcHJpb3JpdHlcbiAgfSk7XG5cbiAgLy8gaGlnaGVyIHByaW9yaXR5IGNhbGxiYWNrcyBleGVjdXRlZCBmaXJzdFxuICBjYnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTtcbiAgfSk7XG59O1xudmFyIGJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IGZ1bmN0aW9uIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB3aWxsRHJhdywgc3RhcnRUaW1lKSB7XG4gIHZhciBjYnMgPSByLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBjYnNbaV0uZm4od2lsbERyYXcsIHN0YXJ0VGltZSk7XG4gIH1cbn07XG5CUnAkMS5zdGFydFJlbmRlckxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcbiAgaWYgKHIucmVuZGVyTG9vcFN0YXJ0ZWQpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgci5yZW5kZXJMb29wU3RhcnRlZCA9IHRydWU7XG4gIH1cbiAgdmFyIHJlbmRlckZuID0gZnVuY3Rpb24gcmVuZGVyRm4ocmVxdWVzdFRpbWUpIHtcbiAgICBpZiAoci5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN5LmJhdGNoaW5nKCkpIDsgZWxzZSBpZiAoci5yZXF1ZXN0ZWRGcmFtZSAmJiAhci5za2lwRnJhbWUpIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB0cnVlLCByZXF1ZXN0VGltZSk7XG4gICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgIHIucmVuZGVyKHIucmVuZGVyT3B0aW9ucyk7XG4gICAgICB2YXIgZW5kVGltZSA9IHIubGFzdERyYXdUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICB9XG4gICAgICBpZiAoci5yZWRyYXdDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIucmVkcmF3Q291bnQgPSAwO1xuICAgICAgfVxuICAgICAgci5yZWRyYXdDb3VudCsrO1xuICAgICAgaWYgKHIucmVkcmF3VG90YWxUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdUb3RhbFRpbWUgPSAwO1xuICAgICAgfVxuICAgICAgdmFyIGR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICAgIHIucmVkcmF3VG90YWxUaW1lICs9IGR1cmF0aW9uO1xuICAgICAgci5sYXN0UmVkcmF3VGltZSA9IGR1cmF0aW9uO1xuXG4gICAgICAvLyB1c2UgYSB3ZWlnaHRlZCBhdmVyYWdlIHdpdGggYSBiaWFzIGZyb20gdGhlIHByZXZpb3VzIGF2ZXJhZ2Ugc28gd2UgZG9uJ3Qgc3Bpa2Ugc28gZWFzaWx5XG4gICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gci5hdmVyYWdlUmVkcmF3VGltZSAvIDIgKyBkdXJhdGlvbiAvIDI7XG4gICAgICByLnJlcXVlc3RlZEZyYW1lID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCBmYWxzZSwgcmVxdWVzdFRpbWUpO1xuICAgIH1cbiAgICByLnNraXBGcmFtZSA9IGZhbHNlO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJGbik7XG4gIH07XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJGbik7XG59O1xuXG52YXIgQmFzZVJlbmRlcmVyID0gZnVuY3Rpb24gQmFzZVJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdGhpcy5pbml0KG9wdGlvbnMpO1xufTtcbnZhciBCUiA9IEJhc2VSZW5kZXJlcjtcbnZhciBCUnAgPSBCUi5wcm90b3R5cGU7XG5CUnAuY2xpZW50RnVuY3Rpb25zID0gWydyZWRyYXdIaW50JywgJ3JlbmRlcicsICdyZW5kZXJUbycsICdtYXRjaENhbnZhc1NpemUnLCAnbm9kZVNoYXBlSW1wbCcsICdhcnJvd1NoYXBlSW1wbCddO1xuQlJwLmluaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHIuY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgY3RyID0gci5jb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcblxuICAvLyBwcmVwZW5kIGEgc3R5bGVzaGVldCBpbiB0aGUgaGVhZCBzdWNoIHRoYXRcbiAgaWYgKGNvbnRhaW5lcldpbmRvdykge1xuICAgIHZhciBkb2N1bWVudCA9IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudDtcbiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQ7XG4gICAgdmFyIHN0eWxlc2hlZXRJZCA9ICdfX19fX19fX19fY3l0b3NjYXBlX3N0eWxlc2hlZXQnO1xuICAgIHZhciBjbGFzc05hbWUgPSAnX19fX19fX19fX2N5dG9zY2FwZV9jb250YWluZXInO1xuICAgIHZhciBzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlc2hlZXRJZCkgIT0gbnVsbDtcbiAgICBpZiAoY3RyLmNsYXNzTmFtZS5pbmRleE9mKGNsYXNzTmFtZSkgPCAwKSB7XG4gICAgICBjdHIuY2xhc3NOYW1lID0gKGN0ci5jbGFzc05hbWUgfHwgJycpICsgJyAnICsgY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlc2hlZXRBbHJlYWR5RXhpc3RzKSB7XG4gICAgICB2YXIgc3R5bGVzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXNoZWV0LmlkID0gc3R5bGVzaGVldElkO1xuICAgICAgc3R5bGVzaGVldC50ZXh0Q29udGVudCA9ICcuJyArIGNsYXNzTmFtZSArICcgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH0nO1xuICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVzaGVldCwgaGVhZC5jaGlsZHJlblswXSk7IC8vIGZpcnN0IHNvIGxvd2VzdCBwcmlvcml0eVxuICAgIH1cblxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gY29udGFpbmVyV2luZG93LmdldENvbXB1dGVkU3R5bGUoY3RyKTtcbiAgICB2YXIgcG9zaXRpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG4gICAgaWYgKHBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgd2FybignQSBDeXRvc2NhcGUgY29udGFpbmVyIGhhcyBzdHlsZSBwb3NpdGlvbjpzdGF0aWMgYW5kIHNvIGNhbiBub3QgdXNlIFVJIGV4dGVuc2lvbnMgcHJvcGVybHknKTtcbiAgICB9XG4gIH1cbiAgci5zZWxlY3Rpb24gPSBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXTsgLy8gQ29vcmRpbmF0ZXMgZm9yIHNlbGVjdGlvbiBib3gsIHBsdXMgZW5hYmxlZCBmbGFnXG5cbiAgci5iZXppZXJQcm9qUGN0cyA9IFswLjA1LCAwLjIyNSwgMC40LCAwLjUsIDAuNiwgMC43NzUsIDAuOTVdO1xuXG4gIC8vLS1Qb2ludGVyLXJlbGF0ZWQgZGF0YVxuICByLmhvdmVyRGF0YSA9IHtcbiAgICBkb3duOiBudWxsLFxuICAgIGxhc3Q6IG51bGwsXG4gICAgZG93blRpbWU6IG51bGwsXG4gICAgdHJpZ2dlck1vZGU6IG51bGwsXG4gICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgIGluaXRpYWxQYW46IFtudWxsLCBudWxsXSxcbiAgICBjYXB0dXJlOiBmYWxzZVxuICB9O1xuICByLmRyYWdEYXRhID0ge1xuICAgIHBvc3NpYmxlRHJhZ0VsZW1lbnRzOiBbXVxuICB9O1xuICByLnRvdWNoRGF0YSA9IHtcbiAgICBzdGFydDogbnVsbCxcbiAgICBjYXB0dXJlOiBmYWxzZSxcbiAgICAvLyBUaGVzZSAzIGZpZWxkcyByZWxhdGVkIHRvIHRhcCwgdGFwaG9sZCBldmVudHNcbiAgICBzdGFydFBvc2l0aW9uOiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgc2luZ2xlVG91Y2hTdGFydFRpbWU6IG51bGwsXG4gICAgc2luZ2xlVG91Y2hNb3ZlZDogdHJ1ZSxcbiAgICBub3c6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcbiAgICBlYXJsaWVyOiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF1cbiAgfTtcbiAgci5yZWRyYXdzID0gMDtcbiAgci5zaG93RnBzID0gb3B0aW9ucy5zaG93RnBzO1xuICByLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcbiAgci5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICByLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgci53aGVlbFNlbnNpdGl2aXR5ID0gb3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5O1xuICByLm1vdGlvbkJsdXJFbmFibGVkID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBvbiBieSBkZWZhdWx0XG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlciQxKG9wdGlvbnMucGl4ZWxSYXRpbykgPyBvcHRpb25zLnBpeGVsUmF0aW8gOiBudWxsO1xuICByLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7IC8vIGZvciBpbml0aWFsIGtpY2sgb2ZmXG4gIHIubW90aW9uQmx1ck9wYWNpdHkgPSBvcHRpb25zLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kgPSAxIC0gci5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIHIubWJQeFJCbHVycnkgPSAxOyAvLzAuODtcbiAgci5taW5NYkxvd1F1YWxGcmFtZXMgPSA0O1xuICByLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgci5jbGVhcmVkRm9yTW90aW9uQmx1ciA9IFtdO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIuZGVza3RvcFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQgKiBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIudG91Y2hUYXBUaHJlc2hvbGQgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkMiA9IG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQgKiBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRhcGhvbGREdXJhdGlvbiA9IDUwMDtcbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMgPSB7XG4gICAgLy8gaGlnaGVyIHByaW9yaXR5IGV4ZWNzIGJlZm9yZSBsb3dlciBvbmVcbiAgICBhbmltYXRpb25zOiA0MDAsXG4gICAgZWxlQ2FsY3M6IDMwMCxcbiAgICBlbGVUeHJEZXE6IDIwMCxcbiAgICBseXJUeHJEZXE6IDE1MCxcbiAgICBseXJUeHJTa2lwOiAxMDBcbiAgfTtcbiAgci5yZWdpc3Rlck5vZGVTaGFwZXMoKTtcbiAgci5yZWdpc3RlckFycm93U2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJDYWxjdWxhdGlvbkxpc3RlbmVycygpO1xufTtcbkJScC5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgbm90aWZpZWQgYWZ0ZXIgaXQncyBkZXN0cm95ZWRcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdpbml0Jykge1xuICAgIHIubG9hZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnZGVzdHJveScpIHtcbiAgICByLmRlc3Ryb3koKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdsb2FkJyB8fCBldmVudE5hbWUgPT09ICdyZXNpemUnIHx8IGV2ZW50TmFtZSA9PT0gJ21vdW50Jykge1xuICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICB9XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgdGhpcy5zdGFydFJlbmRlckxvb3AoKTtcbiAgdGhpcy5yZWRyYXcoKTtcbn07XG5CUnAuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLmRlc3Ryb3llZCA9IHRydWU7XG4gIHIuY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGJpbmRpbmcgPSByLmJpbmRpbmdzW2ldO1xuICAgIHZhciBiID0gYmluZGluZztcbiAgICB2YXIgdGd0ID0gYi50YXJnZXQ7XG4gICAgKHRndC5vZmYgfHwgdGd0LnJlbW92ZUV2ZW50TGlzdGVuZXIpLmFwcGx5KHRndCwgYi5hcmdzKTtcbiAgfVxuICByLmJpbmRpbmdzID0gW107XG4gIHIuYmVmb3JlUmVuZGVyQ2FsbGJhY2tzID0gW107XG4gIHIub25VcGRhdGVFbGVDYWxjc0ZucyA9IFtdO1xuICBpZiAoci5yZW1vdmVPYnNlcnZlcikge1xuICAgIHIucmVtb3ZlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLnN0eWxlT2JzZXJ2ZXIpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLnJlc2l6ZU9ic2VydmVyKSB7XG4gICAgci5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIubGFiZWxDYWxjRGl2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoci5sYWJlbENhbGNEaXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWUxMCBpc3N1ZSAjMTAxNFxuICAgIH1cbiAgfVxufTtcbkJScC5pc0hlYWRsZXNzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuW0JScCRmLCBCUnAkNSwgQlJwJDQsIEJScCQzLCBCUnAkMiwgQlJwJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAsIHByb3BzKTtcbn0pO1xuXG52YXIgZnVsbEZwc1RpbWUgPSAxMDAwIC8gNjA7IC8vIGFzc3VtZSA2MCBmcmFtZXMgcGVyIHNlY29uZFxuXG52YXIgZGVmcyA9IHtcbiAgc2V0dXBEZXF1ZXVlaW5nOiBmdW5jdGlvbiBzZXR1cERlcXVldWVpbmcob3B0cykge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZXR1cERlcXVldWVpbmdJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgaWYgKHNlbGYuZGVxdWV1ZWluZ1NldHVwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuZGVxdWV1ZWluZ1NldHVwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBxdWV1ZVJlZHJhdyA9IGRlYm91bmNlXzEoZnVuY3Rpb24gKCkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCBvcHRzLmRlcVJlZHJhd1RocmVzaG9sZCk7XG4gICAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUod2lsbERyYXcsIGZyYW1lU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICB2YXIgYXZnUmVuZGVyVGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWU7XG4gICAgICAgIHZhciByZW5kZXJUaW1lID0gci5sYXN0UmVkcmF3VGltZTtcbiAgICAgICAgdmFyIGRlcWQgPSBbXTtcbiAgICAgICAgdmFyIGV4dGVudCA9IHIuY3kuZXh0ZW50KCk7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgLy8gaWYgd2UgYXJlbid0IGluIGEgdGljayB0aGF0IGNhdXNlcyBhIGRyYXcsIHRoZW4gdGhlIHJlbmRlcmVkIHN0eWxlXG4gICAgICAgIC8vIHF1ZXVlIHdvbid0IGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZCBiZWZvcmUgZGVxdWV1ZWluZyBzdGFydHNcbiAgICAgICAgaWYgKCF3aWxsRHJhdykge1xuICAgICAgICAgIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgdmFyIGR1cmF0aW9uID0gbm93IC0gc3RhcnRUaW1lO1xuICAgICAgICAgIHZhciBmcmFtZUR1cmF0aW9uID0gbm93IC0gZnJhbWVTdGFydFRpbWU7XG4gICAgICAgICAgaWYgKHJlbmRlclRpbWUgPCBmdWxsRnBzVGltZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIGZhc3RlciB0aGFuIHRoZSBpZGVhbCBmcHMsIHRoZW4gZG8gZGVxdWV1ZWluZ1xuICAgICAgICAgICAgLy8gZHVyaW5nIGFsbCBvZiB0aGUgcmVtYWluaW5nIGZyYW1lIHRpbWVcblxuICAgICAgICAgICAgdmFyIHRpbWVBdmFpbGFibGUgPSBmdWxsRnBzVGltZSAtICh3aWxsRHJhdyA/IGF2Z1JlbmRlclRpbWUgOiAwKTtcbiAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxRmFzdENvc3QgKiB0aW1lQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IG9wdHMuZGVxQ29zdCAqIHJlbmRlclRpbWUgfHwgZHVyYXRpb24gPj0gb3B0cy5kZXFBdmdDb3N0ICogYXZnUmVuZGVyVGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lRHVyYXRpb24gPj0gb3B0cy5kZXFOb0RyYXdDb3N0ICogZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0aGlzRGVxZCA9IG9wdHMuZGVxKHNlbGYsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgICAgICAgaWYgKHRoaXNEZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc0RlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZGVxZC5wdXNoKHRoaXNEZXFkW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsbGJhY2tzIG9uIGRlcXVldWVcbiAgICAgICAgaWYgKGRlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9wdHMub25EZXFkKHNlbGYsIGRlcWQpO1xuICAgICAgICAgIGlmICghd2lsbERyYXcgJiYgb3B0cy5zaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcGl4ZWxSYXRpbywgZXh0ZW50KSkge1xuICAgICAgICAgICAgcXVldWVSZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcHJpb3JpdHkgPSBvcHRzLnByaW9yaXR5IHx8IG5vb3AkMTtcbiAgICAgIHIuYmVmb3JlUmVuZGVyKGRlcXVldWUsIHByaW9yaXR5KHNlbGYpKTtcbiAgICB9O1xuICB9XG59O1xuXG4vLyBBbGxvd3MgbG9va3VwcyBmb3IgKGVsZSwgbHZsKSA9PiBjYWNoZS5cbi8vIFVzZXMga2V5cyBzbyBlbGVtZW50cyBtYXkgc2hhcmUgdGhlIHNhbWUgY2FjaGUuXG52YXIgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAoZ2V0S2V5KSB7XG4gICAgdmFyIGRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzaWZ5O1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKTtcbiAgICB0aGlzLmlkc0J5S2V5ID0gbmV3IE1hcCQyKCk7XG4gICAgdGhpcy5rZXlGb3JJZCA9IG5ldyBNYXAkMigpO1xuICAgIHRoaXMuY2FjaGVzQnlMdmwgPSBuZXcgTWFwJDIoKTtcbiAgICB0aGlzLmx2bHMgPSBbXTtcbiAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gZG9lc0VsZUludmFsaWRhdGVLZXk7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAsIFt7XG4gICAga2V5OiBcImdldElkc0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJZHNGb3Ioa2V5KSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoXCJDYW4gbm90IGdldCBpZCBsaXN0IGZvciBudWxsIGtleVwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBpZHNCeUtleSA9IHRoaXMuaWRzQnlLZXk7XG4gICAgICB2YXIgaWRzID0gdGhpcy5pZHNCeUtleS5nZXQoa2V5KTtcbiAgICAgIGlmICghaWRzKSB7XG4gICAgICAgIGlkcyA9IG5ldyBTZXQkMSgpO1xuICAgICAgICBpZHNCeUtleS5zZXQoa2V5LCBpZHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkSWRGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkSWRGb3JLZXkoa2V5LCBpZCkge1xuICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ2V0SWRzRm9yKGtleSkuYWRkKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlSWRGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlSWRGb3JLZXkoa2V5LCBpZCkge1xuICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ2V0SWRzRm9yKGtleSlbXCJkZWxldGVcIl0oaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXROdW1iZXJPZklkc0ZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROdW1iZXJPZklkc0ZvcktleShrZXkpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldElkc0ZvcihrZXkpLnNpemU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZUtleU1hcHBpbmdGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB2YXIgY3VycktleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLmRlbGV0ZUlkRm9yS2V5KHByZXZLZXksIGlkKTtcbiAgICAgIHRoaXMuYWRkSWRGb3JLZXkoY3VycktleSwgaWQpO1xuICAgICAgdGhpcy5rZXlGb3JJZC5zZXQoaWQsIGN1cnJLZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVLZXlNYXBwaW5nRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUtleU1hcHBpbmdGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdGhpcy5kZWxldGVJZEZvcktleShwcmV2S2V5LCBpZCk7XG4gICAgICB0aGlzLmtleUZvcklkW1wiZGVsZXRlXCJdKGlkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2V5SGFzQ2hhbmdlZEZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBrZXlIYXNDaGFuZ2VkRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHZhciBuZXdLZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgcmV0dXJuIHByZXZLZXkgIT09IG5ld0tleTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbnZhbGlkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW52YWxpZChlbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmtleUhhc0NoYW5nZWRGb3IoZWxlKSB8fCB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KGVsZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENhY2hlc0F0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENhY2hlc0F0KGx2bCkge1xuICAgICAgdmFyIGNhY2hlc0J5THZsID0gdGhpcy5jYWNoZXNCeUx2bCxcbiAgICAgICAgbHZscyA9IHRoaXMubHZscztcbiAgICAgIHZhciBjYWNoZXMgPSBjYWNoZXNCeUx2bC5nZXQobHZsKTtcbiAgICAgIGlmICghY2FjaGVzKSB7XG4gICAgICAgIGNhY2hlcyA9IG5ldyBNYXAkMigpO1xuICAgICAgICBjYWNoZXNCeUx2bC5zZXQobHZsLCBjYWNoZXMpO1xuICAgICAgICBsdmxzLnB1c2gobHZsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENhY2hlKGtleSwgbHZsKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXNBdChsdmwpLmdldChrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMuZ2V0Q2FjaGUoa2V5LCBsdmwpO1xuXG4gICAgICAvLyBnZXR0aW5nIGZvciBhbiBlbGVtZW50IG1heSBuZWVkIHRvIGFkZCB0byB0aGUgaWQgbGlzdCBiL2MgZWxlcyBjYW4gc2hhcmUga2V5c1xuICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cGRhdGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZvckNhY2hlZEtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChlbGUuaWQoKSk7IC8vIG4uYi4gdXNlIGNhY2hlZCBrZXksIG5vdCBuZXdseSBjb21wdXRlZCBrZXlcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMuZ2V0Q2FjaGUoa2V5LCBsdmwpO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNDYWNoZShrZXksIGx2bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5oYXMoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICByZXR1cm4gdGhpcy5oYXNDYWNoZShrZXksIGx2bCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldENhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENhY2hlKGtleSwgbHZsLCBjYWNoZSkge1xuICAgICAgY2FjaGUua2V5ID0ga2V5O1xuICAgICAgdGhpcy5nZXRDYWNoZXNBdChsdmwpLnNldChrZXksIGNhY2hlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChlbGUsIGx2bCwgY2FjaGUpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5zZXRDYWNoZShrZXksIGx2bCwgY2FjaGUpO1xuICAgICAgdGhpcy51cGRhdGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUNhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUNhY2hlKGtleSwgbHZsKSB7XG4gICAgICB0aGlzLmdldENhY2hlc0F0KGx2bClbXCJkZWxldGVcIl0oa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5kZWxldGVDYWNoZShrZXksIGx2bCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRhdGVLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52YWxpZGF0ZUtleShrZXkpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB0aGlzLmx2bHMuZm9yRWFjaChmdW5jdGlvbiAobHZsKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5kZWxldGVDYWNoZShrZXksIGx2bCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRydWUgaWYgbm8gb3RoZXIgZWxlcyByZWZlcmVuY2UgdGhlIGludmFsaWRhdGVkIGNhY2hlIChuLmIuIG90aGVyIGVsZXMgbWF5IG5lZWQgdGhlIGNhY2hlIHdpdGggdGhlIHNhbWUga2V5KVxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52YWxpZGF0ZShlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIGtleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTsgLy8gbi5iLiB1c2Ugc3RvcmVkIGtleSByYXRoZXIgdGhhbiBjdXJyZW50IChwb3RlbnRpYWwga2V5KVxuXG4gICAgICB0aGlzLmRlbGV0ZUtleU1hcHBpbmdGb3IoZWxlKTtcbiAgICAgIHZhciBlbnRpcmVLZXlJbnZhbGlkYXRlZCA9IHRoaXMuZG9lc0VsZUludmFsaWRhdGVLZXkoZWxlKTtcbiAgICAgIGlmIChlbnRpcmVLZXlJbnZhbGlkYXRlZCkge1xuICAgICAgICAvLyBjbGVhciBtYXBwaW5nIGZvciBjdXJyZW50IGtleVxuICAgICAgICB0aGlzLmludmFsaWRhdGVLZXkoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRpcmVLZXlJbnZhbGlkYXRlZCB8fCB0aGlzLmdldE51bWJlck9mSWRzRm9yS2V5KGtleSkgPT09IDA7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwO1xufSgpO1xuXG52YXIgbWluVHhySCA9IDI1OyAvLyB0aGUgc2l6ZSBvZiB0aGUgdGV4dHVyZSBjYWNoZSBmb3Igc21hbGwgaGVpZ2h0IGVsZXMgKHNwZWNpYWwgY2FzZSlcbnZhciB0eHJTdGVwSCA9IDUwOyAvLyB0aGUgbWluIHNpemUgb2YgdGhlIHJlZ3VsYXIgY2FjaGUsIGFuZCB0aGUgc2l6ZSBpdCBpbmNyZWFzZXMgd2l0aCBlYWNoIHN0ZXAgdXBcbnZhciBtaW5MdmwkMSA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcbnZhciBtYXhMdmwkMSA9IDM7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcbnZhciBtYXhab29tJDEgPSA3Ljk5OyAvLyBiZXlvbmQgdGhpcyB6b29tIGxldmVsLCBsYXllcmVkIHRleHR1cmVzIGFyZSBub3QgdXNlZFxudmFyIGVsZVR4clNwYWNpbmcgPSA4OyAvLyBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb24gdGV4dHVyZXMgdG8gYXZvaWQgYmxpdHRpbmcgb3ZlcmxhcHNcbnZhciBkZWZUeHJXaWR0aCA9IDEwMjQ7IC8vIGRlZmF1bHQvbWluaW11bSB0ZXh0dXJlIHdpZHRoXG52YXIgbWF4VHhyVyA9IDEwMjQ7IC8vIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgdGV4dHVyZVxudmFyIG1heFR4ckggPSAxMDI0OyAvLyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSB0ZXh0dXJlXG52YXIgbWluVXRpbGl0eSA9IDAuMjsgLy8gaWYgdXNhZ2Ugb2YgdGV4dHVyZSBpcyBsZXNzIHRoYW4gdGhpcywgaXQgaXMgcmV0aXJlZFxudmFyIG1heEZ1bGxuZXNzID0gMC44OyAvLyBmdWxsbmVzcyBvZiB0ZXh0dXJlIGFmdGVyIHdoaWNoIHF1ZXVlIHJlbW92YWwgaXMgY2hlY2tlZFxudmFyIG1heEZ1bGxuZXNzQ2hlY2tzID0gMTA7IC8vIGRlcXVldWVkIGFmdGVyIHRoaXMgbWFueSBjaGVja3NcbnZhciBkZXFDb3N0JDEgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcbnZhciBkZXFBdmdDb3N0JDEgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG52YXIgZGVxTm9EcmF3Q29zdCQxID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xudmFyIGRlcUZhc3RDb3N0JDEgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG52YXIgZGVxUmVkcmF3VGhyZXNob2xkJDEgPSAxMDA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG52YXIgbWF4RGVxU2l6ZSQxID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcblxudmFyIGdldFR4clJlYXNvbnMgPSB7XG4gIGRlcXVldWU6ICdkZXF1ZXVlJyxcbiAgZG93bnNjYWxlOiAnZG93bnNjYWxlJyxcbiAgaGlnaFF1YWxpdHk6ICdoaWdoUXVhbGl0eSdcbn07XG52YXIgaW5pdERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGdldEtleTogbnVsbCxcbiAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGZhbHNpZnksXG4gIGRyYXdFbGVtZW50OiBudWxsLFxuICBnZXRCb3VuZGluZ0JveDogbnVsbCxcbiAgZ2V0Um90YXRpb25Qb2ludDogbnVsbCxcbiAgZ2V0Um90YXRpb25PZmZzZXQ6IG51bGwsXG4gIGlzVmlzaWJsZTogdHJ1ZWlmeSxcbiAgYWxsb3dFZGdlVHhyQ2FjaGluZzogdHJ1ZSxcbiAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiB0cnVlXG59KTtcbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZShyZW5kZXJlciwgaW5pdE9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHNlbGYub25EZXF1ZXVlcyA9IFtdO1xuICB2YXIgb3B0cyA9IGluaXREZWZhdWx0cyhpbml0T3B0aW9ucyk7XG4gIGV4dGVuZChzZWxmLCBvcHRzKTtcbiAgc2VsZi5sb29rdXAgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChvcHRzLmdldEtleSwgb3B0cy5kb2VzRWxlSW52YWxpZGF0ZUtleSk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xudmFyIEVUQ3AgPSBFbGVtZW50VGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbkVUQ3AucmVhc29ucyA9IGdldFR4clJlYXNvbnM7XG5cbi8vIHRoZSBsaXN0IG9mIHRleHR1cmVzIGluIHdoaWNoIG5ldyBzdWJ0ZXh0dXJlcyBmb3IgZWxlbWVudHMgY2FuIGJlIHBsYWNlZFxuRVRDcC5nZXRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWxlSW1nQ2FjaGVzID0gc2VsZi5lbGVJbWdDYWNoZXMgfHwge307XG4gIHJldHVybiBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSA9IHNlbGYuZWxlSW1nQ2FjaGVzW3R4ckhdIHx8IFtdO1xufTtcblxuLy8gdGhlIGxpc3Qgb2YgdXN1c2VkIHRleHR1cmVzIHdoaWNoIGNhbiBiZSByZWN5Y2xlZCAoaW4gdXNlIGluIHRleHR1cmUgcXVldWUpXG5FVENwLmdldFJldGlyZWRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBydHh0clFzID0gc2VsZi5lbGVJbWdDYWNoZXMucmV0aXJlZCA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgfHwge307XG4gIHZhciBydHh0clEgPSBydHh0clFzW3R4ckhdID0gcnR4dHJRc1t0eHJIXSB8fCBbXTtcbiAgcmV0dXJuIHJ0eHRyUTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzXG5FVENwLmdldEVsZW1lbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSB8fCBuZXcgaGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcbkVUQ3AuZ2V0RWxlbWVudEtleVRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGsycSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlID0gc2VsZi5lbGVLZXlUb0NhY2hlUXVldWUgfHwge307XG4gIHJldHVybiBrMnE7XG59O1xuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gIGlmICghYmIgfHwgYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8IGlzTmFOKGJiLncpIHx8IGlzTmFOKGJiLmgpIHx8ICFlbGUudmlzaWJsZSgpIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXNlbGYuYWxsb3dFZGdlVHhyQ2FjaGluZyAmJiBlbGUuaXNFZGdlKCkgfHwgIXNlbGYuYWxsb3dQYXJlbnRUeHJDYWNoaW5nICYmIGVsZS5pc1BhcmVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuICBpZiAobHZsIDwgbWluTHZsJDEpIHtcbiAgICBsdmwgPSBtaW5MdmwkMTtcbiAgfSBlbHNlIGlmICh6b29tID49IG1heFpvb20kMSB8fCBsdmwgPiBtYXhMdmwkMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBlbGVTY2FsZWRIID0gYmIuaCAqIHNjYWxlO1xuICB2YXIgZWxlU2NhbGVkVyA9IGJiLncgKiBzY2FsZTtcbiAgdmFyIHNjYWxlZExhYmVsU2hvd24gPSByLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSwgc2NhbGUpO1xuICBpZiAoIXRoaXMuaXNWaXNpYmxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgZWxlQ2FjaGUgPSBsb29rdXAuZ2V0KGVsZSwgbHZsKTtcblxuICAvLyBpZiB0aGlzIGdldCB3YXMgb24gYW4gdW51c2VkL2ludmFsaWRhdGVkIGNhY2hlLCB0aGVuIHJlc3RvcmUgdGhlIHRleHR1cmUgdXNhZ2UgbWV0cmljXG4gIGlmIChlbGVDYWNoZSAmJiBlbGVDYWNoZS5pbnZhbGlkYXRlZCkge1xuICAgIGVsZUNhY2hlLmludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgZWxlQ2FjaGUudGV4dHVyZS5pbnZhbGlkYXRlZFdpZHRoIC09IGVsZUNhY2hlLndpZHRoO1xuICB9XG4gIGlmIChlbGVDYWNoZSkge1xuICAgIHJldHVybiBlbGVDYWNoZTtcbiAgfVxuICB2YXIgdHhySDsgLy8gd2hpY2ggdGV4dHVyZSBoZWlnaHQgdGhpcyBlbGUgYmVsb25ncyB0b1xuXG4gIGlmIChlbGVTY2FsZWRIIDw9IG1pblR4ckgpIHtcbiAgICB0eHJIID0gbWluVHhySDtcbiAgfSBlbHNlIGlmIChlbGVTY2FsZWRIIDw9IHR4clN0ZXBIKSB7XG4gICAgdHhySCA9IHR4clN0ZXBIO1xuICB9IGVsc2Uge1xuICAgIHR4ckggPSBNYXRoLmNlaWwoZWxlU2NhbGVkSCAvIHR4clN0ZXBIKSAqIHR4clN0ZXBIO1xuICB9XG4gIGlmIChlbGVTY2FsZWRIID4gbWF4VHhySCB8fCBlbGVTY2FsZWRXID4gbWF4VHhyVykge1xuICAgIHJldHVybiBudWxsOyAvLyBjYWNoaW5nIGxhcmdlIGVsZW1lbnRzIGlzIG5vdCBlZmZpY2llbnRcbiAgfVxuXG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG5cbiAgLy8gZmlyc3QgdHJ5IHRoZSBzZWNvbmQgbGFzdCBvbmUgaW4gY2FzZSBpdCBoYXMgc3BhY2UgYXQgdGhlIGVuZFxuICB2YXIgdHhyID0gdHhyUVt0eHJRLmxlbmd0aCAtIDJdO1xuICB2YXIgYWRkTmV3VHhyID0gZnVuY3Rpb24gYWRkTmV3VHhyKCkge1xuICAgIHJldHVybiBzZWxmLnJlY3ljbGVUZXh0dXJlKHR4ckgsIGVsZVNjYWxlZFcpIHx8IHNlbGYuYWRkVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKTtcbiAgfTtcblxuICAvLyB0cnkgdGhlIGxhc3Qgb25lIGlmIHRoZXJlIGlzIG5vIHNlY29uZCBsYXN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8vIGlmIHRoZSBsYXN0IG9uZSBkb2Vzbid0IGV4aXN0LCB3ZSBuZWVkIGEgZmlyc3Qgb25lXG4gIGlmICghdHhyKSB7XG4gICAgdHhyID0gYWRkTmV3VHhyKCk7XG4gIH1cblxuICAvLyBpZiB0aGVyZSdzIG5vIHJvb20gaW4gdGhlIGN1cnJlbnQgdGV4dHVyZSwgd2UgbmVlZCBhIG5ldyBvbmVcbiAgaWYgKHR4ci53aWR0aCAtIHR4ci51c2VkV2lkdGggPCBlbGVTY2FsZWRXKSB7XG4gICAgdHhyID0gYWRkTmV3VHhyKCk7XG4gIH1cbiAgdmFyIHNjYWxhYmxlRnJvbSA9IGZ1bmN0aW9uIHNjYWxhYmxlRnJvbShvdGhlckNhY2hlKSB7XG4gICAgcmV0dXJuIG90aGVyQ2FjaGUgJiYgb3RoZXJDYWNoZS5zY2FsZWRMYWJlbFNob3duID09PSBzY2FsZWRMYWJlbFNob3duO1xuICB9O1xuICB2YXIgZGVxaW5nID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kZXF1ZXVlO1xuICB2YXIgaGlnaFF1YWxpdHlSZXEgPSByZWFzb24gJiYgcmVhc29uID09PSBnZXRUeHJSZWFzb25zLmhpZ2hRdWFsaXR5O1xuICB2YXIgZG93bnNjYWxlUmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kb3duc2NhbGU7XG4gIHZhciBoaWdoZXJDYWNoZTsgLy8gdGhlIG5lYXJlc3QgY2FjaGUgd2l0aCBhIGhpZ2hlciBsZXZlbFxuICBmb3IgKHZhciBsID0gbHZsICsgMTsgbCA8PSBtYXhMdmwkMTsgbCsrKSB7XG4gICAgdmFyIGMgPSBsb29rdXAuZ2V0KGVsZSwgbCk7XG4gICAgaWYgKGMpIHtcbiAgICAgIGhpZ2hlckNhY2hlID0gYztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgb25lVXBDYWNoZSA9IGhpZ2hlckNhY2hlICYmIGhpZ2hlckNhY2hlLmxldmVsID09PSBsdmwgKyAxID8gaGlnaGVyQ2FjaGUgOiBudWxsO1xuICB2YXIgZG93bnNjYWxlID0gZnVuY3Rpb24gZG93bnNjYWxlKCkge1xuICAgIHR4ci5jb250ZXh0LmRyYXdJbWFnZShvbmVVcENhY2hlLnRleHR1cmUuY2FudmFzLCBvbmVVcENhY2hlLngsIDAsIG9uZVVwQ2FjaGUud2lkdGgsIG9uZVVwQ2FjaGUuaGVpZ2h0LCB0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCBlbGVTY2FsZWRIKTtcbiAgfTtcblxuICAvLyByZXNldCBlbGUgYXJlYSBpbiB0ZXh0dXJlXG4gIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KHR4ci51c2VkV2lkdGgsIDAsIGVsZVNjYWxlZFcsIHR4ckgpO1xuICBpZiAoc2NhbGFibGVGcm9tKG9uZVVwQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB3ZSBjYW4gcmVsYXRpdmVseSBjaGVhcGx5IHJlc2NhbGUgdGhlIGV4aXN0aW5nIGltYWdlIHcvbyByZXJlbmRlcmluZ1xuICAgIGRvd25zY2FsZSgpO1xuICB9IGVsc2UgaWYgKHNjYWxhYmxlRnJvbShoaWdoZXJDYWNoZSkpIHtcbiAgICAvLyB0aGVuIHVzZSB0aGUgaGlnaGVyIGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBuZXh0IGxldmVsIGRvd25cbiAgICAvLyB0byBjaGVhcGx5IHNjYWxlIHRvd2FyZHMgdGhlIHNtYWxsZXIgbGV2ZWxcblxuICAgIGlmIChoaWdoUXVhbGl0eVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wgPSBoaWdoZXJDYWNoZS5sZXZlbDsgX2wgPiBsdmw7IF9sLS0pIHtcbiAgICAgICAgb25lVXBDYWNoZSA9IHNlbGYuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBfbCwgZ2V0VHhyUmVhc29ucy5kb3duc2NhbGUpO1xuICAgICAgfVxuICAgICAgZG93bnNjYWxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgaGlnaGVyQ2FjaGUubGV2ZWwgLSAxKTtcbiAgICAgIHJldHVybiBoaWdoZXJDYWNoZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxvd2VyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBsb3dlciBsZXZlbFxuICAgIGlmICghZGVxaW5nICYmICFoaWdoUXVhbGl0eVJlcSAmJiAhZG93bnNjYWxlUmVxKSB7XG4gICAgICBmb3IgKHZhciBfbDIgPSBsdmwgLSAxOyBfbDIgPj0gbWluTHZsJDE7IF9sMi0tKSB7XG4gICAgICAgIHZhciBfYyA9IGxvb2t1cC5nZXQoZWxlLCBfbDIpO1xuICAgICAgICBpZiAoX2MpIHtcbiAgICAgICAgICBsb3dlckNhY2hlID0gX2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNjYWxhYmxlRnJvbShsb3dlckNhY2hlKSkge1xuICAgICAgLy8gdGhlbiB1c2UgdGhlIGxvd2VyIHF1YWxpdHkgY2FjaGUgZm9yIG5vdyBhbmQgcXVldWUgdGhlIGJldHRlciBvbmUgZm9yIGxhdGVyXG5cbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgbHZsKTtcbiAgICAgIHJldHVybiBsb3dlckNhY2hlO1xuICAgIH1cbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUodHhyLnVzZWRXaWR0aCwgMCk7XG4gICAgdHhyLmNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICB0aGlzLmRyYXdFbGVtZW50KHR4ci5jb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCBmYWxzZSk7XG4gICAgdHhyLmNvbnRleHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgIHR4ci5jb250ZXh0LnRyYW5zbGF0ZSgtdHhyLnVzZWRXaWR0aCwgMCk7XG4gIH1cbiAgZWxlQ2FjaGUgPSB7XG4gICAgeDogdHhyLnVzZWRXaWR0aCxcbiAgICB0ZXh0dXJlOiB0eHIsXG4gICAgbGV2ZWw6IGx2bCxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgd2lkdGg6IGVsZVNjYWxlZFcsXG4gICAgaGVpZ2h0OiBlbGVTY2FsZWRILFxuICAgIHNjYWxlZExhYmVsU2hvd246IHNjYWxlZExhYmVsU2hvd25cbiAgfTtcbiAgdHhyLnVzZWRXaWR0aCArPSBNYXRoLmNlaWwoZWxlU2NhbGVkVyArIGVsZVR4clNwYWNpbmcpO1xuICB0eHIuZWxlQ2FjaGVzLnB1c2goZWxlQ2FjaGUpO1xuICBsb29rdXAuc2V0KGVsZSwgbHZsLCBlbGVDYWNoZSk7XG4gIHNlbGYuY2hlY2tUZXh0dXJlRnVsbG5lc3ModHhyKTtcbiAgcmV0dXJuIGVsZUNhY2hlO1xufTtcbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlRWxlbWVudChlbGVzW2ldKTtcbiAgfVxufTtcbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxvb2t1cCA9IHNlbGYubG9va3VwO1xuICB2YXIgY2FjaGVzID0gW107XG4gIHZhciBpbnZhbGlkID0gbG9va3VwLmlzSW52YWxpZChlbGUpO1xuICBpZiAoIWludmFsaWQpIHtcbiAgICByZXR1cm47IC8vIG92ZXJyaWRlIHRoZSBpbnZhbGlkYXRpb24gcmVxdWVzdCBpZiB0aGUgZWxlbWVudCBrZXkgaGFzIG5vdCBjaGFuZ2VkXG4gIH1cblxuICBmb3IgKHZhciBsdmwgPSBtaW5MdmwkMTsgbHZsIDw9IG1heEx2bCQxOyBsdmwrKykge1xuICAgIHZhciBjYWNoZSA9IGxvb2t1cC5nZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICAgIH1cbiAgfVxuICB2YXIgbm9PdGhlckVsZXNVc2VDYWNoZSA9IGxvb2t1cC5pbnZhbGlkYXRlKGVsZSk7XG4gIGlmIChub090aGVyRWxlc1VzZUNhY2hlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfY2FjaGUgPSBjYWNoZXNbaV07XG4gICAgICB2YXIgdHhyID0gX2NhY2hlLnRleHR1cmU7XG5cbiAgICAgIC8vIHJlbW92ZSBzcGFjZSBmcm9tIHRoZSB0ZXh0dXJlIGl0IGJlbG9uZ3MgdG9cbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoICs9IF9jYWNoZS53aWR0aDtcblxuICAgICAgLy8gbWFyayB0aGUgY2FjaGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgIF9jYWNoZS5pbnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgICAgIC8vIHJldGlyZSB0aGUgdGV4dHVyZSBpZiBpdHMgdXRpbGl0eSBpcyBsb3dcbiAgICAgIHNlbGYuY2hlY2tUZXh0dXJlVXRpbGl0eSh0eHIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBmcm9tIHF1ZXVlIHNpbmNlIHRoZSBvbGQgcmVxIHdhcyBmb3IgdGhlIG9sZCBzdGF0ZVxuICBzZWxmLnJlbW92ZUZyb21RdWV1ZShlbGUpO1xufTtcbkVUQ3AuY2hlY2tUZXh0dXJlVXRpbGl0eSA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgLy8gaW52YWxpZGF0ZSBhbGwgZW50cmllcyBpbiB0aGUgY2FjaGUgaWYgdGhlIGNhY2hlIHNpemUgaXMgc21hbGxcbiAgaWYgKHR4ci5pbnZhbGlkYXRlZFdpZHRoID49IG1pblV0aWxpdHkgKiB0eHIud2lkdGgpIHtcbiAgICB0aGlzLnJldGlyZVRleHR1cmUodHhyKTtcbiAgfVxufTtcbkVUQ3AuY2hlY2tUZXh0dXJlRnVsbG5lc3MgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGlmIHRleHR1cmUgaGFzIGJlZW4gbW9zdGx5IGZpbGxlZCBhbmQgcGFzc2VkIG92ZXIgc2V2ZXJhbCB0aW1lcywgcmVtb3ZlXG4gIC8vIGl0IGZyb20gdGhlIHF1ZXVlIHNvIHdlIGRvbid0IG5lZWQgdG8gd2FzdGUgdGltZSBsb29raW5nIGF0IGl0IHRvIHB1dCBuZXcgdGhpbmdzXG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ci5oZWlnaHQpO1xuICBpZiAodHhyLnVzZWRXaWR0aCAvIHR4ci53aWR0aCA+IG1heEZ1bGxuZXNzICYmIHR4ci5mdWxsbmVzc0NoZWNrcyA+PSBtYXhGdWxsbmVzc0NoZWNrcykge1xuICAgIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB9IGVsc2Uge1xuICAgIHR4ci5mdWxsbmVzc0NoZWNrcysrO1xuICB9XG59O1xuRVRDcC5yZXRpcmVUZXh0dXJlID0gZnVuY3Rpb24gKHR4cikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJIID0gdHhyLmhlaWdodDtcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIGxvb2t1cCA9IHRoaXMubG9va3VwO1xuXG4gIC8vIHJldGlyZSB0aGUgdGV4dHVyZSBmcm9tIHRoZSBhY3RpdmUgLyBzZWFyY2hhYmxlIHF1ZXVlOlxuXG4gIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB0eHIucmV0aXJlZCA9IHRydWU7XG5cbiAgLy8gcmVtb3ZlIHRoZSByZWZzIGZyb20gdGhlIGVsZXMgdG8gdGhlIGNhY2hlczpcblxuICB2YXIgZWxlQ2FjaGVzID0gdHhyLmVsZUNhY2hlcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlQ2FjaGUgPSBlbGVDYWNoZXNbaV07XG4gICAgbG9va3VwLmRlbGV0ZUNhY2hlKGVsZUNhY2hlLmtleSwgZWxlQ2FjaGUubGV2ZWwpO1xuICB9XG4gIGNsZWFyQXJyYXkoZWxlQ2FjaGVzKTtcblxuICAvLyBhZGQgdGhlIHRleHR1cmUgdG8gYSByZXRpcmVkIHF1ZXVlIHNvIGl0IGNhbiBiZSByZWN5Y2xlZCBpbiBmdXR1cmU6XG5cbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgcnR4dHJRLnB1c2godHhyKTtcbn07XG5FVENwLmFkZFRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciB0eHIgPSB7fTtcbiAgdHhyUS5wdXNoKHR4cik7XG4gIHR4ci5lbGVDYWNoZXMgPSBbXTtcbiAgdHhyLmhlaWdodCA9IHR4ckg7XG4gIHR4ci53aWR0aCA9IE1hdGgubWF4KGRlZlR4cldpZHRoLCBtaW5XKTtcbiAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgdHhyLmZ1bGxuZXNzQ2hlY2tzID0gMDtcbiAgdHhyLmNhbnZhcyA9IHNlbGYucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICB0eHIuY29udGV4dCA9IHR4ci5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgcmV0dXJuIHR4cjtcbn07XG5FVENwLnJlY3ljbGVUZXh0dXJlID0gZnVuY3Rpb24gKHR4ckgsIG1pblcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgcnR4dHJRID0gc2VsZi5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlKHR4ckgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJ0eHRyUS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0eHIgPSBydHh0clFbaV07XG4gICAgaWYgKHR4ci53aWR0aCA+PSBtaW5XKSB7XG4gICAgICB0eHIucmV0aXJlZCA9IGZhbHNlO1xuICAgICAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuaW52YWxpZGF0ZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICAgICAgY2xlYXJBcnJheSh0eHIuZWxlQ2FjaGVzKTtcbiAgICAgIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIHR4ci5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICAgICAgcmVtb3ZlRnJvbUFycmF5KHJ0eHRyUSwgdHhyKTtcbiAgICAgIHR4clEucHVzaCh0eHIpO1xuICAgICAgcmV0dXJuIHR4cjtcbiAgICB9XG4gIH1cbn07XG5FVENwLnF1ZXVlRWxlbWVudCA9IGZ1bmN0aW9uIChlbGUsIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gIHZhciBleGlzdGluZ1JlcSA9IGsycVtrZXldO1xuICBpZiAoZXhpc3RpbmdSZXEpIHtcbiAgICAvLyB1c2UgdGhlIG1heCBsdmwgYi9jIGluIGJldHdlZW4gbHZscyBhcmUgY2hlYXAgdG8gbWFrZVxuICAgIGV4aXN0aW5nUmVxLmxldmVsID0gTWF0aC5tYXgoZXhpc3RpbmdSZXEubGV2ZWwsIGx2bCk7XG4gICAgZXhpc3RpbmdSZXEuZWxlcy5tZXJnZShlbGUpO1xuICAgIGV4aXN0aW5nUmVxLnJlcXMrKztcbiAgICBxLnVwZGF0ZUl0ZW0oZXhpc3RpbmdSZXEpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXEgPSB7XG4gICAgICBlbGVzOiBlbGUuc3Bhd24oKS5tZXJnZShlbGUpLFxuICAgICAgbGV2ZWw6IGx2bCxcbiAgICAgIHJlcXM6IDEsXG4gICAgICBrZXk6IGtleVxuICAgIH07XG4gICAgcS5wdXNoKHJlcSk7XG4gICAgazJxW2tleV0gPSByZXE7XG4gIH1cbn07XG5FVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpbyAvKiwgZXh0ZW50Ki8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBkZXF1ZXVlZCA9IFtdO1xuICB2YXIgbG9va3VwID0gc2VsZi5sb29rdXA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4RGVxU2l6ZSQxOyBpKyspIHtcbiAgICBpZiAocS5zaXplKCkgPiAwKSB7XG4gICAgICB2YXIgcmVxID0gcS5wb3AoKTtcbiAgICAgIHZhciBrZXkgPSByZXEua2V5O1xuICAgICAgdmFyIGVsZSA9IHJlcS5lbGVzWzBdOyAvLyBhbGwgZWxlcyBoYXZlIHRoZSBzYW1lIGtleVxuICAgICAgdmFyIGNhY2hlRXhpc3RzID0gbG9va3VwLmhhc0NhY2hlKGVsZSwgcmVxLmxldmVsKTtcblxuICAgICAgLy8gY2xlYXIgb3V0IHRoZSBrZXkgdG8gcmVxIGxvb2t1cFxuICAgICAgazJxW2tleV0gPSBudWxsO1xuXG4gICAgICAvLyBkZXF1ZXVlaW5nIGlzbid0IG5lY2Vzc2FyeSB3aXRoIGFuIGV4aXN0aW5nIGNhY2hlXG4gICAgICBpZiAoY2FjaGVFeGlzdHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXF1ZXVlZC5wdXNoKHJlcSk7XG4gICAgICB2YXIgYmIgPSBzZWxmLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gICAgICBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgcmVxLmxldmVsLCBnZXRUeHJSZWFzb25zLmRlcXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlcXVldWVkO1xufTtcbkVUQ3AucmVtb3ZlRnJvbVF1ZXVlID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gIHZhciByZXEgPSBrMnFba2V5XTtcbiAgaWYgKHJlcSAhPSBudWxsKSB7XG4gICAgaWYgKHJlcS5lbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gcmVtb3ZlIGlmIGxhc3QgZWxlIGluIHRoZSByZXFcbiAgICAgIC8vIGJyaW5nIHRvIGZyb250IG9mIHF1ZXVlXG4gICAgICByZXEucmVxcyA9IE1BWF9JTlQkMTtcbiAgICAgIHEudXBkYXRlSXRlbShyZXEpO1xuICAgICAgcS5wb3AoKTsgLy8gcmVtb3ZlIGZyb20gcXVldWVcblxuICAgICAgazJxW2tleV0gPSBudWxsOyAvLyByZW1vdmUgZnJvbSBsb29rdXAgbWFwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHJlbW92ZSBlbGUgZnJvbSByZXFcbiAgICAgIHJlcS5lbGVzLnVubWVyZ2UoZWxlKTtcbiAgICB9XG4gIH1cbn07XG5FVENwLm9uRGVxdWV1ZSA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLm9uRGVxdWV1ZXMucHVzaChmbik7XG59O1xuRVRDcC5vZmZEZXF1ZXVlID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlbW92ZUZyb21BcnJheSh0aGlzLm9uRGVxdWV1ZXMsIGZuKTtcbn07XG5FVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQkMSxcbiAgZGVxQ29zdDogZGVxQ29zdCQxLFxuICBkZXFBdmdDb3N0OiBkZXFBdmdDb3N0JDEsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QkMSxcbiAgZGVxRmFzdENvc3Q6IGRlcUZhc3RDb3N0JDEsXG4gIGRlcTogZnVuY3Rpb24gZGVxKHNlbGYsIHB4UmF0aW8sIGV4dGVudCkge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbywgZXh0ZW50KTtcbiAgfSxcbiAgb25EZXFkOiBmdW5jdGlvbiBvbkRlcWQoc2VsZiwgZGVxZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vbkRlcXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZm4gPSBzZWxmLm9uRGVxdWV1ZXNbaV07XG4gICAgICBmbihkZXFkKTtcbiAgICB9XG4gIH0sXG4gIHNob3VsZFJlZHJhdzogZnVuY3Rpb24gc2hvdWxkUmVkcmF3KHNlbGYsIGRlcWQsIHB4UmF0aW8sIGV4dGVudCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVxZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZXMgPSBkZXFkW2ldLmVsZXM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGJiID0gZWxlc1tqXS5ib3VuZGluZ0JveCgpO1xuICAgICAgICBpZiAoYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYiwgZXh0ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgcHJpb3JpdHk6IGZ1bmN0aW9uIHByaW9yaXR5KHNlbGYpIHtcbiAgICByZXR1cm4gc2VsZi5yZW5kZXJlci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmVsZVR4ckRlcTtcbiAgfVxufSk7XG5cbnZhciBkZWZOdW1MYXllcnMgPSAxOyAvLyBkZWZhdWx0IG51bWJlciBvZiBsYXllcnMgdG8gdXNlXG52YXIgbWluTHZsID0gLTQ7IC8vIHdoZW4gc2NhbGluZyBzbWFsbGVyIHRoYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlbmRlclxudmFyIG1heEx2bCA9IDI7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcbnZhciBtYXhab29tID0gMy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQgPSA1MDsgLy8gdGltZSB0byBiYXRjaCByZWRyYXdzIHRvZ2V0aGVyIGZyb20gZGVxdWV1ZWluZyB0byBhbGxvdyBtb3JlIGRlcXVldWVpbmcgY2FsY3MgdG8gaGFwcGVuIGluIHRoZSBtZWFud2hpbGVcbnZhciByZWZpbmVFbGVEZWJvdW5jZVRpbWUgPSA1MDsgLy8gdGltZSB0byBkZWJvdW5jZSBzaGFycGVyIGVsZSB0ZXh0dXJlIHVwZGF0ZXNcbnZhciBkZXFDb3N0ID0gMC4xNTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBhbGxvd2VkIGZvciBkZXF1ZXVpbmcgZWxlIGNhY2hlcyBlYWNoIGZyYW1lXG52YXIgZGVxQXZnQ29zdCA9IDAuMTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBjb21wYXJlZCB0byBhdmVyYWdlIG92ZXJhbGwgcmVkcmF3IHRpbWVcbnZhciBkZXFOb0RyYXdDb3N0ID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xudmFyIGRlcUZhc3RDb3N0ID0gMC45OyAvLyAlIG9mIGZyYW1lIHRpbWUgdG8gYmUgdXNlZCB3aGVuID42MGZwc1xudmFyIG1heERlcVNpemUgPSAxOyAvLyBudW1iZXIgb2YgZWxlcyB0byBkZXF1ZXVlIGFuZCByZW5kZXIgYXQgaGlnaGVyIHRleHR1cmUgaW4gZWFjaCBiYXRjaFxudmFyIGludmFsaWRUaHJlc2hvbGQgPSAyNTA7IC8vIHRpbWUgdGhyZXNob2xkIGZvciBkaXNhYmxpbmcgYi9jIG9mIGludmFsaWRhdGlvbnNcbnZhciBtYXhMYXllckFyZWEgPSA0MDAwICogNDAwMDsgLy8gbGF5ZXJzIGNhbid0IGJlIGJpZ2dlciB0aGFuIHRoaXNcbnZhciB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMgPSB0cnVlOyAvLyB3aGV0aGVyIHRvIHVzZSBoaWdoIHF1YWxpdHkgZWxlIHR4ciByZXF1ZXN0cyAoZ2VuZXJhbGx5IGZhc3RlciBhbmQgY2hlYXBlciBpbiB0aGUgbG9uZ3Rlcm0pXG5cbi8vIHZhciBsb2cgPSBmdW5jdGlvbigpeyBjb25zb2xlLmxvZy5hcHBseSggY29uc29sZSwgYXJndW1lbnRzICk7IH07XG5cbnZhciBMYXllcmVkVGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gTGF5ZXJlZFRleHR1cmVDYWNoZShyZW5kZXJlcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICB2YXIgY3kgPSByLmN5O1xuICBzZWxmLmxheWVyc0J5TGV2ZWwgPSB7fTsgLy8gZS5nLiAyID0+IFsgbGF5ZXIxLCBsYXllcjIsIC4uLiwgbGF5ZXJOIF1cblxuICBzZWxmLmZpcnN0R2V0ID0gdHJ1ZTtcbiAgc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCkgLSAyICogaW52YWxpZFRocmVzaG9sZDtcbiAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICBzZWxmLmVsZVR4ckRlcXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHNlbGYuc2NoZWR1bGVFbGVtZW50UmVmaW5lbWVudCA9IGRlYm91bmNlXzEoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYucmVmaW5lRWxlbWVudFRleHR1cmVzKHNlbGYuZWxlVHhyRGVxcyk7XG4gICAgc2VsZi5lbGVUeHJEZXFzLnVubWVyZ2Uoc2VsZi5lbGVUeHJEZXFzKTtcbiAgfSwgcmVmaW5lRWxlRGVib3VuY2VUaW1lKTtcbiAgci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gKHdpbGxEcmF3LCBub3cpIHtcbiAgICBpZiAobm93IC0gc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA8PSBpbnZhbGlkVGhyZXNob2xkKSB7XG4gICAgICBzZWxmLnNraXBwaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmx5clR4clNraXApO1xuICB2YXIgcVNvcnQgPSBmdW5jdGlvbiBxU29ydChhLCBiKSB7XG4gICAgcmV0dXJuIGIucmVxcyAtIGEucmVxcztcbiAgfTtcbiAgc2VsZi5sYXllcnNRdWV1ZSA9IG5ldyBoZWFwKHFTb3J0KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG52YXIgTFRDcCA9IExheWVyZWRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xudmFyIGxheWVySWRQb29sID0gMDtcbnZhciBNQVhfSU5UID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbkxUQ3AubWFrZUxheWVyID0gZnVuY3Rpb24gKGJiLCBsdmwpIHtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgdmFyIGggPSBNYXRoLmNlaWwoYmIuaCAqIHNjYWxlKTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgdmFyIGxheWVyID0ge1xuICAgIGlkOiBsYXllcklkUG9vbCA9ICsrbGF5ZXJJZFBvb2wgJSBNQVhfSU5ULFxuICAgIGJiOiBiYixcbiAgICBsZXZlbDogbHZsLFxuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICBlbGVzOiBbXSxcbiAgICBlbGVzUXVldWU6IFtdLFxuICAgIHJlcXM6IDBcbiAgfTtcblxuICAvLyBsb2coJ21ha2UgbGF5ZXIgJXMgd2l0aCB3ICVzIGFuZCBoICVzIGFuZCBsdmwgJXMnLCBsYXllci5pZCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIubGV2ZWwpO1xuXG4gIHZhciBjeHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgZHggPSAtbGF5ZXIuYmIueDE7XG4gIHZhciBkeSA9IC1sYXllci5iYi55MTtcblxuICAvLyBkbyB0aGUgdHJhbnNmb3JtIG9uIGNyZWF0aW9uIHRvIHNhdmUgY3ljbGVzIChpdCdzIHRoZSBzYW1lIGZvciBhbGwgZWxlcylcbiAgY3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gIGN4dC50cmFuc2xhdGUoZHgsIGR5KTtcbiAgcmV0dXJuIGxheWVyO1xufTtcbkxUQ3AuZ2V0TGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHB4UmF0aW8sIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBmaXJzdEdldCA9IHNlbGYuZmlyc3RHZXQ7XG4gIHNlbGYuZmlyc3RHZXQgPSBmYWxzZTtcblxuICAvLyBsb2coJy0tXFxuZ2V0IGxheWVycyB3aXRoICVzIGVsZXMnLCBlbGVzLmxlbmd0aCk7XG4gIC8vbG9nIGVsZXMubWFwKGZ1bmN0aW9uKGVsZSl7IHJldHVybiBlbGUuaWQoKSB9KSApO1xuXG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gICAgaWYgKGx2bCA8IG1pbkx2bCkge1xuICAgICAgbHZsID0gbWluTHZsO1xuICAgIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHNlbGYudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcobHZsLCBlbGVzKTtcbiAgdmFyIGxheWVyc0J5THZsID0gc2VsZi5sYXllcnNCeUxldmVsO1xuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgbGF5ZXJzID0gbGF5ZXJzQnlMdmxbbHZsXSA9IGxheWVyc0J5THZsW2x2bF0gfHwgW107XG4gIHZhciBiYjtcbiAgdmFyIGx2bENvbXBsZXRlID0gc2VsZi5sZXZlbElzQ29tcGxldGUobHZsLCBlbGVzKTtcbiAgdmFyIHRtcExheWVycztcbiAgdmFyIGNoZWNrVGVtcExldmVscyA9IGZ1bmN0aW9uIGNoZWNrVGVtcExldmVscygpIHtcbiAgICB2YXIgY2FuVXNlQXNUbXBMdmwgPSBmdW5jdGlvbiBjYW5Vc2VBc1RtcEx2bChsKSB7XG4gICAgICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGwsIGVsZXMpO1xuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBjaGVja0x2bHMgPSBmdW5jdGlvbiBjaGVja0x2bHMoZGlyKSB7XG4gICAgICBpZiAodG1wTGF5ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGwgPSBsdmwgKyBkaXI7IG1pbkx2bCA8PSBsICYmIGwgPD0gbWF4THZsOyBsICs9IGRpcikge1xuICAgICAgICBpZiAoY2FuVXNlQXNUbXBMdmwobCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tMdmxzKCsxKTtcbiAgICBjaGVja0x2bHMoLTEpO1xuXG4gICAgLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxheWVyczsgdGhleSB3aWxsIGJlIHJlcGxhY2VkIGFzIG5lZWRlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uXG4gICAgZm9yICh2YXIgaSA9IGxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUFycmF5KGxheWVycywgbGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgaWYgKCFsdmxDb21wbGV0ZSkge1xuICAgIC8vIGlmIHRoZSBjdXJyZW50IGxldmVsIGlzIGluY29tcGxldGUsIHRoZW4gdXNlIHRoZSBjbG9zZXN0LCBiZXN0IHF1YWxpdHkgbGF5ZXJzZXQgdGVtcG9yYXJpbHlcbiAgICAvLyBhbmQgbGF0ZXIgcXVldWUgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgc28gd2UgY2FuIGdldCB0aGUgcHJvcGVyIHF1YWxpdHkgbGV2ZWwgc29vblxuXG4gICAgY2hlY2tUZW1wTGV2ZWxzKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbG9nKCdsZXZlbCBjb21wbGV0ZSwgdXNpbmcgZXhpc3RpbmcgbGF5ZXJzXFxuLS0nKTtcbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG4gIHZhciBnZXRCYiA9IGZ1bmN0aW9uIGdldEJiKCkge1xuICAgIGlmICghYmIpIHtcbiAgICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlQm91bmRpbmdCb3goYmIsIGVsZXNbaV0uYm91bmRpbmdCb3goKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYjtcbiAgfTtcbiAgdmFyIG1ha2VMYXllciA9IGZ1bmN0aW9uIG1ha2VMYXllcihvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGFmdGVyID0gb3B0cy5hZnRlcjtcbiAgICBnZXRCYigpO1xuICAgIHZhciBhcmVhID0gYmIudyAqIHNjYWxlICogKGJiLmggKiBzY2FsZSk7XG4gICAgaWYgKGFyZWEgPiBtYXhMYXllckFyZWEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbGF5ZXIgPSBzZWxmLm1ha2VMYXllcihiYiwgbHZsKTtcbiAgICBpZiAoYWZ0ZXIgIT0gbnVsbCkge1xuICAgICAgdmFyIGluZGV4ID0gbGF5ZXJzLmluZGV4T2YoYWZ0ZXIpICsgMTtcbiAgICAgIGxheWVycy5zcGxpY2UoaW5kZXgsIDAsIGxheWVyKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMuaW5zZXJ0ID09PSB1bmRlZmluZWQgfHwgb3B0cy5pbnNlcnQpIHtcbiAgICAgIC8vIG5vIGFmdGVyIHNwZWNpZmllZCA9PiBmaXJzdCBsYXllciBtYWRlIHNvIHB1dCBhdCBzdGFydFxuICAgICAgbGF5ZXJzLnVuc2hpZnQobGF5ZXIpO1xuICAgIH1cblxuICAgIC8vIGlmKCB0bXBMYXllcnMgKXtcbiAgICAvL3NlbGYucXVldWVMYXllciggbGF5ZXIgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH07XG4gIGlmIChzZWxmLnNraXBwaW5nICYmICFmaXJzdEdldCkge1xuICAgIC8vIGxvZygnc2tpcCBsYXllcnMnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGxvZygnZG8gbGF5ZXJzJyk7XG5cbiAgdmFyIGxheWVyID0gbnVsbDtcbiAgdmFyIG1heEVsZXNQZXJMYXllciA9IGVsZXMubGVuZ3RoIC8gZGVmTnVtTGF5ZXJzO1xuICB2YXIgYWxsb3dMYXp5UXVldWVpbmcgPSAhZmlyc3RHZXQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcblxuICAgIC8vIGxvZygnbG9vayBhdCBlbGUnLCBlbGUuaWQoKSk7XG5cbiAgICB2YXIgZXhpc3RpbmdMYXllciA9IGNhY2hlc1tsdmxdO1xuICAgIGlmIChleGlzdGluZ0xheWVyKSB7XG4gICAgICAvLyByZXVzZSBsYXllciBmb3IgbGF0ZXIgZWxlc1xuICAgICAgLy8gbG9nKCdyZXVzZSBsYXllciBmb3InLCBlbGUuaWQoKSk7XG4gICAgICBsYXllciA9IGV4aXN0aW5nTGF5ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFsYXllciB8fCBsYXllci5lbGVzLmxlbmd0aCA+PSBtYXhFbGVzUGVyTGF5ZXIgfHwgIWJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChsYXllci5iYiwgZWxlLmJvdW5kaW5nQm94KCkpKSB7XG4gICAgICAvLyBsb2coJ21ha2UgbmV3IGxheWVyIGZvciBlbGUgJXMnLCBlbGUuaWQoKSk7XG5cbiAgICAgIGxheWVyID0gbWFrZUxheWVyKHtcbiAgICAgICAgaW5zZXJ0OiB0cnVlLFxuICAgICAgICBhZnRlcjogbGF5ZXJcbiAgICAgIH0pO1xuXG4gICAgICAvLyBpZiBub3cgbGF5ZXIgY2FuIGJlIGJ1aWx0IHRoZW4gd2UgY2FuJ3QgdXNlIGxheWVycyBhdCB0aGlzIGxldmVsXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2coJ25ldyBsYXllciB3aXRoIGlkICVzJywgbGF5ZXIuaWQpO1xuICAgIH1cblxuICAgIGlmICh0bXBMYXllcnMgfHwgYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAgIC8vIGxvZygncXVldWUgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYucXVldWVMYXllcihsYXllciwgZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nKCdkcmF3IGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbyk7XG4gICAgfVxuICAgIGxheWVyLmVsZXMucHVzaChlbGUpO1xuICAgIGNhY2hlc1tsdmxdID0gbGF5ZXI7XG4gIH1cblxuICAvLyBsb2coJy0tJyk7XG5cbiAgaWYgKHRtcExheWVycykge1xuICAgIC8vIHRoZW4gd2Ugb25seSBxdWV1ZWQgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgYW5kIGNhbid0IGRyYXcgaXQgeWV0XG4gICAgcmV0dXJuIHRtcExheWVycztcbiAgfVxuICBpZiAoYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAvLyBsb2coJ2xhenkgcXVldWUgbGV2ZWwnLCBsdmwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBsYXllcnM7XG59O1xuXG4vLyBhIGxheWVyIG1heSB3YW50IHRvIHVzZSBhbiBlbGUgY2FjaGUgb2YgYSBoaWdoZXIgbGV2ZWwgdG8gYXZvaWQgYmx1cnJpbmVzc1xuLy8gc28gdGhlIGxheWVyIGxldmVsIG1pZ2h0IG5vdCBlcXVhbCB0aGUgZWxlIGxldmVsXG5MVENwLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbCA9IGZ1bmN0aW9uIChsdmwsIHB4UmF0aW8pIHtcbiAgcmV0dXJuIGx2bDtcbn07XG5MVENwLmRyYXdFbGVJbkxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIGNvbnRleHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsdmwgPSBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsdmwsIHB4UmF0aW8pO1xuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICB9XG4gIHtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgbnVsbCwgbnVsbCwgbHZsLCB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMpO1xuICB9XG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgfVxufTtcbkxUQ3AubGV2ZWxJc0NvbXBsZXRlID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMgfHwgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbnVtRWxlc0luTGF5ZXJzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGVsZXMgbmVlZGVkIHRvIGJlIGRyYXduIHlldCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5yZXFzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBpcyBpbnZhbGlkLCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbnVtRWxlc0luTGF5ZXJzICs9IGxheWVyLmVsZXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZXMgcGFzc2VkIGluIHRvIGJlIGNvbXBsZXRlXG4gIGlmIChudW1FbGVzSW5MYXllcnMgIT09IGVsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbkxUQ3AudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBpbiBhIGxheWVyIHRoZSBlbGVzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gdGhlIGxheWVyIGlzIGludmFsaWRcbiAgLy8gKGkuZS4gdGhlcmUgaXMgYW4gZWxlIGluIGJldHdlZW4gdGhlIGVsZXMgaW4gdGhlIGxheWVyKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgIHZhciBvZmZzZXQgPSAtMTtcblxuICAgIC8vIGZpbmQgdGhlIG9mZnNldFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbMF0gPT09IGVsZXNbal0pIHtcbiAgICAgICAgb2Zmc2V0ID0gajtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAvLyB0aGVuIHRoZSBsYXllciBoYXMgbm9uZXhpc3RlbnQgZWxlbWVudHMgYW5kIGlzIGludmFsaWRcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoZSBlbGVzIGluIHRoZSBsYXllciBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRpbnVvdXMgb3JkZXIsIGVsc2UgdGhlIGxheWVyIGlzIGludmFsaWRcblxuICAgIHZhciBvID0gb2Zmc2V0O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbal0gIT09IGVsZXNbbyArIGpdKSB7XG4gICAgICAgIC8vIGxvZygnaW52YWxpZGF0ZSBiYXNlZCBvbiBvcmRlcmluZycsIGxheWVyLmlkKTtcblxuICAgICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbkxUQ3AudXBkYXRlRWxlbWVudHNJbkxheWVycyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaXNFbGVzID0gZWxlbWVudChlbGVzWzBdKTtcblxuICAvLyBjb2xsZWN0IHVkcGF0ZWQgZWxlbWVudHMgKGNhc2NhZGVkIGZyb20gdGhlIGxheWVycykgYW5kIHVwZGF0ZSBlYWNoXG4gIC8vIGxheWVyIGl0c2VsZiBhbG9uZyB0aGUgd2F5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZXEgPSBpc0VsZXMgPyBudWxsIDogZWxlc1tpXTtcbiAgICB2YXIgZWxlID0gaXNFbGVzID8gZWxlc1tpXSA6IGVsZXNbaV0uZWxlO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBjYWNoZXNbbF07XG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuICAgICAgaWYgKHJlcSAmJiBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsYXllci5sZXZlbCkgIT09IHJlcS5sZXZlbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AuaGF2ZUxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaGF2ZUxheWVycyA9IGZhbHNlO1xuICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgdmFyIGxheWVycyA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsXTtcbiAgICBpZiAobGF5ZXJzICYmIGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXZlTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGF2ZUxheWVycztcbn07XG5MVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuXG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZSBmcm9tIGVsZXMnKTtcblxuICBpZiAoZWxlcy5sZW5ndGggPT09IDAgfHwgIXNlbGYuaGF2ZUxheWVycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiBpbnZhbEFzc29jTGF5ZXJzKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHNlbGYuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgfSk7XG59O1xuTFRDcC5pbnZhbGlkYXRlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgLy8gbG9nKCd1cGRhdGUgaW52YWxpZGF0ZSBsYXllciB0aW1lJyk7XG5cbiAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHNhdmUgY3ljbGVzXG5cbiAgdmFyIGx2bCA9IGxheWVyLmxldmVsO1xuICB2YXIgZWxlcyA9IGxheWVyLmVsZXM7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICAvLyBsb2coJ2ludmFsaWRhdGUgbGF5ZXInLCBsYXllci5pZCApO1xuXG4gIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgLy8gbGF5ZXIuZWxlcyA9IFtdO1xuXG4gIGxheWVyLmVsZXNRdWV1ZSA9IFtdO1xuICBsYXllci5pbnZhbGlkID0gdHJ1ZTtcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgbGF5ZXIucmVwbGFjZW1lbnQuaW52YWxpZCA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNhY2hlcyA9IGVsZXNbaV0uX3ByaXZhdGUucnNjcmF0Y2guaW1nTGF5ZXJDYWNoZXM7XG4gICAgaWYgKGNhY2hlcykge1xuICAgICAgY2FjaGVzW2x2bF0gPSBudWxsO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AucmVmaW5lRWxlbWVudFRleHR1cmVzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGxvZygncmVmaW5lJywgZWxlcy5sZW5ndGgpO1xuXG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiByZWZpbmVFYWNoRWxlKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHZhciByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQ7XG4gICAgaWYgKCFyTHlyKSB7XG4gICAgICByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQgPSBzZWxmLm1ha2VMYXllcihsYXllci5iYiwgbGF5ZXIubGV2ZWwpO1xuICAgICAgckx5ci5yZXBsYWNlcyA9IGxheWVyO1xuICAgICAgckx5ci5lbGVzID0gbGF5ZXIuZWxlcztcblxuICAgICAgLy8gbG9nKCdtYWtlIHJlcGxhY2VtZW50IGxheWVyICVzIGZvciAlcyB3aXRoIGxldmVsICVzJywgckx5ci5pZCwgbGF5ZXIuaWQsIHJMeXIubGV2ZWwpO1xuICAgIH1cblxuICAgIGlmICghckx5ci5yZXFzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJMeXIuZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWxmLnF1ZXVlTGF5ZXIockx5ciwgckx5ci5lbGVzW2ldKTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKCdxdWV1ZSByZXBsYWNlbWVudCBsYXllciByZWZpbmVtZW50Jywgckx5ci5pZCk7XG4gICAgfVxuICB9KTtcbn07XG5cbkxUQ3AuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB0aGlzLmVsZVR4ckRlcXMubWVyZ2UoZWxlKTtcbiAgdGhpcy5zY2hlZHVsZUVsZW1lbnRSZWZpbmVtZW50KCk7XG59O1xuTFRDcC5xdWV1ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBlbGVzUSA9IGxheWVyLmVsZXNRdWV1ZTtcbiAgdmFyIGhhc0lkID0gZWxlc1EuaGFzSWQgPSBlbGVzUS5oYXNJZCB8fCB7fTtcblxuICAvLyBpZiBhIGxheWVyIGlzIGdvaW5nIHRvIGJlIHJlcGxhY2VkLCBxdWV1aW5nIGlzIGEgd2FzdGUgb2YgdGltZVxuICBpZiAobGF5ZXIucmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZSkge1xuICAgIGlmIChoYXNJZFtlbGUuaWQoKV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlc1EucHVzaChlbGUpO1xuICAgIGhhc0lkW2VsZS5pZCgpXSA9IHRydWU7XG4gIH1cbiAgaWYgKGxheWVyLnJlcXMpIHtcbiAgICBsYXllci5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGxheWVyKTtcbiAgfSBlbHNlIHtcbiAgICBsYXllci5yZXFzID0gMTtcbiAgICBxLnB1c2gobGF5ZXIpO1xuICB9XG59O1xuTFRDcC5kZXF1ZXVlID0gZnVuY3Rpb24gKHB4UmF0aW8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBkZXFkID0gW107XG4gIHZhciBlbGVEZXFzID0gMDtcbiAgd2hpbGUgKGVsZURlcXMgPCBtYXhEZXFTaXplKSB7XG4gICAgaWYgKHEuc2l6ZSgpID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGxheWVyID0gcS5wZWVrKCk7XG5cbiAgICAvLyBpZiBhIGxheWVyIGhhcyBiZWVuIG9yIHdpbGwgYmUgcmVwbGFjZWQsIHRoZW4gZG9uJ3Qgd2FzdGUgdGltZSB3aXRoIGl0XG4gICAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgICAvLyBsb2coJ2xheWVyICVzIGluIHF1ZXVlIHNraXBwZWQgYi9jIGl0IGFscmVhZHkgaGFzIGEgcmVwbGFjZW1lbnQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIHJlcGxhY2VtZW50IGxheWVyIHRoYXQgaGFzIGJlZW4gc3VwZXJjZWRlZCwgdGhlbiBmb3JnZXQgaXRcbiAgICBpZiAobGF5ZXIucmVwbGFjZXMgJiYgbGF5ZXIgIT09IGxheWVyLnJlcGxhY2VzLnJlcGxhY2VtZW50KSB7XG4gICAgICAvLyBsb2coJ2xheWVyIGlzIG5vIGxvbmdlciB0aGUgbW9zdCB1cHRvZGF0ZSByZXBsYWNlbWVudDsgZGVxdWV1ZWQnLCBsYXllci5pZClcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgJXMgaXMgaW52YWxpZDsgZGVxdWV1ZWQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBlbGUgPSBsYXllci5lbGVzUXVldWUuc2hpZnQoKTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICAvLyBsb2coJ2RlcXVldWUgbGF5ZXIgJXMnLCBsYXllci5pZCk7XG5cbiAgICAgIHNlbGYuZHJhd0VsZUluTGF5ZXIobGF5ZXIsIGVsZSwgbGF5ZXIubGV2ZWwsIHB4UmF0aW8pO1xuICAgICAgZWxlRGVxcysrO1xuICAgIH1cbiAgICBpZiAoZGVxZC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdlIG5lZWQgb25seSBvbmUgZW50cnkgaW4gZGVxZCB0byBxdWV1ZSByZWRyYXdpbmcgZXRjXG4gICAgICBkZXFkLnB1c2godHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGxheWVyIGhhcyBhbGwgaXRzIGVsZXMgZG9uZSwgdGhlbiByZW1vdmUgZnJvbSB0aGUgcXVldWVcbiAgICBpZiAobGF5ZXIuZWxlc1F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGxheWVyLnJlcXMgPSAwO1xuXG4gICAgICAvLyBsb2coJ2RlcXVldWUgb2YgbGF5ZXIgJXMgY29tcGxldGUnLCBsYXllci5pZCk7XG5cbiAgICAgIC8vIHdoZW4gYSByZXBsYWNlbWVudCBsYXllciBpcyBkZXF1ZXVlZCwgaXQgcmVwbGFjZXMgdGhlIG9sZCBsYXllciBpbiB0aGUgbGV2ZWxcbiAgICAgIGlmIChsYXllci5yZXBsYWNlcykge1xuICAgICAgICBzZWxmLmFwcGx5TGF5ZXJSZXBsYWNlbWVudChsYXllcik7XG4gICAgICB9XG4gICAgICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlcWQ7XG59O1xuTFRDcC5hcHBseUxheWVyUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbGF5ZXJzSW5MZXZlbCA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsYXllci5sZXZlbF07XG4gIHZhciByZXBsYWNlZCA9IGxheWVyLnJlcGxhY2VzO1xuICB2YXIgaW5kZXggPSBsYXllcnNJbkxldmVsLmluZGV4T2YocmVwbGFjZWQpO1xuXG4gIC8vIGlmIHRoZSByZXBsYWNlZCBsYXllciBpcyBub3QgaW4gdGhlIGFjdGl2ZSBsaXN0IGZvciB0aGUgbGV2ZWwsIHRoZW4gcmVwbGFjaW5nXG4gIC8vIHJlZnMgd291bGQgYmUgYSBtaXN0YWtlIChpLmUuIG92ZXJ3cml0aW5nIHRoZSB0cnVlIGFjdGl2ZSBsYXllcilcbiAgaWYgKGluZGV4IDwgMCB8fCByZXBsYWNlZC5pbnZhbGlkKSB7XG4gICAgLy8gbG9nKCdyZXBsYWNlbWVudCBsYXllciB3b3VsZCBoYXZlIG5vIGVmZmVjdCcsIGxheWVyLmlkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGF5ZXJzSW5MZXZlbFtpbmRleF0gPSBsYXllcjsgLy8gcmVwbGFjZSBsZXZlbCByZWZcblxuICAvLyByZXBsYWNlIHJlZnMgaW4gZWxlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSBsYXllci5lbGVzW2ldLl9wcml2YXRlO1xuICAgIHZhciBjYWNoZSA9IF9wLmltZ0xheWVyQ2FjaGVzID0gX3AuaW1nTGF5ZXJDYWNoZXMgfHwge307XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtsYXllci5sZXZlbF0gPSBsYXllcjtcbiAgICB9XG4gIH1cblxuICAvLyBsb2coJ2FwcGx5IHJlcGxhY2VtZW50IGxheWVyICVzIG92ZXIgJXMnLCBsYXllci5pZCwgcmVwbGFjZWQuaWQpO1xuXG4gIHNlbGYucmVxdWVzdFJlZHJhdygpO1xufTtcbkxUQ3AucmVxdWVzdFJlZHJhdyA9IGRlYm91bmNlXzEoZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgci5yZWRyYXcoKTtcbn0sIDEwMCk7XG5MVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQsXG4gIGRlcUNvc3Q6IGRlcUNvc3QsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbykge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbyk7XG4gIH0sXG4gIG9uRGVxZDogbm9vcCQxLFxuICBzaG91bGRSZWRyYXc6IHRydWVpZnksXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgQ1JwJGEgPSB7fTtcbnZhciBpbXBsO1xuZnVuY3Rpb24gcG9seWdvbihjb250ZXh0LCBwb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWFuZ2xlQmFja2N1cnZlKGNvbnRleHQsIHBvaW50cywgY29udHJvbFBvaW50KSB7XG4gIHZhciBmaXJzdFB0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgZmlyc3RQdCA9IHB0O1xuICAgIH1cbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBmaXJzdFB0LngsIGZpcnN0UHQueSk7XG59XG5mdW5jdGlvbiB0cmlhbmdsZVRlZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgdGVlUG9pbnRzKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICB2YXIgdGVlUHRzID0gdGVlUG9pbnRzO1xuICB2YXIgZmlyc3RUZWVQdCA9IHRlZVBvaW50c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUZWVQdC54LCBmaXJzdFRlZVB0LnkpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHRlZVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRlZVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5mdW5jdGlvbiBjaXJjbGVUcmlhbmdsZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgcngsIHJ5LCByKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5hcmMocngsIHJ5LCByLCAwLCBNYXRoLlBJICogMiwgZmFsc2UpO1xuICB2YXIgdHJpUHRzID0gdHJpYW5nbGVQb2ludHM7XG4gIHZhciBmaXJzdFRyUHQgPSB0cmlQdHNbMF07XG4gIGNvbnRleHQubW92ZVRvKGZpcnN0VHJQdC54LCBmaXJzdFRyUHQueSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdHJpUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNpcmNsZShjb250ZXh0LCByeCwgcnksIHIpIHtcbiAgY29udGV4dC5hcmMocngsIHJ5LCByLCAwLCBNYXRoLlBJICogMiwgZmFsc2UpO1xufVxuQ1JwJGEuYXJyb3dTaGFwZUltcGwgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gKGltcGwgfHwgKGltcGwgPSB7XG4gICAgJ3BvbHlnb24nOiBwb2x5Z29uLFxuICAgICd0cmlhbmdsZS1iYWNrY3VydmUnOiB0cmlhbmdsZUJhY2tjdXJ2ZSxcbiAgICAndHJpYW5nbGUtdGVlJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZS10cmlhbmdsZSc6IGNpcmNsZVRyaWFuZ2xlLFxuICAgICd0cmlhbmdsZS1jcm9zcyc6IHRyaWFuZ2xlVGVlLFxuICAgICdjaXJjbGUnOiBjaXJjbGVcbiAgfSkpW25hbWVdO1xufTtcblxudmFyIENScCQ5ID0ge307XG5DUnAkOS5kcmF3RWxlbWVudCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIsIHNob3dMYWJlbCwgc2hvd092ZXJsYXksIHNob3dPcGFjaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGUoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZShjb250ZXh0LCBlbGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIsIHNob3dMYWJlbCwgc2hvd092ZXJsYXksIHNob3dPcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdFbGVtZW50T3ZlcmxheSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgci5kcmF3Tm9kZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfSBlbHNlIHtcbiAgICByLmRyYXdFZGdlT3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0VsZW1lbnRVbmRlcmxheSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZVVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBlbGVUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFJvdGF0aW9uLCBnZXRPcGFjaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGJiID0gZWxlVHhyQ2FjaGUuZ2V0Qm91bmRpbmdCb3goZWxlKTtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBpZ25vcmUgemVybyBzaXplIGNhc2VcblxuICB2YXIgZWxlQ2FjaGUgPSBlbGVUeHJDYWNoZS5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKTtcbiAgaWYgKGVsZUNhY2hlICE9IG51bGwpIHtcbiAgICB2YXIgb3BhY2l0eSA9IGdldE9wYWNpdHkociwgZWxlKTtcbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGhldGEgPSBnZXRSb3RhdGlvbihyLCBlbGUpO1xuICAgIHZhciB4MSA9IGJiLngxLFxuICAgICAgeTEgPSBiYi55MSxcbiAgICAgIHcgPSBiYi53LFxuICAgICAgaCA9IGJiLmg7XG4gICAgdmFyIHgsIHksIHN4LCBzeSwgc21vb3RoO1xuICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgdmFyIHJvdFB0ID0gZWxlVHhyQ2FjaGUuZ2V0Um90YXRpb25Qb2ludChlbGUpO1xuICAgICAgc3ggPSByb3RQdC54O1xuICAgICAgc3kgPSByb3RQdC55O1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoc3gsIHN5KTtcbiAgICAgIGNvbnRleHQucm90YXRlKHRoZXRhKTtcbiAgICAgIHNtb290aCA9IHIuZ2V0SW1nU21vb3RoaW5nKGNvbnRleHQpO1xuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgb2ZmID0gZWxlVHhyQ2FjaGUuZ2V0Um90YXRpb25PZmZzZXQoZWxlKTtcbiAgICAgIHggPSBvZmYueDtcbiAgICAgIHkgPSBvZmYueTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHgxO1xuICAgICAgeSA9IHkxO1xuICAgIH1cbiAgICB2YXIgb2xkR2xvYmFsQWxwaGE7XG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYSAqIG9wYWNpdHk7XG4gICAgfVxuICAgIGNvbnRleHQuZHJhd0ltYWdlKGVsZUNhY2hlLnRleHR1cmUuY2FudmFzLCBlbGVDYWNoZS54LCAwLCBlbGVDYWNoZS53aWR0aCwgZWxlQ2FjaGUuaGVpZ2h0LCB4LCB5LCB3LCBoKTtcbiAgICBpZiAob3BhY2l0eSAhPT0gMSkge1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuICAgIH1cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIGNvbnRleHQucm90YXRlKC10aGV0YSk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtc3gsIC1zeSk7XG4gICAgICBpZiAoIXNtb290aCkge1xuICAgICAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVsZVR4ckNhY2hlLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSk7IC8vIGRpcmVjdCBkcmF3IGZhbGxiYWNrXG4gIH1cbn07XG5cbnZhciBnZXRaZXJvUm90YXRpb24gPSBmdW5jdGlvbiBnZXRaZXJvUm90YXRpb24oKSB7XG4gIHJldHVybiAwO1xufTtcbnZhciBnZXRMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgbnVsbCk7XG59O1xudmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCAnc291cmNlJyk7XG59O1xudmFyIGdldFRhcmdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCAndGFyZ2V0Jyk7XG59O1xudmFyIGdldE9wYWNpdHkgPSBmdW5jdGlvbiBnZXRPcGFjaXR5KHIsIGVsZSkge1xuICByZXR1cm4gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbn07XG52YXIgZ2V0VGV4dE9wYWNpdHkgPSBmdW5jdGlvbiBnZXRUZXh0T3BhY2l0eShlLCBlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ3RleHQtb3BhY2l0eScpLnBmVmFsdWUgKiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcbkNScCQ5LmRyYXdDYWNoZWRFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50LCBsdmwsIHJlcXVlc3RIaWdoUXVhbGl0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBfciRkYXRhID0gci5kYXRhLFxuICAgIGVsZVR4ckNhY2hlID0gX3IkZGF0YS5lbGVUeHJDYWNoZSxcbiAgICBsYmxUeHJDYWNoZSA9IF9yJGRhdGEubGJsVHhyQ2FjaGUsXG4gICAgc2xiVHhyQ2FjaGUgPSBfciRkYXRhLnNsYlR4ckNhY2hlLFxuICAgIHRsYlR4ckNhY2hlID0gX3IkZGF0YS50bGJUeHJDYWNoZTtcbiAgdmFyIGJiID0gZWxlLmJvdW5kaW5nQm94KCk7XG4gIHZhciByZWFzb24gPSByZXF1ZXN0SGlnaFF1YWxpdHkgPT09IHRydWUgPyBlbGVUeHJDYWNoZS5yZWFzb25zLmhpZ2hRdWFsaXR5IDogbnVsbDtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWV4dGVudCB8fCBib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgYmFkTGluZSA9IGVsZS5lbGVtZW50KCkuX3ByaXZhdGUucnNjcmF0Y2guYmFkTGluZTtcbiAgICByLmRyYXdFbGVtZW50VW5kZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGVsZVR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0WmVyb1JvdGF0aW9uLCBnZXRPcGFjaXR5KTtcbiAgICBpZiAoIWlzRWRnZSB8fCAhYmFkTGluZSkge1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBsYmxUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG4gICAgaWYgKGlzRWRnZSAmJiAhYmFkTGluZSkge1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBzbGJUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFNvdXJjZUxhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgdGxiVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgfVxuICAgIHIuZHJhd0VsZW1lbnRPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcykge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHIuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCQ5LmRyYXdDYWNoZWRFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdDYWNoZWROb2RlcyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0xheWVyZWRFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgbGF5ZXJzID0gci5kYXRhLmx5clR4ckNhY2hlLmdldExheWVycyhlbGVzLCBweFJhdGlvKTtcbiAgaWYgKGxheWVycykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgICB2YXIgYmIgPSBsYXllci5iYjtcbiAgICAgIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShsYXllci5jYW52YXMsIGJiLngxLCBiYi55MSwgYmIudywgYmIuaCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGZhbGwgYmFjayBvbiBwbGFpbiBjYWNoaW5nIGlmIG5vIGxheWVyc1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5cbnZhciBDUnAkOCA9IHt9O1xuQ1JwJDguZHJhd0VkZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgc2hpZnRUb09yaWdpbldpdGhCYikge1xuICB2YXIgZHJhd0xhYmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd092ZXJsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAoc2hvdWxkRHJhd09wYWNpdHkgJiYgIWVkZ2UudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgYmV6aWVyIGN0cmwgcHRzIGNhbiBub3QgYmUgY2FsY3VsYXRlZCwgdGhlbiBkaWVcbiAgaWYgKHJzLmJhZExpbmUgfHwgcnMuYWxscHRzID09IG51bGwgfHwgaXNOYU4ocnMuYWxscHRzWzBdKSkge1xuICAgIC8vIGlzTmFOIGluIGNhc2UgZWRnZSBpcyBpbXBvc3NpYmxlIGFuZCBicm93c2VyIGJ1Z3MgKGUuZy4gc2FmYXJpKVxuICAgIHJldHVybjtcbiAgfVxuICB2YXIgYmI7XG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgYmIgPSBzaGlmdFRvT3JpZ2luV2l0aEJiO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1iYi54MSwgLWJiLnkxKTtcbiAgfVxuICB2YXIgb3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBsaW5lT3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlIDogMTtcbiAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIGxpbmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdsaW5lLXN0eWxlJykudmFsdWU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgbGluZUNhcCA9IGVkZ2UucHN0eWxlKCdsaW5lLWNhcCcpLnZhbHVlO1xuICB2YXIgZWZmZWN0aXZlTGluZU9wYWNpdHkgPSBvcGFjaXR5ICogbGluZU9wYWNpdHk7XG4gIC8vIHNlcGFyYXRlIGFycm93IG9wYWNpdHkgd291bGQgcmVxdWlyZSBhcnJvdy1vcGFjaXR5IHByb3BlcnR5XG4gIHZhciBlZmZlY3RpdmVBcnJvd09wYWNpdHkgPSBvcGFjaXR5ICogbGluZU9wYWNpdHk7XG4gIHZhciBkcmF3TGluZSA9IGZ1bmN0aW9uIGRyYXdMaW5lKCkge1xuICAgIHZhciBzdHJva2VPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlZmZlY3RpdmVMaW5lT3BhY2l0eTtcbiAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0LXRyaWFuZ2xlJykge1xuICAgICAgci5lbGVTdHJva2VTdHlsZShjb250ZXh0LCBlZGdlLCBzdHJva2VPcGFjaXR5KTtcbiAgICAgIHIuZHJhd0VkZ2VUcmlhbmdsZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBlZGdlV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSBsaW5lQ2FwO1xuICAgICAgci5lbGVTdHJva2VTdHlsZShjb250ZXh0LCBlZGdlLCBzdHJva2VPcGFjaXR5KTtcbiAgICAgIHIuZHJhd0VkZ2VQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cywgbGluZVN0eWxlKTtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JzsgLy8gcmVzZXQgZm9yIG90aGVyIGRyYXdpbmcgZnVuY3Rpb25zXG4gICAgfVxuICB9O1xuXG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3VW5kZXJsYXkoKSB7XG4gICAgaWYgKCFzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmRyYXdFZGdlVW5kZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3QXJyb3dzID0gZnVuY3Rpb24gZHJhd0Fycm93cygpIHtcbiAgICB2YXIgYXJyb3dPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlZmZlY3RpdmVBcnJvd09wYWNpdHk7XG4gICAgci5kcmF3QXJyb3doZWFkcyhjb250ZXh0LCBlZGdlLCBhcnJvd09wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dCgpIHtcbiAgICByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlZGdlLCBudWxsLCBkcmF3TGFiZWwpO1xuICB9O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJztcbiAgdmFyIGdob3N0ID0gZWRnZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZmVjdGl2ZUdob3N0T3BhY2l0eSA9IGVmZmVjdGl2ZUxpbmVPcGFjaXR5ICogZ2hvc3RPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgZHJhd0xpbmUoZWZmZWN0aXZlR2hvc3RPcGFjaXR5KTtcbiAgICBkcmF3QXJyb3dzKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG4gIGRyYXdVbmRlcmxheSgpO1xuICBkcmF3TGluZSgpO1xuICBkcmF3QXJyb3dzKCk7XG4gIGRyYXdPdmVybGF5KCk7XG4gIGRyYXdUZXh0KCk7XG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlKSB7XG4gICAgaWYgKCFlZGdlLnZpc2libGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3BhY2l0eSA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgciA9IHRoaXM7XG4gICAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICAgIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIHBhZGRpbmcgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgd2lkdGggPSAyICogcGFkZGluZztcbiAgICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VsZicgJiYgIXVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdyb3VuZCc7XG4gICAgfVxuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsICdzb2xpZCcpO1xuICB9O1xufTtcbkNScCQ4LmRyYXdFZGdlT3ZlcmxheSA9IGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkOC5kcmF3RWRnZVVuZGVybGF5ID0gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7XG5DUnAkOC5kcmF3RWRnZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzLCB0eXBlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjYW52YXNDeHQgPSBjb250ZXh0O1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBsaW5lRGFzaFBhdHRlcm4gPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLXBhdHRlcm4nKS5wZlZhbHVlO1xuICB2YXIgbGluZURhc2hPZmZzZXQgPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLW9mZnNldCcpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBwYXRoQ2FjaGVLZXkgPSBwdHMuam9pbignJCcpO1xuICAgIHZhciBrZXlNYXRjaGVzID0gcnMucGF0aENhY2hlS2V5ICYmIHJzLnBhdGhDYWNoZUtleSA9PT0gcGF0aENhY2hlS2V5O1xuICAgIGlmIChrZXlNYXRjaGVzKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IHJzLnBhdGhDYWNoZTtcbiAgICAgIHBhdGhDYWNoZUhpdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcnMucGF0aENhY2hlS2V5ID0gcGF0aENhY2hlS2V5O1xuICAgICAgcnMucGF0aENhY2hlID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGNhbnZhc0N4dC5zZXRMaW5lRGFzaCkge1xuICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKGxpbmVEYXNoUGF0dGVybik7XG4gICAgICAgIGNhbnZhc0N4dC5saW5lRGFzaE9mZnNldCA9IGxpbmVEYXNoT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghcGF0aENhY2hlSGl0ICYmICFycy5iYWRMaW5lKSB7XG4gICAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIH1cbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbMF0sIHB0c1sxXSk7XG4gICAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnbXVsdGliZXppZXInOlxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSArIDMgPCBwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSArIDEgPCBwdHMubGVuZ3RoOyBfaSArPSAyKSB7XG4gICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pXSwgcHRzW19pICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgICBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihycy5yb3VuZENvcm5lcnMpLFxuICAgICAgICAgICAgX3N0ZXA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBjb3JuZXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY29udGV4dCwgY29ybmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1twdHMubGVuZ3RoIC0gMl0sIHB0c1twdHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDI7IF9pMiArIDEgPCBwdHMubGVuZ3RoOyBfaTIgKz0gMikge1xuICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pMl0sIHB0c1tfaTIgKyAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ3h0O1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG5cbiAgLy8gcmVzZXQgYW55IGxpbmUgZGFzaGVzXG4gIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gIH1cbn07XG5DUnAkOC5kcmF3RWRnZVRyaWFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChlZGdlLCBjb250ZXh0LCBwdHMpIHtcbiAgLy8gdXNlIGxpbmUgc3Ryb2tlIHN0eWxlIGZvciB0cmlhbmdsZSBmaWxsIHN0eWxlXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gY29udGV4dC5zdHJva2VTdHlsZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB2ZWN0b3IgPSBbcHRzW2kgKyAyXSAtIHB0c1tpXSwgcHRzW2kgKyAzXSAtIHB0c1tpICsgMV1dO1xuICAgIHZhciBsZW5ndGggPSBNYXRoLnNxcnQodmVjdG9yWzBdICogdmVjdG9yWzBdICsgdmVjdG9yWzFdICogdmVjdG9yWzFdKTtcbiAgICB2YXIgbm9ybWFsID0gW3ZlY3RvclsxXSAvIGxlbmd0aCwgLXZlY3RvclswXSAvIGxlbmd0aF07XG4gICAgdmFyIHRyaWFuZ2xlSGVhZCA9IFtub3JtYWxbMF0gKiBlZGdlV2lkdGggLyAyLCBub3JtYWxbMV0gKiBlZGdlV2lkdGggLyAyXTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHB0c1tpXSAtIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSAtIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2ldICsgdHJpYW5nbGVIZWFkWzBdLCBwdHNbaSArIDFdICsgdHJpYW5nbGVIZWFkWzFdKTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG59O1xuQ1JwJDguZHJhd0Fycm93aGVhZHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgb3BhY2l0eSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3NvdXJjZScsIHJzLmFycm93U3RhcnRYLCBycy5hcnJvd1N0YXJ0WSwgcnMuc3JjQXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIH1cbiAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdtaWQtdGFyZ2V0JywgcnMubWlkWCwgcnMubWlkWSwgcnMubWlkdGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXNvdXJjZScsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3RhcmdldCcsIHJzLmFycm93RW5kWCwgcnMuYXJyb3dFbmRZLCBycy50Z3RBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ4LmRyYXdBcnJvd2hlYWQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgcHJlZml4LCB4LCB5LCBhbmdsZSwgb3BhY2l0eSkge1xuICBpZiAoaXNOYU4oeCkgfHwgeCA9PSBudWxsIHx8IGlzTmFOKHkpIHx8IHkgPT0gbnVsbCB8fCBpc05hTihhbmdsZSkgfHwgYW5nbGUgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICBpZiAoYXJyb3dTaGFwZSA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBhcnJvd0NsZWFyRmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlID09PSAnaG9sbG93JyA/ICdib3RoJyA6ICdmaWxsZWQnO1xuICB2YXIgYXJyb3dGaWxsID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1maWxsJykudmFsdWU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgcEFycm93V2lkdGggPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXdpZHRoJyk7XG4gIHZhciBhcnJvd1dpZHRoID0gcEFycm93V2lkdGgudmFsdWUgPT09ICdtYXRjaC1saW5lJyA/IGVkZ2VXaWR0aCA6IHBBcnJvd1dpZHRoLnBmVmFsdWU7XG4gIGlmIChwQXJyb3dXaWR0aC51bml0cyA9PT0gJyUnKSBhcnJvd1dpZHRoICo9IGVkZ2VXaWR0aDtcbiAgdmFyIGVkZ2VPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgaWYgKG9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wYWNpdHkgPSBlZGdlT3BhY2l0eTtcbiAgfVxuICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gIGlmIChvcGFjaXR5ICE9PSAxIHx8IGFycm93RmlsbCA9PT0gJ2hvbGxvdycpIHtcbiAgICAvLyB0aGVuIGV4dHJhIGNsZWFyIGlzIG5lZWRlZFxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCAxKTtcbiAgICBzZWxmLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0NsZWFyRmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH0gLy8gb3RoZXJ3aXNlLCB0aGUgb3BhcXVlIGFycm93IGNsZWFycyBpdCBmb3IgZnJlZSA6KVxuXG4gIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctY29sb3InKS52YWx1ZTtcbiAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICBzZWxmLmRyYXdBcnJvd1NoYXBlKGVkZ2UsIGNvbnRleHQsIGFycm93RmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG59O1xuQ1JwJDguZHJhd0Fycm93U2hhcGUgPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgZmlsbCwgZWRnZVdpZHRoLCBzaGFwZSwgc2hhcGVXaWR0aCwgeCwgeSwgYW5nbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCkgJiYgc2hhcGUgIT09ICd0cmlhbmdsZS1jcm9zcyc7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHBhdGg7XG4gIHZhciBjYW52YXNDb250ZXh0ID0gY29udGV4dDtcbiAgdmFyIHRyYW5zbGF0aW9uID0ge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgdmFyIHNpemUgPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZVdpZHRoLCBzY2FsZSk7XG4gIHZhciBzaGFwZUltcGwgPSByLmFycm93U2hhcGVzW3NoYXBlXTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgdmFyIGNhY2hlID0gci5hcnJvd1BhdGhDYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmcoc2hhcGUpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IGNhY2hlZFBhdGg7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIGNhY2hlW2tleV0gPSBwYXRoO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhdGhDYWNoZUhpdCkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAvLyBzdG9yZSBpbiB0aGUgcGF0aCBjYWNoZSB3aXRoIHZhbHVlcyBlYXNpbHkgbWFuaXB1bGF0ZWQgbGF0ZXJcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIDEsIDAsIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ29udGV4dDtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gc2V0IHRyYW5zZm9ybSB0byBhcnJvdyBwb3NpdGlvbi9vcmllbnRhdGlvblxuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgICBjb250ZXh0LnNjYWxlKHNpemUsIHNpemUpO1xuICB9XG4gIGlmIChmaWxsID09PSAnZmlsbGVkJyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWxsID09PSAnaG9sbG93JyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHNoYXBlV2lkdGggLyAodXNlUGF0aHMgPyBzaXplIDogMSk7XG4gICAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gcmVzZXQgdHJhbnNmb3JtIGJ5IGFwcGx5aW5nIGludmVyc2VcbiAgICBjb250ZXh0LnNjYWxlKDEgLyBzaXplLCAxIC8gc2l6ZSk7XG4gICAgY29udGV4dC5yb3RhdGUoLWFuZ2xlKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG59O1xuXG52YXIgQ1JwJDcgPSB7fTtcbkNScCQ3LnNhZmVEcmF3SW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCkge1xuICAvLyBkZXRlY3QgcHJvYmxlbWF0aWMgY2FzZXMgZm9yIG9sZCBicm93c2VycyB3aXRoIGJhZCBpbWFnZXMgKGNoZWFwZXIgdGhhbiB0cnktY2F0Y2gpXG4gIGlmIChpdyA8PSAwIHx8IGloIDw9IDAgfHwgdyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgd2FybihlKTtcbiAgfVxufTtcbkNScCQ3LmRyYXdJbnNjcmliZWRJbWFnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBpbWcsIG5vZGUsIGluZGV4LCBub2RlT3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciBub2RlWCA9IHBvcy54O1xuICB2YXIgbm9kZVkgPSBwb3MueTtcbiAgdmFyIHN0eWxlT2JqID0gbm9kZS5jeSgpLnN0eWxlKCk7XG4gIHZhciBnZXRJbmRleGVkU3R5bGUgPSBzdHlsZU9iai5nZXRJbmRleGVkU3R5bGUuYmluZChzdHlsZU9iaik7XG4gIHZhciBmaXQgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtZml0JywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgcmVwZWF0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXJlcGVhdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZ1gyID0gbm9kZS5wYWRkaW5nKCkgKiAyO1xuICB2YXIgbm9kZVRXID0gbm9kZVcgKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBub2RlVEggPSBub2RlSCArIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjbGlwID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWNsaXAnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBzaG91bGRDbGlwID0gY2xpcCA9PT0gJ25vZGUnO1xuICB2YXIgaW1nT3BhY2l0eSA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JywgJ3ZhbHVlJywgaW5kZXgpICogbm9kZU9wYWNpdHk7XG4gIHZhciBzbW9vdGggPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBpbWdXID0gaW1nLndpZHRoIHx8IGltZy5jYWNoZWRXO1xuICB2YXIgaW1nSCA9IGltZy5oZWlnaHQgfHwgaW1nLmNhY2hlZEg7XG5cbiAgLy8gd29ya2Fyb3VuZCBmb3IgYnJva2VuIGJyb3dzZXJzIGxpa2UgaWVcbiAgaWYgKG51bGwgPT0gaW1nVyB8fCBudWxsID09IGltZ0gpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltZ1cgPSBpbWcuY2FjaGVkVyA9IGltZy53aWR0aCB8fCBpbWcub2Zmc2V0V2lkdGg7XG4gICAgaW1nSCA9IGltZy5jYWNoZWRIID0gaW1nLmhlaWdodCB8fCBpbWcub2Zmc2V0SGVpZ2h0O1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW1nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB9XG5cbiAgdmFyIHcgPSBpbWdXO1xuICB2YXIgaCA9IGltZ0g7XG4gIGlmIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAndmFsdWUnLCBpbmRleCkgIT09ICdhdXRvJykge1xuICAgIGlmIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpICogbm9kZVRXO1xuICAgIH0gZWxzZSB7XG4gICAgICB3ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gICAgfVxuICB9XG4gIGlmIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0JywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd1bml0cycsIGluZGV4KSA9PT0gJyUnKSB7XG4gICAgICBoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICdwZlZhbHVlJywgaW5kZXgpICogbm9kZVRIO1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAodyA9PT0gMCB8fCBoID09PSAwKSB7XG4gICAgcmV0dXJuOyAvLyBubyBwb2ludCBpbiBkcmF3aW5nIGVtcHR5IGltYWdlIChhbmQgY2hyb21lIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UpXG4gIH1cblxuICBpZiAoZml0ID09PSAnY29udGFpbicpIHtcbiAgICB2YXIgc2NhbGUgPSBNYXRoLm1pbihub2RlVFcgLyB3LCBub2RlVEggLyBoKTtcbiAgICB3ICo9IHNjYWxlO1xuICAgIGggKj0gc2NhbGU7XG4gIH0gZWxzZSBpZiAoZml0ID09PSAnY292ZXInKSB7XG4gICAgdmFyIHNjYWxlID0gTWF0aC5tYXgobm9kZVRXIC8gdywgbm9kZVRIIC8gaCk7XG4gICAgdyAqPSBzY2FsZTtcbiAgICBoICo9IHNjYWxlO1xuICB9XG4gIHZhciB4ID0gbm9kZVggLSBub2RlVFcgLyAyOyAvLyBsZWZ0XG4gIHZhciBwb3NYVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIHBvc1hQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChwb3NYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogcG9zWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gcG9zWFBmVmFsO1xuICB9XG4gIHZhciBvZmZYVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXgnLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBvZmZYUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXgnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKG9mZlhVbml0cyA9PT0gJyUnKSB7XG4gICAgeCArPSAobm9kZVRXIC0gdykgKiBvZmZYUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeCArPSBvZmZYUGZWYWw7XG4gIH1cbiAgdmFyIHkgPSBub2RlWSAtIG5vZGVUSCAvIDI7IC8vIHRvcFxuICB2YXIgcG9zWVVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBwb3NZUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teScsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAocG9zWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIHBvc1lQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IHBvc1lQZlZhbDtcbiAgfVxuICB2YXIgb2ZmWVVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC15JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChvZmZZVW5pdHMgPT09ICclJykge1xuICAgIHkgKz0gKG5vZGVUSCAtIGgpICogb2ZmWVBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHkgKz0gb2ZmWVBmVmFsO1xuICB9XG4gIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICB4IC09IG5vZGVYO1xuICAgIHkgLT0gbm9kZVk7XG4gICAgbm9kZVggPSAwO1xuICAgIG5vZGVZID0gMDtcbiAgfVxuICB2YXIgZ0FscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGltZ09wYWNpdHk7XG4gIHZhciBzbW9vdGhpbmdFbmFibGVkID0gci5nZXRJbWdTbW9vdGhpbmcoY29udGV4dCk7XG4gIHZhciBpc1Ntb290aGluZ1N3aXRjaGVkID0gZmFsc2U7XG4gIGlmIChzbW9vdGggPT09ICdubycgJiYgc21vb3RoaW5nRW5hYmxlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIGZhbHNlKTtcbiAgICBpc1Ntb290aGluZ1N3aXRjaGVkID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzbW9vdGggPT09ICd5ZXMnICYmICFzbW9vdGhpbmdFbmFibGVkKSB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gICAgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IHRydWU7XG4gIH1cbiAgaWYgKHJlcGVhdCA9PT0gJ25vLXJlcGVhdCcpIHtcbiAgICBpZiAoc2hvdWxkQ2xpcCkge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBpZiAocnMucGF0aENhY2hlKSB7XG4gICAgICAgIGNvbnRleHQuY2xpcChycy5wYXRoQ2FjaGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIG5vZGVYLCBub2RlWSwgbm9kZVRXLCBub2RlVEgsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgICAgICBjb250ZXh0LmNsaXAoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgci5zYWZlRHJhd0ltYWdlKGNvbnRleHQsIGltZywgMCwgMCwgaW1nVywgaW1nSCwgeCwgeSwgdywgaCk7XG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgcGF0dGVybiA9IGNvbnRleHQuY3JlYXRlUGF0dGVybihpbWcsIHJlcGVhdCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBwYXR0ZXJuO1xuICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRILCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBnQWxwaGE7XG4gIGlmIChpc1Ntb290aGluZ1N3aXRjaGVkKSB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgc21vb3RoaW5nRW5hYmxlZCk7XG4gIH1cbn07XG5cbnZhciBDUnAkNiA9IHt9O1xuQ1JwJDYuZWxlVGV4dEJpZ2dlclRoYW5NaW4gPSBmdW5jdGlvbiAoZWxlLCBzY2FsZSkge1xuICBpZiAoIXNjYWxlKSB7XG4gICAgdmFyIHpvb20gPSBlbGUuY3koKS56b29tKCk7XG4gICAgdmFyIHB4UmF0aW8gPSB0aGlzLmdldFBpeGVsUmF0aW8oKTtcbiAgICB2YXIgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTsgLy8gdGhlIGVmZmVjdGl2ZSB0ZXh0dXJlIGxldmVsXG5cbiAgICBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIH1cbiAgdmFyIGNvbXB1dGVkU2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWUgKiBzY2FsZTtcbiAgdmFyIG1pblNpemUgPSBlbGUucHN0eWxlKCdtaW4tem9vbWVkLWZvbnQtc2l6ZScpLnBmVmFsdWU7XG4gIGlmIChjb21wdXRlZFNpemUgPCBtaW5TaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbkNScCQ2LmRyYXdFbGVtZW50VGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIsIGZvcmNlLCBwcmVmaXgpIHtcbiAgdmFyIHVzZUVsZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGZvcmNlID09IG51bGwpIHtcbiAgICBpZiAodXNlRWxlT3BhY2l0eSAmJiAhci5lbGVUZXh0QmlnZ2VyVGhhbk1pbihlbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKGZvcmNlID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZSgnbGFiZWwnKTtcbiAgICBpZiAoIWxhYmVsIHx8ICFsYWJlbC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIganVzdGlmaWNhdGlvbiA9IHIuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uKGVsZSk7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSBqdXN0aWZpY2F0aW9uO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG4gICAgdmFyIF9sYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgdmFyIHNyY0xhYmVsID0gZWxlLnBzdHlsZSgnc291cmNlLWxhYmVsJyk7XG4gICAgdmFyIHRndExhYmVsID0gZWxlLnBzdHlsZSgndGFyZ2V0LWxhYmVsJyk7XG4gICAgaWYgKGJhZExpbmUgfHwgKCFfbGFiZWwgfHwgIV9sYWJlbC52YWx1ZSkgJiYgKCFzcmNMYWJlbCB8fCAhc3JjTGFiZWwudmFsdWUpICYmICghdGd0TGFiZWwgfHwgIXRndExhYmVsLnZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH1cbiAgdmFyIGFwcGx5Um90YXRpb24gPSAhc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cbiAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIG51bGwsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCAnc291cmNlJywgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3RhcmdldCcsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgcHJlZml4LCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgfVxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5DUnAkNi5nZXRGb250Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGU7XG4gIHRoaXMuZm9udENhY2hlcyA9IHRoaXMuZm9udENhY2hlcyB8fCBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbnRDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IHRoaXMuZm9udENhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfVxuICBjYWNoZSA9IHtcbiAgICBjb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHRoaXMuZm9udENhY2hlcy5wdXNoKGNhY2hlKTtcbiAgcmV0dXJuIGNhY2hlO1xufTtcblxuLy8gc2V0IHVwIGNhbnZhcyBjb250ZXh0IHdpdGggZm9udFxuLy8gcmV0dXJucyB0cmFuc2Zvcm1lZCB0ZXh0IHN0cmluZ1xuQ1JwJDYuc2V0dXBUZXh0U3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAvLyBGb250IHN0eWxlXG4gIHZhciBsYWJlbFN0eWxlID0gZWxlLnBzdHlsZSgnZm9udC1zdHlsZScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSArICdweCc7XG4gIHZhciBsYWJlbEZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciBsYWJlbFdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBvcGFjaXR5ID0gdXNlRWxlT3BhY2l0eSA/IGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgKiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBvdXRsaW5lT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBvcGFjaXR5O1xuICB2YXIgY29sb3IgPSBlbGUucHN0eWxlKCdjb2xvcicpLnZhbHVlO1xuICB2YXIgb3V0bGluZUNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIGNvbnRleHQuZm9udCA9IGxhYmVsU3R5bGUgKyAnICcgKyBsYWJlbFdlaWdodCArICcgJyArIGxhYmVsU2l6ZSArICcgJyArIGxhYmVsRmFtaWx5O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJzsgLy8gc28gdGV4dCBvdXRsaW5lcyBhcmVuJ3QgamFnZ2VkXG5cbiAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgdGhpcy5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIG91dGxpbmVDb2xvclswXSwgb3V0bGluZUNvbG9yWzFdLCBvdXRsaW5lQ29sb3JbMl0sIG91dGxpbmVPcGFjaXR5KTtcbn07XG5cbi8vIFRPRE8gZW5zdXJlIHJlLXVzZWRcbmZ1bmN0aW9uIHJvdW5kUmVjdChjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIHJhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogNTtcbiAgdmFyIHN0cm9rZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogdW5kZWZpbmVkO1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XG4gIGN0eC5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG4gIGN0eC5saW5lVG8oeCwgeSArIHJhZGl1cyk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGlmIChzdHJva2UpIGN0eC5zdHJva2UoKTtlbHNlIGN0eC5maWxsKCk7XG59XG5DUnAkNi5nZXRUZXh0QW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIHRoZXRhO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGRhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdGF0aW9uID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciB0ZXh0QW5nbGUgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgdGhldGEgPSBlbGUuaXNFZGdlKCkgPyB0ZXh0QW5nbGUgOiAwO1xuICB9IGVsc2UgaWYgKHJvdGF0aW9uLnN0clZhbHVlID09PSAnbm9uZScpIHtcbiAgICB0aGV0YSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgdGhldGEgPSByb3RhdGlvbi5wZlZhbHVlO1xuICB9XG4gIHJldHVybiB0aGV0YTtcbn07XG5DUnAkNi5kcmF3VGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIHByZWZpeCkge1xuICB2YXIgYXBwbHlSb3RhdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHVzZUVsZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzY3JhdGNoID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwYXJlbnRPcGFjaXR5ID0gdXNlRWxlT3BhY2l0eSA/IGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgOiAxO1xuICBpZiAodXNlRWxlT3BhY2l0eSAmJiAocGFyZW50T3BhY2l0eSA9PT0gMCB8fCBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA9PT0gMCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB1c2UgJ21haW4nIGFzIGFuIGFsaWFzIGZvciB0aGUgbWFpbiBsYWJlbCAoaS5lLiBudWxsIHByZWZpeClcbiAgaWYgKHByZWZpeCA9PT0gJ21haW4nKSB7XG4gICAgcHJlZml4ID0gbnVsbDtcbiAgfVxuICB2YXIgdGV4dFggPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgdmFyIHRleHRZID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsWScsIHByZWZpeCk7XG4gIHZhciBvcmdUZXh0WCwgb3JnVGV4dFk7IC8vIHVzZWQgZm9yIHJvdGF0aW9uXG4gIHZhciB0ZXh0ID0gdGhpcy5nZXRMYWJlbFRleHQoZWxlLCBwcmVmaXgpO1xuICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQgIT09ICcnICYmICFpc05hTih0ZXh0WCkgJiYgIWlzTmFOKHRleHRZKSkge1xuICAgIHRoaXMuc2V0dXBUZXh0U3R5bGUoY29udGV4dCwgZWxlLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB2YXIgcGRhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgICB2YXIgdGV4dFcgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxXaWR0aCcsIHByZWZpeCk7XG4gICAgdmFyIHRleHRIID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbWFyZ2luWCA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgdmFyIHZhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgaWYgKGlzRWRnZSkge1xuICAgICAgaGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB2YWxpZ24gPSAnY2VudGVyJztcbiAgICB9XG4gICAgdGV4dFggKz0gbWFyZ2luWDtcbiAgICB0ZXh0WSArPSBtYXJnaW5ZO1xuICAgIHZhciB0aGV0YTtcbiAgICBpZiAoIWFwcGx5Um90YXRpb24pIHtcbiAgICAgIHRoZXRhID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhldGEgPSB0aGlzLmdldFRleHRBbmdsZShlbGUsIHByZWZpeCk7XG4gICAgfVxuICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgb3JnVGV4dFggPSB0ZXh0WDtcbiAgICAgIG9yZ1RleHRZID0gdGV4dFk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShvcmdUZXh0WCwgb3JnVGV4dFkpO1xuICAgICAgY29udGV4dC5yb3RhdGUodGhldGEpO1xuICAgICAgdGV4dFggPSAwO1xuICAgICAgdGV4dFkgPSAwO1xuICAgIH1cbiAgICBzd2l0Y2ggKHZhbGlnbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGV4dFkgKz0gdGV4dEg7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgYmFja2dyb3VuZE9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBib3JkZXJPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciB0ZXh0Qm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGJhY2tncm91bmRQYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBzdHlsZVNoYXBlID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJykuc3RyVmFsdWU7XG4gICAgdmFyIHJvdW5kZWQgPSBzdHlsZVNoYXBlLmluZGV4T2YoJ3JvdW5kJykgPT09IDA7XG4gICAgdmFyIHJvdW5kUmFkaXVzID0gMjtcbiAgICBpZiAoYmFja2dyb3VuZE9wYWNpdHkgPiAwIHx8IHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDApIHtcbiAgICAgIHZhciBiZ1ggPSB0ZXh0WCAtIGJhY2tncm91bmRQYWRkaW5nO1xuICAgICAgc3dpdGNoIChoYWxpZ24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgYmdYIC09IHRleHRXO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VyAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgYmdZID0gdGV4dFkgLSB0ZXh0SCAtIGJhY2tncm91bmRQYWRkaW5nO1xuICAgICAgdmFyIGJnVyA9IHRleHRXICsgMiAqIGJhY2tncm91bmRQYWRkaW5nO1xuICAgICAgdmFyIGJnSCA9IHRleHRIICsgMiAqIGJhY2tncm91bmRQYWRkaW5nO1xuICAgICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCkge1xuICAgICAgICB2YXIgdGV4dEZpbGwgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgdmFyIHRleHRCYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgdGV4dEJhY2tncm91bmRDb2xvclswXSArICcsJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMV0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzJdICsgJywnICsgYmFja2dyb3VuZE9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5ICsgJyknO1xuICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gsIHJvdW5kUmFkaXVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSB0ZXh0RmlsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0ZXh0Qm9yZGVyV2lkdGggPiAwICYmIGJvcmRlck9wYWNpdHkgPiAwKSB7XG4gICAgICAgIHZhciB0ZXh0U3Ryb2tlID0gY29udGV4dC5zdHJva2VTdHlsZTtcbiAgICAgICAgdmFyIHRleHRMaW5lV2lkdGggPSBjb250ZXh0LmxpbmVXaWR0aDtcbiAgICAgICAgdmFyIHRleHRCb3JkZXJDb2xvciA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLWNvbG9yJykudmFsdWU7XG4gICAgICAgIHZhciB0ZXh0Qm9yZGVyU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1zdHlsZScpLnZhbHVlO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoJyArIHRleHRCb3JkZXJDb2xvclswXSArICcsJyArIHRleHRCb3JkZXJDb2xvclsxXSArICcsJyArIHRleHRCb3JkZXJDb2xvclsyXSArICcsJyArIGJvcmRlck9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5ICsgJyknO1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHRleHRCb3JkZXJXaWR0aDtcbiAgICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgICBzd2l0Y2ggKHRleHRCb3JkZXJTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzQsIDJdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHRleHRCb3JkZXJXaWR0aCAvIDQ7IC8vIDUwJSByZXNlcnZlZCBmb3Igd2hpdGUgYmV0d2VlbiB0aGUgdHdvIGJvcmRlcnNcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyb3VuZGVkKSB7XG4gICAgICAgICAgcm91bmRSZWN0KGNvbnRleHQsIGJnWCwgYmdZLCBiZ1csIGJnSCwgcm91bmRSYWRpdXMsICdzdHJva2UnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZVJlY3QoYmdYLCBiZ1ksIGJnVywgYmdIKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dEJvcmRlclN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICAgIHZhciB3aGl0ZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gMjtcbiAgICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgICAgcm91bmRSZWN0KGNvbnRleHQsIGJnWCArIHdoaXRlV2lkdGgsIGJnWSArIHdoaXRlV2lkdGgsIGJnVyAtIHdoaXRlV2lkdGggKiAyLCBiZ0ggLSB3aGl0ZVdpZHRoICogMiwgcm91bmRSYWRpdXMsICdzdHJva2UnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCArIHdoaXRlV2lkdGgsIGJnWSArIHdoaXRlV2lkdGgsIGJnVyAtIHdoaXRlV2lkdGggKiAyLCBiZ0ggLSB3aGl0ZVdpZHRoICogMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0TGluZVdpZHRoO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gdGV4dFN0cm9rZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpbmVXaWR0aCA9IDIgKiBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlOyAvLyAqMiBiL2MgdGhlIHN0cm9rZSBpcyBkcmF3biBjZW50cmVkIG9uIHRoZSBtaWRkbGVcblxuICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICB9XG4gICAgaWYgKGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlID09PSAnd3JhcCcpIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCk7XG4gICAgICB2YXIgbGluZUhlaWdodCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgpO1xuICAgICAgdmFyIGhhbGZUZXh0VyA9IHRleHRXIC8gMjtcbiAgICAgIHZhciBqdXN0aWZpY2F0aW9uID0gdGhpcy5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIDsgZWxzZSBpZiAoaGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogcmlnaHRcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC10ZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH0gZWxzZSBpZiAoaGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAvLyBhdXRvIGp1c3RmaWNhdGlvbiA6IGNlbnRlclxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gLWhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiBsZWZ0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gdGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRleHRZIC09IChsaW5lcy5sZW5ndGggLSAxKSAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQobGluZXNbbF0sIHRleHRYLCB0ZXh0WSk7XG4gICAgICAgIHRleHRZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dCh0ZXh0LCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgfVxuICAgICAgY29udGV4dC5maWxsVGV4dCh0ZXh0LCB0ZXh0WCwgdGV4dFkpO1xuICAgIH1cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIGNvbnRleHQucm90YXRlKC10aGV0YSk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtb3JnVGV4dFgsIC1vcmdUZXh0WSk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBnbG9iYWwgUGF0aDJEICovXG52YXIgQ1JwJDUgPSB7fTtcbkNScCQ1LmRyYXdOb2RlID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5vZGVXaWR0aCwgbm9kZUhlaWdodDtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIGlmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpIHtcbiAgICByZXR1cm47IC8vIGNhbid0IGRyYXcgbm9kZSB3aXRoIHVuZGVmaW5lZCBwb3NpdGlvblxuICB9XG5cbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFub2RlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZWxlT3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gbm9kZS5lZmZlY3RpdmVPcGFjaXR5KCkgOiAxO1xuICB2YXIgdXNlUGF0aHMgPSByLnVzZVBhdGhzKCk7XG4gIHZhciBwYXRoO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKSArIDIgKiBwYWRkaW5nO1xuICBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKSArIDIgKiBwYWRkaW5nO1xuXG4gIC8vXG4gIC8vIHNldHVwIHNoaWZ0XG5cbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cblxuICAvL1xuICAvLyBsb2FkIGJnIGltYWdlXG5cbiAgdmFyIGJnSW1nUHJvcCA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLWltYWdlJyk7XG4gIHZhciB1cmxzID0gYmdJbWdQcm9wLnZhbHVlO1xuICB2YXIgdXJsRGVmaW5lZCA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gIHZhciBpbWFnZSA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gIHZhciBudW1JbWFnZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdXJsID0gdXJsc1tpXTtcbiAgICB2YXIgZGVmZCA9IHVybERlZmluZWRbaV0gPSB1cmwgIT0gbnVsbCAmJiB1cmwgIT09ICdub25lJztcbiAgICBpZiAoZGVmZCkge1xuICAgICAgdmFyIGJnSW1nQ3Jvc3NPcmlnaW4gPSBub2RlLmN5KCkuc3R5bGUoKS5nZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nLCAndmFsdWUnLCBpKTtcbiAgICAgIG51bUltYWdlcysrO1xuXG4gICAgICAvLyBnZXQgaW1hZ2UsIGFuZCBpZiBub3QgbG9hZGVkIHRoZW4gYXNrIHRvIHJlZHJhdyB3aGVuIGxhdGVyIGxvYWRlZFxuICAgICAgaW1hZ2VbaV0gPSByLmdldENhY2hlZEltYWdlKHVybCwgYmdJbWdDcm9zc09yaWdpbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbm9kZS5lbWl0QW5kTm90aWZ5KCdiYWNrZ3JvdW5kJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBzZXR1cCBzdHlsZXNcblxuICB2YXIgZGFya25lc3MgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1ibGFja2VuJykudmFsdWU7XG4gIHZhciBib3JkZXJXaWR0aCA9IG5vZGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgYmdPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIGJvcmRlckNvbG9yID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jb2xvcicpLnZhbHVlO1xuICB2YXIgYm9yZGVyU3R5bGUgPSBub2RlLnBzdHlsZSgnYm9yZGVyLXN0eWxlJykudmFsdWU7XG4gIHZhciBib3JkZXJKb2luID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1qb2luJykudmFsdWU7XG4gIHZhciBib3JkZXJDYXAgPSBub2RlLnBzdHlsZSgnYm9yZGVyLWNhcCcpLnZhbHVlO1xuICB2YXIgYm9yZGVyUG9zaXRpb24gPSBub2RlLnBzdHlsZSgnYm9yZGVyLXBvc2l0aW9uJykudmFsdWU7XG4gIHZhciBib3JkZXJQYXR0ZXJuID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1kYXNoLXBhdHRlcm4nKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyT2Zmc2V0ID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1kYXNoLW9mZnNldCcpLnBmVmFsdWU7XG4gIHZhciBib3JkZXJPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgb3V0bGluZVdpZHRoID0gbm9kZS5wc3R5bGUoJ291dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgb3V0bGluZUNvbG9yID0gbm9kZS5wc3R5bGUoJ291dGxpbmUtY29sb3InKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVTdHlsZSA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLXN0eWxlJykudmFsdWU7XG4gIHZhciBvdXRsaW5lT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBvdXRsaW5lT2Zmc2V0ID0gbm9kZS5wc3R5bGUoJ291dGxpbmUtb2Zmc2V0JykudmFsdWU7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlO1xuICBpZiAoY29ybmVyUmFkaXVzICE9PSAnYXV0bycpIGNvcm5lclJhZGl1cyA9IG5vZGUucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgdmFyIHNldHVwU2hhcGVDb2xvciA9IGZ1bmN0aW9uIHNldHVwU2hhcGVDb2xvcigpIHtcbiAgICB2YXIgYmdPcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGJnT3BhY2l0eTtcbiAgICByLmVsZUZpbGxTdHlsZShjb250ZXh0LCBub2RlLCBiZ09weSk7XG4gIH07XG4gIHZhciBzZXR1cEJvcmRlckNvbG9yID0gZnVuY3Rpb24gc2V0dXBCb3JkZXJDb2xvcigpIHtcbiAgICB2YXIgYmRyT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBib3JkZXJPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBib3JkZXJDb2xvclswXSwgYm9yZGVyQ29sb3JbMV0sIGJvcmRlckNvbG9yWzJdLCBiZHJPcHkpO1xuICB9O1xuICB2YXIgc2V0dXBPdXRsaW5lQ29sb3IgPSBmdW5jdGlvbiBzZXR1cE91dGxpbmVDb2xvcigpIHtcbiAgICB2YXIgb3Rsbk9weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogb3V0bGluZU9wYWNpdHk7XG4gICAgci5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIG91dGxpbmVDb2xvclswXSwgb3V0bGluZUNvbG9yWzFdLCBvdXRsaW5lQ29sb3JbMl0sIG90bG5PcHkpO1xuICB9O1xuXG4gIC8vXG4gIC8vIHNldHVwIHNoYXBlXG5cbiAgdmFyIGdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKHdpZHRoLCBoZWlnaHQsIHNoYXBlLCBwb2ludHMpIHtcbiAgICB2YXIgcGF0aENhY2hlID0gci5ub2RlUGF0aENhY2hlID0gci5ub2RlUGF0aENhY2hlIHx8IFtdO1xuICAgIHZhciBrZXkgPSBoYXNoU3RyaW5ncyhzaGFwZSA9PT0gJ3BvbHlnb24nID8gc2hhcGUgKyAnLCcgKyBwb2ludHMuam9pbignLCcpIDogc2hhcGUsICcnICsgaGVpZ2h0LCAnJyArIHdpZHRoLCAnJyArIGNvcm5lclJhZGl1cyk7XG4gICAgdmFyIGNhY2hlZFBhdGggPSBwYXRoQ2FjaGVba2V5XTtcbiAgICB2YXIgcGF0aDtcbiAgICB2YXIgY2FjaGVIaXQgPSBmYWxzZTtcbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY2FjaGVkUGF0aDtcbiAgICAgIGNhY2hlSGl0ID0gdHJ1ZTtcbiAgICAgIHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBuZXcgUGF0aDJEKCk7XG4gICAgICBwYXRoQ2FjaGVba2V5XSA9IHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBwYXRoLFxuICAgICAgY2FjaGVIaXQ6IGNhY2hlSGl0XG4gICAgfTtcbiAgfTtcbiAgdmFyIHN0eWxlU2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNoYXBlUHRzID0gbm9kZS5wc3R5bGUoJ3NoYXBlLXBvbHlnb24tcG9pbnRzJykucGZWYWx1ZTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgICB2YXIgc2hhcGVQYXRoID0gZ2V0UGF0aChub2RlV2lkdGgsIG5vZGVIZWlnaHQsIHN0eWxlU2hhcGUsIHNoYXBlUHRzKTtcbiAgICBwYXRoID0gc2hhcGVQYXRoLnBhdGg7XG4gICAgcGF0aENhY2hlSGl0ID0gc2hhcGVQYXRoLmNhY2hlSGl0O1xuICB9XG4gIHZhciBkcmF3U2hhcGUgPSBmdW5jdGlvbiBkcmF3U2hhcGUoKSB7XG4gICAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICAgIHZhciBucG9zID0gcG9zO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIG5wb3MgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcocGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICB9XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdJbWFnZXMgPSBmdW5jdGlvbiBkcmF3SW1hZ2VzKCkge1xuICAgIHZhciBub2RlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgaW5zaWRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIHZhciBwcmV2QmdpbmcgPSBfcC5iYWNrZ3JvdW5kaW5nO1xuICAgIHZhciB0b3RhbENvbXBsZXRlZCA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGltYWdlLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGJnQ29udGFpbm1lbnQgPSBub2RlLmN5KCkuc3R5bGUoKS5nZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnLCAndmFsdWUnLCBfaSk7XG4gICAgICBpZiAoaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdvdmVyJyB8fCAhaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHVybERlZmluZWRbX2ldICYmIGltYWdlW19pXS5jb21wbGV0ZSAmJiAhaW1hZ2VbX2ldLmVycm9yKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIHIuZHJhd0luc2NyaWJlZEltYWdlKGNvbnRleHQsIGltYWdlW19pXSwgbm9kZSwgX2ksIG5vZGVPcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgX3AuYmFja2dyb3VuZGluZyA9ICEodG90YWxDb21wbGV0ZWQgPT09IG51bUltYWdlcyk7XG4gICAgaWYgKHByZXZCZ2luZyAhPT0gX3AuYmFja2dyb3VuZGluZykge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGIvYyA6YmFja2dyb3VuZGluZyBzdGF0ZSBjaGFuZ2VkXG4gICAgICBub2RlLnVwZGF0ZVN0eWxlKGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3UGllID0gZnVuY3Rpb24gZHJhd1BpZSgpIHtcbiAgICB2YXIgcmVkcmF3U2hhcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwaWVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBlbGVPcGFjaXR5O1xuICAgIGlmIChyLmhhc1BpZShub2RlKSkge1xuICAgICAgci5kcmF3UGllKGNvbnRleHQsIG5vZGUsIHBpZU9wYWNpdHkpO1xuXG4gICAgICAvLyByZWRyYXcvcmVzdG9yZSBwYXRoIGlmIHN0ZXBzIGFmdGVyIHBpZSBuZWVkIGl0XG4gICAgICBpZiAocmVkcmF3U2hhcGUpIHtcbiAgICAgICAgaWYgKCF1c2VQYXRocykge1xuICAgICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkYXJrZW4gPSBmdW5jdGlvbiBkYXJrZW4oKSB7XG4gICAgdmFyIGRhcmtlbk9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIG9wYWNpdHkgPSAoZGFya25lc3MgPiAwID8gZGFya25lc3MgOiAtZGFya25lc3MpICogZGFya2VuT3BhY2l0eTtcbiAgICB2YXIgYyA9IGRhcmtuZXNzID4gMCA/IDAgOiAyNTU7XG4gICAgaWYgKGRhcmtuZXNzICE9PSAwKSB7XG4gICAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGMsIGMsIGMsIG9wYWNpdHkpO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdCb3JkZXIgPSBmdW5jdGlvbiBkcmF3Qm9yZGVyKCkge1xuICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSBib3JkZXJDYXA7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gYm9yZGVySm9pbjtcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBzd2l0Y2ggKGJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKGJvcmRlclBhdHRlcm4pO1xuICAgICAgICAgICAgY29udGV4dC5saW5lRGFzaE9mZnNldCA9IGJvcmRlck9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGJvcmRlclBvc2l0aW9uICE9PSAnY2VudGVyJykge1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggKj0gMjtcbiAgICAgICAgaWYgKGJvcmRlclBvc2l0aW9uID09PSAnaW5zaWRlJykge1xuICAgICAgICAgIHVzZVBhdGhzID8gY29udGV4dC5jbGlwKHBhdGgpIDogY29udGV4dC5jbGlwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICByZWdpb24ucmVjdCgtbm9kZVdpZHRoIC8gMiAtIGJvcmRlcldpZHRoLCAtbm9kZUhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCwgbm9kZVdpZHRoICsgMiAqIGJvcmRlcldpZHRoLCBub2RlSGVpZ2h0ICsgMiAqIGJvcmRlcldpZHRoKTtcbiAgICAgICAgICByZWdpb24uYWRkUGF0aChwYXRoKTtcbiAgICAgICAgICBjb250ZXh0LmNsaXAocmVnaW9uLCAnZXZlbm9kZCcpO1xuICAgICAgICB9XG4gICAgICAgIHVzZVBhdGhzID8gY29udGV4dC5zdHJva2UocGF0aCkgOiBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVzZVBhdGhzID8gY29udGV4dC5zdHJva2UocGF0aCkgOiBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGJvcmRlclN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoIC8gMztcbiAgICAgICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCBpbiBjYXNlIHdlIGNoYW5nZWQgdGhlIGJvcmRlciBzdHlsZVxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdPdXRsaW5lID0gZnVuY3Rpb24gZHJhd091dGxpbmUoKSB7XG4gICAgaWYgKG91dGxpbmVXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gb3V0bGluZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnO1xuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIHN3aXRjaCAob3V0bGluZVN0eWxlKSB7XG4gICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFs0LCAyXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBucG9zID0gcG9zO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIG5wb3MgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc2hhcGUgPSByLmdldE5vZGVTaGFwZShub2RlKTtcbiAgICAgIHZhciBiV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICAgIGlmIChib3JkZXJQb3NpdGlvbiA9PT0gJ2luc2lkZScpIGJXaWR0aCA9IDA7XG4gICAgICBpZiAoYm9yZGVyUG9zaXRpb24gPT09ICdvdXRzaWRlJykgYldpZHRoICo9IDI7XG4gICAgICB2YXIgc2NhbGVYID0gKG5vZGVXaWR0aCArIGJXaWR0aCArIChvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSkgLyBub2RlV2lkdGg7XG4gICAgICB2YXIgc2NhbGVZID0gKG5vZGVIZWlnaHQgKyBiV2lkdGggKyAob3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkpIC8gbm9kZUhlaWdodDtcbiAgICAgIHZhciBzV2lkdGggPSBub2RlV2lkdGggKiBzY2FsZVg7XG4gICAgICB2YXIgc0hlaWdodCA9IG5vZGVIZWlnaHQgKiBzY2FsZVk7XG4gICAgICB2YXIgcG9pbnRzID0gci5ub2RlU2hhcGVzW3NoYXBlXS5wb2ludHM7XG4gICAgICB2YXIgX3BhdGg7XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgdmFyIG91dGxpbmVQYXRoID0gZ2V0UGF0aChzV2lkdGgsIHNIZWlnaHQsIHNoYXBlLCBwb2ludHMpO1xuICAgICAgICBfcGF0aCA9IG91dGxpbmVQYXRoLnBhdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIGRyYXcgdGhlIG91dGxpbmUgcGF0aCwgZWl0aGVyIGJ5IHVzaW5nIGV4cGFuZGVkIHBvaW50cyBvciBieSBzY2FsaW5nIFxuICAgICAgLy8gdGhlIGRpbWVuc2lvbnMsIGRlcGVuZGluZyBvbiBzaGFwZVxuICAgICAgaWYgKHNoYXBlID09PSBcImVsbGlwc2VcIikge1xuICAgICAgICByLmRyYXdFbGxpcHNlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAoWydyb3VuZC1kaWFtb25kJywgJ3JvdW5kLWhlcHRhZ29uJywgJ3JvdW5kLWhleGFnb24nLCAncm91bmQtb2N0YWdvbicsICdyb3VuZC1wZW50YWdvbicsICdyb3VuZC1wb2x5Z29uJywgJ3JvdW5kLXRyaWFuZ2xlJywgJ3JvdW5kLXRhZyddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICB2YXIgc011bHQgPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0WCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXRZID0gMDtcbiAgICAgICAgaWYgKHNoYXBlID09PSAncm91bmQtZGlhbW9uZCcpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuNDtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLWhlcHRhZ29uJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS4wNzU7XG4gICAgICAgICAgb2Zmc2V0WSA9IC0oYldpZHRoIC8gMiArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpIC8gMzU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC1oZXhhZ29uJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS4xMjtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLXBlbnRhZ29uJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS4xMztcbiAgICAgICAgICBvZmZzZXRZID0gLShiV2lkdGggLyAyICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgLyAxNTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLXRhZycpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMTI7XG4gICAgICAgICAgb2Zmc2V0WCA9IChiV2lkdGggLyAyICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgKiAuMDc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC10cmlhbmdsZScpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIChNYXRoLlBJIC8gMik7XG4gICAgICAgICAgb2Zmc2V0WSA9IC0oYldpZHRoICsgb3V0bGluZU9mZnNldCAvIDIgKyBvdXRsaW5lV2lkdGgpIC8gTWF0aC5QSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc011bHQgIT09IDApIHtcbiAgICAgICAgICBzY2FsZVggPSAobm9kZVdpZHRoICsgc011bHQpIC8gbm9kZVdpZHRoO1xuICAgICAgICAgIHNXaWR0aCA9IG5vZGVXaWR0aCAqIHNjYWxlWDtcbiAgICAgICAgICBpZiAoIVsncm91bmQtaGV4YWdvbicsICdyb3VuZC10YWcnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgICAgIHNjYWxlWSA9IChub2RlSGVpZ2h0ICsgc011bHQpIC8gbm9kZUhlaWdodDtcbiAgICAgICAgICAgIHNIZWlnaHQgPSBub2RlSGVpZ2h0ICogc2NhbGVZO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUG9seWdvblJhZGl1cyhzV2lkdGgsIHNIZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgaGFsZlcgPSBzV2lkdGggLyAyO1xuICAgICAgICB2YXIgaGFsZkggPSBzSGVpZ2h0IC8gMjtcbiAgICAgICAgdmFyIHJhZGl1cyA9IGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDI7XG4gICAgICAgIHZhciBwID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICAgICAgdmFyIGNvcm5lcnMgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBwb2ludHMubGVuZ3RoIC8gMjsgX2kzKyspIHtcbiAgICAgICAgICBwW19pM10gPSB7XG4gICAgICAgICAgICB4OiBucG9zLnggKyBvZmZzZXRYICsgaGFsZlcgKiBwb2ludHNbX2kzICogMl0sXG4gICAgICAgICAgICB5OiBucG9zLnkgKyBvZmZzZXRZICsgaGFsZkggKiBwb2ludHNbX2kzICogMiArIDFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2kyLFxuICAgICAgICAgIHAxLFxuICAgICAgICAgIHAyLFxuICAgICAgICAgIHAzLFxuICAgICAgICAgIGxlbiA9IHAubGVuZ3RoO1xuICAgICAgICBwMSA9IHBbbGVuIC0gMV07XG4gICAgICAgIC8vIGZvciBlYWNoIHBvaW50XG4gICAgICAgIGZvciAoX2kyID0gMDsgX2kyIDwgbGVuOyBfaTIrKykge1xuICAgICAgICAgIHAyID0gcFtfaTIgJSBsZW5dO1xuICAgICAgICAgIHAzID0gcFsoX2kyICsgMSkgJSBsZW5dO1xuICAgICAgICAgIGNvcm5lcnNbX2kyXSA9IGdldFJvdW5kQ29ybmVyKHAxLCBwMiwgcDMsIHJhZGl1cyk7XG4gICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICBwMiA9IHAzO1xuICAgICAgICB9XG4gICAgICAgIHIuZHJhd1JvdW5kUG9seWdvblBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54ICsgb2Zmc2V0WCwgbnBvcy55ICsgb2Zmc2V0WSwgbm9kZVdpZHRoICogc2NhbGVYLCBub2RlSGVpZ2h0ICogc2NhbGVZLCBwb2ludHMsIGNvcm5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChbJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHNXaWR0aCwgc0hlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHIuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyAyKTtcbiAgICAgIH0gZWxzZSBpZiAoWydjdXRyZWN0YW5nbGUnLCAnY3V0LXJlY3RhbmdsZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpIDogY29ybmVyUmFkaXVzO1xuICAgICAgICByLmRyYXdDdXRSZWN0YW5nbGVQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQsIG51bGwsIGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDQpO1xuICAgICAgfSBlbHNlIGlmIChbJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJywgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyhzV2lkdGgsIHNIZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgICByLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCwgY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gMik7XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSBcImJhcnJlbFwiKSB7XG4gICAgICAgIHIuZHJhd0JhcnJlbFBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCk7XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlLnN0YXJ0c1dpdGgoXCJwb2x5Z29uXCIpIHx8IFsncmhvbWJvaWQnLCAncmlnaHQtcmhvbWJvaWQnLCAncm91bmQtdGFnJywgJ3RhZycsICd2ZWUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgdmFyIHBhZCA9IChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIG5vZGVXaWR0aDtcbiAgICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZFBvbHlnb24ocG9pbnRzLCBwYWQpKTtcbiAgICAgICAgci5kcmF3UG9seWdvblBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgcG9pbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfcGFkID0gKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gbm9kZVdpZHRoO1xuICAgICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kUG9seWdvbihwb2ludHMsIC1fcGFkKSk7XG4gICAgICAgIHIuZHJhd1BvbHlnb25QYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIHBvaW50cyk7XG4gICAgICB9XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgY29udGV4dC5zdHJva2UoX3BhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChvdXRsaW5lU3R5bGUgPT09ICdkb3VibGUnKSB7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYldpZHRoIC8gMztcbiAgICAgICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZShfcGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgICAgIH1cblxuICAgICAgLy8gcmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHRoZSBib3JkZXIgc3R5bGVcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZU92ZXJsYXkoY29udGV4dCwgbm9kZSwgcG9zLCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdVbmRlcmxheSgpIHtcbiAgICBpZiAoc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHIuZHJhd05vZGVVbmRlcmxheShjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dCgpIHtcbiAgICByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBub2RlLCBudWxsLCBkcmF3TGFiZWwpO1xuICB9O1xuICB2YXIgZ2hvc3QgPSBub2RlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG4gIGlmIChnaG9zdCkge1xuICAgIHZhciBneCA9IG5vZGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteCcpLnBmVmFsdWU7XG4gICAgdmFyIGd5ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC15JykucGZWYWx1ZTtcbiAgICB2YXIgZ2hvc3RPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgZWZmR2hvc3RPcGFjaXR5ID0gZ2hvc3RPcGFjaXR5ICogZWxlT3BhY2l0eTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShneCwgZ3kpO1xuICAgIHNldHVwT3V0bGluZUNvbG9yKCk7XG4gICAgZHJhd091dGxpbmUoKTtcbiAgICBzZXR1cFNoYXBlQ29sb3IoZ2hvc3RPcGFjaXR5ICogYmdPcGFjaXR5KTtcbiAgICBkcmF3U2hhcGUoKTtcbiAgICBkcmF3SW1hZ2VzKGVmZkdob3N0T3BhY2l0eSwgdHJ1ZSk7XG4gICAgc2V0dXBCb3JkZXJDb2xvcihnaG9zdE9wYWNpdHkgKiBib3JkZXJPcGFjaXR5KTtcbiAgICBkcmF3Qm9yZGVyKCk7XG4gICAgZHJhd1BpZShkYXJrbmVzcyAhPT0gMCB8fCBib3JkZXJXaWR0aCAhPT0gMCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHksIGZhbHNlKTtcbiAgICBkYXJrZW4oZWZmR2hvc3RPcGFjaXR5KTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtZ3gsIC1neSk7XG4gIH1cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXBvcy54LCAtcG9zLnkpO1xuICB9XG4gIGRyYXdVbmRlcmxheSgpO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShwb3MueCwgcG9zLnkpO1xuICB9XG4gIHNldHVwT3V0bGluZUNvbG9yKCk7XG4gIGRyYXdPdXRsaW5lKCk7XG4gIHNldHVwU2hhcGVDb2xvcigpO1xuICBkcmF3U2hhcGUoKTtcbiAgZHJhd0ltYWdlcyhlbGVPcGFjaXR5LCB0cnVlKTtcbiAgc2V0dXBCb3JkZXJDb2xvcigpO1xuICBkcmF3Qm9yZGVyKCk7XG4gIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIGZhbHNlKTtcbiAgZGFya2VuKCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VGV4dCgpO1xuICBkcmF3T3ZlcmxheSgpO1xuXG4gIC8vXG4gIC8vIGNsZWFuIHVwIHNoaWZ0XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xudmFyIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5ID0gZnVuY3Rpb24gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkob3ZlcmxheU9yVW5kZXJsYXkpIHtcbiAgaWYgKCFbJ292ZXJsYXknLCAndW5kZXJsYXknXS5pbmNsdWRlcyhvdmVybGF5T3JVbmRlcmxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUnKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGlmICghbm9kZS52aXNpYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgb3BhY2l0eSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIHZhciBzaGFwZSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1zaGFwZVwiKSkudmFsdWU7XG4gICAgdmFyIHJhZGl1cyA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1jb3JuZXItcmFkaXVzXCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA+IDApIHtcbiAgICAgIHBvcyA9IHBvcyB8fCBub2RlLnBvc2l0aW9uKCk7XG4gICAgICBpZiAobm9kZVdpZHRoID09IG51bGwgfHwgbm9kZUhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIHZhciBfcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICAgICAgICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogX3BhZGRpbmc7XG4gICAgICAgIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpICsgMiAqIF9wYWRkaW5nO1xuICAgICAgfVxuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICAgIHIubm9kZVNoYXBlc1tzaGFwZV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCArIHBhZGRpbmcgKiAyLCBub2RlSGVpZ2h0ICsgcGFkZGluZyAqIDIsIHJhZGl1cyk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG59O1xuQ1JwJDUuZHJhd05vZGVPdmVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ1LmRyYXdOb2RlVW5kZXJsYXkgPSBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcblxuLy8gZG9lcyB0aGUgbm9kZSBoYXZlIGF0IGxlYXN0IG9uZSBwaWUgcGllY2U/XG5DUnAkNS5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuQ1JwJDUuZHJhd1BpZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBub2RlT3BhY2l0eSwgcG9zKSB7XG4gIG5vZGUgPSBub2RlWzBdOyAvLyBlbnN1cmUgZWxlIHJlZlxuICBwb3MgPSBwb3MgfHwgbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgY3lTdHlsZSA9IG5vZGUuY3koKS5zdHlsZSgpO1xuICB2YXIgcGllU2l6ZSA9IG5vZGUucHN0eWxlKCdwaWUtc2l6ZScpO1xuICB2YXIgeCA9IHBvcy54O1xuICB2YXIgeSA9IHBvcy55O1xuICB2YXIgbm9kZVcgPSBub2RlLndpZHRoKCk7XG4gIHZhciBub2RlSCA9IG5vZGUuaGVpZ2h0KCk7XG4gIHZhciByYWRpdXMgPSBNYXRoLm1pbihub2RlVywgbm9kZUgpIC8gMjsgLy8gbXVzdCBmaXQgaW4gbm9kZVxuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gIH1cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gY3lTdHlsZS5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgLy8gMS4uTlxuICAgIHZhciBzaXplID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJykudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHZhciBvcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWUgKiBub2RlT3BhY2l0eTtcbiAgICB2YXIgcGVyY2VudCA9IHNpemUgLyAxMDA7IC8vIG1hcCBpbnRlZ2VyIHJhbmdlIFswLCAxMDBdIHRvIFswLCAxXVxuXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG4gICAgaWYgKHBlcmNlbnQgKyBsYXN0UGVyY2VudCA+IDEpIHtcbiAgICAgIHBlcmNlbnQgPSAxIC0gbGFzdFBlcmNlbnQ7XG4gICAgfVxuICAgIHZhciBhbmdsZVN0YXJ0ID0gMS41ICogTWF0aC5QSSArIDIgKiBNYXRoLlBJICogbGFzdFBlcmNlbnQ7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2sgYW5kIGdvIGNsb2Nrd2lzZVxuICAgIHZhciBhbmdsZURlbHRhID0gMiAqIE1hdGguUEkgKiBwZXJjZW50O1xuICAgIHZhciBhbmdsZUVuZCA9IGFuZ2xlU3RhcnQgKyBhbmdsZURlbHRhO1xuXG4gICAgLy8gaWdub3JlIGlmXG4gICAgLy8gLSB6ZXJvIHNpemVcbiAgICAvLyAtIHdlJ3JlIGFscmVhZHkgYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuICAgIC8vIC0gYWRkaW5nIHRoZSBjdXJyZW50IHNsaWNlIHdvdWxkIGdvIGJleW9uZCB0aGUgZnVsbCBjaXJjbGVcbiAgICBpZiAoc2l6ZSA9PT0gMCB8fCBsYXN0UGVyY2VudCA+PSAxIHx8IGxhc3RQZXJjZW50ICsgcGVyY2VudCA+IDEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgYW5nbGVTdGFydCwgYW5nbGVFbmQpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBsYXN0UGVyY2VudCArPSBwZXJjZW50O1xuICB9XG59O1xuXG52YXIgQ1JwJDQgPSB7fTtcbnZhciBtb3Rpb25CbHVyRGVsYXkgPSAxMDA7XG5cbi8vIHZhciBpc0ZpcmVmb3ggPSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuXG5DUnAkNC5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuZGF0YS5jb250ZXh0c1swXTtcbiAgaWYgKHRoaXMuZm9yY2VkUGl4ZWxSYXRpbyAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yY2VkUGl4ZWxSYXRpbztcbiAgfVxuICB2YXIgYmFja2luZ1N0b3JlID0gY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufTtcblxuQ1JwJDQucGFpbnRDYWNoZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciBjYWNoZXMgPSB0aGlzLnBhaW50Q2FjaGVzID0gdGhpcy5wYWludENhY2hlcyB8fCBbXTtcbiAgdmFyIG5lZWRUb0NyZWF0ZUNhY2hlID0gdHJ1ZTtcbiAgdmFyIGNhY2hlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhY2hlID0gY2FjaGVzW2ldO1xuICAgIGlmIChjYWNoZS5jb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICBuZWVkVG9DcmVhdGVDYWNoZSA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkVG9DcmVhdGVDYWNoZSkge1xuICAgIGNhY2hlID0ge1xuICAgICAgY29udGV4dDogY29udGV4dFxuICAgIH07XG4gICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICB9XG4gIHJldHVybiBjYWNoZTtcbn07XG5DUnAkNC5jcmVhdGVHcmFkaWVudFN0eWxlRm9yID0gZnVuY3Rpb24gKGNvbnRleHQsIHNoYXBlU3R5bGVOYW1lLCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGU7XG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgdmFyIGNvbG9ycyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtY29sb3JzJykudmFsdWUsXG4gICAgcG9zaXRpb25zID0gZWxlLnBzdHlsZShzaGFwZVN0eWxlTmFtZSArICctZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnKS5wZlZhbHVlO1xuICBpZiAoZmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgZW5kID0gZWxlLnRhcmdldEVuZHBvaW50KCksXG4gICAgICAgIG1pZCA9IGVsZS5taWRwb2ludCgpO1xuICAgICAgdmFyIGQxID0gZGlzdChzdGFydCwgbWlkKTtcbiAgICAgIHZhciBkMiA9IGRpc3QoZW5kLCBtaWQpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQobWlkLngsIG1pZC55LCAwLCBtaWQueCwgbWlkLnksIE1hdGgubWF4KGQxLCBkMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgaGVpZ2h0ID0gZWxlLnBhZGRlZEhlaWdodCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQocG9zLngsIHBvcy55LCAwLCBwb3MueCwgcG9zLnksIE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIF9zdGFydCA9IGVsZS5zb3VyY2VFbmRwb2ludCgpLFxuICAgICAgICBfZW5kID0gZWxlLnRhcmdldEVuZHBvaW50KCk7XG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfc3RhcnQueCwgX3N0YXJ0LnksIF9lbmQueCwgX2VuZC55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9wb3MgPSB1c2VQYXRocyA/IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSA6IGVsZS5wb3NpdGlvbigpLFxuICAgICAgICBfd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgX2hlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKSxcbiAgICAgICAgaGFsZldpZHRoID0gX3dpZHRoIC8gMixcbiAgICAgICAgaGFsZkhlaWdodCA9IF9oZWlnaHQgLyAyO1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtZ3JhZGllbnQtZGlyZWN0aW9uJykudmFsdWU7XG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0by1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55LCBfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICd0by1yaWdodC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wLWxlZnQnOlxuICAgICAgICBjYXNlICd0by1sZWZ0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGdyYWRpZW50IHN0eWxlXG5cbiAgdmFyIGhhc1Bvc2l0aW9ucyA9IHBvc2l0aW9ucy5sZW5ndGggPT09IGNvbG9ycy5sZW5ndGg7XG4gIHZhciBsZW5ndGggPSBjb2xvcnMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgZ3JhZGllbnRTdHlsZS5hZGRDb2xvclN0b3AoaGFzUG9zaXRpb25zID8gcG9zaXRpb25zW2ldIDogaSAvIChsZW5ndGggLSAxKSwgJ3JnYmEoJyArIGNvbG9yc1tpXVswXSArICcsJyArIGNvbG9yc1tpXVsxXSArICcsJyArIGNvbG9yc1tpXVsyXSArICcsJyArIG9wYWNpdHkgKyAnKScpO1xuICB9XG4gIHJldHVybiBncmFkaWVudFN0eWxlO1xufTtcbkNScCQ0LmdyYWRpZW50RmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZSA9IHRoaXMuY3JlYXRlR3JhZGllbnRTdHlsZUZvcihjb250ZXh0LCAnYmFja2dyb3VuZCcsIGVsZSwgZmlsbCwgb3BhY2l0eSk7XG4gIGlmICghZ3JhZGllbnRTdHlsZSkgcmV0dXJuIG51bGw7IC8vIGVycm9yXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5jb2xvckZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG4gIC8vIHR1cm4gb2ZmIGZvciBub3csIHNlZW1zIGNvbnRleHQgZG9lcyBpdHMgb3duIGNhY2hpbmdcblxuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG5cbiAgLy8gdmFyIGZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuXG4gIC8vIGlmKCBjYWNoZS5maWxsU3R5bGUgIT09IGZpbGxTdHlsZSApe1xuICAvLyAgIGNvbnRleHQuZmlsbFN0eWxlID0gY2FjaGUuZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAvLyB9XG59O1xuXG5DUnAkNC5lbGVGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBiYWNrZ3JvdW5kRmlsbCA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtZmlsbCcpLnZhbHVlO1xuICBpZiAoYmFja2dyb3VuZEZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGJhY2tncm91bmRGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRGaWxsU3R5bGUoY29udGV4dCwgZWxlLCBiYWNrZ3JvdW5kRmlsbCwgb3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhY2tncm91bmRDb2xvciA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICB0aGlzLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGJhY2tncm91bmRDb2xvclswXSwgYmFja2dyb3VuZENvbG9yWzFdLCBiYWNrZ3JvdW5kQ29sb3JbMl0sIG9wYWNpdHkpO1xuICB9XG59O1xuQ1JwJDQuZ3JhZGllbnRTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2xpbmUnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LnN0cm9rZVN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5jb2xvclN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHIsIGcsIGIsIGEpIHtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBzdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuXG4gIC8vIGlmKCBjYWNoZS5zdHJva2VTdHlsZSAhPT0gc3Ryb2tlU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY2FjaGUuc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTtcbiAgLy8gfVxufTtcblxuQ1JwJDQuZWxlU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBsaW5lRmlsbCA9IGVsZS5wc3R5bGUoJ2xpbmUtZmlsbCcpLnZhbHVlO1xuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuLy8gUmVzaXplIGNhbnZhc1xuQ1JwJDQubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgYmIgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gYmJbMl07XG4gIHZhciBoZWlnaHQgPSBiYlszXTtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG4gIHZhciBjYW52YXNXaWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhc0hlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXM7XG4gIGlmIChjYW52YXNXaWR0aCA9PT0gci5jYW52YXNXaWR0aCAmJiBjYW52YXNIZWlnaHQgPT09IHIuY2FudmFzSGVpZ2h0KSB7XG4gICAgcmV0dXJuOyAvLyBzYXZlIGN5Y2xlcyBpZiBzYW1lXG4gIH1cblxuICByLmZvbnRDYWNoZXMgPSBudWxsOyAvLyByZXNpemluZyByZXNldHMgdGhlIHN0eWxlXG5cbiAgdmFyIGNhbnZhc0NvbnRhaW5lciA9IGRhdGEuY2FudmFzQ29udGFpbmVyO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGNhbnZhc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQ0FOVkFTX0xBWUVSUzsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5jYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQlVGRkVSX0NPVU5UOyBpKyspIHtcbiAgICBjYW52YXMgPSBkYXRhLmJ1ZmZlckNhbnZhc2VzW2ldO1xuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhc1dpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB9XG4gIHIudGV4dHVyZU11bHQgPSAxO1xuICBpZiAocGl4ZWxSYXRpbyA8PSAxKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICByLnRleHR1cmVNdWx0ID0gMjtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQ7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodCAqIHIudGV4dHVyZU11bHQ7XG4gIH1cbiAgci5jYW52YXNXaWR0aCA9IGNhbnZhc1dpZHRoO1xuICByLmNhbnZhc0hlaWdodCA9IGNhbnZhc0hlaWdodDtcbn07XG5DUnAkNC5yZW5kZXJUbyA9IGZ1bmN0aW9uIChjeHQsIHpvb20sIHBhbiwgcHhSYXRpbykge1xuICB0aGlzLnJlbmRlcih7XG4gICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgIGZvcmNlZFpvb206IHpvb20sXG4gICAgZm9yY2VkUGFuOiBwYW4sXG4gICAgZHJhd0FsbExheWVyczogdHJ1ZSxcbiAgICBmb3JjZWRQeFJhdGlvOiBweFJhdGlvXG4gIH0pO1xufTtcbkNScCQ0LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHN0YXRpY0VtcHR5T2JqZWN0KCk7XG4gIHZhciBmb3JjZWRDb250ZXh0ID0gb3B0aW9ucy5mb3JjZWRDb250ZXh0O1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIGRyYXdPbmx5Tm9kZUxheWVyID0gb3B0aW9ucy5kcmF3T25seU5vZGVMYXllcjtcbiAgdmFyIGZvcmNlZFpvb20gPSBvcHRpb25zLmZvcmNlZFpvb207XG4gIHZhciBmb3JjZWRQYW4gPSBvcHRpb25zLmZvcmNlZFBhbjtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGlmIChyLnByZXZQeFJhdGlvICE9PSBwaXhlbFJhdGlvKSB7XG4gICAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICB9XG4gICAgci5wcmV2UHhSYXRpbyA9IHBpeGVsUmF0aW87XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICBpZiAoci5tYkZyYW1lcyA9PSBudWxsKSB7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICB9XG4gICAgci5tYkZyYW1lcysrO1xuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBnbyB0byBsb3dlciBxdWFsaXR5IGJsdXJyeSBmcmFtZXMgd2hlbiBzZXZlcmFsIG0vYiBmcmFtZXMgaGF2ZSBiZWVuIHJlbmRlcmVkIChhdm9pZHMgZmxhc2hpbmcpXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcbiAgaWYgKHIudGV4dHVyZURyYXdMYXN0RnJhbWUgJiYgIXRleHR1cmVEcmF3KSB7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55O1xuXG4gIC8vIHdlIHdhbnQgdGhlIGxvdyBxdWFsaXR5IG1vdGlvbmJsdXIgb25seSB3aGVuIHRoZSB2aWV3cG9ydCBpcyBiZWluZyBtYW5pcHVsYXRlZCBldGMgKHdoZXJlIGl0J3Mgbm90IG5vdGljZWQpXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgZWZmZWN0aXZlUGFuID0gZm9yY2VkUGFuO1xuICB9XG5cbiAgLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuICBlZmZlY3RpdmVab29tICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi54ICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi55ICo9IHBpeGVsUmF0aW87XG4gIHZhciBlbGVzID0gci5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICBmdW5jdGlvbiBtYmNsZWFyKGNvbnRleHQsIHgsIHksIHcsIGgpIHtcbiAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIHIubW90aW9uQmx1clRyYW5zcGFyZW5jeSk7XG4gICAgY29udGV4dC5maWxsUmVjdCh4LCB5LCB3LCBoKTtcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgfVxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuICAgIGlmICghci5jbGVhcmluZ01vdGlvbkJsdXIgJiYgKGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pKSB7XG4gICAgICBlUGFuID0ge1xuICAgICAgICB4OiBwYW4ueCAqIG1iUHhSYXRpbyxcbiAgICAgICAgeTogcGFuLnkgKiBtYlB4UmF0aW9cbiAgICAgIH07XG4gICAgICBlWm9vbSA9IHpvb20gKiBtYlB4UmF0aW87XG4gICAgICB3ID0gci5jYW52YXNXaWR0aCAqIG1iUHhSYXRpbztcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodCAqIG1iUHhSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgZVBhbiA9IGVmZmVjdGl2ZVBhbjtcbiAgICAgIGVab29tID0gZWZmZWN0aXZlWm9vbTtcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0O1xuICAgIH1cbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZVBhbi54LCBlUGFuLnkpO1xuICAgICAgY29udGV4dC5zY2FsZShlWm9vbSwgZVpvb20pO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShmb3JjZWRQYW4ueCwgZm9yY2VkUGFuLnkpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0ZXh0dXJlRHJhdykge1xuICAgIHIudGV4dHVyZURyYXdMYXN0RnJhbWUgPSBmYWxzZTtcbiAgfVxuICBpZiAodGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gdHJ1ZTtcbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG4gICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB2YXIgY29udGV4dCA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdGV4dHVyZSA9IHIudGV4dHVyZUNhY2hlLnRleHR1cmU7XG4gICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQ7XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdnAud2lkdGgsIHZwLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH1cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cbiAgdmFyIGV4dGVudCA9IGN5LmV4dGVudCgpO1xuICB2YXIgdnBNYW5pcCA9IHIucGluY2hpbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5zd2lwZVBhbm5pbmcgfHwgci5kYXRhLndoZWVsWm9vbWluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5jeS5hbmltYXRlZCgpO1xuICB2YXIgaGlkZUVkZ2VzID0gci5oaWRlRWRnZXNPblZpZXdwb3J0ICYmIHZwTWFuaXA7XG4gIHZhciBuZWVkTWJDbGVhciA9IFtdO1xuICBuZWVkTWJDbGVhcltyLk5PREVdID0gIW5lZWREcmF3W3IuTk9ERV0gJiYgbW90aW9uQmx1ciAmJiAhci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdIHx8IHIuY2xlYXJpbmdNb3Rpb25CbHVyO1xuICBpZiAobmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IHRydWU7XG4gIH1cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSB0cnVlO1xuICB9XG4gIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IGRyYXdBbGxMYXllcnMgfHwgZHJhd09ubHlOb2RlTGF5ZXIgfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLk5PREVdICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIDogZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgICB2YXIgY2xlYXIgPSBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQ7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcik7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5ub25kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfVxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLmRyYWcpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHIuc2hvd0ZwcyB8fCAhZHJhd09ubHlOb2RlTGF5ZXIgJiYgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSAmJiAhZHJhd0FsbExheWVycykge1xuICAgIHZhciBjb250ZXh0ID0gZm9yY2VkQ29udGV4dCB8fCBkYXRhLmNvbnRleHRzW3IuU0VMRUNUX0JPWF07XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0KTtcbiAgICBpZiAoci5zZWxlY3Rpb25bNF0gPT0gMSAmJiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZykpIHtcbiAgICAgIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gICAgICB2YXIgYm9yZGVyV2lkdGggPSBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCcpLnZhbHVlIC8gem9vbTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMF0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgIGNvbnRleHQuZmlsbFJlY3Qoci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzFdLCByLnNlbGVjdGlvblsyXSAtIHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblszXSAtIHIuc2VsZWN0aW9uWzFdKTtcbiAgICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmJnQWN0aXZlUG9zaXN0aW9uICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gICAgICB2YXIgcG9zID0gZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbjtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVsyXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5hcmMocG9zLngsIHBvcy55LCBzdHlsZS5jb3JlKCdhY3RpdmUtYmctc2l6ZScpLnBmVmFsdWUgLyB6b29tLCAwLCAyICogTWF0aC5QSSk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gICAgdmFyIHRpbWVUb1JlbmRlciA9IHIubGFzdFJlZHJhd1RpbWU7XG4gICAgaWYgKHIuc2hvd0ZwcyAmJiB0aW1lVG9SZW5kZXIpIHtcbiAgICAgIHRpbWVUb1JlbmRlciA9IE1hdGgucm91bmQodGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciBmcHMgPSBNYXRoLnJvdW5kKDEwMDAgLyB0aW1lVG9SZW5kZXIpO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5maWxsVGV4dCgnMSBmcmFtZSA9ICcgKyB0aW1lVG9SZW5kZXIgKyAnIG1zID0gJyArIGZwcyArICcgZnBzJywgMCwgMjApO1xuICAgICAgdmFyIG1heEZwcyA9IDYwO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDMwLCAyNTAsIDIwKTtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMzAsIDI1MCAqIE1hdGgubWluKGZwcyAvIG1heEZwcywgMSksIDIwKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgICBuZWVkRHJhd1tyLlNFTEVDVF9CT1hdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbW90aW9uYmx1cjogYmxpdCByZW5kZXJlZCBibHVycnkgZnJhbWVzXG4gIGlmIChtb3Rpb25CbHVyICYmIG1iUHhSYXRpbyAhPT0gMSkge1xuICAgIHZhciBjeHROb2RlID0gZGF0YS5jb250ZXh0c1tyLk5PREVdO1xuICAgIHZhciB0eHROb2RlID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfTk9ERV07XG4gICAgdmFyIGN4dERyYWcgPSBkYXRhLmNvbnRleHRzW3IuRFJBR107XG4gICAgdmFyIHR4dERyYWcgPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXTtcbiAgICB2YXIgZHJhd01vdGlvbkJsdXIgPSBmdW5jdGlvbiBkcmF3TW90aW9uQmx1cihjeHQsIHR4dCwgbmVlZENsZWFyKSB7XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgaWYgKG5lZWRDbGVhciB8fCAhbW90aW9uQmx1ckZhZGVFZmZlY3QpIHtcbiAgICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYmNsZWFyKGN4dCwgMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdmFyIHB4ciA9IG1iUHhSYXRpbztcbiAgICAgIGN4dC5kcmF3SW1hZ2UodHh0LFxuICAgICAgLy8gaW1nXG4gICAgICAwLCAwLFxuICAgICAgLy8gc3gsIHN5XG4gICAgICByLmNhbnZhc1dpZHRoICogcHhyLCByLmNhbnZhc0hlaWdodCAqIHB4cixcbiAgICAgIC8vIHN3LCBzaFxuICAgICAgMCwgMCxcbiAgICAgIC8vIHgsIHlcbiAgICAgIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0IC8vIHcsIGhcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dE5vZGUsIHR4dE5vZGUsIG5lZWRNYkNsZWFyW3IuTk9ERV0pO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmVlZERyYXdbci5EUkFHXSB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSB7XG4gICAgICBkcmF3TW90aW9uQmx1cihjeHREcmFnLCB0eHREcmFnLCBuZWVkTWJDbGVhcltyLkRSQUddKTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgci5wcmV2Vmlld3BvcnQgPSB2cDtcbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICByLm1vdGlvbkJsdXJDbGVhcmVkID0gdHJ1ZTtcbiAgICByLm1vdGlvbkJsdXIgPSB0cnVlO1xuICB9XG4gIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgci5tb3Rpb25CbHVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5tb3Rpb25CbHVyVGltZW91dCA9IG51bGw7XG4gICAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSA9IGZhbHNlO1xuICAgICAgci5tb3Rpb25CbHVyID0gZmFsc2U7XG4gICAgICByLmNsZWFyaW5nTW90aW9uQmx1ciA9ICF0ZXh0dXJlRHJhdztcbiAgICAgIHIubWJGcmFtZXMgPSAwO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gdHJ1ZTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfSwgbW90aW9uQmx1ckRlbGF5KTtcbiAgfVxuICBpZiAoIWZvcmNlZENvbnRleHQpIHtcbiAgICBjeS5lbWl0KCdyZW5kZXInKTtcbiAgfVxufTtcblxudmFyIENScCQzID0ge307XG5cbi8vIEBPIFBvbHlnb24gZHJhd2luZ1xuQ1JwJDMuZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cykge1xuICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeCArIGhhbGZXICogcG9pbnRzWzBdLCB5ICsgaGFsZkggKiBwb2ludHNbMV0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXSk7XG4gIH1cbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3Um91bmRQb2x5Z29uUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgY29ybmVycy5mb3JFYWNoKGZ1bmN0aW9uIChjb3JuZXIpIHtcbiAgICByZXR1cm4gZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY29udGV4dCwgY29ybmVyKTtcbiAgfSk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG4vLyBSb3VuZCByZWN0YW5nbGUgZHJhd2luZ1xuQ1JwJDMuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IE1hdGgubWluKHJhZGl1cywgaGFsZkhlaWdodCwgaGFsZldpZHRoKTtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgLy8gSm9pbiBsaW5lXG4gIGNvbnRleHQubGluZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSByYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogcmFkaXVzO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICBjb250ZXh0Lm1vdmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSk7XG4gIGNvbnRleHQuYXJjVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHgsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4IC0gaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyTGVuZ3RoID0gY29ybmVycyA9PT0gJ2F1dG8nID8gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkgOiBjb3JuZXJzO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQubW92ZVRvKHggLSBoYWxmV2lkdGggKyBjb3JuZXJMZW5ndGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCAtIGNvcm5lckxlbmd0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCArIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCAtIGNvcm5lckxlbmd0aCwgeSArIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoICsgY29ybmVyTGVuZ3RoLCB5ICsgaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdCYXJyZWxQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgeEJlZ2luID0geCAtIGhhbGZXaWR0aDtcbiAgdmFyIHhFbmQgPSB4ICsgaGFsZldpZHRoO1xuICB2YXIgeUJlZ2luID0geSAtIGhhbGZIZWlnaHQ7XG4gIHZhciB5RW5kID0geSArIGhhbGZIZWlnaHQ7XG4gIHZhciBiYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgd09mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICB2YXIgaE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgdmFyIGN0cmxQdFhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3T2Zmc2V0O1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQubW92ZVRvKHhCZWdpbiwgeUJlZ2luICsgaE9mZnNldCk7XG4gIGNvbnRleHQubGluZVRvKHhCZWdpbiwgeUVuZCAtIGhPZmZzZXQpO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUVuZCwgeEJlZ2luICsgd09mZnNldCwgeUVuZCk7XG4gIGNvbnRleHQubGluZVRvKHhFbmQgLSB3T2Zmc2V0LCB5RW5kKTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kLCB5RW5kIC0gaE9mZnNldCk7XG4gIGNvbnRleHQubGluZVRvKHhFbmQsIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCAtIHdPZmZzZXQsIHlCZWdpbik7XG4gIGNvbnRleHQubGluZVRvKHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbik7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiwgeUJlZ2luICsgaE9mZnNldCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xudmFyIHNpbjAgPSBNYXRoLnNpbigwKTtcbnZhciBjb3MwID0gTWF0aC5jb3MoMCk7XG52YXIgc2luID0ge307XG52YXIgY29zID0ge307XG52YXIgZWxsaXBzZVN0ZXBTaXplID0gTWF0aC5QSSAvIDQwO1xuZm9yICh2YXIgaSA9IDAgKiBNYXRoLlBJOyBpIDwgMiAqIE1hdGguUEk7IGkgKz0gZWxsaXBzZVN0ZXBTaXplKSB7XG4gIHNpbltpXSA9IE1hdGguc2luKGkpO1xuICBjb3NbaV0gPSBNYXRoLmNvcyhpKTtcbn1cbkNScCQzLmRyYXdFbGxpcHNlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgaWYgKGNvbnRleHQuZWxsaXBzZSkge1xuICAgIGNvbnRleHQuZWxsaXBzZShjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDAsIDAsIDIgKiBNYXRoLlBJKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgeFBvcywgeVBvcztcbiAgICB2YXIgcncgPSB3aWR0aCAvIDI7XG4gICAgdmFyIHJoID0gaGVpZ2h0IC8gMjtcbiAgICBmb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgICAgIHhQb3MgPSBjZW50ZXJYIC0gcncgKiBzaW5baV0gKiBzaW4wICsgcncgKiBjb3NbaV0gKiBjb3MwO1xuICAgICAgeVBvcyA9IGNlbnRlclkgKyByaCAqIGNvc1tpXSAqIHNpbjAgKyByaCAqIHNpbltpXSAqIGNvczA7XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyh4UG9zLCB5UG9zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQubGluZVRvKHhQb3MsIHlQb3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLyogZ2xvYmFsIGF0b2IsIEFycmF5QnVmZmVyLCBVaW50OEFycmF5LCBCbG9iICovXG52YXIgQ1JwJDIgPSB7fTtcbkNScCQyLmNyZWF0ZUJ1ZmZlciA9IGZ1bmN0aW9uICh3LCBoKSB7XG4gIHZhciBidWZmZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICBidWZmZXIud2lkdGggPSB3O1xuICBidWZmZXIuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIFtidWZmZXIsIGJ1ZmZlci5nZXRDb250ZXh0KCcyZCcpXTtcbn07XG5DUnAkMi5idWZmZXJDYW52YXNJbWFnZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIHZhciBiYiA9IGVsZXMuYm91bmRpbmdCb3goKTtcbiAgdmFyIGN0clJlY3QgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gb3B0aW9ucy5mdWxsID8gTWF0aC5jZWlsKGJiLncpIDogY3RyUmVjdFsyXTtcbiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi5oKSA6IGN0clJlY3RbM107XG4gIHZhciBzcGVjZE1heERpbXMgPSBudW1iZXIkMShvcHRpb25zLm1heFdpZHRoKSB8fCBudW1iZXIkMShvcHRpb25zLm1heEhlaWdodCk7XG4gIHZhciBweFJhdGlvID0gdGhpcy5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBzY2FsZSA9IDE7XG4gIGlmIChvcHRpb25zLnNjYWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICB3aWR0aCAqPSBvcHRpb25zLnNjYWxlO1xuICAgIGhlaWdodCAqPSBvcHRpb25zLnNjYWxlO1xuICAgIHNjYWxlID0gb3B0aW9ucy5zY2FsZTtcbiAgfSBlbHNlIGlmIChzcGVjZE1heERpbXMpIHtcbiAgICB2YXIgbWF4U2NhbGVXID0gSW5maW5pdHk7XG4gICAgdmFyIG1heFNjYWxlSCA9IEluZmluaXR5O1xuICAgIGlmIChudW1iZXIkMShvcHRpb25zLm1heFdpZHRoKSkge1xuICAgICAgbWF4U2NhbGVXID0gc2NhbGUgKiBvcHRpb25zLm1heFdpZHRoIC8gd2lkdGg7XG4gICAgfVxuICAgIGlmIChudW1iZXIkMShvcHRpb25zLm1heEhlaWdodCkpIHtcbiAgICAgIG1heFNjYWxlSCA9IHNjYWxlICogb3B0aW9ucy5tYXhIZWlnaHQgLyBoZWlnaHQ7XG4gICAgfVxuICAgIHNjYWxlID0gTWF0aC5taW4obWF4U2NhbGVXLCBtYXhTY2FsZUgpO1xuICAgIHdpZHRoICo9IHNjYWxlO1xuICAgIGhlaWdodCAqPSBzY2FsZTtcbiAgfVxuICBpZiAoIXNwZWNkTWF4RGltcykge1xuICAgIHdpZHRoICo9IHB4UmF0aW87XG4gICAgaGVpZ2h0ICo9IHB4UmF0aW87XG4gICAgc2NhbGUgKj0gcHhSYXRpbztcbiAgfVxuICB2YXIgYnVmZkNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgYnVmZkNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICBidWZmQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgYnVmZkNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgYnVmZkNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB2YXIgYnVmZkN4dCA9IGJ1ZmZDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAvLyBSYXN0ZXJpemUgdGhlIGxheWVycywgYnV0IG9ubHkgaWYgY29udGFpbmVyIGhhcyBub256ZXJvIHNpemVcbiAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7XG4gICAgYnVmZkN4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHZhciB6c29ydGVkRWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgICBpZiAob3B0aW9ucy5mdWxsKSB7XG4gICAgICAvLyBkcmF3IHRoZSBmdWxsIGJvdW5kcyBvZiB0aGUgZ3JhcGhcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKC1iYi54MSAqIHNjYWxlLCAtYmIueTEgKiBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgICB0aGlzLmRyYXdFbGVtZW50cyhidWZmQ3h0LCB6c29ydGVkRWxlcyk7XG4gICAgICBidWZmQ3h0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKGJiLngxICogc2NhbGUsIGJiLnkxICogc2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkcmF3IHRoZSBjdXJyZW50IHZpZXdcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICAgICAgeDogcGFuLnggKiBzY2FsZSxcbiAgICAgICAgeTogcGFuLnkgKiBzY2FsZVxuICAgICAgfTtcbiAgICAgIHNjYWxlICo9IGN5Lnpvb20oKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnkpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtdHJhbnNsYXRpb24ueCwgLXRyYW5zbGF0aW9uLnkpO1xuICAgIH1cblxuICAgIC8vIG5lZWQgdG8gZmlsbCBiZyBhdCBlbmQgbGlrZSB0aGlzIGluIG9yZGVyIHRvIGZpbGwgY2xlYXJlZCB0cmFuc3BhcmVudCBwaXhlbHMgaW4ganBnc1xuICAgIGlmIChvcHRpb25zLmJnKSB7XG4gICAgICBidWZmQ3h0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdmVyJztcbiAgICAgIGJ1ZmZDeHQuZmlsbFN0eWxlID0gb3B0aW9ucy5iZztcbiAgICAgIGJ1ZmZDeHQucmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJ1ZmZDeHQuZmlsbCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVmZkNhbnZhcztcbn07XG5mdW5jdGlvbiBiNjRUb0Jsb2IoYjY0LCBtaW1lVHlwZSkge1xuICB2YXIgYnl0ZXMgPSBhdG9iKGI2NCk7XG4gIHZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XG4gIHZhciBidWZmVWludDggPSBuZXcgVWludDhBcnJheShidWZmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZVaW50OFtpXSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBCbG9iKFtidWZmXSwge1xuICAgIHR5cGU6IG1pbWVUeXBlXG4gIH0pO1xufVxuZnVuY3Rpb24gYjY0VXJpVG9CNjQoYjY0dXJpKSB7XG4gIHZhciBpID0gYjY0dXJpLmluZGV4T2YoJywnKTtcbiAgcmV0dXJuIGI2NHVyaS5zdWJzdHIoaSArIDEpO1xufVxuZnVuY3Rpb24gb3V0cHV0KG9wdGlvbnMsIGNhbnZhcywgbWltZVR5cGUpIHtcbiAgdmFyIGdldEI2NFVyaSA9IGZ1bmN0aW9uIGdldEI2NFVyaSgpIHtcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgfTtcbiAgc3dpdGNoIChvcHRpb25zLm91dHB1dCkge1xuICAgIGNhc2UgJ2Jsb2ItcHJvbWlzZSc6XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FudmFzLnRvQmxvYihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgICAgICAgaWYgKGJsb2IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGJsb2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignYGNhbnZhcy50b0Jsb2IoKWAgc2VudCBhIG51bGwgdmFsdWUgaW4gaXRzIGNhbGxiYWNrJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIG1pbWVUeXBlLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgY2FzZSAnYmxvYic6XG4gICAgICByZXR1cm4gYjY0VG9CbG9iKGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKSwgbWltZVR5cGUpO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICByZXR1cm4gYjY0VXJpVG9CNjQoZ2V0QjY0VXJpKCkpO1xuICAgIGNhc2UgJ2Jhc2U2NHVyaSc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBnZXRCNjRVcmkoKTtcbiAgfVxufVxuQ1JwJDIucG5nID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG91dHB1dChvcHRpb25zLCB0aGlzLmJ1ZmZlckNhbnZhc0ltYWdlKG9wdGlvbnMpLCAnaW1hZ2UvcG5nJyk7XG59O1xuQ1JwJDIuanBnID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG91dHB1dChvcHRpb25zLCB0aGlzLmJ1ZmZlckNhbnZhc0ltYWdlKG9wdGlvbnMpLCAnaW1hZ2UvanBlZycpO1xufTtcblxudmFyIENScCQxID0ge307XG5DUnAkMS5ub2RlU2hhcGVJbXBsID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdlbGxpcHNlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdFbGxpcHNlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdQb2x5Z29uUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpO1xuICAgIGNhc2UgJ3JvdW5kLXBvbHlnb24nOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd1JvdW5kUG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzLCBjb3JuZXJzKTtcbiAgICBjYXNlICdyb3VuZHJlY3RhbmdsZSc6XG4gICAgY2FzZSAncm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycyk7XG4gICAgY2FzZSAnY3V0cmVjdGFuZ2xlJzpcbiAgICBjYXNlICdjdXQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdDdXRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycyk7XG4gICAgY2FzZSAnYm90dG9tcm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJzKTtcbiAgICBjYXNlICdiYXJyZWwnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JhcnJlbFBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cbn07XG5cbnZhciBDUiA9IENhbnZhc1JlbmRlcmVyO1xudmFyIENScCA9IENhbnZhc1JlbmRlcmVyLnByb3RvdHlwZTtcbkNScC5DQU5WQVNfTEFZRVJTID0gMztcbi8vXG5DUnAuU0VMRUNUX0JPWCA9IDA7XG5DUnAuRFJBRyA9IDE7XG5DUnAuTk9ERSA9IDI7XG5DUnAuQlVGRkVSX0NPVU5UID0gMztcbi8vXG5DUnAuVEVYVFVSRV9CVUZGRVIgPSAwO1xuQ1JwLk1PVElPTkJMVVJfQlVGRkVSX05PREUgPSAxO1xuQ1JwLk1PVElPTkJMVVJfQlVGRkVSX0RSQUcgPSAyO1xuZnVuY3Rpb24gQ2FudmFzUmVuZGVyZXIob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGF0YSA9IHtcbiAgICBjYW52YXNlczogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjYW52YXNOZWVkc1JlZHJhdzogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBidWZmZXJDYW52YXNlczogbmV3IEFycmF5KENScC5CVUZGRVJfQ09VTlQpLFxuICAgIGJ1ZmZlckNvbnRleHRzOiBuZXcgQXJyYXkoQ1JwLkNBTlZBU19MQVlFUlMpXG4gIH07XG4gIHZhciB0YXBIbE9mZkF0dHIgPSAnLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yJztcbiAgdmFyIHRhcEhsT2ZmU3R5bGUgPSAncmdiYSgwLDAsMCwwKSc7XG4gIHIuZGF0YS5jYW52YXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB2YXIgY29udGFpbmVyU3R5bGUgPSByLmRhdGEuY2FudmFzQ29udGFpbmVyLnN0eWxlO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyLnN0eWxlW3RhcEhsT2ZmQXR0cl0gPSB0YXBIbE9mZlN0eWxlO1xuICBjb250YWluZXJTdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gIGNvbnRhaW5lclN0eWxlLnpJbmRleCA9ICcwJztcbiAgY29udGFpbmVyU3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY3kuY29udGFpbmVyKCk7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyLmRhdGEuY2FudmFzQ29udGFpbmVyKTtcbiAgY29udGFpbmVyLnN0eWxlW3RhcEhsT2ZmQXR0cl0gPSB0YXBIbE9mZlN0eWxlO1xuICB2YXIgc3R5bGVNYXAgPSB7XG4gICAgJy13ZWJraXQtdXNlci1zZWxlY3QnOiAnbm9uZScsXG4gICAgJy1tb3otdXNlci1zZWxlY3QnOiAnLW1vei1ub25lJyxcbiAgICAndXNlci1zZWxlY3QnOiAnbm9uZScsXG4gICAgJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICAnb3V0bGluZS1zdHlsZSc6ICdub25lJ1xuICB9O1xuICBpZiAobXMoKSkge1xuICAgIHN0eWxlTWFwWyctbXMtdG91Y2gtYWN0aW9uJ10gPSAnbm9uZSc7XG4gICAgc3R5bGVNYXBbJ3RvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIHZhciBjYW52YXMgPSByLmRhdGEuY2FudmFzZXNbaV0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHIuZGF0YS5jb250ZXh0c1tpXSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIE9iamVjdC5rZXlzKHN0eWxlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBjYW52YXMuc3R5bGVba10gPSBzdHlsZU1hcFtrXTtcbiAgICB9KTtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgaSk7XG4gICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IFN0cmluZyhDUnAuQ0FOVkFTX0xBWUVSUyAtIGkpO1xuICAgIHIuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbaV0gPSBmYWxzZTtcbiAgfVxuICByLmRhdGEudG9wQ2FudmFzID0gci5kYXRhLmNhbnZhc2VzWzBdO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLk5PREVdLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuTk9ERSArICctbm9kZScpO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLlNFTEVDVF9CT1hdLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuU0VMRUNUX0JPWCArICctc2VsZWN0Ym94Jyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuRFJBR10uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5EUkFHICsgJy1kcmFnJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICByLmRhdGEuYnVmZmVyQ29udGV4dHNbaV0gPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnYnVmZmVyJyArIGkpO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zdHlsZS56SW5kZXggPSBTdHJpbmcoLWkgLSAxKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIC8vci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChyLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0pO1xuICB9XG5cbiAgci5wYXRoc0VuYWJsZWQgPSB0cnVlO1xuICB2YXIgZW1wdHlCYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICB2YXIgZ2V0Qm94Q2VudGVyID0gZnVuY3Rpb24gZ2V0Qm94Q2VudGVyKGJiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IChiYi54MSArIGJiLngyKSAvIDIsXG4gICAgICB5OiAoYmIueTEgKyBiYi55MikgLyAyXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldENlbnRlck9mZnNldCA9IGZ1bmN0aW9uIGdldENlbnRlck9mZnNldChiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtYmIudyAvIDIsXG4gICAgICB5OiAtYmIuaCAvIDJcbiAgICB9O1xuICB9O1xuICB2YXIgYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQgPSBmdW5jdGlvbiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZChlbGUpIHtcbiAgICB2YXIgX3AgPSBlbGVbMF0uX3ByaXZhdGU7XG4gICAgdmFyIHNhbWUgPSBfcC5vbGRCYWNrZ3JvdW5kVGltZXN0YW1wID09PSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIHJldHVybiAhc2FtZTtcbiAgfTtcbiAgdmFyIGdldFN0eWxlS2V5ID0gZnVuY3Rpb24gZ2V0U3R5bGVLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5ub2RlS2V5O1xuICB9O1xuICB2YXIgZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuc291cmNlTGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS50YXJnZXRMYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiBkcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgZmFsc2UsIGZhbHNlLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdMYWJlbCA9IGZ1bmN0aW9uIGRyYXdMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdtYWluJywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3U291cmNlTGFiZWwgPSBmdW5jdGlvbiBkcmF3U291cmNlTGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAnc291cmNlJywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3VGFyZ2V0TGFiZWwgPSBmdW5jdGlvbiBkcmF3VGFyZ2V0TGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAndGFyZ2V0JywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24gZ2V0RWxlbWVudEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmJvZHlCb3VuZHM7XG4gIH07XG4gIHZhciBnZXRMYWJlbEJveCA9IGZ1bmN0aW9uIGdldExhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMubWFpbiB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnNvdXJjZSB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnRhcmdldCB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgaXNMYWJlbFZpc2libGVBdFNjYWxlID0gZnVuY3Rpb24gaXNMYWJlbFZpc2libGVBdFNjYWxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikge1xuICAgIHJldHVybiBzY2FsZWRMYWJlbFNob3duO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRFbGVtZW50Um90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Qm94Q2VudGVyKGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG4gIHZhciBhZGRUZXh0TWFyZ2luID0gZnVuY3Rpb24gYWRkVGV4dE1hcmdpbihwcmVmaXgsIHB0LCBlbGUpIHtcbiAgICB2YXIgcHJlID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHB0LnggKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZSxcbiAgICAgIHk6IHB0LnkgKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZVxuICAgIH07XG4gIH07XG4gIHZhciBnZXRSc1B0ID0gZnVuY3Rpb24gZ2V0UnNQdChlbGUsIHgsIHkpIHtcbiAgICB2YXIgcnMgPSBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHJzW3hdLFxuICAgICAgeTogcnNbeV1cbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCcnLCBnZXRSc1B0KGVsZSwgJ2xhYmVsWCcsICdsYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignc291cmNlJywgZ2V0UnNQdChlbGUsICdzb3VyY2VMYWJlbFgnLCAnc291cmNlTGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJ3RhcmdldCcsIGdldFJzUHQoZWxlLCAndGFyZ2V0TGFiZWxYJywgJ3RhcmdldExhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0RWxlbWVudEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0U291cmNlTGFiZWxCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldFRhcmdldExhYmVsQm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgdmFyIGJiID0gZ2V0TGFiZWxCb3goZWxlKTtcbiAgICB2YXIgcCA9IGdldENlbnRlck9mZnNldChnZXRMYWJlbEJveChlbGUpKTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcC54ID0gLWJiLnc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBwLnggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcC55ID0gLWJiLmg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgcC55ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH07XG4gIHZhciBlbGVUeHJDYWNoZSA9IHIuZGF0YS5lbGVUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFN0eWxlS2V5LFxuICAgIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCxcbiAgICBkcmF3RWxlbWVudDogZHJhd0VsZW1lbnQsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldEVsZW1lbnRCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCxcbiAgICBhbGxvd0VkZ2VUeHJDYWNoaW5nOiBmYWxzZSxcbiAgICBhbGxvd1BhcmVudFR4ckNhY2hpbmc6IGZhbHNlXG4gIH0pO1xuICB2YXIgbGJsVHhyQ2FjaGUgPSByLmRhdGEubGJsVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd0xhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciBzbGJUeHJDYWNoZSA9IHIuZGF0YS5zbGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFNvdXJjZUxhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3U291cmNlTGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFNvdXJjZUxhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIHRsYlR4ckNhY2hlID0gci5kYXRhLnRsYlR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0VGFyZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdUYXJnZXRMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0VGFyZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgbHlyVHhyQ2FjaGUgPSByLmRhdGEubHlyVHhyQ2FjaGUgPSBuZXcgTGF5ZXJlZFRleHR1cmVDYWNoZShyKTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzKGZ1bmN0aW9uIGludmFsaWRhdGVUZXh0dXJlQ2FjaGVzKHdpbGxEcmF3LCBlbGVzKSB7XG4gICAgLy8gZWFjaCBjYWNoZSBzaG91bGQgY2hlY2sgZm9yIHN1Yi1rZXkgZGlmZiB0byBzZWUgdGhhdCB0aGUgdXBkYXRlIGFmZmVjdHMgdGhhdCBjYWNoZSBwYXJ0aWN1bGFybHlcbiAgICBlbGVUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgbGJsVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIHNsYlR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICB0bGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG5cbiAgICAvLyBhbnkgY2hhbmdlIGludmFsaWRhdGVzIHRoZSBsYXllcnNcbiAgICBseXJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIG9sZCBiZyB0aW1lc3RhbXAgc28gZGlmZnMgY2FuIGJlIGRvbmUgaW4gdGhlIGVsZSB0eHIgY2FjaGVzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX3AgPSBlbGVzW19pXS5fcHJpdmF0ZTtcbiAgICAgIF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIH1cbiAgfSk7XG4gIHZhciByZWZpbmVJbkxheWVycyA9IGZ1bmN0aW9uIHJlZmluZUluTGF5ZXJzKHJlcXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGx5clR4ckNhY2hlLmVucXVldWVFbGVtZW50UmVmaW5lbWVudChyZXFzW2ldLmVsZSk7XG4gICAgfVxuICB9O1xuICBlbGVUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBsYmxUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBzbGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICB0bGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xufVxuQ1JwLnJlZHJhd0hpbnQgPSBmdW5jdGlvbiAoZ3JvdXAsIGJvb2wpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBzd2l0Y2ggKGdyb3VwKSB7XG4gICAgY2FzZSAnZWxlcyc6XG4gICAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbQ1JwLk5PREVdID0gYm9vbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RyYWcnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5EUkFHXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5TRUxFQ1RfQk9YXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgfVxufTtcblxuLy8gd2hldGhlciB0byB1c2UgUGF0aDJEIGNhY2hpbmcgZm9yIGRyYXdpbmdcbnZhciBwYXRoc0ltcGxkID0gdHlwZW9mIFBhdGgyRCAhPT0gJ3VuZGVmaW5lZCc7XG5DUnAucGF0aDJkRW5hYmxlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzRW5hYmxlZDtcbiAgfVxuICB0aGlzLnBhdGhzRW5hYmxlZCA9IG9uID8gdHJ1ZSA6IGZhbHNlO1xufTtcbkNScC51c2VQYXRocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBhdGhzSW1wbGQgJiYgdGhpcy5wYXRoc0VuYWJsZWQ7XG59O1xuQ1JwLnNldEltZ1Ntb290aGluZyA9IGZ1bmN0aW9uIChjb250ZXh0LCBib29sKSB7XG4gIGlmIChjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPSBudWxsKSB7XG4gICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgICBjb250ZXh0Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gIH1cbn07XG5DUnAuZ2V0SW1nU21vb3RoaW5nID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9IG51bGwpIHtcbiAgICByZXR1cm4gY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkIHx8IGNvbnRleHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIHx8IGNvbnRleHQubXNJbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gIH1cbn07XG5DUnAubWFrZU9mZnNjcmVlbkNhbnZhcyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBjYW52YXM7XG4gIGlmICgodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKE9mZnNjcmVlbkNhbnZhcykpICE9PSAoXCJ1bmRlZmluZWRcIiApKSB7XG4gICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcztcbn07XG5bQ1JwJGEsIENScCQ5LCBDUnAkOCwgQ1JwJDcsIENScCQ2LCBDUnAkNSwgQ1JwJDQsIENScCQzLCBDUnAkMiwgQ1JwJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChDUnAsIHByb3BzKTtcbn0pO1xuXG52YXIgcmVuZGVyZXIgPSBbe1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxSZW5kZXJlclxufSwge1xuICBuYW1lOiAnYmFzZScsXG4gIGltcGw6IEJSXG59LCB7XG4gIG5hbWU6ICdjYW52YXMnLFxuICBpbXBsOiBDUlxufV07XG5cbnZhciBpbmNFeHRzID0gW3tcbiAgdHlwZTogJ2xheW91dCcsXG4gIGV4dGVuc2lvbnM6IGxheW91dFxufSwge1xuICB0eXBlOiAncmVuZGVyZXInLFxuICBleHRlbnNpb25zOiByZW5kZXJlclxufV07XG5cbi8vIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucyB0byBjeXRvc2NhcGUsIGluZGV4ZWQgYnkgbmFtZVxudmFyIGV4dGVuc2lvbnMgPSB7fTtcblxuLy8gcmVnaXN0ZXJlZCBtb2R1bGVzIGZvciBleHRlbnNpb25zLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBtb2R1bGVzID0ge307XG5mdW5jdGlvbiBzZXRFeHRlbnNpb24odHlwZSwgbmFtZSwgcmVnaXN0cmFudCkge1xuICB2YXIgZXh0ID0gcmVnaXN0cmFudDtcbiAgdmFyIG92ZXJyaWRlRXJyID0gZnVuY3Rpb24gb3ZlcnJpZGVFcnIoZmllbGQpIHtcbiAgICB3YXJuKCdDYW4gbm90IHJlZ2lzdGVyIGAnICsgbmFtZSArICdgIGZvciBgJyArIHR5cGUgKyAnYCBzaW5jZSBgJyArIGZpZWxkICsgJ2AgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb3RvdHlwZSBhbmQgY2FuIG5vdCBiZSBvdmVycmlkZGVuJyk7XG4gIH07XG4gIGlmICh0eXBlID09PSAnY29yZScpIHtcbiAgICBpZiAoQ29yZS5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29yZS5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sbGVjdGlvbicpIHtcbiAgICBpZiAoQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbGF5b3V0Jykge1xuICAgIC8vIGZpbGwgaW4gbWlzc2luZyBsYXlvdXQgZnVuY3Rpb25zIGluIHRoZSBwcm90b3R5cGVcblxuICAgIHZhciBMYXlvdXQgPSBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIHJlZ2lzdHJhbnQuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGxheW91dCBoYXMgX3ByaXZhdGUgZm9yIHVzZSB3LyBzdGQgYXBpcyBsaWtlIC5vbigpXG4gICAgICBpZiAoIXBsYWluT2JqZWN0KHRoaXMuX3ByaXZhdGUpKSB7XG4gICAgICAgIHRoaXMuX3ByaXZhdGUgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ByaXZhdGUuY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdGhpcy5fcHJpdmF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuICAgIH07XG4gICAgdmFyIGxheW91dFByb3RvID0gTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocmVnaXN0cmFudC5wcm90b3R5cGUpO1xuICAgIHZhciBvcHRMYXlvdXRGbnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdExheW91dEZucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuTmFtZSA9IG9wdExheW91dEZuc1tpXTtcbiAgICAgIGxheW91dFByb3RvW2ZuTmFtZV0gPSBsYXlvdXRQcm90b1tmbk5hbWVdIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGVpdGhlciAuc3RhcnQoKSBvciAucnVuKCkgaXMgZGVmaW5lZCwgc28gYXV0b2dlbiB0aGUgb3RoZXJcbiAgICBpZiAobGF5b3V0UHJvdG8uc3RhcnQgJiYgIWxheW91dFByb3RvLnJ1bikge1xuICAgICAgbGF5b3V0UHJvdG8ucnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCFsYXlvdXRQcm90by5zdGFydCAmJiBsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJ1bigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciByZWdTdG9wID0gcmVnaXN0cmFudC5wcm90b3R5cGUuc3RvcDtcbiAgICBsYXlvdXRQcm90by5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0cyAmJiBvcHRzLmFuaW1hdGUpIHtcbiAgICAgICAgdmFyIGFuaXMgPSB0aGlzLmFuaW1hdGlvbnM7XG4gICAgICAgIGlmIChhbmlzKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFuaXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhbmlzW19pXS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVnU3RvcCkge1xuICAgICAgICByZWdTdG9wLmNhbGwodGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgaWYgKCFsYXlvdXRQcm90by5kZXN0cm95KSB7XG4gICAgICBsYXlvdXRQcm90by5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfVxuICAgIGxheW91dFByb3RvLmN5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgfTtcbiAgICB2YXIgZ2V0Q3kgPSBmdW5jdGlvbiBnZXRDeShsYXlvdXQpIHtcbiAgICAgIHJldHVybiBsYXlvdXQuX3ByaXZhdGUuY3k7XG4gICAgfTtcbiAgICB2YXIgZW1pdHRlck9wdHMgPSB7XG4gICAgICBhZGRFdmVudEZpZWxkczogZnVuY3Rpb24gYWRkRXZlbnRGaWVsZHMobGF5b3V0LCBldnQpIHtcbiAgICAgICAgZXZ0LmxheW91dCA9IGxheW91dDtcbiAgICAgICAgZXZ0LmN5ID0gZ2V0Q3kobGF5b3V0KTtcbiAgICAgICAgZXZ0LnRhcmdldCA9IGxheW91dDtcbiAgICAgIH0sXG4gICAgICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQobGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBnZXRDeShsYXlvdXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgZXh0ZW5kKGxheW91dFByb3RvLCB7XG4gICAgICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLl9wcml2YXRlLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0cywgdGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVtaXR0ZXI7XG4gICAgICB9LFxuICAgICAgb246IGZ1bmN0aW9uIG9uKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub24oZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIG9uZTogZnVuY3Rpb24gb25lKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub25lKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub25lKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2dCwgcGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoZXZ0LCBwYXJhbXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWZpbmUuZXZlbnRBbGlhc2VzT24obGF5b3V0UHJvdG8pO1xuICAgIGV4dCA9IExheW91dDsgLy8gcmVwbGFjZSB3aXRoIG91ciB3cmFwcGVkIGxheW91dFxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZW5kZXJlcicgJiYgbmFtZSAhPT0gJ251bGwnICYmIG5hbWUgIT09ICdiYXNlJykge1xuICAgIC8vIHVzZXIgcmVnaXN0ZXJlZCByZW5kZXJlcnMgaW5oZXJpdCBmcm9tIGJhc2VcblxuICAgIHZhciBCYXNlUmVuZGVyZXIgPSBnZXRFeHRlbnNpb24oJ3JlbmRlcmVyJywgJ2Jhc2UnKTtcbiAgICB2YXIgYlByb3RvID0gQmFzZVJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICB2YXIgUmVnaXN0cmFudFJlbmRlcmVyID0gcmVnaXN0cmFudDtcbiAgICB2YXIgclByb3RvID0gcmVnaXN0cmFudC5wcm90b3R5cGU7XG4gICAgdmFyIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIoKSB7XG4gICAgICBCYXNlUmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIFJlZ2lzdHJhbnRSZW5kZXJlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgdmFyIHByb3RvID0gUmVuZGVyZXIucHJvdG90eXBlO1xuICAgIGZvciAodmFyIHBOYW1lIGluIGJQcm90bykge1xuICAgICAgdmFyIHBWYWwgPSBiUHJvdG9bcE5hbWVdO1xuICAgICAgdmFyIGV4aXN0c0luUiA9IHJQcm90b1twTmFtZV0gIT0gbnVsbDtcbiAgICAgIGlmIChleGlzdHNJblIpIHtcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRXJyKHBOYW1lKTtcbiAgICAgIH1cbiAgICAgIHByb3RvW3BOYW1lXSA9IHBWYWw7IC8vIHRha2UgaW1wbCBmcm9tIGJhc2VcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfcE5hbWUgaW4gclByb3RvKSB7XG4gICAgICBwcm90b1tfcE5hbWVdID0gclByb3RvW19wTmFtZV07IC8vIHRha2UgaW1wbCBmcm9tIHJlZ2lzdHJhbnRcbiAgICB9XG5cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnX19wcm90b19fJyB8fCB0eXBlID09PSAnY29uc3RydWN0b3InIHx8IHR5cGUgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICByZXR1cm4gZXJyb3IodHlwZSArICcgaXMgYW4gaWxsZWdhbCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQsIHBvc3NpYmx5IGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvbnMnKTtcbiAgfVxuICByZXR1cm4gc2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdLFxuICAgIHZhbHVlOiBleHRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odHlwZSwgbmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdXG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBnZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV1cbiAgfSk7XG59XG52YXIgZXh0ZW5zaW9uID0gZnVuY3Rpb24gZXh0ZW5zaW9uKCkge1xuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJylcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgeyAuLi4gfSlcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBzZXRFeHRlbnNpb24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnKVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIGdldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsICdub2RlU2hhcGUnLCAnZWxsaXBzZScsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUpIHtcbiAgICByZXR1cm4gc2V0TW9kdWxlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3IoJ0ludmFsaWQgZXh0ZW5zaW9uIGFjY2VzcyBzeW50YXgnKTtcbiAgfVxufTtcblxuLy8gYWxsb3dzIGEgY29yZSBpbnN0YW5jZSB0byBhY2Nlc3MgZXh0ZW5zaW9ucyBpbnRlcm5hbGx5XG5Db3JlLnByb3RvdHlwZS5leHRlbnNpb24gPSBleHRlbnNpb247XG5cbi8vIGluY2x1ZGVkIGV4dGVuc2lvbnNcbmluY0V4dHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgZ3JvdXAuZXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcbiAgICBzZXRFeHRlbnNpb24oZ3JvdXAudHlwZSwgZXh0Lm5hbWUsIGV4dC5pbXBsKTtcbiAgfSk7XG59KTtcblxuLy8gYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlZmVyZW5jZSB0byB0aGUgY29yZVxuLy8gKHVzZWZ1bCBmb3IgaW5pdClcbnZhciBTdHlsZXNoZWV0ID0gZnVuY3Rpb24gU3R5bGVzaGVldCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0eWxlc2hlZXQpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KCk7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcbnZhciBzaGVldGZuID0gU3R5bGVzaGVldC5wcm90b3R5cGU7XG5zaGVldGZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlc2hlZXQnO1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgc2VsZWN0b3IgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLnNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBpID0gdGhpcy5sZW5ndGgrKztcbiAgdGhpc1tpXSA9IHtcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgcHJvcGVydGllczogW11cbiAgfTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBqdXN0IHN0b3JlIHRoZSBwcm9wZXJ0eSB0byBiZSBwYXJzZWQgbGF0ZXJcbnNoZWV0Zm4uY3NzID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpID0gdGhpcy5sZW5ndGggLSAxO1xuICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgdmFyIG1hcCA9IG5hbWU7XG4gICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKG1hcCk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wTmFtZXNbal07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW2tleV07XG4gICAgICBpZiAobWFwVmFsID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcCA9IFN0eWxlLnByb3BlcnRpZXNba2V5XSB8fCBTdHlsZS5wcm9wZXJ0aWVzW2Rhc2gyY2FtZWwoa2V5KV07XG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgdmFyIF92YWx1ZSA9IG1hcFZhbDtcbiAgICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogX25hbWUsXG4gICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnNoZWV0Zm4uc3R5bGUgPSBzaGVldGZuLmNzcztcblxuLy8gZ2VuZXJhdGUgYSByZWFsIHN0eWxlIG9iamVjdCBmcm9tIHRoZSBkdW1teSBzdHlsZXNoZWV0XG5zaGVldGZuLmdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoY3kpIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG9TdHlsZShzdHlsZSk7XG59O1xuXG4vLyBhcHBlbmQgYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCBvbiBhIHJlYWwgc3R5bGUgb2JqZWN0XG5zaGVldGZuLmFwcGVuZFRvU3R5bGUgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGNvbnRleHQuc2VsZWN0b3I7XG4gICAgdmFyIHByb3BzID0gY29udGV4dC5wcm9wZXJ0aWVzO1xuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yKTsgLy8gYXBwbHkgc2VsZWN0b3JcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICBzdHlsZS5jc3MocHJvcC5uYW1lLCBwcm9wLnZhbHVlKTsgLy8gYXBwbHkgcHJvcGVydHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG52YXIgdmVyc2lvbiA9IFwiMy4yOS4yXCI7XG5cbnZhciBjeXRvc2NhcGUgPSBmdW5jdGlvbiBjeXRvc2NhcGUob3B0aW9ucykge1xuICAvLyBpZiBubyBvcHRpb25zIHNwZWNpZmllZCwgdXNlIGRlZmF1bHRcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBpbnN0YW5jZVxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH1cblxuICAvLyBhbGxvdyBmb3IgcmVnaXN0cmF0aW9uIG9mIGV4dGVuc2lvbnNcbiAgZWxzZSBpZiAoc3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbi5hcHBseShleHRlbnNpb24sIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbi8vIGUuZy4gY3l0b3NjYXBlLnVzZSggcmVxdWlyZSgnY3l0b3NjYXBlLWZvbycpLCBiYXIgKVxuY3l0b3NjYXBlLnVzZSA9IGZ1bmN0aW9uIChleHQpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmdzIHRvIHBhc3MgdG8gZXh0XG5cbiAgYXJncy51bnNoaWZ0KGN5dG9zY2FwZSk7IC8vIGN5dG9zY2FwZSBpcyBmaXJzdCBhcmcgdG8gZXh0XG5cbiAgZXh0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5jeXRvc2NhcGUud2FybmluZ3MgPSBmdW5jdGlvbiAoYm9vbCkge1xuICByZXR1cm4gd2FybmluZ3MoYm9vbCk7XG59O1xuXG4vLyByZXBsYWNlZCBieSBidWlsZCBzeXN0ZW1cbmN5dG9zY2FwZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuLy8gZXhwb3NlIHB1YmxpYyBhcGlzIChtb3N0bHkgZm9yIGV4dGVuc2lvbnMpXG5jeXRvc2NhcGUuc3R5bGVzaGVldCA9IGN5dG9zY2FwZS5TdHlsZXNoZWV0ID0gU3R5bGVzaGVldDtcblxuZXhwb3J0IHsgY3l0b3NjYXBlIGFzIGRlZmF1bHQgfTtcbiIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBQZXR0aXR0XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cbiovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBncmFwaGxpYjogcmVxdWlyZShcIi4vbGliL2dyYXBobGliXCIpLFxuXG4gIGxheW91dDogcmVxdWlyZShcIi4vbGliL2xheW91dFwiKSxcbiAgZGVidWc6IHJlcXVpcmUoXCIuL2xpYi9kZWJ1Z1wiKSxcbiAgdXRpbDoge1xuICAgIHRpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLnRpbWUsXG4gICAgbm90aW1lOiByZXF1aXJlKFwiLi9saWIvdXRpbFwiKS5ub3RpbWVcbiAgfSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vbGliL3ZlcnNpb25cIilcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgZ3JlZWR5RkFTID0gcmVxdWlyZShcIi4vZ3JlZWR5LWZhc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICB1bmRvOiB1bmRvXG59O1xuXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgZmFzID0gKGcuZ3JhcGgoKS5hY3ljbGljZXIgPT09IFwiZ3JlZWR5XCJcbiAgICA/IGdyZWVkeUZBUyhnLCB3ZWlnaHRGbihnKSlcbiAgICA6IGRmc0ZBUyhnKSk7XG4gIF8uZm9yRWFjaChmYXMsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7XG4gICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIGxhYmVsLmZvcndhcmROYW1lID0gZS5uYW1lO1xuICAgIGxhYmVsLnJldmVyc2VkID0gdHJ1ZTtcbiAgICBnLnNldEVkZ2UoZS53LCBlLnYsIGxhYmVsLCBfLnVuaXF1ZUlkKFwicmV2XCIpKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gd2VpZ2h0Rm4oZykge1xuICAgIHJldHVybiBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gZy5lZGdlKGUpLndlaWdodDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGRmc0ZBUyhnKSB7XG4gIHZhciBmYXMgPSBbXTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciB2aXNpdGVkID0ge307XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG4gICAgc3RhY2tbdl0gPSB0cnVlO1xuICAgIF8uZm9yRWFjaChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoXy5oYXMoc3RhY2ssIGUudykpIHtcbiAgICAgICAgZmFzLnB1c2goZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZnMoZS53KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWxldGUgc3RhY2tbdl07XG4gIH1cblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gZmFzO1xufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBpZiAobGFiZWwucmV2ZXJzZWQpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcblxuICAgICAgdmFyIGZvcndhcmROYW1lID0gbGFiZWwuZm9yd2FyZE5hbWU7XG4gICAgICBkZWxldGUgbGFiZWwucmV2ZXJzZWQ7XG4gICAgICBkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7XG4gICAgICBnLnNldEVkZ2UoZS53LCBlLnYsIGxhYmVsLCBmb3J3YXJkTmFtZSk7XG4gICAgfVxuICB9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZEJvcmRlclNlZ21lbnRzO1xuXG5mdW5jdGlvbiBhZGRCb3JkZXJTZWdtZW50cyhnKSB7XG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGRmcyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaGFzKG5vZGUsIFwibWluUmFua1wiKSkge1xuICAgICAgbm9kZS5ib3JkZXJMZWZ0ID0gW107XG4gICAgICBub2RlLmJvcmRlclJpZ2h0ID0gW107XG4gICAgICBmb3IgKHZhciByYW5rID0gbm9kZS5taW5SYW5rLCBtYXhSYW5rID0gbm9kZS5tYXhSYW5rICsgMTtcbiAgICAgICAgcmFuayA8IG1heFJhbms7XG4gICAgICAgICsrcmFuaykge1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyTGVmdFwiLCBcIl9ibFwiLCB2LCBub2RlLCByYW5rKTtcbiAgICAgICAgYWRkQm9yZGVyTm9kZShnLCBcImJvcmRlclJpZ2h0XCIsIFwiX2JyXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGRmcyk7XG59XG5cbmZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZywgcHJvcCwgcHJlZml4LCBzZywgc2dOb2RlLCByYW5rKSB7XG4gIHZhciBsYWJlbCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgcmFuazogcmFuaywgYm9yZGVyVHlwZTogcHJvcCB9O1xuICB2YXIgcHJldiA9IHNnTm9kZVtwcm9wXVtyYW5rIC0gMV07XG4gIHZhciBjdXJyID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJib3JkZXJcIiwgbGFiZWwsIHByZWZpeCk7XG4gIHNnTm9kZVtwcm9wXVtyYW5rXSA9IGN1cnI7XG4gIGcuc2V0UGFyZW50KGN1cnIsIHNnKTtcbiAgaWYgKHByZXYpIHtcbiAgICBnLnNldEVkZ2UocHJldiwgY3VyciwgeyB3ZWlnaHQ6IDEgfSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkanVzdDogYWRqdXN0LFxuICB1bmRvOiB1bmRvXG59O1xuXG5mdW5jdGlvbiBhZGp1c3QoZykge1xuICB2YXIgcmFua0RpciA9IGcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFdpZHRoSGVpZ2h0KGcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICB2YXIgcmFua0RpciA9IGcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChyYW5rRGlyID09PSBcImJ0XCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgcmV2ZXJzZVkoZyk7XG4gIH1cblxuICBpZiAocmFua0RpciA9PT0gXCJsclwiIHx8IHJhbmtEaXIgPT09IFwicmxcIikge1xuICAgIHN3YXBYWShnKTtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0KGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsgc3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSk7IH0pO1xufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpIHtcbiAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgYXR0cnMud2lkdGggPSBhdHRycy5oZWlnaHQ7XG4gIGF0dHJzLmhlaWdodCA9IHc7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VZKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXZlcnNlWU9uZShnLm5vZGUodikpOyB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgXy5mb3JFYWNoKGVkZ2UucG9pbnRzLCByZXZlcnNlWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkge1xuICAgICAgcmV2ZXJzZVlPbmUoZWRnZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVlPbmUoYXR0cnMpIHtcbiAgYXR0cnMueSA9IC1hdHRycy55O1xufVxuXG5mdW5jdGlvbiBzd2FwWFkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBYWU9uZShnLm5vZGUodikpOyB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgXy5mb3JFYWNoKGVkZ2UucG9pbnRzLCBzd2FwWFlPbmUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIHN3YXBYWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpIHtcbiAgdmFyIHggPSBhdHRycy54O1xuICBhdHRycy54ID0gYXR0cnMueTtcbiAgYXR0cnMueSA9IHg7XG59XG4iLCIvKlxuICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGZyb20gQ29ybWVuLCBldCBhbC4sXG4gKiBcIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zXCIuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG5mdW5jdGlvbiBMaXN0KCkge1xuICB2YXIgc2VudGluZWwgPSB7fTtcbiAgc2VudGluZWwuX25leHQgPSBzZW50aW5lbC5fcHJldiA9IHNlbnRpbmVsO1xuICB0aGlzLl9zZW50aW5lbCA9IHNlbnRpbmVsO1xufVxuXG5MaXN0LnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsO1xuICB2YXIgZW50cnkgPSBzZW50aW5lbC5fcHJldjtcbiAgaWYgKGVudHJ5ICE9PSBzZW50aW5lbCkge1xuICAgIHVubGluayhlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24oZW50cnkpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIGlmIChlbnRyeS5fcHJldiAmJiBlbnRyeS5fbmV4dCkge1xuICAgIHVubGluayhlbnRyeSk7XG4gIH1cbiAgZW50cnkuX25leHQgPSBzZW50aW5lbC5fbmV4dDtcbiAgc2VudGluZWwuX25leHQuX3ByZXYgPSBlbnRyeTtcbiAgc2VudGluZWwuX25leHQgPSBlbnRyeTtcbiAgZW50cnkuX3ByZXYgPSBzZW50aW5lbDtcbn07XG5cbkxpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHJzID0gW107XG4gIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsO1xuICB2YXIgY3VyciA9IHNlbnRpbmVsLl9wcmV2O1xuICB3aGlsZSAoY3VyciAhPT0gc2VudGluZWwpIHtcbiAgICBzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VyciwgZmlsdGVyT3V0TGlua3MpKTtcbiAgICBjdXJyID0gY3Vyci5fcHJldjtcbiAgfVxuICByZXR1cm4gXCJbXCIgKyBzdHJzLmpvaW4oXCIsIFwiKSArIFwiXVwiO1xufTtcblxuZnVuY3Rpb24gdW5saW5rKGVudHJ5KSB7XG4gIGVudHJ5Ll9wcmV2Ll9uZXh0ID0gZW50cnkuX25leHQ7XG4gIGVudHJ5Ll9uZXh0Ll9wcmV2ID0gZW50cnkuX3ByZXY7XG4gIGRlbGV0ZSBlbnRyeS5fbmV4dDtcbiAgZGVsZXRlIGVudHJ5Ll9wcmV2O1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLCB2KSB7XG4gIGlmIChrICE9PSBcIl9uZXh0XCIgJiYgayAhPT0gXCJfcHJldlwiKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZWJ1Z09yZGVyaW5nOiBkZWJ1Z09yZGVyaW5nXG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKSB7XG4gIHZhciBsYXllck1hdHJpeCA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcblxuICB2YXIgaCA9IG5ldyBHcmFwaCh7IGNvbXBvdW5kOiB0cnVlLCBtdWx0aWdyYXBoOiB0cnVlIH0pLnNldEdyYXBoKHt9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaC5zZXROb2RlKHYsIHsgbGFiZWw6IHYgfSk7XG4gICAgaC5zZXRQYXJlbnQodiwgXCJsYXllclwiICsgZy5ub2RlKHYpLnJhbmspO1xuICB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaC5zZXRFZGdlKGUudiwgZS53LCB7fSwgZS5uYW1lKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGxheWVyTWF0cml4LCBmdW5jdGlvbihsYXllciwgaSkge1xuICAgIHZhciBsYXllclYgPSBcImxheWVyXCIgKyBpO1xuICAgIGguc2V0Tm9kZShsYXllclYsIHsgcmFuazogXCJzYW1lXCIgfSk7XG4gICAgXy5yZWR1Y2UobGF5ZXIsIGZ1bmN0aW9uKHUsIHYpIHtcbiAgICAgIGguc2V0RWRnZSh1LCB2LCB7IHN0eWxlOiBcImludmlzXCIgfSk7XG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGg7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBncmFwaGxpYjtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBncmFwaGxpYiA9IHJlcXVpcmUoXCJncmFwaGxpYlwiKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWdyYXBobGliKSB7XG4gIGdyYXBobGliID0gd2luZG93LmdyYXBobGliO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdyYXBobGliO1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciBMaXN0ID0gcmVxdWlyZShcIi4vZGF0YS9saXN0XCIpO1xuXG4vKlxuICogQSBncmVlZHkgaGV1cmlzdGljIGZvciBmaW5kaW5nIGEgZmVlZGJhY2sgYXJjIHNldCBmb3IgYSBncmFwaC4gQSBmZWVkYmFja1xuICogYXJjIHNldCBpcyBhIHNldCBvZiBlZGdlcyB0aGF0IGNhbiBiZSByZW1vdmVkIHRvIG1ha2UgYSBncmFwaCBhY3ljbGljLlxuICogVGhlIGFsZ29yaXRobSBjb21lcyBmcm9tOiBQLiBFYWRlcywgWC4gTGluLCBhbmQgVy4gRi4gU215dGgsIFwiQSBmYXN0IGFuZFxuICogZWZmZWN0aXZlIGhldXJpc3RpYyBmb3IgdGhlIGZlZWRiYWNrIGFyYyBzZXQgcHJvYmxlbS5cIiBUaGlzIGltcGxlbWVudGF0aW9uXG4gKiBhZGp1c3RzIHRoYXQgZnJvbSB0aGUgcGFwZXIgdG8gYWxsb3cgZm9yIHdlaWdodGVkIGVkZ2VzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGdyZWVkeUZBUztcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZOID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKSB7XG4gIGlmIChnLm5vZGVDb3VudCgpIDw9IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHN0YXRlID0gYnVpbGRTdGF0ZShnLCB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GTik7XG4gIHZhciByZXN1bHRzID0gZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsIHN0YXRlLmJ1Y2tldHMsIHN0YXRlLnplcm9JZHgpO1xuXG4gIC8vIEV4cGFuZCBtdWx0aS1lZGdlc1xuICByZXR1cm4gXy5mbGF0dGVuKF8ubWFwKHJlc3VsdHMsIGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZy5vdXRFZGdlcyhlLnYsIGUudyk7XG4gIH0pLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gZG9HcmVlZHlGQVMoZywgYnVja2V0cywgemVyb0lkeCkge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgc291cmNlcyA9IGJ1Y2tldHNbYnVja2V0cy5sZW5ndGggLSAxXTtcbiAgdmFyIHNpbmtzID0gYnVja2V0c1swXTtcblxuICB2YXIgZW50cnk7XG4gIHdoaWxlIChnLm5vZGVDb3VudCgpKSB7XG4gICAgd2hpbGUgKChlbnRyeSA9IHNpbmtzLmRlcXVldWUoKSkpICAgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIHdoaWxlICgoZW50cnkgPSBzb3VyY2VzLmRlcXVldWUoKSkpIHsgcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSk7IH1cbiAgICBpZiAoZy5ub2RlQ291bnQoKSkge1xuICAgICAgZm9yICh2YXIgaSA9IGJ1Y2tldHMubGVuZ3RoIC0gMjsgaSA+IDA7IC0taSkge1xuICAgICAgICBlbnRyeSA9IGJ1Y2tldHNbaV0uZGVxdWV1ZSgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQocmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgdHJ1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnksIGNvbGxlY3RQcmVkZWNlc3NvcnMpIHtcbiAgdmFyIHJlc3VsdHMgPSBjb2xsZWN0UHJlZGVjZXNzb3JzID8gW10gOiB1bmRlZmluZWQ7XG5cbiAgXy5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSwgZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciB3ZWlnaHQgPSBnLmVkZ2UoZWRnZSk7XG4gICAgdmFyIHVFbnRyeSA9IGcubm9kZShlZGdlLnYpO1xuXG4gICAgaWYgKGNvbGxlY3RQcmVkZWNlc3NvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaCh7IHY6IGVkZ2UudiwgdzogZWRnZS53IH0pO1xuICAgIH1cblxuICAgIHVFbnRyeS5vdXQgLT0gd2VpZ2h0O1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCB1RW50cnkpO1xuICB9KTtcblxuICBfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSwgZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciB3ZWlnaHQgPSBnLmVkZ2UoZWRnZSk7XG4gICAgdmFyIHcgPSBlZGdlLnc7XG4gICAgdmFyIHdFbnRyeSA9IGcubm9kZSh3KTtcbiAgICB3RW50cnlbXCJpblwiXSAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHdFbnRyeSk7XG4gIH0pO1xuXG4gIGcucmVtb3ZlTm9kZShlbnRyeS52KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gYnVpbGRTdGF0ZShnLCB3ZWlnaHRGbikge1xuICB2YXIgZmFzR3JhcGggPSBuZXcgR3JhcGgoKTtcbiAgdmFyIG1heEluID0gMDtcbiAgdmFyIG1heE91dCA9IDA7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGZhc0dyYXBoLnNldE5vZGUodiwgeyB2OiB2LCBcImluXCI6IDAsIG91dDogMCB9KTtcbiAgfSk7XG5cbiAgLy8gQWdncmVnYXRlIHdlaWdodHMgb24gbm9kZXMsIGJ1dCBhbHNvIHN1bSB0aGUgd2VpZ2h0cyBhY3Jvc3MgbXVsdGktZWRnZXNcbiAgLy8gaW50byBhIHNpbmdsZSBlZGdlIGZvciB0aGUgZmFzR3JhcGguXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgcHJldldlaWdodCA9IGZhc0dyYXBoLmVkZ2UoZS52LCBlLncpIHx8IDA7XG4gICAgdmFyIHdlaWdodCA9IHdlaWdodEZuKGUpO1xuICAgIHZhciBlZGdlV2VpZ2h0ID0gcHJldldlaWdodCArIHdlaWdodDtcbiAgICBmYXNHcmFwaC5zZXRFZGdlKGUudiwgZS53LCBlZGdlV2VpZ2h0KTtcbiAgICBtYXhPdXQgPSBNYXRoLm1heChtYXhPdXQsIGZhc0dyYXBoLm5vZGUoZS52KS5vdXQgKz0gd2VpZ2h0KTtcbiAgICBtYXhJbiAgPSBNYXRoLm1heChtYXhJbiwgIGZhc0dyYXBoLm5vZGUoZS53KVtcImluXCJdICArPSB3ZWlnaHQpO1xuICB9KTtcblxuICB2YXIgYnVja2V0cyA9IF8ucmFuZ2UobWF4T3V0ICsgbWF4SW4gKyAzKS5tYXAoZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgTGlzdCgpOyB9KTtcbiAgdmFyIHplcm9JZHggPSBtYXhJbiArIDE7XG5cbiAgXy5mb3JFYWNoKGZhc0dyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgZmFzR3JhcGgubm9kZSh2KSk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGdyYXBoOiBmYXNHcmFwaCwgYnVja2V0czogYnVja2V0cywgemVyb0lkeDogemVyb0lkeCB9O1xufVxuXG5mdW5jdGlvbiBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgZW50cnkpIHtcbiAgaWYgKCFlbnRyeS5vdXQpIHtcbiAgICBidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO1xuICB9IGVsc2UgaWYgKCFlbnRyeVtcImluXCJdKSB7XG4gICAgYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdLmVucXVldWUoZW50cnkpO1xuICB9IGVsc2Uge1xuICAgIGJ1Y2tldHNbZW50cnkub3V0IC0gZW50cnlbXCJpblwiXSArIHplcm9JZHhdLmVucXVldWUoZW50cnkpO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgYWN5Y2xpYyA9IHJlcXVpcmUoXCIuL2FjeWNsaWNcIik7XG52YXIgbm9ybWFsaXplID0gcmVxdWlyZShcIi4vbm9ybWFsaXplXCIpO1xudmFyIHJhbmsgPSByZXF1aXJlKFwiLi9yYW5rXCIpO1xudmFyIG5vcm1hbGl6ZVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5ub3JtYWxpemVSYW5rcztcbnZhciBwYXJlbnREdW1teUNoYWlucyA9IHJlcXVpcmUoXCIuL3BhcmVudC1kdW1teS1jaGFpbnNcIik7XG52YXIgcmVtb3ZlRW1wdHlSYW5rcyA9IHJlcXVpcmUoXCIuL3V0aWxcIikucmVtb3ZlRW1wdHlSYW5rcztcbnZhciBuZXN0aW5nR3JhcGggPSByZXF1aXJlKFwiLi9uZXN0aW5nLWdyYXBoXCIpO1xudmFyIGFkZEJvcmRlclNlZ21lbnRzID0gcmVxdWlyZShcIi4vYWRkLWJvcmRlci1zZWdtZW50c1wiKTtcbnZhciBjb29yZGluYXRlU3lzdGVtID0gcmVxdWlyZShcIi4vY29vcmRpbmF0ZS1zeXN0ZW1cIik7XG52YXIgb3JkZXIgPSByZXF1aXJlKFwiLi9vcmRlclwiKTtcbnZhciBwb3NpdGlvbiA9IHJlcXVpcmUoXCIuL3Bvc2l0aW9uXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gbGF5b3V0O1xuXG5mdW5jdGlvbiBsYXlvdXQoZywgb3B0cykge1xuICB2YXIgdGltZSA9IG9wdHMgJiYgb3B0cy5kZWJ1Z1RpbWluZyA/IHV0aWwudGltZSA6IHV0aWwubm90aW1lO1xuICB0aW1lKFwibGF5b3V0XCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsYXlvdXRHcmFwaCA9IFxuICAgICAgdGltZShcIiAgYnVpbGRMYXlvdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyk7IH0pO1xuICAgIHRpbWUoXCIgIHJ1bkxheW91dFwiLCAgICAgICAgZnVuY3Rpb24oKSB7IHJ1bkxheW91dChsYXlvdXRHcmFwaCwgdGltZSk7IH0pO1xuICAgIHRpbWUoXCIgIHVwZGF0ZUlucHV0R3JhcGhcIiwgZnVuY3Rpb24oKSB7IHVwZGF0ZUlucHV0R3JhcGgoZywgbGF5b3V0R3JhcGgpOyB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkxheW91dChnLCB0aW1lKSB7XG4gIHRpbWUoXCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVsc1wiLCBmdW5jdGlvbigpIHsgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlU2VsZkVkZ2VzXCIsICAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlU2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhY3ljbGljXCIsICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBhY3ljbGljLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLnJ1blwiLCAgICAgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmFua1wiLCAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSk7IH0pO1xuICB0aW1lKFwiICAgIGluamVjdEVkZ2VMYWJlbFByb3hpZXNcIiwgZnVuY3Rpb24oKSB7IGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUVtcHR5UmFua3NcIiwgICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUVtcHR5UmFua3MoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwXCIsICAgZnVuY3Rpb24oKSB7IG5lc3RpbmdHcmFwaC5jbGVhbnVwKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemVSYW5rc1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemVSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYXNzaWduUmFua01pbk1heFwiLCAgICAgICBmdW5jdGlvbigpIHsgYXNzaWduUmFua01pbk1heChnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplLnJ1blwiLCAgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcGFyZW50RHVtbXlDaGFpbnNcIiwgICAgICBmdW5jdGlvbigpIHsgcGFyZW50RHVtbXlDaGFpbnMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkZEJvcmRlclNlZ21lbnRzXCIsICAgICAgZnVuY3Rpb24oKSB7IGFkZEJvcmRlclNlZ21lbnRzKGcpOyB9KTtcbiAgdGltZShcIiAgICBvcmRlclwiLCAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvcmRlcihnKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5zZXJ0U2VsZkVkZ2VzXCIsICAgICAgICBmdW5jdGlvbigpIHsgaW5zZXJ0U2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtXCIsIGZ1bmN0aW9uKCkgeyBjb29yZGluYXRlU3lzdGVtLmFkanVzdChnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25cIiwgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb24oZyk7IH0pO1xuICB0aW1lKFwiICAgIHBvc2l0aW9uU2VsZkVkZ2VzXCIsICAgICAgZnVuY3Rpb24oKSB7IHBvc2l0aW9uU2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVCb3JkZXJOb2Rlc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVCb3JkZXJOb2RlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplLnVuZG9cIiwgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplLnVuZG8oZyk7IH0pO1xuICB0aW1lKFwiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzXCIsICAgZnVuY3Rpb24oKSB7IGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpOyB9KTtcbiAgdGltZShcIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbVwiLCAgIGZ1bmN0aW9uKCkgeyBjb29yZGluYXRlU3lzdGVtLnVuZG8oZyk7IH0pO1xuICB0aW1lKFwiICAgIHRyYW5zbGF0ZUdyYXBoXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IHRyYW5zbGF0ZUdyYXBoKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0c1wiLCAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmV2ZXJzZVBvaW50c1wiLCAgICAgICAgICBmdW5jdGlvbigpIHsgcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWMudW5kb1wiLCAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMudW5kbyhnKTsgfSk7XG59XG5cbi8qXG4gKiBDb3BpZXMgZmluYWwgbGF5b3V0IGluZm9ybWF0aW9uIGZyb20gdGhlIGxheW91dCBncmFwaCBiYWNrIHRvIHRoZSBpbnB1dFxuICogZ3JhcGguIFRoaXMgcHJvY2VzcyBvbmx5IGNvcGllcyB3aGl0ZWxpc3RlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIGxheW91dCBncmFwaFxuICogdG8gdGhlIGlucHV0IGdyYXBoLCBzbyBpdCBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0XG4gKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsIGxheW91dEdyYXBoKSB7XG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGgubm9kZSh2KTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5ub2RlKHYpO1xuXG4gICAgaWYgKGlucHV0TGFiZWwpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuXG4gICAgICBpZiAobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICAgIGlucHV0TGFiZWwud2lkdGggPSBsYXlvdXRMYWJlbC53aWR0aDtcbiAgICAgICAgaW5wdXRMYWJlbC5oZWlnaHQgPSBsYXlvdXRMYWJlbC5oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGlucHV0TGFiZWwgPSBpbnB1dEdyYXBoLmVkZ2UoZSk7XG4gICAgdmFyIGxheW91dExhYmVsID0gbGF5b3V0R3JhcGguZWRnZShlKTtcblxuICAgIGlucHV0TGFiZWwucG9pbnRzID0gbGF5b3V0TGFiZWwucG9pbnRzO1xuICAgIGlmIChfLmhhcyhsYXlvdXRMYWJlbCwgXCJ4XCIpKSB7XG4gICAgICBpbnB1dExhYmVsLnggPSBsYXlvdXRMYWJlbC54O1xuICAgICAgaW5wdXRMYWJlbC55ID0gbGF5b3V0TGFiZWwueTtcbiAgICB9XG4gIH0pO1xuXG4gIGlucHV0R3JhcGguZ3JhcGgoKS53aWR0aCA9IGxheW91dEdyYXBoLmdyYXBoKCkud2lkdGg7XG4gIGlucHV0R3JhcGguZ3JhcGgoKS5oZWlnaHQgPSBsYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodDtcbn1cblxudmFyIGdyYXBoTnVtQXR0cnMgPSBbXCJub2Rlc2VwXCIsIFwiZWRnZXNlcFwiLCBcInJhbmtzZXBcIiwgXCJtYXJnaW54XCIsIFwibWFyZ2lueVwiXTtcbnZhciBncmFwaERlZmF1bHRzID0geyByYW5rc2VwOiA1MCwgZWRnZXNlcDogMjAsIG5vZGVzZXA6IDUwLCByYW5rZGlyOiBcInRiXCIgfTtcbnZhciBncmFwaEF0dHJzID0gW1wiYWN5Y2xpY2VyXCIsIFwicmFua2VyXCIsIFwicmFua2RpclwiLCBcImFsaWduXCJdO1xudmFyIG5vZGVOdW1BdHRycyA9IFtcIndpZHRoXCIsIFwiaGVpZ2h0XCJdO1xudmFyIG5vZGVEZWZhdWx0cyA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xudmFyIGVkZ2VOdW1BdHRycyA9IFtcIm1pbmxlblwiLCBcIndlaWdodFwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwibGFiZWxvZmZzZXRcIl07XG52YXIgZWRnZURlZmF1bHRzID0ge1xuICBtaW5sZW46IDEsIHdlaWdodDogMSwgd2lkdGg6IDAsIGhlaWdodDogMCxcbiAgbGFiZWxvZmZzZXQ6IDEwLCBsYWJlbHBvczogXCJyXCJcbn07XG52YXIgZWRnZUF0dHJzID0gW1wibGFiZWxwb3NcIl07XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGdyYXBoIGZyb20gdGhlIGlucHV0IGdyYXBoLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbGF5b3V0LlxuICogVGhpcyBwcm9jZXNzIGNvcGllcyBvbmx5IHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW5wdXQgZ3JhcGggdG8gdGhlXG4gKiBsYXlvdXQgZ3JhcGguIFRodXMgdGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0XG4gKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LlxuICovXG5mdW5jdGlvbiBidWlsZExheW91dEdyYXBoKGlucHV0R3JhcGgpIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoeyBtdWx0aWdyYXBoOiB0cnVlLCBjb21wb3VuZDogdHJ1ZSB9KTtcbiAgdmFyIGdyYXBoID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZ3JhcGgoKSk7XG5cbiAgZy5zZXRHcmFwaChfLm1lcmdlKHt9LFxuICAgIGdyYXBoRGVmYXVsdHMsXG4gICAgc2VsZWN0TnVtYmVyQXR0cnMoZ3JhcGgsIGdyYXBoTnVtQXR0cnMpLFxuICAgIF8ucGljayhncmFwaCwgZ3JhcGhBdHRycykpKTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ub2RlKHYpKTtcbiAgICBnLnNldE5vZGUodiwgXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLCBub2RlTnVtQXR0cnMpLCBub2RlRGVmYXVsdHMpKTtcbiAgICBnLnNldFBhcmVudCh2LCBpbnB1dEdyYXBoLnBhcmVudCh2KSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO1xuICAgIGcuc2V0RWRnZShlLCBfLm1lcmdlKHt9LFxuICAgICAgZWRnZURlZmF1bHRzLFxuICAgICAgc2VsZWN0TnVtYmVyQXR0cnMoZWRnZSwgZWRnZU51bUF0dHJzKSxcbiAgICAgIF8ucGljayhlZGdlLCBlZGdlQXR0cnMpKSk7XG4gIH0pO1xuXG4gIHJldHVybiBnO1xufVxuXG4vKlxuICogVGhpcyBpZGVhIGNvbWVzIGZyb20gdGhlIEdhbnNuZXIgcGFwZXI6IHRvIGFjY291bnQgZm9yIGVkZ2UgbGFiZWxzIGluIG91clxuICogbGF5b3V0IHdlIHNwbGl0IGVhY2ggcmFuayBpbiBoYWxmIGJ5IGRvdWJsaW5nIG1pbmxlbiBhbmQgaGFsdmluZyByYW5rc2VwLlxuICogVGhlbiB3ZSBjYW4gcGxhY2UgbGFiZWxzIGF0IHRoZXNlIG1pZC1wb2ludHMgYmV0d2VlbiBub2Rlcy5cbiAqXG4gKiBXZSBhbHNvIGFkZCBzb21lIG1pbmltYWwgcGFkZGluZyB0byB0aGUgd2lkdGggdG8gcHVzaCB0aGUgbGFiZWwgZm9yIHRoZSBlZGdlXG4gKiBhd2F5IGZyb20gdGhlIGVkZ2UgaXRzZWxmIGEgYml0LlxuICovXG5mdW5jdGlvbiBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpIHtcbiAgdmFyIGdyYXBoID0gZy5ncmFwaCgpO1xuICBncmFwaC5yYW5rc2VwIC89IDI7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBlZGdlLm1pbmxlbiAqPSAyO1xuICAgIGlmIChlZGdlLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkgIT09IFwiY1wiKSB7XG4gICAgICBpZiAoZ3JhcGgucmFua2RpciA9PT0gXCJUQlwiIHx8IGdyYXBoLnJhbmtkaXIgPT09IFwiQlRcIikge1xuICAgICAgICBlZGdlLndpZHRoICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlLmhlaWdodCArPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qXG4gKiBDcmVhdGVzIHRlbXBvcmFyeSBkdW1teSBub2RlcyB0aGF0IGNhcHR1cmUgdGhlIHJhbmsgaW4gd2hpY2ggZWFjaCBlZGdlJ3NcbiAqIGxhYmVsIGlzIGdvaW5nIHRvLCBpZiBpdCBoYXMgb25lIG9mIG5vbi16ZXJvIHdpZHRoIGFuZCBoZWlnaHQuIFdlIGRvIHRoaXNcbiAqIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZW1vdmUgZW1wdHkgcmFua3Mgd2hpbGUgcHJlc2VydmluZyBiYWxhbmNlIGZvciB0aGVcbiAqIGxhYmVsJ3MgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2Uud2lkdGggJiYgZWRnZS5oZWlnaHQpIHtcbiAgICAgIHZhciB2ID0gZy5ub2RlKGUudik7XG4gICAgICB2YXIgdyA9IGcubm9kZShlLncpO1xuICAgICAgdmFyIGxhYmVsID0geyByYW5rOiAody5yYW5rIC0gdi5yYW5rKSAvIDIgKyB2LnJhbmssIGU6IGUgfTtcbiAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZS1wcm94eVwiLCBsYWJlbCwgXCJfZXBcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKSB7XG4gIHZhciBtYXhSYW5rID0gMDtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmJvcmRlclRvcCkge1xuICAgICAgbm9kZS5taW5SYW5rID0gZy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO1xuICAgICAgbm9kZS5tYXhSYW5rID0gZy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO1xuICAgICAgbWF4UmFuayA9IF8ubWF4KG1heFJhbmssIG5vZGUubWF4UmFuayk7XG4gICAgfVxuICB9KTtcbiAgZy5ncmFwaCgpLm1heFJhbmsgPSBtYXhSYW5rO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmR1bW15ID09PSBcImVkZ2UtcHJveHlcIikge1xuICAgICAgZy5lZGdlKG5vZGUuZSkubGFiZWxSYW5rID0gbm9kZS5yYW5rO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUdyYXBoKGcpIHtcbiAgdmFyIG1pblggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHZhciBtYXhYID0gMDtcbiAgdmFyIG1pblkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHZhciBtYXhZID0gMDtcbiAgdmFyIGdyYXBoTGFiZWwgPSBnLmdyYXBoKCk7XG4gIHZhciBtYXJnaW5YID0gZ3JhcGhMYWJlbC5tYXJnaW54IHx8IDA7XG4gIHZhciBtYXJnaW5ZID0gZ3JhcGhMYWJlbC5tYXJnaW55IHx8IDA7XG5cbiAgZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpIHtcbiAgICB2YXIgeCA9IGF0dHJzLng7XG4gICAgdmFyIHkgPSBhdHRycy55O1xuICAgIHZhciB3ID0gYXR0cnMud2lkdGg7XG4gICAgdmFyIGggPSBhdHRycy5oZWlnaHQ7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHggLSB3IC8gMik7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHggKyB3IC8gMik7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkgLSBoIC8gMik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkgKyBoIC8gMik7XG4gIH1cblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IGdldEV4dHJlbWVzKGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgZ2V0RXh0cmVtZXMoZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICBtaW5YIC09IG1hcmdpblg7XG4gIG1pblkgLT0gbWFyZ2luWTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgbm9kZS54IC09IG1pblg7XG4gICAgbm9kZS55IC09IG1pblk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIGZ1bmN0aW9uKHApIHtcbiAgICAgIHAueCAtPSBtaW5YO1xuICAgICAgcC55IC09IG1pblk7XG4gICAgfSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkgeyBlZGdlLnggLT0gbWluWDsgfVxuICAgIGlmIChfLmhhcyhlZGdlLCBcInlcIikpIHsgZWRnZS55IC09IG1pblk7IH1cbiAgfSk7XG5cbiAgZ3JhcGhMYWJlbC53aWR0aCA9IG1heFggLSBtaW5YICsgbWFyZ2luWDtcbiAgZ3JhcGhMYWJlbC5oZWlnaHQgPSBtYXhZIC0gbWluWSArIG1hcmdpblk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIHZhciBub2RlViA9IGcubm9kZShlLnYpO1xuICAgIHZhciBub2RlVyA9IGcubm9kZShlLncpO1xuICAgIHZhciBwMSwgcDI7XG4gICAgaWYgKCFlZGdlLnBvaW50cykge1xuICAgICAgZWRnZS5wb2ludHMgPSBbXTtcbiAgICAgIHAxID0gbm9kZVc7XG4gICAgICBwMiA9IG5vZGVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBwMSA9IGVkZ2UucG9pbnRzWzBdO1xuICAgICAgcDIgPSBlZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYsIHAxKSk7XG4gICAgZWRnZS5wb2ludHMucHVzaCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVcsIHAyKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBpZiAoZWRnZS5sYWJlbHBvcyA9PT0gXCJsXCIgfHwgZWRnZS5sYWJlbHBvcyA9PT0gXCJyXCIpIHtcbiAgICAgICAgZWRnZS53aWR0aCAtPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlZGdlLmxhYmVscG9zKSB7XG4gICAgICBjYXNlIFwibFwiOiBlZGdlLnggLT0gZWRnZS53aWR0aCAvIDIgKyBlZGdlLmxhYmVsb2Zmc2V0OyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGVkZ2UueCArPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLnJldmVyc2VkKSB7XG4gICAgICBlZGdlLnBvaW50cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGcuY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICAgIHZhciB0ID0gZy5ub2RlKG5vZGUuYm9yZGVyVG9wKTtcbiAgICAgIHZhciBiID0gZy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKTtcbiAgICAgIHZhciBsID0gZy5ub2RlKF8ubGFzdChub2RlLmJvcmRlckxlZnQpKTtcbiAgICAgIHZhciByID0gZy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7XG5cbiAgICAgIG5vZGUud2lkdGggPSBNYXRoLmFicyhyLnggLSBsLngpO1xuICAgICAgbm9kZS5oZWlnaHQgPSBNYXRoLmFicyhiLnkgLSB0LnkpO1xuICAgICAgbm9kZS54ID0gbC54ICsgbm9kZS53aWR0aCAvIDI7XG4gICAgICBub2RlLnkgPSB0LnkgKyBub2RlLmhlaWdodCAvIDI7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS52ID09PSBlLncpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKGUudik7XG4gICAgICBpZiAoIW5vZGUuc2VsZkVkZ2VzKSB7XG4gICAgICAgIG5vZGUuc2VsZkVkZ2VzID0gW107XG4gICAgICB9XG4gICAgICBub2RlLnNlbGZFZGdlcy5wdXNoKHsgZTogZSwgbGFiZWw6IGcuZWRnZShlKSB9KTtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZykge1xuICB2YXIgbGF5ZXJzID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICBfLmZvckVhY2gobGF5ZXJzLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBvcmRlclNoaWZ0ID0gMDtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgbm9kZS5vcmRlciA9IGkgKyBvcmRlclNoaWZ0O1xuICAgICAgXy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLCBmdW5jdGlvbihzZWxmRWRnZSkge1xuICAgICAgICB1dGlsLmFkZER1bW15Tm9kZShnLCBcInNlbGZlZGdlXCIsIHtcbiAgICAgICAgICB3aWR0aDogc2VsZkVkZ2UubGFiZWwud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBzZWxmRWRnZS5sYWJlbC5oZWlnaHQsXG4gICAgICAgICAgcmFuazogbm9kZS5yYW5rLFxuICAgICAgICAgIG9yZGVyOiBpICsgKCsrb3JkZXJTaGlmdCksXG4gICAgICAgICAgZTogc2VsZkVkZ2UuZSxcbiAgICAgICAgICBsYWJlbDogc2VsZkVkZ2UubGFiZWxcbiAgICAgICAgfSwgXCJfc2VcIik7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBub2RlLnNlbGZFZGdlcztcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmR1bW15ID09PSBcInNlbGZlZGdlXCIpIHtcbiAgICAgIHZhciBzZWxmTm9kZSA9IGcubm9kZShub2RlLmUudik7XG4gICAgICB2YXIgeCA9IHNlbGZOb2RlLnggKyBzZWxmTm9kZS53aWR0aCAvIDI7XG4gICAgICB2YXIgeSA9IHNlbGZOb2RlLnk7XG4gICAgICB2YXIgZHggPSBub2RlLnggLSB4O1xuICAgICAgdmFyIGR5ID0gc2VsZk5vZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGcuc2V0RWRnZShub2RlLmUsIG5vZGUubGFiZWwpO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgICAgbm9kZS5sYWJlbC5wb2ludHMgPSBbXG4gICAgICAgIHsgeDogeCArIDIgKiBkeCAvIDMsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5IC0gZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgICAgIGR4ICAgICwgeTogeSB9LFxuICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5ICsgZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSArIGR5IH1cbiAgICAgIF07XG4gICAgICBub2RlLmxhYmVsLnggPSBub2RlLng7XG4gICAgICBub2RlLmxhYmVsLnkgPSBub2RlLnk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TnVtYmVyQXR0cnMob2JqLCBhdHRycykge1xuICByZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaiwgYXR0cnMpLCBOdW1iZXIpO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpIHtcbiAgdmFyIG5ld0F0dHJzID0ge307XG4gIF8uZm9yRWFjaChhdHRycywgZnVuY3Rpb24odiwgaykge1xuICAgIG5ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV0gPSB2O1xuICB9KTtcbiAgcmV0dXJuIG5ld0F0dHJzO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lRGVlcDogcmVxdWlyZShcImxvZGFzaC9jbG9uZURlZXBcIiksXG4gICAgICBjb25zdGFudDogcmVxdWlyZShcImxvZGFzaC9jb25zdGFudFwiKSxcbiAgICAgIGRlZmF1bHRzOiByZXF1aXJlKFwibG9kYXNoL2RlZmF1bHRzXCIpLFxuICAgICAgZWFjaDogcmVxdWlyZShcImxvZGFzaC9lYWNoXCIpLFxuICAgICAgZmlsdGVyOiByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKSxcbiAgICAgIGZpbmQ6IHJlcXVpcmUoXCJsb2Rhc2gvZmluZFwiKSxcbiAgICAgIGZsYXR0ZW46IHJlcXVpcmUoXCJsb2Rhc2gvZmxhdHRlblwiKSxcbiAgICAgIGZvckVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZm9yRWFjaFwiKSxcbiAgICAgIGZvckluOiByZXF1aXJlKFwibG9kYXNoL2ZvckluXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGxhc3Q6IHJlcXVpcmUoXCJsb2Rhc2gvbGFzdFwiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICBtYXBWYWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwVmFsdWVzXCIpLFxuICAgICAgbWF4OiByZXF1aXJlKFwibG9kYXNoL21heFwiKSxcbiAgICAgIG1lcmdlOiByZXF1aXJlKFwibG9kYXNoL21lcmdlXCIpLFxuICAgICAgbWluOiByZXF1aXJlKFwibG9kYXNoL21pblwiKSxcbiAgICAgIG1pbkJ5OiByZXF1aXJlKFwibG9kYXNoL21pbkJ5XCIpLFxuICAgICAgbm93OiByZXF1aXJlKFwibG9kYXNoL25vd1wiKSxcbiAgICAgIHBpY2s6IHJlcXVpcmUoXCJsb2Rhc2gvcGlja1wiKSxcbiAgICAgIHJhbmdlOiByZXF1aXJlKFwibG9kYXNoL3JhbmdlXCIpLFxuICAgICAgcmVkdWNlOiByZXF1aXJlKFwibG9kYXNoL3JlZHVjZVwiKSxcbiAgICAgIHNvcnRCeTogcmVxdWlyZShcImxvZGFzaC9zb3J0QnlcIiksXG4gICAgICB1bmlxdWVJZDogcmVxdWlyZShcImxvZGFzaC91bmlxdWVJZFwiKSxcbiAgICAgIHZhbHVlczogcmVxdWlyZShcImxvZGFzaC92YWx1ZXNcIiksXG4gICAgICB6aXBPYmplY3Q6IHJlcXVpcmUoXCJsb2Rhc2gvemlwT2JqZWN0XCIpLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgY2xlYW51cDogY2xlYW51cFxufTtcblxuLypcbiAqIEEgbmVzdGluZyBncmFwaCBjcmVhdGVzIGR1bW15IG5vZGVzIGZvciB0aGUgdG9wcyBhbmQgYm90dG9tcyBvZiBzdWJncmFwaHMsXG4gKiBhZGRzIGFwcHJvcHJpYXRlIGVkZ2VzIHRvIGVuc3VyZSB0aGF0IGFsbCBjbHVzdGVyIG5vZGVzIGFyZSBwbGFjZWQgYmV0d2VlblxuICogdGhlc2UgYm91bmRyaWVzLCBhbmQgZW5zdXJlcyB0aGF0IHRoZSBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gd2UgZW5zdXJlLCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIG1pbmxlbiBwcm9wZXJ0eSwgdGhhdCBub2Rlc1xuICogYW5kIHN1YmdyYXBoIGJvcmRlciBub2RlcyB0byBub3QgZW5kIHVwIG9uIHRoZSBzYW1lIHJhbmsuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gTm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhcyBhIG1pbmxlbiBhdHRyaWJ1dGVcbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocy5cbiAqICAgIDMuIFRoZSBtaW5sZW4gYXR0cmlidXRlIGZvciBub2RlcyBpcyBhZGp1c3RlZCB0byBlbnN1cmUgbm9kZXMgZG8gbm90XG4gKiAgICAgICBnZXQgcGxhY2VkIG9uIHRoZSBzYW1lIHJhbmsgYXMgc3ViZ3JhcGggYm9yZGVyIG5vZGVzLlxuICpcbiAqIFRoZSBuZXN0aW5nIGdyYXBoIGlkZWEgY29tZXMgZnJvbSBTYW5kZXIsIFwiTGF5b3V0IG9mIENvbXBvdW5kIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgdmFyIHJvb3QgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcInJvb3RcIiwge30sIFwiX3Jvb3RcIik7XG4gIHZhciBkZXB0aHMgPSB0cmVlRGVwdGhzKGcpO1xuICB2YXIgaGVpZ2h0ID0gXy5tYXgoXy52YWx1ZXMoZGVwdGhzKSkgLSAxOyAvLyBOb3RlOiBkZXB0aHMgaXMgYW4gT2JqZWN0IG5vdCBhbiBhcnJheVxuICB2YXIgbm9kZVNlcCA9IDIgKiBoZWlnaHQgKyAxO1xuXG4gIGcuZ3JhcGgoKS5uZXN0aW5nUm9vdCA9IHJvb3Q7XG5cbiAgLy8gTXVsdGlwbHkgbWlubGVuIGJ5IG5vZGVTZXAgdG8gYWxpZ24gbm9kZXMgb24gbm9uLWJvcmRlciByYW5rcy5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBnLmVkZ2UoZSkubWlubGVuICo9IG5vZGVTZXA7IH0pO1xuXG4gIC8vIENhbGN1bGF0ZSBhIHdlaWdodCB0aGF0IGlzIHN1ZmZpY2llbnQgdG8ga2VlcCBzdWJncmFwaHMgdmVydGljYWxseSBjb21wYWN0XG4gIHZhciB3ZWlnaHQgPSBzdW1XZWlnaHRzKGcpICsgMTtcblxuICAvLyBDcmVhdGUgYm9yZGVyIG5vZGVzIGFuZCBsaW5rIHRoZW0gdXBcbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuICB9KTtcblxuICAvLyBTYXZlIHRoZSBtdWx0aXBsaWVyIGZvciBub2RlIGxheWVycyBmb3IgbGF0ZXIgcmVtb3ZhbCBvZiBlbXB0eSBib3JkZXJcbiAgLy8gbGF5ZXJzLlxuICBnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3IgPSBub2RlU2VwO1xufVxuXG5mdW5jdGlvbiBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgdikge1xuICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmICh2ICE9PSByb290KSB7XG4gICAgICBnLnNldEVkZ2Uocm9vdCwgdiwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogbm9kZVNlcCB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRvcCA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9idFwiKTtcbiAgdmFyIGJvdHRvbSA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9iYlwiKTtcbiAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuXG4gIGcuc2V0UGFyZW50KHRvcCwgdik7XG4gIGxhYmVsLmJvcmRlclRvcCA9IHRvcDtcbiAgZy5zZXRQYXJlbnQoYm90dG9tLCB2KTtcbiAgbGFiZWwuYm9yZGVyQm90dG9tID0gYm90dG9tO1xuXG4gIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuXG4gICAgdmFyIGNoaWxkTm9kZSA9IGcubm9kZShjaGlsZCk7XG4gICAgdmFyIGNoaWxkVG9wID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IGNoaWxkTm9kZS5ib3JkZXJUb3AgOiBjaGlsZDtcbiAgICB2YXIgY2hpbGRCb3R0b20gPSBjaGlsZE5vZGUuYm9yZGVyQm90dG9tID8gY2hpbGROb2RlLmJvcmRlckJvdHRvbSA6IGNoaWxkO1xuICAgIHZhciB0aGlzV2VpZ2h0ID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IHdlaWdodCA6IDIgKiB3ZWlnaHQ7XG4gICAgdmFyIG1pbmxlbiA9IGNoaWxkVG9wICE9PSBjaGlsZEJvdHRvbSA/IDEgOiBoZWlnaHQgLSBkZXB0aHNbdl0gKyAxO1xuXG4gICAgZy5zZXRFZGdlKHRvcCwgY2hpbGRUb3AsIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcblxuICAgIGcuc2V0RWRnZShjaGlsZEJvdHRvbSwgYm90dG9tLCB7XG4gICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsXG4gICAgICBtaW5sZW46IG1pbmxlbixcbiAgICAgIG5lc3RpbmdFZGdlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmICghZy5wYXJlbnQodikpIHtcbiAgICBnLnNldEVkZ2Uocm9vdCwgdG9wLCB7IHdlaWdodDogMCwgbWlubGVuOiBoZWlnaHQgKyBkZXB0aHNbdl0gfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJlZURlcHRocyhnKSB7XG4gIHZhciBkZXB0aHMgPSB7fTtcbiAgZnVuY3Rpb24gZGZzKHYsIGRlcHRoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGRmcyhjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZXB0aHNbdl0gPSBkZXB0aDtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbih2KSB7IGRmcyh2LCAxKTsgfSk7XG4gIHJldHVybiBkZXB0aHM7XG59XG5cbmZ1bmN0aW9uIHN1bVdlaWdodHMoZykge1xuICByZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLCBmdW5jdGlvbihhY2MsIGUpIHtcbiAgICByZXR1cm4gYWNjICsgZy5lZGdlKGUpLndlaWdodDtcbiAgfSwgMCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXAoZykge1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgZy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO1xuICBkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLm5lc3RpbmdFZGdlKSB7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgfVxuICB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICB1bmRvOiB1bmRvXG59O1xuXG4vKlxuICogQnJlYWtzIGFueSBsb25nIGVkZ2VzIGluIHRoZSBncmFwaCBpbnRvIHNob3J0IHNlZ21lbnRzIHRoYXQgc3BhbiAxIGxheWVyXG4gKiBlYWNoLiBUaGlzIG9wZXJhdGlvbiBpcyB1bmRvYWJsZSB3aXRoIHRoZSBkZW5vcm1hbGl6ZSBmdW5jdGlvbi5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggaXMgYSBEQUcuXG4gKiAgICAyLiBFYWNoIG5vZGUgaW4gdGhlIGdyYXBoIGhhcyBhIFwicmFua1wiIHByb3BlcnR5LlxuICpcbiAqIFBvc3QtY29uZGl0aW9uOlxuICpcbiAqICAgIDEuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggaGF2ZSBhIGxlbmd0aCBvZiAxLlxuICogICAgMi4gRHVtbXkgbm9kZXMgYXJlIGFkZGVkIHdoZXJlIGVkZ2VzIGhhdmUgYmVlbiBzcGxpdCBpbnRvIHNlZ21lbnRzLlxuICogICAgMy4gVGhlIGdyYXBoIGlzIGF1Z21lbnRlZCB3aXRoIGEgXCJkdW1teUNoYWluc1wiIGF0dHJpYnV0ZSB3aGljaCBjb250YWluc1xuICogICAgICAgdGhlIGZpcnN0IGR1bW15IGluIGVhY2ggY2hhaW4gb2YgZHVtbXkgbm9kZXMgcHJvZHVjZWQuXG4gKi9cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIGcuZ3JhcGgoKS5kdW1teUNoYWlucyA9IFtdO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7IG5vcm1hbGl6ZUVkZ2UoZywgZWRnZSk7IH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsIGUpIHtcbiAgdmFyIHYgPSBlLnY7XG4gIHZhciB2UmFuayA9IGcubm9kZSh2KS5yYW5rO1xuICB2YXIgdyA9IGUudztcbiAgdmFyIHdSYW5rID0gZy5ub2RlKHcpLnJhbms7XG4gIHZhciBuYW1lID0gZS5uYW1lO1xuICB2YXIgZWRnZUxhYmVsID0gZy5lZGdlKGUpO1xuICB2YXIgbGFiZWxSYW5rID0gZWRnZUxhYmVsLmxhYmVsUmFuaztcblxuICBpZiAod1JhbmsgPT09IHZSYW5rICsgMSkgcmV0dXJuO1xuXG4gIGcucmVtb3ZlRWRnZShlKTtcblxuICB2YXIgZHVtbXksIGF0dHJzLCBpO1xuICBmb3IgKGkgPSAwLCArK3ZSYW5rOyB2UmFuayA8IHdSYW5rOyArK2ksICsrdlJhbmspIHtcbiAgICBlZGdlTGFiZWwucG9pbnRzID0gW107XG4gICAgYXR0cnMgPSB7XG4gICAgICB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICAgICAgZWRnZUxhYmVsOiBlZGdlTGFiZWwsIGVkZ2VPYmo6IGUsXG4gICAgICByYW5rOiB2UmFua1xuICAgIH07XG4gICAgZHVtbXkgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImVkZ2VcIiwgYXR0cnMsIFwiX2RcIik7XG4gICAgaWYgKHZSYW5rID09PSBsYWJlbFJhbmspIHtcbiAgICAgIGF0dHJzLndpZHRoID0gZWRnZUxhYmVsLndpZHRoO1xuICAgICAgYXR0cnMuaGVpZ2h0ID0gZWRnZUxhYmVsLmhlaWdodDtcbiAgICAgIGF0dHJzLmR1bW15ID0gXCJlZGdlLWxhYmVsXCI7XG4gICAgICBhdHRycy5sYWJlbHBvcyA9IGVkZ2VMYWJlbC5sYWJlbHBvcztcbiAgICB9XG4gICAgZy5zZXRFZGdlKHYsIGR1bW15LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zLnB1c2goZHVtbXkpO1xuICAgIH1cbiAgICB2ID0gZHVtbXk7XG4gIH1cblxuICBnLnNldEVkZ2UodiwgdywgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIG9yaWdMYWJlbCA9IG5vZGUuZWRnZUxhYmVsO1xuICAgIHZhciB3O1xuICAgIGcuc2V0RWRnZShub2RlLmVkZ2VPYmosIG9yaWdMYWJlbCk7XG4gICAgd2hpbGUgKG5vZGUuZHVtbXkpIHtcbiAgICAgIHcgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBvcmlnTGFiZWwucG9pbnRzLnB1c2goeyB4OiBub2RlLngsIHk6IG5vZGUueSB9KTtcbiAgICAgIGlmIChub2RlLmR1bW15ID09PSBcImVkZ2UtbGFiZWxcIikge1xuICAgICAgICBvcmlnTGFiZWwueCA9IG5vZGUueDtcbiAgICAgICAgb3JpZ0xhYmVsLnkgPSBub2RlLnk7XG4gICAgICAgIG9yaWdMYWJlbC53aWR0aCA9IG5vZGUud2lkdGg7XG4gICAgICAgIG9yaWdMYWJlbC5oZWlnaHQgPSBub2RlLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIHYgPSB3O1xuICAgICAgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZFN1YmdyYXBoQ29uc3RyYWludHM7XG5cbmZ1bmN0aW9uIGFkZFN1YmdyYXBoQ29uc3RyYWludHMoZywgY2csIHZzKSB7XG4gIHZhciBwcmV2ID0ge30sXG4gICAgcm9vdFByZXY7XG5cbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGNoaWxkID0gZy5wYXJlbnQodiksXG4gICAgICBwYXJlbnQsXG4gICAgICBwcmV2Q2hpbGQ7XG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBwYXJlbnQgPSBnLnBhcmVudChjaGlsZCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZbcGFyZW50XTtcbiAgICAgICAgcHJldltwYXJlbnRdID0gY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2Q2hpbGQgPSByb290UHJldjtcbiAgICAgICAgcm9vdFByZXYgPSBjaGlsZDtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2Q2hpbGQgJiYgcHJldkNoaWxkICE9PSBjaGlsZCkge1xuICAgICAgICBjZy5zZXRFZGdlKHByZXZDaGlsZCwgY2hpbGQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZCA9IHBhcmVudDtcbiAgICB9XG4gIH0pO1xuXG4gIC8qXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdiA/IGcuY2hpbGRyZW4odikgOiBnLmNoaWxkcmVuKCk7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICBzdWJncmFwaHMgPSBbXTtcbiAgICAgIF8uZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkTWluID0gZGZzKGNoaWxkKTtcbiAgICAgICAgaWYgKGcuY2hpbGRyZW4oY2hpbGQpLmxlbmd0aCkge1xuICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHsgdjogY2hpbGQsIG9yZGVyOiBjaGlsZE1pbiB9KTtcbiAgICAgICAgfVxuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGNoaWxkTWluKTtcbiAgICAgIH0pO1xuICAgICAgXy5yZWR1Y2UoXy5zb3J0Qnkoc3ViZ3JhcGhzLCBcIm9yZGVyXCIpLCBmdW5jdGlvbihwcmV2LCBjdXJyKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldi52LCBjdXJyLnYpO1xuICAgICAgICByZXR1cm4gY3VycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgcmV0dXJuIGcubm9kZSh2KS5vcmRlcjtcbiAgfVxuICBkZnModW5kZWZpbmVkKTtcbiAgKi9cbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXJ5Y2VudGVyO1xuXG5mdW5jdGlvbiBiYXJ5Y2VudGVyKGcsIG1vdmFibGUpIHtcbiAgcmV0dXJuIF8ubWFwKG1vdmFibGUsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgaW5WID0gZy5pbkVkZ2VzKHYpO1xuICAgIGlmICghaW5WLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdjogdiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gXy5yZWR1Y2UoaW5WLCBmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSksXG4gICAgICAgICAgbm9kZVUgPSBnLm5vZGUoZS52KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW06IGFjYy5zdW0gKyAoZWRnZS53ZWlnaHQgKiBub2RlVS5vcmRlciksXG4gICAgICAgICAgd2VpZ2h0OiBhY2Mud2VpZ2h0ICsgZWRnZS53ZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH0sIHsgc3VtOiAwLCB3ZWlnaHQ6IDAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHY6IHYsXG4gICAgICAgIGJhcnljZW50ZXI6IHJlc3VsdC5zdW0gLyByZXN1bHQud2VpZ2h0LFxuICAgICAgICB3ZWlnaHQ6IHJlc3VsdC53ZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkTGF5ZXJHcmFwaDtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBncmFwaCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNvcnQgYSBsYXllciBvZiBub2Rlcy4gVGhlIGdyYXBoIHdpbGxcbiAqIGNvbnRhaW4gYWxsIGJhc2UgYW5kIHN1YmdyYXBoIG5vZGVzIGZyb20gdGhlIHJlcXVlc3QgbGF5ZXIgaW4gdGhlaXIgb3JpZ2luYWxcbiAqIGhpZXJhcmNoeSBhbmQgYW55IGVkZ2VzIHRoYXQgYXJlIGluY2lkZW50IG9uIHRoZXNlIG5vZGVzIGFuZCBhcmUgb2YgdGhlIHR5cGVcbiAqIHJlcXVlc3RlZCBieSB0aGUgXCJyZWxhdGlvbnNoaXBcIiBwYXJhbWV0ZXIuXG4gKlxuICogTm9kZXMgZnJvbSB0aGUgcmVxdWVzdGVkIHJhbmsgdGhhdCBkbyBub3QgaGF2ZSBwYXJlbnRzIGFyZSBhc3NpZ25lZCBhIHJvb3RcbiAqIG5vZGUgaW4gdGhlIG91dHB1dCBncmFwaCwgd2hpY2ggaXMgc2V0IGluIHRoZSByb290IGdyYXBoIGF0dHJpYnV0ZS4gVGhpc1xuICogbWFrZXMgaXQgZWFzeSB0byB3YWxrIHRoZSBoaWVyYXJjaHkgb2YgbW92YWJsZSBub2RlcyBkdXJpbmcgb3JkZXJpbmcuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgYSBEQUdcbiAqICAgIDIuIEJhc2Ugbm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhdmUgYSByYW5rIGF0dHJpYnV0ZVxuICogICAgMy4gU3ViZ3JhcGggbm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhcyBtaW5SYW5rIGFuZCBtYXhSYW5rIGF0dHJpYnV0ZXNcbiAqICAgIDQuIEVkZ2VzIGhhdmUgYW4gYXNzaWduZWQgd2VpZ2h0XG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIE91dHB1dCBncmFwaCBoYXMgYWxsIG5vZGVzIGluIHRoZSBtb3ZhYmxlIHJhbmsgd2l0aCBwcmVzZXJ2ZWRcbiAqICAgICAgIGhpZXJhcmNoeS5cbiAqICAgIDIuIFJvb3Qgbm9kZXMgaW4gdGhlIG1vdmFibGUgbGF5ZXIgYXJlIG1hZGUgY2hpbGRyZW4gb2YgdGhlIG5vZGVcbiAqICAgICAgIGluZGljYXRlZCBieSB0aGUgcm9vdCBhdHRyaWJ1dGUgb2YgdGhlIGdyYXBoLlxuICogICAgMy4gTm9uLW1vdmFibGUgbm9kZXMgaW5jaWRlbnQgb24gbW92YWJsZSBub2Rlcywgc2VsZWN0ZWQgYnkgdGhlXG4gKiAgICAgICByZWxhdGlvbnNoaXAgcGFyYW1ldGVyLCBhcmUgaW5jbHVkZWQgaW4gdGhlIGdyYXBoICh3aXRob3V0IGhpZXJhcmNoeSkuXG4gKiAgICA0LiBFZGdlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGUgcmVsYXRpb25zaGlwXG4gKiAgICAgICBwYXJhbWV0ZXIsIGFyZSBhZGRlZCB0byB0aGUgb3V0cHV0IGdyYXBoLlxuICogICAgNS4gVGhlIHdlaWdodHMgZm9yIGNvcGllZCBlZGdlcyBhcmUgYWdncmVnYXRlZCBhcyBuZWVkLCBzaW5jZSB0aGUgb3V0cHV0XG4gKiAgICAgICBncmFwaCBpcyBub3QgYSBtdWx0aS1ncmFwaC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBoKGcsIHJhbmssIHJlbGF0aW9uc2hpcCkge1xuICB2YXIgcm9vdCA9IGNyZWF0ZVJvb3ROb2RlKGcpLFxuICAgIHJlc3VsdCA9IG5ldyBHcmFwaCh7IGNvbXBvdW5kOiB0cnVlIH0pLnNldEdyYXBoKHsgcm9vdDogcm9vdCB9KVxuICAgICAgLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpOyB9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodiksXG4gICAgICBwYXJlbnQgPSBnLnBhcmVudCh2KTtcblxuICAgIGlmIChub2RlLnJhbmsgPT09IHJhbmsgfHwgbm9kZS5taW5SYW5rIDw9IHJhbmsgJiYgcmFuayA8PSBub2RlLm1heFJhbmspIHtcbiAgICAgIHJlc3VsdC5zZXROb2RlKHYpO1xuICAgICAgcmVzdWx0LnNldFBhcmVudCh2LCBwYXJlbnQgfHwgcm9vdCk7XG5cbiAgICAgIC8vIFRoaXMgYXNzdW1lcyB3ZSBoYXZlIG9ubHkgc2hvcnQgZWRnZXMhXG4gICAgICBfLmZvckVhY2goZ1tyZWxhdGlvbnNoaXBdKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciB1ID0gZS52ID09PSB2ID8gZS53IDogZS52LFxuICAgICAgICAgIGVkZ2UgPSByZXN1bHQuZWRnZSh1LCB2KSxcbiAgICAgICAgICB3ZWlnaHQgPSAhXy5pc1VuZGVmaW5lZChlZGdlKSA/IGVkZ2Uud2VpZ2h0IDogMDtcbiAgICAgICAgcmVzdWx0LnNldEVkZ2UodSwgdiwgeyB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgKyB3ZWlnaHQgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKF8uaGFzKG5vZGUsIFwibWluUmFua1wiKSkge1xuICAgICAgICByZXN1bHQuc2V0Tm9kZSh2LCB7XG4gICAgICAgICAgYm9yZGVyTGVmdDogbm9kZS5ib3JkZXJMZWZ0W3JhbmtdLFxuICAgICAgICAgIGJvcmRlclJpZ2h0OiBub2RlLmJvcmRlclJpZ2h0W3JhbmtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZykge1xuICB2YXIgdjtcbiAgd2hpbGUgKGcuaGFzTm9kZSgodiA9IF8udW5pcXVlSWQoXCJfcm9vdFwiKSkpKTtcbiAgcmV0dXJuIHY7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyb3NzQ291bnQ7XG5cbi8qXG4gKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBsYXllcmluZyAoYW4gYXJyYXkgb2YgbGF5ZXJzLCBlYWNoIHdpdGggYW4gYXJyYXkgb2ZcbiAqIG9yZGVyZXJkIG5vZGVzKSBhbmQgYSBncmFwaCBhbmQgcmV0dXJucyBhIHdlaWdodGVkIGNyb3NzaW5nIGNvdW50LlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIG11c3QgYmUgc2ltcGxlIChub3QgYSBtdWx0aWdyYXBoKSwgZGlyZWN0ZWQsIGFuZCBpbmNsdWRlXG4gKiAgICAgICBvbmx5IHNpbXBsZSBlZGdlcy5cbiAqICAgIDIuIEVkZ2VzIGluIHRoZSBpbnB1dCBncmFwaCBtdXN0IGhhdmUgYXNzaWduZWQgd2VpZ2h0cy5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gVGhlIGdyYXBoIGFuZCBsYXllcmluZyBtYXRyaXggYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGlzIGRlcml2ZWQgZnJvbSBCYXJ0aCwgZXQgYWwuLCBcIkJpbGF5ZXIgQ3Jvc3MgQ291bnRpbmcuXCJcbiAqL1xuZnVuY3Rpb24gY3Jvc3NDb3VudChnLCBsYXllcmluZykge1xuICB2YXIgY2MgPSAwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxheWVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgY2MgKz0gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIGxheWVyaW5nW2ktMV0sIGxheWVyaW5nW2ldKTtcbiAgfVxuICByZXR1cm4gY2M7XG59XG5cbmZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLCBub3J0aExheWVyLCBzb3V0aExheWVyKSB7XG4gIC8vIFNvcnQgYWxsIG9mIHRoZSBlZGdlcyBiZXR3ZWVuIHRoZSBub3J0aCBhbmQgc291dGggbGF5ZXJzIGJ5IHRoZWlyIHBvc2l0aW9uXG4gIC8vIGluIHRoZSBub3J0aCBsYXllciBhbmQgdGhlbiB0aGUgc291dGguIE1hcCB0aGVzZSBlZGdlcyB0byB0aGUgcG9zaXRpb24gb2ZcbiAgLy8gdGhlaXIgaGVhZCBpbiB0aGUgc291dGggbGF5ZXIuXG4gIHZhciBzb3V0aFBvcyA9IF8uemlwT2JqZWN0KHNvdXRoTGF5ZXIsXG4gICAgXy5tYXAoc291dGhMYXllciwgZnVuY3Rpb24gKHYsIGkpIHsgcmV0dXJuIGk7IH0pKTtcbiAgdmFyIHNvdXRoRW50cmllcyA9IF8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uc29ydEJ5KF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiB7IHBvczogc291dGhQb3NbZS53XSwgd2VpZ2h0OiBnLmVkZ2UoZSkud2VpZ2h0IH07XG4gICAgfSksIFwicG9zXCIpO1xuICB9KSwgdHJ1ZSk7XG5cbiAgLy8gQnVpbGQgdGhlIGFjY3VtdWxhdG9yIHRyZWVcbiAgdmFyIGZpcnN0SW5kZXggPSAxO1xuICB3aGlsZSAoZmlyc3RJbmRleCA8IHNvdXRoTGF5ZXIubGVuZ3RoKSBmaXJzdEluZGV4IDw8PSAxO1xuICB2YXIgdHJlZVNpemUgPSAyICogZmlyc3RJbmRleCAtIDE7XG4gIGZpcnN0SW5kZXggLT0gMTtcbiAgdmFyIHRyZWUgPSBfLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLCBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0pO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgd2VpZ2h0ZWQgY3Jvc3NpbmdzXG4gIHZhciBjYyA9IDA7XG4gIF8uZm9yRWFjaChzb3V0aEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSkge1xuICAgIHZhciBpbmRleCA9IGVudHJ5LnBvcyArIGZpcnN0SW5kZXg7XG4gICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIHZhciB3ZWlnaHRTdW0gPSAwO1xuICAgIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICAgIGlmIChpbmRleCAlIDIpIHtcbiAgICAgICAgd2VpZ2h0U3VtICs9IHRyZWVbaW5kZXggKyAxXTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gKGluZGV4IC0gMSkgPj4gMTtcbiAgICAgIHRyZWVbaW5kZXhdICs9IGVudHJ5LndlaWdodDtcbiAgICB9XG4gICAgY2MgKz0gZW50cnkud2VpZ2h0ICogd2VpZ2h0U3VtO1xuICB9KSk7XG5cbiAgcmV0dXJuIGNjO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBpbml0T3JkZXIgPSByZXF1aXJlKFwiLi9pbml0LW9yZGVyXCIpO1xudmFyIGNyb3NzQ291bnQgPSByZXF1aXJlKFwiLi9jcm9zcy1jb3VudFwiKTtcbnZhciBzb3J0U3ViZ3JhcGggPSByZXF1aXJlKFwiLi9zb3J0LXN1YmdyYXBoXCIpO1xudmFyIGJ1aWxkTGF5ZXJHcmFwaCA9IHJlcXVpcmUoXCIuL2J1aWxkLWxheWVyLWdyYXBoXCIpO1xudmFyIGFkZFN1YmdyYXBoQ29uc3RyYWludHMgPSByZXF1aXJlKFwiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHNcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9yZGVyO1xuXG4vKlxuICogQXBwbGllcyBoZXVyaXN0aWNzIHRvIG1pbmltaXplIGVkZ2UgY3Jvc3NpbmdzIGluIHRoZSBncmFwaCBhbmQgc2V0cyB0aGUgYmVzdFxuICogb3JkZXIgc29sdXRpb24gYXMgYW4gb3JkZXIgYXR0cmlidXRlIG9uIGVhY2ggbm9kZS5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIERBR1xuICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzIHdpdGggYSBcInJhbmtcIiBhdHRyaWJ1dGVcbiAqICAgIDMuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSB0aGUgXCJ3ZWlnaHRcIiBhdHRyaWJ1dGVcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGFuIFwib3JkZXJcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uXG4gKi9cbmZ1bmN0aW9uIG9yZGVyKGcpIHtcbiAgdmFyIG1heFJhbmsgPSB1dGlsLm1heFJhbmsoZyksXG4gICAgZG93bkxheWVyR3JhcGhzID0gYnVpbGRMYXllckdyYXBocyhnLCBfLnJhbmdlKDEsIG1heFJhbmsgKyAxKSwgXCJpbkVkZ2VzXCIpLFxuICAgIHVwTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UobWF4UmFuayAtIDEsIC0xLCAtMSksIFwib3V0RWRnZXNcIik7XG5cbiAgdmFyIGxheWVyaW5nID0gaW5pdE9yZGVyKGcpO1xuICBhc3NpZ25PcmRlcihnLCBsYXllcmluZyk7XG5cbiAgdmFyIGJlc3RDQyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBiZXN0O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsYXN0QmVzdCA9IDA7IGxhc3RCZXN0IDwgNDsgKytpLCArK2xhc3RCZXN0KSB7XG4gICAgc3dlZXBMYXllckdyYXBocyhpICUgMiA/IGRvd25MYXllckdyYXBocyA6IHVwTGF5ZXJHcmFwaHMsIGkgJSA0ID49IDIpO1xuXG4gICAgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gICAgdmFyIGNjID0gY3Jvc3NDb3VudChnLCBsYXllcmluZyk7XG4gICAgaWYgKGNjIDwgYmVzdENDKSB7XG4gICAgICBsYXN0QmVzdCA9IDA7XG4gICAgICBiZXN0ID0gXy5jbG9uZURlZXAobGF5ZXJpbmcpO1xuICAgICAgYmVzdENDID0gY2M7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduT3JkZXIoZywgYmVzdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaHMoZywgcmFua3MsIHJlbGF0aW9uc2hpcCkge1xuICByZXR1cm4gXy5tYXAocmFua3MsIGZ1bmN0aW9uKHJhbmspIHtcbiAgICByZXR1cm4gYnVpbGRMYXllckdyYXBoKGcsIHJhbmssIHJlbGF0aW9uc2hpcCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLCBiaWFzUmlnaHQpIHtcbiAgdmFyIGNnID0gbmV3IEdyYXBoKCk7XG4gIF8uZm9yRWFjaChsYXllckdyYXBocywgZnVuY3Rpb24obGcpIHtcbiAgICB2YXIgcm9vdCA9IGxnLmdyYXBoKCkucm9vdDtcbiAgICB2YXIgc29ydGVkID0gc29ydFN1YmdyYXBoKGxnLCByb290LCBjZywgYmlhc1JpZ2h0KTtcbiAgICBfLmZvckVhY2goc29ydGVkLnZzLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICBsZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgICBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLCBjZywgc29ydGVkLnZzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKSB7XG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGcubm9kZSh2KS5vcmRlciA9IGk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbml0T3JkZXI7XG5cbi8qXG4gKiBBc3NpZ25zIGFuIGluaXRpYWwgb3JkZXIgdmFsdWUgZm9yIGVhY2ggbm9kZSBieSBwZXJmb3JtaW5nIGEgREZTIHNlYXJjaFxuICogc3RhcnRpbmcgZnJvbSBub2RlcyBpbiB0aGUgZmlyc3QgcmFuay4gTm9kZXMgYXJlIGFzc2lnbmVkIGFuIG9yZGVyIGluIHRoZWlyXG4gKiByYW5rIGFzIHRoZXkgYXJlIGZpcnN0IHZpc2l0ZWQuXG4gKlxuICogVGhpcyBhcHByb2FjaCBjb21lcyBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZFxuICogR3JhcGhzLlwiXG4gKlxuICogUmV0dXJucyBhIGxheWVyaW5nIG1hdHJpeCB3aXRoIGFuIGFycmF5IHBlciBsYXllciBhbmQgZWFjaCBsYXllciBzb3J0ZWQgYnlcbiAqIHRoZSBvcmRlciBvZiBpdHMgbm9kZXMuXG4gKi9cbmZ1bmN0aW9uIGluaXRPcmRlcihnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBzaW1wbGVOb2RlcyA9IF8uZmlsdGVyKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiAhZy5jaGlsZHJlbih2KS5sZW5ndGg7XG4gIH0pO1xuICB2YXIgbWF4UmFuayA9IF8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuICB2YXIgbGF5ZXJzID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSByZXR1cm47XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgbGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtcbiAgICBfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICB9XG5cbiAgdmFyIG9yZGVyZWRWcyA9IF8uc29ydEJ5KHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSk7XG4gIF8uZm9yRWFjaChvcmRlcmVkVnMsIGRmcyk7XG5cbiAgcmV0dXJuIGxheWVycztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUNvbmZsaWN0cztcblxuLypcbiAqIEdpdmVuIGEgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9IGFuZCBhXG4gKiBjb25zdHJhaW50IGdyYXBoIHRoaXMgZnVuY3Rpb24gd2lsbCByZXNvbHZlIGFueSBjb25mbGljdHMgYmV0d2VlbiB0aGVcbiAqIGNvbnN0cmFpbnQgZ3JhcGggYW5kIHRoZSBiYXJ5Y2VudGVycyBmb3IgdGhlIGVudHJpZXMuIElmIHRoZSBiYXJ5Y2VudGVycyBmb3JcbiAqIGFuIGVudHJ5IHdvdWxkIHZpb2xhdGUgYSBjb25zdHJhaW50IGluIHRoZSBjb25zdHJhaW50IGdyYXBoIHRoZW4gd2UgY29hbGVzY2VcbiAqIHRoZSBub2RlcyBpbiB0aGUgY29uZmxpY3QgaW50byBhIG5ldyBub2RlIHRoYXQgcmVzcGVjdHMgdGhlIGNvbnRyYWludCBhbmRcbiAqIGFnZ3JlZ2F0ZXMgYmFyeWNlbnRlciBhbmQgd2VpZ2h0IGluZm9ybWF0aW9uLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIGRlc2NyaXB0aW9uIGluIEZvcnN0ZXIsIFwiQSBGYXN0IGFuZFxuICogU2ltcGxlIEh1ZXJpc3RpYyBmb3IgQ29uc3RyYWluZWQgVHdvLUxldmVsIENyb3NzaW5nIFJlZHVjdGlvbixcIiB0aG91Z2h0IGl0XG4gKiBkaWZmZXJzIGluIHNvbWUgc3BlY2lmaWMgZGV0YWlscy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIGVudHJ5IGhhcyB0aGUgZm9ybSB7diwgYmFyeWNlbnRlciwgd2VpZ2h0fSwgb3IgaWYgdGhlIG5vZGUgaGFzXG4gKiAgICAgICBubyBiYXJ5Y2VudGVyLCB0aGVuIHt2fS5cbiAqXG4gKiBSZXR1cm5zOlxuICpcbiAqICAgIEEgbmV3IGxpc3Qgb2YgZW50cmllcyBvZiB0aGUgZm9ybSB7dnMsIGksIGJhcnljZW50ZXIsIHdlaWdodH0uIFRoZSBsaXN0XG4gKiAgICBgdnNgIG1heSBlaXRoZXIgYmUgYSBzaW5nbGV0b24gb3IgaXQgbWF5IGJlIGFuIGFnZ3JlZ2F0aW9uIG9mIG5vZGVzXG4gKiAgICBvcmRlcmVkIHN1Y2ggdGhhdCB0aGV5IGRvIG5vdCB2aW9sYXRlIGNvbnN0cmFpbnRzIGZyb20gdGhlIGNvbnN0cmFpbnRcbiAqICAgIGdyYXBoLiBUaGUgcHJvcGVydHkgYGlgIGlzIHRoZSBsb3dlc3Qgb3JpZ2luYWwgaW5kZXggb2YgYW55IG9mIHRoZVxuICogICAgZWxlbWVudHMgaW4gYHZzYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0cyhlbnRyaWVzLCBjZykge1xuICB2YXIgbWFwcGVkRW50cmllcyA9IHt9O1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnksIGkpIHtcbiAgICB2YXIgdG1wID0gbWFwcGVkRW50cmllc1tlbnRyeS52XSA9IHtcbiAgICAgIGluZGVncmVlOiAwLFxuICAgICAgXCJpblwiOiBbXSxcbiAgICAgIG91dDogW10sXG4gICAgICB2czogW2VudHJ5LnZdLFxuICAgICAgaTogaVxuICAgIH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKSB7XG4gICAgICB0bXAuYmFyeWNlbnRlciA9IGVudHJ5LmJhcnljZW50ZXI7XG4gICAgICB0bXAud2VpZ2h0ID0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGNnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZW50cnlWID0gbWFwcGVkRW50cmllc1tlLnZdO1xuICAgIHZhciBlbnRyeVcgPSBtYXBwZWRFbnRyaWVzW2Uud107XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVudHJ5VikgJiYgIV8uaXNVbmRlZmluZWQoZW50cnlXKSkge1xuICAgICAgZW50cnlXLmluZGVncmVlKys7XG4gICAgICBlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBzb3VyY2VTZXQgPSBfLmZpbHRlcihtYXBwZWRFbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiAhZW50cnkuaW5kZWdyZWU7XG4gIH0pO1xuXG4gIHJldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KTtcbn1cblxuZnVuY3Rpb24gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCkge1xuICB2YXIgZW50cmllcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUluKHZFbnRyeSkge1xuICAgIHJldHVybiBmdW5jdGlvbih1RW50cnkpIHtcbiAgICAgIGlmICh1RW50cnkubWVyZ2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHVFbnRyeS5iYXJ5Y2VudGVyKSB8fFxuICAgICAgICAgIF8uaXNVbmRlZmluZWQodkVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgdUVudHJ5LmJhcnljZW50ZXIgPj0gdkVudHJ5LmJhcnljZW50ZXIpIHtcbiAgICAgICAgbWVyZ2VFbnRyaWVzKHZFbnRyeSwgdUVudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSkge1xuICAgIHJldHVybiBmdW5jdGlvbih3RW50cnkpIHtcbiAgICAgIHdFbnRyeVtcImluXCJdLnB1c2godkVudHJ5KTtcbiAgICAgIGlmICgtLXdFbnRyeS5pbmRlZ3JlZSA9PT0gMCkge1xuICAgICAgICBzb3VyY2VTZXQucHVzaCh3RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB3aGlsZSAoc291cmNlU2V0Lmxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IHNvdXJjZVNldC5wb3AoKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIF8uZm9yRWFjaChlbnRyeVtcImluXCJdLnJldmVyc2UoKSwgaGFuZGxlSW4oZW50cnkpKTtcbiAgICBfLmZvckVhY2goZW50cnkub3V0LCBoYW5kbGVPdXQoZW50cnkpKTtcbiAgfVxuXG4gIHJldHVybiBfLm1hcChfLmZpbHRlcihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gIWVudHJ5Lm1lcmdlZDsgfSksXG4gICAgZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIHJldHVybiBfLnBpY2soZW50cnksIFtcInZzXCIsIFwiaVwiLCBcImJhcnljZW50ZXJcIiwgXCJ3ZWlnaHRcIl0pO1xuICAgIH0pO1xuXG59XG5cbmZ1bmN0aW9uIG1lcmdlRW50cmllcyh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgc3VtID0gMDtcbiAgdmFyIHdlaWdodCA9IDA7XG5cbiAgaWYgKHRhcmdldC53ZWlnaHQpIHtcbiAgICBzdW0gKz0gdGFyZ2V0LmJhcnljZW50ZXIgKiB0YXJnZXQud2VpZ2h0O1xuICAgIHdlaWdodCArPSB0YXJnZXQud2VpZ2h0O1xuICB9XG5cbiAgaWYgKHNvdXJjZS53ZWlnaHQpIHtcbiAgICBzdW0gKz0gc291cmNlLmJhcnljZW50ZXIgKiBzb3VyY2Uud2VpZ2h0O1xuICAgIHdlaWdodCArPSBzb3VyY2Uud2VpZ2h0O1xuICB9XG5cbiAgdGFyZ2V0LnZzID0gc291cmNlLnZzLmNvbmNhdCh0YXJnZXQudnMpO1xuICB0YXJnZXQuYmFyeWNlbnRlciA9IHN1bSAvIHdlaWdodDtcbiAgdGFyZ2V0LndlaWdodCA9IHdlaWdodDtcbiAgdGFyZ2V0LmkgPSBNYXRoLm1pbihzb3VyY2UuaSwgdGFyZ2V0LmkpO1xuICBzb3VyY2UubWVyZ2VkID0gdHJ1ZTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBiYXJ5Y2VudGVyID0gcmVxdWlyZShcIi4vYmFyeWNlbnRlclwiKTtcbnZhciByZXNvbHZlQ29uZmxpY3RzID0gcmVxdWlyZShcIi4vcmVzb2x2ZS1jb25mbGljdHNcIik7XG52YXIgc29ydCA9IHJlcXVpcmUoXCIuL3NvcnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydFN1YmdyYXBoO1xuXG5mdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZywgdiwgY2csIGJpYXNSaWdodCkge1xuICB2YXIgbW92YWJsZSA9IGcuY2hpbGRyZW4odik7XG4gIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICB2YXIgYmwgPSBub2RlID8gbm9kZS5ib3JkZXJMZWZ0IDogdW5kZWZpbmVkO1xuICB2YXIgYnIgPSBub2RlID8gbm9kZS5ib3JkZXJSaWdodDogdW5kZWZpbmVkO1xuICB2YXIgc3ViZ3JhcGhzID0ge307XG5cbiAgaWYgKGJsKSB7XG4gICAgbW92YWJsZSA9IF8uZmlsdGVyKG1vdmFibGUsIGZ1bmN0aW9uKHcpIHtcbiAgICAgIHJldHVybiB3ICE9PSBibCAmJiB3ICE9PSBicjtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBiYXJ5Y2VudGVycyA9IGJhcnljZW50ZXIoZywgbW92YWJsZSk7XG4gIF8uZm9yRWFjaChiYXJ5Y2VudGVycywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBpZiAoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpIHtcbiAgICAgIHZhciBzdWJncmFwaFJlc3VsdCA9IHNvcnRTdWJncmFwaChnLCBlbnRyeS52LCBjZywgYmlhc1JpZ2h0KTtcbiAgICAgIHN1YmdyYXBoc1tlbnRyeS52XSA9IHN1YmdyYXBoUmVzdWx0O1xuICAgICAgaWYgKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCBcImJhcnljZW50ZXJcIikpIHtcbiAgICAgICAgbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwgc3ViZ3JhcGhSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGVudHJpZXMgPSByZXNvbHZlQ29uZmxpY3RzKGJhcnljZW50ZXJzLCBjZyk7XG4gIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpO1xuXG4gIHZhciByZXN1bHQgPSBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCk7XG5cbiAgaWYgKGJsKSB7XG4gICAgcmVzdWx0LnZzID0gXy5mbGF0dGVuKFtibCwgcmVzdWx0LnZzLCBicl0sIHRydWUpO1xuICAgIGlmIChnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKSB7XG4gICAgICB2YXIgYmxQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksXG4gICAgICAgIGJyUHJlZCA9IGcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO1xuICAgICAgaWYgKCFfLmhhcyhyZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICByZXN1bHQuYmFyeWNlbnRlciA9IDA7XG4gICAgICAgIHJlc3VsdC53ZWlnaHQgPSAwO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmJhcnljZW50ZXIgPSAocmVzdWx0LmJhcnljZW50ZXIgKiByZXN1bHQud2VpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsUHJlZC5vcmRlciArIGJyUHJlZC5vcmRlcikgLyAocmVzdWx0LndlaWdodCArIDIpO1xuICAgICAgcmVzdWx0LndlaWdodCArPSAyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpIHtcbiAgXy5mb3JFYWNoKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZW50cnkudnMgPSBfLmZsYXR0ZW4oZW50cnkudnMubWFwKGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmIChzdWJncmFwaHNbdl0pIHtcbiAgICAgICAgcmV0dXJuIHN1YmdyYXBoc1t2XS52cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2O1xuICAgIH0pLCB0cnVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LCBvdGhlcikge1xuICBpZiAoIV8uaXNVbmRlZmluZWQodGFyZ2V0LmJhcnljZW50ZXIpKSB7XG4gICAgdGFyZ2V0LmJhcnljZW50ZXIgPSAodGFyZ2V0LmJhcnljZW50ZXIgKiB0YXJnZXQud2VpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5iYXJ5Y2VudGVyICogb3RoZXIud2VpZ2h0KSAvXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LndlaWdodCArIG90aGVyLndlaWdodCk7XG4gICAgdGFyZ2V0LndlaWdodCArPSBvdGhlci53ZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmJhcnljZW50ZXIgPSBvdGhlci5iYXJ5Y2VudGVyO1xuICAgIHRhcmdldC53ZWlnaHQgPSBvdGhlci53ZWlnaHQ7XG4gIH1cbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydDtcblxuZnVuY3Rpb24gc29ydChlbnRyaWVzLCBiaWFzUmlnaHQpIHtcbiAgdmFyIHBhcnRzID0gdXRpbC5wYXJ0aXRpb24oZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICByZXR1cm4gXy5oYXMoZW50cnksIFwiYmFyeWNlbnRlclwiKTtcbiAgfSk7XG4gIHZhciBzb3J0YWJsZSA9IHBhcnRzLmxocyxcbiAgICB1bnNvcnRhYmxlID0gXy5zb3J0QnkocGFydHMucmhzLCBmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gLWVudHJ5Lmk7IH0pLFxuICAgIHZzID0gW10sXG4gICAgc3VtID0gMCxcbiAgICB3ZWlnaHQgPSAwLFxuICAgIHZzSW5kZXggPSAwO1xuXG4gIHNvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7XG5cbiAgdnNJbmRleCA9IGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCB2c0luZGV4KTtcblxuICBfLmZvckVhY2goc29ydGFibGUsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHZzSW5kZXggKz0gZW50cnkudnMubGVuZ3RoO1xuICAgIHZzLnB1c2goZW50cnkudnMpO1xuICAgIHN1bSArPSBlbnRyeS5iYXJ5Y2VudGVyICogZW50cnkud2VpZ2h0O1xuICAgIHdlaWdodCArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdnNJbmRleCA9IGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCB2c0luZGV4KTtcbiAgfSk7XG5cbiAgdmFyIHJlc3VsdCA9IHsgdnM6IF8uZmxhdHRlbih2cywgdHJ1ZSkgfTtcbiAgaWYgKHdlaWdodCkge1xuICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICAgIHJlc3VsdC53ZWlnaHQgPSB3ZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIGluZGV4KSB7XG4gIHZhciBsYXN0O1xuICB3aGlsZSAodW5zb3J0YWJsZS5sZW5ndGggJiYgKGxhc3QgPSBfLmxhc3QodW5zb3J0YWJsZSkpLmkgPD0gaW5kZXgpIHtcbiAgICB1bnNvcnRhYmxlLnBvcCgpO1xuICAgIHZzLnB1c2gobGFzdC52cyk7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVXaXRoQmlhcyhiaWFzKSB7XG4gIHJldHVybiBmdW5jdGlvbihlbnRyeVYsIGVudHJ5Vykge1xuICAgIGlmIChlbnRyeVYuYmFyeWNlbnRlciA8IGVudHJ5Vy5iYXJ5Y2VudGVyKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChlbnRyeVYuYmFyeWNlbnRlciA+IGVudHJ5Vy5iYXJ5Y2VudGVyKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWJpYXMgPyBlbnRyeVYuaSAtIGVudHJ5Vy5pIDogZW50cnlXLmkgLSBlbnRyeVYuaTtcbiAgfTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudER1bW15Q2hhaW5zO1xuXG5mdW5jdGlvbiBwYXJlbnREdW1teUNoYWlucyhnKSB7XG4gIHZhciBwb3N0b3JkZXJOdW1zID0gcG9zdG9yZGVyKGcpO1xuXG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgZWRnZU9iaiA9IG5vZGUuZWRnZU9iajtcbiAgICB2YXIgcGF0aERhdGEgPSBmaW5kUGF0aChnLCBwb3N0b3JkZXJOdW1zLCBlZGdlT2JqLnYsIGVkZ2VPYmoudyk7XG4gICAgdmFyIHBhdGggPSBwYXRoRGF0YS5wYXRoO1xuICAgIHZhciBsY2EgPSBwYXRoRGF0YS5sY2E7XG4gICAgdmFyIHBhdGhJZHggPSAwO1xuICAgIHZhciBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgdmFyIGFzY2VuZGluZyA9IHRydWU7XG5cbiAgICB3aGlsZSAodiAhPT0gZWRnZU9iai53KSB7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuXG4gICAgICBpZiAoYXNjZW5kaW5nKSB7XG4gICAgICAgIHdoaWxlICgocGF0aFYgPSBwYXRoW3BhdGhJZHhdKSAhPT0gbGNhICYmXG4gICAgICAgICAgICAgICBnLm5vZGUocGF0aFYpLm1heFJhbmsgPCBub2RlLnJhbmspIHtcbiAgICAgICAgICBwYXRoSWR4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aFYgPT09IGxjYSkge1xuICAgICAgICAgIGFzY2VuZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXNjZW5kaW5nKSB7XG4gICAgICAgIHdoaWxlIChwYXRoSWR4IDwgcGF0aC5sZW5ndGggLSAxICYmXG4gICAgICAgICAgICAgICBnLm5vZGUocGF0aFYgPSBwYXRoW3BhdGhJZHggKyAxXSkubWluUmFuayA8PSBub2RlLnJhbmspIHtcbiAgICAgICAgICBwYXRoSWR4Kys7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aFYgPSBwYXRoW3BhdGhJZHhdO1xuICAgICAgfVxuXG4gICAgICBnLnNldFBhcmVudCh2LCBwYXRoVik7XG4gICAgICB2ID0gZy5zdWNjZXNzb3JzKHYpWzBdO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEZpbmQgYSBwYXRoIGZyb20gdiB0byB3IHRocm91Z2ggdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3IgKExDQSkuIFJldHVybiB0aGVcbi8vIGZ1bGwgcGF0aCBhbmQgdGhlIExDQS5cbmZ1bmN0aW9uIGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIHYsIHcpIHtcbiAgdmFyIHZQYXRoID0gW107XG4gIHZhciB3UGF0aCA9IFtdO1xuICB2YXIgbG93ID0gTWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3csIHBvc3RvcmRlck51bXNbd10ubG93KTtcbiAgdmFyIGxpbSA9IE1hdGgubWF4KHBvc3RvcmRlck51bXNbdl0ubGltLCBwb3N0b3JkZXJOdW1zW3ddLmxpbSk7XG4gIHZhciBwYXJlbnQ7XG4gIHZhciBsY2E7XG5cbiAgLy8gVHJhdmVyc2UgdXAgZnJvbSB2IHRvIGZpbmQgdGhlIExDQVxuICBwYXJlbnQgPSB2O1xuICBkbyB7XG4gICAgcGFyZW50ID0gZy5wYXJlbnQocGFyZW50KTtcbiAgICB2UGF0aC5wdXNoKHBhcmVudCk7XG4gIH0gd2hpbGUgKHBhcmVudCAmJlxuICAgICAgICAgICAocG9zdG9yZGVyTnVtc1twYXJlbnRdLmxvdyA+IGxvdyB8fCBsaW0gPiBwb3N0b3JkZXJOdW1zW3BhcmVudF0ubGltKSk7XG4gIGxjYSA9IHBhcmVudDtcblxuICAvLyBUcmF2ZXJzZSBmcm9tIHcgdG8gTENBXG4gIHBhcmVudCA9IHc7XG4gIHdoaWxlICgocGFyZW50ID0gZy5wYXJlbnQocGFyZW50KSkgIT09IGxjYSkge1xuICAgIHdQYXRoLnB1c2gocGFyZW50KTtcbiAgfVxuXG4gIHJldHVybiB7IHBhdGg6IHZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLCBsY2E6IGxjYSB9O1xufVxuXG5mdW5jdGlvbiBwb3N0b3JkZXIoZykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBsaW0gPSAwO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGxvdyA9IGxpbTtcbiAgICBfLmZvckVhY2goZy5jaGlsZHJlbih2KSwgZGZzKTtcbiAgICByZXN1bHRbdl0gPSB7IGxvdzogbG93LCBsaW06IGxpbSsrIH07XG4gIH1cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbi8qXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb29yZGluYXRlIGFzc2lnbm1lbnQgYmFzZWQgb24gQnJhbmRlcyBhbmQgS8O2cGYsIFwiRmFzdFxuICogYW5kIFNpbXBsZSBIb3Jpem9udGFsIENvb3JkaW5hdGUgQXNzaWdubWVudC5cIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwb3NpdGlvblg6IHBvc2l0aW9uWCxcbiAgZmluZFR5cGUxQ29uZmxpY3RzOiBmaW5kVHlwZTFDb25mbGljdHMsXG4gIGZpbmRUeXBlMkNvbmZsaWN0czogZmluZFR5cGUyQ29uZmxpY3RzLFxuICBhZGRDb25mbGljdDogYWRkQ29uZmxpY3QsXG4gIGhhc0NvbmZsaWN0OiBoYXNDb25mbGljdCxcbiAgdmVydGljYWxBbGlnbm1lbnQ6IHZlcnRpY2FsQWxpZ25tZW50LFxuICBob3Jpem9udGFsQ29tcGFjdGlvbjogaG9yaXpvbnRhbENvbXBhY3Rpb24sXG4gIGFsaWduQ29vcmRpbmF0ZXM6IGFsaWduQ29vcmRpbmF0ZXMsXG4gIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxcbiAgYmFsYW5jZTogYmFsYW5jZVxufTtcblxuLypcbiAqIE1hcmtzIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggd2l0aCBhIHR5cGUtMSBjb25mbGljdCB3aXRoIHRoZSBcInR5cGUxQ29uZmxpY3RcIlxuICogcHJvcGVydHkuIEEgdHlwZS0xIGNvbmZsaWN0IGlzIG9uZSB3aGVyZSBhIG5vbi1pbm5lciBzZWdtZW50IGNyb3NzZXMgYW5cbiAqIGlubmVyIHNlZ21lbnQuIEFuIGlubmVyIHNlZ21lbnQgaXMgYW4gZWRnZSB3aXRoIGJvdGggaW5jaWRlbnQgbm9kZXMgbWFya2VkXG4gKiB3aXRoIHRoZSBcImR1bW15XCIgcHJvcGVydHkuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gc2NhbnMgbGF5ZXIgYnkgbGF5ZXIsIHN0YXJ0aW5nIHdpdGggdGhlIHNlY29uZCwgZm9yIHR5cGUtMVxuICogY29uZmxpY3RzIGJldHdlZW4gdGhlIGN1cnJlbnQgbGF5ZXIgYW5kIHRoZSBwcmV2aW91cyBsYXllci4gRm9yIGVhY2ggbGF5ZXJcbiAqIGl0IHNjYW5zIHRoZSBub2RlcyBmcm9tIGxlZnQgdG8gcmlnaHQgdW50aWwgaXQgcmVhY2hlcyBvbmUgdGhhdCBpcyBpbmNpZGVudFxuICogb24gYW4gaW5uZXIgc2VnbWVudC4gSXQgdGhlbiBzY2FucyBwcmVkZWNlc3NvcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgaGF2ZVxuICogZWRnZXMgdGhhdCBjcm9zcyB0aGF0IGlubmVyIHNlZ21lbnQuIEF0IHRoZSBlbmQgYSBmaW5hbCBzY2FuIGlzIGRvbmUgZm9yIGFsbFxuICogbm9kZXMgb24gdGhlIGN1cnJlbnQgcmFuayB0byBzZWUgaWYgdGhleSBjcm9zcyB0aGUgbGFzdCB2aXNpdGVkIGlubmVyXG4gKiBzZWdtZW50LlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIChzYWZlbHkpIGFzc3VtZXMgdGhhdCBhIGR1bW15IG5vZGUgd2lsbCBvbmx5IGJlIGluY2lkZW50IG9uIGFcbiAqIHNpbmdsZSBub2RlIGluIHRoZSBsYXllcnMgYmVpbmcgc2Nhbm5lZC5cbiAqL1xuZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsIGxheWVyaW5nKSB7XG4gIHZhciBjb25mbGljdHMgPSB7fTtcblxuICBmdW5jdGlvbiB2aXNpdExheWVyKHByZXZMYXllciwgbGF5ZXIpIHtcbiAgICB2YXJcbiAgICAgIC8vIGxhc3QgdmlzaXRlZCBub2RlIGluIHRoZSBwcmV2aW91cyBsYXllciB0aGF0IGlzIGluY2lkZW50IG9uIGFuIGlubmVyXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgazAgPSAwLFxuICAgICAgLy8gVHJhY2tzIHRoZSBsYXN0IG5vZGUgaW4gdGhpcyBsYXllciBzY2FubmVkIGZvciBjcm9zc2luZ3Mgd2l0aCBhIHR5cGUtMVxuICAgICAgLy8gc2VnbWVudC5cbiAgICAgIHNjYW5Qb3MgPSAwLFxuICAgICAgcHJldkxheWVyTGVuZ3RoID0gcHJldkxheWVyLmxlbmd0aCxcbiAgICAgIGxhc3ROb2RlID0gXy5sYXN0KGxheWVyKTtcblxuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIHcgPSBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpLFxuICAgICAgICBrMSA9IHcgPyBnLm5vZGUodykub3JkZXIgOiBwcmV2TGF5ZXJMZW5ndGg7XG5cbiAgICAgIGlmICh3IHx8IHYgPT09IGxhc3ROb2RlKSB7XG4gICAgICAgIF8uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLCBpICsxKSwgZnVuY3Rpb24oc2Nhbk5vZGUpIHtcbiAgICAgICAgICBfLmZvckVhY2goZy5wcmVkZWNlc3NvcnMoc2Nhbk5vZGUpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgICB2YXIgdUxhYmVsID0gZy5ub2RlKHUpLFxuICAgICAgICAgICAgICB1UG9zID0gdUxhYmVsLm9yZGVyO1xuICAgICAgICAgICAgaWYgKCh1UG9zIDwgazAgfHwgazEgPCB1UG9zKSAmJlxuICAgICAgICAgICAgICAgICEodUxhYmVsLmR1bW15ICYmIGcubm9kZShzY2FuTm9kZSkuZHVtbXkpKSB7XG4gICAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgc2Nhbk5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2NhblBvcyA9IGkgKyAxO1xuICAgICAgICBrMCA9IGsxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgXy5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpO1xuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG5mdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aEVuZCwgcHJldk5vcnRoQm9yZGVyLCBuZXh0Tm9ydGhCb3JkZXIpIHtcbiAgICB2YXIgdjtcbiAgICBfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcywgc291dGhFbmQpLCBmdW5jdGlvbihpKSB7XG4gICAgICB2ID0gc291dGhbaV07XG4gICAgICBpZiAoZy5ub2RlKHYpLmR1bW15KSB7XG4gICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZnVuY3Rpb24odSkge1xuICAgICAgICAgIHZhciB1Tm9kZSA9IGcubm9kZSh1KTtcbiAgICAgICAgICBpZiAodU5vZGUuZHVtbXkgJiZcbiAgICAgICAgICAgICAgKHVOb2RlLm9yZGVyIDwgcHJldk5vcnRoQm9yZGVyIHx8IHVOb2RlLm9yZGVyID4gbmV4dE5vcnRoQm9yZGVyKSkge1xuICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBmdW5jdGlvbiB2aXNpdExheWVyKG5vcnRoLCBzb3V0aCkge1xuICAgIHZhciBwcmV2Tm9ydGhQb3MgPSAtMSxcbiAgICAgIG5leHROb3J0aFBvcyxcbiAgICAgIHNvdXRoUG9zID0gMDtcblxuICAgIF8uZm9yRWFjaChzb3V0aCwgZnVuY3Rpb24odiwgc291dGhMb29rYWhlYWQpIHtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkgPT09IFwiYm9yZGVyXCIpIHtcbiAgICAgICAgdmFyIHByZWRlY2Vzc29ycyA9IGcucHJlZGVjZXNzb3JzKHYpO1xuICAgICAgICBpZiAocHJlZGVjZXNzb3JzLmxlbmd0aCkge1xuICAgICAgICAgIG5leHROb3J0aFBvcyA9IGcubm9kZShwcmVkZWNlc3NvcnNbMF0pLm9yZGVyO1xuICAgICAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aExvb2thaGVhZCwgcHJldk5vcnRoUG9zLCBuZXh0Tm9ydGhQb3MpO1xuICAgICAgICAgIHNvdXRoUG9zID0gc291dGhMb29rYWhlYWQ7XG4gICAgICAgICAgcHJldk5vcnRoUG9zID0gbmV4dE5vcnRoUG9zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGgubGVuZ3RoLCBuZXh0Tm9ydGhQb3MsIG5vcnRoLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc291dGg7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdikge1xuICBpZiAoZy5ub2RlKHYpLmR1bW15KSB7XG4gICAgcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSwgZnVuY3Rpb24odSkge1xuICAgICAgcmV0dXJuIGcubm9kZSh1KS5kdW1teTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsIHYsIHcpIHtcbiAgaWYgKHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuXG4gIHZhciBjb25mbGljdHNWID0gY29uZmxpY3RzW3ZdO1xuICBpZiAoIWNvbmZsaWN0c1YpIHtcbiAgICBjb25mbGljdHNbdl0gPSBjb25mbGljdHNWID0ge307XG4gIH1cbiAgY29uZmxpY3RzVlt3XSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sIHcpO1xufVxuXG4vKlxuICogVHJ5IHRvIGFsaWduIG5vZGVzIGludG8gdmVydGljYWwgXCJibG9ja3NcIiB3aGVyZSBwb3NzaWJsZS4gVGhpcyBhbGdvcml0aG1cbiAqIGF0dGVtcHRzIHRvIGFsaWduIGEgbm9kZSB3aXRoIG9uZSBvZiBpdHMgbWVkaWFuIG5laWdoYm9ycy4gSWYgdGhlIGVkZ2VcbiAqIGNvbm5lY3RpbmcgYSBuZWlnaGJvciBpcyBhIHR5cGUtMSBjb25mbGljdCB0aGVuIHdlIGlnbm9yZSB0aGF0IHBvc3NpYmlsaXR5LlxuICogSWYgYSBwcmV2aW91cyBub2RlIGhhcyBhbHJlYWR5IGZvcm1lZCBhIGJsb2NrIHdpdGggYSBub2RlIGFmdGVyIHRoZSBub2RlXG4gKiB3ZSdyZSB0cnlpbmcgdG8gZm9ybSBhIGJsb2NrIHdpdGgsIHdlIGFsc28gaWdub3JlIHRoYXQgcG9zc2liaWxpdHkgLSBvdXJcbiAqIGJsb2NrcyB3b3VsZCBiZSBzcGxpdCBpbiB0aGF0IHNjZW5hcmlvLlxuICovXG5mdW5jdGlvbiB2ZXJ0aWNhbEFsaWdubWVudChnLCBsYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKSB7XG4gIHZhciByb290ID0ge30sXG4gICAgYWxpZ24gPSB7fSxcbiAgICBwb3MgPSB7fTtcblxuICAvLyBXZSBjYWNoZSB0aGUgcG9zaXRpb24gaGVyZSBiYXNlZCBvbiB0aGUgbGF5ZXJpbmcgYmVjYXVzZSB0aGUgZ3JhcGggYW5kXG4gIC8vIGxheWVyaW5nIG1heSBiZSBvdXQgb2Ygc3luYy4gVGhlIGxheWVyaW5nIG1hdHJpeCBpcyBtYW5pcHVsYXRlZCB0b1xuICAvLyBnZW5lcmF0ZSBkaWZmZXJlbnQgZXh0cmVtZSBhbGlnbm1lbnRzLlxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBvcmRlcikge1xuICAgICAgcm9vdFt2XSA9IHY7XG4gICAgICBhbGlnblt2XSA9IHY7XG4gICAgICBwb3Nbdl0gPSBvcmRlcjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBwcmV2SWR4ID0gLTE7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgd3MgPSBuZWlnaGJvckZuKHYpO1xuICAgICAgaWYgKHdzLmxlbmd0aCkge1xuICAgICAgICB3cyA9IF8uc29ydEJ5KHdzLCBmdW5jdGlvbih3KSB7IHJldHVybiBwb3Nbd107IH0pO1xuICAgICAgICB2YXIgbXAgPSAod3MubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihtcCksIGlsID0gTWF0aC5jZWlsKG1wKTsgaSA8PSBpbDsgKytpKSB7XG4gICAgICAgICAgdmFyIHcgPSB3c1tpXTtcbiAgICAgICAgICBpZiAoYWxpZ25bdl0gPT09IHYgJiZcbiAgICAgICAgICAgICAgcHJldklkeCA8IHBvc1t3XSAmJlxuICAgICAgICAgICAgICAhaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSkge1xuICAgICAgICAgICAgYWxpZ25bd10gPSB2O1xuICAgICAgICAgICAgYWxpZ25bdl0gPSByb290W3ZdID0gcm9vdFt3XTtcbiAgICAgICAgICAgIHByZXZJZHggPSBwb3Nbd107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7IHJvb3Q6IHJvb3QsIGFsaWduOiBhbGlnbiB9O1xufVxuXG5mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLCBsYXllcmluZywgcm9vdCwgYWxpZ24sIHJldmVyc2VTZXApIHtcbiAgLy8gVGhpcyBwb3J0aW9uIG9mIHRoZSBhbGdvcml0aG0gZGlmZmVycyBmcm9tIEJLIGR1ZSB0byBhIG51bWJlciBvZiBwcm9ibGVtcy5cbiAgLy8gSW5zdGVhZCBvZiB0aGVpciBhbGdvcml0aG0gd2UgY29uc3RydWN0IGEgbmV3IGJsb2NrIGdyYXBoIGFuZCBkbyB0d29cbiAgLy8gc3dlZXBzLiBUaGUgZmlyc3Qgc3dlZXAgcGxhY2VzIGJsb2NrcyB3aXRoIHRoZSBzbWFsbGVzdCBwb3NzaWJsZVxuICAvLyBjb29yZGluYXRlcy4gVGhlIHNlY29uZCBzd2VlcCByZW1vdmVzIHVudXNlZCBzcGFjZSBieSBtb3ZpbmcgYmxvY2tzIHRvIHRoZVxuICAvLyBncmVhdGVzdCBjb29yZGluYXRlcyB3aXRob3V0IHZpb2xhdGluZyBzZXBhcmF0aW9uLlxuICB2YXIgeHMgPSB7fSxcbiAgICBibG9ja0cgPSBidWlsZEJsb2NrR3JhcGgoZywgbGF5ZXJpbmcsIHJvb3QsIHJldmVyc2VTZXApLFxuICAgIGJvcmRlclR5cGUgPSByZXZlcnNlU2VwID8gXCJib3JkZXJMZWZ0XCIgOiBcImJvcmRlclJpZ2h0XCI7XG5cbiAgZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsIG5leHROb2Rlc0Z1bmMpIHtcbiAgICB2YXIgc3RhY2sgPSBibG9ja0cubm9kZXMoKTtcbiAgICB2YXIgZWxlbSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB2aXNpdGVkID0ge307XG4gICAgd2hpbGUgKGVsZW0pIHtcbiAgICAgIGlmICh2aXNpdGVkW2VsZW1dKSB7XG4gICAgICAgIHNldFhzRnVuYyhlbGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2l0ZWRbZWxlbV0gPSB0cnVlO1xuICAgICAgICBzdGFjay5wdXNoKGVsZW0pO1xuICAgICAgICBzdGFjayA9IHN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKTtcbiAgICAgIH1cblxuICAgICAgZWxlbSA9IHN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IHBhc3MsIGFzc2lnbiBzbWFsbGVzdCBjb29yZGluYXRlc1xuICBmdW5jdGlvbiBwYXNzMShlbGVtKSB7XG4gICAgeHNbZWxlbV0gPSBibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoYWNjLCB4c1tlLnZdICsgYmxvY2tHLmVkZ2UoZSkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gU2Vjb25kIHBhc3MsIGFzc2lnbiBncmVhdGVzdCBjb29yZGluYXRlc1xuICBmdW5jdGlvbiBwYXNzMihlbGVtKSB7XG4gICAgdmFyIG1pbiA9IGJsb2NrRy5vdXRFZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4oYWNjLCB4c1tlLnddIC0gYmxvY2tHLmVkZ2UoZSkpO1xuICAgIH0sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG5cbiAgICB2YXIgbm9kZSA9IGcubm9kZShlbGVtKTtcbiAgICBpZiAobWluICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiYgbm9kZS5ib3JkZXJUeXBlICE9PSBib3JkZXJUeXBlKSB7XG4gICAgICB4c1tlbGVtXSA9IE1hdGgubWF4KHhzW2VsZW1dLCBtaW4pO1xuICAgIH1cbiAgfVxuXG4gIGl0ZXJhdGUocGFzczEsIGJsb2NrRy5wcmVkZWNlc3NvcnMuYmluZChibG9ja0cpKTtcbiAgaXRlcmF0ZShwYXNzMiwgYmxvY2tHLnN1Y2Nlc3NvcnMuYmluZChibG9ja0cpKTtcblxuICAvLyBBc3NpZ24geCBjb29yZGluYXRlcyB0byBhbGwgbm9kZXNcbiAgXy5mb3JFYWNoKGFsaWduLCBmdW5jdGlvbih2KSB7XG4gICAgeHNbdl0gPSB4c1tyb290W3ZdXTtcbiAgfSk7XG5cbiAgcmV0dXJuIHhzO1xufVxuXG5cbmZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCkge1xuICB2YXIgYmxvY2tHcmFwaCA9IG5ldyBHcmFwaCgpLFxuICAgIGdyYXBoTGFiZWwgPSBnLmdyYXBoKCksXG4gICAgc2VwRm4gPSBzZXAoZ3JhcGhMYWJlbC5ub2Rlc2VwLCBncmFwaExhYmVsLmVkZ2VzZXAsIHJldmVyc2VTZXApO1xuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgdTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB2Um9vdCA9IHJvb3Rbdl07XG4gICAgICBibG9ja0dyYXBoLnNldE5vZGUodlJvb3QpO1xuICAgICAgaWYgKHUpIHtcbiAgICAgICAgdmFyIHVSb290ID0gcm9vdFt1XSxcbiAgICAgICAgICBwcmV2TWF4ID0gYmxvY2tHcmFwaC5lZGdlKHVSb290LCB2Um9vdCk7XG4gICAgICAgIGJsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCwgdlJvb3QsIE1hdGgubWF4KHNlcEZuKGcsIHYsIHUpLCBwcmV2TWF4IHx8IDApKTtcbiAgICAgIH1cbiAgICAgIHUgPSB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gYmxvY2tHcmFwaDtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFsaWdubWVudCB0aGF0IGhhcyB0aGUgc21hbGxlc3Qgd2lkdGggb2YgdGhlIGdpdmVuIGFsaWdubWVudHMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcykge1xuICByZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLCBmdW5jdGlvbiAoeHMpIHtcbiAgICB2YXIgbWF4ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbiAgICBfLmZvckluKHhzLCBmdW5jdGlvbiAoeCwgdikge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoKGcsIHYpIC8gMjtcblxuICAgICAgbWF4ID0gTWF0aC5tYXgoeCArIGhhbGZXaWR0aCwgbWF4KTtcbiAgICAgIG1pbiA9IE1hdGgubWluKHggLSBoYWxmV2lkdGgsIG1pbik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF4IC0gbWluO1xuICB9KTtcbn1cblxuLypcbiAqIEFsaWduIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIG9mIHRoZSBsYXlvdXQgYWxpZ25tZW50cyBzdWNoIHRoYXRcbiAqIGxlZnQtYmlhc2VkIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtaW5pbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXNcbiAqIHRoZSBtaW5pbXVtIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudCBhbmQgcmlnaHQtYmlhc2VkXG4gKiBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWF4aW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzIHRoZSBtYXhpbXVtXG4gKiBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBhbGlnblRvKSB7XG4gIHZhciBhbGlnblRvVmFscyA9IF8udmFsdWVzKGFsaWduVG8pLFxuICAgIGFsaWduVG9NaW4gPSBfLm1pbihhbGlnblRvVmFscyksXG4gICAgYWxpZ25Ub01heCA9IF8ubWF4KGFsaWduVG9WYWxzKTtcblxuICBfLmZvckVhY2goW1widVwiLCBcImRcIl0sIGZ1bmN0aW9uKHZlcnQpIHtcbiAgICBfLmZvckVhY2goW1wibFwiLCBcInJcIl0sIGZ1bmN0aW9uKGhvcml6KSB7XG4gICAgICB2YXIgYWxpZ25tZW50ID0gdmVydCArIGhvcml6LFxuICAgICAgICB4cyA9IHhzc1thbGlnbm1lbnRdLFxuICAgICAgICBkZWx0YTtcbiAgICAgIGlmICh4cyA9PT0gYWxpZ25UbykgcmV0dXJuO1xuXG4gICAgICB2YXIgeHNWYWxzID0gXy52YWx1ZXMoeHMpO1xuICAgICAgZGVsdGEgPSBob3JpeiA9PT0gXCJsXCIgPyBhbGlnblRvTWluIC0gXy5taW4oeHNWYWxzKSA6IGFsaWduVG9NYXggLSBfLm1heCh4c1ZhbHMpO1xuXG4gICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgeHNzW2FsaWdubWVudF0gPSBfLm1hcFZhbHVlcyh4cywgZnVuY3Rpb24oeCkgeyByZXR1cm4geCArIGRlbHRhOyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJhbGFuY2UoeHNzLCBhbGlnbikge1xuICByZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLCBmdW5jdGlvbihpZ25vcmUsIHYpIHtcbiAgICBpZiAoYWxpZ24pIHtcbiAgICAgIHJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB4cyA9IF8uc29ydEJ5KF8ubWFwKHhzcywgdikpO1xuICAgICAgcmV0dXJuICh4c1sxXSArIHhzWzJdKSAvIDI7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25YKGcpIHtcbiAgdmFyIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICB2YXIgY29uZmxpY3RzID0gXy5tZXJnZShcbiAgICBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpLFxuICAgIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykpO1xuXG4gIHZhciB4c3MgPSB7fTtcbiAgdmFyIGFkanVzdGVkTGF5ZXJpbmc7XG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIGFkanVzdGVkTGF5ZXJpbmcgPSB2ZXJ0ID09PSBcInVcIiA/IGxheWVyaW5nIDogXy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtcbiAgICBfLmZvckVhY2goW1wibFwiLCBcInJcIl0sIGZ1bmN0aW9uKGhvcml6KSB7XG4gICAgICBpZiAoaG9yaXogPT09IFwiclwiKSB7XG4gICAgICAgIGFkanVzdGVkTGF5ZXJpbmcgPSBfLm1hcChhZGp1c3RlZExheWVyaW5nLCBmdW5jdGlvbihpbm5lcikge1xuICAgICAgICAgIHJldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5laWdoYm9yRm4gPSAodmVydCA9PT0gXCJ1XCIgPyBnLnByZWRlY2Vzc29ycyA6IGcuc3VjY2Vzc29ycykuYmluZChnKTtcbiAgICAgIHZhciBhbGlnbiA9IHZlcnRpY2FsQWxpZ25tZW50KGcsIGFkanVzdGVkTGF5ZXJpbmcsIGNvbmZsaWN0cywgbmVpZ2hib3JGbik7XG4gICAgICB2YXIgeHMgPSBob3Jpem9udGFsQ29tcGFjdGlvbihnLCBhZGp1c3RlZExheWVyaW5nLFxuICAgICAgICBhbGlnbi5yb290LCBhbGlnbi5hbGlnbiwgaG9yaXogPT09IFwiclwiKTtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgeHMgPSBfLm1hcFZhbHVlcyh4cywgZnVuY3Rpb24oeCkgeyByZXR1cm4gLXg7IH0pO1xuICAgICAgfVxuICAgICAgeHNzW3ZlcnQgKyBob3Jpel0gPSB4cztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIHNtYWxsZXN0V2lkdGggPSBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpO1xuICBhbGlnbkNvb3JkaW5hdGVzKHhzcywgc21hbGxlc3RXaWR0aCk7XG4gIHJldHVybiBiYWxhbmNlKHhzcywgZy5ncmFwaCgpLmFsaWduKTtcbn1cblxuZnVuY3Rpb24gc2VwKG5vZGVTZXAsIGVkZ2VTZXAsIHJldmVyc2VTZXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGcsIHYsIHcpIHtcbiAgICB2YXIgdkxhYmVsID0gZy5ub2RlKHYpO1xuICAgIHZhciB3TGFiZWwgPSBnLm5vZGUodyk7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGRlbHRhO1xuXG4gICAgc3VtICs9IHZMYWJlbC53aWR0aCAvIDI7XG4gICAgaWYgKF8uaGFzKHZMYWJlbCwgXCJsYWJlbHBvc1wiKSkge1xuICAgICAgc3dpdGNoICh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImxcIjogZGVsdGEgPSAtdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IHZMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHN1bSArPSByZXZlcnNlU2VwID8gZGVsdGEgOiAtZGVsdGE7XG4gICAgfVxuICAgIGRlbHRhID0gMDtcblxuICAgIHN1bSArPSAodkxhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcbiAgICBzdW0gKz0gKHdMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7XG5cbiAgICBzdW0gKz0gd0xhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXMod0xhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IHdMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZGVsdGEgPSAtd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgcmV0dXJuIHN1bTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2lkdGgoZywgdikge1xuICByZXR1cm4gZy5ub2RlKHYpLndpZHRoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG52YXIgcG9zaXRpb25YID0gcmVxdWlyZShcIi4vYmtcIikucG9zaXRpb25YO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc2l0aW9uO1xuXG5mdW5jdGlvbiBwb3NpdGlvbihnKSB7XG4gIGcgPSB1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKTtcblxuICBwb3NpdGlvblkoZyk7XG4gIF8uZm9yRWFjaChwb3NpdGlvblgoZyksIGZ1bmN0aW9uKHgsIHYpIHtcbiAgICBnLm5vZGUodikueCA9IHg7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblkoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciByYW5rU2VwID0gZy5ncmFwaCgpLnJhbmtzZXA7XG4gIHZhciBwcmV2WSA9IDA7XG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gXy5tYXgoXy5tYXAobGF5ZXIsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5oZWlnaHQ7IH0pKTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIGcubm9kZSh2KS55ID0gcHJldlkgKyBtYXhIZWlnaHQgLyAyO1xuICAgIH0pO1xuICAgIHByZXZZICs9IG1heEhlaWdodCArIHJhbmtTZXA7XG4gIH0pO1xufVxuXG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcblxubW9kdWxlLmV4cG9ydHMgPSBmZWFzaWJsZVRyZWU7XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgc3Bhbm5pbmcgdHJlZSB3aXRoIHRpZ2h0IGVkZ2VzIGFuZCBhZGp1c3RlZCB0aGUgaW5wdXQgbm9kZSdzXG4gKiByYW5rcyB0byBhY2hpZXZlIHRoaXMuIEEgdGlnaHQgZWRnZSBpcyBvbmUgdGhhdCBpcyBoYXMgYSBsZW5ndGggdGhhdCBtYXRjaGVzXG4gKiBpdHMgXCJtaW5sZW5cIiBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGJhc2ljIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkFcbiAqIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gR3JhcGggbXVzdCBiZSBjb25uZWN0ZWQuXG4gKiAgICAzLiBHcmFwaCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vZGUuXG4gKiAgICA1LiBHcmFwaCBub2RlcyBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkIGEgXCJyYW5rXCIgcHJvcGVydHkgdGhhdFxuICogICAgICAgcmVzcGVjdHMgdGhlIFwibWlubGVuXCIgcHJvcGVydHkgb2YgaW5jaWRlbnQgZWRnZXMuXG4gKiAgICA2LiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgYSBcIm1pbmxlblwiIHByb3BlcnR5LlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAtIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSB0aGVpciByYW5rIGFkanVzdGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBlZGdlcyBhcmVcbiAqICAgICAgdGlnaHQuXG4gKlxuICogUmV0dXJucyBhIHRyZWUgKHVuZGlyZWN0ZWQgZ3JhcGgpIHRoYXQgaXMgY29uc3RydWN0ZWQgdXNpbmcgb25seSBcInRpZ2h0XCJcbiAqIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBmZWFzaWJsZVRyZWUoZykge1xuICB2YXIgdCA9IG5ldyBHcmFwaCh7IGRpcmVjdGVkOiBmYWxzZSB9KTtcblxuICAvLyBDaG9vc2UgYXJiaXRyYXJ5IG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBvdXIgdHJlZVxuICB2YXIgc3RhcnQgPSBnLm5vZGVzKClbMF07XG4gIHZhciBzaXplID0gZy5ub2RlQ291bnQoKTtcbiAgdC5zZXROb2RlKHN0YXJ0LCB7fSk7XG5cbiAgdmFyIGVkZ2UsIGRlbHRhO1xuICB3aGlsZSAodGlnaHRUcmVlKHQsIGcpIDwgc2l6ZSkge1xuICAgIGVkZ2UgPSBmaW5kTWluU2xhY2tFZGdlKHQsIGcpO1xuICAgIGRlbHRhID0gdC5oYXNOb2RlKGVkZ2UudikgPyBzbGFjayhnLCBlZGdlKSA6IC1zbGFjayhnLCBlZGdlKTtcbiAgICBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKTtcbiAgfVxuXG4gIHJldHVybiB0O1xufVxuXG4vKlxuICogRmluZHMgYSBtYXhpbWFsIHRyZWUgb2YgdGlnaHQgZWRnZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGVcbiAqIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRpZ2h0VHJlZSh0LCBnKSB7XG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgXy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgZWRnZVYgPSBlLnYsXG4gICAgICAgIHcgPSAodiA9PT0gZWRnZVYpID8gZS53IDogZWRnZVY7XG4gICAgICBpZiAoIXQuaGFzTm9kZSh3KSAmJiAhc2xhY2soZywgZSkpIHtcbiAgICAgICAgdC5zZXROb2RlKHcsIHt9KTtcbiAgICAgICAgdC5zZXRFZGdlKHYsIHcsIHt9KTtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZGZzKTtcbiAgcmV0dXJuIHQubm9kZUNvdW50KCk7XG59XG5cbi8qXG4gKiBGaW5kcyB0aGUgZWRnZSB3aXRoIHRoZSBzbWFsbGVzdCBzbGFjayB0aGF0IGlzIGluY2lkZW50IG9uIHRyZWUgYW5kIHJldHVybnNcbiAqIGl0LlxuICovXG5mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsIGcpIHtcbiAgcmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHQuaGFzTm9kZShlLnYpICE9PSB0Lmhhc05vZGUoZS53KSkge1xuICAgICAgcmV0dXJuIHNsYWNrKGcsIGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpIHtcbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGcubm9kZSh2KS5yYW5rICs9IGRlbHRhO1xuICB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgcmFua1V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIGxvbmdlc3RQYXRoID0gcmFua1V0aWwubG9uZ2VzdFBhdGg7XG52YXIgZmVhc2libGVUcmVlID0gcmVxdWlyZShcIi4vZmVhc2libGUtdHJlZVwiKTtcbnZhciBuZXR3b3JrU2ltcGxleCA9IHJlcXVpcmUoXCIuL25ldHdvcmstc2ltcGxleFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5rO1xuXG4vKlxuICogQXNzaWducyBhIHJhbmsgdG8gZWFjaCBub2RlIGluIHRoZSBpbnB1dCBncmFwaCB0aGF0IHJlc3BlY3RzIHRoZSBcIm1pbmxlblwiXG4gKiBjb25zdHJhaW50IHNwZWNpZmllZCBvbiBlZGdlcyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFRoaXMgYmFzaWMgc3RydWN0dXJlIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWUgZm9yXG4gKiBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBjb25uZWN0ZWQgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHNcbiAqICAgIDMuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBcIndlaWdodFwiIGFuZCBcIm1pbmxlblwiIGF0dHJpYnV0ZXNcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGEgXCJyYW5rXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZVxuICogICAgICAgYWxnb3JpdGhtLiBSYW5rcyBjYW4gc3RhcnQgYXQgYW55IGluZGV4IChpbmNsdWRpbmcgbmVnYXRpdmUpLCB3ZSdsbFxuICogICAgICAgZml4IHRoZW0gdXAgbGF0ZXIuXG4gKi9cbmZ1bmN0aW9uIHJhbmsoZykge1xuICBzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcikge1xuICBjYXNlIFwibmV0d29yay1zaW1wbGV4XCI6IG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpOyBicmVhaztcbiAgY2FzZSBcInRpZ2h0LXRyZWVcIjogdGlnaHRUcmVlUmFua2VyKGcpOyBicmVhaztcbiAgY2FzZSBcImxvbmdlc3QtcGF0aFwiOiBsb25nZXN0UGF0aFJhbmtlcihnKTsgYnJlYWs7XG4gIGRlZmF1bHQ6IG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpO1xuICB9XG59XG5cbi8vIEEgZmFzdCBhbmQgc2ltcGxlIHJhbmtlciwgYnV0IHJlc3VsdHMgYXJlIGZhciBmcm9tIG9wdGltYWwuXG52YXIgbG9uZ2VzdFBhdGhSYW5rZXIgPSBsb25nZXN0UGF0aDtcblxuZnVuY3Rpb24gdGlnaHRUcmVlUmFua2VyKGcpIHtcbiAgbG9uZ2VzdFBhdGgoZyk7XG4gIGZlYXNpYmxlVHJlZShnKTtcbn1cblxuZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZykge1xuICBuZXR3b3JrU2ltcGxleChnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgZmVhc2libGVUcmVlID0gcmVxdWlyZShcIi4vZmVhc2libGUtdHJlZVwiKTtcbnZhciBzbGFjayA9IHJlcXVpcmUoXCIuL3V0aWxcIikuc2xhY2s7XG52YXIgaW5pdFJhbmsgPSByZXF1aXJlKFwiLi91dGlsXCIpLmxvbmdlc3RQYXRoO1xudmFyIHByZW9yZGVyID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLmFsZy5wcmVvcmRlcjtcbnZhciBwb3N0b3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnBvc3RvcmRlcjtcbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoXCIuLi91dGlsXCIpLnNpbXBsaWZ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldHdvcmtTaW1wbGV4O1xuXG4vLyBFeHBvc2Ugc29tZSBpbnRlcm5hbHMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbm5ldHdvcmtTaW1wbGV4LmluaXRMb3dMaW1WYWx1ZXMgPSBpbml0TG93TGltVmFsdWVzO1xubmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcyA9IGluaXRDdXRWYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5jYWxjQ3V0VmFsdWUgPSBjYWxjQ3V0VmFsdWU7XG5uZXR3b3JrU2ltcGxleC5sZWF2ZUVkZ2UgPSBsZWF2ZUVkZ2U7XG5uZXR3b3JrU2ltcGxleC5lbnRlckVkZ2UgPSBlbnRlckVkZ2U7XG5uZXR3b3JrU2ltcGxleC5leGNoYW5nZUVkZ2VzID0gZXhjaGFuZ2VFZGdlcztcblxuLypcbiAqIFRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtIGFzc2lnbnMgcmFua3MgdG8gZWFjaCBub2RlIGluIHRoZSBpbnB1dCBncmFwaFxuICogYW5kIGl0ZXJhdGl2ZWx5IGltcHJvdmVzIHRoZSByYW5raW5nIHRvIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIGVkZ2VzLlxuICpcbiAqIFByZWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gVGhlIGlucHV0IGdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIG11c3QgaGF2ZSBhbiBvYmplY3QgdmFsdWUuXG4gKiAgICAzLiBBbGwgZWRnZXMgaW4gdGhlIGdyYXBoIG11c3QgaGF2ZSBcIm1pbmxlblwiIGFuZCBcIndlaWdodFwiIGF0dHJpYnV0ZXMuXG4gKlxuICogUG9zdGNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gQWxsIG5vZGVzIGluIHRoZSBncmFwaCB3aWxsIGhhdmUgYW4gYXNzaWduZWQgXCJyYW5rXCIgYXR0cmlidXRlIHRoYXQgaGFzXG4gKiAgICAgICBiZWVuIG9wdGltaXplZCBieSB0aGUgbmV0d29yayBzaW1wbGV4IGFsZ29yaXRobS4gUmFua3Mgc3RhcnQgYXQgMC5cbiAqXG4gKlxuICogQSByb3VnaCBza2V0Y2ggb2YgdGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOlxuICpcbiAqICAgIDEuIEFzc2lnbiBpbml0aWFsIHJhbmtzIHRvIGVhY2ggbm9kZS4gV2UgdXNlIHRoZSBsb25nZXN0IHBhdGggYWxnb3JpdGhtLFxuICogICAgICAgd2hpY2ggYXNzaWducyByYW5rcyB0byB0aGUgbG93ZXN0IHBvc2l0aW9uIHBvc3NpYmxlLiBJbiBnZW5lcmFsIHRoaXNcbiAqICAgICAgIGxlYWRzIHRvIHZlcnkgd2lkZSBib3R0b20gcmFua3MgYW5kIHVubmVjZXNzYXJpbHkgbG9uZyBlZGdlcy5cbiAqICAgIDIuIENvbnN0cnVjdCBhIGZlYXNpYmxlIHRpZ2h0IHRyZWUuIEEgdGlnaHQgdHJlZSBpcyBvbmUgc3VjaCB0aGF0IGFsbFxuICogICAgICAgZWRnZXMgaW4gdGhlIHRyZWUgaGF2ZSBubyBzbGFjayAoZGlmZmVyZW5jZSBiZXR3ZWVuIGxlbmd0aCBvZiBlZGdlXG4gKiAgICAgICBhbmQgbWlubGVuIGZvciB0aGUgZWRnZSkuIFRoaXMgYnkgaXRzZWxmIGdyZWF0bHkgaW1wcm92ZXMgdGhlIGFzc2lnbmVkXG4gKiAgICAgICByYW5raW5ncyBieSBzaG9ydGluZyBlZGdlcy5cbiAqICAgIDMuIEl0ZXJhdGl2ZWx5IGZpbmQgZWRnZXMgdGhhdCBoYXZlIG5lZ2F0aXZlIGN1dCB2YWx1ZXMuIEdlbmVyYWxseSBhXG4gKiAgICAgICBuZWdhdGl2ZSBjdXQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGVkZ2UgY291bGQgYmUgcmVtb3ZlZCBhbmQgYSBuZXdcbiAqICAgICAgIHRyZWUgZWRnZSBjb3VsZCBiZSBhZGRlZCB0byBwcm9kdWNlIGEgbW9yZSBjb21wYWN0IGdyYXBoLlxuICpcbiAqIE11Y2ggb2YgdGhlIGFsZ29yaXRobXMgaGVyZSBhcmUgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZVxuICogZm9yIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGUgcm91Z2hseSBmb2xsb3dzIHRoZVxuICogc3RydWN0dXJlIG9mIHRoZSBvdmVyYWxsIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya1NpbXBsZXgoZykge1xuICBnID0gc2ltcGxpZnkoZyk7XG4gIGluaXRSYW5rKGcpO1xuICB2YXIgdCA9IGZlYXNpYmxlVHJlZShnKTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcblxuICB2YXIgZSwgZjtcbiAgd2hpbGUgKChlID0gbGVhdmVFZGdlKHQpKSkge1xuICAgIGYgPSBlbnRlckVkZ2UodCwgZywgZSk7XG4gICAgZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKTtcbiAgfVxufVxuXG4vKlxuICogSW5pdGlhbGl6ZXMgY3V0IHZhbHVlcyBmb3IgYWxsIGVkZ2VzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpbml0Q3V0VmFsdWVzKHQsIGcpIHtcbiAgdmFyIHZzID0gcG9zdG9yZGVyKHQsIHQubm9kZXMoKSk7XG4gIHZzID0gdnMuc2xpY2UoMCwgdnMubGVuZ3RoIC0gMSk7XG4gIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkN1dFZhbHVlKHQsIGcsIHYpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCwgZywgY2hpbGQpIHtcbiAgdmFyIGNoaWxkTGFiID0gdC5ub2RlKGNoaWxkKTtcbiAgdmFyIHBhcmVudCA9IGNoaWxkTGFiLnBhcmVudDtcbiAgdC5lZGdlKGNoaWxkLCBwYXJlbnQpLmN1dHZhbHVlID0gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKTtcbn1cblxuLypcbiAqIEdpdmVuIHRoZSB0aWdodCB0cmVlLCBpdHMgZ3JhcGgsIGFuZCBhIGNoaWxkIGluIHRoZSBncmFwaCBjYWxjdWxhdGUgYW5kXG4gKiByZXR1cm4gdGhlIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGUgY2hpbGQgYW5kIGl0cyBwYXJlbnQuXG4gKi9cbmZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICAvLyBUcnVlIGlmIHRoZSBjaGlsZCBpcyBvbiB0aGUgdGFpbCBlbmQgb2YgdGhlIGVkZ2UgaW4gdGhlIGRpcmVjdGVkIGdyYXBoXG4gIHZhciBjaGlsZElzVGFpbCA9IHRydWU7XG4gIC8vIFRoZSBncmFwaCdzIHZpZXcgb2YgdGhlIHRyZWUgZWRnZSB3ZSdyZSBpbnNwZWN0aW5nXG4gIHZhciBncmFwaEVkZ2UgPSBnLmVkZ2UoY2hpbGQsIHBhcmVudCk7XG4gIC8vIFRoZSBhY2N1bXVsYXRlZCBjdXQgdmFsdWUgZm9yIHRoZSBlZGdlIGJldHdlZW4gdGhpcyBub2RlIGFuZCBpdHMgcGFyZW50XG4gIHZhciBjdXRWYWx1ZSA9IDA7XG5cbiAgaWYgKCFncmFwaEVkZ2UpIHtcbiAgICBjaGlsZElzVGFpbCA9IGZhbHNlO1xuICAgIGdyYXBoRWRnZSA9IGcuZWRnZShwYXJlbnQsIGNoaWxkKTtcbiAgfVxuXG4gIGN1dFZhbHVlID0gZ3JhcGhFZGdlLndlaWdodDtcblxuICBfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGlzT3V0RWRnZSA9IGUudiA9PT0gY2hpbGQsXG4gICAgICBvdGhlciA9IGlzT3V0RWRnZSA/IGUudyA6IGUudjtcblxuICAgIGlmIChvdGhlciAhPT0gcGFyZW50KSB7XG4gICAgICB2YXIgcG9pbnRzVG9IZWFkID0gaXNPdXRFZGdlID09PSBjaGlsZElzVGFpbCxcbiAgICAgICAgb3RoZXJXZWlnaHQgPSBnLmVkZ2UoZSkud2VpZ2h0O1xuXG4gICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyBvdGhlcldlaWdodCA6IC1vdGhlcldlaWdodDtcbiAgICAgIGlmIChpc1RyZWVFZGdlKHQsIGNoaWxkLCBvdGhlcikpIHtcbiAgICAgICAgdmFyIG90aGVyQ3V0VmFsdWUgPSB0LmVkZ2UoY2hpbGQsIG90aGVyKS5jdXR2YWx1ZTtcbiAgICAgICAgY3V0VmFsdWUgKz0gcG9pbnRzVG9IZWFkID8gLW90aGVyQ3V0VmFsdWUgOiBvdGhlckN1dFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGN1dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUsIHJvb3QpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgcm9vdCA9IHRyZWUubm9kZXMoKVswXTtcbiAgfVxuICBkZnNBc3NpZ25Mb3dMaW0odHJlZSwge30sIDEsIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBkZnNBc3NpZ25Mb3dMaW0odHJlZSwgdmlzaXRlZCwgbmV4dExpbSwgdiwgcGFyZW50KSB7XG4gIHZhciBsb3cgPSBuZXh0TGltO1xuICB2YXIgbGFiZWwgPSB0cmVlLm5vZGUodik7XG5cbiAgdmlzaXRlZFt2XSA9IHRydWU7XG4gIF8uZm9yRWFjaCh0cmVlLm5laWdoYm9ycyh2KSwgZnVuY3Rpb24odykge1xuICAgIGlmICghXy5oYXModmlzaXRlZCwgdykpIHtcbiAgICAgIG5leHRMaW0gPSBkZnNBc3NpZ25Mb3dMaW0odHJlZSwgdmlzaXRlZCwgbmV4dExpbSwgdywgdik7XG4gICAgfVxuICB9KTtcblxuICBsYWJlbC5sb3cgPSBsb3c7XG4gIGxhYmVsLmxpbSA9IG5leHRMaW0rKztcbiAgaWYgKHBhcmVudCkge1xuICAgIGxhYmVsLnBhcmVudCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIHdoZW4gd2UgaW5jcmVtZW50YWxseSB1cGRhdGUgbG93IGxpbVxuICAgIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gbmV4dExpbTtcbn1cblxuZnVuY3Rpb24gbGVhdmVFZGdlKHRyZWUpIHtcbiAgcmV0dXJuIF8uZmluZCh0cmVlLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlIDwgMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVudGVyRWRnZSh0LCBnLCBlZGdlKSB7XG4gIHZhciB2ID0gZWRnZS52O1xuICB2YXIgdyA9IGVkZ2UudztcblxuICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiB3ZSBhc3N1bWUgdGhhdCB2IGlzIHRoZSB0YWlsIGFuZCB3IGlzIHRoZVxuICAvLyBoZWFkLCBzbyBpZiB3ZSBkb24ndCBoYXZlIHRoaXMgZWRnZSBpbiB0aGUgZ3JhcGggd2Ugc2hvdWxkIGZsaXAgaXQgdG9cbiAgLy8gbWF0Y2ggdGhlIGNvcnJlY3Qgb3JpZW50YXRpb24uXG4gIGlmICghZy5oYXNFZGdlKHYsIHcpKSB7XG4gICAgdiA9IGVkZ2UudztcbiAgICB3ID0gZWRnZS52O1xuICB9XG5cbiAgdmFyIHZMYWJlbCA9IHQubm9kZSh2KTtcbiAgdmFyIHdMYWJlbCA9IHQubm9kZSh3KTtcbiAgdmFyIHRhaWxMYWJlbCA9IHZMYWJlbDtcbiAgdmFyIGZsaXAgPSBmYWxzZTtcblxuICAvLyBJZiB0aGUgcm9vdCBpcyBpbiB0aGUgdGFpbCBvZiB0aGUgZWRnZSB0aGVuIHdlIG5lZWQgdG8gZmxpcCB0aGUgbG9naWMgdGhhdFxuICAvLyBjaGVja3MgZm9yIHRoZSBoZWFkIGFuZCB0YWlsIG5vZGVzIGluIHRoZSBjYW5kaWRhdGVzIGZ1bmN0aW9uIGJlbG93LlxuICBpZiAodkxhYmVsLmxpbSA+IHdMYWJlbC5saW0pIHtcbiAgICB0YWlsTGFiZWwgPSB3TGFiZWw7XG4gICAgZmxpcCA9IHRydWU7XG4gIH1cblxuICB2YXIgY2FuZGlkYXRlcyA9IF8uZmlsdGVyKGcuZWRnZXMoKSwgZnVuY3Rpb24oZWRnZSkge1xuICAgIHJldHVybiBmbGlwID09PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudiksIHRhaWxMYWJlbCkgJiZcbiAgICAgICAgICAgZmxpcCAhPT0gaXNEZXNjZW5kYW50KHQsIHQubm9kZShlZGdlLncpLCB0YWlsTGFiZWwpO1xuICB9KTtcblxuICByZXR1cm4gXy5taW5CeShjYW5kaWRhdGVzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBzbGFjayhnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCwgZywgZSwgZikge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHcgPSBlLnc7XG4gIHQucmVtb3ZlRWRnZSh2LCB3KTtcbiAgdC5zZXRFZGdlKGYudiwgZi53LCB7fSk7XG4gIGluaXRMb3dMaW1WYWx1ZXModCk7XG4gIGluaXRDdXRWYWx1ZXModCwgZyk7XG4gIHVwZGF0ZVJhbmtzKHQsIGcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSYW5rcyh0LCBnKSB7XG4gIHZhciByb290ID0gXy5maW5kKHQubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gIWcubm9kZSh2KS5wYXJlbnQ7IH0pO1xuICB2YXIgdnMgPSBwcmVvcmRlcih0LCByb290KTtcbiAgdnMgPSB2cy5zbGljZSgxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHBhcmVudCA9IHQubm9kZSh2KS5wYXJlbnQsXG4gICAgICBlZGdlID0gZy5lZGdlKHYsIHBhcmVudCksXG4gICAgICBmbGlwcGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIWVkZ2UpIHtcbiAgICAgIGVkZ2UgPSBnLmVkZ2UocGFyZW50LCB2KTtcbiAgICAgIGZsaXBwZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGcubm9kZSh2KS5yYW5rID0gZy5ub2RlKHBhcmVudCkucmFuayArIChmbGlwcGVkID8gZWRnZS5taW5sZW4gOiAtZWRnZS5taW5sZW4pO1xuICB9KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWRnZSBpcyBpbiB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLCB1LCB2KSB7XG4gIHJldHVybiB0cmVlLmhhc0VkZ2UodSwgdik7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGRlc2NlbmRhbnQgb2YgdGhlIHJvb3Qgbm9kZSBwZXIgdGhlXG4gKiBhc3NpZ25lZCBsb3cgYW5kIGxpbSBhdHRyaWJ1dGVzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc0Rlc2NlbmRhbnQodHJlZSwgdkxhYmVsLCByb290TGFiZWwpIHtcbiAgcmV0dXJuIHJvb3RMYWJlbC5sb3cgPD0gdkxhYmVsLmxpbSAmJiB2TGFiZWwubGltIDw9IHJvb3RMYWJlbC5saW07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbG9uZ2VzdFBhdGg6IGxvbmdlc3RQYXRoLFxuICBzbGFjazogc2xhY2tcbn07XG5cbi8qXG4gKiBJbml0aWFsaXplcyByYW5rcyBmb3IgdGhlIGlucHV0IGdyYXBoIHVzaW5nIHRoZSBsb25nZXN0IHBhdGggYWxnb3JpdGhtLiBUaGlzXG4gKiBhbGdvcml0aG0gc2NhbGVzIHdlbGwgYW5kIGlzIGZhc3QgaW4gcHJhY3RpY2UsIGl0IHlpZWxkcyByYXRoZXIgcG9vclxuICogc29sdXRpb25zLiBOb2RlcyBhcmUgcHVzaGVkIHRvIHRoZSBsb3dlc3QgbGF5ZXIgcG9zc2libGUsIGxlYXZpbmcgdGhlIGJvdHRvbVxuICogcmFua3Mgd2lkZSBhbmQgbGVhdmluZyBlZGdlcyBsb25nZXIgdGhhbiBuZWNlc3NhcnkuIEhvd2V2ZXIsIGR1ZSB0byBpdHNcbiAqIHNwZWVkLCB0aGlzIGFsZ29yaXRobSBpcyBnb29kIGZvciBnZXR0aW5nIGFuIGluaXRpYWwgcmFua2luZyB0aGF0IGNhbiBiZSBmZWRcbiAqIGludG8gb3RoZXIgYWxnb3JpdGhtcy5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBkb2VzIG5vdCBub3JtYWxpemUgbGF5ZXJzIGJlY2F1c2UgaXQgd2lsbCBiZSB1c2VkIGJ5IG90aGVyXG4gKiBhbGdvcml0aG1zIGluIG1vc3QgY2FzZXMuIElmIHVzaW5nIHRoaXMgYWxnb3JpdGhtIGRpcmVjdGx5LCBiZSBzdXJlIHRvXG4gKiBydW4gbm9ybWFsaXplIGF0IHRoZSBlbmQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgYSBEQUcuXG4gKiAgICAyLiBJbnB1dCBncmFwaCBub2RlIGxhYmVscyBjYW4gYmUgYXNzaWduZWQgcHJvcGVydGllcy5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gRWFjaCBub2RlIHdpbGwgYmUgYXNzaWduIGFuICh1bm5vcm1hbGl6ZWQpIFwicmFua1wiIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBsb25nZXN0UGF0aChnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICByZXR1cm4gbGFiZWwucmFuaztcbiAgICB9XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICB2YXIgcmFuayA9IF8ubWluKF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBkZnMoZS53KSAtIGcuZWRnZShlKS5taW5sZW47XG4gICAgfSkpO1xuXG4gICAgaWYgKHJhbmsgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggM1xuICAgICAgICByYW5rID09PSB1bmRlZmluZWQgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDRcbiAgICAgICAgcmFuayA9PT0gbnVsbCkgeyAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW251bGxdKVxuICAgICAgcmFuayA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChsYWJlbC5yYW5rID0gcmFuayk7XG4gIH1cblxuICBfLmZvckVhY2goZy5zb3VyY2VzKCksIGRmcyk7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc2xhY2sgZm9yIHRoZSBnaXZlbiBlZGdlLiBUaGUgc2xhY2sgaXMgZGVmaW5lZCBhcyB0aGVcbiAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlIGFuZCBpdHMgbWluaW11bSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNsYWNrKGcsIGUpIHtcbiAgcmV0dXJuIGcubm9kZShlLncpLnJhbmsgLSBnLm5vZGUoZS52KS5yYW5rIC0gZy5lZGdlKGUpLm1pbmxlbjtcbn1cbiIsIi8qIGVzbGludCBcIm5vLWNvbnNvbGVcIjogb2ZmICovXG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkRHVtbXlOb2RlOiBhZGREdW1teU5vZGUsXG4gIHNpbXBsaWZ5OiBzaW1wbGlmeSxcbiAgYXNOb25Db21wb3VuZEdyYXBoOiBhc05vbkNvbXBvdW5kR3JhcGgsXG4gIHN1Y2Nlc3NvcldlaWdodHM6IHN1Y2Nlc3NvcldlaWdodHMsXG4gIHByZWRlY2Vzc29yV2VpZ2h0czogcHJlZGVjZXNzb3JXZWlnaHRzLFxuICBpbnRlcnNlY3RSZWN0OiBpbnRlcnNlY3RSZWN0LFxuICBidWlsZExheWVyTWF0cml4OiBidWlsZExheWVyTWF0cml4LFxuICBub3JtYWxpemVSYW5rczogbm9ybWFsaXplUmFua3MsXG4gIHJlbW92ZUVtcHR5UmFua3M6IHJlbW92ZUVtcHR5UmFua3MsXG4gIGFkZEJvcmRlck5vZGU6IGFkZEJvcmRlck5vZGUsXG4gIG1heFJhbms6IG1heFJhbmssXG4gIHBhcnRpdGlvbjogcGFydGl0aW9uLFxuICB0aW1lOiB0aW1lLFxuICBub3RpbWU6IG5vdGltZVxufTtcblxuLypcbiAqIEFkZHMgYSBkdW1teSBub2RlIHRvIHRoZSBncmFwaCBhbmQgcmV0dXJuIHYuXG4gKi9cbmZ1bmN0aW9uIGFkZER1bW15Tm9kZShnLCB0eXBlLCBhdHRycywgbmFtZSkge1xuICB2YXIgdjtcbiAgZG8ge1xuICAgIHYgPSBfLnVuaXF1ZUlkKG5hbWUpO1xuICB9IHdoaWxlIChnLmhhc05vZGUodikpO1xuXG4gIGF0dHJzLmR1bW15ID0gdHlwZTtcbiAgZy5zZXROb2RlKHYsIGF0dHJzKTtcbiAgcmV0dXJuIHY7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGEgbmV3IGdyYXBoIHdpdGggb25seSBzaW1wbGUgZWRnZXMuIEhhbmRsZXMgYWdncmVnYXRpb24gb2YgZGF0YVxuICogYXNzb2NpYXRlZCB3aXRoIG11bHRpLWVkZ2VzLlxuICovXG5mdW5jdGlvbiBzaW1wbGlmeShnKSB7XG4gIHZhciBzaW1wbGlmaWVkID0gbmV3IEdyYXBoKCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzaW1wbGlmaWVkLnNldE5vZGUodiwgZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgc2ltcGxlTGFiZWwgPSBzaW1wbGlmaWVkLmVkZ2UoZS52LCBlLncpIHx8IHsgd2VpZ2h0OiAwLCBtaW5sZW46IDEgfTtcbiAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7XG4gICAgc2ltcGxpZmllZC5zZXRFZGdlKGUudiwgZS53LCB7XG4gICAgICB3ZWlnaHQ6IHNpbXBsZUxhYmVsLndlaWdodCArIGxhYmVsLndlaWdodCxcbiAgICAgIG1pbmxlbjogTWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLCBsYWJlbC5taW5sZW4pXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gc2ltcGxpZmllZDtcbn1cblxuZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoeyBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpIH0pLnNldEdyYXBoKGcuZ3JhcGgoKSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICBzaW1wbGlmaWVkLnNldE5vZGUodiwgZy5ub2RlKHYpKTtcbiAgICB9XG4gIH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgc2ltcGxpZmllZC5zZXRFZGdlKGUsIGcuZWRnZShlKSk7XG4gIH0pO1xuICByZXR1cm4gc2ltcGxpZmllZDtcbn1cblxuZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKSB7XG4gIHZhciB3ZWlnaHRNYXAgPSBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgc3VjcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBzdWNzW2Uud10gPSAoc3Vjc1tlLnddIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDtcbiAgICB9KTtcbiAgICByZXR1cm4gc3VjcztcbiAgfSk7XG4gIHJldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksIHdlaWdodE1hcCk7XG59XG5cbmZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKSB7XG4gIHZhciB3ZWlnaHRNYXAgPSBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcHJlZHMgPSB7fTtcbiAgICBfLmZvckVhY2goZy5pbkVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBwcmVkc1tlLnZdID0gKHByZWRzW2Uudl0gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBwcmVkcztcbiAgfSk7XG4gIHJldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksIHdlaWdodE1hcCk7XG59XG5cbi8qXG4gKiBGaW5kcyB3aGVyZSBhIGxpbmUgc3RhcnRpbmcgYXQgcG9pbnQgKHt4LCB5fSkgd291bGQgaW50ZXJzZWN0IGEgcmVjdGFuZ2xlXG4gKiAoe3gsIHksIHdpZHRoLCBoZWlnaHR9KSBpZiBpdCB3ZXJlIHBvaW50aW5nIGF0IHRoZSByZWN0YW5nbGUncyBjZW50ZXIuXG4gKi9cbmZ1bmN0aW9uIGludGVyc2VjdFJlY3QocmVjdCwgcG9pbnQpIHtcbiAgdmFyIHggPSByZWN0Lng7XG4gIHZhciB5ID0gcmVjdC55O1xuXG4gIC8vIFJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gYWxnb3JpdGhtIGZyb206XG4gIC8vIGh0dHA6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMDgxMTMvZmluZC1lZGdlLWJldHdlZW4tdHdvLWJveGVzXG4gIHZhciBkeCA9IHBvaW50LnggLSB4O1xuICB2YXIgZHkgPSBwb2ludC55IC0geTtcbiAgdmFyIHcgPSByZWN0LndpZHRoIC8gMjtcbiAgdmFyIGggPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgaWYgKCFkeCAmJiAhZHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGVcIik7XG4gIH1cblxuICB2YXIgc3gsIHN5O1xuICBpZiAoTWF0aC5hYnMoZHkpICogdyA+IE1hdGguYWJzKGR4KSAqIGgpIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgdG9wIG9yIGJvdHRvbSBvZiByZWN0LlxuICAgIGlmIChkeSA8IDApIHtcbiAgICAgIGggPSAtaDtcbiAgICB9XG4gICAgc3ggPSBoICogZHggLyBkeTtcbiAgICBzeSA9IGg7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW50ZXJzZWN0aW9uIGlzIGxlZnQgb3IgcmlnaHQgb2YgcmVjdC5cbiAgICBpZiAoZHggPCAwKSB7XG4gICAgICB3ID0gLXc7XG4gICAgfVxuICAgIHN4ID0gdztcbiAgICBzeSA9IHcgKiBkeSAvIGR4O1xuICB9XG5cbiAgcmV0dXJuIHsgeDogeCArIHN4LCB5OiB5ICsgc3kgfTtcbn1cblxuLypcbiAqIEdpdmVuIGEgREFHIHdpdGggZWFjaCBub2RlIGFzc2lnbmVkIFwicmFua1wiIGFuZCBcIm9yZGVyXCIgcHJvcGVydGllcywgdGhpc1xuICogZnVuY3Rpb24gd2lsbCBwcm9kdWNlIGEgbWF0cml4IHdpdGggdGhlIGlkcyBvZiBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsoZykgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcmFuayA9IG5vZGUucmFuaztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocmFuaykpIHtcbiAgICAgIGxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdID0gdjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGF5ZXJpbmc7XG59XG5cbi8qXG4gKiBBZGp1c3RzIHRoZSByYW5rcyBmb3IgYWxsIG5vZGVzIGluIHRoZSBncmFwaCBzdWNoIHRoYXQgYWxsIG5vZGVzIHYgaGF2ZVxuICogcmFuayh2KSA+PSAwIGFuZCBhdCBsZWFzdCBvbmUgbm9kZSB3IGhhcyByYW5rKHcpID0gMC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZykge1xuICB2YXIgbWluID0gXy5taW4oXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKF8uaGFzKG5vZGUsIFwicmFua1wiKSkge1xuICAgICAgbm9kZS5yYW5rIC09IG1pbjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpIHtcbiAgLy8gUmFua3MgbWF5IG5vdCBzdGFydCBhdCAwLCBzbyB3ZSBuZWVkIHRvIG9mZnNldCB0aGVtXG4gIHZhciBvZmZzZXQgPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG5cbiAgdmFyIGxheWVycyA9IFtdO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuayAtIG9mZnNldDtcbiAgICBpZiAoIWxheWVyc1tyYW5rXSkge1xuICAgICAgbGF5ZXJzW3JhbmtdID0gW107XG4gICAgfVxuICAgIGxheWVyc1tyYW5rXS5wdXNoKHYpO1xuICB9KTtcblxuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgbm9kZVJhbmtGYWN0b3IgPSBnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKHZzLCBpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQodnMpICYmIGkgJSBub2RlUmFua0ZhY3RvciAhPT0gMCkge1xuICAgICAgLS1kZWx0YTtcbiAgICB9IGVsc2UgaWYgKGRlbHRhKSB7XG4gICAgICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHsgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7IH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZywgcHJlZml4LCByYW5rLCBvcmRlcikge1xuICB2YXIgbm9kZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkge1xuICAgIG5vZGUucmFuayA9IHJhbms7XG4gICAgbm9kZS5vcmRlciA9IG9yZGVyO1xuICB9XG4gIHJldHVybiBhZGREdW1teU5vZGUoZywgXCJib3JkZXJcIiwgbm9kZSwgcHJlZml4KTtcbn1cblxuZnVuY3Rpb24gbWF4UmFuayhnKSB7XG4gIHJldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgcmV0dXJuIHJhbms7XG4gICAgfVxuICB9KSk7XG59XG5cbi8qXG4gKiBQYXJ0aXRpb24gYSBjb2xsZWN0aW9uIGludG8gdHdvIGdyb3VwczogYGxoc2AgYW5kIGByaHNgLiBJZiB0aGUgc3VwcGxpZWRcbiAqIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW4gZW50cnkgaXQgZ29lcyBpbnRvIGBsaHNgLiBPdGhlcndpc2UgaXQgZ29lc1xuICogaW50byBgcmhzLlxuICovXG5mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbiwgZm4pIHtcbiAgdmFyIHJlc3VsdCA9IHsgbGhzOiBbXSwgcmhzOiBbXSB9O1xuICBfLmZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoZm4odmFsdWUpKSB7XG4gICAgICByZXN1bHQubGhzLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucmhzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGEgbmV3IGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZuYCB3aXRoIGEgdGltZXIuIFRoZSB3cmFwcGVyIGxvZ3MgdGhlXG4gKiB0aW1lIGl0IHRha2VzIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aW1lKG5hbWUsIGZuKSB7XG4gIHZhciBzdGFydCA9IF8ubm93KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY29uc29sZS5sb2cobmFtZSArIFwiIHRpbWU6IFwiICsgKF8ubm93KCkgLSBzdGFydCkgKyBcIm1zXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vdGltZShuYW1lLCBmbikge1xuICByZXR1cm4gZm4oKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gXCIwLjguNVwiO1xuIiwiLyoqXG4gKiBBIHNpbXBsZSBkZXBlbmRlbmN5IGdyYXBoXG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNyZWF0aW5nIGEgVG9wb2xvZ2ljYWwgU29ydCB1c2luZyBEZXB0aC1GaXJzdC1TZWFyY2ggb24gYSBzZXQgb2YgZWRnZXMuXG4gKlxuICogRGV0ZWN0cyBjeWNsZXMgYW5kIHRocm93cyBhbiBFcnJvciBpZiBvbmUgaXMgZGV0ZWN0ZWQgKHVubGVzcyB0aGUgXCJjaXJjdWxhclwiXG4gKiBwYXJhbWV0ZXIgaXMgXCJ0cnVlXCIgaW4gd2hpY2ggY2FzZSBpdCBpZ25vcmVzIHRoZW0pLlxuICpcbiAqIEBwYXJhbSBlZGdlcyBUaGUgc2V0IG9mIGVkZ2VzIHRvIERGUyB0aHJvdWdoXG4gKiBAcGFyYW0gbGVhdmVzT25seSBXaGV0aGVyIHRvIG9ubHkgcmV0dXJuIFwibGVhZlwiIG5vZGVzIChvbmVzIHdobyBoYXZlIG5vIGVkZ2VzKVxuICogQHBhcmFtIHJlc3VsdCBBbiBhcnJheSBpbiB3aGljaCB0aGUgcmVzdWx0cyB3aWxsIGJlIHBvcHVsYXRlZFxuICogQHBhcmFtIGNpcmN1bGFyIEEgYm9vbGVhbiB0byBhbGxvdyBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlREZTKGVkZ2VzLCBsZWF2ZXNPbmx5LCByZXN1bHQsIGNpcmN1bGFyKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHJldHVybiBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICBpZiAodmlzaXRlZFtzdGFydF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGluQ3VycmVudFBhdGggPSB7fTtcbiAgICB2YXIgY3VycmVudFBhdGggPSBbXTtcbiAgICB2YXIgdG9kbyA9IFtdOyAvLyB1c2VkIGFzIGEgc3RhY2tcbiAgICB0b2RvLnB1c2goeyBub2RlOiBzdGFydCwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICB3aGlsZSAodG9kby5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRvZG9bdG9kby5sZW5ndGggLSAxXTsgLy8gcGVlayBhdCB0aGUgdG9kbyBzdGFja1xuICAgICAgdmFyIHByb2Nlc3NlZCA9IGN1cnJlbnQucHJvY2Vzc2VkO1xuICAgICAgdmFyIG5vZGUgPSBjdXJyZW50Lm5vZGU7XG4gICAgICBpZiAoIXByb2Nlc3NlZCkge1xuICAgICAgICAvLyBIYXZlbid0IHZpc2l0ZWQgZWRnZXMgeWV0ICh2aXNpdGluZyBwaGFzZSlcbiAgICAgICAgaWYgKHZpc2l0ZWRbbm9kZV0pIHtcbiAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGluQ3VycmVudFBhdGhbbm9kZV0pIHtcbiAgICAgICAgICAvLyBJdCdzIG5vdCBhIERBR1xuICAgICAgICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHRvbGVyYXRpbmcgY3ljbGVzLCBkb24ndCByZXZpc2l0IHRoZSBub2RlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFBhdGgucHVzaChub2RlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRGVwR3JhcGhDeWNsZUVycm9yKGN1cnJlbnRQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSB0cnVlO1xuICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICB2YXIgbm9kZUVkZ2VzID0gZWRnZXNbbm9kZV07XG4gICAgICAgIC8vIChwdXNoIGVkZ2VzIG9udG8gdGhlIHRvZG8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlciB0byBiZSBvcmRlci1jb21wYXRpYmxlIHdpdGggdGhlIG9sZCBERlMgaW1wbGVtZW50YXRpb24pXG4gICAgICAgIGZvciAodmFyIGkgPSBub2RlRWRnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0b2RvLnB1c2goeyBub2RlOiBub2RlRWRnZXNbaV0sIHByb2Nlc3NlZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5wcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGF2ZSB2aXNpdGVkIGVkZ2VzIChzdGFjayB1bnJvbGxpbmcgcGhhc2UpXG4gICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgIGN1cnJlbnRQYXRoLnBvcCgpO1xuICAgICAgICBpbkN1cnJlbnRQYXRoW25vZGVdID0gZmFsc2U7XG4gICAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgICBpZiAoIWxlYXZlc09ubHkgfHwgZWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogU2ltcGxlIERlcGVuZGVuY3kgR3JhcGhcbiAqL1xudmFyIERlcEdyYXBoID0gKGV4cG9ydHMuRGVwR3JhcGggPSBmdW5jdGlvbiBEZXBHcmFwaChvcHRzKSB7XG4gIHRoaXMubm9kZXMgPSB7fTsgLy8gTm9kZSAtPiBOb2RlL0RhdGEgKHRyZWF0ZWQgbGlrZSBhIFNldClcbiAgdGhpcy5vdXRnb2luZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGVuY3kgTm9kZV1cbiAgdGhpcy5pbmNvbWluZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGFudCBOb2RlXVxuICB0aGlzLmNpcmN1bGFyID0gb3B0cyAmJiAhIW9wdHMuY2lyY3VsYXI7IC8vIEFsbG93cyBjaXJjdWxhciBkZXBzXG59KTtcbkRlcEdyYXBoLnByb3RvdHlwZSA9IHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5sZW5ndGg7XG4gIH0sXG4gIC8qKlxuICAgKiBBZGQgYSBub2RlIHRvIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIGFkZE5vZGU6IGZ1bmN0aW9uIChub2RlLCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBhcmd1bWVudHMgbGVuZ3RoIGFsbG93cyB0aGUgdXNlciB0byBhZGQgYSBub2RlIHdpdGggdW5kZWZpbmVkIGRhdGFcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICByZW1vdmVOb2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmluY29taW5nRWRnZXNbbm9kZV07XG4gICAgICBbdGhpcy5pbmNvbWluZ0VkZ2VzLCB0aGlzLm91dGdvaW5nRWRnZXNdLmZvckVhY2goZnVuY3Rpb24gKGVkZ2VMaXN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGVkZ2VMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgaWR4ID0gZWRnZUxpc3Rba2V5XS5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgZWRnZUxpc3Rba2V5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGV4aXN0cyBpbiB0aGUgZ3JhcGhcbiAgICovXG4gIGhhc05vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbm9kZSBuYW1lXG4gICAqL1xuICBnZXROb2RlRGF0YTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgZGF0YSBmb3IgYSBnaXZlbiBub2RlIG5hbWUuIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAqL1xuICBzZXROb2RlRGF0YTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICB0aGlzLm5vZGVzW25vZGVdID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBBZGQgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG5vZGVzLiBJZiBlaXRoZXIgb2YgdGhlIG5vZGVzIGRvZXMgbm90IGV4aXN0LFxuICAgKiBhbiBFcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICovXG4gIGFkZERlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIGlmICghdGhpcy5oYXNOb2RlKGZyb20pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIGZyb20pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgdG8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pID09PSAtMSkge1xuICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLnB1c2godG8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pID09PSAtMSkge1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5wdXNoKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuXG4gICAqL1xuICByZW1vdmVEZXBlbmRlbmN5OiBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICB2YXIgaWR4O1xuICAgIGlmICh0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIGlkeCA9IHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgIGlkeCA9IHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhbnkgY3VzdG9tIGRhdGEgaXMgYXR0YWNoZWRcbiAgICogdG8gdGhlIG5vZGVzLCBpdCB3aWxsIG9ubHkgYmUgc2hhbGxvdyBjb3BpZWQuXG4gICAqL1xuICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3VyY2UgPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSBuZXcgRGVwR3JhcGgoKTtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZS5ub2Rlcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXN1bHQubm9kZXNbbl0gPSBzb3VyY2Uubm9kZXNbbl07XG4gICAgICByZXN1bHQub3V0Z29pbmdFZGdlc1tuXSA9IHNvdXJjZS5vdXRnb2luZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LmluY29taW5nRWRnZXNbbl0gPSBzb3VyY2UuaW5jb21pbmdFZGdlc1tuXS5zbGljZSgwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRpcmVjdCBkZXBlbmRlbmNpZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgZGlyZWN0RGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkaXJlY3RseSBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgZGlyZWN0RGVwZW5kYW50c09mOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmluY29taW5nRWRnZXNbbm9kZV0uc2xpY2UoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGRlcGVuZHMgb24gKHRyYW5zaXRpdmVseSkuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUsIG9yIHRoZSBzcGVjaWZpZWQgbm9kZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkXG4gICAqIGluIHRoZSBhcnJheS5cbiAgICovXG4gIGRlcGVuZGVuY2llc09mOiBmdW5jdGlvbiAobm9kZSwgbGVhdmVzT25seSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBERlMgPSBjcmVhdGVERlMoXG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlcyxcbiAgICAgICAgbGVhdmVzT25seSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB0aGlzLmNpcmN1bGFyXG4gICAgICApO1xuICAgICAgREZTKG5vZGUpO1xuICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogZ2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBzcGVjaWZpZWQgbm9kZSAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBkZXBlbmRhbnRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kYW50c09mOiBmdW5jdGlvbiAobm9kZSwgbGVhdmVzT25seSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBERlMgPSBjcmVhdGVERlMoXG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlcyxcbiAgICAgICAgbGVhdmVzT25seSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB0aGlzLmNpcmN1bGFyXG4gICAgICApO1xuICAgICAgREZTKG5vZGUpO1xuICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ29uc3RydWN0IHRoZSBvdmVyYWxsIHByb2Nlc3Npbmcgb3JkZXIgZm9yIHRoZSBkZXBlbmRlbmN5IGdyYXBoLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqL1xuICBvdmVyYWxsT3JkZXI6IGZ1bmN0aW9uIChsZWF2ZXNPbmx5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDsgLy8gRW1wdHkgZ3JhcGhcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmNpcmN1bGFyKSB7XG4gICAgICAgIC8vIExvb2sgZm9yIGN5Y2xlcyAtIHdlIHJ1biB0aGUgREZTIHN0YXJ0aW5nIGF0IGFsbCB0aGUgbm9kZXMgaW4gY2FzZSB0aGVyZVxuICAgICAgICAvLyBhcmUgc2V2ZXJhbCBkaXNjb25uZWN0ZWQgc3ViZ3JhcGhzIGluc2lkZSB0aGlzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICAgIHZhciBDeWNsZURGUyA9IGNyZWF0ZURGUyh0aGlzLm91dGdvaW5nRWRnZXMsIGZhbHNlLCBbXSwgdGhpcy5jaXJjdWxhcik7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgIEN5Y2xlREZTKG4pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICAvLyBGaW5kIGFsbCBwb3RlbnRpYWwgc3RhcnRpbmcgcG9pbnRzIChub2RlcyB3aXRoIG5vdGhpbmcgZGVwZW5kaW5nIG9uIHRoZW0pIGFuXG4gICAgICAvLyBydW4gYSBERlMgc3RhcnRpbmcgYXQgdGhlc2UgcG9pbnRzIHRvIGdldCB0aGUgb3JkZXJcbiAgICAgIGtleXNcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgICAgICB9KVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgIERGUyhuKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHdlJ3JlIGFsbG93aW5nIGN5Y2xlcyAtIHdlIG5lZWQgdG8gcnVuIHRoZSBERlMgYWdhaW5zdCBhbnkgcmVtYWluaW5nXG4gICAgICAvLyBub2RlcyB0aGF0IGRpZCBub3QgZW5kIHVwIGluIHRoZSBpbml0aWFsIHJlc3VsdCAoYXMgdGhleSBhcmUgcGFydCBvZiBhXG4gICAgICAvLyBzdWJncmFwaCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjbGVhciBzdGFydGluZyBwb2ludClcbiAgICAgIGlmICh0aGlzLmNpcmN1bGFyKSB7XG4gICAgICAgIGtleXNcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmluZGV4T2Yobm9kZSkgPT09IC0xO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIERGUyhuKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2Ygbm9kZXMgdGhhdCBoYXZlIG5vIGRlcGVuZGFudHMgKGkuZS4gbm90aGluZyBkZXBlbmRzIG9uIHRoZW0pLlxuICAgKi9cbiAgZW50cnlOb2RlczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gc2VsZi5pbmNvbWluZ0VkZ2VzW25vZGVdLmxlbmd0aCA9PT0gMDtcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gQ3JlYXRlIHNvbWUgYWxpYXNlc1xuRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGVudHNPZiA9IERlcEdyYXBoLnByb3RvdHlwZS5kaXJlY3REZXBlbmRhbnRzT2Y7XG5EZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRlcGVuZGFudHNPZjtcblxuLyoqXG4gKiBDeWNsZSBlcnJvciwgaW5jbHVkaW5nIHRoZSBwYXRoIG9mIHRoZSBjeWNsZS5cbiAqL1xudmFyIERlcEdyYXBoQ3ljbGVFcnJvciA9IChleHBvcnRzLkRlcEdyYXBoQ3ljbGVFcnJvciA9IGZ1bmN0aW9uIChjeWNsZVBhdGgpIHtcbiAgdmFyIG1lc3NhZ2UgPSBcIkRlcGVuZGVuY3kgQ3ljbGUgRm91bmQ6IFwiICsgY3ljbGVQYXRoLmpvaW4oXCIgLT4gXCIpO1xuICB2YXIgaW5zdGFuY2UgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGluc3RhbmNlLmN5Y2xlUGF0aCA9IGN5Y2xlUGF0aDtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShpbnN0YW5jZSwgRGVwR3JhcGhDeWNsZUVycm9yKTtcbiAgfVxuICByZXR1cm4gaW5zdGFuY2U7XG59KTtcbkRlcEdyYXBoQ3ljbGVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3Rvcjoge1xuICAgIHZhbHVlOiBFcnJvcixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoRGVwR3JhcGhDeWNsZUVycm9yLCBFcnJvcik7XG4iLCIvKipcbiAqIGluc3BpcmVkIGJ5IGlzLW51bWJlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtbnVtYmVyPlxuICogYnV0IHNpZ25pZmljYW50bHkgc2ltcGxpZmllZCBhbmQgc3BlZCB1cCBieSBpZ25vcmluZyBudW1iZXIgYW5kIHN0cmluZyBjb25zdHJ1Y3RvcnNcbiAqIGllIHRoZXNlIHJldHVybiBmYWxzZTpcbiAqICAgbmV3IE51bWJlcigxKVxuICogICBuZXcgU3RyaW5nKCcxJylcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhbGxCbGFua0NoYXJDb2RlcyA9IHJlcXVpcmUoJ2lzLXN0cmluZy1ibGFuaycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG4pIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBuO1xuICAgIGlmKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbCA9IG47XG4gICAgICAgIG4gPSArbjtcbiAgICAgICAgLy8gd2hpdGVzcGFjZSBzdHJpbmdzIGNhc3QgdG8gemVybyAtIGZpbHRlciB0aGVtIG91dFxuICAgICAgICBpZihuPT09MCAmJiBhbGxCbGFua0NoYXJDb2RlcyhvcmlnaW5hbCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZih0eXBlICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG4gLSBuIDwgMTtcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgQ2hyaXMgUGV0dGl0dFxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBsaWIgPSByZXF1aXJlKFwiLi9saWJcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHcmFwaDogbGliLkdyYXBoLFxuICBqc29uOiByZXF1aXJlKFwiLi9saWIvanNvblwiKSxcbiAgYWxnOiByZXF1aXJlKFwiLi9saWIvYWxnXCIpLFxuICB2ZXJzaW9uOiBsaWIudmVyc2lvblxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnRzO1xuXG5mdW5jdGlvbiBjb21wb25lbnRzKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIGNtcHRzID0gW107XG4gIHZhciBjbXB0O1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSByZXR1cm47XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG4gICAgY21wdC5wdXNoKHYpO1xuICAgIF8uZWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBkZnMpO1xuICB9XG5cbiAgXy5lYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGNtcHQgPSBbXTtcbiAgICBkZnModik7XG4gICAgaWYgKGNtcHQubGVuZ3RoKSB7XG4gICAgICBjbXB0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNtcHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRmcztcblxuLypcbiAqIEEgaGVscGVyIHRoYXQgcHJlZm9ybXMgYSBwcmUtIG9yIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9uIHRoZSBpbnB1dCBncmFwaFxuICogYW5kIHJldHVybnMgdGhlIG5vZGVzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgdmlzaXRlZC4gSWYgdGhlIGdyYXBoIGlzXG4gKiB1bmRpcmVjdGVkIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCBuYXZpZ2F0ZSB1c2luZyBuZWlnaGJvcnMuIElmIHRoZSBncmFwaFxuICogaXMgZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIHN1Y2Nlc3NvcnMuXG4gKlxuICogT3JkZXIgbXVzdCBiZSBvbmUgb2YgXCJwcmVcIiBvciBcInBvc3RcIi5cbiAqL1xuZnVuY3Rpb24gZGZzKGcsIHZzLCBvcmRlcikge1xuICBpZiAoIV8uaXNBcnJheSh2cykpIHtcbiAgICB2cyA9IFt2c107XG4gIH1cblxuICB2YXIgbmF2aWdhdGlvbiA9IChnLmlzRGlyZWN0ZWQoKSA/IGcuc3VjY2Vzc29ycyA6IGcubmVpZ2hib3JzKS5iaW5kKGcpO1xuXG4gIHZhciBhY2MgPSBbXTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmhhc05vZGUodikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogXCIgKyB2KTtcbiAgICB9XG5cbiAgICBkb0RmcyhnLCB2LCBvcmRlciA9PT0gXCJwb3N0XCIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gIH0pO1xuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiBkb0RmcyhnLCB2LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYykge1xuICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICBpZiAoIXBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICAgIF8uZWFjaChuYXZpZ2F0aW9uKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgICBkb0RmcyhnLCB3LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gICAgfSk7XG4gICAgaWYgKHBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICB9XG59XG4iLCJ2YXIgZGlqa3N0cmEgPSByZXF1aXJlKFwiLi9kaWprc3RyYVwiKTtcbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYUFsbDtcblxuZnVuY3Rpb24gZGlqa3N0cmFBbGwoZywgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpIHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSwgZnVuY3Rpb24oYWNjLCB2KSB7XG4gICAgYWNjW3ZdID0gZGlqa3N0cmEoZywgdiwgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpO1xuICB9LCB7fSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRlVOQyA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICByZXR1cm4gcnVuRGlqa3N0cmEoZywgU3RyaW5nKHNvdXJjZSksXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdiwgdkVudHJ5O1xuXG4gIHZhciB1cGRhdGVOZWlnaGJvcnMgPSBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgIT09IHYgPyBlZGdlLnYgOiBlZGdlLnc7XG4gICAgdmFyIHdFbnRyeSA9IHJlc3VsdHNbd107XG4gICAgdmFyIHdlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgIHZhciBkaXN0YW5jZSA9IHZFbnRyeS5kaXN0YW5jZSArIHdlaWdodDtcblxuICAgIGlmICh3ZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIkJhZCBlZGdlOiBcIiArIGVkZ2UgKyBcIiBXZWlnaHQ6IFwiICsgd2VpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoZGlzdGFuY2UgPCB3RW50cnkuZGlzdGFuY2UpIHtcbiAgICAgIHdFbnRyeS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgd0VudHJ5LnByZWRlY2Vzc29yID0gdjtcbiAgICAgIHBxLmRlY3JlYXNlKHcsIGRpc3RhbmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIHZhciBkaXN0YW5jZSA9IHYgPT09IHNvdXJjZSA/IDAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgcmVzdWx0c1t2XSA9IHsgZGlzdGFuY2U6IGRpc3RhbmNlIH07XG4gICAgcHEuYWRkKHYsIGRpc3RhbmNlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHBxLnNpemUoKSA+IDApIHtcbiAgICB2ID0gcHEucmVtb3ZlTWluKCk7XG4gICAgdkVudHJ5ID0gcmVzdWx0c1t2XTtcbiAgICBpZiAodkVudHJ5LmRpc3RhbmNlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGVkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB0YXJqYW4gPSByZXF1aXJlKFwiLi90YXJqYW5cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZEN5Y2xlcztcblxuZnVuY3Rpb24gZmluZEN5Y2xlcyhnKSB7XG4gIHJldHVybiBfLmZpbHRlcih0YXJqYW4oZyksIGZ1bmN0aW9uKGNtcHQpIHtcbiAgICByZXR1cm4gY21wdC5sZW5ndGggPiAxIHx8IChjbXB0Lmxlbmd0aCA9PT0gMSAmJiBnLmhhc0VkZ2UoY21wdFswXSwgY21wdFswXSkpO1xuICB9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmbG95ZFdhcnNoYWxsO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRlVOQyA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICByZXR1cm4gcnVuRmxveWRXYXJzaGFsbChnLFxuICAgIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZVTkMsXG4gICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pO1xufVxuXG5mdW5jdGlvbiBydW5GbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIG5vZGVzID0gZy5ub2RlcygpO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIHJlc3VsdHNbdl0gPSB7fTtcbiAgICByZXN1bHRzW3ZdW3ZdID0geyBkaXN0YW5jZTogMCB9O1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKHYgIT09IHcpIHtcbiAgICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgICAgdmFyIGQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBkLCBwcmVkZWNlc3NvcjogdiB9O1xuICAgIH0pO1xuICB9KTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICB2YXIgcm93SyA9IHJlc3VsdHNba107XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihpKSB7XG4gICAgICB2YXIgcm93SSA9IHJlc3VsdHNbaV07XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGopIHtcbiAgICAgICAgdmFyIGlrID0gcm93SVtrXTtcbiAgICAgICAgdmFyIGtqID0gcm93S1tqXTtcbiAgICAgICAgdmFyIGlqID0gcm93SVtqXTtcbiAgICAgICAgdmFyIGFsdERpc3RhbmNlID0gaWsuZGlzdGFuY2UgKyBrai5kaXN0YW5jZTtcbiAgICAgICAgaWYgKGFsdERpc3RhbmNlIDwgaWouZGlzdGFuY2UpIHtcbiAgICAgICAgICBpai5kaXN0YW5jZSA9IGFsdERpc3RhbmNlO1xuICAgICAgICAgIGlqLnByZWRlY2Vzc29yID0ga2oucHJlZGVjZXNzb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBjb21wb25lbnRzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzXCIpLFxuICBkaWprc3RyYTogcmVxdWlyZShcIi4vZGlqa3N0cmFcIiksXG4gIGRpamtzdHJhQWxsOiByZXF1aXJlKFwiLi9kaWprc3RyYS1hbGxcIiksXG4gIGZpbmRDeWNsZXM6IHJlcXVpcmUoXCIuL2ZpbmQtY3ljbGVzXCIpLFxuICBmbG95ZFdhcnNoYWxsOiByZXF1aXJlKFwiLi9mbG95ZC13YXJzaGFsbFwiKSxcbiAgaXNBY3ljbGljOiByZXF1aXJlKFwiLi9pcy1hY3ljbGljXCIpLFxuICBwb3N0b3JkZXI6IHJlcXVpcmUoXCIuL3Bvc3RvcmRlclwiKSxcbiAgcHJlb3JkZXI6IHJlcXVpcmUoXCIuL3ByZW9yZGVyXCIpLFxuICBwcmltOiByZXF1aXJlKFwiLi9wcmltXCIpLFxuICB0YXJqYW46IHJlcXVpcmUoXCIuL3RhcmphblwiKSxcbiAgdG9wc29ydDogcmVxdWlyZShcIi4vdG9wc29ydFwiKVxufTtcbiIsInZhciB0b3Bzb3J0ID0gcmVxdWlyZShcIi4vdG9wc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FjeWNsaWM7XG5cbmZ1bmN0aW9uIGlzQWN5Y2xpYyhnKSB7XG4gIHRyeSB7XG4gICAgdG9wc29ydChnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwb3N0b3JkZXI7XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnLCB2cykge1xuICByZXR1cm4gZGZzKGcsIHZzLCBcInBvc3RcIik7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByZW9yZGVyO1xuXG5mdW5jdGlvbiBwcmVvcmRlcihnLCB2cykge1xuICByZXR1cm4gZGZzKGcsIHZzLCBcInByZVwiKTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJpbTtcblxuZnVuY3Rpb24gcHJpbShnLCB3ZWlnaHRGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgR3JhcGgoKTtcbiAgdmFyIHBhcmVudHMgPSB7fTtcbiAgdmFyIHBxID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgdmFyIHY7XG5cbiAgZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjtcbiAgICB2YXIgcHJpID0gcHEucHJpb3JpdHkodyk7XG4gICAgaWYgKHByaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZWRnZVdlaWdodCA9IHdlaWdodEZ1bmMoZWRnZSk7XG4gICAgICBpZiAoZWRnZVdlaWdodCA8IHByaSkge1xuICAgICAgICBwYXJlbnRzW3ddID0gdjtcbiAgICAgICAgcHEuZGVjcmVhc2UodywgZWRnZVdlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGcubm9kZUNvdW50KCkgPT09IDApIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgXy5lYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHBxLmFkZCh2LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIHJlc3VsdC5zZXROb2RlKHYpO1xuICB9KTtcblxuICAvLyBTdGFydCBmcm9tIGFuIGFyYml0cmFyeSBub2RlXG4gIHBxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwgMCk7XG5cbiAgdmFyIGluaXQgPSBmYWxzZTtcbiAgd2hpbGUgKHBxLnNpemUoKSA+IDApIHtcbiAgICB2ID0gcHEucmVtb3ZlTWluKCk7XG4gICAgaWYgKF8uaGFzKHBhcmVudHMsIHYpKSB7XG4gICAgICByZXN1bHQuc2V0RWRnZSh2LCBwYXJlbnRzW3ZdKTtcbiAgICB9IGVsc2UgaWYgKGluaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklucHV0IGdyYXBoIGlzIG5vdCBjb25uZWN0ZWQ6IFwiICsgZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXQgPSB0cnVlO1xuICAgIH1cblxuICAgIGcubm9kZUVkZ2VzKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdGFyamFuO1xuXG5mdW5jdGlvbiB0YXJqYW4oZykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTsgLy8gbm9kZSBpZCAtPiB7IG9uU3RhY2ssIGxvd2xpbmssIGluZGV4IH1cbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBlbnRyeSA9IHZpc2l0ZWRbdl0gPSB7XG4gICAgICBvblN0YWNrOiB0cnVlLFxuICAgICAgbG93bGluazogaW5kZXgsXG4gICAgICBpbmRleDogaW5kZXgrK1xuICAgIH07XG4gICAgc3RhY2sucHVzaCh2KTtcblxuICAgIGcuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICghXy5oYXModmlzaXRlZCwgdykpIHtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5sb3dsaW5rKTtcbiAgICAgIH0gZWxzZSBpZiAodmlzaXRlZFt3XS5vblN0YWNrKSB7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChlbnRyeS5sb3dsaW5rID09PSBlbnRyeS5pbmRleCkge1xuICAgICAgdmFyIGNtcHQgPSBbXTtcbiAgICAgIHZhciB3O1xuICAgICAgZG8ge1xuICAgICAgICB3ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHZpc2l0ZWRbd10ub25TdGFjayA9IGZhbHNlO1xuICAgICAgICBjbXB0LnB1c2godyk7XG4gICAgICB9IHdoaWxlICh2ICE9PSB3KTtcbiAgICAgIHJlc3VsdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH1cblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgZGZzKHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdG9wc29ydDtcbnRvcHNvcnQuQ3ljbGVFeGNlcHRpb24gPSBDeWNsZUV4Y2VwdGlvbjtcblxuZnVuY3Rpb24gdG9wc29ydChnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBzdGFjayA9IHt9O1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGUpIHtcbiAgICBpZiAoXy5oYXMoc3RhY2ssIG5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIG5vZGUpKSB7XG4gICAgICBzdGFja1tub2RlXSA9IHRydWU7XG4gICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTtcbiAgICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwgdmlzaXQpO1xuICAgICAgZGVsZXRlIHN0YWNrW25vZGVdO1xuICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIF8uZWFjaChnLnNpbmtzKCksIHZpc2l0KTtcblxuICBpZiAoXy5zaXplKHZpc2l0ZWQpICE9PSBnLm5vZGVDb3VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKSB7fVxuQ3ljbGVFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7IC8vIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRXJyb3IgdG8gcGFzcyB0ZXN0aW5nIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByaW9yaXR5UXVldWU7XG5cbi8qKlxuICogQSBtaW4tcHJpb3JpdHkgcXVldWUgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgYWxnb3JpdGhtIGlzIGRlcml2ZWQgZnJvbSBDb3JtZW4sXG4gKiBldCBhbC4sIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi4gVGhlIGJhc2ljIGlkZWEgb2YgYSBtaW4tcHJpb3JpdHlcbiAqIHF1ZXVlIGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSAoaW4gTygxKSB0aW1lKSBnZXQgdGhlIHNtYWxsZXN0IGtleSBpblxuICogdGhlIHF1ZXVlLiBBZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzIHRha2VzIE8obG9nIG4pIHRpbWUuIEEga2V5IGNhblxuICogaGF2ZSBpdHMgcHJpb3JpdHkgZGVjcmVhc2VkIGluIE8obG9nIG4pIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIFByaW9yaXR5UXVldWUoKSB7XG4gIHRoaXMuX2FyciA9IFtdO1xuICB0aGlzLl9rZXlJbmRpY2VzID0ge307XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Fyci5sZW5ndGg7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTyhuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LmtleTsgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmICoqa2V5KiogaXMgaW4gdGhlIHF1ZXVlIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9rZXlJbmRpY2VzLCBrZXkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmlvcml0eSBmb3IgKiprZXkqKi4gSWYgKiprZXkqKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgcXVldWVcbiAqIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGB1bmRlZmluZWRgLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnByaW9yaXR5ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gdGhpcyBxdWV1ZS4gSWYgdGhlIHF1ZXVlIGlzXG4gKiBlbXB0eSB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBFcnJvci4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5zaXplKCkgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWV1ZSB1bmRlcmZsb3dcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FyclswXS5rZXk7XG59O1xuXG4vKipcbiAqIEluc2VydHMgYSBuZXcga2V5IGludG8gdGhlIHByaW9yaXR5IHF1ZXVlLiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluXG4gKiB0aGUgcXVldWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWA7IG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBgdHJ1ZWAuXG4gKiBUYWtlcyBgTyhuKWAgdGltZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5IHRoZSBrZXkgdG8gYWRkXG4gKiBAcGFyYW0ge051bWJlcn0gcHJpb3JpdHkgdGhlIGluaXRpYWwgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oa2V5LCBwcmlvcml0eSkge1xuICB2YXIga2V5SW5kaWNlcyA9IHRoaXMuX2tleUluZGljZXM7XG4gIGtleSA9IFN0cmluZyhrZXkpO1xuICBpZiAoIV8uaGFzKGtleUluZGljZXMsIGtleSkpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICAgIHZhciBpbmRleCA9IGFyci5sZW5ndGg7XG4gICAga2V5SW5kaWNlc1trZXldID0gaW5kZXg7XG4gICAgYXJyLnB1c2goe2tleToga2V5LCBwcmlvcml0eTogcHJpb3JpdHl9KTtcbiAgICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBrZXkgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTyhsb2cgbilgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9zd2FwKDAsIHRoaXMuX2Fyci5sZW5ndGggLSAxKTtcbiAgdmFyIG1pbiA9IHRoaXMuX2Fyci5wb3AoKTtcbiAgZGVsZXRlIHRoaXMuX2tleUluZGljZXNbbWluLmtleV07XG4gIHRoaXMuX2hlYXBpZnkoMCk7XG4gIHJldHVybiBtaW4ua2V5O1xufTtcblxuLyoqXG4gKiBEZWNyZWFzZXMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqIHRvICoqcHJpb3JpdHkqKi4gSWYgdGhlIG5ldyBwcmlvcml0eSBpc1xuICogZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBwcmlvcml0eSwgdGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGFuIEVycm9yLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSBmb3Igd2hpY2ggdG8gcmFpc2UgcHJpb3JpdHlcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgbmV3IHByaW9yaXR5IGZvciB0aGUga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlID0gZnVuY3Rpb24oa2V5LCBwcmlvcml0eSkge1xuICB2YXIgaW5kZXggPSB0aGlzLl9rZXlJbmRpY2VzW2tleV07XG4gIGlmIChwcmlvcml0eSA+IHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcHJpb3JpdHkuIFwiICtcbiAgICAgICAgXCJLZXk6IFwiICsga2V5ICsgXCIgT2xkOiBcIiArIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkgKyBcIiBOZXc6IFwiICsgcHJpb3JpdHkpO1xuICB9XG4gIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgdGhpcy5fZGVjcmVhc2UoaW5kZXgpO1xufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnkgPSBmdW5jdGlvbihpKSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBsID0gMiAqIGk7XG4gIHZhciByID0gbCArIDE7XG4gIHZhciBsYXJnZXN0ID0gaTtcbiAgaWYgKGwgPCBhcnIubGVuZ3RoKSB7XG4gICAgbGFyZ2VzdCA9IGFycltsXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IGwgOiBsYXJnZXN0O1xuICAgIGlmIChyIDwgYXJyLmxlbmd0aCkge1xuICAgICAgbGFyZ2VzdCA9IGFycltyXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IHIgOiBsYXJnZXN0O1xuICAgIH1cbiAgICBpZiAobGFyZ2VzdCAhPT0gaSkge1xuICAgICAgdGhpcy5fc3dhcChpLCBsYXJnZXN0KTtcbiAgICAgIHRoaXMuX2hlYXBpZnkobGFyZ2VzdCk7XG4gICAgfVxuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fZGVjcmVhc2UgPSBmdW5jdGlvbihpbmRleCkge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIgcHJpb3JpdHkgPSBhcnJbaW5kZXhdLnByaW9yaXR5O1xuICB2YXIgcGFyZW50O1xuICB3aGlsZSAoaW5kZXggIT09IDApIHtcbiAgICBwYXJlbnQgPSBpbmRleCA+PiAxO1xuICAgIGlmIChhcnJbcGFyZW50XS5wcmlvcml0eSA8IHByaW9yaXR5KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fc3dhcChpbmRleCwgcGFyZW50KTtcbiAgICBpbmRleCA9IHBhcmVudDtcbiAgfVxufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX3N3YXAgPSBmdW5jdGlvbihpLCBqKSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAgdmFyIG9yaWdBcnJJID0gYXJyW2ldO1xuICB2YXIgb3JpZ0FyckogPSBhcnJbal07XG4gIGFycltpXSA9IG9yaWdBcnJKO1xuICBhcnJbal0gPSBvcmlnQXJySTtcbiAga2V5SW5kaWNlc1tvcmlnQXJySi5rZXldID0gaTtcbiAga2V5SW5kaWNlc1tvcmlnQXJySS5rZXldID0gajtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JhcGg7XG5cbnZhciBERUZBVUxUX0VER0VfTkFNRSA9IFwiXFx4MDBcIjtcbnZhciBHUkFQSF9OT0RFID0gXCJcXHgwMFwiO1xudmFyIEVER0VfS0VZX0RFTElNID0gXCJcXHgwMVwiO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBub3Rlczpcbi8vXG4vLyAgKiBOb2RlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHN0cmluZyBpZHMgZm9yIHRoZSBub2Rlc1xuLy8gICogRWRnZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBcImVkZ2VPYmpcIiwgZWRnZSBvYmplY3QsIHRoYXQgaXNcbi8vICAgIGNvbXBvc2VkIG9mIGVub3VnaCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBlZGdlOiB7diwgdywgbmFtZX0uXG4vLyAgKiBJbnRlcm5hbGx5IHdlIHVzZSBhbiBcImVkZ2VJZFwiLCBhIHN0cmluZ2lmaWVkIGZvcm0gb2YgdGhlIGVkZ2VPYmosIHRvXG4vLyAgICByZWZlcmVuY2UgZWRnZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIGEgcGVyZm9ybWFudCB3YXkgdG8gbG9vayB0aGVzZVxuLy8gICAgZWRnZXMgdXAgYW5kLCBvYmplY3QgcHJvcGVydGllcywgd2hpY2ggaGF2ZSBzdHJpbmcga2V5cywgYXJlIHRoZSBjbG9zZXN0XG4vLyAgICB3ZSdyZSBnb2luZyB0byBnZXQgdG8gYSBwZXJmb3JtYW50IGhhc2h0YWJsZSBpbiBKYXZhU2NyaXB0LlxuXG5mdW5jdGlvbiBHcmFwaChvcHRzKSB7XG4gIHRoaXMuX2lzRGlyZWN0ZWQgPSBfLmhhcyhvcHRzLCBcImRpcmVjdGVkXCIpID8gb3B0cy5kaXJlY3RlZCA6IHRydWU7XG4gIHRoaXMuX2lzTXVsdGlncmFwaCA9IF8uaGFzKG9wdHMsIFwibXVsdGlncmFwaFwiKSA/IG9wdHMubXVsdGlncmFwaCA6IGZhbHNlO1xuICB0aGlzLl9pc0NvbXBvdW5kID0gXy5oYXMob3B0cywgXCJjb21wb3VuZFwiKSA/IG9wdHMuY29tcG91bmQgOiBmYWxzZTtcblxuICAvLyBMYWJlbCBmb3IgdGhlIGdyYXBoIGl0c2VsZlxuICB0aGlzLl9sYWJlbCA9IHVuZGVmaW5lZDtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBub2RlXG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBlZGdlXG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyB2IC0+IGxhYmVsXG4gIHRoaXMuX25vZGVzID0ge307XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAvLyB2IC0+IHBhcmVudFxuICAgIHRoaXMuX3BhcmVudCA9IHt9O1xuXG4gICAgLy8gdiAtPiBjaGlsZHJlblxuICAgIHRoaXMuX2NoaWxkcmVuID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV0gPSB7fTtcbiAgfVxuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9pbiA9IHt9O1xuXG4gIC8vIHUgLT4gdiAtPiBOdW1iZXJcbiAgdGhpcy5fcHJlZHMgPSB7fTtcblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5fb3V0ID0ge307XG5cbiAgLy8gdiAtPiB3IC0+IE51bWJlclxuICB0aGlzLl9zdWNzID0ge307XG5cbiAgLy8gZSAtPiBlZGdlT2JqXG4gIHRoaXMuX2VkZ2VPYmpzID0ge307XG5cbiAgLy8gZSAtPiBsYWJlbFxuICB0aGlzLl9lZGdlTGFiZWxzID0ge307XG59XG5cbi8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQgPSAwO1xuXG4vKiBOdW1iZXIgb2YgZWRnZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50ID0gMDtcblxuXG4vKiA9PT0gR3JhcGggZnVuY3Rpb25zID09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuaXNEaXJlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNEaXJlY3RlZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0NvbXBvdW5kO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldEdyYXBoID0gZnVuY3Rpb24obGFiZWwpIHtcbiAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2xhYmVsO1xufTtcblxuXG4vKiA9PT0gTm9kZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zb3VyY2VzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5faW5bdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zaW5rcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX291dFt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGVzID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlID0gZnVuY3Rpb24odiwgdmFsdWUpIHtcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fbm9kZXNbdl0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9ub2Rlc1t2XSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhpcy5fcGFyZW50W3ZdID0gR1JBUEhfTk9ERTtcbiAgICB0aGlzLl9jaGlsZHJlblt2XSA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9pblt2XSA9IHt9O1xuICB0aGlzLl9wcmVkc1t2XSA9IHt9O1xuICB0aGlzLl9vdXRbdl0gPSB7fTtcbiAgdGhpcy5fc3Vjc1t2XSA9IHt9O1xuICArK3RoaXMuX25vZGVDb3VudDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVzW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9ub2Rlcywgdik7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZSA9ICBmdW5jdGlvbih2KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIHZhciByZW1vdmVFZGdlID0gZnVuY3Rpb24oZSkgeyBzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pOyB9O1xuICAgIGRlbGV0ZSB0aGlzLl9ub2Rlc1t2XTtcbiAgICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgICAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gICAgICBkZWxldGUgdGhpcy5fcGFyZW50W3ZdO1xuICAgICAgXy5lYWNoKHRoaXMuY2hpbGRyZW4odiksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHNlbGYuc2V0UGFyZW50KGNoaWxkKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIH1cbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9wcmVkc1t2XTtcbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX291dFt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl07XG4gICAgZGVsZXRlIHRoaXMuX3N1Y3Nbdl07XG4gICAgLS10aGlzLl9ub2RlQ291bnQ7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24odiwgcGFyZW50KSB7XG4gIGlmICghdGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoXCIpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyZW50KSkge1xuICAgIHBhcmVudCA9IEdSQVBIX05PREU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNlIHBhcmVudCB0byBzdHJpbmdcbiAgICBwYXJlbnQgKz0gXCJcIjtcbiAgICBmb3IgKHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICFfLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTtcbiAgICAgIGFuY2VzdG9yID0gdGhpcy5wYXJlbnQoYW5jZXN0b3IpKSB7XG4gICAgICBpZiAoYW5jZXN0b3IgPT09IHYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0dGluZyBcIiArIHBhcmVudCsgXCIgYXMgcGFyZW50IG9mIFwiICsgdiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiB3b3VsZCBjcmVhdGUgYSBjeWNsZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldE5vZGUocGFyZW50KTtcbiAgfVxuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gIHRoaXMuX3BhcmVudFt2XSA9IHBhcmVudDtcbiAgdGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCA9IGZ1bmN0aW9uKHYpIHtcbiAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24odikge1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRbdl07XG4gICAgaWYgKHBhcmVudCAhPT0gR1JBUEhfTk9ERSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQodikpIHtcbiAgICB2ID0gR1JBUEhfTk9ERTtcbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gXy5rZXlzKGNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodiA9PT0gR1JBUEhfTk9ERSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5oYXNOb2RlKHYpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHNWID0gdGhpcy5fcHJlZHNbdl07XG4gIGlmIChwcmVkc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHByZWRzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgc3Vjc1YgPSB0aGlzLl9zdWNzW3ZdO1xuICBpZiAoc3Vjc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHN1Y3NWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5laWdoYm9ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzID0gdGhpcy5wcmVkZWNlc3NvcnModik7XG4gIGlmIChwcmVkcykge1xuICAgIHJldHVybiBfLnVuaW9uKHByZWRzLCB0aGlzLnN1Y2Nlc3NvcnModikpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNMZWFmID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIG5laWdoYm9ycztcbiAgaWYgKHRoaXMuaXNEaXJlY3RlZCgpKSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5zdWNjZXNzb3JzKHYpO1xuICB9IGVsc2Uge1xuICAgIG5laWdoYm9ycyA9IHRoaXMubmVpZ2hib3JzKHYpO1xuICB9XG4gIHJldHVybiBuZWlnaGJvcnMubGVuZ3RoID09PSAwO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gIHZhciBjb3B5ID0gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgIGRpcmVjdGVkOiB0aGlzLl9pc0RpcmVjdGVkLFxuICAgIG11bHRpZ3JhcGg6IHRoaXMuX2lzTXVsdGlncmFwaCxcbiAgICBjb21wb3VuZDogdGhpcy5faXNDb21wb3VuZFxuICB9KTtcblxuICBjb3B5LnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godGhpcy5fbm9kZXMsIGZ1bmN0aW9uKHZhbHVlLCB2KSB7XG4gICAgaWYgKGZpbHRlcih2KSkge1xuICAgICAgY29weS5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZWFjaCh0aGlzLl9lZGdlT2JqcywgZnVuY3Rpb24oZSkge1xuICAgIGlmIChjb3B5Lmhhc05vZGUoZS52KSAmJiBjb3B5Lmhhc05vZGUoZS53KSkge1xuICAgICAgY29weS5zZXRFZGdlKGUsIHNlbGYuZWRnZShlKSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcGFyZW50cyA9IHt9O1xuICBmdW5jdGlvbiBmaW5kUGFyZW50KHYpIHtcbiAgICB2YXIgcGFyZW50ID0gc2VsZi5wYXJlbnQodik7XG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IGNvcHkuaGFzTm9kZShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnRzW3ZdID0gcGFyZW50O1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9IGVsc2UgaWYgKHBhcmVudCBpbiBwYXJlbnRzKSB7XG4gICAgICByZXR1cm4gcGFyZW50c1twYXJlbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgXy5lYWNoKGNvcHkubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgICAgY29weS5zZXRQYXJlbnQodiwgZmluZFBhcmVudCh2KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbi8qID09PSBFZGdlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fZWRnZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGF0aCA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICBfLnJlZHVjZSh2cywgZnVuY3Rpb24odiwgdykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3KTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qXG4gKiBzZXRFZGdlKHYsIHcsIFt2YWx1ZSwgW25hbWVdXSlcbiAqIHNldEVkZ2UoeyB2LCB3LCBbbmFtZV0gfSwgW3ZhbHVlXSlcbiAqL1xuR3JhcGgucHJvdG90eXBlLnNldEVkZ2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHYsIHcsIG5hbWUsIHZhbHVlO1xuICB2YXIgdmFsdWVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgdmFyIGFyZzAgPSBhcmd1bWVudHNbMF07XG5cbiAgaWYgKHR5cGVvZiBhcmcwID09PSBcIm9iamVjdFwiICYmIGFyZzAgIT09IG51bGwgJiYgXCJ2XCIgaW4gYXJnMCkge1xuICAgIHYgPSBhcmcwLnY7XG4gICAgdyA9IGFyZzAudztcbiAgICBuYW1lID0gYXJnMC5uYW1lO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdiA9IGFyZzA7XG4gICAgdyA9IGFyZ3VtZW50c1sxXTtcbiAgICBuYW1lID0gYXJndW1lbnRzWzNdO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdiA9IFwiXCIgKyB2O1xuICB3ID0gXCJcIiArIHc7XG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIG5hbWUgPSBcIlwiICsgbmFtZTtcbiAgfVxuXG4gIHZhciBlID0gZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICBpZiAoXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSkpIHtcbiAgICBpZiAodmFsdWVTcGVjaWZpZWQpIHtcbiAgICAgIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkgJiYgIXRoaXMuX2lzTXVsdGlncmFwaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2VcIik7XG4gIH1cblxuICAvLyBJdCBkaWRuJ3QgZXhpc3QsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGl0LlxuICAvLyBGaXJzdCBlbnN1cmUgdGhlIG5vZGVzIGV4aXN0LlxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuc2V0Tm9kZSh3KTtcblxuICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWVTcGVjaWZpZWQgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LCB3LCBuYW1lKTtcblxuICB2YXIgZWRnZU9iaiA9IGVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIC8vIEVuc3VyZSB3ZSBhZGQgdW5kaXJlY3RlZCBlZGdlcyBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuICB2ID0gZWRnZU9iai52O1xuICB3ID0gZWRnZU9iai53O1xuXG4gIE9iamVjdC5mcmVlemUoZWRnZU9iaik7XG4gIHRoaXMuX2VkZ2VPYmpzW2VdID0gZWRnZU9iajtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgdGhpcy5faW5bd11bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9vdXRbdl1bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9lZGdlQ291bnQrKztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHZhciBlZGdlID0gdGhpcy5fZWRnZU9ianNbZV07XG4gIGlmIChlZGdlKSB7XG4gICAgdiA9IGVkZ2UudjtcbiAgICB3ID0gZWRnZS53O1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt3XVtlXTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO1xuICAgIHRoaXMuX2VkZ2VDb3VudC0tO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmluRWRnZXMgPSBmdW5jdGlvbih2LCB1KSB7XG4gIHZhciBpblYgPSB0aGlzLl9pblt2XTtcbiAgaWYgKGluVikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKGluVik7XG4gICAgaWYgKCF1KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS52ID09PSB1OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm91dEVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgb3V0ViA9IHRoaXMuX291dFt2XTtcbiAgaWYgKG91dFYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhvdXRWKTtcbiAgICBpZiAoIXcpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLncgPT09IHc7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgaW5FZGdlcyA9IHRoaXMuaW5FZGdlcyh2LCB3KTtcbiAgaWYgKGluRWRnZXMpIHtcbiAgICByZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LCB3KSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCwgaykge1xuICBpZiAobWFwW2tdKSB7XG4gICAgbWFwW2tdKys7XG4gIH0gZWxzZSB7XG4gICAgbWFwW2tdID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KG1hcCwgaykge1xuICBpZiAoIS0tbWFwW2tdKSB7IGRlbGV0ZSBtYXBba107IH1cbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIHYgKyBFREdFX0tFWV9ERUxJTSArIHcgKyBFREdFX0tFWV9ERUxJTSArXG4gICAgICAgICAgICAgKF8uaXNVbmRlZmluZWQobmFtZSkgPyBERUZBVUxUX0VER0VfTkFNRSA6IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgdmFyIGVkZ2VPYmogPSAgeyB2OiB2LCB3OiB3IH07XG4gIGlmIChuYW1lKSB7XG4gICAgZWRnZU9iai5uYW1lID0gbmFtZTtcbiAgfVxuICByZXR1cm4gZWRnZU9iajtcbn1cblxuZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCwgZWRnZU9iaikge1xuICByZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmoudiwgZWRnZU9iai53LCBlZGdlT2JqLm5hbWUpO1xufVxuIiwiLy8gSW5jbHVkZXMgb25seSB0aGUgXCJjb3JlXCIgb2YgZ3JhcGhsaWJcbm1vZHVsZS5leHBvcnRzID0ge1xuICBHcmFwaDogcmVxdWlyZShcIi4vZ3JhcGhcIiksXG4gIHZlcnNpb246IHJlcXVpcmUoXCIuL3ZlcnNpb25cIilcbn07XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd3JpdGU6IHdyaXRlLFxuICByZWFkOiByZWFkXG59O1xuXG5mdW5jdGlvbiB3cml0ZShnKSB7XG4gIHZhciBqc29uID0ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRpcmVjdGVkOiBnLmlzRGlyZWN0ZWQoKSxcbiAgICAgIG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCksXG4gICAgICBjb21wb3VuZDogZy5pc0NvbXBvdW5kKClcbiAgICB9LFxuICAgIG5vZGVzOiB3cml0ZU5vZGVzKGcpLFxuICAgIGVkZ2VzOiB3cml0ZUVkZ2VzKGcpXG4gIH07XG4gIGlmICghXy5pc1VuZGVmaW5lZChnLmdyYXBoKCkpKSB7XG4gICAganNvbi52YWx1ZSA9IF8uY2xvbmUoZy5ncmFwaCgpKTtcbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZnVuY3Rpb24gd3JpdGVOb2RlcyhnKSB7XG4gIHJldHVybiBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZVZhbHVlID0gZy5ub2RlKHYpO1xuICAgIHZhciBwYXJlbnQgPSBnLnBhcmVudCh2KTtcbiAgICB2YXIgbm9kZSA9IHsgdjogdiB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gbm9kZVZhbHVlO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyZW50KSkge1xuICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVFZGdlcyhnKSB7XG4gIHJldHVybiBfLm1hcChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZVZhbHVlID0gZy5lZGdlKGUpO1xuICAgIHZhciBlZGdlID0geyB2OiBlLnYsIHc6IGUudyB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlLm5hbWUpKSB7XG4gICAgICBlZGdlLm5hbWUgPSBlLm5hbWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlZGdlVmFsdWUpKSB7XG4gICAgICBlZGdlLnZhbHVlID0gZWRnZVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWQoanNvbikge1xuICB2YXIgZyA9IG5ldyBHcmFwaChqc29uLm9wdGlvbnMpLnNldEdyYXBoKGpzb24udmFsdWUpO1xuICBfLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldE5vZGUoZW50cnkudiwgZW50cnkudmFsdWUpO1xuICAgIGlmIChlbnRyeS5wYXJlbnQpIHtcbiAgICAgIGcuc2V0UGFyZW50KGVudHJ5LnYsIGVudHJ5LnBhcmVudCk7XG4gICAgfVxuICB9KTtcbiAgXy5lYWNoKGpzb24uZWRnZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXRFZGdlKHsgdjogZW50cnkudiwgdzogZW50cnkudywgbmFtZTogZW50cnkubmFtZSB9LCBlbnRyeS52YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gZztcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGxvZGFzaDtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBsb2Rhc2ggPSB7XG4gICAgICBjbG9uZTogcmVxdWlyZShcImxvZGFzaC9jbG9uZVwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZWFjaDogcmVxdWlyZShcImxvZGFzaC9lYWNoXCIpLFxuICAgICAgZmlsdGVyOiByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKSxcbiAgICAgIGhhczogIHJlcXVpcmUoXCJsb2Rhc2gvaGFzXCIpLFxuICAgICAgaXNBcnJheTogcmVxdWlyZShcImxvZGFzaC9pc0FycmF5XCIpLFxuICAgICAgaXNFbXB0eTogcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpLFxuICAgICAgaXNGdW5jdGlvbjogcmVxdWlyZShcImxvZGFzaC9pc0Z1bmN0aW9uXCIpLFxuICAgICAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoXCJsb2Rhc2gvaXNVbmRlZmluZWRcIiksXG4gICAgICBrZXlzOiByZXF1aXJlKFwibG9kYXNoL2tleXNcIiksXG4gICAgICBtYXA6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpLFxuICAgICAgcmVkdWNlOiByZXF1aXJlKFwibG9kYXNoL3JlZHVjZVwiKSxcbiAgICAgIHNpemU6IHJlcXVpcmUoXCJsb2Rhc2gvc2l6ZVwiKSxcbiAgICAgIHRyYW5zZm9ybTogcmVxdWlyZShcImxvZGFzaC90cmFuc2Zvcm1cIiksXG4gICAgICB1bmlvbjogcmVxdWlyZShcImxvZGFzaC91bmlvblwiKSxcbiAgICAgIHZhbHVlczogcmVxdWlyZShcImxvZGFzaC92YWx1ZXNcIilcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghbG9kYXNoKSB7XG4gIGxvZGFzaCA9IHdpbmRvdy5fO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiIsIm1vZHVsZS5leHBvcnRzID0gJzIuMS44JztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7fTtcblRZUEVfU1RBVElDU1tyZWFjdElzLkZvcndhcmRSZWZdID0gRk9SV0FSRF9SRUZfU1RBVElDUztcblRZUEVfU1RBVElDU1tyZWFjdElzLk1lbW9dID0gTUVNT19TVEFUSUNTO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICAvLyBSZWFjdCB2MTYuMTEgYW5kIGJlbG93XG4gIGlmIChyZWFjdElzLmlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfSAvLyBSZWFjdCB2MTYuMTIgYW5kIGFib3ZlXG5cblxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFsnJCR0eXBlb2YnXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIElzIHRoaXMgc3RyaW5nIGFsbCB3aGl0ZXNwYWNlP1xyXG4gKiBUaGlzIHNvbHV0aW9uIGtpbmQgb2YgbWFrZXMgbXkgYnJhaW4gaHVydCwgYnV0IGl0J3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXJcclxuICogdGhhbiAhc3RyLnRyaW0oKSBvciBhbnkgb3RoZXIgc29sdXRpb24gSSBjb3VsZCBmaW5kLlxyXG4gKlxyXG4gKiB3aGl0ZXNwYWNlIGNvZGVzIGZyb206IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2hpdGVzcGFjZV9jaGFyYWN0ZXJcclxuICogYW5kIHZlcmlmaWVkIHdpdGg6XHJcbiAqXHJcbiAqICBmb3IodmFyIGkgPSAwOyBpIDwgNjU1MzY7IGkrKykge1xyXG4gKiAgICAgIHZhciBzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcclxuICogICAgICBpZigrcz09PTAgJiYgIXMudHJpbSgpKSBjb25zb2xlLmxvZyhpLCBzKTtcclxuICogIH1cclxuICpcclxuICogd2hpY2ggY291bnRzIGEgY291cGxlIG9mIHRoZXNlIGFzICpub3QqIHdoaXRlc3BhY2UsIGJ1dCBmaW5kcyBub3RoaW5nIGVsc2VcclxuICogdGhhdCAqaXMqIHdoaXRlc3BhY2UuIE5vdGUgdGhhdCBjaGFyQ29kZUF0IHN0b3BzIGF0IDE2IGJpdHMsIGJ1dCBpdCBhcHBlYXJzXHJcbiAqIHRoYXQgdGhlcmUgYXJlIG5vIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhYm92ZSB0aGlzLCBhbmQgY29kZSBwb2ludHMgYWJvdmVcclxuICogdGhpcyBkbyBub3QgbWFwIG9udG8gd2hpdGUgc3BhY2UgY2hhcmFjdGVycy5cclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHN0cil7XHJcbiAgICB2YXIgbCA9IHN0ci5sZW5ndGgsXHJcbiAgICAgICAgYTtcclxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBhID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYoKGEgPCA5IHx8IGEgPiAxMykgJiYgKGEgIT09IDMyKSAmJiAoYSAhPT0gMTMzKSAmJiAoYSAhPT0gMTYwKSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gNTc2MCkgJiYgKGEgIT09IDYxNTgpICYmIChhIDwgODE5MiB8fCBhID4gODIwNSkgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyMzIpICYmIChhICE9PSA4MjMzKSAmJiAoYSAhPT0gODIzOSkgJiYgKGEgIT09IDgyODcpICYmXHJcbiAgICAgICAgICAgIChhICE9PSA4Mjg4KSAmJiAoYSAhPT0gMTIyODgpICYmIChhICE9PSA2NTI3OSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJsYXlvdXRCYXNlXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyOCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExheW91dENvbnN0YW50cygpIHt9XG5cbi8qKlxyXG4gKiBMYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlFVQUxJVFkgPSAxO1xuXG4vKipcclxuICogRGVmYXVsdCBwYXJhbWV0ZXJzXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBmYWxzZTtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9PTl9MQVlPVVQgPSB0cnVlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX0RVUklOR19MQVlPVVQgPSBmYWxzZTtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9QRVJJT0QgPSA1MDtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gZmFsc2U7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWN0aW9uOiBHZW5lcmFsIG90aGVyIGNvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qXHJcbiAqIE1hcmdpbnMgb2YgYSBncmFwaCB0byBiZSBhcHBsaWVkIG9uIGJvdWRpbmcgcmVjdGFuZ2xlIG9mIGl0cyBjb250ZW50cy4gV2VcclxuICogYXNzdW1lIG1hcmdpbnMgb24gYWxsIGZvdXIgc2lkZXMgdG8gYmUgdW5pZm9ybS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFQSF9NQVJHSU4gPSAxNTtcblxuLypcclxuICogV2hldGhlciB0byBjb25zaWRlciBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zIG9yIG5vdFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBmYWxzZTtcblxuLypcclxuICogRGVmYXVsdCBkaW1lbnNpb24gb2YgYSBub24tY29tcG91bmQgbm9kZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRSA9IDQwO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9IQUxGX1NJWkUgPSBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRSAvIDI7XG5cbi8qXHJcbiAqIEVtcHR5IGNvbXBvdW5kIG5vZGUgc2l6ZS4gV2hlbiBhIGNvbXBvdW5kIG5vZGUgaXMgZW1wdHksIGl0cyBib3RoXHJcbiAqIGRpbWVuc2lvbnMgc2hvdWxkIGJlIG9mIHRoaXMgdmFsdWUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLkVNUFRZX0NPTVBPVU5EX05PREVfU0laRSA9IDQwO1xuXG4vKlxyXG4gKiBNaW5pbXVtIGxlbmd0aCB0aGF0IGFuIGVkZ2Ugc2hvdWxkIHRha2UgZHVyaW5nIGxheW91dFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgbGF5b3V0IG9wZXJhdGVzIG9uXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZID0gMTAwMDAwMDtcblxuLypcclxuICogV29ybGQgYm91bmRhcmllcyB0aGF0IHJhbmRvbSBwb3NpdGlvbmluZyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhcclxuICovXG5MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWSA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSAvIDEwMDA7XG5cbi8qXHJcbiAqIENvb3JkaW5hdGVzIG9mIHRoZSB3b3JsZCBjZW50ZXJcclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1ggPSAxMjAwO1xuTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9ZID0gOTAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBMRWRnZShzb3VyY2UsIHRhcmdldCwgdkVkZ2UpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkVkZ2UpO1xuXG4gIHRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0ID0gZmFsc2U7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdkVkZ2U7XG4gIHRoaXMuYmVuZHBvaW50cyA9IFtdO1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG59XG5cbkxFZGdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoT2JqZWN0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExFZGdlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MRWRnZS5wcm90b3R5cGUuZ2V0U291cmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2U7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50YXJnZXQ7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuaXNJbnRlckdyYXBoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pc0ludGVyR3JhcGg7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQ7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0QmVuZHBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuYmVuZHBvaW50cztcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMY2EgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2VJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuc291cmNlSW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0VGFyZ2V0SW5MY2EgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldEluTGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldE90aGVyRW5kID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKHRoaXMuc291cmNlID09PSBub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0O1xuICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09PSBub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IFwiTm9kZSBpcyBub3QgaW5jaWRlbnQgd2l0aCB0aGlzIGVkZ2VcIjtcbiAgfVxufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldE90aGVyRW5kSW5HcmFwaCA9IGZ1bmN0aW9uIChub2RlLCBncmFwaCkge1xuICB2YXIgb3RoZXJFbmQgPSB0aGlzLmdldE90aGVyRW5kKG5vZGUpO1xuICB2YXIgcm9vdCA9IGdyYXBoLmdldEdyYXBoTWFuYWdlcigpLmdldFJvb3QoKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChvdGhlckVuZC5nZXRPd25lcigpID09IGdyYXBoKSB7XG4gICAgICByZXR1cm4gb3RoZXJFbmQ7XG4gICAgfVxuXG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gcm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgb3RoZXJFbmQgPSBvdGhlckVuZC5nZXRPd25lcigpLmdldFBhcmVudCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUudXBkYXRlTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2xpcFBvaW50Q29vcmRpbmF0ZXMgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHRoaXMudGFyZ2V0LmdldFJlY3QoKSwgdGhpcy5zb3VyY2UuZ2V0UmVjdCgpLCBjbGlwUG9pbnRDb29yZGluYXRlcyk7XG5cbiAgaWYgKCF0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCkge1xuICAgIHRoaXMubGVuZ3RoWCA9IGNsaXBQb2ludENvb3JkaW5hdGVzWzBdIC0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMl07XG4gICAgdGhpcy5sZW5ndGhZID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMV0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1szXTtcblxuICAgIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgICB0aGlzLmxlbmd0aFggPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWCk7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWSA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhZKTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUudXBkYXRlTGVuZ3RoU2ltcGxlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmxlbmd0aFggPSB0aGlzLnRhcmdldC5nZXRDZW50ZXJYKCkgLSB0aGlzLnNvdXJjZS5nZXRDZW50ZXJYKCk7XG4gIHRoaXMubGVuZ3RoWSA9IHRoaXMudGFyZ2V0LmdldENlbnRlclkoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclkoKTtcblxuICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhYKSA8IDEuMCkge1xuICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFkpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICB9XG5cbiAgdGhpcy5sZW5ndGggPSBNYXRoLnNxcnQodGhpcy5sZW5ndGhYICogdGhpcy5sZW5ndGhYICsgdGhpcy5sZW5ndGhZICogdGhpcy5sZW5ndGhZKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTEVkZ2U7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBMR3JhcGhPYmplY3QodkdyYXBoT2JqZWN0KSB7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdkdyYXBoT2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaE9iamVjdDtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBSZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBSYW5kb21TZWVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gTE5vZGUoZ20sIGxvYywgc2l6ZSwgdk5vZGUpIHtcbiAgLy9BbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvciAxIDogTE5vZGUoTEdyYXBoTWFuYWdlciBnbSwgUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgT2JqZWN0IHZOb2RlKVxuICBpZiAoc2l6ZSA9PSBudWxsICYmIHZOb2RlID09IG51bGwpIHtcbiAgICB2Tm9kZSA9IGxvYztcbiAgfVxuXG4gIExHcmFwaE9iamVjdC5jYWxsKHRoaXMsIHZOb2RlKTtcblxuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDIgOiBMTm9kZShMYXlvdXQgbGF5b3V0LCBPYmplY3Qgdk5vZGUpXG4gIGlmIChnbS5ncmFwaE1hbmFnZXIgIT0gbnVsbCkgZ20gPSBnbS5ncmFwaE1hbmFnZXI7XG5cbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMuaW5jbHVzaW9uVHJlZURlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdk5vZGU7XG4gIHRoaXMuZWRnZXMgPSBbXTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcblxuICBpZiAoc2l6ZSAhPSBudWxsICYmIGxvYyAhPSBudWxsKSB0aGlzLnJlY3QgPSBuZXcgUmVjdGFuZ2xlRChsb2MueCwgbG9jLnksIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtlbHNlIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKCk7XG59XG5cbkxOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoT2JqZWN0LnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE9iamVjdCkge1xuICBMTm9kZVtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDaGlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY2hpbGQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0T3duZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vICBpZiAodGhpcy5vd25lciAhPSBudWxsKSB7XG4gIC8vICAgIGlmICghKHRoaXMub3duZXIgPT0gbnVsbCB8fCB0aGlzLm93bmVyLmdldE5vZGVzKCkuaW5kZXhPZih0aGlzKSA+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+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsInZhciBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIHZhciBndWFyZCA9IGxlbmd0aCA+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+IDNcbiAqXG4gKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiAgIHJldHVybiByZXN1bHQ7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZHVjZTtcbiIsInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNTdHJpbmcgPSByZXF1aXJlKCcuL2lzU3RyaW5nJyksXG4gICAgc3RyaW5nU2l6ZSA9IHJlcXVpcmUoJy4vX3N0cmluZ1NpemUnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlXG4gKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8uc2l6ZSgncGViYmxlcycpO1xuICogLy8gPT4gN1xuICovXG5mdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKGNvbGxlY3Rpb24pO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgfVxuICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNpemU7XG4iLCJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpLFxuICAgIGJhc2VPcmRlckJ5ID0gcmVxdWlyZSgnLi9fYmFzZU9yZGVyQnknKSxcbiAgICBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kXG4gKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH1cbiAqIF07XG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gKi9cbnZhciBzb3J0QnkgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW107XG4gIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICB9XG4gIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0Qnk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gKiAvLyA9PiBbW10sIFtdXVxuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJBcnJheTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuIiwidmFyIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSW50ZWdlcjtcbiIsInZhciBiYXNlVHJpbSA9IHJlcXVpcmUoJy4vX2Jhc2VUcmltJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gKi9cbmZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvUGxhaW5PYmplY3Q7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9fYmFzZUNyZWF0ZScpLFxuICAgIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKipcbiAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICogfSwgW10pO1xuICogLy8gPT4gWzQsIDldXG4gKlxuICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgfVxuICB9XG4gIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhbnNmb3JtO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgYmFzZVVuaXEgPSByZXF1aXJlKCcuL19iYXNlVW5pcScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqL1xudmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmlvbjtcbiIsInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbnZhciBpZENvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gKlxuICogXy51bmlxdWVJZCgpO1xuICogLy8gPT4gJzEwNSdcbiAqL1xuZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaXF1ZUlkO1xuIiwidmFyIGJhc2VWYWx1ZXMgPSByZXF1aXJlKCcuL19iYXNlVmFsdWVzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZXM7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VaaXBPYmplY3QgPSByZXF1aXJlKCcuL19iYXNlWmlwT2JqZWN0Jyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cyxcbiAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC40LjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICovXG5mdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykge1xuICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gemlwT2JqZWN0O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbGwgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbGwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSwgYGZhbHNlYCBpZlxuICogdGhlcmUgYXJlIGFueSB0aGF0IGRvbid0LlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgZXZlcnkgZWxlbWVudCwgYGZhbHNlYFxuICogICAgICAgICBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55LCBSLm5vbmUsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXF1YWxzMyA9IFIuZXF1YWxzKDMpO1xuICogICAgICBSLmFsbChlcXVhbHMzKShbMywgMywgMywgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDEsIDNdKTsgLy89PiBmYWxzZVxuICovXG52YXIgYWxsID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsnYWxsJ10sIF94YWxsLCBmdW5jdGlvbiBhbGwoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmICghZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFsbDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdCA9IFIuYWx3YXlzKCdUZWUnKTtcbiAqICAgICAgdCgpOyAvLz0+ICdUZWUnXG4gKi9cbnZhciBhbHdheXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBhbHdheXModmFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYWx3YXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFueSBmcm9tIFwiLi9pbnRlcm5hbC9feGFueS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSxcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFsbCwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMCA9IFIuZmxpcChSLmx0KSgwKTtcbiAqICAgICAgY29uc3QgbGVzc1RoYW4yID0gUi5mbGlwKFIubHQpKDIpO1xuICogICAgICBSLmFueShsZXNzVGhhbjApKFsxLCAyXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5hbnkobGVzc1RoYW4yKShbMSwgMl0pOyAvLz0+IHRydWVcbiAqL1xudmFyIGFueSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2FueSddLCBfeGFueSwgZnVuY3Rpb24gYW55KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFueTsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuXG4vKipcbiAqIGFwIGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhcGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC4gQWxzb1xuICogdHJlYXRzIGN1cnJpZWQgZnVuY3Rpb25zIGFzIGFwcGxpY2F0aXZlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAc2lnIEFwcGx5IGYgPT4gZiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAc2lnIChyIC0+IGEgLT4gYikgLT4gKHIgLT4gYSkgLT4gKHIgLT4gYilcbiAqIEBwYXJhbSB7Kn0gYXBwbHlGXG4gKiBAcGFyYW0geyp9IGFwcGx5WFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwKFtSLm11bHRpcGx5KDIpLCBSLmFkZCgzKV0sIFsxLDIsM10pOyAvLz0+IFsyLCA0LCA2LCA0LCA1LCA2XVxuICogICAgICBSLmFwKFtSLmNvbmNhdCgndGFzdHkgJyksIFIudG9VcHBlcl0sIFsncGl6emEnLCAnc2FsYWQnXSk7IC8vPT4gW1widGFzdHkgcGl6emFcIiwgXCJ0YXN0eSBzYWxhZFwiLCBcIlBJWlpBXCIsIFwiU0FMQURcIl1cbiAqXG4gKiAgICAgIC8vIFIuYXAgY2FuIGFsc28gYmUgdXNlZCBhcyBTIGNvbWJpbmF0b3JcbiAqICAgICAgLy8gd2hlbiBvbmx5IHR3byBmdW5jdGlvbnMgYXJlIHBhc3NlZFxuICogICAgICBSLmFwKFIuY29uY2F0LCBSLnRvVXBwZXIpKCdSYW1kYScpIC8vPT4gJ1JhbWRhUkFNREEnXG4gKiBAc3ltYiBSLmFwKFtmLCBnXSwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpLCBnKGEpLCBnKGIpXVxuICovXG52YXIgYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBseUYsIGFwcGx5WCkge1xuICByZXR1cm4gdHlwZW9mIGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10gPT09ICdmdW5jdGlvbicgPyBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddKGFwcGx5RikgOiB0eXBlb2YgYXBwbHlGLmFwID09PSAnZnVuY3Rpb24nID8gYXBwbHlGLmFwKGFwcGx5WCkgOiB0eXBlb2YgYXBwbHlGID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gYXBwbHlGKHgpKGFwcGx5WCh4KSk7XG4gIH0gOiBfcmVkdWNlKGZ1bmN0aW9uIChhY2MsIGYpIHtcbiAgICByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBhcHBseVgpKTtcbiAgfSwgW10sIGFwcGx5Rik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFwOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIGZvbGxvd2VkIGJ5XG4gKiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHsqfSBlbCBUaGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGFkZCBhIG5ldyBpdGVtIHRvLlxuICogICAgICAgIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgb2xkIGxpc3QgZm9sbG93ZWQgYnkgYGVsYC5cbiAqIEBzZWUgUi5wcmVwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcHBlbmQoJ3Rlc3RzJywgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsICd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFtdKTsgLy89PiBbJ3Rlc3RzJ11cbiAqICAgICAgUi5hcHBlbmQoWyd0ZXN0cyddLCBbJ3dyaXRlJywgJ21vcmUnXSk7IC8vPT4gWyd3cml0ZScsICdtb3JlJywgWyd0ZXN0cyddXVxuICovXG52YXIgYXBwZW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXBwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KGxpc3QsIFtlbF0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhcHBlbmQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGFzc29jUGF0aCBmcm9tIFwiLi9hc3NvY1BhdGguanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50XG4gKiBAc2lnIElkeCAtPiBhIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqIEBzZWUgUi5kaXNzb2MsIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXNzb2MoJ2MnLCAzLCB7YTogMSwgYjogMn0pOyAvLz0+IHthOiAxLCBiOiAyLCBjOiAzfVxuICovXG52YXIgYXNzb2MgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBhc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICByZXR1cm4gYXNzb2NQYXRoKFtwcm9wXSwgdmFsLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhc3NvYzsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2Fzc29jIGZyb20gXCIuL2ludGVybmFsL19hc3NvYy5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xudmFyIGFzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIGFzc29jUGF0aChwYXRoLCB2YWwsIG9iaikge1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHZhciBpZHggPSBwYXRoWzBdO1xuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSAhaXNOaWwob2JqKSAmJiBfaGFzKGlkeCwgb2JqKSAmJiB0eXBlb2Ygb2JqW2lkeF0gPT09ICdvYmplY3QnID8gb2JqW2lkeF0gOiBfaXNJbnRlZ2VyKHBhdGhbMV0pID8gW10gOiB7fTtcbiAgICB2YWwgPSBhc3NvY1BhdGgoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSksIHZhbCwgbmV4dE9iaik7XG4gIH1cbiAgcmV0dXJuIF9hc3NvYyhpZHgsIHZhbCwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXNzb2NQYXRoOyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgYm91bmQgdG8gYSBjb250ZXh0LlxuICogTm90ZTogYFIuYmluZGAgZG9lcyBub3QgcHJvdmlkZSB0aGUgYWRkaXRpb25hbCBhcmd1bWVudC1iaW5kaW5nIGNhcGFiaWxpdGllcyBvZlxuICogW0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKiAtPiAqKSAtPiB7Kn0gLT4gKCogLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRvIGNvbnRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzT2JqIFRoZSBjb250ZXh0IHRvIGJpbmQgYGZuYCB0b1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgaW4gdGhlIGNvbnRleHQgb2YgYHRoaXNPYmpgLlxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsb2cgPSBSLmJpbmQoY29uc29sZS5sb2csIGNvbnNvbGUpO1xuICogICAgICBSLnBpcGUoUi5hc3NvYygnYScsIDIpLCBSLnRhcChsb2cpLCBSLmFzc29jKCdhJywgMykpKHthOiAxfSk7IC8vPT4ge2E6IDN9XG4gKiAgICAgIC8vIGxvZ3Mge2E6IDJ9XG4gKiBAc3ltYiBSLmJpbmQoZiwgbykoYSwgYikgPSBmLmNhbGwobywgYSwgYilcbiAqL1xudmFyIGJpbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBiaW5kKGZuLCB0aGlzT2JqKSB7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNPYmosIGFyZ3VtZW50cyk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBiaW5kOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgc291cmNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHNvdXJjZVxuICogb2JqZWN0IHdpdGhvdXQgcmV0YWluaW5nIGFueSByZWZlcmVuY2VzIHRvIGl0LlxuICogVGhlIHNvdXJjZSBvYmplY3QgbWF5IGNvbnRhaW4gKG5lc3RlZCkgYEFycmF5YHMgYW5kIGBPYmplY3RgcyxcbiAqIGBOdW1iZXJgcywgYFN0cmluZ2BzLCBgQm9vbGVhbmBzIGFuZCBgRGF0ZWBzLlxuICogYEZ1bmN0aW9uYHMgYXJlIGFzc2lnbmVkIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byBhIGBjbG9uZWAgbWV0aG9kIGlmIHByZXNlbnQuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBzb3VyY2Ugb2JqZWN0IGhhcyBtdWx0aXBsZSBub2RlcyB0aGF0IHNoYXJlIGEgcmVmZXJlbmNlLFxuICogdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBidXQgdGhlIHJlZmVyZW5jZXMgd2lsbFxuICogYmUgcG9pbnRlZCB0byB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBjbG9uZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHsqfSAtPiB7Kn1cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIG9iamVjdCBvciBhcnJheSB0byBjbG9uZVxuICogQHJldHVybiB7Kn0gQSBkZWVwbHkgY2xvbmVkIGNvcHkgb2YgYHZhbGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBvYmplY3RzID0gW3t9LCB7fSwge31dO1xuICogICAgICBjb25zdCBvYmplY3RzQ2xvbmUgPSBSLmNsb25lKG9iamVjdHMpO1xuICogICAgICBvYmplY3RzID09PSBvYmplY3RzQ2xvbmU7IC8vPT4gZmFsc2VcbiAqICAgICAgb2JqZWN0c1swXSA9PT0gb2JqZWN0c0Nsb25lWzBdOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBjbG9uZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5jbG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmNsb25lKCkgOiBfY2xvbmUodmFsdWUsIHRydWUpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjbG9uZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmVwb3J0cyB3aGV0aGVyIHRoZSBmaXJzdFxuICogZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKGEsIGIpIC0+IEJvb2xlYW4pIC0+ICgoYSwgYikgLT4gTnVtYmVyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSBmdW5jdGlvbiBvZiBhcml0eSB0d28gd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBmaXJzdCBhcmd1bWVudFxuICogaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBGdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50IHRoYXQgcmV0dXJucyBgLTFgIGlmIGEgPCBiLCBgMWAgaWYgYiA8IGEsIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUFnZSA9IFIuY29tcGFyYXRvcigoYSwgYikgPT4gYS5hZ2UgPCBiLmFnZSk7XG4gKiAgICAgIGNvbnN0IHBlb3BsZSA9IFtcbiAqICAgICAgICB7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LFxuICogICAgICAgIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9LFxuICogICAgICAgIHsgbmFtZTogJ01pa2hhaWwnLCBhZ2U6IDYyIH0sXG4gKiAgICAgIF07XG4gKiAgICAgIGNvbnN0IHBlb3BsZUJ5SW5jcmVhc2luZ0FnZSA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqICAgICAgICAvLz0+IFt7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LHsgbmFtZTogJ0VtbWEnLCBhZ2U6IDcwIH0sIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9XVxuICovXG52YXIgY29tcGFyYXRvciA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNvbXBhcmF0b3IocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcHJlZChhLCBiKSA/IC0xIDogcHJlZChiLCBhKSA/IDEgOiAwO1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb21wYXJhdG9yOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxpc3RzIG9yIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYFIuY29uY2F0YCBleHBlY3RzIGJvdGggYXJndW1lbnRzIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsXG4gKiB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kLiBJdCB3aWxsIHRocm93XG4gKiBhbiBlcnJvciBpZiB5b3UgYGNvbmNhdGAgYW4gQXJyYXkgd2l0aCBhIG5vbi1BcnJheSB2YWx1ZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgY29uY2F0YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICogQ2FuIGFsc28gY29uY2F0ZW5hdGUgdHdvIG1lbWJlcnMgb2YgYSBbZmFudGFzeS1sYW5kXG4gKiBjb21wYXRpYmxlIHNlbWlncm91cF0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNzZW1pZ3JvdXApLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBmaXJzdExpc3QgVGhlIGZpcnN0IGxpc3RcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBzZWNvbmRMaXN0IFRoZSBzZWNvbmQgbGlzdFxuICogQHJldHVybiB7QXJyYXl8U3RyaW5nfSBBIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgZWxlbWVudHMgb2YgYGZpcnN0TGlzdGAgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mXG4gKiBgc2Vjb25kTGlzdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY29uY2F0KCdBQkMnLCAnREVGJyk7IC8vICdBQkNERUYnXG4gKiAgICAgIFIuY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqICAgICAgUi5jb25jYXQoW10sIFtdKTsgLy89PiBbXVxuICovXG52YXIgY29uY2F0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gY29uY2F0KGEsIGIpIHtcbiAgaWYgKF9pc0FycmF5KGEpKSB7XG4gICAgaWYgKF9pc0FycmF5KGIpKSB7XG4gICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG4gIGlmIChfaXNTdHJpbmcoYSkpIHtcbiAgICBpZiAoX2lzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhIHN0cmluZycpO1xuICB9XG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKSkge1xuICAgIHJldHVybiBhWydmYW50YXN5LWxhbmQvY29uY2F0J10oYik7XG4gIH1cbiAgaWYgKGEgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbihhLmNvbmNhdCkpIHtcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyhhKSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcImNvbmNhdFwiIG9yIFwiZmFudGFzeS1sYW5kL2NvbmNhdFwiJyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGNvbmNhdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBwbHVjayBmcm9tIFwiLi9wbHVjay5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcblxuLyoqXG4gKiBBY2NlcHRzIGEgY29udmVyZ2luZyBmdW5jdGlvbiBhbmQgYSBsaXN0IG9mIGJyYW5jaGluZyBmdW5jdGlvbnMgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uLiBUaGUgYXJpdHkgb2YgdGhlIG5ldyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgYXJpdHkgb2ZcbiAqIHRoZSBsb25nZXN0IGJyYW5jaGluZyBmdW5jdGlvbi4gV2hlbiBpbnZva2VkLCB0aGlzIG5ldyBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiB0byBzb21lIGFyZ3VtZW50cywgYW5kIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhvc2Ugc2FtZVxuICogYXJndW1lbnRzLiBUaGUgcmVzdWx0cyBvZiBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50c1xuICogdG8gdGhlIGNvbnZlcmdpbmcgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgcmV0dXJuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMlxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoeDEsIHgyLCAuLi4pIC0+IHopIC0+IFsoKGEsIGIsIC4uLikgLT4geDEpLCAoKGEsIGIsIC4uLikgLT4geDIpLCAuLi5dIC0+IChhIC0+IGIgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBBIGZ1bmN0aW9uLiBgYWZ0ZXJgIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWVzIG9mXG4gKiAgICAgICAgYGZuMWAgYW5kIGBmbjJgIGFzIGl0cyBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBmdW5jdGlvbnMgQSBsaXN0IG9mIGZ1bmN0aW9ucy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbi5cbiAqIEBzZWUgUi51c2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYXZlcmFnZSA9IFIuY29udmVyZ2UoUi5kaXZpZGUsIFtSLnN1bSwgUi5sZW5ndGhdKVxuICogICAgICBhdmVyYWdlKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkgLy89PiA0XG4gKlxuICogICAgICBjb25zdCBzdHJhbmdlQ29uY2F0ID0gUi5jb252ZXJnZShSLmNvbmNhdCwgW1IudG9VcHBlciwgUi50b0xvd2VyXSlcbiAqICAgICAgc3RyYW5nZUNvbmNhdChcIllvZGVsXCIpIC8vPT4gXCJZT0RFTHlvZGVsXCJcbiAqXG4gKiBAc3ltYiBSLmNvbnZlcmdlKGYsIFtnLCBoXSkoYSwgYikgPSBmKGcoYSwgYiksIGgoYSwgYikpXG4gKi9cbnZhciBjb252ZXJnZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGNvbnZlcmdlKGFmdGVyLCBmbnMpIHtcbiAgcmV0dXJuIGN1cnJ5TihyZWR1Y2UobWF4LCAwLCBwbHVjaygnbGVuZ3RoJywgZm5zKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgcmV0dXJuIGFmdGVyLmFwcGx5KGNvbnRleHQsIF9tYXAoZnVuY3Rpb24gKGZuKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZm5zKSk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb252ZXJnZTsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5Tig0LCBzdW1BcmdzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xudmFyIGN1cnJ5TiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGN1cnJ5TihsZW5ndGgsIGZuKSB7XG4gIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gX2N1cnJ5MShmbik7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShsZW5ndGgsIF9jdXJyeU4obGVuZ3RoLCBbXSwgZm4pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY3VycnlOOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmA7XG4gKiBvdGhlcndpc2UgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkZWZhdWx0VG80MiA9IFIuZGVmYXVsdFRvKDQyKTtcbiAqXG4gKiAgICAgIGRlZmF1bHRUbzQyKG51bGwpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80Mih1bmRlZmluZWQpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80MihmYWxzZSk7ICAvLz0+IGZhbHNlXG4gKiAgICAgIGRlZmF1bHRUbzQyKCdSYW1kYScpOyAgLy89PiAnUmFtZGEnXG4gKiAgICAgIC8vIHBhcnNlSW50KCdzdHJpbmcnKSByZXN1bHRzIGluIE5hTlxuICogICAgICBkZWZhdWx0VG80MihwYXJzZUludCgnc3RyaW5nJykpOyAvLz0+IDQyXG4gKi9cbnZhciBkZWZhdWx0VG8gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkZWZhdWx0VG8oZCwgdikge1xuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdFRvOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdCBub3RcbiAqIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGxpc3QuIE9iamVjdHMgYW5kIEFycmF5cyBhcmUgY29tcGFyZWQgaW4gdGVybXMgb2ZcbiAqIHZhbHVlIGVxdWFsaXR5LCBub3QgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCB0aGF0IGFyZSBub3QgaW4gYGxpc3QyYC5cbiAqIEBzZWUgUi5kaWZmZXJlbmNlV2l0aCwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLCBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpZmZlcmVuY2UoWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzEsMl1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFs3LDYsNSw0LDNdLCBbMSwyLDMsNF0pOyAvLz0+IFs3LDYsNV1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFt7YTogMX0sIHtiOiAyfV0sIFt7YTogMX0sIHtjOiAzfV0pIC8vPT4gW3tiOiAyfV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaWZmZXJlbmNlKGZpcnN0LCBzZWNvbmQpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGZpcnN0TGVuID0gZmlyc3QubGVuZ3RoO1xuICB2YXIgc2Vjb25kTGVuID0gc2Vjb25kLmxlbmd0aDtcbiAgdmFyIHRvRmlsdGVyT3V0ID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWNvbmRMZW47IGkgKz0gMSkge1xuICAgIHRvRmlsdGVyT3V0LmFkZChzZWNvbmRbaV0pO1xuICB9XG4gIHdoaWxlIChpZHggPCBmaXJzdExlbikge1xuICAgIGlmICh0b0ZpbHRlck91dC5hZGQoZmlyc3RbaWR4XSkpIHtcbiAgICAgIG91dFtvdXQubGVuZ3RoXSA9IGZpcnN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGRpc3NvY1BhdGggZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzc29jaWF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBidXQgd2l0aG91dCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gKiBAc2VlIFIuYXNzb2MsIFIub21pdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jKCdiJywge2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiB7YTogMSwgYzogM31cbiAqL1xudmFyIGRpc3NvYyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGRpc3NvY1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2M7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3NvYy5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgYXNzb2MgZnJvbSBcIi4vYXNzb2MuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zXG4gKiBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlXG4gKiBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBwcm9wIFRoZSBwcm9wIG9wZXJhdGluZ1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gX3NoYWxsb3dDbG9uZU9iamVjdChwcm9wLCBvYmopIHtcbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBbXS5jb25jYXQob2JqKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgb21pdHRpbmcgdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBwYXRoLlxuICogTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0XG4gKiBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjExLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gb21pdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRob3V0IHRoZSBwcm9wZXJ0eSBhdCBwYXRoXG4gKiBAc2VlIFIuYXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwge2E6IHtiOiB7YzogNDJ9fX0pOyAvLz0+IHthOiB7Yjoge319fVxuICovXG52YXIgZGlzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvY1BhdGgocGF0aCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBvYmo7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIF9kaXNzb2MocGF0aFswXSwgb2JqKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGhlYWQgPSBwYXRoWzBdO1xuICAgICAgdmFyIHRhaWwgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXRoLCAxKTtcbiAgICAgIGlmIChvYmpbaGVhZF0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX3NoYWxsb3dDbG9uZU9iamVjdChoZWFkLCBvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGhlYWQsIGRpc3NvY1BhdGgodGFpbCwgb2JqW2hlYWRdKSwgb2JqKTtcbiAgICAgIH1cbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2NQYXRoOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IF9pc1R5cGVkQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVtcHR5IHZhbHVlIG9mIGl0cyBhcmd1bWVudCdzIHR5cGUuIFJhbWRhIGRlZmluZXMgdGhlIGVtcHR5XG4gKiB2YWx1ZSBvZiBBcnJheSAoYFtdYCksIE9iamVjdCAoYHt9YCksIFN0cmluZyAoYCcnYCksXG4gKiBUeXBlZEFycmF5IChgVWludDhBcnJheSBbXWAsIGBGbG9hdDMyQXJyYXkgW11gLCBldGMpLCBhbmQgQXJndW1lbnRzLiBPdGhlclxuICogdHlwZXMgYXJlIHN1cHBvcnRlZCBpZiB0aGV5IGRlZmluZSBgPFR5cGU+LmVtcHR5YCxcbiAqIGA8VHlwZT4ucHJvdG90eXBlLmVtcHR5YCBvciBpbXBsZW1lbnQgdGhlXG4gKiBbRmFudGFzeUxhbmQgTW9ub2lkIHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjbW9ub2lkKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZW1wdHlgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lbXB0eShKdXN0KDQyKSk7ICAgICAgICAgICAgICAgLy89PiBOb3RoaW5nKClcbiAqICAgICAgUi5lbXB0eShbMSwgMiwgM10pOyAgICAgICAgICAgICAgLy89PiBbXVxuICogICAgICBSLmVtcHR5KCd1bmljb3JucycpOyAgICAgICAgICAgICAvLz0+ICcnXG4gKiAgICAgIFIuZW1wdHkoe3g6IDEsIHk6IDJ9KTsgICAgICAgICAgIC8vPT4ge31cbiAqICAgICAgUi5lbXB0eShVaW50OEFycmF5LmZyb20oJzEyMycpKTsgLy89PiBVaW50OEFycmF5IFtdXG4gKi9cbnZhciBlbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGVtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiB0eXBlb2YgeFsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4WydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yWydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHR5cGVvZiB4LmVtcHR5ID09PSAnZnVuY3Rpb24nID8geC5lbXB0eSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3Rvci5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguY29uc3RydWN0b3IuZW1wdHkoKSA6IF9pc0FycmF5KHgpID8gW10gOiBfaXNTdHJpbmcoeCkgPyAnJyA6IF9pc09iamVjdCh4KSA/IHt9IDogX2lzQXJndW1lbnRzKHgpID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhcmd1bWVudHM7XG4gIH0oKSA6IF9pc1R5cGVkQXJyYXkoeCkgPyB4LmNvbnN0cnVjdG9yLmZyb20oJycpIDogdm9pZCAwIC8vIGVsc2VcbiAgO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGVtcHR5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZXF1YWxzIGZyb20gXCIuL2ludGVybmFsL19lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBpdHMgYXJndW1lbnRzIGFyZSBlcXVpdmFsZW50LCBgZmFsc2VgIG90aGVyd2lzZS4gSGFuZGxlc1xuICogY3ljbGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICpcbiAqIERpc3BhdGNoZXMgc3ltbWV0cmljYWxseSB0byB0aGUgYGVxdWFsc2AgbWV0aG9kcyBvZiBib3RoIGFyZ3VtZW50cywgaWZcbiAqIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxdWFscygxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZXF1YWxzKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcXVhbHMoWzEsIDIsIDNdLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIGNvbnN0IGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgY29uc3QgYiA9IHt9OyBiLnYgPSBiO1xuICogICAgICBSLmVxdWFscyhhLCBiKTsgLy89PiB0cnVlXG4gKi9cbnZhciBlcXVhbHMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gX2VxdWFscyhhLCBiLCBbXSwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBlcXVhbHM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IHJlY3Vyc2l2ZWx5IGV2b2x2aW5nIGEgc2hhbGxvdyBjb3B5IG9mIGBvYmplY3RgLFxuICogYWNjb3JkaW5nIHRvIHRoZSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9ucy4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllc1xuICogYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGludm9rZWQgaWYgaXRzIGNvcnJlc3BvbmRpbmcga2V5XG4gKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZXZvbHZlZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiAodiAtPiB2KX0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybWF0aW9ucyBUaGUgb2JqZWN0IHNwZWNpZnlpbmcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiAgICAgICAgdG8gdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHRyYW5zZm9ybWVkIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0b21hdG8gPSB7Zmlyc3ROYW1lOiAnICBUb21hdG8gJywgZGF0YToge2VsYXBzZWQ6IDEwMCwgcmVtYWluaW5nOiAxNDAwfSwgaWQ6MTIzfTtcbiAqICAgICAgY29uc3QgdHJhbnNmb3JtYXRpb25zID0ge1xuICogICAgICAgIGZpcnN0TmFtZTogUi50cmltLFxuICogICAgICAgIGxhc3ROYW1lOiBSLnRyaW0sIC8vIFdpbGwgbm90IGdldCBpbnZva2VkLlxuICogICAgICAgIGRhdGE6IHtlbGFwc2VkOiBSLmFkZCgxKSwgcmVtYWluaW5nOiBSLmFkZCgtMSl9XG4gKiAgICAgIH07XG4gKiAgICAgIFIuZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgdG9tYXRvKTsgLy89PiB7Zmlyc3ROYW1lOiAnVG9tYXRvJywgZGF0YToge2VsYXBzZWQ6IDEwMSwgcmVtYWluaW5nOiAxMzk5fSwgaWQ6MTIzfVxuICovXG52YXIgZXZvbHZlID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgb2JqZWN0KSB7XG4gIGlmICghX2lzT2JqZWN0KG9iamVjdCkgJiYgIV9pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSBvYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gIHZhciB0cmFuc2Zvcm1hdGlvbiwga2V5LCB0eXBlO1xuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICB0cmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uc1trZXldO1xuICAgIHR5cGUgPSB0eXBlb2YgdHJhbnNmb3JtYXRpb247XG4gICAgcmVzdWx0W2tleV0gPSB0eXBlID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtYXRpb24ob2JqZWN0W2tleV0pIDogdHJhbnNmb3JtYXRpb24gJiYgdHlwZSA9PT0gJ29iamVjdCcgPyBldm9sdmUodHJhbnNmb3JtYXRpb24sIG9iamVjdFtrZXldKSA6IG9iamVjdFtrZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGV2b2x2ZTsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBfeGZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbHRlci5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGBGaWx0ZXJhYmxlYCwgYW5kIHJldHVybnMgYSBuZXcgZmlsdGVyYWJsZSBvZiB0aGVcbiAqIHNhbWUgdHlwZSBjb250YWluaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBmaWx0ZXJhYmxlIHdoaWNoIHNhdGlzZnkgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmlsdGVyYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9IEZpbHRlcmFibGVcbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNFdmVuID0gbiA9PiBuICUgMiA9PT0gMDtcbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xudmFyIGZpbHRlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9maWx0ZXInLCAnZmlsdGVyJ10sIF94ZmlsdGVyLCBmdW5jdGlvbiAocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gX2lzT2JqZWN0KGZpbHRlcmFibGUpID8gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgIGFjY1trZXldID0gZmlsdGVyYWJsZVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhmaWx0ZXJhYmxlKSkgOlxuICAvLyBlbHNlXG4gIF9maWx0ZXIocHJlZCwgZmlsdGVyYWJsZSk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaWx0ZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmQuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlIHByZWRpY2F0ZSwgb3JcbiAqIGB1bmRlZmluZWRgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmluZGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IGEgfCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiAgICAgICAgZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGVsZW1lbnQgZm91bmQsIG9yIGB1bmRlZmluZWRgLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmQoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IHthOiAyfVxuICogICAgICBSLmZpbmQoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IHVuZGVmaW5lZFxuICovXG52YXIgZmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZpbmQnXSwgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZEluZGV4IGZyb20gXCIuL2ludGVybmFsL194ZmluZEluZGV4LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2hpY2ggbWF0Y2hlcyB0aGVcbiAqIHByZWRpY2F0ZSwgb3IgYC0xYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyB0aGVcbiAqIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3VuZCwgb3IgYC0xYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuaW5kZXhPZlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSgyLCAnYScpKSh4cyk7IC8vPT4gMVxuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSg0LCAnYScpKSh4cyk7IC8vPT4gLTFcbiAqL1xudmFyIGZpbmRJbmRleCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3hmaW5kSW5kZXgsIGZ1bmN0aW9uIGZpbmRJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX21ha2VGbGF0IGZyb20gXCIuL2ludGVybmFsL19tYWtlRmxhdC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwdWxsaW5nIGV2ZXJ5IGl0ZW0gb3V0IG9mIGl0IChhbmQgYWxsIGl0cyBzdWItYXJyYXlzKVxuICogYW5kIHB1dHRpbmcgdGhlbSBpbiBhIG5ldyBhcnJheSwgZGVwdGgtZmlyc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmxhdHRlbmVkIGxpc3QuXG4gKiBAc2VlIFIudW5uZXN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5mbGF0dGVuKFsxLCAyLCBbMywgNF0sIDUsIFs2LCBbNywgOCwgWzksIFsxMCwgMTFdLCAxMl1dXV0pO1xuICogICAgICAvLz0+IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyXVxuICovXG52YXIgZmxhdHRlbiA9IC8qI19fUFVSRV9fKi9fY3VycnkxKCAvKiNfX1BVUkVfXyovX21ha2VGbGF0KHRydWUpKTtcbmV4cG9ydCBkZWZhdWx0IGZsYXR0ZW47IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYGxpc3RgLCBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gYGZuYCBmb3IgZWFjaFxuICogZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIG9uZSBhcmd1bWVudDogKih2YWx1ZSkqLlxuICpcbiAqIE5vdGU6IGBSLmZvckVhY2hgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2QuIEZvciBtb3JlXG4gKiBkZXRhaWxzIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gjRGVzY3JpcHRpb25cbiAqXG4gKiBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIFJhbWRhJ3MgYGZvckVhY2hgIHJldHVybnNcbiAqIHRoZSBvcmlnaW5hbCBhcnJheS4gSW4gc29tZSBsaWJyYXJpZXMgdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZWFjaGAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZvckVhY2hgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gKikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgb25lIGFyZ3VtZW50LCBgdmFsdWVgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9yaWdpbmFsIGxpc3QuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludFhQbHVzRml2ZSA9IHggPT4gY29uc29sZS5sb2coeCArIDUpO1xuICogICAgICBSLmZvckVhY2gocHJpbnRYUGx1c0ZpdmUsIFsxLCAyLCAzXSk7IC8vPT4gWzEsIDIsIDNdXG4gKiAgICAgIC8vIGxvZ3MgNlxuICogICAgICAvLyBsb2dzIDdcbiAqICAgICAgLy8gbG9ncyA4XG4gKiBAc3ltYiBSLmZvckVhY2goZiwgW2EsIGIsIGNdKSA9IFthLCBiLCBjXVxuICovXG52YXIgZm9yRWFjaCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChmbiwgbGlzdCkge1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgZm4obGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZvckVhY2g7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBpbnB1dCBgb2JqZWN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIG9iamVjdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIHRocmVlIGFyZ3VtZW50OiAqKHZhbHVlLCBrZXksIG9iaikqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBTdHJpbmcsIFN0ck1hcCBhKSAtPiBBbnkpIC0+IFN0ck1hcCBhIC0+IFN0ck1hcCBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBSZWNlaXZlcyB0aHJlZSBhcmd1bWVudCwgYHZhbHVlYCwgYGtleWAsIGBvYmpgLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG9yaWdpbmFsIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludEtleUNvbmNhdFZhbHVlID0gKHZhbHVlLCBrZXkpID0+IGNvbnNvbGUubG9nKGtleSArICc6JyArIHZhbHVlKTtcbiAqICAgICAgUi5mb3JFYWNoT2JqSW5kZXhlZChwcmludEtleUNvbmNhdFZhbHVlLCB7eDogMSwgeTogMn0pOyAvLz0+IHt4OiAxLCB5OiAyfVxuICogICAgICAvLyBsb2dzIHg6MVxuICogICAgICAvLyBsb2dzIHk6MlxuICogQHN5bWIgUi5mb3JFYWNoT2JqSW5kZXhlZChmLCB7eDogYSwgeTogYn0pID0ge3g6IGEsIHk6IGJ9XG4gKi9cbnZhciBmb3JFYWNoT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGZvckVhY2hPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgdmFyIGtleUxpc3QgPSBrZXlzKG9iaik7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwga2V5TGlzdC5sZW5ndGgpIHtcbiAgICB2YXIga2V5ID0ga2V5TGlzdFtpZHhdO1xuICAgIGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZm9yRWFjaE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCByZWR1Y2VCeSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpc3QgaW50byBzdWItbGlzdHMgc3RvcmVkIGluIGFuIG9iamVjdCwgYmFzZWQgb24gdGhlIHJlc3VsdCBvZlxuICogY2FsbGluZyBhIGtleS1yZXR1cm5pbmcgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LCBhbmQgZ3JvdXBpbmcgdGhlXG4gKiByZXN1bHRzIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGdyb3VwQnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCBhID0+IChiIC0+IGEpIC0+IFtiXSAtPiB7YTogW2JdfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gOjogYSAtPiBJZHhcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIGFycmF5cyBvZiBlbGVtZW50c1xuICogICAgICAgICB0aGF0IHByb2R1Y2VkIHRoYXQga2V5IHdoZW4gcGFzc2VkIHRvIGBmbmAuXG4gKiBAc2VlIFIucmVkdWNlQnksIFIudHJhbnNkdWNlLCBSLmluZGV4QnksIFIuY29sbGVjdEJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlHcmFkZSA9IFIuZ3JvdXBCeShmdW5jdGlvbihzdHVkZW50KSB7XG4gKiAgICAgICAgY29uc3Qgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgY29uc3Qgc3R1ZGVudHMgPSBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fSxcbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5cbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnSmFjaycsIHNjb3JlOiA2OX1dO1xuICogICAgICBieUdyYWRlKHN0dWRlbnRzKTtcbiAqICAgICAgLy8ge1xuICogICAgICAvLyAgICdBJzogW3tuYW1lOiAnRGlhbm5lJywgc2NvcmU6IDk5fV0sXG4gKiAgICAgIC8vICAgJ0InOiBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fV1cbiAqICAgICAgLy8gICAvLyAuLi4sXG4gKiAgICAgIC8vICAgJ0YnOiBbe25hbWU6ICdFZGR5Jywgc2NvcmU6IDU4fV1cbiAqICAgICAgLy8gfVxuICovXG52YXIgZ3JvdXBCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdncm91cEJ5JywgLyojX19QVVJFX18qL3JlZHVjZUJ5KGZ1bmN0aW9uIChhY2MsIGl0ZW0pIHtcbiAgYWNjLnB1c2goaXRlbSk7XG4gIHJldHVybiBhY2M7XG59LCBbXSkpKTtcbmV4cG9ydCBkZWZhdWx0IGdyb3VwQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGhhc1BhdGggZnJvbSBcIi4vaGFzUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGhhcyBhbiBvd24gcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogeH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoYXNOYW1lID0gUi5oYXMoJ25hbWUnKTtcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2FsaWNlJ30pOyAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHtuYW1lOiAnYm9iJ30pOyAgICAgLy89PiB0cnVlXG4gKiAgICAgIGhhc05hbWUoe30pOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgICBjb25zdCBwb2ludCA9IHt4OiAwLCB5OiAwfTtcbiAqICAgICAgY29uc3QgcG9pbnRIYXMgPSBSLmhhcyhSLl9fLCBwb2ludCk7XG4gKiAgICAgIHBvaW50SGFzKCd4Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3knKTsgIC8vPT4gdHJ1ZVxuICogICAgICBwb2ludEhhcygneicpOyAgLy89PiBmYWxzZVxuICovXG52YXIgaGFzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gaGFzUGF0aChbcHJvcF0sIG9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGhhczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgcGF0aCBleGlzdHMgaW4gYW4gb2JqZWN0LiBPbmx5IHRoZSBvYmplY3Qnc1xuICogb3duIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHBhdGggaW4uXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwYXRoIGV4aXN0cy5cbiAqIEBzZWUgUi5oYXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAgICAgICAgIC8vID0+IHRydWVcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogdW5kZWZpbmVkfX0pOyAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2M6IDJ9fSk7ICAgICAgICAgLy8gPT4gZmFsc2VcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHt9KTsgICAgICAgICAgICAgICAgICAvLyA9PiBmYWxzZVxuICovXG52YXIgaGFzUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGhhc1BhdGgoX3BhdGgsIG9iaikge1xuICBpZiAoX3BhdGgubGVuZ3RoID09PSAwIHx8IGlzTmlsKG9iaikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IG9iajtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBfcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkgJiYgX2hhcyhfcGF0aFtpZHhdLCB2YWwpKSB7XG4gICAgICB2YWwgPSB2YWxbX3BhdGhbaWR4XV07XG4gICAgICBpZHggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaGFzUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lkZW50aXR5IGZyb20gXCIuL2ludGVybmFsL19pZGVudGl0eS5qc1wiO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJldHVybiB0aGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGl0LiBHb29kXG4gKiBhcyBhIGRlZmF1bHQgb3IgcGxhY2Vob2xkZXIgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHJldHVybi5cbiAqIEByZXR1cm4geyp9IFRoZSBpbnB1dCB2YWx1ZSwgYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaWRlbnRpdHkoMSk7IC8vPT4gMVxuICpcbiAqICAgICAgY29uc3Qgb2JqID0ge307XG4gKiAgICAgIFIuaWRlbnRpdHkob2JqKSA9PT0gb2JqOyAvLz0+IHRydWVcbiAqIEBzeW1iIFIuaWRlbnRpdHkoYSkgPSBhXG4gKi9cbnZhciBpZGVudGl0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKF9pZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL2ludGVybmFsL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgZXF1YWwsIGluIFtgUi5lcXVhbHNgXSgjZXF1YWxzKVxuICogdGVybXMsIHRvIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEFsc28gd29ya3Mgd2l0aCBzdHJpbmdzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBpdGVtIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGFuIGVxdWl2YWxlbnQgaXRlbSBpcyBpbiB0aGUgbGlzdCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmNsdWRlcygzLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pbmNsdWRlcyg0LCBbMSwgMiwgM10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaW5jbHVkZXMoeyBuYW1lOiAnRnJlZCcgfSwgW3sgbmFtZTogJ0ZyZWQnIH1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoWzQyXSwgW1s0Ml1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoJ2JhJywgJ2JhbmFuYScpOyAvLz0+dHJ1ZVxuICovXG52YXIgaW5jbHVkZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihfaW5jbHVkZXMpO1xuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL2ludGVybmFsL19pbmRleE9mLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMVxuICogaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgdG9cbiAqIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIGl0ZW0gdG8gZmluZC5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBhcnJheSB0byBzZWFyY2ggaW4uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LCBvciAtMSBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZC5cbiAqIEBzZWUgUi5sYXN0SW5kZXhPZiwgUi5maW5kSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluZGV4T2YoMywgWzEsMiwzLDRdKTsgLy89PiAyXG4gKiAgICAgIFIuaW5kZXhPZigxMCwgWzEsMiwzLDRdKTsgLy89PiAtMVxuICovXG52YXIgaW5kZXhPZiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGluZGV4T2YodGFyZ2V0LCB4cykge1xuICByZXR1cm4gdHlwZW9mIHhzLmluZGV4T2YgPT09ICdmdW5jdGlvbicgJiYgIV9pc0FycmF5KHhzKSA/IHhzLmluZGV4T2YodGFyZ2V0KSA6IF9pbmRleE9mKHhzLCB0YXJnZXQsIDApO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbmRleE9mOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBJbnNlcnRzIHRoZSBzdXBwbGllZCBlbGVtZW50IGludG8gdGhlIGxpc3QsIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC4gX05vdGUgdGhhdFxuXG4gKiB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IHdpdGggdGhlIGNoYW5nZXMuXG4gKiA8c21hbGw+Tm8gbGlzdHMgaGF2ZSBiZWVuIGhhcm1lZCBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbi48L3NtYWxsPlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMlxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Kn0gZWx0IFRoZSBlbGVtZW50IHRvIGluc2VydCBpbnRvIHRoZSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpbnNlcnQgaW50b1xuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGVsdGAgaW5zZXJ0ZWQgYXQgYGluZGV4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluc2VydCgyLCAneCcsIFsxLDIsMyw0XSk7IC8vPT4gWzEsMiwneCcsMyw0XVxuICovXG52YXIgaW5zZXJ0ID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gaW5zZXJ0KGlkeCwgZWx0LCBsaXN0KSB7XG4gIGlkeCA9IGlkeCA8IGxpc3QubGVuZ3RoICYmIGlkeCA+PSAwID8gaWR4IDogbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShpZHgsIDAsIGVsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGluc2VydDsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xudmFyIF9TZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU2V0KCkge1xuICAgIC8qIGdsb2JhbHMgU2V0ICovXG4gICAgdGhpcy5fbmF0aXZlU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgdGhpcy5faXRlbXMgPSB7fTtcbiAgfVxuICAvLyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBqc2RvYyBjaG9rZXMgb24gdGhpc1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBhZGQgdG8gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBkaWQgbm90IGV4aXN0IHByaW9yLCBvdGhlcndpc2UgZmFsc2VcbiAgLy9cbiAgX1NldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gIWhhc09yQWRkKGl0ZW0sIHRydWUsIHRoaXMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIFNldCwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGhhc09yQWRkKGl0ZW0sIGZhbHNlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBDb21iaW5lcyB0aGUgbG9naWMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IGFuZFxuICAvLyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC5cbiAgLy9cbiAgLy8gQHBhcmFtIGl0ZW0gICAgICAgVGhlIGl0ZW0gdG8gY2hlY2sgb3IgYWRkIHRvIHRoZSBTZXQgaW5zdGFuY2UuXG4gIC8vIEBwYXJhbSBzaG91bGRBZGQgIElmIHRydWUsIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNldCBpZiBpdCBkb2Vzbid0XG4gIC8vICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QuXG4gIC8vIEBwYXJhbSBzZXQgICAgICAgIFRoZSBzZXQgaW5zdGFuY2UgdG8gY2hlY2sgb3IgYWRkIHRvLlxuICAvLyBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGFscmVhZHkgZXhpc3RlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAvL1xuICByZXR1cm4gX1NldDtcbn0oKTtcbmZ1bmN0aW9uIGhhc09yQWRkKGl0ZW0sIHNob3VsZEFkZCwgc2V0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGl0ZW07XG4gIHZhciBwcmV2U2l6ZSwgbmV3U2l6ZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiArMCBhbmQgLTBcbiAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgaWYgKHNldC5faXRlbXNbJy0wJ10pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zWyctMCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB0aGVzZSB0eXBlcyBjYW4gYWxsIHV0aWxpc2UgdGhlIG5hdGl2ZSBTZXRcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbiBzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtpdGVtXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gc2V0Ll9pdGVtc1snYm9vbGVhbiddIGhvbGRzIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgICAgIC8vIHJlcHJlc2VudGluZyBbIGZhbHNlRXhpc3RzLCB0cnVlRXhpc3RzIF1cbiAgICAgIGlmICh0eXBlIGluIHNldC5faXRlbXMpIHtcbiAgICAgICAgdmFyIGJJZHggPSBpdGVtID8gMSA6IDA7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBpdGVtID8gW2ZhbHNlLCB0cnVlXSA6IFt0cnVlLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8vIGNvbXBhcmUgZnVuY3Rpb25zIGZvciByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBbaXRlbV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snbnVsbCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gcmVkdWNlIHRoZSBzZWFyY2ggc2l6ZSBvZiBoZXRlcm9nZW5lb3VzIHNldHMgYnkgY3JlYXRpbmcgYnVja2V0c1xuICAgICAgLy8gZm9yIGVhY2ggdHlwZS5cbiAgICAgIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSk7XG4gICAgICBpZiAoISh0eXBlIGluIHNldC5faXRlbXMpKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgcHJldmlvdXNseSBhcHBsaWVkIGl0ZW1zXG4gICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIEEgc2ltcGxlIFNldCB0eXBlIHRoYXQgaG9ub3VycyBSLmVxdWFscyBzZW1hbnRpY3NcbmV4cG9ydCBkZWZhdWx0IF9TZXQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FyaXR5KG4sIGZuKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlGcm9tSXRlcmF0b3IoaXRlcikge1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgbmV4dDtcbiAgd2hpbGUgKCEobmV4dCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgbGlzdC5wdXNoKG5leHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBsaXN0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVJlZHVjZShyZWR1Y2VyLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2MgPSByZWR1Y2VyKGFjYywgbGlzdFtpbmRleF0pO1xuICAgIGluZGV4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL19pc0ludGVnZXIuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc29jKHByb3AsIHZhbCwgb2JqKSB7XG4gIGlmIChfaXNJbnRlZ2VyKHByb3ApICYmIF9pc0FycmF5KG9iaikpIHtcbiAgICB2YXIgYXJyID0gW10uY29uY2F0KG9iaik7XG4gICAgYXJyW3Byb3BdID0gdmFsO1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXN1bHRbcHJvcF0gPSB2YWw7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5cbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHJhbWRhXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RuYW1lIHByb3BlcnR5IHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7T2JqZWN0fSBXaGF0ZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2QgaXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jaGVja0Zvck1ldGhvZChtZXRob2RuYW1lLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiBfaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmpbbWV0aG9kbmFtZV0gIT09ICdmdW5jdGlvbicgPyBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBsZW5ndGggLSAxKSk7XG4gIH07XG59IiwiaW1wb3J0IF9jbG9uZVJlZ0V4cCBmcm9tIFwiLi9fY2xvbmVSZWdFeHAuanNcIjtcbmltcG9ydCB0eXBlIGZyb20gXCIuLi90eXBlLmpzXCI7XG5cbi8qKlxuICogQ29waWVzIGFuIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY29waWVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgV2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBkZWVwIGNsb25pbmcuXG4gKiBAcmV0dXJuIHsqfSBUaGUgY29waWVkIHZhbHVlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmUodmFsdWUsIGRlZXAsIG1hcCkge1xuICBtYXAgfHwgKG1hcCA9IG5ldyBfT2JqZWN0TWFwKCkpO1xuXG4gIC8vIHRoaXMgYXZvaWRzIHRoZSBzbG93ZXIgc3dpdGNoIHdpdGggYSBxdWljayBpZiBkZWNpc2lvbiByZW1vdmluZyBzb21lIG1pbGxpc2Vjb25kcyBpbiBlYWNoIHJ1bi5cbiAgaWYgKF9pc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KGNvcGllZFZhbHVlKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIGFuZCBzYW1lIHJlZmVyZW5jZXMgb24gdGhlIG9iamVjdCBncmFwaCBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgIHZhciBjYWNoZWRDb3B5ID0gbWFwLmdldCh2YWx1ZSk7XG4gICAgaWYgKGNhY2hlZENvcHkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRDb3B5O1xuICAgIH1cbiAgICBtYXAuc2V0KHZhbHVlLCBjb3BpZWRWYWx1ZSk7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIGNvcGllZFZhbHVlW2tleV0gPSBkZWVwID8gX2Nsb25lKHZhbHVlW2tleV0sIHRydWUsIG1hcCkgOiB2YWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29waWVkVmFsdWU7XG4gIH07XG4gIHN3aXRjaCAodHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIGNvcHkoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpKSk7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGNvcHkoQXJyYXkodmFsdWUubGVuZ3RoKSk7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUudmFsdWVPZigpKTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIF9jbG9uZVJlZ0V4cCh2YWx1ZSk7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnSW50NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnVWludDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gX2lzUHJpbWl0aXZlKHBhcmFtKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHBhcmFtO1xuICByZXR1cm4gcGFyYW0gPT0gbnVsbCB8fCB0eXBlICE9ICdvYmplY3QnICYmIHR5cGUgIT0gJ2Z1bmN0aW9uJztcbn1cbnZhciBfT2JqZWN0TWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX09iamVjdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBoYXNoZWRLZXkgPSB0aGlzLmhhc2goa2V5KTtcbiAgICB2YXIgYnVja2V0ID0gdGhpcy5tYXBbaGFzaGVkS2V5XTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgdGhpcy5tYXBbaGFzaGVkS2V5XSA9IGJ1Y2tldCA9IFtdO1xuICAgIH1cbiAgICBidWNrZXQucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGhhc2hlZEtleSA9IFtdO1xuICAgIGZvciAodmFyIHZhbHVlIGluIGtleSkge1xuICAgICAgaGFzaGVkS2V5LnB1c2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleVt2YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZEtleS5qb2luKCk7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvKipcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIGNsb25lZCBpcyBmYXN0ZXIgdG8ganVzdCBpdGVyYXRlIG92ZXIgdGhlIGl0ZW1zIGluIHRoZSBtYXAganVzdCBiZWNhdXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNvIGNvc3RseSxcbiAgICAgKiBvbiBteSB0ZXN0cyB0aGlzIG51bWJlciBpcyAxODAsIGFueXRoaW5nIGFib3ZlIHRoYXQgdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gaXMgZmFzdGVyLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSAxODApIHtcbiAgICAgIGZvciAodmFyIHAgaW4gdGhpcy5tYXApIHtcbiAgICAgICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW3BdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgICAgIGlmIChlbGVtZW50WzBdID09PSBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgaWYgKGVsZW1lbnRbMF0gPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfT2JqZWN0TWFwO1xufSgpOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbG9uZVJlZ0V4cChwYXR0ZXJuKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4uc291cmNlLCBwYXR0ZXJuLmZsYWdzID8gcGF0dGVybi5mbGFncyA6IChwYXR0ZXJuLmdsb2JhbCA/ICdnJyA6ICcnKSArIChwYXR0ZXJuLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgKyAocGF0dGVybi5tdWx0aWxpbmUgPyAnbScgOiAnJykgKyAocGF0dGVybi5zdGlja3kgPyAneScgOiAnJykgKyAocGF0dGVybi51bmljb2RlID8gJ3UnIDogJycpICsgKHBhdHRlcm4uZG90QWxsID8gJ3MnIDogJycpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29tcGxlbWVudChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICFmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jb25jYXQoc2V0MSwgc2V0Mikge1xuICBzZXQxID0gc2V0MSB8fCBbXTtcbiAgc2V0MiA9IHNldDIgfHwgW107XG4gIHZhciBpZHg7XG4gIHZhciBsZW4xID0gc2V0MS5sZW5ndGg7XG4gIHZhciBsZW4yID0gc2V0Mi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjEpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQxW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjIpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQyW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xudmFyIHN5bUl0ZXJhdG9yID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wuaXRlcmF0b3IgOiAnQEBpdGVyYXRvcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlUmVkdWNlKGFycmF5UmVkdWNlLCBtZXRob2RSZWR1Y2UsIGl0ZXJhYmxlUmVkdWNlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICBpZiAoX2lzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmIChsaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdFsnZmFudGFzeS1sYW5kL3JlZHVjZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdmYW50YXN5LWxhbmQvcmVkdWNlJyk7XG4gICAgfVxuICAgIGlmIChsaXN0W3N5bUl0ZXJhdG9yXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBtZXRob2RSZWR1Y2UoeGYsIGFjYywgbGlzdCwgJ3JlZHVjZScpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpO1xuICB9O1xufSIsImltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCBvbmUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0d28tYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjIgOiBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjIgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSkgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG5cbi8qKlxuICogT3B0aW1pemVkIGludGVybmFsIHRocmVlLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzIDogX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMyA6IF9pc1BsYWNlaG9sZGVyKGEpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYikge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgX2IsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBmbihhLCBiLCBjKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9fYXJpdHkuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIEludGVybmFsIGN1cnJ5TiBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBvZiB0aGUgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHJlY2VpdmVkIEFuIGFycmF5IG9mIGFyZ3VtZW50cyByZWNlaXZlZCB0aHVzIGZhci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb21iaW5lZCA9IFtdO1xuICAgIHZhciBhcmdzSWR4ID0gMDtcbiAgICB2YXIgbGVmdCA9IGxlbmd0aDtcbiAgICB2YXIgY29tYmluZWRJZHggPSAwO1xuICAgIHZhciBoYXNQbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgIHdoaWxlIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCB8fCBhcmdzSWR4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGlmIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCAmJiAoIV9pc1BsYWNlaG9sZGVyKHJlY2VpdmVkW2NvbWJpbmVkSWR4XSkgfHwgYXJnc0lkeCA+PSBhcmd1bWVudHMubGVuZ3RoKSkge1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlZFtjb21iaW5lZElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbYXJnc0lkeF07XG4gICAgICAgIGFyZ3NJZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4XSA9IHJlc3VsdDtcbiAgICAgIGlmICghX2lzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb21iaW5lZElkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gIWhhc1BsYWNlaG9sZGVyICYmIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKSA6IF9hcml0eShNYXRoLm1heCgwLCBsZWZ0KSwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1RyYW5zZm9ybWVyIGZyb20gXCIuL19pc1RyYW5zZm9ybWVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB3aXRoIGRpZmZlcmVudCBzdHJhdGVnaWVzIGJhc2VkIG9uIHRoZVxuICogb2JqZWN0IGluIGxpc3QgcG9zaXRpb24gKGxhc3QgYXJndW1lbnQpLiBJZiBpdCBpcyBhbiBhcnJheSwgZXhlY3V0ZXMgW2ZuXS5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaGFzIGEgZnVuY3Rpb24gd2l0aCBvbmUgb2YgdGhlIGdpdmVuIG1ldGhvZCBuYW1lcywgaXQgd2lsbFxuICogZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIChmdW5jdG9yIGNhc2UpLiBPdGhlcndpc2UsIGlmIGl0IGlzIGEgdHJhbnNmb3JtZXIsXG4gKiB1c2VzIHRyYW5zZHVjZXIgY3JlYXRlZCBieSBbdHJhbnNkdWNlckNyZWF0b3JdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lclxuICogKHRyYW5zZHVjZXIgY2FzZSkuXG4gKiBPdGhlcndpc2UsIGl0IHdpbGwgZGVmYXVsdCB0byBleGVjdXRpbmcgW2ZuXS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gbWV0aG9kTmFtZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZHVjZXJDcmVhdG9yIHRyYW5zZHVjZXIgZmFjdG9yeSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGlzcGF0Y2hhYmxlKG1ldGhvZE5hbWVzLCB0cmFuc2R1Y2VyQ3JlYXRvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmICghX2lzQXJyYXkob2JqKSkge1xuICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICB3aGlsZSAoaWR4IDwgbWV0aG9kTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW21ldGhvZE5hbWVzW2lkeF1dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9ialttZXRob2ROYW1lc1tpZHhdXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXNUcmFuc2Zvcm1lcihvYmopKSB7XG4gICAgICAgIHZhciB0cmFuc2R1Y2VyID0gdHJhbnNkdWNlckNyZWF0b3IuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSkpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCByZW1vdmUgZnJvbSBcIi4uL3JlbW92ZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNzb2NpYXRlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGJ1dCB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3NvYyhwcm9wLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHJlbW92ZShwcm9wLCAxLCBvYmopO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcF0gPSBvYmpbcF07XG4gIH1cbiAgZGVsZXRlIHJlc3VsdFtwcm9wXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2FycmF5RnJvbUl0ZXJhdG9yIGZyb20gXCIuL19hcnJheUZyb21JdGVyYXRvci5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9mdW5jdGlvbk5hbWUgZnJvbSBcIi4vX2Z1bmN0aW9uTmFtZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9fb2JqZWN0SXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuXG4vKipcbiAqIHByaXZhdGUgX3VuaXFDb250ZW50RXF1YWxzIGZ1bmN0aW9uLlxuICogVGhhdCBmdW5jdGlvbiBpcyBjaGVja2luZyBlcXVhbGl0eSBvZiAyIGl0ZXJhdG9yIGNvbnRlbnRzIHdpdGggMiBhc3N1bXB0aW9uc1xuICogLSBpdGVyYXRvcnMgbGVuZ3RocyBhcmUgdGhlIHNhbWVcbiAqIC0gaXRlcmF0b3JzIHZhbHVlcyBhcmUgdW5pcXVlXG4gKlxuICogZmFsc2UtcG9zaXRpdmUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgZm9yIGNvbXBhcmlzb24gb2YsIGUuZy5cbiAqIC0gWzEsMiwzXSBhbmQgWzEsMiwzLDRdXG4gKiAtIFsxLDEsMV0gYW5kIFsxLDIsM11cbiAqICovXG5cbmZ1bmN0aW9uIF91bmlxQ29udGVudEVxdWFscyhhSXRlcmF0b3IsIGJJdGVyYXRvciwgc3RhY2tBLCBzdGFja0IpIHtcbiAgdmFyIGEgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYUl0ZXJhdG9yKTtcbiAgdmFyIGIgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYkl0ZXJhdG9yKTtcbiAgZnVuY3Rpb24gZXEoX2EsIF9iKSB7XG4gICAgcmV0dXJuIF9lcXVhbHMoX2EsIF9iLCBzdGFja0Euc2xpY2UoKSwgc3RhY2tCLnNsaWNlKCkpO1xuICB9XG5cbiAgLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuICByZXR1cm4gIV9pbmNsdWRlc1dpdGgoZnVuY3Rpb24gKGIsIGFJdGVtKSB7XG4gICAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGVxLCBhSXRlbSwgYik7XG4gIH0sIGIsIGEpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2VxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuICBpZiAoX29iamVjdElzKGEsIGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHR5cGVBID0gdHlwZShhKTtcbiAgaWYgKHR5cGVBICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYikgJiYgdHlwZW9mIGJbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGEuZXF1YWxzKGIpICYmIHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBiLmVxdWFscyhhKTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVBKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBfZnVuY3Rpb25OYW1lKGEuY29uc3RydWN0b3IpID09PSAnUHJvbWlzZScpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdOdW1iZXInOlxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICBpZiAoISh0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgX29iamVjdElzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgaWYgKCFfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICByZXR1cm4gYS5uYW1lID09PSBiLm5hbWUgJiYgYS5tZXNzYWdlID09PSBiLm1lc3NhZ2U7XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIGlmICghKGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYgYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJiBhLnVuaWNvZGUgPT09IGIudW5pY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF91bmlxQ29udGVudEVxdWFscyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdTZXQnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdW5pcUNvbnRlbnRFcXVhbHMoYS52YWx1ZXMoKSwgYi52YWx1ZXMoKSwgc3RhY2tBLmNvbmNhdChbYV0pLCBzdGFja0IuY29uY2F0KFtiXSkpO1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBWYWx1ZXMgb2Ygb3RoZXIgdHlwZXMgYXJlIG9ubHkgZXF1YWwgaWYgaWRlbnRpY2FsLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBleHRlbmRlZFN0YWNrQSA9IHN0YWNrQS5jb25jYXQoW2FdKTtcbiAgdmFyIGV4dGVuZGVkU3RhY2tCID0gc3RhY2tCLmNvbmNhdChbYl0pO1xuICBpZHggPSBrZXlzQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcbiAgICBpZiAoIShfaGFzKGtleSwgYikgJiYgX2VxdWFscyhiW2tleV0sIGFba2V5XSwgZXh0ZW5kZWRTdGFja0EsIGV4dGVuZGVkU3RhY2tCKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59IiwiaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL19pbmRleE9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXMoYSwgbGlzdCkge1xuICByZXR1cm4gX2luZGV4T2YobGlzdCwgYSwgMCkgPj0gMDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXNXaXRoKHByZWQsIHgsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChwcmVkKHgsIGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGVxdWFscyBmcm9tIFwiLi4vZXF1YWxzLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5kZXhPZihsaXN0LCBhLCBpZHgpIHtcbiAgdmFyIGluZiwgaXRlbTtcbiAgLy8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgZG9lc24ndCBleGlzdCBiZWxvdyBJRTlcbiAgaWYgKHR5cGVvZiBsaXN0LmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBhKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgIC8vIG1hbnVhbGx5IGNyYXdsIHRoZSBsaXN0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICAgICAgaW5mID0gMSAvIGE7XG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IDAgJiYgMSAvIGl0ZW0gPT09IGluZikge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhICE9PSBhKSB7XG4gICAgICAgICAgLy8gTmFOXG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyAmJiBpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vbi16ZXJvIG51bWJlcnMgY2FuIHV0aWxpc2UgU2V0XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcblxuICAgICAgLy8gYWxsIHRoZXNlIHR5cGVzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBudWxsIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbnl0aGluZyBlbHNlIG5vdCBjb3ZlcmVkIGFib3ZlLCBkZWZlciB0byBSLmVxdWFsc1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZXF1YWxzKGxpc3RbaWR4XSwgYSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIF9pc0FyZ3VtZW50cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID8gZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG4gIH0gOiBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkge1xuICAgIHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTtcbiAgfTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IF9pc0FyZ3VtZW50czsiLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBfaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGggPj0gMCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBzaW1pbGFyIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBoYXMgYSBudW1lcmljIGxlbmd0aCBwcm9wZXJ0eSBhbmQgZXh0cmVtZSBpbmRpY2VzIGRlZmluZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2UodHJ1ZSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHt9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2UoezA6ICd6ZXJvJywgOTogJ25pbmUnLCBsZW5ndGg6IDEwfSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2Uoe25vZGVUeXBlOiAxLCBsZW5ndGg6IDF9KSAvLyA9PiBmYWxzZVxuICovXG52YXIgX2lzQXJyYXlMaWtlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNBcnJheUxpa2UoeCkge1xuICBpZiAoX2lzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG5leHBvcnQgZGVmYXVsdCBfaXNBcnJheUxpa2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzRnVuY3Rpb24oeCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbl0nO1xufSIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBuXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBfaXNJbnRlZ2VyKG4pIHtcbiAgcmV0dXJuIG4gPDwgMCA9PT0gbjtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzT2JqZWN0KHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzUGxhY2Vob2xkZXIoYSkge1xuICByZXR1cm4gYSAhPSBudWxsICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUcmFuc2Zvcm1lcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmpbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPT09ICdmdW5jdGlvbic7XG59IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGEgdHlwZWQgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IEZsb2F0MzJBcnJheShbXSkpOyAvLz0+IHRydWVcbiAqICAgICAgX2lzVHlwZWRBcnJheShbXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNUeXBlZEFycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUeXBlZEFycmF5KHZhbCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQmlnSW50NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSc7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcblxuLyoqXG4gKiBgX21ha2VGbGF0YCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBvbmUtbGV2ZWwgb3IgZnVsbHkgcmVjdXJzaXZlXG4gKiBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgZmxhZyBwYXNzZWQgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21ha2VGbGF0KHJlY3Vyc2l2ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZmxhdHQobGlzdCkge1xuICAgIHZhciB2YWx1ZSwgamxlbiwgajtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGlsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgICB3aGlsZSAoaWR4IDwgaWxlbikge1xuICAgICAgaWYgKF9pc0FycmF5TGlrZShsaXN0W2lkeF0pKSB7XG4gICAgICAgIHZhbHVlID0gcmVjdXJzaXZlID8gZmxhdHQobGlzdFtpZHhdKSA6IGxpc3RbaWR4XTtcbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGpsZW4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChqIDwgamxlbikge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlW2pdO1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21hcChmbiwgZnVuY3Rvcikge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGZ1bmN0b3IubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuKTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJlc3VsdFtpZHhdID0gZm4oZnVuY3RvcltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vX2lzU3RyaW5nLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbnRoKG9mZnNldCwgbGlzdCkge1xuICB2YXIgaWR4ID0gb2Zmc2V0IDwgMCA/IGxpc3QubGVuZ3RoICsgb2Zmc2V0IDogb2Zmc2V0O1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5jaGFyQXQoaWR4KSA6IGxpc3RbaWR4XTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmZ1bmN0aW9uIF9vYmplY3RBc3NpZ24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICB9XG4gIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpZHhdO1xuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKF9oYXMobmV4dEtleSwgc291cmNlKSkge1xuICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicgPyBPYmplY3QuYXNzaWduIDogX29iamVjdEFzc2lnbjsiLCIvLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbmZ1bmN0aW9uIF9vYmplY3RJcyhhLCBiKSB7XG4gIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBfb2JqZWN0SXM7IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vX250aC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3BhdGgocGF0aEFyLCBvYmopIHtcbiAgdmFyIHZhbCA9IG9iajtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBwID0gcGF0aEFyW2ldO1xuICAgIGlmIChfaXNJbnRlZ2VyKHApKSB7XG4gICAgICB2YWwgPSBfbnRoKHAsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IHZhbFtwXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcXVvdGUocykge1xuICB2YXIgZXNjYXBlZCA9IHMucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKSAvLyBcXGIgbWF0Y2hlcyB3b3JkIGJvdW5kYXJ5OyBbXFxiXSBtYXRjaGVzIGJhY2tzcGFjZVxuICAucmVwbGFjZSgvXFxmL2csICdcXFxcZicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKS5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJykucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpLnJlcGxhY2UoL1xcdi9nLCAnXFxcXHYnKS5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJyk7XG4gIHJldHVybiAnXCInICsgZXNjYXBlZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCInO1xufSIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5mdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UocmVkdWNlciwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIHN0ZXAudmFsdWUpO1xuICAgIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgfVxuICByZXR1cm4gYWNjO1xufVxuZnVuY3Rpb24gX21ldGhvZFJlZHVjZShyZWR1Y2VyLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gb2JqW21ldGhvZE5hbWVdKHJlZHVjZXIsIGFjYyk7XG59XG52YXIgX3JlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF9hcnJheVJlZHVjZSwgX21ldGhvZFJlZHVjZSwgX2l0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF9yZWR1Y2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3JlZHVjZWQoeCkge1xuICByZXR1cm4geCAmJiB4WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddID8geCA6IHtcbiAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnOiB0cnVlXG4gIH07XG59IiwiLyoqXG4gKiBQb2x5ZmlsbCBmcm9tIDxodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL3RvSVNPU3RyaW5nPi5cbiAqL1xudmFyIHBhZCA9IGZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiAobiA8IDEwID8gJzAnIDogJycpICsgbjtcbn07XG52YXIgX3RvSVNPU3RyaW5nID0gdHlwZW9mIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbn0gOiBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpICsgJy0nICsgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgcGFkKGQuZ2V0VVRDRGF0ZSgpKSArICdUJyArIHBhZChkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgcGFkKGQuZ2V0VVRDTWludXRlcygpKSArICc6JyArIHBhZChkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAoZC5nZXRVVENNaWxsaXNlY29uZHMoKSAvIDEwMDApLnRvRml4ZWQoMykuc2xpY2UoMiwgNSkgKyAnWic7XG59O1xuZXhwb3J0IGRlZmF1bHQgX3RvSVNPU3RyaW5nOyIsImltcG9ydCBfaW5jbHVkZXMgZnJvbSBcIi4vX2luY2x1ZGVzLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9fbWFwLmpzXCI7XG5pbXBvcnQgX3F1b3RlIGZyb20gXCIuL19xdW90ZS5qc1wiO1xuaW1wb3J0IF90b0lTT1N0cmluZyBmcm9tIFwiLi9fdG9JU09TdHJpbmcuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuLi9yZWplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1N0cmluZyh4LCBzZWVuKSB7XG4gIHZhciByZWN1ciA9IGZ1bmN0aW9uIHJlY3VyKHkpIHtcbiAgICB2YXIgeHMgPSBzZWVuLmNvbmNhdChbeF0pO1xuICAgIHJldHVybiBfaW5jbHVkZXMoeSwgeHMpID8gJzxDaXJjdWxhcj4nIDogX3RvU3RyaW5nKHksIHhzKTtcbiAgfTtcblxuICAvLyAgbWFwUGFpcnMgOjogKE9iamVjdCwgW1N0cmluZ10pIC0+IFtTdHJpbmddXG4gIHZhciBtYXBQYWlycyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgICByZXR1cm4gX21hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIF9xdW90ZShrKSArICc6ICcgKyByZWN1cihvYmpba10pO1xuICAgIH0sIGtleXMuc2xpY2UoKS5zb3J0KCkpO1xuICB9O1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSkge1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6XG4gICAgICByZXR1cm4gJyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgnICsgX21hcChyZWN1ciwgeCkuam9pbignLCAnKSArICcpKSc7XG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOlxuICAgICAgcmV0dXJuICdbJyArIF9tYXAocmVjdXIsIHgpLmNvbmNhdChtYXBQYWlycyh4LCByZWplY3QoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoayk7XG4gICAgICB9LCBrZXlzKHgpKSkpLmpvaW4oJywgJykgKyAnXSc7XG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBCb29sZWFuKCcgKyByZWN1cih4LnZhbHVlT2YoKSkgKyAnKScgOiB4LnRvU3RyaW5nKCk7XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICByZXR1cm4gJ25ldyBEYXRlKCcgKyAoaXNOYU4oeC52YWx1ZU9mKCkpID8gcmVjdXIoTmFOKSA6IF9xdW90ZShfdG9JU09TdHJpbmcoeCkpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE1hcF0nOlxuICAgICAgcmV0dXJuICduZXcgTWFwKCcgKyByZWN1cihBcnJheS5mcm9tKHgpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE51bGxdJzpcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IE51bWJlcignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogMSAvIHggPT09IC1JbmZpbml0eSA/ICctMCcgOiB4LnRvU3RyaW5nKDEwKTtcbiAgICBjYXNlICdbb2JqZWN0IFNldF0nOlxuICAgICAgcmV0dXJuICduZXcgU2V0KCcgKyByZWN1cihBcnJheS5mcm9tKHgpLnNvcnQoKSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IFN0cmluZygnICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogX3F1b3RlKHgpO1xuICAgIGNhc2UgJ1tvYmplY3QgVW5kZWZpbmVkXSc6XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgeC50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgcmVwciA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJlcHIgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBtYXBQYWlycyh4LCBrZXlzKHgpKS5qb2luKCcsICcpICsgJ30nO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hBcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBhY2MgPSB4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn0iLCJpbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hBcnJheVJlZHVjZSBmcm9tIFwiLi9feEFycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgYmluZCBmcm9tIFwiLi4vYmluZC5qc1wiO1xuZnVuY3Rpb24gX3hJdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn1cbmZ1bmN0aW9uIF94TWV0aG9kUmVkdWNlKHhmLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmpbbWV0aG9kTmFtZV0oYmluZCh4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSwgeGYpLCBhY2MpKTtcbn1cbnZhciBfeFJlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF94QXJyYXlSZWR1Y2UsIF94TWV0aG9kUmVkdWNlLCBfeEl0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF94UmVkdWNlOyIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbGwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQWxsKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbGwgPSB0cnVlO1xuICB9XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLmFsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYWxsID0gZmFsc2U7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbGw7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFsbChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbGwoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQW55KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbnkgPSBmYWxzZTtcbiAgfVxuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuYW55KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5hbnkgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbnk7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFueShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbnkoZiwgeGYpO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvaW5pdCddKCk7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfVxufTsiLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbHRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaWx0ZXIoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMuZihpbnB1dCkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbHRlcjtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmlsdGVyKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbHRlcihmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHZvaWQgMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaW5kO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hmaW5kKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmQoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaW5kSW5kZXggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZEluZGV4KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5pZHggPSAtMTtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cbiAgWEZpbmRJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmlkeCArPSAxO1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlkeCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbmRJbmRleDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZEluZGV4KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmRJbmRleChmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG4gIHJldHVybiBYTWFwO1xufSgpO1xudmFyIF94bWFwID0gZnVuY3Rpb24gX3htYXAoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTtcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBfeG1hcDsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhSZWR1Y2VCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgdGhpcy52YWx1ZUZuID0gdmFsdWVGbjtcbiAgICB0aGlzLnZhbHVlQWNjID0gdmFsdWVBY2M7XG4gICAgdGhpcy5rZXlGbiA9IGtleUZuO1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmlucHV0cyA9IHt9O1xuICB9XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICB2YXIga2V5O1xuICAgIGZvciAoa2V5IGluIHRoaXMuaW5wdXRzKSB7XG4gICAgICBpZiAoX2hhcyhrZXksIHRoaXMuaW5wdXRzKSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pbnB1dHNba2V5XSk7XG4gICAgICAgIGlmIChyZXN1bHRbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHRbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleUZuKGlucHV0KTtcbiAgICB0aGlzLmlucHV0c1trZXldID0gdGhpcy5pbnB1dHNba2V5XSB8fCBba2V5LCBfY2xvbmUodGhpcy52YWx1ZUFjYywgZmFsc2UpXTtcbiAgICB0aGlzLmlucHV0c1trZXldWzFdID0gdGhpcy52YWx1ZUZuKHRoaXMuaW5wdXRzW2tleV1bMV0sIGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFJlZHVjZUJ5O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hyZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhUYWtlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRha2UobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmkgPSAwO1xuICB9XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmkgKz0gMTtcbiAgICB2YXIgcmV0ID0gdGhpcy5uID09PSAwID8gcmVzdWx0IDogdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5uID49IDAgJiYgdGhpcy5pID49IHRoaXMubiA/IF9yZWR1Y2VkKHJldCkgOiByZXQ7XG4gIH07XG4gIHJldHVybiBYVGFrZTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dGFrZShuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhUYWtlKG4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9fU2V0LmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWFVuaXFCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhVbmlxQnkoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLnNldCA9IG5ldyBfU2V0KCk7XG4gIH1cbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnNldC5hZGQodGhpcy5mKGlucHV0KSkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFVuaXFCeTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dW5pcUJ5KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFVuaXFCeShmLCB4Zik7XG4gIH07XG59IiwidmFyIFhXcmFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCcpO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChhY2MpIHtcbiAgICByZXR1cm4gYWNjO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAoYWNjLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMuZihhY2MsIHgpO1xuICB9O1xuICByZXR1cm4gWFdyYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHdyYXAoZm4pIHtcbiAgcmV0dXJuIG5ldyBYV3JhcChmbik7XG59IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuaW1wb3J0IHVuaXEgZnJvbSBcIi4vdW5pcS5qc1wiO1xuXG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRob3NlXG4gKiBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgZWxlbWVudHMgZm91bmQgaW4gYm90aCBgbGlzdDFgIGFuZCBgbGlzdDJgLlxuICogQHNlZSBSLmlubmVySm9pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW50ZXJzZWN0aW9uKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFs0LCAzXVxuICovXG52YXIgaW50ZXJzZWN0aW9uID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGxpc3QxLCBsaXN0Mikge1xuICB2YXIgdG9LZWVwID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0MS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHRvS2VlcC5hZGQobGlzdDFbaV0pO1xuICB9XG4gIHJldHVybiB1bmlxKF9maWx0ZXIodG9LZWVwLmhhcy5iaW5kKHRvS2VlcCksIGxpc3QyKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGludGVyc2VjdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcIi4vaW50ZXJuYWwvX2lzRnVuY3Rpb24uanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBHaXZlbiBhbiBgYXJpdHlgIChOdW1iZXIpIGFuZCBhIGBuYW1lYCAoU3RyaW5nKSB0aGUgYGludm9rZXJgIGZ1bmN0aW9uXG4gKiByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiB0aGF0IHRha2VzIGBhcml0eWAgYXJndW1lbnRzIGFuZCBhIGBjb250ZXh0YFxuICogb2JqZWN0LiBJdCB3aWxsIFwiaW52b2tlXCIgdGhlIGBuYW1lYCdkIGZ1bmN0aW9uIChhIG1ldGhvZCkgb24gdGhlIGBjb250ZXh0YFxuICogb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gKGEgLT4gYiAtPiAuLi4gLT4gbiAtPiBPYmplY3QgLT4gKilcbiAqIEBwYXJhbSB7TnVtYmVyfSBhcml0eSBOdW1iZXIgb2YgYXJndW1lbnRzIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBzaG91bGQgdGFrZVxuICogICAgICAgIGJlZm9yZSB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgTmFtZSBvZiBhbnkgb2YgdGhlIHRhcmdldCBvYmplY3QncyBtZXRob2RzIHRvIGNhbGwuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jb25zdHJ1Y3RcbiAqIEBleGFtcGxlXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHNcbiAqICAgICAgY29uc3QgYXNKc29uID0gaW52b2tlcigwLCBcImpzb25cIilcbiAqICAgICAgLy8gSnVzdCBsaWtlIGNhbGxpbmcgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gKiAgICAgIGZldGNoKFwiaHR0cDovL2V4YW1wbGUuY29tL2luZGV4Lmpzb25cIikudGhlbihhc0pzb24pXG4gKlxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggb25lIGFyZ3VtZW50XG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbSA9IGludm9rZXIoMSwgJ3NsaWNlJyk7XG4gKiAgICAgIHNsaWNlRnJvbSg2LCAnYWJjZGVmZ2hpamtsbScpOyAvLz0+ICdnaGlqa2xtJ1xuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHNcbiAqICAgICAgY29uc3Qgc2xpY2VGcm9tNiA9IGludm9rZXIoMiwgJ3NsaWNlJykoNik7XG4gKiAgICAgIHNsaWNlRnJvbTYoOCwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2gnXG4gKlxuICogICAgICAvLyBOT1RFOiBZb3UgY2FuJ3Qgc2ltcGx5IHBhc3Mgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbml0aWFsIGludm9rZXIgZnVuY3Rpb24uXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIiwgMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gRnVuY3Rpb248Li4uPlxuICpcbiAqICAgICAgLy8gU2luY2UgaW52b2tlciByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiwgeW91IG1heSBwYXJ0aWFsbHkgYXBwbHkgaXQgdG8gY3JlYXRlIHRoZSBmdW5jdGlvbiB5b3UgbmVlZC5cbiAqICAgICAgY29uc3QgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbiA9IGludm9rZXIoMiwgXCJzbGljZVwiKSgwLCA0KVxuICogICAgICBmaXJzdENyZWRpdENhcmRTZWN0aW9uKFwiNDI0MiA0MjQyIDQyNDIgNDI0MlwiKSAvLyA9PiBcIjQyNDJcIlxuICpcbiAqIEBzeW1iIFIuaW52b2tlcigwLCAnbWV0aG9kJykobykgPSBvWydtZXRob2QnXSgpXG4gKiBAc3ltYiBSLmludm9rZXIoMSwgJ21ldGhvZCcpKGEsIG8pID0gb1snbWV0aG9kJ10oYSlcbiAqIEBzeW1iIFIuaW52b2tlcigyLCAnbWV0aG9kJykoYSwgYiwgbykgPSBvWydtZXRob2QnXShhLCBiKVxuICovXG52YXIgaW52b2tlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGludm9rZXIoYXJpdHksIG1ldGhvZCkge1xuICByZXR1cm4gY3VycnlOKGFyaXR5ICsgMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbYXJpdHldO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbih0YXJnZXRbbWV0aG9kXSkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kXS5hcHBseSh0YXJnZXQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgYXJpdHkpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyh0YXJnZXQpICsgJyBkb2VzIG5vdCBoYXZlIGEgbWV0aG9kIG5hbWVkIFwiJyArIG1ldGhvZCArICdcIicpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaW52b2tlcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogU2VlIGlmIGFuIG9iamVjdCAoaS5lLiBgdmFsYCkgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cHBsaWVkIGNvbnN0cnVjdG9yLiBUaGlzXG4gKiBmdW5jdGlvbiB3aWxsIGNoZWNrIHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiwgaWYgYW55LlxuICogSWYgYHZhbGAgd2FzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgLCBgUi5pcyhPYmplY3QsIHZhbCkgPT09IHRydWVgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKCogLT4geyp9KSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdG9yIEEgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXMoT2JqZWN0LCB7fSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE51bWJlciwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgMSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pcyhTdHJpbmcsICdzJyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKFN0cmluZywgbmV3IFN0cmluZygnJykpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCAncycpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoTnVtYmVyLCB7fSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaXMoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBDdG9yIHx8IHZhbCAhPSBudWxsICYmICh2YWwuY29uc3RydWN0b3IgPT09IEN0b3IgfHwgQ3Rvci5uYW1lID09PSAnT2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBlbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgaXRzIHR5cGUncyBlbXB0eSB2YWx1ZTsgYGZhbHNlYFxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVtcHR5LCBSLmlzTm90RW1wdHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzRW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFtdKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KCcnKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KG51bGwpOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eSh7fSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSh7bGVuZ3RoOiAwfSk7ICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoVWludDhBcnJheS5mcm9tKCcnKSk7IC8vPT4gdHJ1ZVxuICovXG52YXIgaXNFbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzRW1wdHkoeCkge1xuICByZXR1cm4geCAhPSBudWxsICYmIGVxdWFscyh4LCBlbXB0eSh4KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzRW1wdHk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc05pbChudWxsKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwodW5kZWZpbmVkKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwoMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc05pbChbXSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzTmlsID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNOaWwoeCkge1xuICByZXR1cm4geCA9PSBudWxsO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpc05pbDsiLCJpbXBvcnQgaW52b2tlciBmcm9tIFwiLi9pbnZva2VyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyBtYWRlIGJ5IGluc2VydGluZyB0aGUgYHNlcGFyYXRvcmAgYmV0d2VlbiBlYWNoIGVsZW1lbnQgYW5kXG4gKiBjb25jYXRlbmF0aW5nIGFsbCB0aGUgZWxlbWVudHMgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBTdHJpbmcgLT4gW2FdIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBzZXBhcmF0b3IgVGhlIHN0cmluZyB1c2VkIHRvIHNlcGFyYXRlIHRoZSBlbGVtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBlbGVtZW50cyB0byBqb2luIGludG8gYSBzdHJpbmcuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIG1hZGUgYnkgY29uY2F0ZW5hdGluZyBgeHNgIHdpdGggYHNlcGFyYXRvcmAuXG4gKiBAc2VlIFIuc3BsaXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzcGFjZXIgPSBSLmpvaW4oJyAnKTtcbiAqICAgICAgc3BhY2VyKFsnYScsIDIsIDMuNF0pOyAgIC8vPT4gJ2EgMiAzLjQnXG4gKiAgICAgIFIuam9pbignfCcsIFsxLCAyLCAzXSk7ICAgIC8vPT4gJzF8MnwzJ1xuICovXG52YXIgam9pbiA9IC8qI19fUFVSRV9fKi9pbnZva2VyKDEsICdqb2luJyk7XG5leHBvcnQgZGVmYXVsdCBqb2luOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjb252ZXJnZSBmcm9tIFwiLi9jb252ZXJnZS5qc1wiO1xuXG4vKipcbiAqIGp1eHQgYXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFsoYSwgYiwgLi4uLCBtKSAtPiBuXSAtPiAoKGEsIGIsIC4uLiwgbSkgLT4gW25dKVxuICogQHBhcmFtIHtBcnJheX0gZm5zIEFuIGFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgYWZ0ZXIgYXBwbHlpbmcgZWFjaCBvZiB0aGUgb3JpZ2luYWwgYGZuc2AgdG8gaXRzIHBhcmFtZXRlcnMuXG4gKiBAc2VlIFIuYXBwbHlTcGVjXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ2V0UmFuZ2UgPSBSLmp1eHQoW01hdGgubWluLCBNYXRoLm1heF0pO1xuICogICAgICBnZXRSYW5nZSgzLCA0LCA5LCAtMyk7IC8vPT4gWy0zLCA5XVxuICogQHN5bWIgUi5qdXh0KFtmLCBnLCBoXSkoYSwgYikgPSBbZihhLCBiKSwgZyhhLCBiKSwgaChhLCBiKV1cbiAqL1xudmFyIGp1eHQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBqdXh0KGZucykge1xuICByZXR1cm4gY29udmVyZ2UoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICB9LCBmbnMpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBqdXh0OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5cbi8vIGNvdmVyIElFIDwgOSBrZXlzIGlzc3Vlc1xudmFyIGhhc0VudW1CdWcgPSAhIC8qI19fUFVSRV9fKi97XG4gIHRvU3RyaW5nOiBudWxsXG59LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xudmFyIG5vbkVudW1lcmFibGVQcm9wcyA9IFsnY29uc3RydWN0b3InLCAndmFsdWVPZicsICdpc1Byb3RvdHlwZU9mJywgJ3RvU3RyaW5nJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2hhc093blByb3BlcnR5JywgJ3RvTG9jYWxlU3RyaW5nJ107XG4vLyBTYWZhcmkgYnVnXG52YXIgaGFzQXJnc0VudW1CdWcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG59KCk7XG52YXIgY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhsaXN0LCBpdGVtKSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAobGlzdFtpZHhdID09PSBpdGVtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2ZcbiAqIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBba11cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5rZXlzSW4sIFIudmFsdWVzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmtleXMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqL1xudmFyIGtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID8gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdChvYmopICE9PSBvYmogPyBbXSA6IE9iamVjdC5rZXlzKG9iaik7XG59KSA6IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBwcm9wLCBuSWR4O1xuICB2YXIga3MgPSBbXTtcbiAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAoIWNoZWNrQXJnc0xlbmd0aCB8fCBwcm9wICE9PSAnbGVuZ3RoJykpIHtcbiAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzRW51bUJ1Zykge1xuICAgIG5JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobklkeCA+PSAwKSB7XG4gICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAhY29udGFpbnMoa3MsIHByb3ApKSB7XG4gICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgfVxuICAgICAgbklkeCAtPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga3M7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGtleXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zKFIucHJvcCgneCcpLCBSLmFzc29jKCd4JykpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgICAgICAgICAgIC8vPT4gMVxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5vdmVyKHhMZW5zLCBSLm5lZ2F0ZSwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IC0xLCB5OiAyfVxuICovXG52YXIgbGVucyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b0Z1bmN0b3JGbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gbWFwKGZ1bmN0aW9uIChmb2N1cykge1xuICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgfSwgdG9GdW5jdG9yRm4oZ2V0dGVyKHRhcmdldCkpKTtcbiAgICB9O1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBsZW5zOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5pbXBvcnQgbGVucyBmcm9tIFwiLi9sZW5zLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgW0lkeF0gLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeEhlYWRZTGVucyA9IFIubGVuc1BhdGgoWyd4JywgMCwgJ3knXSk7XG4gKlxuICogICAgICBSLnZpZXcoeEhlYWRZTGVucywge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiAyXG4gKiAgICAgIFIuc2V0KHhIZWFkWUxlbnMsIDEsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogMSwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKiAgICAgIFIub3Zlcih4SGVhZFlMZW5zLCBSLm5lZ2F0ZSwge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiB7eDogW3t5OiAtMiwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKi9cblxudmFyIGxlbnNQYXRoID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gbGVuc1BhdGgocCkge1xuICByZXR1cm4gbGVucyhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIF9wYXRoKHAsIHZhbCk7XG4gIH0sIGFzc29jUGF0aChwKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGxlbnNQYXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQ7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZ3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmx0KDIsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5sdCgyLCAzKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ2EnLCAneicpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdCgneicsICdhJyk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGx0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbHQoYSwgYikge1xuICByZXR1cm4gYSA8IGI7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGx0OyIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgX3htYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3htYXAuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmRcbiAqIGEgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvciksXG4gKiBhcHBsaWVzIHRoZSBmdW5jdGlvbiB0byBlYWNoIG9mIHRoZSBmdW5jdG9yJ3MgdmFsdWVzLCBhbmQgcmV0dXJuc1xuICogYSBmdW5jdG9yIG9mIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFJhbWRhIHByb3ZpZGVzIHN1aXRhYmxlIGBtYXBgIGltcGxlbWVudGF0aW9ucyBmb3IgYEFycmF5YCBhbmQgYE9iamVjdGAsXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBhcHBsaWVkIHRvIGBbMSwgMiwgM11gIG9yIGB7eDogMSwgeTogMiwgejogM31gLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBtYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBBbHNvIHRyZWF0cyBmdW5jdGlvbnMgYXMgZnVuY3RvcnMgYW5kIHdpbGwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgaW5wdXQgYGxpc3RgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpdGVyYXRlZCBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXgsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRvdWJsZSA9IHggPT4geCAqIDI7XG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIFsxLCAyLCAzXSk7IC8vPT4gWzIsIDQsIDZdXG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIHt4OiAxLCB5OiAyLCB6OiAzfSk7IC8vPT4ge3g6IDIsIHk6IDQsIHo6IDZ9XG4gKiBAc3ltYiBSLm1hcChmLCBbYSwgYl0pID0gW2YoYSksIGYoYildXG4gKiBAc3ltYiBSLm1hcChmLCB7IHg6IGEsIHk6IGIgfSkgPSB7IHg6IGYoYSksIHk6IGYoYikgfVxuICogQHN5bWIgUi5tYXAoZiwgZnVuY3Rvcl9vKSA9IGZ1bmN0b3Jfby5tYXAoZilcbiAqL1xudmFyIG1hcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9tYXAnLCAnbWFwJ10sIF94bWFwLCBmdW5jdGlvbiBtYXAoZm4sIGZ1bmN0b3IpIHtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZnVuY3RvcikpIHtcbiAgICBjYXNlICdbb2JqZWN0IEZ1bmN0aW9uXSc6XG4gICAgICByZXR1cm4gY3VycnlOKGZ1bmN0b3IubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGZ1bmN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9KTtcbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOlxuICAgICAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IG1hcDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEFuIE9iamVjdC1zcGVjaWZpYyB2ZXJzaW9uIG9mIFtgbWFwYF0oI21hcCkuIFRoZSBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRocmVlXG4gKiBhcmd1bWVudHM6ICoodmFsdWUsIGtleSwgb2JqKSouIElmIG9ubHkgdGhlIHZhbHVlIGlzIHNpZ25pZmljYW50LCB1c2VcbiAqIFtgbWFwYF0oI21hcCkgaW5zdGVhZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCgqLCBTdHJpbmcsIE9iamVjdCkgLT4gKikgLT4gT2JqZWN0IC0+IE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tYXBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4eXogPSB7IHg6IDEsIHk6IDIsIHo6IDMgfTtcbiAqICAgICAgY29uc3QgcHJlcGVuZEtleUFuZERvdWJsZSA9IChudW0sIGtleSwgb2JqKSA9PiBrZXkgKyAobnVtICogMik7XG4gKlxuICogICAgICBSLm1hcE9iakluZGV4ZWQocHJlcGVuZEtleUFuZERvdWJsZSwgeHl6KTsgLy89PiB7IHg6ICd4MicsIHk6ICd5NCcsIHo6ICd6NicgfVxuICovXG52YXIgbWFwT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1hcE9iakluZGV4ZWQoZm4sIG9iaikge1xuICByZXR1cm4gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGFjY1trZXldID0gZm4ob2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWFwT2JqSW5kZXhlZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXIgb2YgaXRzIHR3byBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLm1heEJ5LCBSLm1pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWF4KDc4OSwgMTIzKTsgLy89PiA3ODlcbiAqICAgICAgUi5tYXgoJ2EnLCAnYicpOyAvLz0+ICdiJ1xuICovXG52YXIgbWF4ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWF4KGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuICBmdW5jdGlvbiBzYWZlTWF4KHgsIHkpIHtcbiAgICBpZiAoeCA+IHkgIT09IHkgPiB4KSB7XG4gICAgICByZXR1cm4geSA+IHggPyB5IDogeDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB2YXIgbWF4QnlWYWx1ZSA9IHNhZmVNYXgoYSwgYik7XG4gIGlmIChtYXhCeVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlWYWx1ZTtcbiAgfVxuICB2YXIgbWF4QnlUeXBlID0gc2FmZU1heCh0eXBlb2YgYSwgdHlwZW9mIGIpO1xuICBpZiAobWF4QnlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlUeXBlID09PSB0eXBlb2YgYSA/IGEgOiBiO1xuICB9XG4gIHZhciBzdHJpbmdBID0gdG9TdHJpbmcoYSk7XG4gIHZhciBtYXhCeVN0cmluZ1ZhbHVlID0gc2FmZU1heChzdHJpbmdBLCB0b1N0cmluZyhiKSk7XG4gIGlmIChtYXhCeVN0cmluZ1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlTdHJpbmdWYWx1ZSA9PT0gc3RyaW5nQSA/IGEgOiBiO1xuICB9XG4gIHJldHVybiBiO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtYXg7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBUYWtlcyBhIHN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gYGtleUdlbmAgYW5kIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNhY2hlZCByZXN1bHRzIGZvciBzdWJzZXF1ZW50XG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy5cbiAqXG4gKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLCBga2V5R2VuYCBpcyBhcHBsaWVkIHRvIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogYW5kIGl0cyByZXN1bHQgYmVjb21lcyB0aGUgY2FjaGUga2V5LiBJZiB0aGUgY2FjaGUgY29udGFpbnMgc29tZXRoaW5nXG4gKiB1bmRlciB0aGF0IGtleSwgdGhlIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIGl0IGFuZCBkb2VzIG5vdCBpbnZva2UgYGZuYCBhdCBhbGwuXG4gKlxuICogT3RoZXJ3aXNlIGBmbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIGl0cyByZXR1cm4gdmFsdWVcbiAqIGlzIGNhY2hlZCB1bmRlciB0aGF0IGtleSBhbmQgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICpcbiAqIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIGltcGxlbWVudGluZyBga2V5R2VuYCB0byBhdm9pZCBrZXkgY29sbGlzaW9uLFxuICogb3IgaWYgdHJhY2tpbmcgcmVmZXJlbmNlcywgbWVtb3J5IGxlYWtzIGFuZCBtdXRhdGluZyBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqLi4uIC0+IFN0cmluZykgLT4gKCouLi4gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleUdlbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtZW1vaXplLlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHZlcnNpb24gb2YgYGZuYC5cbiAqIEBleGFtcGxlXG4gKiAgICAgIGNvbnN0IHdpdGhBZ2UgPSBtZW1vaXplV2l0aChvID0+IGAke28uYmlydGh9LyR7by5kZWF0aH1gLCAoe2JpcnRoLCBkZWF0aH0pID0+IHtcbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuICogICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5R2VuICAgICAgICAgICAgICAgICAgICAgICAgZm5cbiAqICAgICAgICBjb25zb2xlLmxvZyhgY29tcHV0aW5nIGFnZSBmb3IgJHtiaXJ0aH0vJHtkZWF0aH1gKTtcbiAqICAgICAgICByZXR1cm4gKHtiaXJ0aCwgZGVhdGgsIGFnZTogZGVhdGggLSBiaXJ0aH0pO1xuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHdpdGhBZ2Uoe2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OX0pO1xuICogICAgICAvLz0+IExPRzogY29tcHV0aW5nIGFnZSBmb3IgMTkyMS8xOTk5XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gZm4pXG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiB7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5LCBhZ2U6IDc4fSAocmV0dXJuZWQgZnJvbSBjYWNoZSlcbiAqL1xudmFyIG1lbW9pemVXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVtb2l6ZVdpdGgoa2V5R2VuLCBmbikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5ID0ga2V5R2VuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFfaGFzKGtleSwgY2FjaGUpKSB7XG4gICAgICBjYWNoZVtrZXldID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW2tleV07XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZW1vaXplV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWVyZ2VEZWVwV2l0aEtleSBmcm9tIFwiLi9tZXJnZURlZXBXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCB2YWx1ZXMgYXJlIG9iamVjdHMsIHRoZSB0d28gdmFsdWVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgbWVyZ2VkXG4gKiAtIG90aGVyd2lzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kIG9iamVjdCB3aWxsIGJlIHVzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2UsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlRGVlcFdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlRGVlcFJpZ2h0KHsgbmFtZTogJ2ZyZWQnLCBhZ2U6IDEwLCBjb250YWN0OiB7IGVtYWlsOiAnbW9vQGV4YW1wbGUuY29tJyB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICB7IGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19KTtcbiAqICAgICAgLy89PiB7IG5hbWU6ICdmcmVkJywgYWdlOiA0MCwgY29udGFjdDogeyBlbWFpbDogJ2JhYUBleGFtcGxlLmNvbScgfX1cbiAqL1xudmFyIG1lcmdlRGVlcFJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VEZWVwUmlnaHQobE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIHJldHVybiByVmFsO1xuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBtZXJnZVdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLlxuICogSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIGFsc28gb2JqZWN0cyB0aGVuIHRoZSB2YWx1ZXMgd2lsbCBiZVxuICogICByZWN1cnNpdmVseSBtZXJnZWQuXG4gKiAtIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5IGFuZCBhc3NvY2lhdGVkIHZhbHVlc1xuICogICB1c2luZyB0aGUgcmVzdWx0aW5nIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiBhIGtleSBvbmx5IGV4aXN0cyBpbiBvbmUgb2JqZWN0LCB0aGUgdmFsdWUgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICogb2YgdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbE9ialxuICogQHBhcmFtIHtPYmplY3R9IHJPYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVdpdGhLZXksIFIubWVyZ2VEZWVwV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlRGVlcFdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCBjOiB7IHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzE1LCAzNV0gfX0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9fVxuICovXG52YXIgbWVyZ2VEZWVwV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIGlmIChfaXNPYmplY3QobFZhbCkgJiYgX2lzT2JqZWN0KHJWYWwpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmbiwgbFZhbCwgclZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbihrLCBsVmFsLCByVmFsKTtcbiAgICB9XG4gIH0sIGxPYmosIHJPYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZURlZXBXaXRoS2V5OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlUmlnaHQsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZUxlZnQoeyAnYWdlJzogNDAgfSwgeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDEwIH0pO1xuICogICAgICAvLz0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9XG4gKlxuICogICAgICBjb25zdCByZXNldFRvRGVmYXVsdCA9IFIubWVyZ2VMZWZ0KHt4OiAwfSk7XG4gKiAgICAgIHJlc2V0VG9EZWZhdWx0KHt4OiA1LCB5OiAyfSk7IC8vPT4ge3g6IDAsIHk6IDJ9XG4gKiBAc3ltYiBSLm1lcmdlTGVmdChhLCBiKSA9IHsuLi5iLCAuLi5hfVxuICovXG52YXIgbWVyZ2VMZWZ0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VMZWZ0KGwsIHIpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24oe30sIHIsIGwpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZUxlZnQ7IiwiaW1wb3J0IF9vYmplY3RBc3NpZ24gZnJvbSBcIi4vaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlTGVmdCwgUi5tZXJnZURlZXBSaWdodCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVJpZ2h0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9LCB7ICdhZ2UnOiA0MCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3Qgd2l0aERlZmF1bHRzID0gUi5tZXJnZVJpZ2h0KHt4OiAwLCB5OiAwfSk7XG4gKiAgICAgIHdpdGhEZWZhdWx0cyh7eTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZVJpZ2h0KGEsIGIpID0gey4uLmEsIC4uLmJ9XG4gKi9cbnZhciBtZXJnZVJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VSaWdodChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCBsLCByKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VSaWdodDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZXNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdXNlZCBhcyB0aGVcbiAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZSwgUi5tZXJnZVdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlV2l0aChSLmNvbmNhdCxcbiAqICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9XG4gKi9cbnZhciBtZXJnZVdpdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGgoZm4sIGwsIHIpIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoXywgX2wsIF9yKSB7XG4gICAgcmV0dXJuIGZuKF9sLCBfcik7XG4gIH0sIGwsIHIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBrZXlcbiAqIGFuZCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmdcbiAqIHVzZWQgYXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZURlZXBXaXRoS2V5LCBSLm1lcmdlLCBSLm1lcmdlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlV2l0aEtleShjb25jYXRWYWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdGhpbmc6ICdmb28nLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxNSwgMzVdIH0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICogQHN5bWIgUi5tZXJnZVdpdGhLZXkoZiwgeyB4OiAxLCB5OiAyIH0sIHsgeTogNSwgejogMyB9KSA9IHsgeDogMSwgeTogZigneScsIDIsIDUpLCB6OiAzIH1cbiAqL1xudmFyIG1lcmdlV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlV2l0aEtleShmbiwgbCwgcikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBrO1xuICBsID0gbCB8fCB7fTtcbiAgciA9IHIgfHwge307XG4gIGZvciAoayBpbiBsKSB7XG4gICAgaWYgKF9oYXMoaywgbCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IF9oYXMoaywgcikgPyBmbihrLCBsW2tdLCByW2tdKSA6IGxba107XG4gICAgfVxuICB9XG4gIGZvciAoayBpbiByKSB7XG4gICAgaWYgKF9oYXMoaywgcikgJiYgIV9oYXMoaywgcmVzdWx0KSkge1xuICAgICAgcmVzdWx0W2tdID0gcltrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoS2V5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cbnZhciBvbWl0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gb21pdChuYW1lcywgb2JqKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGluZGV4ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaW5kZXhbbmFtZXNbaWR4XV0gPSAxO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFpbmRleC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBvbWl0OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQWNjZXB0cyBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGd1YXJkcyBpbnZvY2F0aW9uIG9mXG4gKiBgZm5gIHN1Y2ggdGhhdCBgZm5gIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSB0aW1lc1xuICogdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoZSBmaXJzdCB2YWx1ZSBjYWxjdWxhdGVkIGlzIHJldHVybmVkIGluXG4gKiBzdWJzZXF1ZW50IGludm9jYXRpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhLi4uIC0+IGIpIC0+IChhLi4uIC0+IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiBhIGNhbGwtb25seS1vbmNlIHdyYXBwZXIuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWRkT25lT25jZSA9IFIub25jZSh4ID0+IHggKyAxKTtcbiAqICAgICAgYWRkT25lT25jZSgxMCk7IC8vPT4gMTFcbiAqICAgICAgYWRkT25lT25jZShhZGRPbmVPbmNlKDUwKSk7IC8vPT4gMTFcbiAqL1xudmFyIG9uY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBvbmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgdmFyIHJlc3VsdDtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG9uY2U7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbi8vIHRyYW5zZm9ybXMgdGhlIGhlbGQgdmFsdWUgd2l0aCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG52YXIgSWRlbnRpdHkgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgIG1hcDogZnVuY3Rpb24gKGYpIHtcbiAgICAgIHJldHVybiBJZGVudGl0eShmKHgpKTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGhlYWRMZW5zID0gUi5sZW5zSW5kZXgoMCk7XG4gKlxuICogICAgICBSLm92ZXIoaGVhZExlbnMsIFIudG9VcHBlciwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ0ZPTycsICdiYXInLCAnYmF6J11cbiAqL1xudmFyIG92ZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBvdmVyKGxlbnMsIGYsIHgpIHtcbiAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgLy8gc2V0dGVyIGZ1bmN0aW9uIG9mIHRoZSBsZW5zLlxuICByZXR1cm4gbGVucyhmdW5jdGlvbiAoeSkge1xuICAgIHJldHVybiBJZGVudGl0eShmKHkpKTtcbiAgfSkoeCkudmFsdWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG92ZXI7IiwiaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBqdXh0IGZyb20gXCIuL2p1eHQuanNcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcIi4vcmVqZWN0LmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgbGlzdCBvciBvdGhlciBgRmlsdGVyYWJsZWAgb2JqZWN0IGFuZCByZXR1cm5zIHRoZVxuICogcGFpciBvZiBmaWx0ZXJhYmxlIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50cyB3aGljaCBkbyBhbmQgZG8gbm90XG4gKiBzYXRpc2Z5LCB0aGUgcHJlZGljYXRlLCByZXNwZWN0aXZlbHkuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gW2YgYSwgZiBhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0aGUgZWxlbWVudCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZSB0aGUgbGlzdCAob3Igb3RoZXIgZmlsdGVyYWJsZSkgdG8gcGFydGl0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5LCBjb250YWluaW5nIGZpcnN0IHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZVxuICogICAgICAgICBwcmVkaWNhdGUsIGFuZCBzZWNvbmQgdGhlIHN1YnNldCBvZiBlbGVtZW50cyB0aGF0IGRvIG5vdCBzYXRpc2Z5LlxuICogQHNlZSBSLmZpbHRlciwgUi5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhcnRpdGlvbihSLmluY2x1ZGVzKCdzJyksIFsnc3NzJywgJ3R0dCcsICdmb28nLCAnYmFycyddKTtcbiAqICAgICAgLy8gPT4gWyBbICdzc3MnLCAnYmFycycgXSwgIFsgJ3R0dCcsICdmb28nIF0gXVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCB7IGE6ICdzc3MnLCBiOiAndHR0JywgZm9vOiAnYmFycycgfSk7XG4gKiAgICAgIC8vID0+IFsgeyBhOiAnc3NzJywgZm9vOiAnYmFycycgfSwgeyBiOiAndHR0JyB9ICBdXG4gKi9cbnZhciBwYXJ0aXRpb24gPSAvKiNfX1BVUkVfXyovanV4dChbZmlsdGVyLCByZWplY3RdKTtcbmV4cG9ydCBkZWZhdWx0IHBhcnRpdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aC4gVGhlIG5vZGVzIG9mIHRoZSBwYXRoIGNhbiBiZSBhcmJpdHJhcnkgc3RyaW5ncyBvciBub24tbmVnYXRpdmUgaW50ZWdlcnMuXG4gKiBGb3IgYW55dGhpbmcgZWxzZSwgdGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkLiBJbnRlZ2VyIHBhdGhzIGFyZSBtZWFudCB0byBpbmRleCBhcnJheXMsIHN0cmluZ3MgYXJlIG1lYW50IGZvciBvYmplY3RzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHNpZyBJZHggPSBTdHJpbmcgfCBOb25OZWdhdGl2ZUludFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3AsIFIubnRoLCBSLmFzc29jUGF0aCwgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gdW5kZWZpbmVkXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIDBdLCB7YToge2I6IFsxLCAyLCAzXX19KTsgLy89PiAxXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIC0yXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWzJdLCB7JzInOiAyfSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWy0yXSwgeyctMic6ICdhJ30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5cbnZhciBwYXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoX3BhdGgpO1xuZXhwb3J0IGRlZmF1bHQgcGF0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcbmltcG9ydCBkZWZhdWx0VG8gZnJvbSBcIi4vZGVmYXVsdFRvLmpzXCI7XG5cbi8qKlxuICogSWYgdGhlIGdpdmVuLCBub24tbnVsbCBvYmplY3QgaGFzIGEgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGgsIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhdCB0aGF0IHBhdGguIE90aGVyd2lzZSByZXR1cm5zIHRoZSBwcm92aWRlZCBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgYSAtPiBbSWR4XSAtPiB7YX0gLT4gYVxuICogQHBhcmFtIHsqfSBkIFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gcCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgb3IgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoT3IoJ04vQScsIFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gXCJOL0FcIlxuICovXG52YXIgcGF0aE9yID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gcGF0aE9yKGQsIHAsIG9iaikge1xuICByZXR1cm4gZGVmYXVsdFRvKGQsIF9wYXRoKHAsIG9iaikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwYXRoT3I7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyBzcGVjaWZpZWQuIElmXG4gKiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIGFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5IG9udG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyBmcm9tIGBuYW1lc2Agb24gaXQuXG4gKiBAc2VlIFIub21pdCwgUi5wcm9wc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGljayhbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBkOiA0fVxuICogICAgICBSLnBpY2soWydhJywgJ2UnLCAnZiddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxfVxuICovXG52YXIgcGljayA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBpY2sobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgaWYgKG5hbWVzW2lkeF0gaW4gb2JqKSB7XG4gICAgICByZXN1bHRbbmFtZXNbaWR4XV0gPSBvYmpbbmFtZXNbaWR4XV07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2s7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyB0aGF0IHNhdGlzZnlcbiAqIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgodiwgaykgLT4gQm9vbGVhbikgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBrZXlcbiAqICAgICAgICBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyB0aGF0IHNhdGlzZnkgYHByZWRgXG4gKiAgICAgICAgIG9uIGl0LlxuICogQHNlZSBSLnBpY2ssIFIuZmlsdGVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNVcHBlckNhc2UgPSAodmFsLCBrZXkpID0+IGtleS50b1VwcGVyQ2FzZSgpID09PSBrZXk7XG4gKiAgICAgIFIucGlja0J5KGlzVXBwZXJDYXNlLCB7YTogMSwgYjogMiwgQTogMywgQjogNH0pOyAvLz0+IHtBOiAzLCBCOiA0fVxuICovXG52YXIgcGlja0J5ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcGlja0J5KHRlc3QsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKHRlc3Qob2JqW3Byb3BdLCBwcm9wLCBvYmopKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2tCeTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwbHVja2luZyB0aGUgc2FtZSBuYW1lZCBwcm9wZXJ0eSBvZmYgYWxsIG9iamVjdHMgaW5cbiAqIHRoZSBsaXN0IHN1cHBsaWVkLlxuICpcbiAqIGBwbHVja2Agd2lsbCB3b3JrIG9uXG4gKiBhbnkgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvcikgaW5cbiAqIGFkZGl0aW9uIHRvIGFycmF5cywgYXMgaXQgaXMgZXF1aXZhbGVudCB0byBgUi5tYXAoUi5wcm9wKGspLCBmKWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gayAtPiBmIHtrOiB2fSAtPiBmIHZcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5IFRoZSBrZXkgbmFtZSB0byBwbHVjayBvZmYgb2YgZWFjaCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBmIFRoZSBhcnJheSBvciBmdW5jdG9yIHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGtleS5cbiAqIEBzZWUgUi5wcm9qZWN0LCBSLnByb3AsIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZ2V0QWdlcyA9IFIucGx1Y2soJ2FnZScpO1xuICogICAgICBnZXRBZ2VzKFt7bmFtZTogJ2ZyZWQnLCBhZ2U6IDI5fSwge25hbWU6ICd3aWxtYScsIGFnZTogMjd9XSk7IC8vPT4gWzI5LCAyN11cbiAqXG4gKiAgICAgIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdXSk7ICAgICAgICAgICAgICAgLy89PiBbMSwgM11cbiAqICAgICAgUi5wbHVjaygndmFsJywge2E6IHt2YWw6IDN9LCBiOiB7dmFsOiA1fX0pOyAvLz0+IHthOiAzLCBiOiA1fVxuICogQHN5bWIgUi5wbHVjaygneCcsIFt7eDogMSwgeTogMn0sIHt4OiAzLCB5OiA0fSwge3g6IDUsIHk6IDZ9XSkgPSBbMSwgMywgNV1cbiAqIEBzeW1iIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKSA9IFsxLCAzLCA1XVxuICovXG52YXIgcGx1Y2sgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwbHVjayhwLCBsaXN0KSB7XG4gIHJldHVybiBtYXAocHJvcChwKSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBsdWNrOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG52YXIgcHJlcGVuZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByZXBlbmQoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIF9jb25jYXQoW2VsXSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByZXBlbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vaW50ZXJuYWwvX250aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgSWR4IC0+IHtzOiBhfSAtPiBhIHwgVW5kZWZpbmVkXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHAgVGhlIHByb3BlcnR5IG5hbWUgb3IgYXJyYXkgaW5kZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aCwgUi5wcm9wcywgUi5wbHVjaywgUi5wcm9qZWN0LCBSLm50aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnByb3AoMCwgWzEwMF0pOyAvLz0+IDEwMFxuICogICAgICBSLmNvbXBvc2UoUi5pbmMsIFIucHJvcCgneCcpKSh7IHg6IDMgfSkgLy89PiA0XG4gKi9cblxudmFyIHByb3AgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcm9wKHAsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIF9pc0ludGVnZXIocCkgPyBfbnRoKHAsIG9iaikgOiBvYmpbcF07XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3A7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSBpcyBlcXVhbCwgaW5cbiAqIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSB0ZXJtcywgdG8gdGhlIGdpdmVuIHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIFlvdSBjYW4gdGVzdCBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdpdGggW2BSLndoZXJlRXFgXSgjd2hlcmVFcSksXG4gKiBhbmQgdGVzdCBuZXN0ZWQgcGF0aCBwcm9wZXJ0eSB3aXRoIFtgUi5wYXRoRXFgXSgjcGF0aEVxKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIHByb3BlcnR5IHdpdGhcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5J3Mga2V5XG4gKiBAcGFyYW0geyp9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwcm9wZXJ0eSBpblxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHksXG4gKiAgICAgICAgIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLndoZXJlRXEsIFIucGF0aEVxLCBSLnByb3BTYXRpc2ZpZXMsIFIuZXF1YWxzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWJieSA9IHtuYW1lOiAnQWJieScsIGFnZTogNywgaGFpcjogJ2Jsb25kJ307XG4gKiAgICAgIGNvbnN0IGZyZWQgPSB7bmFtZTogJ0ZyZWQnLCBhZ2U6IDEyLCBoYWlyOiAnYnJvd24nfTtcbiAqICAgICAgY29uc3QgcnVzdHkgPSB7bmFtZTogJ1J1c3R5JywgYWdlOiAxMCwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIGNvbnN0IGFsb2lzID0ge25hbWU6ICdBbG9pcycsIGFnZTogMTUsIGRpc3Bvc2l0aW9uOiAnc3VybHknfTtcbiAqICAgICAgY29uc3Qga2lkcyA9IFthYmJ5LCBmcmVkLCBydXN0eSwgYWxvaXNdO1xuICogICAgICBjb25zdCBoYXNCcm93bkhhaXIgPSBSLnByb3BFcSgnYnJvd24nLCAnaGFpcicpO1xuICogICAgICBSLmZpbHRlcihoYXNCcm93bkhhaXIsIGtpZHMpOyAvLz0+IFtmcmVkLCBydXN0eV1cbiAqL1xudmFyIHByb3BFcSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHByb3BFcSh2YWwsIG5hbWUsIG9iaikge1xuICByZXR1cm4gZXF1YWxzKHZhbCwgcHJvcChuYW1lLCBvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcHJvcEVxOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcblxuLyoqXG4gKiBBY3RzIGFzIG11bHRpcGxlIGBwcm9wYDogYXJyYXkgb2Yga2V5cyBpbiwgYXJyYXkgb2YgdmFsdWVzIG91dC4gUHJlc2VydmVzXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7QXJyYXl9IHBzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmZXRjaFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5XG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9yIHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLnByb3AsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcHMoWyd4JywgJ3knXSwge3g6IDEsIHk6IDJ9KTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi5wcm9wcyhbJ2MnLCAnYScsICdiJ10sIHtiOiAyLCBhOiAxfSk7IC8vPT4gW3VuZGVmaW5lZCwgMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gUi5jb21wb3NlKFIuam9pbignICcpLCBSLnByb3BzKFsnZmlyc3QnLCAnbGFzdCddKSk7XG4gKiAgICAgIGZ1bGxOYW1lKHtsYXN0OiAnQnVsbGV0LVRvb3RoJywgYWdlOiAzMywgZmlyc3Q6ICdUb255J30pOyAvLz0+ICdUb255IEJ1bGxldC1Ub290aCdcbiAqL1xudmFyIHByb3BzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcHJvcHMocHMsIG9iaikge1xuICByZXR1cm4gcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHByb3AocCwgb2JqKTtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3BzOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoZSBhcmd1bWVudHMnIG9yZGVyIG9mIFtgcmVkdWNlUmlnaHRgXSgjcmVkdWNlUmlnaHQpJ3MgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIGlzICoodmFsdWUsIGFjYykqLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBCZSBjYXV0aW91cyBvZiBtdXRhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSBhY2N1bXVsYXRvci4gSWYgeW91IHJldXNlIGl0IGFjcm9zc1xuICogaW52b2NhdGlvbnMsIGl0IHdpbGwgY29udGludWUgdG8gYWNjdW11bGF0ZSBvbnRvIHRoZSBzYW1lIHZhbHVlLiBUaGUgZ2VuZXJhbFxuICogcmVjb21tZW5kYXRpb24gaXMgdG8gYWx3YXlzIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgeW91IGNhbid0IGRvIHNvIGZvclxuICogcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlbiBiZSBzdXJlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3Igb24gZWFjaFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBXaGVuXG4gKiBkb2luZyBzbywgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gaGFuZGxlIHRoZSBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKVxuICogc2hvcnRjdXRpbmcsIGFzIHRoaXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IGByZWR1Y2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXgsIFIucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlZHVjZShSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgoKCgwIC0gMSkgLSAyKSAtIDMpIC0gNCkgPSAtMTBcbiAqICAgICAgLy8gICAgICAgICAgLSAgICAgICAgICAgICAgIC0xMFxuICogICAgICAvLyAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAgIC0gICA0ICAgICAgICAgICAtNiAgIDRcbiAqICAgICAgLy8gICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgIC0gICAzICAgPT0+ICAgICAtMyAgIDNcbiAqICAgICAgLy8gICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgLSAgIDIgICAgICAgICAgIC0xICAgMlxuICogICAgICAvLyAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gIDAgICAxICAgICAgICAgICAgMCAgIDFcbiAqXG4gKiBAc3ltYiBSLnJlZHVjZShmLCBhLCBbYiwgYywgZF0pID0gZihmKGYoYSwgYiksIGMpLCBkKVxuICovXG52YXIgcmVkdWNlID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gKHhmLCBhY2MsIGxpc3QpIHtcbiAgcmV0dXJuIF94UmVkdWNlKHR5cGVvZiB4ZiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcCh4ZikgOiB4ZiwgYWNjLCBsaXN0KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5TiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnlOLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vaW50ZXJuYWwvX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94cmVkdWNlQnkgZnJvbSBcIi4vaW50ZXJuYWwvX3hyZWR1Y2VCeS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBHcm91cHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFjY29yZGluZyB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAqIHRoZSBTdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlGbmAgb24gZWFjaCBlbGVtZW50IGFuZCByZWR1Y2VzIHRoZSBlbGVtZW50c1xuICogb2YgZWFjaCBncm91cCB0byBhIHNpbmdsZSB2YWx1ZSB2aWEgdGhlIHJlZHVjZXIgZnVuY3Rpb24gYHZhbHVlRm5gLlxuICpcbiAqIFRoZSB2YWx1ZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnQgY2lyY3VpdCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGEgbW9yZSBnZW5lcmFsIFtgZ3JvdXBCeWBdKCNncm91cEJ5KSBmdW5jdGlvbi5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IChiIC0+IFN0cmluZykgLT4gW2JdIC0+IHtTdHJpbmc6IGF9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUZuIFRoZSBmdW5jdGlvbiB0aGF0IHJlZHVjZXMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGVcbiAqICAgICAgICB2YWx1ZS4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgYWNjdW11bGF0b3IgZm9yIGEgcGFydGljdWxhciBncm91cCBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSAoaW5pdGlhbCkgYWNjdW11bGF0b3IgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlGbiBUaGUgZnVuY3Rpb24gdGhhdCBtYXBzIHRoZSBsaXN0J3MgZWxlbWVudCBpbnRvIGEga2V5LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXAuXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGtleUZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIHRoZSBvdXRwdXQgb2ZcbiAqICAgICAgICAgYHZhbHVlRm5gIGZvciBlbGVtZW50cyB3aGljaCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBga2V5Rm5gLlxuICogQHNlZSBSLmdyb3VwQnksIFIucmVkdWNlLCBSLnJlZHVjZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBncm91cE5hbWVzID0gKGFjYywge25hbWV9KSA9PiBhY2MuY29uY2F0KG5hbWUpXG4gKiAgICAgIGNvbnN0IHRvR3JhZGUgPSAoe3Njb3JlfSkgPT5cbiAqICAgICAgICBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICBzY29yZSA8IDcwID8gJ0QnIDpcbiAqICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnXG4gKlxuICogICAgICB2YXIgc3R1ZGVudHMgPSBbXG4gKiAgICAgICAge25hbWU6ICdBYmJ5Jywgc2NvcmU6IDgzfSxcbiAqICAgICAgICB7bmFtZTogJ0JhcnQnLCBzY29yZTogNjJ9LFxuICogICAgICAgIHtuYW1lOiAnQ3VydCcsIHNjb3JlOiA4OH0sXG4gKiAgICAgICAge25hbWU6ICdEb3JhJywgc2NvcmU6IDkyfSxcbiAqICAgICAgXVxuICpcbiAqICAgICAgcmVkdWNlQnkoZ3JvdXBOYW1lcywgW10sIHRvR3JhZGUsIHN0dWRlbnRzKVxuICogICAgICAvLz0+IHtcIkFcIjogW1wiRG9yYVwiXSwgXCJCXCI6IFtcIkFiYnlcIiwgXCJDdXJ0XCJdLCBcIkZcIjogW1wiQmFydFwiXX1cbiAqL1xudmFyIHJlZHVjZUJ5ID0gLyojX19QVVJFX18qL19jdXJyeU4oNCwgW10sIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFtdLCBfeHJlZHVjZUJ5LCBmdW5jdGlvbiByZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIGxpc3QpIHtcbiAgdmFyIHhmID0gX3h3cmFwKGZ1bmN0aW9uIChhY2MsIGVsdCkge1xuICAgIHZhciBrZXkgPSBrZXlGbihlbHQpO1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlRm4oX2hhcyhrZXksIGFjYykgPyBhY2Nba2V5XSA6IF9jbG9uZSh2YWx1ZUFjYywgZmFsc2UpLCBlbHQpO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgcmV0dXJuIF9yZWR1Y2VkKGFjYyk7XG4gICAgfVxuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSk7XG4gIHJldHVybiBfeFJlZHVjZSh4Ziwge30sIGxpc3QpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlQnk7IiwiaW1wb3J0IF9jb21wbGVtZW50IGZyb20gXCIuL2ludGVybmFsL19jb21wbGVtZW50LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuXG4vKipcbiAqIFRoZSBjb21wbGVtZW50IG9mIFtgZmlsdGVyYF0oI2ZpbHRlcikuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLiBGaWx0ZXJhYmxlXG4gKiBvYmplY3RzIGluY2x1ZGUgcGxhaW4gb2JqZWN0cyBvciBhbnkgb2JqZWN0IHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoXG4gKiBhcyBgQXJyYXlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNlZSBSLmZpbHRlciwgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc09kZCA9IChuKSA9PiBuICUgMiAhPT0gMDtcbiAqXG4gKiAgICAgIFIucmVqZWN0KGlzT2RkLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCA0XVxuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbnZhciByZWplY3QgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiByZWplY3QocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gZmlsdGVyKF9jb21wbGVtZW50KHByZWQpLCBmaWx0ZXJhYmxlKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVqZWN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzdWItbGlzdCBvZiBgbGlzdGAgc3RhcnRpbmcgYXQgaW5kZXggYHN0YXJ0YCBhbmQgY29udGFpbmluZ1xuICogYGNvdW50YCBlbGVtZW50cy4gX05vdGUgdGhhdCB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mXG4gKiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSBwb3NpdGlvbiB0byBzdGFydCByZW1vdmluZyBlbGVtZW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVtb3ZlXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHJlbW92ZSBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgQXJyYXkgd2l0aCBgY291bnRgIGVsZW1lbnRzIGZyb20gYHN0YXJ0YCByZW1vdmVkLlxuICogQHNlZSBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlbW92ZSgyLCAzLCBbMSwyLDMsNCw1LDYsNyw4XSk7IC8vPT4gWzEsMiw2LDcsOF1cbiAqL1xudmFyIHJlbW92ZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHJlbW92ZShzdGFydCwgY291bnQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlbW92ZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG52YXIgcmV2ZXJzZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHJldmVyc2UobGlzdCkge1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkucmV2ZXJzZSgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCByZXZlcnNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhbHdheXMgZnJvbSBcIi4vYWx3YXlzLmpzXCI7XG5pbXBvcnQgb3ZlciBmcm9tIFwiLi9vdmVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gYSAtPiBzIC0+IHNcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB2XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudmlldywgUi5vdmVyLCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnNQcm9wKCd4Jyk7XG4gKlxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIuc2V0KHhMZW5zLCA4LCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogOCwgeTogMn1cbiAqL1xudmFyIHNldCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHNldChsZW5zLCB2LCB4KSB7XG4gIHJldHVybiBvdmVyKGxlbnMsIGFsd2F5cyh2KSwgeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHNldDsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbnZhciBzbGljZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdzbGljZScsIGZ1bmN0aW9uIHNsaWNlKGZyb21JbmRleCwgdG9JbmRleCwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgZnJvbUluZGV4LCB0b0luZGV4KTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHNsaWNlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tcGFyYXRvciBmdW5jdGlvbixcbiAqIHdoaWNoIHNob3VsZCBhY2NlcHQgdHdvIHZhbHVlcyBhdCBhIHRpbWUgYW5kIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGVcbiAqIGZpcnN0IHZhbHVlIGlzIHNtYWxsZXIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGl0J3MgbGFyZ2VyLCBhbmQgemVybyBpZiB0aGV5XG4gKiBhcmUgZXF1YWwuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhICoqY29weSoqIG9mIHRoZSBsaXN0LiBJdCBkb2VzIG5vdFxuICogbW9kaWZ5IHRoZSBvcmlnaW5hbC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkgLT4gTnVtYmVyKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIEEgc29ydGluZyBmdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHNvcnRcbiAqIEByZXR1cm4ge0FycmF5fSBhIG5ldyBhcnJheSB3aXRoIGl0cyBlbGVtZW50cyBzb3J0ZWQgYnkgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKiBAc2VlIFIuYXNjZW5kLCBSLmRlc2NlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG52YXIgc29ydCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkuc29ydChjb21wYXJhdG9yKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgc29ydDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuaW1wb3J0IHRha2UgZnJvbSBcIi4vdGFrZS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3Qgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1Ymxpc3QuXG4gKlxuICogU2ltaWxhcmx5LCBjaGVja3MgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1YnN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHByZWZpeFxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVuZHNXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zdGFydHNXaXRoKCdhJywgJ2FiYycpICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLnN0YXJ0c1dpdGgoJ2InLCAnYWJjJykgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLnN0YXJ0c1dpdGgoWydhJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuc3RhcnRzV2l0aChbJ2InXSwgWydhJywgJ2InLCAnYyddKSAgICAvLz0+IGZhbHNlXG4gKi9cbnZhciBzdGFydHNXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gKHByZWZpeCwgbGlzdCkge1xuICByZXR1cm4gZXF1YWxzKHRha2UocHJlZml4Lmxlbmd0aCwgbGlzdCksIHByZWZpeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dGFrZSBmcm9tIFwiLi9pbnRlcm5hbC9feHRha2UuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgdGFrZWAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgdGFrZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5kcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50YWtlKDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nXVxuICogICAgICBSLnRha2UoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInXVxuICogICAgICBSLnRha2UoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlKDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKlxuICogICAgICBjb25zdCBwZXJzb25uZWwgPSBbXG4gKiAgICAgICAgJ0RhdmUgQnJ1YmVjaycsXG4gKiAgICAgICAgJ1BhdWwgRGVzbW9uZCcsXG4gKiAgICAgICAgJ0V1Z2VuZSBXcmlnaHQnLFxuICogICAgICAgICdKb2UgTW9yZWxsbycsXG4gKiAgICAgICAgJ0dlcnJ5IE11bGxpZ2FuJyxcbiAqICAgICAgICAnQm9iIEJhdGVzJyxcbiAqICAgICAgICAnSm9lIERvZGdlJyxcbiAqICAgICAgICAnUm9uIENyb3R0eSdcbiAqICAgICAgXTtcbiAqXG4gKiAgICAgIGNvbnN0IHRha2VGaXZlID0gUi50YWtlKDUpO1xuICogICAgICB0YWtlRml2ZShwZXJzb25uZWwpO1xuICogICAgICAvLz0+IFsnRGF2ZSBCcnViZWNrJywgJ1BhdWwgRGVzbW9uZCcsICdFdWdlbmUgV3JpZ2h0JywgJ0pvZSBNb3JlbGxvJywgJ0dlcnJ5IE11bGxpZ2FuJ11cbiAqIEBzeW1iIFIudGFrZSgtMSwgW2EsIGJdKSA9IFthLCBiXVxuICogQHN5bWIgUi50YWtlKDAsIFthLCBiXSkgPSBbXVxuICogQHN5bWIgUi50YWtlKDEsIFthLCBiXSkgPSBbYV1cbiAqIEBzeW1iIFIudGFrZSgyLCBbYSwgYl0pID0gW2EsIGJdXG4gKi9cbnZhciB0YWtlID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsndGFrZSddLCBfeHRha2UsIGZ1bmN0aW9uIHRha2UobiwgeHMpIHtcbiAgcmV0dXJuIHNsaWNlKDAsIG4gPCAwID8gSW5maW5pdHkgOiBuLCB4cyk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCB0YWtlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cy4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSB1c2VkLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5mcm9tUGFpcnMsIFIua2V5cywgUi52YWx1ZXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvUGFpcnMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV1cbiAqL1xudmFyIHRvUGFpcnMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0b1BhaXJzKG9iaikge1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBpZiAoX2hhcyhwcm9wLCBvYmopKSB7XG4gICAgICBwYWlyc1twYWlycy5sZW5ndGhdID0gW3Byb3AsIG9ialtwcm9wXV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWlycztcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdG9QYWlyczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX3RvU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL190b1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuIGBldmFsYCdpbmcgdGhlIG91dHB1dFxuICogc2hvdWxkIHJlc3VsdCBpbiBhIHZhbHVlIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHZhbHVlLiBNYW55IG9mIHRoZSBidWlsdC1pblxuICogYHRvU3RyaW5nYCBtZXRob2RzIGRvIG5vdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQuXG4gKlxuICogSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGBbb2JqZWN0IE9iamVjdF1gIHdpdGggYSBgdG9TdHJpbmdgIG1ldGhvZCBvdGhlclxuICogdGhhbiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS4gVGhpcyBtZWFucyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zXG4gKiBjYW4gcHJvdmlkZSBhIHN1aXRhYmxlIGB0b1N0cmluZ2AgbWV0aG9kLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICogICAgICAgdGhpcy54ID0geDtcbiAqICAgICAgIHRoaXMueSA9IHk7XG4gKiAgICAgfVxuICpcbiAqICAgICBQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAnbmV3IFBvaW50KCcgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJyknO1xuICogICAgIH07XG4gKlxuICogICAgIFIudG9TdHJpbmcobmV3IFBvaW50KDEsIDIpKTsgLy89PiAnbmV3IFBvaW50KDEsIDIpJ1xuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1N0cmluZyg0Mik7IC8vPT4gJzQyJ1xuICogICAgICBSLnRvU3RyaW5nKCdhYmMnKTsgLy89PiAnXCJhYmNcIidcbiAqICAgICAgUi50b1N0cmluZyhbMSwgMiwgM10pOyAvLz0+ICdbMSwgMiwgM10nXG4gKiAgICAgIFIudG9TdHJpbmcoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9KTsgLy89PiAne1wiYmFyXCI6IDIsIFwiYmF6XCI6IDMsIFwiZm9vXCI6IDF9J1xuICogICAgICBSLnRvU3RyaW5nKG5ldyBEYXRlKCcyMDAxLTAyLTAzVDA0OjA1OjA2WicpKTsgLy89PiAnbmV3IERhdGUoXCIyMDAxLTAyLTAzVDA0OjA1OjA2LjAwMFpcIiknXG4gKi9cbnZhciB0b1N0cmluZyA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHRvU3RyaW5nKHZhbCkge1xuICByZXR1cm4gX3RvU3RyaW5nKHZhbCwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0b1N0cmluZzsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogR2l2ZXMgYSBzaW5nbGUtd29yZCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIChuYXRpdmUpIHR5cGUgb2YgYSB2YWx1ZSxcbiAqIHJldHVybmluZyBzdWNoIGFuc3dlcnMgYXMgJ09iamVjdCcsICdOdW1iZXInLCAnQXJyYXknLCBvciAnTnVsbCcuIERvZXMgbm90XG4gKiBhdHRlbXB0IHRvIGRpc3Rpbmd1aXNoIHVzZXIgT2JqZWN0IHR5cGVzIGFueSBmdXJ0aGVyLCByZXBvcnRpbmcgdGhlbSBhbGwgYXNcbiAqICdPYmplY3QnLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50eXBlKHt9KTsgLy89PiBcIk9iamVjdFwiXG4gKiAgICAgIFIudHlwZSgxKTsgLy89PiBcIk51bWJlclwiXG4gKiAgICAgIFIudHlwZShmYWxzZSk7IC8vPT4gXCJCb29sZWFuXCJcbiAqICAgICAgUi50eXBlKCdzJyk7IC8vPT4gXCJTdHJpbmdcIlxuICogICAgICBSLnR5cGUobnVsbCk7IC8vPT4gXCJOdWxsXCJcbiAqICAgICAgUi50eXBlKFtdKTsgLy89PiBcIkFycmF5XCJcbiAqICAgICAgUi50eXBlKC9bQS16XS8pOyAvLz0+IFwiUmVnRXhwXCJcbiAqICAgICAgUi50eXBlKCgpID0+IHt9KTsgLy89PiBcIkZ1bmN0aW9uXCJcbiAqICAgICAgUi50eXBlKGFzeW5jICgpID0+IHt9KTsgLy89PiBcIkFzeW5jRnVuY3Rpb25cIlxuICogICAgICBSLnR5cGUodW5kZWZpbmVkKTsgLy89PiBcIlVuZGVmaW5lZFwiXG4gKiAgICAgIFIudHlwZShCaWdJbnQoMTIzKSk7IC8vPT4gXCJCaWdJbnRcIlxuICovXG52YXIgdHlwZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHR5cGUodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IG51bGwgPyAnTnVsbCcgOiB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0eXBlOyIsImltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHVuaXFCeSBmcm9tIFwiLi91bmlxQnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXEoWzEsIDEsIDIsIDFdKTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi51bmlxKFsxLCAnMSddKTsgICAgIC8vPT4gWzEsICcxJ11cbiAqICAgICAgUi51bmlxKFtbNDJdLCBbNDJdXSk7IC8vPT4gW1s0Ml1dXG4gKi9cbnZhciB1bmlxID0gLyojX19QVVJFX18qL3VuaXFCeShpZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxOyIsImltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHVuaXFCeSBmcm9tIFwiLi9pbnRlcm5hbC9feHVuaXFCeS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIG9ubHkgb25lIGNvcHkgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICogbGlzdCwgYmFzZWQgdXBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHRvXG4gKiBlYWNoIGxpc3QgZWxlbWVudC4gUHJlZmVycyB0aGUgZmlyc3QgaXRlbSBpZiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gcHJvZHVjZXNcbiAqIHRoZSBzYW1lIHZhbHVlIG9uIHR3byBpdGVtcy4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IGIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIGEgdmFsdWUgdG8gdXNlIGR1cmluZyBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXFCeShNYXRoLmFicywgWy0xLCAtNSwgMiwgMTAsIDEsIDJdKTsgLy89PiBbLTEsIC01LCAyLCAxMF1cbiAqL1xudmFyIHVuaXFCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3h1bmlxQnksIGZ1bmN0aW9uIChmbiwgbGlzdCkge1xuICB2YXIgc2V0ID0gbmV3IF9TZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGFwcGxpZWRJdGVtLCBpdGVtO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgIGFwcGxpZWRJdGVtID0gZm4oaXRlbSk7XG4gICAgaWYgKHNldC5hZGQoYXBwbGllZEl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHVuaXFCeTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGRpZmZlcmVudFxuICogSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQHNlZSBSLnZhbHVlc0luLCBSLmtleXMsIFIudG9QYWlyc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudmFsdWVzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbnZhciB2YWx1ZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXMob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YWxzW2lkeF0gPSBvYmpbcHJvcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbHM7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHZhbHVlczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8vIGBDb25zdGAgaXMgYSBmdW5jdG9yIHRoYXQgZWZmZWN0aXZlbHkgaWdub3JlcyB0aGUgZnVuY3Rpb24gZ2l2ZW4gdG8gYG1hcGAuXG52YXIgQ29uc3QgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgICdmYW50YXN5LWxhbmQvbWFwJzogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgXCJ2aWV3XCIgb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlLCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBsZW5zLlxuICogVGhlIGxlbnMncyBmb2N1cyBkZXRlcm1pbmVzIHdoaWNoIHBvcnRpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gcyAtPiBhXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXQsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgLy89PiAxXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDQsIHk6IDJ9KTsgIC8vPT4gNFxuICovXG52YXIgdmlldyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHZpZXcobGVucywgeCkge1xuICAvLyBVc2luZyBgQ29uc3RgIGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgYGxlbnNgLFxuICAvLyBsZWF2aW5nIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHVubW9kaWZpZWQuXG4gIHJldHVybiBsZW5zKENvbnN0KSh4KS52YWx1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdmlldzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsaXN0IG91dCBvZiB0aGUgdHdvIHN1cHBsaWVkIGJ5IHBhaXJpbmcgdXAgZXF1YWxseS1wb3NpdGlvbmVkXG4gKiBpdGVtcyBmcm9tIGJvdGggbGlzdHMuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHRydW5jYXRlZCB0byB0aGUgbGVuZ3RoIG9mIHRoZVxuICogc2hvcnRlciBvZiB0aGUgdHdvIGlucHV0IGxpc3RzLlxuICogTm90ZTogYHppcGAgaXMgZXF1aXZhbGVudCB0byBgemlwV2l0aChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBbYSwgYl0gfSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXSAtPiBbW2EsYl1dXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcChbMSwgMiwgM10sIFsnYScsICdiJywgJ2MnXSk7IC8vPT4gW1sxLCAnYSddLCBbMiwgJ2InXSwgWzMsICdjJ11dXG4gKiBAc3ltYiBSLnppcChbYSwgYiwgY10sIFtkLCBlLCBmXSkgPSBbW2EsIGRdLCBbYiwgZV0sIFtjLCBmXV1cbiAqL1xudmFyIHppcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICB2YXIgcnYgPSBBcnJheShsZW4pO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJ2W2lkeF0gPSBbYVtpZHhdLCBiW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBydjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBvdXQgb2YgYSBsaXN0IG9mIGtleXMgYW5kIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKiBLZXkvdmFsdWUgcGFpcmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGxpc3RzLlxuICogTm90ZTogYHppcE9iamAgaXMgZXF1aXZhbGVudCB0byBgcGlwZSh6aXAsIGZyb21QYWlycylgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW1N0cmluZ10gLT4gWypdIC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSB0aGF0IHdpbGwgYmUgcHJvcGVydGllcyBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgbGlzdCBvZiB2YWx1ZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgbWFkZSBieSBwYWlyaW5nIHVwIHNhbWUtaW5kZXhlZCBlbGVtZW50cyBvZiBga2V5c2AgYW5kIGB2YWx1ZXNgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuemlwT2JqKFsnYScsICdiJywgJ2MnXSwgWzEsIDIsIDNdKTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xudmFyIHppcE9iaiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcE9iaihrZXlzLCB2YWx1ZXMpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihrZXlzLmxlbmd0aCwgdmFsdWVzLmxlbmd0aCk7XG4gIHZhciBvdXQgPSB7fTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIG91dFtrZXlzW2lkeF1dID0gdmFsdWVzW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwT2JqOyIsImV4cG9ydCBmdW5jdGlvbiB5dXYycmdiKHl1dikge1xuICB2YXIgeSA9IHl1dlswXSxcbiAgICAgIHUgPSB5dXZbMV0sXG4gICAgICB2ID0geXV2WzJdO1xuICB2YXIgciwgZywgYjtcbiAgciA9IHkgKiAxICsgdSAqIDAgKyB2ICogMS4xMzk4MztcbiAgZyA9IHkgKiAxICsgdSAqIC0wLjM5NDY1ICsgdiAqIC0wLjU4MDY7XG4gIGIgPSB5ICogMSArIHUgKiAyLjAyMzExICsgdiAqIDA7XG4gIHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG4gIGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG4gIGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5leHBvcnQgZnVuY3Rpb24gcmdiMnl1dihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0gLyAyNTUsXG4gICAgICBnID0gcmdiWzFdIC8gMjU1LFxuICAgICAgYiA9IHJnYlsyXSAvIDI1NTtcbiAgdmFyIHkgPSByICogMC4yOTkgKyBnICogMC41ODcgKyBiICogMC4xMTQ7XG4gIHZhciB1ID0gciAqIC0wLjE0NzEzICsgZyAqIC0wLjI4ODg2ICsgYiAqIDAuNDM2O1xuICB2YXIgdiA9IHIgKiAwLjYxNSArIGcgKiAtMC41MTQ5OSArIGIgKiAtMC4xMDAwMTtcbiAgcmV0dXJuIFt5LCB1LCB2XTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbnZhciBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xudmFyIEJBU0UxNl9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9CQVNFMTYpOyAvLyB3ZSBuZWVkIGEgY29ycmVjdGluZyBmYWN0b3IsIHNvIHRoYXQgYSBkYXJrLCBidXQgbm90IGJsYWNrIGJhY2tncm91bmQgY29sb3Jcbi8vIGNvbnZlcnRzIHRvIGJyaWdodCBlbm91Z2ggaW52ZXJzZWQgY29sb3JcblxudmFyIGZsaXAgPSBmdW5jdGlvbiBmbGlwKHgpIHtcbiAgcmV0dXJuIHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geDtcbn07XG5cbnZhciBpbnZlcnRDb2xvciA9IGZ1bmN0aW9uIGludmVydENvbG9yKGhleFN0cmluZykge1xuICB2YXIgY29sb3IgPSBDb2xvcihoZXhTdHJpbmcpO1xuXG4gIHZhciBfcmdiMnl1diA9IHJnYjJ5dXYoY29sb3IuYXJyYXkoKSksXG4gICAgICBfcmdiMnl1djIgPSBfc2xpY2VkVG9BcnJheShfcmdiMnl1diwgMyksXG4gICAgICB5ID0gX3JnYjJ5dXYyWzBdLFxuICAgICAgdSA9IF9yZ2IyeXV2MlsxXSxcbiAgICAgIHYgPSBfcmdiMnl1djJbMl07XG5cbiAgdmFyIGZsaXBwZWRZdXYgPSBbZmxpcCh5KSwgdSwgdl07XG4gIHZhciByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG52YXIgbWVyZ2VyID0gZnVuY3Rpb24gbWVyZ2VyKHN0eWxpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcmV2U3R5bGluZykge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc05hbWU6IFtwcmV2U3R5bGluZy5jbGFzc05hbWUsIHN0eWxpbmcuY2xhc3NOYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0eWxpbmcuc3R5bGUgfHwge30pLCBzdHlsaW5nLnN0eWxlIHx8IHt9KVxuICAgIH07XG4gIH07XG59O1xuXG52YXIgbWVyZ2VTdHlsaW5nID0gZnVuY3Rpb24gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKSB7XG4gIGlmIChjdXN0b21TdHlsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGVmYXVsdFN0eWxpbmc7XG4gIH1cblxuICBpZiAoZGVmYXVsdFN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdXN0b21TdHlsaW5nO1xuICB9XG5cbiAgdmFyIGN1c3RvbVR5cGUgPSBfdHlwZW9mKGN1c3RvbVN0eWxpbmcpO1xuXG4gIHZhciBkZWZhdWx0VHlwZSA9IF90eXBlb2YoZGVmYXVsdFN0eWxpbmcpO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGRlZmF1bHRTdHlsaW5nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZ1xuICAgICAgICAgICAgfSkoZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKSk7XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyxcbiAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0U3R5bGluZyksIGN1c3RvbVN0eWxpbmcpO1xuXG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgICBzdHlsZTogY3VzdG9tU3R5bGluZ1xuICAgICAgICAgICAgfSkoZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKSk7XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFttZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nXG4gICAgICAgICAgICB9KV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQgPiAxID8gX2xlbjQgLSAxIDogMCksIF9rZXk0ID0gMTsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFttZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW41ID4gMSA/IF9sZW41IC0gMSA6IDApLCBfa2V5NSA9IDE7IF9rZXk1IDwgX2xlbjU7IF9rZXk1KyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5NSAtIDFdID0gYXJndW1lbnRzW19rZXk1XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVN0eWxpbmcuYXBwbHkodm9pZCAwLCBbZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gIH1cbn07XG5cbnZhciBtZXJnZVN0eWxpbmdzID0gZnVuY3Rpb24gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5ncywgZGVmYXVsdFN0eWxpbmdzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdFN0eWxpbmdzKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY3VzdG9tU3R5bGluZ3MpIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkU3R5bGluZywga2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxpbmdba2V5XSA9IG1lcmdlU3R5bGluZyhjdXN0b21TdHlsaW5nc1trZXldLCBkZWZhdWx0U3R5bGluZ3Nba2V5XSksIG1lcmdlZFN0eWxpbmc7XG4gIH0sIHt9KTtcbn07XG5cbnZhciBnZXRTdHlsaW5nQnlLZXlzID0gZnVuY3Rpb24gZ2V0U3R5bGluZ0J5S2V5cyhtZXJnZWRTdHlsaW5nLCBrZXlzKSB7XG4gIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNiA+IDIgPyBfbGVuNiAtIDIgOiAwKSwgX2tleTYgPSAyOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG4gICAgYXJnc1tfa2V5NiAtIDJdID0gYXJndW1lbnRzW19rZXk2XTtcbiAgfVxuXG4gIGlmIChrZXlzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxpbmc7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICBrZXlzID0gW2tleXNdO1xuICB9XG5cbiAgdmFyIHN0eWxlcyA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIHZhciBwcm9wcyA9IHN0eWxlcy5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcykge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9iai5jbGFzc05hbWUgPSBbb2JqLmNsYXNzTmFtZSwgc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9IGVsc2UgaWYgKF90eXBlb2YocykgPT09ICdvYmplY3QnKSB7XG4gICAgICBvYmouc3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iai5zdHlsZSksIHMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9iaiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqKSwgcy5hcHBseSh2b2lkIDAsIFtvYmpdLmNvbmNhdChhcmdzKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH0sIHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIHN0eWxlOiB7fVxuICB9KTtcblxuICBpZiAoIXByb3BzLmNsYXNzTmFtZSkge1xuICAgIGRlbGV0ZSBwcm9wcy5jbGFzc05hbWU7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMocHJvcHMuc3R5bGUpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBwcm9wcy5zdHlsZTtcbiAgfVxuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbmV4cG9ydCB2YXIgaW52ZXJ0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBpbnZlcnRCYXNlMTZUaGVtZShiYXNlMTZUaGVtZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYmFzZTE2VGhlbWUpLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IC9eYmFzZS8udGVzdChrZXkpID8gaW52ZXJ0Q29sb3IoYmFzZTE2VGhlbWVba2V5XSkgOiBrZXkgPT09ICdzY2hlbWUnID8gYmFzZTE2VGhlbWVba2V5XSArICc6aW52ZXJ0ZWQnIDogYmFzZTE2VGhlbWVba2V5XSwgdDtcbiAgfSwge30pO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlU3R5bGluZyA9IGN1cnJ5KGZ1bmN0aW9uIChnZXRTdHlsaW5nRnJvbUJhc2UxNikge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciB0aGVtZU9yU3R5bGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHZhciBfb3B0aW9ucyRkZWZhdWx0QmFzZSA9IG9wdGlvbnMuZGVmYXVsdEJhc2UxNixcbiAgICAgIGRlZmF1bHRCYXNlMTYgPSBfb3B0aW9ucyRkZWZhdWx0QmFzZSA9PT0gdm9pZCAwID8gREVGQVVMVF9CQVNFMTYgOiBfb3B0aW9ucyRkZWZhdWx0QmFzZSxcbiAgICAgIF9vcHRpb25zJGJhc2UxNlRoZW1lcyA9IG9wdGlvbnMuYmFzZTE2VGhlbWVzLFxuICAgICAgYmFzZTE2VGhlbWVzID0gX29wdGlvbnMkYmFzZTE2VGhlbWVzID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkYmFzZTE2VGhlbWVzO1xuICB2YXIgYmFzZTE2VGhlbWUgPSBnZXRCYXNlMTZUaGVtZSh0aGVtZU9yU3R5bGluZywgYmFzZTE2VGhlbWVzKTtcblxuICBpZiAoYmFzZTE2VGhlbWUpIHtcbiAgICB0aGVtZU9yU3R5bGluZyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZTE2VGhlbWUpLCB0aGVtZU9yU3R5bGluZyk7XG4gIH1cblxuICB2YXIgdGhlbWUgPSBCQVNFMTZfS0VZUy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGtleSkge1xuICAgIHJldHVybiB0W2tleV0gPSB0aGVtZU9yU3R5bGluZ1trZXldIHx8IGRlZmF1bHRCYXNlMTZba2V5XSwgdDtcbiAgfSwge30pO1xuICB2YXIgY3VzdG9tU3R5bGluZyA9IE9iamVjdC5rZXlzKHRoZW1lT3JTdHlsaW5nKS5yZWR1Y2UoZnVuY3Rpb24gKHMsIGtleSkge1xuICAgIHJldHVybiBCQVNFMTZfS0VZUy5pbmRleE9mKGtleSkgPT09IC0xID8gKHNba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0sIHMpIDogcztcbiAgfSwge30pO1xuICB2YXIgZGVmYXVsdFN0eWxpbmcgPSBnZXRTdHlsaW5nRnJvbUJhc2UxNih0aGVtZSk7XG4gIHZhciBtZXJnZWRTdHlsaW5nID0gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5nLCBkZWZhdWx0U3R5bGluZyk7XG5cbiAgZm9yICh2YXIgX2xlbjcgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW43ID4gMyA/IF9sZW43IC0gMyA6IDApLCBfa2V5NyA9IDM7IF9rZXk3IDwgX2xlbjc7IF9rZXk3KyspIHtcbiAgICBhcmdzW19rZXk3IC0gM10gPSBhcmd1bWVudHNbX2tleTddO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJ5KGdldFN0eWxpbmdCeUtleXMsIDIpLmFwcGx5KHZvaWQgMCwgW21lcmdlZFN0eWxpbmddLmNvbmNhdChhcmdzKSk7XG59LCAzKTtcblxudmFyIGlzU3R5bGluZ0NvbmZpZyA9IGZ1bmN0aW9uIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkge1xuICByZXR1cm4gISF0aGVtZS5leHRlbmQ7XG59O1xuXG5leHBvcnQgdmFyIGdldEJhc2UxNlRoZW1lID0gZnVuY3Rpb24gZ2V0QmFzZTE2VGhlbWUodGhlbWUsIGJhc2UxNlRoZW1lcykge1xuICBpZiAodGhlbWUgJiYgaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSAmJiB0aGVtZS5leHRlbmQpIHtcbiAgICB0aGVtZSA9IHRoZW1lLmV4dGVuZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIF90aGVtZSRzcGxpdCA9IHRoZW1lLnNwbGl0KCc6JyksXG4gICAgICAgIF90aGVtZSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfdGhlbWUkc3BsaXQsIDIpLFxuICAgICAgICBfdGhlbWVOYW1lID0gX3RoZW1lJHNwbGl0MlswXSxcbiAgICAgICAgbW9kaWZpZXIgPSBfdGhlbWUkc3BsaXQyWzFdO1xuXG4gICAgaWYgKGJhc2UxNlRoZW1lcykge1xuICAgICAgdGhlbWUgPSBiYXNlMTZUaGVtZXNbX3RoZW1lTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gYmFzZTE2W190aGVtZU5hbWVdO1xuICAgIH1cblxuICAgIGlmIChtb2RpZmllciA9PT0gJ2ludmVydGVkJykge1xuICAgICAgdGhlbWUgPSBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoZW1lICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGVtZSwgJ2Jhc2UwMCcpID8gdGhlbWUgOiB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHZhciBpbnZlcnRUaGVtZSA9IGZ1bmN0aW9uIGludmVydFRoZW1lKHRoZW1lKSB7XG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoZW1lLCBcIjppbnZlcnRlZFwiKTtcbiAgfVxuXG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIGlmICh0eXBlb2YgdGhlbWUuZXh0ZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgICBleHRlbmQ6IFwiXCIuY29uY2F0KHRoZW1lLmV4dGVuZCwgXCI6aW52ZXJ0ZWRcIilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoZW1lKSwge30sIHtcbiAgICAgIGV4dGVuZDogaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUuZXh0ZW5kKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHRoZW1lKSB7XG4gICAgcmV0dXJuIGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGVtZTtcbn07XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJzsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuXG52YXIgSXRlbVJhbmdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhJdGVtUmFuZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSXRlbVJhbmdlKTtcblxuICBmdW5jdGlvbiBJdGVtUmFuZ2UocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSXRlbVJhbmdlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZXhwYW5kZWQ6ICFfdGhpcy5zdGF0ZS5leHBhbmRlZFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGV4cGFuZGVkOiBmYWxzZVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEl0ZW1SYW5nZSwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc3R5bGluZyA9IF90aGlzJHByb3BzLnN0eWxpbmcsXG4gICAgICAgICAgZnJvbSA9IF90aGlzJHByb3BzLmZyb20sXG4gICAgICAgICAgdG8gPSBfdGhpcyRwcm9wcy50byxcbiAgICAgICAgICByZW5kZXJDaGlsZE5vZGVzID0gX3RoaXMkcHJvcHMucmVuZGVyQ2hpbGROb2RlcyxcbiAgICAgICAgICBub2RlVHlwZSA9IF90aGlzJHByb3BzLm5vZGVUeXBlO1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZXhwYW5kZWQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwgcmVuZGVyQ2hpbGROb2Rlcyh0aGlzLnByb3BzLCBmcm9tLCB0bykpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIHN0eWxpbmcoJ2l0ZW1SYW5nZScsIHRoaXMuc3RhdGUuZXhwYW5kZWQpLCB7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OQXJyb3csIHtcbiAgICAgICAgbm9kZVR5cGU6IG5vZGVUeXBlLFxuICAgICAgICBzdHlsaW5nOiBzdHlsaW5nLFxuICAgICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2ssXG4gICAgICAgIGFycm93U3R5bGU6IFwiZG91YmxlXCJcbiAgICAgIH0pLCBcIlwiLmNvbmNhdChmcm9tLCBcIiAuLi4gXCIpLmNvbmNhdCh0bykpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJdGVtUmFuZ2U7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShJdGVtUmFuZ2UsIFwicHJvcFR5cGVzXCIsIHtcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZnJvbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0bzogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByZW5kZXJDaGlsZE5vZGVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59KTtcblxuZXhwb3J0IHsgSXRlbVJhbmdlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHJldHVybiBcIlwiLmNvbmNhdChkYXRhLmxlbmd0aCwgXCIgXCIpLmNvbmNhdChkYXRhLmxlbmd0aCAhPT0gMSA/ICdpdGVtcycgOiAnaXRlbScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIEFycmF5XG52YXIgSlNPTkFycmF5Tm9kZSA9IGZ1bmN0aW9uIEpTT05BcnJheU5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIkFycmF5XCIsXG4gICAgbm9kZVR5cGVJbmRpY2F0b3I6IFwiW11cIixcbiAgICBjcmVhdGVJdGVtU3RyaW5nOiBjcmVhdGVJdGVtU3RyaW5nLFxuICAgIGV4cGFuZGFibGU6IGRhdGEubGVuZ3RoID4gMFxuICB9KSk7XG59O1xuXG5KU09OQXJyYXlOb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLmFycmF5XG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycmF5Tm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbnZhciBKU09OQXJyb3cgPSBmdW5jdGlvbiBKU09OQXJyb3coX3JlZikge1xuICB2YXIgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGFycm93U3R5bGUgPSBfcmVmLmFycm93U3R5bGUsXG4gICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICBub2RlVHlwZSA9IF9yZWYubm9kZVR5cGUsXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIHN0eWxpbmcoJ2Fycm93Q29udGFpbmVyJywgYXJyb3dTdHlsZSksIHtcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBzdHlsaW5nKFsnYXJyb3cnLCAnYXJyb3dTaWduJ10sIG5vZGVUeXBlLCBleHBhbmRlZCwgYXJyb3dTdHlsZSksIFwiXFx1MjVCNlwiLCBhcnJvd1N0eWxlID09PSAnZG91YmxlJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBzdHlsaW5nKFsnYXJyb3dTaWduJywgJ2Fycm93U2lnbklubmVyJ10pLCBcIlxcdTI1QjZcIikpKTtcbn07XG5cbkpTT05BcnJvdy5wcm9wVHlwZXMgPSB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGFycm93U3R5bGU6IFByb3BUeXBlcy5vbmVPZihbJ3NpbmdsZScsICdkb3VibGUnXSksXG4gIGV4cGFuZGVkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59O1xuSlNPTkFycm93LmRlZmF1bHRQcm9wcyA9IHtcbiAgYXJyb3dTdHlsZTogJ3NpbmdsZSdcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OQXJyb3c7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEpTT05OZXN0ZWROb2RlIGZyb20gJy4vSlNPTk5lc3RlZE5vZGUnO1xuXG4vLyBSZXR1cm5zIHRoZSBcIm4gSXRlbXNcIiBzdHJpbmcgZm9yIHRoaXMgbm9kZSxcbi8vIGdlbmVyYXRpbmcgYW5kIGNhY2hpbmcgaXQgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuXG5mdW5jdGlvbiBjcmVhdGVJdGVtU3RyaW5nKGRhdGEsIGxpbWl0KSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIHZhciBoYXNNb3JlID0gZmFsc2U7XG5cbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKGRhdGEuc2l6ZSkpIHtcbiAgICBjb3VudCA9IGRhdGEuc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YSksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgIGlmIChsaW1pdCAmJiBjb3VudCArIDEgPiBsaW1pdCkge1xuICAgICAgICAgIGhhc01vcmUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY291bnQgKz0gMTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFwiXCIuY29uY2F0KGhhc01vcmUgPyAnPicgOiAnJykuY29uY2F0KGNvdW50LCBcIiBcIikuY29uY2F0KGNvdW50ICE9PSAxID8gJ2VudHJpZXMnIDogJ2VudHJ5Jyk7XG59XG5cbi8vIENvbmZpZ3VyZXMgPEpTT05OZXN0ZWROb2RlPiB0byByZW5kZXIgYW4gaXRlcmFibGVcbnZhciBKU09OSXRlcmFibGVOb2RlID0gZnVuY3Rpb24gSlNPTkl0ZXJhYmxlTm9kZShfcmVmKSB7XG4gIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBfcmVmKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk5lc3RlZE5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIG5vZGVUeXBlOiBcIkl0ZXJhYmxlXCIsXG4gICAgbm9kZVR5cGVJbmRpY2F0b3I6IFwiKClcIixcbiAgICBjcmVhdGVJdGVtU3RyaW5nOiBjcmVhdGVJdGVtU3RyaW5nXG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEpTT05JdGVyYWJsZU5vZGU7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEpTT05BcnJvdyBmcm9tICcuL0pTT05BcnJvdyc7XG5pbXBvcnQgZ2V0Q29sbGVjdGlvbkVudHJpZXMgZnJvbSAnLi9nZXRDb2xsZWN0aW9uRW50cmllcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgSXRlbVJhbmdlIGZyb20gJy4vSXRlbVJhbmdlJztcblxuZnVuY3Rpb24gaXNSYW5nZShyYW5nZU9yRW50cnkpIHtcbiAgcmV0dXJuIHJhbmdlT3JFbnRyeS50byAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDaGlsZE5vZGVzKHByb3BzLCBmcm9tLCB0bykge1xuICB2YXIgbm9kZVR5cGUgPSBwcm9wcy5ub2RlVHlwZSxcbiAgICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgICAgY29sbGVjdGlvbkxpbWl0ID0gcHJvcHMuY29sbGVjdGlvbkxpbWl0LFxuICAgICAgY2lyY3VsYXJDYWNoZSA9IHByb3BzLmNpcmN1bGFyQ2FjaGUsXG4gICAgICBrZXlQYXRoID0gcHJvcHMua2V5UGF0aCxcbiAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgc29ydE9iamVjdEtleXMgPSBwcm9wcy5zb3J0T2JqZWN0S2V5cztcbiAgdmFyIGNoaWxkTm9kZXMgPSBbXTtcbiAgZ2V0Q29sbGVjdGlvbkVudHJpZXMobm9kZVR5cGUsIGRhdGEsIHNvcnRPYmplY3RLZXlzLCBjb2xsZWN0aW9uTGltaXQsIGZyb20sIHRvKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIGlmIChpc1JhbmdlKGVudHJ5KSkge1xuICAgICAgY2hpbGROb2Rlcy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtUmFuZ2UsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBrZXk6IFwiSXRlbVJhbmdlLS1cIi5jb25jYXQoZW50cnkuZnJvbSwgXCItXCIpLmNvbmNhdChlbnRyeS50byksXG4gICAgICAgIGZyb206IGVudHJ5LmZyb20sXG4gICAgICAgIHRvOiBlbnRyeS50byxcbiAgICAgICAgcmVuZGVyQ2hpbGROb2RlczogcmVuZGVyQ2hpbGROb2Rlc1xuICAgICAgfSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGtleSA9IGVudHJ5LmtleSxcbiAgICAgICAgICB2YWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgdmFyIGlzQ2lyY3VsYXIgPSBjaXJjdWxhckNhY2hlLmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBwb3N0cHJvY2Vzc1ZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICBjb2xsZWN0aW9uTGltaXQ6IGNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAga2V5OiBcIk5vZGUtLVwiLmNvbmNhdChrZXkpLFxuICAgICAgICBrZXlQYXRoOiBba2V5XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleVBhdGgpKSxcbiAgICAgICAgdmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUodmFsdWUpLFxuICAgICAgICBjaXJjdWxhckNhY2hlOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNpcmN1bGFyQ2FjaGUpLCBbdmFsdWVdKSxcbiAgICAgICAgaXNDaXJjdWxhcjogaXNDaXJjdWxhcixcbiAgICAgICAgaGlkZVJvb3Q6IGZhbHNlXG4gICAgICB9KSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjaGlsZE5vZGVzO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICAvLyBjYWxjdWxhdGUgaW5kaXZpZHVhbCBub2RlIGV4cGFuc2lvbiBpZiBuZWNlc3NhcnlcbiAgdmFyIGV4cGFuZGVkID0gIXByb3BzLmlzQ2lyY3VsYXIgPyBwcm9wcy5zaG91bGRFeHBhbmROb2RlKHByb3BzLmtleVBhdGgsIHByb3BzLmRhdGEsIHByb3BzLmxldmVsKSA6IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICB9O1xufVxuXG52YXIgSlNPTk5lc3RlZE5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEpTT05OZXN0ZWROb2RlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEpTT05OZXN0ZWROb2RlKTtcblxuICBmdW5jdGlvbiBKU09OTmVzdGVkTm9kZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBKU09OTmVzdGVkTm9kZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMuZXhwYW5kYWJsZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZXhwYW5kZWQ6ICFfdGhpcy5zdGF0ZS5leHBhbmRlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OTmVzdGVkTm9kZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgbmV4dFN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKTtcblxuICAgICAgaWYgKGdldFN0YXRlRnJvbVByb3BzKHRoaXMucHJvcHMpLmV4cGFuZGVkICE9PSBuZXh0U3RhdGUuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRDb21wb25lbnRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSAhPT0gJ2NpcmN1bGFyQ2FjaGUnICYmIChrZXkgPT09ICdrZXlQYXRoJyA/IG5leHRQcm9wc1trZXldLmpvaW4oJy8nKSAhPT0gX3RoaXMyLnByb3BzW2tleV0uam9pbignLycpIDogbmV4dFByb3BzW2tleV0gIT09IF90aGlzMi5wcm9wc1trZXldKTtcbiAgICAgIH0pIHx8IG5leHRTdGF0ZS5leHBhbmRlZCAhPT0gdGhpcy5zdGF0ZS5leHBhbmRlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgZ2V0SXRlbVN0cmluZyA9IF90aGlzJHByb3BzLmdldEl0ZW1TdHJpbmcsXG4gICAgICAgICAgbm9kZVR5cGVJbmRpY2F0b3IgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZUluZGljYXRvcixcbiAgICAgICAgICBub2RlVHlwZSA9IF90aGlzJHByb3BzLm5vZGVUeXBlLFxuICAgICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgY3JlYXRlSXRlbVN0cmluZyA9IF90aGlzJHByb3BzLmNyZWF0ZUl0ZW1TdHJpbmcsXG4gICAgICAgICAgc3R5bGluZyA9IF90aGlzJHByb3BzLnN0eWxpbmcsXG4gICAgICAgICAgY29sbGVjdGlvbkxpbWl0ID0gX3RoaXMkcHJvcHMuY29sbGVjdGlvbkxpbWl0LFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIGxhYmVsUmVuZGVyZXIgPSBfdGhpcyRwcm9wcy5sYWJlbFJlbmRlcmVyLFxuICAgICAgICAgIGV4cGFuZGFibGUgPSBfdGhpcyRwcm9wcy5leHBhbmRhYmxlO1xuICAgICAgdmFyIGV4cGFuZGVkID0gdGhpcy5zdGF0ZS5leHBhbmRlZDtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gZXhwYW5kZWQgfHwgaGlkZVJvb3QgJiYgdGhpcy5wcm9wcy5sZXZlbCA9PT0gMCA/IHJlbmRlckNoaWxkTm9kZXMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLnByb3BzKSwge30sIHtcbiAgICAgICAgbGV2ZWw6IHRoaXMucHJvcHMubGV2ZWwgKyAxXG4gICAgICB9KSkgOiBudWxsO1xuICAgICAgdmFyIGl0ZW1UeXBlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHN0eWxpbmcoJ25lc3RlZE5vZGVJdGVtVHlwZScsIGV4cGFuZGVkKSwgbm9kZVR5cGVJbmRpY2F0b3IpO1xuICAgICAgdmFyIHJlbmRlcmVkSXRlbVN0cmluZyA9IGdldEl0ZW1TdHJpbmcobm9kZVR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBjcmVhdGVJdGVtU3RyaW5nKGRhdGEsIGNvbGxlY3Rpb25MaW1pdCksIGtleVBhdGgpO1xuICAgICAgdmFyIHN0eWxpbmdBcmdzID0gW2tleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZV07XG4gICAgICByZXR1cm4gaGlkZVJvb3QgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsncm9vdE5vZGVDaGlsZHJlbiddLmNvbmNhdChzdHlsaW5nQXJncykpLCByZW5kZXJlZENoaWxkcmVuKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ25lc3RlZE5vZGUnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgZXhwYW5kYWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OQXJyb3csIHtcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgbm9kZVR5cGU6IG5vZGVUeXBlLFxuICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgW1snbGFiZWwnLCAnbmVzdGVkTm9kZUxhYmVsJ11dLmNvbmNhdChzdHlsaW5nQXJncykpLCB7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBsYWJlbFJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgc3R5bGluZ0FyZ3MpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlSXRlbVN0cmluZyddLmNvbmNhdChzdHlsaW5nQXJncykpLCB7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCByZW5kZXJlZEl0ZW1TdHJpbmcpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ25lc3RlZE5vZGVDaGlsZHJlbiddLmNvbmNhdChzdHlsaW5nQXJncykpLCByZW5kZXJlZENoaWxkcmVuKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEpTT05OZXN0ZWROb2RlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSlNPTk5lc3RlZE5vZGUsIFwicHJvcFR5cGVzXCIsIHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGVJbmRpY2F0b3I6IFByb3BUeXBlcy5hbnksXG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGRhdGE6IFByb3BUeXBlcy5hbnksXG4gIGhpZGVSb290OiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBjcmVhdGVJdGVtU3RyaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjb2xsZWN0aW9uTGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSkuaXNSZXF1aXJlZCxcbiAgbGFiZWxSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc2hvdWxkRXhwYW5kTm9kZTogUHJvcFR5cGVzLmZ1bmMsXG4gIGxldmVsOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKSxcbiAgaXNDaXJjdWxhcjogUHJvcFR5cGVzLmJvb2wsXG4gIGV4cGFuZGFibGU6IFByb3BUeXBlcy5ib29sXG59KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGRhdGE6IFtdLFxuICBjaXJjdWxhckNhY2hlOiBbXSxcbiAgbGV2ZWw6IDAsXG4gIGV4cGFuZGFibGU6IHRydWVcbn0pO1xuXG5leHBvcnQgeyBKU09OTmVzdGVkTm9kZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJnZXRJdGVtU3RyaW5nXCIsIFwia2V5UGF0aFwiLCBcImxhYmVsUmVuZGVyZXJcIiwgXCJzdHlsaW5nXCIsIFwidmFsdWVcIiwgXCJ2YWx1ZVJlbmRlcmVyXCIsIFwiaXNDdXN0b21Ob2RlXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBvYmpUeXBlIGZyb20gJy4vb2JqVHlwZSc7XG5pbXBvcnQgSlNPTk9iamVjdE5vZGUgZnJvbSAnLi9KU09OT2JqZWN0Tm9kZSc7XG5pbXBvcnQgSlNPTkFycmF5Tm9kZSBmcm9tICcuL0pTT05BcnJheU5vZGUnO1xuaW1wb3J0IEpTT05JdGVyYWJsZU5vZGUgZnJvbSAnLi9KU09OSXRlcmFibGVOb2RlJztcbmltcG9ydCBKU09OVmFsdWVOb2RlIGZyb20gJy4vSlNPTlZhbHVlTm9kZSc7XG5cbnZhciBKU09OTm9kZSA9IGZ1bmN0aW9uIEpTT05Ob2RlKF9yZWYpIHtcbiAgdmFyIGdldEl0ZW1TdHJpbmcgPSBfcmVmLmdldEl0ZW1TdHJpbmcsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgbGFiZWxSZW5kZXJlciA9IF9yZWYubGFiZWxSZW5kZXJlcixcbiAgICAgIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgICB2YWx1ZVJlbmRlcmVyID0gX3JlZi52YWx1ZVJlbmRlcmVyLFxuICAgICAgaXNDdXN0b21Ob2RlID0gX3JlZi5pc0N1c3RvbU5vZGUsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgdmFyIG5vZGVUeXBlID0gaXNDdXN0b21Ob2RlKHZhbHVlKSA/ICdDdXN0b20nIDogb2JqVHlwZSh2YWx1ZSk7XG4gIHZhciBzaW1wbGVOb2RlUHJvcHMgPSB7XG4gICAgZ2V0SXRlbVN0cmluZzogZ2V0SXRlbVN0cmluZyxcbiAgICBrZXk6IGtleVBhdGhbMF0sXG4gICAga2V5UGF0aDoga2V5UGF0aCxcbiAgICBsYWJlbFJlbmRlcmVyOiBsYWJlbFJlbmRlcmVyLFxuICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICBzdHlsaW5nOiBzdHlsaW5nLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICB2YWx1ZVJlbmRlcmVyOiB2YWx1ZVJlbmRlcmVyXG4gIH07XG5cbiAgdmFyIG5lc3RlZE5vZGVQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXN0KSwgc2ltcGxlTm9kZVByb3BzKSwge30sIHtcbiAgICBkYXRhOiB2YWx1ZSxcbiAgICBpc0N1c3RvbU5vZGU6IGlzQ3VzdG9tTm9kZVxuICB9KTtcblxuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgY2FzZSAnV2Vha01hcCc6XG4gICAgY2FzZSAnV2Vha1NldCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk9iamVjdE5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycmF5Tm9kZSwgbmVzdGVkTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0l0ZXJhYmxlJzpcbiAgICBjYXNlICdNYXAnOlxuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkl0ZXJhYmxlTm9kZSwgbmVzdGVkTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIocmF3KSB7XG4gICAgICAgICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdChyYXcsIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBzaW1wbGVOb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIocmF3KSB7XG4gICAgICAgICAgcmV0dXJuIHJhdyA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnTnVsbCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnVW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcigpIHtcbiAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnQ3VzdG9tJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBzaW1wbGVOb2RlUHJvcHMpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcigpIHtcbiAgICAgICAgICByZXR1cm4gXCI8XCIuY29uY2F0KG5vZGVUeXBlLCBcIj5cIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgfVxufTtcblxuSlNPTk5vZGUucHJvcFR5cGVzID0ge1xuICBnZXRJdGVtU3RyaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkuaXNSZXF1aXJlZCkuaXNSZXF1aXJlZCxcbiAgbGFiZWxSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIHZhbHVlUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzQ3VzdG9tTm9kZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05Ob2RlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiXTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEpTT05OZXN0ZWROb2RlIGZyb20gJy4vSlNPTk5lc3RlZE5vZGUnO1xuXG4vLyBSZXR1cm5zIHRoZSBcIm4gSXRlbXNcIiBzdHJpbmcgZm9yIHRoaXMgbm9kZSxcbi8vIGdlbmVyYXRpbmcgYW5kIGNhY2hpbmcgaXQgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuXG5mdW5jdGlvbiBjcmVhdGVJdGVtU3RyaW5nKGRhdGEpIHtcbiAgdmFyIGxlbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEpLmxlbmd0aDtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KGxlbiwgXCIgXCIpLmNvbmNhdChsZW4gIT09IDEgPyAna2V5cycgOiAna2V5Jyk7XG59XG5cbi8vIENvbmZpZ3VyZXMgPEpTT05OZXN0ZWROb2RlPiB0byByZW5kZXIgYW4gT2JqZWN0XG52YXIgSlNPTk9iamVjdE5vZGUgPSBmdW5jdGlvbiBKU09OT2JqZWN0Tm9kZShfcmVmKSB7XG4gIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk5lc3RlZE5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIGRhdGE6IGRhdGEsXG4gICAgbm9kZVR5cGU6IFwiT2JqZWN0XCIsXG4gICAgbm9kZVR5cGVJbmRpY2F0b3I6IHByb3BzLm5vZGVUeXBlID09PSAnRXJyb3InID8gJ0Vycm9yKCknIDogJ3t9JyxcbiAgICBjcmVhdGVJdGVtU3RyaW5nOiBjcmVhdGVJdGVtU3RyaW5nLFxuICAgIGV4cGFuZGFibGU6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEpLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTk9iamVjdE5vZGUucHJvcFR5cGVzID0ge1xuICBkYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTk9iamVjdE5vZGU7IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbnZhciBKU09OVmFsdWVOb2RlID0gZnVuY3Rpb24gSlNPTlZhbHVlTm9kZShfcmVmKSB7XG4gIHZhciBub2RlVHlwZSA9IF9yZWYubm9kZVR5cGUsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgbGFiZWxSZW5kZXJlciA9IF9yZWYubGFiZWxSZW5kZXJlcixcbiAgICAgIGtleVBhdGggPSBfcmVmLmtleVBhdGgsXG4gICAgICB2YWx1ZVJlbmRlcmVyID0gX3JlZi52YWx1ZVJlbmRlcmVyLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgX3JlZiR2YWx1ZUdldHRlciA9IF9yZWYudmFsdWVHZXR0ZXIsXG4gICAgICB2YWx1ZUdldHRlciA9IF9yZWYkdmFsdWVHZXR0ZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSA6IF9yZWYkdmFsdWVHZXR0ZXI7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHN0eWxpbmcoJ3ZhbHVlJywgbm9kZVR5cGUsIGtleVBhdGgpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHN0eWxpbmcoWydsYWJlbCcsICd2YWx1ZUxhYmVsJ10sIG5vZGVUeXBlLCBrZXlQYXRoKSwgbGFiZWxSZW5kZXJlcihrZXlQYXRoLCBub2RlVHlwZSwgZmFsc2UsIGZhbHNlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCd2YWx1ZVRleHQnLCBub2RlVHlwZSwga2V5UGF0aCksIHZhbHVlUmVuZGVyZXIuYXBwbHkodm9pZCAwLCBbdmFsdWVHZXR0ZXIodmFsdWUpLCB2YWx1ZV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSkpKSk7XG59O1xuXG5KU09OVmFsdWVOb2RlLnByb3BUeXBlcyA9IHtcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbGFiZWxSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIHZhbHVlUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZUdldHRlcjogUHJvcFR5cGVzLmZ1bmNcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OVmFsdWVOb2RlOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlU3R5bGluZyB9IGZyb20gJ3JlYWN0LWJhc2UxNi1zdHlsaW5nJztcbmltcG9ydCBzb2xhcml6ZWQgZnJvbSAnLi90aGVtZXMvc29sYXJpemVkJztcblxudmFyIGNvbG9yTWFwID0gZnVuY3Rpb24gY29sb3JNYXAodGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBCQUNLR1JPVU5EX0NPTE9SOiB0aGVtZS5iYXNlMDAsXG4gICAgVEVYVF9DT0xPUjogdGhlbWUuYmFzZTA3LFxuICAgIFNUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIERBVEVfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBOVU1CRVJfQ09MT1I6IHRoZW1lLmJhc2UwOSxcbiAgICBCT09MRUFOX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgTlVMTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFVOREVGSU5FRF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIEZVTkNUSU9OX0NPTE9SOiB0aGVtZS5iYXNlMDgsXG4gICAgU1lNQk9MX0NPTE9SOiB0aGVtZS5iYXNlMDgsXG4gICAgTEFCRUxfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBBUlJPV19DT0xPUjogdGhlbWUuYmFzZTBELFxuICAgIElURU1fU1RSSU5HX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgSVRFTV9TVFJJTkdfRVhQQU5ERURfQ09MT1I6IHRoZW1lLmJhc2UwM1xuICB9O1xufTtcblxudmFyIHZhbHVlQ29sb3JNYXAgPSBmdW5jdGlvbiB2YWx1ZUNvbG9yTWFwKGNvbG9ycykge1xuICByZXR1cm4ge1xuICAgIFN0cmluZzogY29sb3JzLlNUUklOR19DT0xPUixcbiAgICBEYXRlOiBjb2xvcnMuREFURV9DT0xPUixcbiAgICBOdW1iZXI6IGNvbG9ycy5OVU1CRVJfQ09MT1IsXG4gICAgQm9vbGVhbjogY29sb3JzLkJPT0xFQU5fQ09MT1IsXG4gICAgTnVsbDogY29sb3JzLk5VTExfQ09MT1IsXG4gICAgVW5kZWZpbmVkOiBjb2xvcnMuVU5ERUZJTkVEX0NPTE9SLFxuICAgIEZ1bmN0aW9uOiBjb2xvcnMuRlVOQ1RJT05fQ09MT1IsXG4gICAgU3ltYm9sOiBjb2xvcnMuU1lNQk9MX0NPTE9SXG4gIH07XG59O1xuXG52YXIgZ2V0RGVmYXVsdFRoZW1lU3R5bGluZyA9IGZ1bmN0aW9uIGdldERlZmF1bHRUaGVtZVN0eWxpbmcodGhlbWUpIHtcbiAgdmFyIGNvbG9ycyA9IGNvbG9yTWFwKHRoZW1lKTtcbiAgcmV0dXJuIHtcbiAgICB0cmVlOiB7XG4gICAgICBib3JkZXI6IDAsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgbWFyZ2luVG9wOiAnMC41ZW0nLFxuICAgICAgbWFyZ2luQm90dG9tOiAnMC41ZW0nLFxuICAgICAgbWFyZ2luTGVmdDogJzAuMTI1ZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJyxcbiAgICAgIE1velVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3JzLkJBQ0tHUk9VTkRfQ09MT1JcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShfcmVmLCBub2RlVHlwZSwga2V5UGF0aCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiAnMC4yNWVtJyxcbiAgICAgICAgICBwYWRkaW5nUmlnaHQ6IDAsXG4gICAgICAgICAgbWFyZ2luTGVmdDogJzAuODc1ZW0nLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6ICd0ZXh0JyxcbiAgICAgICAgICBNb3pVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgd29yZFdyYXA6ICdicmVhay13b3JkJyxcbiAgICAgICAgICBwYWRkaW5nTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzIuMTI1ZW0nIDogJzEuMjVlbScsXG4gICAgICAgICAgdGV4dEluZGVudDogJy0wLjVlbScsXG4gICAgICAgICAgd29yZEJyZWFrOiAnYnJlYWstYWxsJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGxhYmVsOiB7XG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIGNvbG9yOiBjb2xvcnMuTEFCRUxfQ09MT1JcbiAgICB9LFxuICAgIHZhbHVlTGFiZWw6IHtcbiAgICAgIG1hcmdpbjogJzAgMC41ZW0gMCAwJ1xuICAgIH0sXG4gICAgdmFsdWVUZXh0OiBmdW5jdGlvbiB2YWx1ZVRleHQoX3JlZjIsIG5vZGVUeXBlKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmMi5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBjb2xvcjogdmFsdWVDb2xvck1hcChjb2xvcnMpW25vZGVUeXBlXVxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGl0ZW1SYW5nZTogZnVuY3Rpb24gaXRlbVJhbmdlKHN0eWxpbmcsIGV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHBhZGRpbmdUb3A6IGV4cGFuZGVkID8gMCA6ICcwLjI1ZW0nLFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgIGNvbG9yOiBjb2xvcnMuTEFCRUxfQ09MT1JcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93OiBmdW5jdGlvbiBhcnJvdyhfcmVmMywgbm9kZVR5cGUsIGV4cGFuZGVkKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmMy5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBtYXJnaW5MZWZ0OiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgV2Via2l0VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBNb3pUcmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zZm9ybTogZXhwYW5kZWQgPyAncm90YXRlWig5MGRlZyknIDogJ3JvdGF0ZVooMGRlZyknLFxuICAgICAgICAgIE1velRyYW5zZm9ybTogZXhwYW5kZWQgPyAncm90YXRlWig5MGRlZyknIDogJ3JvdGF0ZVooMGRlZyknLFxuICAgICAgICAgIHRyYW5zZm9ybTogZXhwYW5kZWQgPyAncm90YXRlWig5MGRlZyknIDogJ3JvdGF0ZVooMGRlZyknLFxuICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzQ1JSA1MCUnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zZm9ybU9yaWdpbjogJzQ1JSA1MCUnLFxuICAgICAgICAgIE1velRyYW5zZm9ybU9yaWdpbjogJzQ1JSA1MCUnLFxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6ICcxLjFlbScsXG4gICAgICAgICAgZm9udFNpemU6ICcwLjc1ZW0nXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXJyb3dDb250YWluZXI6IGZ1bmN0aW9uIGFycm93Q29udGFpbmVyKF9yZWY0LCBhcnJvd1N0eWxlKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmNC5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICBwYWRkaW5nUmlnaHQ6ICcwLjVlbScsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGFycm93U3R5bGUgPT09ICdkb3VibGUnID8gJzFlbScgOiAwLFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXJyb3dTaWduOiB7XG4gICAgICBjb2xvcjogY29sb3JzLkFSUk9XX0NPTE9SXG4gICAgfSxcbiAgICBhcnJvd1NpZ25Jbm5lcjoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAnLTAuNGVtJ1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZTogZnVuY3Rpb24gbmVzdGVkTm9kZShfcmVmNSwga2V5UGF0aCwgbm9kZVR5cGUsIGV4cGFuZGVkLCBleHBhbmRhYmxlKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmNS5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBwYWRkaW5nVG9wOiAnMC4yNWVtJyxcbiAgICAgICAgICBtYXJnaW5MZWZ0OiBrZXlQYXRoLmxlbmd0aCA+IDEgPyAnMC44NzVlbScgOiAwLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiAhZXhwYW5kYWJsZSA/ICcxLjEyNWVtJyA6IDBcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICByb290Tm9kZToge1xuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpbjogMFxuICAgIH0sXG4gICAgbmVzdGVkTm9kZUxhYmVsOiBmdW5jdGlvbiBuZXN0ZWROb2RlTGFiZWwoX3JlZjYsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgV2Via2l0VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBNb3pVc2VyU2VsZWN0OiBleHBhbmRhYmxlID8gJ2luaGVyaXQnIDogJ3RleHQnLFxuICAgICAgICAgIGN1cnNvcjogZXhwYW5kYWJsZSA/ICdwb2ludGVyJyA6ICdkZWZhdWx0J1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVJdGVtU3RyaW5nOiBmdW5jdGlvbiBuZXN0ZWROb2RlSXRlbVN0cmluZyhfcmVmNywga2V5UGF0aCwgbm9kZVR5cGUsIGV4cGFuZGVkKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmNy5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBwYWRkaW5nTGVmdDogJzAuNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgICBjb2xvcjogZXhwYW5kZWQgPyBjb2xvcnMuSVRFTV9TVFJJTkdfRVhQQU5ERURfQ09MT1IgOiBjb2xvcnMuSVRFTV9TVFJJTkdfQ09MT1JcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVR5cGU6IHtcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjNlbScsXG4gICAgICBtYXJnaW5SaWdodDogJzAuM2VtJ1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUNoaWxkcmVuOiBmdW5jdGlvbiBuZXN0ZWROb2RlQ2hpbGRyZW4oX3JlZjgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjguc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICAgICAgZGlzcGxheTogZXhwYW5kZWQgPyAnYmxvY2snIDogJ25vbmUnXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGVDaGlsZHJlbjoge1xuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIGxpc3RTdHlsZTogJ25vbmUnXG4gICAgfVxuICB9O1xufTtcblxudmFyIGNyZWF0ZVN0eWxpbmdGcm9tVGhlbWUgPSBjcmVhdGVTdHlsaW5nKGdldERlZmF1bHRUaGVtZVN0eWxpbmcsIHtcbiAgZGVmYXVsdEJhc2UxNjogc29sYXJpemVkXG59KTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN0eWxpbmdGcm9tVGhlbWU7IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIGdldExlbmd0aCh0eXBlLCBjb2xsZWN0aW9uKSB7XG4gIGlmICh0eXBlID09PSAnT2JqZWN0Jykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIEluZmluaXR5O1xufVxuXG5mdW5jdGlvbiBpc0l0ZXJhYmxlTWFwKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBjb2xsZWN0aW9uLnNldCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gZ2V0RW50cmllcyh0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cykge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBJbmZpbml0eTtcbiAgdmFyIHJlcztcblxuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbGxlY3Rpb24pO1xuXG4gICAgaWYgKHNvcnRPYmplY3RLZXlzKSB7XG4gICAgICBrZXlzLnNvcnQoc29ydE9iamVjdEtleXMgPT09IHRydWUgPyB1bmRlZmluZWQgOiBzb3J0T2JqZWN0S2V5cyk7XG4gICAgfVxuXG4gICAga2V5cyA9IGtleXMuc2xpY2UoZnJvbSwgdG8gKyAxKTtcbiAgICByZXMgPSB7XG4gICAgICBlbnRyaWVzOiBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IGNvbGxlY3Rpb25ba2V5XVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdBcnJheScpIHtcbiAgICByZXMgPSB7XG4gICAgICBlbnRyaWVzOiBjb2xsZWN0aW9uLnNsaWNlKGZyb20sIHRvICsgMSkubWFwKGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogaWR4ICsgZnJvbSxcbiAgICAgICAgICB2YWx1ZTogdmFsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICB2YXIgZG9uZSA9IHRydWU7XG4gICAgdmFyIGlzTWFwID0gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKTtcblxuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjb2xsZWN0aW9uKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAoaWR4ID4gdG8pIHtcbiAgICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJvbSA8PSBpZHgpIHtcbiAgICAgICAgICBpZiAoaXNNYXAgJiYgQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzBdID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaXRlbVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGl0ZW1bMF0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1bMV1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogXCJbZW50cnkgXCIuY29uY2F0KGlkeCwgXCJdXCIpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAnW2tleV0nOiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgICAgJ1t2YWx1ZV0nOiBpdGVtWzFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAga2V5OiBpZHgsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZHgrKztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuXG4gICAgcmVzID0ge1xuICAgICAgaGFzTW9yZTogIWRvbmUsXG4gICAgICBlbnRyaWVzOiBlbnRyaWVzXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFJhbmdlcyhmcm9tLCB0bywgbGltaXQpIHtcbiAgdmFyIHJhbmdlcyA9IFtdO1xuXG4gIHdoaWxlICh0byAtIGZyb20gPiBsaW1pdCAqIGxpbWl0KSB7XG4gICAgbGltaXQgPSBsaW1pdCAqIGxpbWl0O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGZyb207IGkgPD0gdG87IGkgKz0gbGltaXQpIHtcbiAgICByYW5nZXMucHVzaCh7XG4gICAgICBmcm9tOiBpLFxuICAgICAgdG86IE1hdGgubWluKHRvLCBpICsgbGltaXQgLSAxKVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbkVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMsIGxpbWl0KSB7XG4gIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IEluZmluaXR5O1xuICB2YXIgZ2V0RW50cmllc0JvdW5kID0gZ2V0RW50cmllcy5iaW5kKG51bGwsIHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzKTtcblxuICBpZiAoIWxpbWl0KSB7XG4gICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZCgpLmVudHJpZXM7XG4gIH1cblxuICB2YXIgaXNTdWJzZXQgPSB0byA8IEluZmluaXR5O1xuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4odG8gLSBmcm9tLCBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikpO1xuXG4gIGlmICh0eXBlICE9PSAnSXRlcmFibGUnKSB7XG4gICAgaWYgKGxlbmd0aCA8PSBsaW1pdCB8fCBsaW1pdCA8IDcpIHtcbiAgICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoZnJvbSwgdG8pLmVudHJpZXM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgJiYgIWlzU3Vic2V0KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsaW1pdGVkRW50cmllcztcblxuICBpZiAodHlwZSA9PT0gJ0l0ZXJhYmxlJykge1xuICAgIHZhciBfZ2V0RW50cmllc0JvdW5kID0gZ2V0RW50cmllc0JvdW5kKGZyb20sIGZyb20gKyBsaW1pdCAtIDEpLFxuICAgICAgICBoYXNNb3JlID0gX2dldEVudHJpZXNCb3VuZC5oYXNNb3JlLFxuICAgICAgICBlbnRyaWVzID0gX2dldEVudHJpZXNCb3VuZC5lbnRyaWVzO1xuXG4gICAgbGltaXRlZEVudHJpZXMgPSBoYXNNb3JlID8gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShlbnRyaWVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdldFJhbmdlcyhmcm9tICsgbGltaXQsIGZyb20gKyAyICogbGltaXQgLSAxLCBsaW1pdCkpKSA6IGVudHJpZXM7XG4gIH0gZWxzZSB7XG4gICAgbGltaXRlZEVudHJpZXMgPSBpc1N1YnNldCA/IGdldFJhbmdlcyhmcm9tLCB0bywgbGltaXQpIDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShnZXRFbnRyaWVzQm91bmQoMCwgbGltaXQgLSA1KS5lbnRyaWVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdldFJhbmdlcyhsaW1pdCAtIDQsIGxlbmd0aCAtIDUsIGxpbWl0KSksIF90b0NvbnN1bWFibGVBcnJheShnZXRFbnRyaWVzQm91bmQobGVuZ3RoIC0gNCwgbGVuZ3RoIC0gMSkuZW50cmllcykpO1xuICB9XG5cbiAgcmV0dXJuIGxpbWl0ZWRFbnRyaWVzO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCIsIFwia2V5UGF0aFwiLCBcInBvc3Rwcm9jZXNzVmFsdWVcIiwgXCJoaWRlUm9vdFwiLCBcInRoZW1lXCIsIFwiaW52ZXJ0VGhlbWVcIl07XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG4vLyBFUzYgKyBpbmxpbmUgc3R5bGUgcG9ydCBvZiBKU09OVmlld2VyIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9kYXZldmVkZGVyL3JlYWN0LWpzb24tdmlld2VyL1xuLy8gYWxsIGNyZWRpdHMgYW5kIG9yaWdpbmFsIGNvZGUgdG8gdGhlIGF1dGhvclxuLy8gRGF2ZSBWZWRkZXIgPHZlZGRlcm1hdGljQGdtYWlsLmNvbT4gaHR0cDovL3d3dy5lc2tpbW9zcHkuY29tL1xuLy8gcG9ydCBieSBEYW5pZWxlIFphbm5vdHRpIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9kemFubm90dGkgPGR6YW5ub3R0aUBtZS5jb20+XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTm9kZSBmcm9tICcuL0pTT05Ob2RlJztcbmltcG9ydCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lIGZyb20gJy4vY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSc7XG5pbXBvcnQgeyBpbnZlcnRUaGVtZSB9IGZyb20gJ3JlYWN0LWJhc2UxNi1zdHlsaW5nJztcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGV4cGFuZFJvb3ROb2RlID0gZnVuY3Rpb24gZXhwYW5kUm9vdE5vZGUoa2V5UGF0aCwgZGF0YSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGxldmVsID09PSAwO1xufTtcblxudmFyIGRlZmF1bHRJdGVtU3RyaW5nID0gZnVuY3Rpb24gZGVmYXVsdEl0ZW1TdHJpbmcodHlwZSwgZGF0YSwgaXRlbVR5cGUsIGl0ZW1TdHJpbmcpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBpdGVtVHlwZSwgXCIgXCIsIGl0ZW1TdHJpbmcpO1xufTtcblxudmFyIGRlZmF1bHRMYWJlbFJlbmRlcmVyID0gZnVuY3Rpb24gZGVmYXVsdExhYmVsUmVuZGVyZXIoX3JlZikge1xuICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAxKSxcbiAgICAgIGxhYmVsID0gX3JlZjJbMF07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBsYWJlbCwgXCI6XCIpO1xufTtcblxudmFyIG5vQ3VzdG9tTm9kZSA9IGZ1bmN0aW9uIG5vQ3VzdG9tTm9kZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gY2hlY2tMZWdhY3lUaGVtaW5nKHRoZW1lLCBwcm9wcykge1xuICB2YXIgZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzTWFwID0ge1xuICAgIGdldEFycm93U3R5bGU6ICdhcnJvdycsXG4gICAgZ2V0TGlzdFN0eWxlOiAnbmVzdGVkTm9kZUNoaWxkcmVuJyxcbiAgICBnZXRJdGVtU3RyaW5nU3R5bGU6ICduZXN0ZWROb2RlSXRlbVN0cmluZycsXG4gICAgZ2V0TGFiZWxTdHlsZTogJ2xhYmVsJyxcbiAgICBnZXRWYWx1ZVN0eWxlOiAndmFsdWVUZXh0J1xuICB9O1xuICB2YXIgZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzID0gT2JqZWN0LmtleXMoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzTWFwKS5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gcHJvcHNbbmFtZV07XG4gIH0pO1xuXG4gIGlmIChkZXByZWNhdGVkU3R5bGluZ01ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGVtZSA9IHtcbiAgICAgICAgZXh0ZW5kOiB0aGVtZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSk7XG4gICAgfVxuXG4gICAgZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKFwiU3R5bGluZyBtZXRob2QgXFxcIlwiLmNvbmNhdChuYW1lLCBcIlxcXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFxcXCJ0aGVtZVxcXCIgcHJvcGVydHkgaW5zdGVhZFwiKSk7XG5cbiAgICAgIHRoZW1lW2RlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcFtuYW1lXV0gPSBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHByb3BzW25hbWVdLmFwcGx5KHByb3BzLCBhcmdzKSlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhlbWU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVByb3BzKHByb3BzKSB7XG4gIHZhciB0aGVtZSA9IGNoZWNrTGVnYWN5VGhlbWluZyhwcm9wcy50aGVtZSwgcHJvcHMpO1xuXG4gIGlmIChwcm9wcy5pbnZlcnRUaGVtZSkge1xuICAgIHRoZW1lID0gaW52ZXJ0VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdHlsaW5nOiBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lKHRoZW1lKVxuICB9O1xufVxuXG5leHBvcnQgdmFyIEpTT05UcmVlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OVHJlZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OVHJlZSk7XG5cbiAgZnVuY3Rpb24gSlNPTlRyZWUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTlRyZWUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMuc3RhdGUgPSBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEpTT05UcmVlLCBbe1xuICAgIGtleTogXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAoWyd0aGVtZScsICdpbnZlcnRUaGVtZSddLmZpbmQoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIG5leHRQcm9wc1trXSAhPT0gX3RoaXMyLnByb3BzW2tdO1xuICAgICAgfSkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShnZXRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gISFPYmplY3Qua2V5cyhuZXh0UHJvcHMpLmZpbmQoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIGsgPT09ICdrZXlQYXRoJyA/IG5leHRQcm9wc1trXS5qb2luKCcvJykgIT09IF90aGlzMy5wcm9wc1trXS5qb2luKCcvJykgOiBuZXh0UHJvcHNba10gIT09IF90aGlzMy5wcm9wc1trXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzLmRhdGEsXG4gICAgICAgICAga2V5UGF0aCA9IF90aGlzJHByb3BzLmtleVBhdGgsXG4gICAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZSA9IF90aGlzJHByb3BzLnBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgICAgaGlkZVJvb3QgPSBfdGhpcyRwcm9wcy5oaWRlUm9vdCxcbiAgICAgICAgICB0aGVtZSA9IF90aGlzJHByb3BzLnRoZW1lLFxuICAgICAgICAgIF8gPSBfdGhpcyRwcm9wcy5pbnZlcnRUaGVtZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gICAgICB2YXIgc3R5bGluZyA9IHRoaXMuc3RhdGUuc3R5bGluZztcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcoJ3RyZWUnKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk5vZGUsIF9leHRlbmRzKHt9LCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgaGlkZVJvb3Q6IGhpZGVSb290LFxuICAgICAgICBzdHlsaW5nOiBzdHlsaW5nXG4gICAgICB9LCByZXN0KSwge1xuICAgICAgICBrZXlQYXRoOiBoaWRlUm9vdCA/IFtdIDoga2V5UGF0aCxcbiAgICAgICAgdmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUodmFsdWUpXG4gICAgICB9KSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OVHJlZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05UcmVlLCBcInByb3BUeXBlc1wiLCB7XG4gIGRhdGE6IFByb3BUeXBlcy5hbnksXG4gIGhpZGVSb290OiBQcm9wVHlwZXMuYm9vbCxcbiAgdGhlbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgaW52ZXJ0VGhlbWU6IFByb3BUeXBlcy5ib29sLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLFxuICBwb3N0cHJvY2Vzc1ZhbHVlOiBQcm9wVHlwZXMuZnVuYyxcbiAgc29ydE9iamVjdEtleXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYm9vbF0pXG59KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05UcmVlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHNob3VsZEV4cGFuZE5vZGU6IGV4cGFuZFJvb3ROb2RlLFxuICBoaWRlUm9vdDogZmFsc2UsXG4gIGtleVBhdGg6IFsncm9vdCddLFxuICBnZXRJdGVtU3RyaW5nOiBkZWZhdWx0SXRlbVN0cmluZyxcbiAgbGFiZWxSZW5kZXJlcjogZGVmYXVsdExhYmVsUmVuZGVyZXIsXG4gIHZhbHVlUmVuZGVyZXI6IGlkZW50aXR5LFxuICBwb3N0cHJvY2Vzc1ZhbHVlOiBpZGVudGl0eSxcbiAgaXNDdXN0b21Ob2RlOiBub0N1c3RvbU5vZGUsXG4gIGNvbGxlY3Rpb25MaW1pdDogNTAsXG4gIGludmVydFRoZW1lOiB0cnVlXG59KTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvYmpUeXBlKG9iaikge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcblxuICBpZiAodHlwZSA9PT0gJ09iamVjdCcgJiYgdHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICdJdGVyYWJsZSc7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ0N1c3RvbScgJiYgb2JqLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgb2JqIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgLy8gRm9yIHByb2plY3RzIGltcGxlbWVudGluZyBvYmplY3RzIG92ZXJyaWRpbmcgYC5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXWBcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gdHlwZTtcbn0iLCJleHBvcnQgZGVmYXVsdCB7XG4gIHNjaGVtZTogJ3NvbGFyaXplZCcsXG4gIGF1dGhvcjogJ2V0aGFuIHNjaG9vbm92ZXIgKGh0dHA6Ly9ldGhhbnNjaG9vbm92ZXIuY29tL3NvbGFyaXplZCknLFxuICBiYXNlMDA6ICcjMDAyYjM2JyxcbiAgYmFzZTAxOiAnIzA3MzY0MicsXG4gIGJhc2UwMjogJyM1ODZlNzUnLFxuICBiYXNlMDM6ICcjNjU3YjgzJyxcbiAgYmFzZTA0OiAnIzgzOTQ5NicsXG4gIGJhc2UwNTogJyM5M2ExYTEnLFxuICBiYXNlMDY6ICcjZWVlOGQ1JyxcbiAgYmFzZTA3OiAnI2ZkZjZlMycsXG4gIGJhc2UwODogJyNkYzMyMmYnLFxuICBiYXNlMDk6ICcjY2I0YjE2JyxcbiAgYmFzZTBBOiAnI2I1ODkwMCcsXG4gIGJhc2UwQjogJyM4NTk5MDAnLFxuICBiYXNlMEM6ICcjMmFhMTk4JyxcbiAgYmFzZTBEOiAnIzI2OGJkMicsXG4gIGJhc2UwRTogJyM2YzcxYzQnLFxuICBiYXNlMEY6ICcjZDMzNjgyJ1xufTsiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGNvbnN0IFJlYWN0UmVkdXhDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQobnVsbCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlYWN0UmVkdXhDb250ZXh0LmRpc3BsYXlOYW1lID0gJ1JlYWN0UmVkdXgnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlZHV4Q29udGV4dDsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JztcbmltcG9ydCB7IGNyZWF0ZVN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL3V0aWxzL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IH0gZnJvbSAnLi4vdXRpbHMvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCc7XG5cbmZ1bmN0aW9uIFByb3ZpZGVyKHtcbiAgc3RvcmUsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICBzZXJ2ZXJTdGF0ZVxufSkge1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUpO1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlOiBzZXJ2ZXJTdGF0ZSA/ICgpID0+IHNlcnZlclN0YXRlIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSwgW3N0b3JlLCBzZXJ2ZXJTdGF0ZV0pO1xuICBjb25zdCBwcmV2aW91c1N0YXRlID0gdXNlTWVtbygoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBbc3RvcmVdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNvbnRleHRWYWx1ZTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcblxuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtjb250ZXh0VmFsdWUsIHByZXZpb3VzU3RhdGVdKTtcbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7IC8vIEB0cy1pZ25vcmUgJ0FueUFjdGlvbicgaXMgYXNzaWduYWJsZSB0byB0aGUgY29uc3RyYWludCBvZiB0eXBlICdBJywgYnV0ICdBJyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5cbi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzVmFsaWRFbGVtZW50VHlwZSwgaXNDb250ZXh0Q29uc3VtZXIgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSBmcm9tICcuLi9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeSc7XG5pbXBvcnQgeyBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMnO1xuaW1wb3J0IHsgbWFwU3RhdGVUb1Byb3BzRmFjdG9yeSB9IGZyb20gJy4uL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzJztcbmltcG9ydCB7IG1lcmdlUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tZXJnZVByb3BzJztcbmltcG9ydCB7IGNyZWF0ZVN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL3V0aWxzL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IH0gZnJvbSAnLi4vdXRpbHMvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4uL3V0aWxzL3NoYWxsb3dFcXVhbCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi91dGlscy93YXJuaW5nJztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JztcbmltcG9ydCB7IG5vdEluaXRpYWxpemVkIH0gZnJvbSAnLi4vdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUnO1xubGV0IHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gbm90SW5pdGlhbGl6ZWQ7XG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZUNvbm5lY3QgPSBmbiA9PiB7XG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gZm47XG59OyAvLyBEZWZpbmUgc29tZSBjb25zdGFudCBhcnJheXMganVzdCB0byBhdm9pZCByZS1jcmVhdGluZyB0aGVzZVxuXG5jb25zdCBFTVBUWV9BUlJBWSA9IFtudWxsLCAwXTtcbmNvbnN0IE5PX1NVQlNDUklQVElPTl9BUlJBWSA9IFtudWxsLCBudWxsXTsgLy8gQXR0ZW1wdHMgdG8gc3RyaW5naWZ5IHdoYXRldmVyIG5vdC1yZWFsbHktYS1jb21wb25lbnQgdmFsdWUgd2Ugd2VyZSBnaXZlblxuLy8gZm9yIGxvZ2dpbmcgaW4gYW4gZXJyb3IgbWVzc2FnZVxuXG5jb25zdCBzdHJpbmdpZnlDb21wb25lbnQgPSBDb21wID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQ29tcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBTdHJpbmcoQ29tcCk7XG4gIH1cbn07XG5cbi8vIFRoaXMgaXMgXCJqdXN0XCIgYSBgdXNlTGF5b3V0RWZmZWN0YCwgYnV0IHdpdGggdHdvIG1vZGlmaWNhdGlvbnM6XG4vLyAtIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIGB1c2VFZmZlY3RgIGluIFNTUiB0byBhdm9pZCBhbm5veWluZyB3YXJuaW5nc1xuLy8gLSB3ZSBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhdm9pZCBjbG9zaW5nIG92ZXIgdmFsdWVzXG4vLyAgIGFuZCBjYXVzaW5nIG1lbW9yeSBsZWFrc1xuZnVuY3Rpb24gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGVmZmVjdEZ1bmMsIGVmZmVjdEFyZ3MsIGRlcGVuZGVuY2llcykge1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGVmZmVjdEZ1bmMoLi4uZWZmZWN0QXJncyksIGRlcGVuZGVuY2llcyk7XG59IC8vIEVmZmVjdCBjYWxsYmFjaywgZXh0cmFjdGVkOiBhc3NpZ24gdGhlIGxhdGVzdCBwcm9wcyB2YWx1ZXMgdG8gcmVmcyBmb3IgbGF0ZXIgdXNhZ2VcblxuXG5mdW5jdGlvbiBjYXB0dXJlV3JhcHBlclByb3BzKGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgd3JhcHBlclByb3BzLCAvLyBhY3R1YWxDaGlsZFByb3BzOiB1bmtub3duLFxuY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vicykge1xuICAvLyBXZSB3YW50IHRvIGNhcHR1cmUgdGhlIHdyYXBwZXIgcHJvcHMgYW5kIGNoaWxkIHByb3BzIHdlIHVzZWQgZm9yIGxhdGVyIGNvbXBhcmlzb25zXG4gIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCA9IHdyYXBwZXJQcm9wcztcbiAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IGZhbHNlOyAvLyBJZiB0aGUgcmVuZGVyIHdhcyBmcm9tIGEgc3RvcmUgdXBkYXRlLCBjbGVhciBvdXQgdGhhdCByZWZlcmVuY2UgYW5kIGNhc2NhZGUgdGhlIHN1YnNjcmliZXIgdXBkYXRlXG5cbiAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCkge1xuICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG51bGw7XG4gICAgbm90aWZ5TmVzdGVkU3VicygpO1xuICB9XG59IC8vIEVmZmVjdCBjYWxsYmFjaywgZXh0cmFjdGVkOiBzdWJzY3JpYmUgdG8gdGhlIFJlZHV4IHN0b3JlIG9yIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yLFxuLy8gY2hlY2sgZm9yIHVwZGF0ZXMgYWZ0ZXIgZGlzcGF0Y2hlZCBhY3Rpb25zLCBhbmQgdHJpZ2dlciByZS1yZW5kZXJzLlxuXG5cbmZ1bmN0aW9uIHN1YnNjcmliZVVwZGF0ZXMoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLCBzdG9yZSwgc3Vic2NyaXB0aW9uLCBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCAvLyBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoOiBSZWFjdC5EaXNwYXRjaDxhbnk+LFxuYWRkaXRpb25hbFN1YnNjcmliZUxpc3RlbmVyKSB7XG4gIC8vIElmIHdlJ3JlIG5vdCBzdWJzY3JpYmVkIHRvIHRoZSBzdG9yZSwgbm90aGluZyB0byBkbyBoZXJlXG4gIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm4gKCkgPT4ge307IC8vIENhcHR1cmUgdmFsdWVzIGZvciBjaGVja2luZyBpZiBhbmQgd2hlbiB0aGlzIGNvbXBvbmVudCB1bm1vdW50c1xuXG4gIGxldCBkaWRVbnN1YnNjcmliZSA9IGZhbHNlO1xuICBsZXQgbGFzdFRocm93bkVycm9yID0gbnVsbDsgLy8gV2UnbGwgcnVuIHRoaXMgY2FsbGJhY2sgZXZlcnkgdGltZSBhIHN0b3JlIHN1YnNjcmlwdGlvbiB1cGRhdGUgcHJvcGFnYXRlcyB0byB0aGlzIGNvbXBvbmVudFxuXG4gIGNvbnN0IGNoZWNrRm9yVXBkYXRlcyA9ICgpID0+IHtcbiAgICBpZiAoZGlkVW5zdWJzY3JpYmUgfHwgIWlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICAvLyBEb24ndCBydW4gc3RhbGUgbGlzdGVuZXJzLlxuICAgICAgLy8gUmVkdXggZG9lc24ndCBndWFyYW50ZWUgdW5zdWJzY3JpcHRpb25zIGhhcHBlbiB1bnRpbCBuZXh0IGRpc3BhdGNoLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVE9ETyBXZSdyZSBjdXJyZW50bHkgY2FsbGluZyBnZXRTdGF0ZSBvdXJzZWx2ZXMgaGVyZSwgcmF0aGVyIHRoYW4gbGV0dGluZyBgdVNFU2AgZG8gaXRcblxuXG4gICAgY29uc3QgbGF0ZXN0U3RvcmVTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgbGV0IG5ld0NoaWxkUHJvcHMsIGVycm9yO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdHVhbGx5IHJ1biB0aGUgc2VsZWN0b3Igd2l0aCB0aGUgbW9zdCByZWNlbnQgc3RvcmUgc3RhdGUgYW5kIHdyYXBwZXIgcHJvcHNcbiAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmVcbiAgICAgIG5ld0NoaWxkUHJvcHMgPSBjaGlsZFByb3BzU2VsZWN0b3IobGF0ZXN0U3RvcmVTdGF0ZSwgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvciA9IGU7XG4gICAgICBsYXN0VGhyb3duRXJyb3IgPSBlO1xuICAgIH1cblxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IG51bGw7XG4gICAgfSAvLyBJZiB0aGUgY2hpbGQgcHJvcHMgaGF2ZW4ndCBjaGFuZ2VkLCBub3RoaW5nIHRvIGRvIGhlcmUgLSBjYXNjYWRlIHRoZSBzdWJzY3JpcHRpb24gdXBkYXRlXG5cblxuICAgIGlmIChuZXdDaGlsZFByb3BzID09PSBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50KSB7XG4gICAgICBpZiAoIXJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQpIHtcbiAgICAgICAgbm90aWZ5TmVzdGVkU3VicygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTYXZlIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBjaGlsZCBwcm9wcy4gIE5vdGUgdGhhdCB3ZSB0cmFjayB0aGUgXCJjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZVwiXG4gICAgICAvLyBhcyBhIHJlZiBpbnN0ZWFkIG9mIGEgdXNlU3RhdGUvdXNlUmVkdWNlciBiZWNhdXNlIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZXJtaW5lIGlmIHRoYXQgdmFsdWUgaGFzXG4gICAgICAvLyBiZWVuIHByb2Nlc3NlZC4gIElmIHRoaXMgd2VudCBpbnRvIHVzZVN0YXRlL3VzZVJlZHVjZXIsIHdlIGNvdWxkbid0IGNsZWFyIG91dCB0aGUgdmFsdWUgd2l0aG91dFxuICAgICAgLy8gZm9yY2luZyBhbm90aGVyIHJlLXJlbmRlciwgd2hpY2ggd2UgZG9uJ3Qgd2FudC5cbiAgICAgIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIHJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQgPSB0cnVlOyAvLyBUT0RPIFRoaXMgaXMgaGFja3kgYW5kIG5vdCBob3cgYHVTRVNgIGlzIG1lYW50IHRvIGJlIHVzZWRcbiAgICAgIC8vIFRyaWdnZXIgdGhlIFJlYWN0IGB1c2VTeW5jRXh0ZXJuYWxTdG9yZWAgc3Vic2NyaWJlclxuXG4gICAgICBhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIoKTtcbiAgICB9XG4gIH07IC8vIEFjdHVhbGx5IHN1YnNjcmliZSB0byB0aGUgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IgKG9yIHN0b3JlKVxuXG5cbiAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBjaGVja0ZvclVwZGF0ZXM7XG4gIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTsgLy8gUHVsbCBkYXRhIGZyb20gdGhlIHN0b3JlIGFmdGVyIGZpcnN0IHJlbmRlciBpbiBjYXNlIHRoZSBzdG9yZSBoYXNcbiAgLy8gY2hhbmdlZCBzaW5jZSB3ZSBiZWdhbi5cblxuICBjaGVja0ZvclVwZGF0ZXMoKTtcblxuICBjb25zdCB1bnN1YnNjcmliZVdyYXBwZXIgPSAoKSA9PiB7XG4gICAgZGlkVW5zdWJzY3JpYmUgPSB0cnVlO1xuICAgIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gbnVsbDtcblxuICAgIGlmIChsYXN0VGhyb3duRXJyb3IpIHtcbiAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3ZSBjYXVnaHQgYW4gZXJyb3IgZHVlIHRvIGEgYmFkIG1hcFN0YXRlIGZ1bmN0aW9uLCBidXQgdGhlXG4gICAgICAvLyBwYXJlbnQgcmUtcmVuZGVyZWQgd2l0aG91dCB0aGlzIGNvbXBvbmVudCBhbmQgd2UncmUgYWJvdXQgdG8gdW5tb3VudC5cbiAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBhcyBsb25nIGFzIHdlIGRvIHRvcC1kb3duIHN1YnNjcmlwdGlvbnMgY29ycmVjdGx5LCBidXRcbiAgICAgIC8vIGlmIHdlIGV2ZXIgZG8gdGhvc2Ugd3JvbmcsIHRoaXMgdGhyb3cgd2lsbCBzdXJmYWNlIHRoZSBlcnJvciBpbiBvdXIgdGVzdHMuXG4gICAgICAvLyBJbiB0aGF0IGNhc2UsIHRocm93IHRoZSBlcnJvciBmcm9tIGhlcmUgc28gaXQgZG9lc24ndCBnZXQgbG9zdC5cbiAgICAgIHRocm93IGxhc3RUaHJvd25FcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHVuc3Vic2NyaWJlV3JhcHBlcjtcbn0gLy8gUmVkdWNlciBpbml0aWFsIHN0YXRlIGNyZWF0aW9uIGZvciBvdXIgdXBkYXRlIHJlZHVjZXJcblxuXG5jb25zdCBpbml0U3RhdGVVcGRhdGVzID0gKCkgPT4gRU1QVFlfQVJSQVk7XG5cbmZ1bmN0aW9uIHN0cmljdEVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IGI7XG59XG4vKipcclxuICogSW5mZXJzIHRoZSB0eXBlIG9mIHByb3BzIHRoYXQgYSBjb25uZWN0b3Igd2lsbCBpbmplY3QgaW50byBhIGNvbXBvbmVudC5cclxuICovXG5cblxubGV0IGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSBmYWxzZTtcbi8qKlxyXG4gKiBDb25uZWN0cyBhIFJlYWN0IGNvbXBvbmVudCB0byBhIFJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiAtIFdpdGhvdXQgYXJndW1lbnRzLCBqdXN0IHdyYXBzIHRoZSBjb21wb25lbnQsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGJlaGF2aW9yIC8gcHJvcHNcclxuICpcclxuICogLSBJZiAyIHBhcmFtcyBhcmUgcGFzc2VkICgzcmQgcGFyYW0sIG1lcmdlUHJvcHMsIGlzIHNraXBwZWQpLCBkZWZhdWx0IGJlaGF2aW9yXHJcbiAqIGlzIHRvIG92ZXJyaWRlIG93blByb3BzIChhcyBzdGF0ZWQgaW4gdGhlIGRvY3MpLCBzbyB3aGF0IHJlbWFpbnMgaXMgZXZlcnl0aGluZyB0aGF0J3NcclxuICogbm90IGEgc3RhdGUgb3IgZGlzcGF0Y2ggcHJvcFxyXG4gKlxyXG4gKiAtIFdoZW4gM3JkIHBhcmFtIGlzIHBhc3NlZCwgd2UgZG9uJ3Qga25vdyBpZiBvd25Qcm9wcyBwcm9wYWdhdGUgYW5kIHdoZXRoZXIgdGhleVxyXG4gKiBzaG91bGQgYmUgdmFsaWQgY29tcG9uZW50IHByb3BzLCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gbWVyZ2VQcm9wcyBpbXBsZW1lbnRhdGlvbi5cclxuICogQXMgc3VjaCwgaXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBleHRlbmQgb3duUHJvcHMgaW50ZXJmYWNlIGZyb20gc3RhdGUgb3JcclxuICogZGlzcGF0Y2ggcHJvcHMgb3IgYm90aCB3aGVuIGFwcGxpY2FibGVcclxuICpcclxuICogQHBhcmFtIG1hcFN0YXRlVG9Qcm9wcyBBIGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgdmFsdWVzIGZyb20gc3RhdGVcclxuICogQHBhcmFtIG1hcERpc3BhdGNoVG9Qcm9wcyBTZXR1cCBmb3IgZGlzcGF0Y2hpbmcgYWN0aW9uc1xyXG4gKiBAcGFyYW0gbWVyZ2VQcm9wcyBPcHRpb25hbCBjYWxsYmFjayB0byBtZXJnZSBzdGF0ZSBhbmQgZGlzcGF0Y2ggcHJvcHMgdG9nZXRoZXJcclxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIGNvbm5lY3Rpb25cclxuICpcclxuICovXG5cbmZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIHtcbiAgLy8gVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgc28gVFMgZG9lc24ndCBsaWtlIHVzIGRlc3RydWN0dXJpbmcgdGhpcyB0byBjaGVjayBpdHMgZXhpc3RlbmNlLlxuICAvLyBAdHMtaWdub3JlXG4gIHB1cmUsXG4gIGFyZVN0YXRlc0VxdWFsID0gc3RyaWN0RXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgLy8gdXNlIFJlYWN0J3MgZm9yd2FyZFJlZiB0byBleHBvc2UgYSByZWYgb2YgdGhlIHdyYXBwZWQgY29tcG9uZW50XG4gIGZvcndhcmRSZWYgPSBmYWxzZSxcbiAgLy8gdGhlIGNvbnRleHQgY29uc3VtZXIgdG8gdXNlXG4gIGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dFxufSA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHB1cmUgIT09IHVuZGVmaW5lZCAmJiAhaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbikge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IHRydWU7XG4gICAgICB3YXJuaW5nKCdUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLiBgY29ubmVjdGAgaXMgbm93IGFsd2F5cyBhIFwicHVyZS9tZW1vaXplZFwiIGNvbXBvbmVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0O1xuICBjb25zdCBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpO1xuICBjb25zdCBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpO1xuICBjb25zdCBpbml0TWVyZ2VQcm9wcyA9IG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpO1xuICBjb25zdCBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMgPSBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyk7XG5cbiAgY29uc3Qgd3JhcFdpdGhDb25uZWN0ID0gV3JhcHBlZENvbXBvbmVudCA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWlzVmFsaWRFbGVtZW50VHlwZShXcmFwcGVkQ29tcG9uZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgY29tcG9uZW50IHRvIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBjb25uZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7c3RyaW5naWZ5Q29tcG9uZW50KFdyYXBwZWRDb21wb25lbnQpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRDb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgQ29ubmVjdCgke3dyYXBwZWRDb21wb25lbnROYW1lfSlgO1xuICAgIGNvbnN0IHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSB7XG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIHdyYXBwZWRDb21wb25lbnROYW1lLFxuICAgICAgV3JhcHBlZENvbXBvbmVudCxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHMsXG4gICAgICBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIENvbm5lY3RGdW5jdGlvbihwcm9wcykge1xuICAgICAgY29uc3QgW3Byb3BzQ29udGV4dCwgcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgd3JhcHBlclByb3BzXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFjdHVhbCBcImRhdGFcIiBwcm9wcyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVyIGNvbXBvbmVudCxcbiAgICAgICAgLy8gYW5kIHZhbHVlcyBuZWVkZWQgdG8gY29udHJvbCBiZWhhdmlvciAoZm9yd2FyZGVkIHJlZnMsIGFsdGVybmF0ZSBjb250ZXh0IGluc3RhbmNlcykuXG4gICAgICAgIC8vIFRvIG1haW50YWluIHRoZSB3cmFwcGVyUHJvcHMgb2JqZWN0IHJlZmVyZW5jZSwgbWVtb2l6ZSB0aGlzIGRlc3RydWN0dXJpbmcuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgIH0gPSBwcm9wcyxcbiAgICAgICAgICAgICAgd3JhcHBlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICAgICAgcmV0dXJuIFtwcm9wcy5jb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdO1xuICAgICAgfSwgW3Byb3BzXSk7XG4gICAgICBjb25zdCBDb250ZXh0VG9Vc2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgLy8gVXNlcnMgbWF5IG9wdGlvbmFsbHkgcGFzcyBpbiBhIGN1c3RvbSBjb250ZXh0IGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIG91ciBSZWFjdFJlZHV4Q29udGV4dC5cbiAgICAgICAgLy8gTWVtb2l6ZSB0aGUgY2hlY2sgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGNvbnRleHQgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZS5cbiAgICAgICAgcmV0dXJuIHByb3BzQ29udGV4dCAmJiBwcm9wc0NvbnRleHQuQ29uc3VtZXIgJiYgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpc0NvbnRleHRDb25zdW1lciggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQocHJvcHNDb250ZXh0LkNvbnN1bWVyLCBudWxsKSkgPyBwcm9wc0NvbnRleHQgOiBDb250ZXh0O1xuICAgICAgfSwgW3Byb3BzQ29udGV4dCwgQ29udGV4dF0pOyAvLyBSZXRyaWV2ZSB0aGUgc3RvcmUgYW5kIGFuY2VzdG9yIHN1YnNjcmlwdGlvbiB2aWEgY29udGV4dCwgaWYgYXZhaWxhYmxlXG5cbiAgICAgIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZUNvbnRleHQoQ29udGV4dFRvVXNlKTsgLy8gVGhlIHN0b3JlIF9tdXN0XyBleGlzdCBhcyBlaXRoZXIgYSBwcm9wIG9yIGluIGNvbnRleHQuXG4gICAgICAvLyBXZSdsbCBjaGVjayB0byBzZWUgaWYgaXQgX2xvb2tzXyBsaWtlIGEgUmVkdXggc3RvcmUgZmlyc3QuXG4gICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBwYXNzIHRocm91Z2ggYSBgc3RvcmVgIHByb3AgdGhhdCBpcyBqdXN0IGEgcGxhaW4gdmFsdWUuXG5cbiAgICAgIGNvbnN0IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA9IEJvb2xlYW4ocHJvcHMuc3RvcmUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZ2V0U3RhdGUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbUNvbnRleHQgPSBCb29sZWFuKGNvbnRleHRWYWx1ZSkgJiYgQm9vbGVhbihjb250ZXh0VmFsdWUuc3RvcmUpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhZGlkU3RvcmVDb21lRnJvbVByb3BzICYmICFkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIFwic3RvcmVcIiBpbiB0aGUgY29udGV4dCBvZiBgICsgYFwiJHtkaXNwbGF5TmFtZX1cIi4gRWl0aGVyIHdyYXAgdGhlIHJvb3QgY29tcG9uZW50IGluIGEgPFByb3ZpZGVyPiwgYCArIGBvciBwYXNzIGEgY3VzdG9tIFJlYWN0IGNvbnRleHQgcHJvdmlkZXIgdG8gPFByb3ZpZGVyPiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYCArIGBSZWFjdCBjb250ZXh0IGNvbnN1bWVyIHRvICR7ZGlzcGxheU5hbWV9IGluIGNvbm5lY3Qgb3B0aW9ucy5gKTtcbiAgICAgIH0gLy8gQmFzZWQgb24gdGhlIHByZXZpb3VzIGNoZWNrLCBvbmUgb2YgdGhlc2UgbXVzdCBiZSB0cnVlXG5cblxuICAgICAgY29uc3Qgc3RvcmUgPSBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBwcm9wcy5zdG9yZSA6IGNvbnRleHRWYWx1ZS5zdG9yZTtcbiAgICAgIGNvbnN0IGdldFNlcnZlclN0YXRlID0gZGlkU3RvcmVDb21lRnJvbUNvbnRleHQgPyBjb250ZXh0VmFsdWUuZ2V0U2VydmVyU3RhdGUgOiBzdG9yZS5nZXRTdGF0ZTtcbiAgICAgIGNvbnN0IGNoaWxkUHJvcHNTZWxlY3RvciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBUaGUgY2hpbGQgcHJvcHMgc2VsZWN0b3IgbmVlZHMgdGhlIHN0b3JlIHJlZmVyZW5jZSBhcyBhbiBpbnB1dC5cbiAgICAgICAgLy8gUmUtY3JlYXRlIHRoaXMgc2VsZWN0b3Igd2hlbmV2ZXIgdGhlIHN0b3JlIGNoYW5nZXMuXG4gICAgICAgIHJldHVybiBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5KHN0b3JlLmRpc3BhdGNoLCBzZWxlY3RvckZhY3RvcnlPcHRpb25zKTtcbiAgICAgIH0sIFtzdG9yZV0pO1xuICAgICAgY29uc3QgW3N1YnNjcmlwdGlvbiwgbm90aWZ5TmVzdGVkU3Vic10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybiBOT19TVUJTQ1JJUFRJT05fQVJSQVk7IC8vIFRoaXMgU3Vic2NyaXB0aW9uJ3Mgc291cmNlIHNob3VsZCBtYXRjaCB3aGVyZSBzdG9yZSBjYW1lIGZyb206IHByb3BzIHZzLiBjb250ZXh0LiBBIGNvbXBvbmVudFxuICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHN0b3JlIHZpYSBwcm9wcyBzaG91bGRuJ3QgdXNlIHN1YnNjcmlwdGlvbiBmcm9tIGNvbnRleHQsIG9yIHZpY2UgdmVyc2EuXG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyB1bmRlZmluZWQgOiBjb250ZXh0VmFsdWUuc3Vic2NyaXB0aW9uKTsgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGluXG4gICAgICAgIC8vIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLCB3aGVyZSBgc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gVGhpcyBjYW5cbiAgICAgICAgLy8gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24ncyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZSAgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcC5cblxuICAgICAgICBjb25zdCBub3RpZnlOZXN0ZWRTdWJzID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMuYmluZChzdWJzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gW3N1YnNjcmlwdGlvbiwgbm90aWZ5TmVzdGVkU3Vic107XG4gICAgICB9LCBbc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlXSk7IC8vIERldGVybWluZSB3aGF0IHtzdG9yZSwgc3Vic2NyaXB0aW9ufSB2YWx1ZSBzaG91bGQgYmUgcHV0IGludG8gbmVzdGVkIGNvbnRleHQsIGlmIG5lY2Vzc2FyeSxcbiAgICAgIC8vIGFuZCBtZW1vaXplIHRoYXQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29udGV4dCB1cGRhdGVzLlxuXG4gICAgICBjb25zdCBvdmVycmlkZGVuQ29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChkaWRTdG9yZUNvbWVGcm9tUHJvcHMpIHtcbiAgICAgICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBkaXJlY3RseSBzdWJzY3JpYmVkIHRvIGEgc3RvcmUgZnJvbSBwcm9wcy5cbiAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IGRlc2NlbmRhbnRzIHJlYWRpbmcgZnJvbSB0aGlzIHN0b3JlIC0gcGFzcyBkb3duIHdoYXRldmVyXG4gICAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGNvbnRleHQgdmFsdWUgaXMgZnJvbSB0aGUgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHB1dCB0aGlzIGNvbXBvbmVudCdzIHN1YnNjcmlwdGlvbiBpbnN0YW5jZSBpbnRvIGNvbnRleHQsIHNvIHRoYXRcbiAgICAgICAgLy8gY29ubmVjdGVkIGRlc2NlbmRhbnRzIHdvbid0IHVwZGF0ZSB1bnRpbCBhZnRlciB0aGlzIGNvbXBvbmVudCBpcyBkb25lXG5cblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGNvbnRleHRWYWx1ZSwge1xuICAgICAgICAgIHN1YnNjcmlwdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0sIFtkaWRTdG9yZUNvbWVGcm9tUHJvcHMsIGNvbnRleHRWYWx1ZSwgc3Vic2NyaXB0aW9uXSk7IC8vIFNldCB1cCByZWZzIHRvIGNvb3JkaW5hdGUgdmFsdWVzIGJldHdlZW4gdGhlIHN1YnNjcmlwdGlvbiBlZmZlY3QgYW5kIHRoZSByZW5kZXIgbG9naWNcblxuICAgICAgY29uc3QgbGFzdENoaWxkUHJvcHMgPSB1c2VSZWYoKTtcbiAgICAgIGNvbnN0IGxhc3RXcmFwcGVyUHJvcHMgPSB1c2VSZWYod3JhcHBlclByb3BzKTtcbiAgICAgIGNvbnN0IGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUgPSB1c2VSZWYoKTtcbiAgICAgIGNvbnN0IHJlbmRlcklzU2NoZWR1bGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGlzUHJvY2Vzc2luZ0Rpc3BhdGNoID0gdXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGlzTW91bnRlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yID0gdXNlUmVmKCk7XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gVHJpY2t5IGxvZ2ljIGhlcmU6XG4gICAgICAgICAgLy8gLSBUaGlzIHJlbmRlciBtYXkgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSBhIFJlZHV4IHN0b3JlIHVwZGF0ZSB0aGF0IHByb2R1Y2VkIG5ldyBjaGlsZCBwcm9wc1xuICAgICAgICAgIC8vIC0gSG93ZXZlciwgd2UgbWF5IGhhdmUgZ290dGVuIG5ldyB3cmFwcGVyIHByb3BzIGFmdGVyIHRoYXRcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldyBjaGlsZCBwcm9wcywgYW5kIHRoZSBzYW1lIHdyYXBwZXIgcHJvcHMsIHdlIGtub3cgd2Ugc2hvdWxkIHVzZSB0aGUgbmV3IGNoaWxkIHByb3BzIGFzLWlzLlxuICAgICAgICAgIC8vIEJ1dCwgaWYgd2UgaGF2ZSBuZXcgd3JhcHBlciBwcm9wcywgdGhvc2UgbWlnaHQgY2hhbmdlIHRoZSBjaGlsZCBwcm9wcywgc28gd2UgaGF2ZSB0byByZWNhbGN1bGF0ZSB0aGluZ3MuXG4gICAgICAgICAgLy8gU28sIHdlJ2xsIHVzZSB0aGUgY2hpbGQgcHJvcHMgZnJvbSBzdG9yZSB1cGRhdGUgb25seSBpZiB0aGUgd3JhcHBlciBwcm9wcyBhcmUgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLlxuICAgICAgICAgIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgJiYgd3JhcHBlclByb3BzID09PSBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQ7XG4gICAgICAgICAgfSAvLyBUT0RPIFdlJ3JlIHJlYWRpbmcgdGhlIHN0b3JlIGRpcmVjdGx5IGluIHJlbmRlcigpIGhlcmUuIEJhZCBpZGVhP1xuICAgICAgICAgIC8vIFRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgQmFkIFRoaW5ncyAoVE0pIHRvIGhhcHBlbiBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIHRoaXMgYmVjYXVzZSBvbiByZW5kZXJzIF9ub3RfIGNhdXNlZCBieSBzdG9yZSB1cGRhdGVzLCB3ZSBuZWVkIHRoZSBsYXRlc3Qgc3RvcmUgc3RhdGVcbiAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hhdCB0aGUgY2hpbGQgcHJvcHMgc2hvdWxkIGJlLlxuXG5cbiAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc1NlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCksIHdyYXBwZXJQcm9wcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgICAgfSwgW3N0b3JlLCB3cmFwcGVyUHJvcHNdKTsgLy8gV2UgbmVlZCB0aGlzIHRvIGV4ZWN1dGUgc3luY2hyb25vdXNseSBldmVyeSB0aW1lIHdlIHJlLXJlbmRlci4gSG93ZXZlciwgUmVhY3Qgd2FybnNcbiAgICAgIC8vIGFib3V0IHVzZUxheW91dEVmZmVjdCBpbiBTU1IsIHNvIHdlIHRyeSB0byBkZXRlY3QgZW52aXJvbm1lbnQgYW5kIGZhbGwgYmFjayB0b1xuICAgICAgLy8ganVzdCB1c2VFZmZlY3QgaW5zdGVhZCB0byBhdm9pZCB0aGUgd2FybmluZywgc2luY2UgbmVpdGhlciB3aWxsIHJ1biBhbnl3YXkuXG5cbiAgICAgIGNvbnN0IHN1YnNjcmliZUZvclJlYWN0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IHJlYWN0TGlzdGVuZXIgPT4ge1xuICAgICAgICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZVVwZGF0ZXMoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLCBzdG9yZSwgc3Vic2NyaXB0aW9uLCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGlzTW91bnRlZCwgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3VicywgcmVhY3RMaXN0ZW5lcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZTtcbiAgICAgIH0sIFtzdWJzY3JpcHRpb25dKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhjYXB0dXJlV3JhcHBlclByb3BzLCBbbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnNdKTtcbiAgICAgIGxldCBhY3R1YWxDaGlsZFByb3BzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhY3R1YWxDaGlsZFByb3BzID0gdXNlU3luY0V4dGVybmFsU3RvcmUoIC8vIFRPRE8gV2UncmUgcGFzc2luZyB0aHJvdWdoIGEgYmlnIHdyYXBwZXIgdGhhdCBkb2VzIGEgYnVuY2ggb2YgZXh0cmEgc2lkZSBlZmZlY3RzIGJlc2lkZXMgc3Vic2NyaWJpbmdcbiAgICAgICAgc3Vic2NyaWJlRm9yUmVhY3QsIC8vIFRPRE8gVGhpcyBpcyBpbmNyZWRpYmx5IGhhY2t5LiBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgc3RvcmUgdXBkYXRlIGFuZCBjYWxjdWxhdGVkIG5ldyBjaGlsZCBwcm9wcyxcbiAgICAgICAgLy8gVE9ETyBhbmQgd2UncmUganVzdCBwYXNzaW5nIHRoYXQgdGhyb3VnaCBzbyBpdCB0cmlnZ2VycyBhIHJlLXJlbmRlciBmb3IgdXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBgdVNFU2AuXG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciwgZ2V0U2VydmVyU3RhdGUgPyAoKSA9PiBjaGlsZFByb3BzU2VsZWN0b3IoZ2V0U2VydmVyU3RhdGUoKSwgd3JhcHBlclByb3BzKSA6IGFjdHVhbENoaWxkUHJvcHNTZWxlY3Rvcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCkge1xuICAgICAgICAgIDtcbiAgICAgICAgICBlcnIubWVzc2FnZSArPSBgXFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcXG4ke2xhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudC5zdGFja31cXG5cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgICAgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBhY3R1YWxDaGlsZFByb3BzO1xuICAgICAgfSk7IC8vIE5vdyB0aGF0IGFsbCB0aGF0J3MgZG9uZSwgd2UgY2FuIGZpbmFsbHkgdHJ5IHRvIGFjdHVhbGx5IHJlbmRlciB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgLy8gV2UgbWVtb2l6ZSB0aGUgZWxlbWVudHMgZm9yIHRoZSByZW5kZXJlZCBjaGlsZCBjb21wb25lbnQgYXMgYW4gb3B0aW1pemF0aW9uLlxuXG4gICAgICBjb25zdCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgX2V4dGVuZHMoe30sIGFjdHVhbENoaWxkUHJvcHMsIHtcbiAgICAgICAgICAgIHJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgfSwgW3JlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIFdyYXBwZWRDb21wb25lbnQsIGFjdHVhbENoaWxkUHJvcHNdKTsgLy8gSWYgUmVhY3Qgc2VlcyB0aGUgZXhhY3Qgc2FtZSBlbGVtZW50IHJlZmVyZW5jZSBhcyBsYXN0IHRpbWUsIGl0IGJhaWxzIG91dCBvZiByZS1yZW5kZXJpbmdcbiAgICAgIC8vIHRoYXQgY2hpbGQsIHNhbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gUmVhY3QubWVtbygpIG9yIHJldHVybmVkIGZhbHNlIGZyb20gc2hvdWxkQ29tcG9uZW50VXBkYXRlLlxuXG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBpcyBzdWJzY3JpYmVkIHRvIHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdG8gcGFzcyBpdHMgb3duXG4gICAgICAgICAgLy8gc3Vic2NyaXB0aW9uIGluc3RhbmNlIGRvd24gdG8gb3VyIGRlc2NlbmRhbnRzLiBUaGF0IG1lYW5zIHJlbmRlcmluZyB0aGUgc2FtZVxuICAgICAgICAgIC8vIENvbnRleHQgaW5zdGFuY2UsIGFuZCBwdXR0aW5nIGEgZGlmZmVyZW50IHZhbHVlIGludG8gdGhlIGNvbnRleHQuXG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRUb1VzZS5Qcm92aWRlciwge1xuICAgICAgICAgICAgdmFsdWU6IG92ZXJyaWRkZW5Db250ZXh0VmFsdWVcbiAgICAgICAgICB9LCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfVxuXG4gICAgY29uc3QgX0Nvbm5lY3QgPSBSZWFjdC5tZW1vKENvbm5lY3RGdW5jdGlvbik7XG5cbiAgICAvLyBBZGQgYSBoYWNreSBjYXN0IHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IHR5cGVcbiAgICBjb25zdCBDb25uZWN0ID0gX0Nvbm5lY3Q7XG4gICAgQ29ubmVjdC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICBDb25uZWN0LmRpc3BsYXlOYW1lID0gQ29ubmVjdEZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG5cbiAgICBpZiAoZm9yd2FyZFJlZikge1xuICAgICAgY29uc3QgX2ZvcndhcmRlZCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gZm9yd2FyZENvbm5lY3RSZWYocHJvcHMsIHJlZikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25uZWN0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmOiByZWZcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZvcndhcmRlZCA9IF9mb3J3YXJkZWQ7XG4gICAgICBmb3J3YXJkZWQuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgIGZvcndhcmRlZC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIHJldHVybiBob2lzdFN0YXRpY3MoZm9yd2FyZGVkLCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaG9pc3RTdGF0aWNzKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xuXG4gIHJldHVybiB3cmFwV2l0aENvbm5lY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3Q7IiwiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KGFyZywgbmFtZSkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBvcHRpb25zKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJHt0eXBlb2YgYXJnfSBmb3IgJHtuYW1lfSBhcmd1bWVudCB3aGVuIGNvbm5lY3RpbmcgY29tcG9uZW50ICR7b3B0aW9ucy53cmFwcGVkQ29tcG9uZW50TmFtZX0uYCk7XG4gIH07XG59IiwiaW1wb3J0IGJpbmRBY3Rpb25DcmVhdG9ycyBmcm9tICcuLi91dGlscy9iaW5kQWN0aW9uQ3JlYXRvcnMnO1xuaW1wb3J0IHsgd3JhcE1hcFRvUHJvcHNDb25zdGFudCwgd3JhcE1hcFRvUHJvcHNGdW5jIH0gZnJvbSAnLi93cmFwTWFwVG9Qcm9wcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSB9IGZyb20gJy4vaW52YWxpZEFyZ0ZhY3RvcnknO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBEaXNwYXRjaFRvUHJvcHMgJiYgdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ29iamVjdCcgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGRpc3BhdGNoID0+IC8vIEB0cy1pZ25vcmVcbiAgYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpKSA6ICFtYXBEaXNwYXRjaFRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGRpc3BhdGNoID0+ICh7XG4gICAgZGlzcGF0Y2hcbiAgfSkpIDogdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEB0cy1pZ25vcmVcbiAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG59IiwiaW1wb3J0IHsgd3JhcE1hcFRvUHJvcHNDb25zdGFudCwgd3JhcE1hcFRvUHJvcHNGdW5jIH0gZnJvbSAnLi93cmFwTWFwVG9Qcm9wcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSB9IGZyb20gJy4vaW52YWxpZEFyZ0ZhY3RvcnknO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwU3RhdGVUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudCgoKSA9PiAoe30pKSA6IHR5cGVvZiBtYXBTdGF0ZVRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyAvLyBAdHMtaWdub3JlXG4gIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHZlcmlmeVBsYWluT2JqZWN0IGZyb20gJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0JztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gX2V4dGVuZHMoe30sIG93blByb3BzLCBzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdE1lcmdlUHJvcHNQcm94eShkaXNwYXRjaCwge1xuICAgIGRpc3BsYXlOYW1lLFxuICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgfSkge1xuICAgIGxldCBoYXNSdW5PbmNlID0gZmFsc2U7XG4gICAgbGV0IG1lcmdlZFByb3BzO1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIGNvbnN0IG5leHRNZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuXG4gICAgICBpZiAoaGFzUnVuT25jZSkge1xuICAgICAgICBpZiAoIWFyZU1lcmdlZFByb3BzRXF1YWwobmV4dE1lcmdlZFByb3BzLCBtZXJnZWRQcm9wcykpIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUnVuT25jZSA9IHRydWU7XG4gICAgICAgIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QobWVyZ2VkUHJvcHMsIGRpc3BsYXlOYW1lLCAnbWVyZ2VQcm9wcycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByb3BzRmFjdG9yeShtZXJnZVByb3BzKSB7XG4gIHJldHVybiAhbWVyZ2VQcm9wcyA/ICgpID0+IGRlZmF1bHRNZXJnZVByb3BzIDogdHlwZW9mIG1lcmdlUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycpO1xufSIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuY29uc3QgX2V4Y2x1ZGVkID0gW1wiaW5pdE1hcFN0YXRlVG9Qcm9wc1wiLCBcImluaXRNYXBEaXNwYXRjaFRvUHJvcHNcIiwgXCJpbml0TWVyZ2VQcm9wc1wiXTtcbmltcG9ydCB2ZXJpZnlTdWJzZWxlY3RvcnMgZnJvbSAnLi92ZXJpZnlTdWJzZWxlY3RvcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwge1xuICBhcmVTdGF0ZXNFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsXG59KSB7XG4gIGxldCBoYXNSdW5BdExlYXN0T25jZSA9IGZhbHNlO1xuICBsZXQgc3RhdGU7XG4gIGxldCBvd25Qcm9wcztcbiAgbGV0IHN0YXRlUHJvcHM7XG4gIGxldCBkaXNwYXRjaFByb3BzO1xuICBsZXQgbWVyZ2VkUHJvcHM7XG5cbiAgZnVuY3Rpb24gaGFuZGxlRmlyc3RDYWxsKGZpcnN0U3RhdGUsIGZpcnN0T3duUHJvcHMpIHtcbiAgICBzdGF0ZSA9IGZpcnN0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBmaXJzdE93blByb3BzO1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICBoYXNSdW5BdExlYXN0T25jZSA9IHRydWU7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpIHtcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHMoKSB7XG4gICAgaWYgKG1hcFN0YXRlVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1N0YXRlKCkge1xuICAgIGNvbnN0IG5leHRTdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVQcm9wc0NoYW5nZWQgPSAhYXJlU3RhdGVQcm9wc0VxdWFsKG5leHRTdGF0ZVByb3BzLCBzdGF0ZVByb3BzKTtcbiAgICBzdGF0ZVByb3BzID0gbmV4dFN0YXRlUHJvcHM7XG4gICAgaWYgKHN0YXRlUHJvcHNDaGFuZ2VkKSBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIGNvbnN0IHByb3BzQ2hhbmdlZCA9ICFhcmVPd25Qcm9wc0VxdWFsKG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChuZXh0U3RhdGUsIHN0YXRlLCBuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IG5leHRPd25Qcm9wcztcbiAgICBpZiAocHJvcHNDaGFuZ2VkICYmIHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHMoKTtcbiAgICBpZiAoc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3U3RhdGUoKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufVxuLy8gVE9ETzogQWRkIG1vcmUgY29tbWVudHNcbi8vIFRoZSBzZWxlY3RvciByZXR1cm5lZCBieSBzZWxlY3RvckZhY3Rvcnkgd2lsbCBtZW1vaXplIGl0cyByZXN1bHRzLFxuLy8gYWxsb3dpbmcgY29ubmVjdCdzIHNob3VsZENvbXBvbmVudFVwZGF0ZSB0byByZXR1cm4gZmFsc2UgaWYgZmluYWxcbi8vIHByb3BzIGhhdmUgbm90IGNoYW5nZWQuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KGRpc3BhdGNoLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgIGluaXRNZXJnZVByb3BzXG4gIH0gPSBfcmVmLFxuICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gaW5pdE1hcFN0YXRlVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBjb25zdCBtZXJnZVByb3BzID0gaW5pdE1lcmdlUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKTtcbiAgfVxuXG4gIHJldHVybiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIG9wdGlvbnMpO1xufSIsImltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuXG5mdW5jdGlvbiB2ZXJpZnkoc2VsZWN0b3IsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgJHttZXRob2ROYW1lfSBpbiBjb25uZWN0LmApO1xuICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICdtYXBTdGF0ZVRvUHJvcHMnIHx8IG1ldGhvZE5hbWUgPT09ICdtYXBEaXNwYXRjaFRvUHJvcHMnKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VsZWN0b3IsICdkZXBlbmRzT25Pd25Qcm9wcycpKSB7XG4gICAgICB3YXJuaW5nKGBUaGUgc2VsZWN0b3IgZm9yICR7bWV0aG9kTmFtZX0gb2YgY29ubmVjdCBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcykge1xuICB2ZXJpZnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbiAgdmVyaWZ5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJyk7XG59IiwiaW1wb3J0IHZlcmlmeVBsYWluT2JqZWN0IGZyb20gJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0JztcbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCAvLyAqIE5vdGU6XG4vLyAgSXQgc2VlbXMgdGhhdCB0aGUgZGlzcGF0Y2ggYXJndW1lbnRcbi8vICBjb3VsZCBiZSBhIGRpc3BhdGNoIGZ1bmN0aW9uIGluIHNvbWUgY2FzZXMgKGV4OiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nKVxuLy8gIGFuZCBhIHN0YXRlIG9iamVjdCBpbiBzb21lIG90aGVycyAoZXg6IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmcpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmdldENvbnN0YW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0Q29uc3RhbnRTZWxlY3RvcihkaXNwYXRjaCkge1xuICAgIGNvbnN0IGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG5cbiAgICBjb25zdGFudFNlbGVjdG9yLmRlcGVuZHNPbk93blByb3BzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNvbnN0YW50U2VsZWN0b3I7XG4gIH07XG59IC8vIGRlcGVuZHNPbk93blByb3BzIGlzIHVzZWQgYnkgY3JlYXRlTWFwVG9Qcm9wc1Byb3h5IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhc3MgcHJvcHMgYXMgYXJnc1xuLy8gdG8gdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgd3JhcHBlZC4gSXQgaXMgYWxzbyB1c2VkIGJ5IG1ha2VQdXJlUHJvcHNTZWxlY3RvciB0byBkZXRlcm1pbmVcbi8vIHdoZXRoZXIgbWFwVG9Qcm9wcyBuZWVkcyB0byBiZSBpbnZva2VkIHdoZW4gcHJvcHMgaGF2ZSBjaGFuZ2VkLlxuLy9cbi8vIEEgbGVuZ3RoIG9mIG9uZSBzaWduYWxzIHRoYXQgbWFwVG9Qcm9wcyBkb2VzIG5vdCBkZXBlbmQgb24gcHJvcHMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbi8vIEEgbGVuZ3RoIG9mIHplcm8gaXMgYXNzdW1lZCB0byBtZWFuIG1hcFRvUHJvcHMgaXMgZ2V0dGluZyBhcmdzIHZpYSBhcmd1bWVudHMgb3IgLi4uYXJncyBhbmRcbi8vIHRoZXJlZm9yZSBub3QgcmVwb3J0aW5nIGl0cyBsZW5ndGggYWNjdXJhdGVseS4uXG4vLyBUT0RPIENhbiB0aGlzIGdldCBwdWxsZWQgb3V0IHNvIHRoYXQgd2UgY2FuIHN1YnNjcmliZSBkaXJlY3RseSB0byB0aGUgc3RvcmUgaWYgd2UgZG9uJ3QgbmVlZCBvd25Qcm9wcz9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgPyBCb29sZWFuKG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIDogbWFwVG9Qcm9wcy5sZW5ndGggIT09IDE7XG59IC8vIFVzZWQgYnkgd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24gYW5kIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uLFxuLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBtYXBUb1Byb3BzIGluIGEgcHJveHkgZnVuY3Rpb24gd2hpY2ggZG9lcyBzZXZlcmFsIHRoaW5nczpcbi8vXG4vLyAgKiBEZXRlY3RzIHdoZXRoZXIgdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIGRlcGVuZHMgb24gcHJvcHMsIHdoaWNoXG4vLyAgICBpcyB1c2VkIGJ5IHNlbGVjdG9yRmFjdG9yeSB0byBkZWNpZGUgaWYgaXQgc2hvdWxkIHJlaW52b2tlIG9uIHByb3BzIGNoYW5nZXMuXG4vL1xuLy8gICogT24gZmlyc3QgY2FsbCwgaGFuZGxlcyBtYXBUb1Byb3BzIGlmIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiwgYW5kIHRyZWF0cyB0aGF0XG4vLyAgICBuZXcgZnVuY3Rpb24gYXMgdGhlIHRydWUgbWFwVG9Qcm9wcyBmb3Igc3Vic2VxdWVudCBjYWxscy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCB2ZXJpZmllcyB0aGUgZmlyc3QgcmVzdWx0IGlzIGEgcGxhaW4gb2JqZWN0LCBpbiBvcmRlciB0byB3YXJuXG4vLyAgICB0aGUgZGV2ZWxvcGVyIHRoYXQgdGhlaXIgbWFwVG9Qcm9wcyBmdW5jdGlvbiBpcyBub3QgcmV0dXJuaW5nIGEgdmFsaWQgcmVzdWx0LlxuLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBUb1Byb3BzLCBtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0UHJveHlTZWxlY3RvcihkaXNwYXRjaCwge1xuICAgIGRpc3BsYXlOYW1lXG4gIH0pIHtcbiAgICBjb25zdCBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIHVuZGVmaW5lZCk7XG4gICAgfTsgLy8gYWxsb3cgZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSB0byBnZXQgb3duUHJvcHNcblxuXG4gICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSB0cnVlO1xuXG4gICAgcHJveHkubWFwVG9Qcm9wcyA9IGZ1bmN0aW9uIGRldGVjdEZhY3RvcnlBbmRWZXJpZnkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IG1hcFRvUHJvcHM7XG4gICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpO1xuICAgICAgbGV0IHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IHByb3BzO1xuICAgICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKHByb3BzKTtcbiAgICAgICAgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KHByb3BzLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbn0iLCJpbXBvcnQgUHJvdmlkZXIgZnJvbSAnLi9jb21wb25lbnRzL1Byb3ZpZGVyJztcbmltcG9ydCBjb25uZWN0IGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlRGlzcGF0Y2gsIGNyZWF0ZURpc3BhdGNoSG9vayB9IGZyb20gJy4vaG9va3MvdXNlRGlzcGF0Y2gnO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIGNyZWF0ZVNlbGVjdG9ySG9vayB9IGZyb20gJy4vaG9va3MvdXNlU2VsZWN0b3InO1xuaW1wb3J0IHsgdXNlU3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vaG9va3MvdXNlU3RvcmUnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuL3V0aWxzL3NoYWxsb3dFcXVhbCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IFByb3ZpZGVyLCBSZWFjdFJlZHV4Q29udGV4dCwgY29ubmVjdCwgdXNlRGlzcGF0Y2gsIGNyZWF0ZURpc3BhdGNoSG9vaywgdXNlU2VsZWN0b3IsIGNyZWF0ZVNlbGVjdG9ySG9vaywgdXNlU3RvcmUsIGNyZWF0ZVN0b3JlSG9vaywgc2hhbGxvd0VxdWFsIH07IiwiaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlU3RvcmUgYXMgdXNlRGVmYXVsdFN0b3JlLCBjcmVhdGVTdG9yZUhvb2sgfSBmcm9tICcuL3VzZVN0b3JlJztcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlRGlzcGF0Y2hgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VTdG9yZSA9IC8vIEB0cy1pZ25vcmVcbiAgY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0U3RvcmUgOiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VEaXNwYXRjaCgpIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaDtcbiAgfTtcbn1cbi8qKlxyXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBgZGlzcGF0Y2hgIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fGZ1bmN0aW9ufSByZWR1eCBzdG9yZSdzIGBkaXNwYXRjaGAgZnVuY3Rpb25cclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZURpc3BhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xyXG4gKiAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKVxyXG4gKiAgIGNvbnN0IGluY3JlYXNlQ291bnRlciA9IHVzZUNhbGxiYWNrKCgpID0+IGRpc3BhdGNoKHsgdHlwZTogJ2luY3JlYXNlLWNvdW50ZXInIH0pLCBbXSlcclxuICogICByZXR1cm4gKFxyXG4gKiAgICAgPGRpdj5cclxuICogICAgICAgPHNwYW4+e3ZhbHVlfTwvc3Bhbj5cclxuICogICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtpbmNyZWFzZUNvdW50ZXJ9PkluY3JlYXNlIGNvdW50ZXI8L2J1dHRvbj5cclxuICogICAgIDwvZGl2PlxyXG4gKiAgIClcclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZURpc3BhdGNoID0gLyojX19QVVJFX18qL2NyZWF0ZURpc3BhdGNoSG9vaygpOyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5cbi8qKlxyXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiB0aGUgYFJlYWN0UmVkdXhDb250ZXh0YC4gVGhpcyBpcyBhIGxvdy1sZXZlbFxyXG4gKiBob29rIHRoYXQgeW91IHNob3VsZCB1c3VhbGx5IG5vdCBuZWVkIHRvIGNhbGwgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSB2YWx1ZSBvZiB0aGUgYFJlYWN0UmVkdXhDb250ZXh0YFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCB7IHN0b3JlIH0gPSB1c2VSZWR1eENvbnRleHQoKVxyXG4gKiAgIHJldHVybiA8ZGl2PntzdG9yZS5nZXRTdGF0ZSgpfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dCgpIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChSZWFjdFJlZHV4Q29udGV4dCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcmVhY3QtcmVkdXggY29udGV4dCB2YWx1ZTsgcGxlYXNlIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIHdyYXBwZWQgaW4gYSA8UHJvdmlkZXI+Jyk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dFZhbHVlO1xufSIsImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZURlYnVnVmFsdWUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IG5vdEluaXRpYWxpemVkIH0gZnJvbSAnLi4vdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUnO1xubGV0IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gbm90SW5pdGlhbGl6ZWQ7XG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZuO1xufTtcblxuY29uc3QgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6ICgpID0+IHVzZUNvbnRleHQoY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZXF1YWxpdHlGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhbiBlcXVhbGl0eSBmdW5jdGlvbiB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHN0b3JlLFxuICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgZ2V0U2VydmVyU3RhdGVcbiAgICB9ID0gdXNlUmVkdXhDb250ZXh0KCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGF0ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsIHN0b3JlLmdldFN0YXRlLCBnZXRTZXJ2ZXJTdGF0ZSB8fCBzdG9yZS5nZXRTdGF0ZSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICAgIHVzZURlYnVnVmFsdWUoc2VsZWN0ZWRTdGF0ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkU3RhdGU7XG4gIH07XG59XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggc3RvcmUncyBzdGF0ZS4gVGhpcyBob29rIHRha2VzIGEgc2VsZWN0b3IgZnVuY3Rpb25cclxuICogYXMgYW4gYXJndW1lbnQuIFRoZSBzZWxlY3RvciBpcyBjYWxsZWQgd2l0aCB0aGUgc3RvcmUgc3RhdGUuXHJcbiAqXHJcbiAqIFRoaXMgaG9vayB0YWtlcyBhbiBvcHRpb25hbCBlcXVhbGl0eSBjb21wYXJpc29uIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyXHJcbiAqIHRoYXQgYWxsb3dzIHlvdSB0byBjdXN0b21pemUgdGhlIHdheSB0aGUgc2VsZWN0ZWQgc3RhdGUgaXMgY29tcGFyZWQgdG8gZGV0ZXJtaW5lXHJcbiAqIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBuZWVkcyB0byBiZSByZS1yZW5kZXJlZC5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb249fSBlcXVhbGl0eUZuIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgZXF1YWxpdHlcclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHNlbGVjdGVkIHN0YXRlXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoKSA9PiB7XHJcbiAqICAgY29uc3QgY291bnRlciA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmNvdW50ZXIpXHJcbiAqICAgcmV0dXJuIDxkaXY+e2NvdW50ZXJ9PC9kaXY+XHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VTZWxlY3RvciA9IC8qI19fUFVSRV9fKi9jcmVhdGVTZWxlY3Rvckhvb2soKTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0ID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAoKSA9PiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU3RvcmUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3RvcmVcbiAgICB9ID0gdXNlUmVkdXhDb250ZXh0KCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIHJldHVybiBzdG9yZTtcbiAgfTtcbn1cbi8qKlxyXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBzdG9yZS5cclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHJlZHV4IHN0b3JlXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IEV4YW1wbGVDb21wb25lbnQgPSAoKSA9PiB7XHJcbiAqICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZSgpXHJcbiAqICAgcmV0dXJuIDxkaXY+e3N0b3JlLmdldFN0YXRlKCl9PC9kaXY+XHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VTdG9yZSA9IC8qI19fUFVSRV9fKi9jcmVhdGVTdG9yZUhvb2soKTsiLCIvLyBUaGUgcHJpbWFyeSBlbnRyeSBwb2ludCBhc3N1bWVzIHdlJ3JlIHdvcmtpbmcgd2l0aCBzdGFuZGFyZCBSZWFjdERPTS9STiwgYnV0XG4vLyBvbGRlciB2ZXJzaW9ucyB0aGF0IGRvIG5vdCBpbmNsdWRlIGB1c2VTeW5jRXh0ZXJuYWxTdG9yZWAgKFJlYWN0IDE2LjkgLSAxNy54KS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhlIHVzZVN5bmNFeHRlcm5hbFN0b3JlIGNvbXBhdCBzaGltIGlzIG5lZWRlZC5cbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlIH0gZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbSc7XG5pbXBvcnQgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciB9IGZyb20gJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vd2l0aC1zZWxlY3Rvcic7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyBhcyBiYXRjaCB9IGZyb20gJy4vdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcyc7XG5pbXBvcnQgeyBzZXRCYXRjaCB9IGZyb20gJy4vdXRpbHMvYmF0Y2gnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyBpbml0aWFsaXplQ29ubmVjdCB9IGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0JztcbmluaXRpYWxpemVVc2VTZWxlY3Rvcih1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3Rvcik7XG5pbml0aWFsaXplQ29ubmVjdCh1c2VTeW5jRXh0ZXJuYWxTdG9yZSk7IC8vIEVuYWJsZSBiYXRjaGVkIHVwZGF0ZXMgaW4gb3VyIHN1YnNjcmlwdGlvbnMgZm9yIHVzZVxuLy8gd2l0aCBzdGFuZGFyZCBSZWFjdCByZW5kZXJlcnMgKFJlYWN0RE9NLCBSZWFjdCBOYXRpdmUpXG5cbnNldEJhdGNoKGJhdGNoKTtcbmV4cG9ydCB7IGJhdGNoIH07XG5leHBvcnQgKiBmcm9tICcuL2V4cG9ydHMnOyIsImV4cG9ydCB7fTsiLCJpbXBvcnQgeyBnZXRCYXRjaCB9IGZyb20gJy4vYmF0Y2gnOyAvLyBlbmNhcHN1bGF0ZXMgdGhlIHN1YnNjcmlwdGlvbiBsb2dpYyBmb3IgY29ubmVjdGluZyBhIGNvbXBvbmVudCB0byB0aGUgcmVkdXggc3RvcmUsIGFzXG4vLyB3ZWxsIGFzIG5lc3Rpbmcgc3Vic2NyaXB0aW9ucyBvZiBkZXNjZW5kYW50IGNvbXBvbmVudHMsIHNvIHRoYXQgd2UgY2FuIGVuc3VyZSB0aGVcbi8vIGFuY2VzdG9yIGNvbXBvbmVudHMgcmUtcmVuZGVyIGJlZm9yZSBkZXNjZW5kYW50c1xuXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKSB7XG4gIGNvbnN0IGJhdGNoID0gZ2V0QmF0Y2goKTtcbiAgbGV0IGZpcnN0ID0gbnVsbDtcbiAgbGV0IGxhc3QgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIGNsZWFyKCkge1xuICAgICAgZmlyc3QgPSBudWxsO1xuICAgICAgbGFzdCA9IG51bGw7XG4gICAgfSxcblxuICAgIG5vdGlmeSgpIHtcbiAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgbGV0IGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soKTtcbiAgICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXQoKSB7XG4gICAgICBsZXQgbGlzdGVuZXJzID0gW107XG4gICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcblxuICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdGVuZXJzO1xuICAgIH0sXG5cbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgbGV0IGxpc3RlbmVyID0gbGFzdCA9IHtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIHByZXY6IGxhc3RcbiAgICAgIH07XG5cbiAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgIGxpc3RlbmVyLnByZXYubmV4dCA9IGxpc3RlbmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlyc3QgPSBsaXN0ZW5lcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAoIWlzU3Vic2NyaWJlZCB8fCBmaXJzdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobGlzdGVuZXIubmV4dCkge1xuICAgICAgICAgIGxpc3RlbmVyLm5leHQucHJldiA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFzdCA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdGVuZXIucHJldikge1xuICAgICAgICAgIGxpc3RlbmVyLnByZXYubmV4dCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlyc3QgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICB9O1xufVxuXG5jb25zdCBudWxsTGlzdGVuZXJzID0ge1xuICBub3RpZnkoKSB7fSxcblxuICBnZXQ6ICgpID0+IFtdXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViKSB7XG4gIGxldCB1bnN1YnNjcmliZTtcbiAgbGV0IGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG5cbiAgZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIGxpc3RlbmVycy5zdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICBsaXN0ZW5lcnMubm90aWZ5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2VXcmFwcGVyKCkge1xuICAgIGlmIChzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odW5zdWJzY3JpYmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlID0gcGFyZW50U3ViID8gcGFyZW50U3ViLmFkZE5lc3RlZFN1YihoYW5kbGVDaGFuZ2VXcmFwcGVyKSA6IHN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2VXcmFwcGVyKTtcbiAgICAgIGxpc3RlbmVycyA9IGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHVuc3Vic2NyaWJlID0gdW5kZWZpbmVkO1xuICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZCxcbiAgICB0cnlTdWJzY3JpYmUsXG4gICAgdHJ5VW5zdWJzY3JpYmUsXG4gICAgZ2V0TGlzdGVuZXJzOiAoKSA9PiBsaXN0ZW5lcnNcbiAgfTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn0iLCIvLyBEZWZhdWx0IHRvIGEgZHVtbXkgXCJiYXRjaFwiIGltcGxlbWVudGF0aW9uIHRoYXQganVzdCBydW5zIHRoZSBjYWxsYmFja1xuZnVuY3Rpb24gZGVmYXVsdE5vb3BCYXRjaChjYWxsYmFjaykge1xuICBjYWxsYmFjaygpO1xufVxuXG5sZXQgYmF0Y2ggPSBkZWZhdWx0Tm9vcEJhdGNoOyAvLyBBbGxvdyBpbmplY3RpbmcgYW5vdGhlciBiYXRjaGluZyBmdW5jdGlvbiBsYXRlclxuXG5leHBvcnQgY29uc3Qgc2V0QmF0Y2ggPSBuZXdCYXRjaCA9PiBiYXRjaCA9IG5ld0JhdGNoOyAvLyBTdXBwbHkgYSBnZXR0ZXIganVzdCB0byBza2lwIGRlYWxpbmcgd2l0aCBFU00gYmluZGluZ3NcblxuZXhwb3J0IGNvbnN0IGdldEJhdGNoID0gKCkgPT4gYmF0Y2g7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBjb25zdCBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gKC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IoLi4uYXJncykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufSIsIi8qKlxyXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXHJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGJhc2VQcm90byA9IHByb3RvO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xuICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XG59IiwiZXhwb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tICdyZWFjdC1kb20nOyIsImZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuLy8gTWF0Y2hlcyBsb2dpYyBpbiBSZWFjdCdzIGBzaGFyZWQvRXhlY3V0aW9uRW52aXJvbm1lbnRgIGZpbGVcblxuZXhwb3J0IGNvbnN0IGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuZXhwb3J0IGNvbnN0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VET00gPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7IiwiZXhwb3J0IGNvbnN0IG5vdEluaXRpYWxpemVkID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3VTRVMgbm90IGluaXRpYWxpemVkIScpO1xufTsiLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmApO1xuICB9XG59IiwiLyoqXHJcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxyXG4gKiBAcmV0dXJucyB7dm9pZH1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xuXG59IiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2VydmVyX2NvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VMaXN0KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn1cblxuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLlN1c3BlbnNlTGlzdCA9IFN1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1N1c3BlbnNlTGlzdCA9IGlzU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLy8gZGlzcGF0Y2ggZm9yIENvbW1vbkpTIGludGVyb3AgbmFtZWQgaW1wb3J0cy5cblxudmFyIHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUsXG4gICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgIHVzZUxheW91dEVmZmVjdCA9IFJlYWN0LnVzZUxheW91dEVmZmVjdCxcbiAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTtcbnZhciBkaWRXYXJuT2xkMThBbHBoYSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gZmFsc2U7IC8vIERpc2NsYWltZXI6IFRoaXMgc2hpbSBicmVha3MgbWFueSBvZiB0aGUgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzXG4vLyBiZWNhdXNlIG9mIGEgdmVyeSBwYXJ0aWN1bGFyIHNldCBvZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBhc3N1bXB0aW9uc1xuLy8gLS0gY2hhbmdlIGFueSBvbmUgb2YgdGhlbSBhbmQgaXQgd2lsbCBicmVhay4gVGhlIG1vc3QgaW1wb3J0YW50IGFzc3VtcHRpb25cbi8vIGlzIHRoYXQgdXBkYXRlcyBhcmUgYWx3YXlzIHN5bmNocm9ub3VzLCBiZWNhdXNlIGNvbmN1cnJlbnQgcmVuZGVyaW5nIGlzXG4vLyBvbmx5IGF2YWlsYWJsZSBpbiB2ZXJzaW9ucyBvZiBSZWFjdCB0aGF0IGFsc28gaGF2ZSBhIGJ1aWx0LWluXG4vLyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBBUEkuIEFuZCB3ZSBvbmx5IHVzZSB0aGlzIHNoaW0gd2hlbiB0aGUgYnVpbHQtaW4gQVBJXG4vLyBkb2VzIG5vdCBleGlzdC5cbi8vXG4vLyBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIGNsZXZlciBoYWNrcyB1c2VkIGJ5IHRoaXMgaG9vayBhbHNvIHdvcmsgaW4gZ2VuZXJhbC5cbi8vIFRoZSBwb2ludCBvZiB0aGlzIHNoaW0gaXMgdG8gcmVwbGFjZSB0aGUgbmVlZCBmb3IgaGFja3MgYnkgb3RoZXIgbGlicmFyaWVzLlxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCAvLyBOb3RlOiBUaGUgc2hpbSBkb2VzIG5vdCB1c2UgZ2V0U2VydmVyU25hcHNob3QsIGJlY2F1c2UgcHJlLTE4IHZlcnNpb25zIG9mXG4vLyBSZWFjdCBkbyBub3QgZXhwb3NlIGEgd2F5IHRvIGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZy4gU28gdXNlcnMgb2YgdGhlIHNoaW1cbi8vIHdpbGwgbmVlZCB0byB0cmFjayB0aGF0IHRoZW1zZWx2ZXMgYW5kIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZVxuLy8gZnJvbSBgZ2V0U25hcHNob3RgLlxuZ2V0U2VydmVyU25hcHNob3QpIHtcbiAge1xuICAgIGlmICghZGlkV2Fybk9sZDE4QWxwaGEpIHtcbiAgICAgIGlmIChSZWFjdC5zdGFydFRyYW5zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkaWRXYXJuT2xkMThBbHBoYSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgdXNpbmcgYW4gb3V0ZGF0ZWQsIHByZS1yZWxlYXNlIGFscGhhIG9mIFJlYWN0IDE4IHRoYXQgJyArICdkb2VzIG5vdCBzdXBwb3J0IHVzZVN5bmNFeHRlcm5hbFN0b3JlLiBUaGUgJyArICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZSBzaGltIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiBVcGdyYWRlICcgKyAndG8gYSBuZXdlciBwcmUtcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIEFnYWluLCB0aGlzXG4gIC8vIGJyZWFrcyB0aGUgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGhlcmUgYmVjYXVzZSBvZiBzcGVjaWZpY1xuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBtb3N0IGltcG9ydGFudGx5IHRoYXQgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgdmFyIHZhbHVlID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFZhbHVlID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgY2FjaGVkVmFsdWUpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQmVjYXVzZSB1cGRhdGVzIGFyZSBzeW5jaHJvbm91cywgd2UgZG9uJ3QgcXVldWUgdGhlbS4gSW5zdGVhZCB3ZSBmb3JjZSBhXG4gIC8vIHJlLXJlbmRlciB3aGVuZXZlciB0aGUgc3Vic2NyaWJlZCBzdGF0ZSBjaGFuZ2VzIGJ5IHVwZGF0aW5nIGFuIHNvbWVcbiAgLy8gYXJiaXRyYXJ5IHVzZVN0YXRlIGhvb2suIFRoZW4sIGR1cmluZyByZW5kZXIsIHdlIGNhbGwgZ2V0U25hcHNob3QgdG8gcmVhZFxuICAvLyB0aGUgY3VycmVudCB2YWx1ZS5cbiAgLy9cbiAgLy8gQmVjYXVzZSB3ZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlIHN0YXRlIHJldHVybmVkIGJ5IHRoZSB1c2VTdGF0ZSBob29rLCB3ZVxuICAvLyBjYW4gc2F2ZSBhIGJpdCBvZiBtZW1vcnkgYnkgc3RvcmluZyBvdGhlciBzdHVmZiBpbiB0aGF0IHNsb3QuXG4gIC8vXG4gIC8vIFRvIGltcGxlbWVudCB0aGUgZWFybHkgYmFpbG91dCwgd2UgbmVlZCB0byB0cmFjayBzb21lIHRoaW5ncyBvbiBhIG11dGFibGVcbiAgLy8gb2JqZWN0LiBVc3VhbGx5LCB3ZSB3b3VsZCBwdXQgdGhhdCBpbiBhIHVzZVJlZiBob29rLCBidXQgd2UgY2FuIHN0YXNoIGl0IGluXG4gIC8vIG91ciB1c2VTdGF0ZSBob29rIGluc3RlYWQuXG4gIC8vXG4gIC8vIFRvIGZvcmNlIGEgcmUtcmVuZGVyLCB3ZSBjYWxsIGZvcmNlVXBkYXRlKHtpbnN0fSkuIFRoYXQgd29ya3MgYmVjYXVzZSB0aGVcbiAgLy8gbmV3IG9iamVjdCBhbHdheXMgZmFpbHMgYW4gZXF1YWxpdHkgY2hlY2suXG5cblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoe1xuICAgIGluc3Q6IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICAgIH1cbiAgfSksXG4gICAgICBpbnN0ID0gX3VzZVN0YXRlWzBdLmluc3QsXG4gICAgICBmb3JjZVVwZGF0ZSA9IF91c2VTdGF0ZVsxXTsgLy8gVHJhY2sgdGhlIGxhdGVzdCBnZXRTbmFwc2hvdCBmdW5jdGlvbiB3aXRoIGEgcmVmLiBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWRcbiAgLy8gaW4gdGhlIGxheW91dCBwaGFzZSBzbyB3ZSBjYW4gYWNjZXNzIGl0IGR1cmluZyB0aGUgdGVhcmluZyBjaGVjayB0aGF0XG4gIC8vIGhhcHBlbnMgb24gc3Vic2NyaWJlLlxuXG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBXaGVuZXZlciBnZXRTbmFwc2hvdCBvciBzdWJzY3JpYmUgY2hhbmdlcywgd2UgbmVlZCB0byBjaGVjayBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gICAgLy8gZWZmZWN0IG1heSBoYXZlIG11dGF0ZWQgdGhlIHN0b3JlLlxuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VVcGRhdGUoe1xuICAgICAgICBpbnN0OiBpbnN0XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIENoZWNrIGZvciBjaGFuZ2VzIHJpZ2h0IGJlZm9yZSBzdWJzY3JpYmluZy4gU3Vic2VxdWVudCBjaGFuZ2VzIHdpbGwgYmVcbiAgICAvLyBkZXRlY3RlZCBpbiB0aGUgc3Vic2NyaXB0aW9uIGhhbmRsZXIuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VVcGRhdGUoe1xuICAgICAgICBpbnN0OiBpbnN0XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUT0RPOiBCZWNhdXNlIHRoZXJlIGlzIG5vIGNyb3NzLXJlbmRlcmVyIEFQSSBmb3IgYmF0Y2hpbmcgdXBkYXRlcywgaXQnc1xuICAgICAgLy8gdXAgdG8gdGhlIGNvbnN1bWVyIG9mIHRoaXMgbGlicmFyeSB0byB3cmFwIHRoZWlyIHN1YnNjcmlwdGlvbiBldmVudFxuICAgICAgLy8gd2l0aCB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcy4gU2hvdWxkIHdlIHRyeSB0byBkZXRlY3Qgd2hlbiB0aGlzIGlzbid0XG4gICAgICAvLyB0aGUgY2FzZSBhbmQgcHJpbnQgYSB3YXJuaW5nIGluIGRldmVsb3BtZW50P1xuICAgICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgICAgZm9yY2VVcGRhdGUoe1xuICAgICAgICAgIGluc3Q6IGluc3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTsgLy8gU3Vic2NyaWJlIHRvIHRoZSBzdG9yZSBhbmQgcmV0dXJuIGEgY2xlYW4tdXAgZnVuY3Rpb24uXG5cblxuICAgIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xuICB9LCBbc3Vic2NyaWJlXSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgLy8gTm90ZTogVGhlIHNoaW0gZG9lcyBub3QgdXNlIGdldFNlcnZlclNuYXBzaG90LCBiZWNhdXNlIHByZS0xOCB2ZXJzaW9ucyBvZlxuICAvLyBSZWFjdCBkbyBub3QgZXhwb3NlIGEgd2F5IHRvIGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZy4gU28gdXNlcnMgb2YgdGhlIHNoaW1cbiAgLy8gd2lsbCBuZWVkIHRvIHRyYWNrIHRoYXQgdGhlbXNlbHZlcyBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlXG4gIC8vIGZyb20gYGdldFNuYXBzaG90YC5cbiAgcmV0dXJuIGdldFNuYXBzaG90KCk7XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGlzU2VydmVyRW52aXJvbm1lbnQgPSAhY2FuVXNlRE9NO1xuXG52YXIgc2hpbSA9IGlzU2VydmVyRW52aXJvbm1lbnQgPyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxIDogdXNlU3luY0V4dGVybmFsU3RvcmU7XG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmUkMiA9IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlICE9PSB1bmRlZmluZWQgPyBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZSA6IHNoaW07XG5cbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltJyk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHNoaW0udXNlU3luY0V4dGVybmFsU3RvcmU7XG5cbi8vIGZvciBDb21tb25KUyBpbnRlcm9wLlxuXG52YXIgdXNlUmVmID0gUmVhY3QudXNlUmVmLFxuICAgIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgICB1c2VNZW1vID0gUmVhY3QudXNlTWVtbyxcbiAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTsgLy8gU2FtZSBhcyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSwgYnV0IHN1cHBvcnRzIHNlbGVjdG9yIGFuZCBpc0VxdWFsIGFyZ3VtZW50cy5cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3Ioc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsKSB7XG4gIC8vIFVzZSB0aGlzIHRvIHRyYWNrIHRoZSByZW5kZXJlZCBzbmFwc2hvdC5cbiAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBpbnN0O1xuXG4gIGlmIChpbnN0UmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICBpbnN0ID0ge1xuICAgICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9O1xuICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gIH0gZWxzZSB7XG4gICAgaW5zdCA9IGluc3RSZWYuY3VycmVudDtcbiAgfVxuXG4gIHZhciBfdXNlTWVtbyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIFRyYWNrIHRoZSBtZW1vaXplZCBzdGF0ZSB1c2luZyBjbG9zdXJlIHZhcmlhYmxlcyB0aGF0IGFyZSBsb2NhbCB0byB0aGlzXG4gICAgLy8gbWVtb2l6ZWQgaW5zdGFuY2Ugb2YgYSBnZXRTbmFwc2hvdCBmdW5jdGlvbi4gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYVxuICAgIC8vIHVzZVJlZiBob29rLCBiZWNhdXNlIHRoYXQgc3RhdGUgd291bGQgYmUgc2hhcmVkIGFjcm9zcyBhbGwgY29uY3VycmVudFxuICAgIC8vIGNvcGllcyBvZiB0aGUgaG9vay9jb21wb25lbnQuXG4gICAgdmFyIGhhc01lbW8gPSBmYWxzZTtcbiAgICB2YXIgbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICB2YXIgbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICB2YXIgbWVtb2l6ZWRTZWxlY3RvciA9IGZ1bmN0aW9uIChuZXh0U25hcHNob3QpIHtcbiAgICAgIGlmICghaGFzTWVtbykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgaG9vayBpcyBjYWxsZWQsIHRoZXJlIGlzIG5vIG1lbW9pemVkIHJlc3VsdC5cbiAgICAgICAgaGFzTWVtbyA9IHRydWU7XG4gICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG5cbiAgICAgICAgdmFyIF9uZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTtcblxuICAgICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gRXZlbiBpZiB0aGUgc2VsZWN0b3IgaGFzIGNoYW5nZWQsIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgc2VsZWN0aW9uXG4gICAgICAgICAgLy8gbWF5IGJlIGVxdWFsIHRvIHRoZSBuZXcgc2VsZWN0aW9uLiBXZSBzaG91bGQgYXR0ZW1wdCB0byByZXVzZSB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHZhbHVlIGlmIHBvc3NpYmxlLCB0byBwcmVzZXJ2ZSBkb3duc3RyZWFtIG1lbW9pemF0aW9ucy5cbiAgICAgICAgICBpZiAoaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBpbnN0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBfbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IF9uZXh0U2VsZWN0aW9uO1xuICAgICAgICByZXR1cm4gX25leHRTZWxlY3Rpb247XG4gICAgICB9IC8vIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uJ3MgcmVzdWx0LlxuXG5cbiAgICAgIC8vIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uJ3MgcmVzdWx0LlxuICAgICAgdmFyIHByZXZTbmFwc2hvdCA9IG1lbW9pemVkU25hcHNob3Q7XG4gICAgICB2YXIgcHJldlNlbGVjdGlvbiA9IG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgICBpZiAob2JqZWN0SXMocHJldlNuYXBzaG90LCBuZXh0U25hcHNob3QpKSB7XG4gICAgICAgIC8vIFRoZSBzbmFwc2hvdCBpcyB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuIFJldXNlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfSAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG5cblxuICAgICAgLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpOyAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG5cbiAgICAgIC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cbiAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQgJiYgaXNFcXVhbChwcmV2U2VsZWN0aW9uLCBuZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNlbGVjdGlvbjtcbiAgICAgIHJldHVybiBuZXh0U2VsZWN0aW9uO1xuICAgIH07IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cblxuXG4gICAgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuICAgIHZhciBtYXliZUdldFNlcnZlclNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBnZXRTZXJ2ZXJTbmFwc2hvdDtcblxuICAgIHZhciBnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKGdldFNuYXBzaG90KCkpO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3IgPSBtYXliZUdldFNlcnZlclNuYXBzaG90ID09PSBudWxsID8gdW5kZWZpbmVkIDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IobWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCgpKTtcbiAgICB9O1xuICAgIHJldHVybiBbZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IsIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yXTtcbiAgfSwgW2dldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWxdKSxcbiAgICAgIGdldFNlbGVjdGlvbiA9IF91c2VNZW1vWzBdLFxuICAgICAgZ2V0U2VydmVyU2VsZWN0aW9uID0gX3VzZU1lbW9bMV07XG5cbiAgdmFyIHZhbHVlID0gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTZWxlY3Rpb24sIGdldFNlcnZlclNlbGVjdGlvbik7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW5zdC5oYXNWYWx1ZSA9IHRydWU7XG4gICAgaW5zdC52YWx1ZSA9IHZhbHVlO1xuICB9LCBbdmFsdWVdKTtcbiAgdXNlRGVidWdWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCB7YmF0Y2gsIGNvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7aW5jbHVkZXMsIGlzRW1wdHl9IGZyb20gJ3JhbWRhJztcbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEdsb2JhbEVycm9yQ29udGFpbmVyIGZyb20gJy4vY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQge1xuICAgIGRpc3BhdGNoRXJyb3IsXG4gICAgaHlkcmF0ZUluaXRpYWxPdXRwdXRzLFxuICAgIG9uRXJyb3IsXG4gICAgc2V0R3JhcGhzLFxuICAgIHNldFBhdGhzLFxuICAgIHNldExheW91dFxufSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHN9IGZyb20gJy4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQge2NvbXB1dGVHcmFwaHN9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4vYWN0aW9ucy9hcGknO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vYWN0aW9ucy91dGlscyc7XG5pbXBvcnQge2FwcGx5UGVyc2lzdGVuY2V9IGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuaW1wb3J0IHtTVEFUVVN9IGZyb20gJy4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuL3V0aWxzL3dhaXQnO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4vaXNTaW1wbGVDb21wb25lbnQnO1xuaW1wb3J0IERhc2hXcmFwcGVyIGZyb20gJy4vd3JhcHBlci9EYXNoV3JhcHBlcic7XG5cbi8qKlxuICogRmlyZSBvZmYgQVBJIGNhbGxzIGZvciBpbml0aWFsaXphdGlvblxuICogQHBhcmFtIHsqfSBwcm9wcyBwcm9wc1xuICogQHJldHVybnMgeyp9IGNvbXBvbmVudFxuICovXG5jb25zdCBVbmNvbm5lY3RlZENvbnRhaW5lciA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgbGF5b3V0UmVxdWVzdCxcbiAgICAgICAgbGF5b3V0XG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgW2Vycm9yTG9hZGluZywgc2V0RXJyb3JMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoIWV2ZW50cy5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50cy5jdXJyZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJlZFRyZWUgPSB1c2VSZWYoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KHN0b3JlRWZmZWN0LmJpbmQobnVsbCwgcHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocmVuZGVyZWRUcmVlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDApO1xuICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50LmVtaXQoJ3JlbmRlcmVkJyk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnLnNlcnZlX2xvY2FsbHkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gYCR7Y29uZmlnLnJlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeH1fZGFzaC1jb21wb25lbnQtc3VpdGVzL3Bsb3RseS9wYWNrYWdlX2RhdGEvcGxvdGx5Lm1pbi5qc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cuX2Rhc2hQbG90bHlKU1VSTCA9IGNvbmZpZy5wbG90bHlqc191cmw7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG5cbiAgICBsZXQgY29udGVudDtcbiAgICBpZiAoXG4gICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzICYmXG4gICAgICAgICFpbmNsdWRlcyhsYXlvdXRSZXF1ZXN0LnN0YXR1cywgW1NUQVRVUy5PSywgJ2xvYWRpbmcnXSlcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBsYXlvdXRSZXF1ZXN0LmNvbnRlbnR9fVxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWVycm9yJz5FcnJvciBsb2FkaW5nIGxheW91dDwvZGl2PjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGVycm9yTG9hZGluZyB8fFxuICAgICAgICAoZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cywgW1NUQVRVUy5PSywgJ2xvYWRpbmcnXSkpXG4gICAgKSB7XG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgX19odG1sOiBkZXBlbmRlbmNpZXNSZXF1ZXN0LmNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtZXJyb3InPkVycm9yIGxvYWRpbmcgZGVwZW5kZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChhcHBMaWZlY3ljbGUgPT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgIHJlbmRlcmVkVHJlZS5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7QXJyYXkuaXNBcnJheShsYXlvdXQpID8gKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQubWFwKChjLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVDb21wb25lbnQoYykgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGFzaFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17W2ldfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxEYXNoV3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhdGg9e1tdfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcudWkgPT09IHRydWUgPyAoXG4gICAgICAgIDxHbG9iYWxFcnJvckNvbnRhaW5lcj57Y29udGVudH08L0dsb2JhbEVycm9yQ29udGFpbmVyPlxuICAgICkgOiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICApO1xufTtcblxuZnVuY3Rpb24gc3RvcmVFZmZlY3QocHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBhcHBMaWZlY3ljbGUsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZ3JhcGhzLFxuICAgICAgICBob29rcyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBsYXlvdXRSZXF1ZXN0XG4gICAgfSA9IHByb3BzO1xuXG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShsYXlvdXRSZXF1ZXN0KSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcHJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaG9va3MubGF5b3V0X3ByZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGF0Y2goYXBpVGh1bmsoJ19kYXNoLWxheW91dCcsICdHRVQnLCAnbGF5b3V0UmVxdWVzdCcpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRSZXF1ZXN0LnN0YXR1cyA9PT0gU1RBVFVTLk9LKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eShsYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcG9zdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcG9zdChsYXlvdXRSZXF1ZXN0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbExheW91dCA9IGFwcGx5UGVyc2lzdGVuY2UoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFJlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBzZXRQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQYXRocyhmaW5hbExheW91dCwgW10sIG51bGwsIGV2ZW50cy5jdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRMYXlvdXQoZmluYWxMYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0VtcHR5KGRlcGVuZGVuY2llc1JlcXVlc3QpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBhcGlUaHVuaygnX2Rhc2gtZGVwZW5kZW5jaWVzJywgJ0dFVCcsICdkZXBlbmRlbmNpZXNSZXF1ZXN0JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyA9PT0gU1RBVFVTLk9LICYmXG4gICAgICAgICAgICAoaXNFbXB0eShncmFwaHMpIHx8IGdyYXBocy5yZXNldClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBzZXRHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llc1JlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGdyYXBocykgJiZcbiAgICAgICAgICAgIC8vIExheW91dFJlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGxheW91dCkgJiZcbiAgICAgICAgICAgIC8vIEhhc24ndCBhbHJlYWR5IGh5ZHJhdGVkXG4gICAgICAgICAgICBhcHBMaWZlY3ljbGUgPT09IGdldEFwcFN0YXRlKCdTVEFSVEVEJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goaHlkcmF0ZUluaXRpYWxPdXRwdXRzKGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXNwbGF5IHRoaXMgZXJyb3IgaW4gZGV2dG9vbHMsIHVubGVzcyB3ZSBoYXZlIGVycm9yc1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHksIGluIHdoaWNoIGNhc2Ugd2UgYXNzdW1lIHRoaXMgbmV3IG9uZSBpcyBtb290XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5mcm9udEVuZC5sZW5ndGggJiYgIWVycm9yLmJhY2tFbmQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3I6IGVycn0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRFcnJvckxvYWRpbmcoaGFzRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cblVuY29ubmVjdGVkQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBhcHBMaWZlY3ljbGU6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICAgIGdldEFwcFN0YXRlKCdTVEFSVEVEJyksXG4gICAgICAgIGdldEFwcFN0YXRlKCdIWURSQVRFRCcpLFxuICAgICAgICBnZXRBcHBTdGF0ZSgnREVTVFJPWUVEJylcbiAgICBdKSxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZGVwZW5kZW5jaWVzUmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBncmFwaHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG9va3M6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGF5b3V0UmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5hbnksXG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLmFueSxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmNvbnN0IENvbnRhaW5lciA9IGNvbm5lY3QoXG4gICAgLy8gbWFwIHN0YXRlIHRvIHByb3BzXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlOiBzdGF0ZS5hcHBMaWZlY3ljbGUsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Q6IHN0YXRlLmRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGhvb2tzOiBzdGF0ZS5ob29rcyxcbiAgICAgICAgbGF5b3V0UmVxdWVzdDogc3RhdGUubGF5b3V0UmVxdWVzdCxcbiAgICAgICAgbGF5b3V0OiBzdGF0ZS5sYXlvdXQsXG4gICAgICAgIGdyYXBoczogc3RhdGUuZ3JhcGhzLFxuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5LFxuICAgICAgICBlcnJvcjogc3RhdGUuZXJyb3IsXG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnXG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgQ29udGFpbmVyO1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBBUElDb250cm9sbGVyIGZyb20gJy4vQVBJQ29udHJvbGxlci5yZWFjdCc7XG5pbXBvcnQgTG9hZGluZyBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9Mb2FkaW5nLnJlYWN0JztcbmltcG9ydCBUb29sYmFyIGZyb20gJy4vY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIucmVhY3QnO1xuaW1wb3J0IFJlbG9hZGVyIGZyb20gJy4vY29tcG9uZW50cy9jb3JlL1JlbG9hZGVyLnJlYWN0JztcbmltcG9ydCBnZXRDb25maWdGcm9tRE9NIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7c2V0SG9va3MsIHNldENvbmZpZ30gZnJvbSAnLi9hY3Rpb25zL2luZGV4JztcbmltcG9ydCB7dHlwZSwgbWVtb2l6ZVdpdGgsIGlkZW50aXR5fSBmcm9tICdyYW1kYSc7XG5cbmNsYXNzIFVuY29ubmVjdGVkQXBwQ29udGFpbmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLmxheW91dF9wcmUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLmxheW91dF9wb3N0ICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5yZXF1ZXN0X3ByZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9wb3N0ICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5jYWxsYmFja19yZXNvbHZlZCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBob29rcyA9IHByb3BzLmhvb2tzO1xuXG4gICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCkge1xuICAgICAgICAgICAgICAgIGhvb2tzID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5ob29rcyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbWVtb2l6ZVdpdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3RcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb3BzLmRpc3BhdGNoKHNldEhvb2tzKGhvb2tzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbURPTSgpO1xuXG4gICAgICAgIC8vIHByZXNldCBjb21tb24gcmVxdWVzdCBwYXJhbXMgaW4gdGhlIGNvbmZpZ1xuICAgICAgICBjb25maWcuZmV0Y2ggPSB7XG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZGlzcGF0Y2goc2V0Q29uZmlnKGNvbmZpZykpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAodHlwZShjb25maWcpID09PSAnTnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZyc+TG9hZGluZy4uLjwvZGl2PjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7c2hvd191bmRvX3JlZG99ID0gY29uZmlnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgIHtzaG93X3VuZG9fcmVkbyA/IDxUb29sYmFyIC8+IDogbnVsbH1cbiAgICAgICAgICAgICAgICA8QVBJQ29udHJvbGxlciAvPlxuICAgICAgICAgICAgICAgIDxMb2FkaW5nIC8+XG4gICAgICAgICAgICAgICAgPFJlbG9hZGVyIC8+XG4gICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuVW5jb25uZWN0ZWRBcHBDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGhvb2tzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmNvbnN0IEFwcENvbnRhaW5lciA9IGNvbm5lY3QoXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeSxcbiAgICAgICAgY29uZmlnOiBzdGF0ZS5jb25maWdcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoVW5jb25uZWN0ZWRBcHBDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBBcHBDb250YWluZXI7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgQXBwQ29udGFpbmVyIGZyb20gJy4vQXBwQ29udGFpbmVyLnJlYWN0JztcbmNvbnN0IEFwcFByb3ZpZGVyID0gKHsgaG9va3MgPSB7XG4gICAgbGF5b3V0X3ByZTogbnVsbCxcbiAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICByZXF1ZXN0X3ByZTogbnVsbCxcbiAgICByZXF1ZXN0X3Bvc3Q6IG51bGwsXG4gICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbnVsbFxufSB9KSA9PiB7XG4gICAgY29uc3QgW3sgc3RvcmUgfV0gPSB1c2VTdGF0ZSgoKSA9PiBuZXcgU3RvcmUoKSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7IHN0b3JlOiBzdG9yZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEFwcENvbnRhaW5lciwgeyBob29rczogaG9va3MgfSkpKTtcbn07XG5BcHBQcm92aWRlci5wcm9wVHlwZXMgPSB7XG4gICAgaG9va3M6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGxheW91dF9wcmU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBsYXlvdXRfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBQcm9wVHlwZXMuZnVuY1xuICAgIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgQXBwUHJvdmlkZXI7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCBBcHBQcm92aWRlciBmcm9tICcuL0FwcFByb3ZpZGVyLnJlYWN0JztcblxuaW1wb3J0ICcuL2Rhc2hBcGknO1xuXG5jbGFzcyBEYXNoUmVuZGVyZXIge1xuICAgIGNvbnN0cnVjdG9yKGhvb2tzKSB7XG4gICAgICAgIC8vIHJlbmRlciBEYXNoIFJlbmRlcmVyIHVwb24gaW5pdGlhbGlzaW5nIVxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVhY3QtZW50cnktcG9pbnQnKTtcblxuICAgICAgICBpZiAoUmVhY3RET00uY3JlYXRlUm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vdCA9IFJlYWN0RE9NLmNyZWF0ZVJvb3QoY29udGFpbmVyKTtcbiAgICAgICAgICAgIHJvb3QucmVuZGVyKDxBcHBQcm92aWRlciBob29rcz17aG9va3N9IC8+KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFJlYWN0RE9NLnJlbmRlcig8QXBwUHJvdmlkZXIgaG9va3M9e2hvb2tzfSAvPiwgY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtEYXNoUmVuZGVyZXJ9O1xuIiwiaW1wb3J0IHsgYW55LCBmaWx0ZXIsIG1hcCwgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlT2JzZXJ2ZXIge1xuICAgIF9zdG9yZTtcbiAgICBfdW5zdWJzY3JpYmU7XG4gICAgX29ic2VydmVycyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH1cbiAgICBvYnNlcnZlID0gKG9ic2VydmVyLCBpbnB1dHMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZChvYnNlcnZlciwgaW5wdXRzKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGQob2JzZXJ2ZXIub2JzZXJ2ZXIsIG9ic2VydmVyLmlucHV0cyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlci5vYnNlcnZlcik7XG4gICAgfTtcbiAgICBzZXRTdG9yZSA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9fZmluYWxpemVfXygpO1xuICAgICAgICB0aGlzLl9faW5pdF9fKHN0b3JlKTtcbiAgICB9O1xuICAgIF9fZmluYWxpemVfXyA9ICgpID0+IHRoaXMuX3Vuc3Vic2NyaWJlPy4oKTtcbiAgICBfX2luaXRfXyA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHRoaXMubm90aWZ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8ubGFzdFN0YXRlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhZGQgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4gdGhpcy5fb2JzZXJ2ZXJzLnB1c2goe1xuICAgICAgICBpbnB1dFBhdGhzOiBtYXAocCA9PiBwLnNwbGl0KCcuJyksIGlucHV0cyksXG4gICAgICAgIGxhc3RTdGF0ZTogbnVsbCxcbiAgICAgICAgb2JzZXJ2ZXIsXG4gICAgICAgIHRyaWdnZXJlZDogZmFsc2VcbiAgICB9KTtcbiAgICBub3RpZnkgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fc3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IGZpbHRlcihvID0+ICFvLnRyaWdnZXJlZCAmJlxuICAgICAgICAgICAgYW55KGkgPT4gcGF0aChpLCBzdGF0ZSkgIT09IHBhdGgoaSwgby5sYXN0U3RhdGUpLCBvLmlucHV0UGF0aHMpLCB0aGlzLl9vYnNlcnZlcnMpO1xuICAgICAgICB0cmlnZ2VyZWQuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgby5vYnNlcnZlcihzdG9yZSk7XG4gICAgICAgICAgICBvLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJlbW92ZSA9IChvYnNlcnZlcikgPT4gdGhpcy5fb2JzZXJ2ZXJzLnNwbGljZSh0aGlzLl9vYnNlcnZlcnMuZmluZEluZGV4KG8gPT4gb2JzZXJ2ZXIgPT09IG8ub2JzZXJ2ZXIsIHRoaXMuX29ic2VydmVycyksIDEpO1xufVxuIiwiaW1wb3J0IHttZXJnZURlZXBSaWdodCwgb25jZX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtnZXRDU1JGSGVhZGVyLCBoYW5kbGVBc3luY0Vycm9yLCBhZGRIdHRwSGVhZGVyc30gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtNQVhfQVVUSF9SRVRSSUVTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0pXVF9FWFBJUkVEX01FU1NBR0UsIFNUQVRVU30gZnJvbSAnLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG5jb25zdCBsb2dXYXJuaW5nT25jZSA9IG9uY2UoY29uc29sZS53YXJuKTtcblxuZnVuY3Rpb24gR0VUKHBhdGgsIGZldGNoQ29uZmlnKSB7XG4gICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBwYXRoLFxuICAgICAgICBtZXJnZURlZXBSaWdodChmZXRjaENvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGdldENTUkZIZWFkZXIoKVxuICAgICAgICB9KVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIFBPU1QocGF0aCwgZmV0Y2hDb25maWcsIGJvZHkgPSB7fSkge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcigpLFxuICAgICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogbnVsbFxuICAgICAgICB9KVxuICAgICk7XG59XG5cbmNvbnN0IHJlcXVlc3QgPSB7R0VULCBQT1NUfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBpVGh1bmsoZW5kcG9pbnQsIG1ldGhvZCwgc3RvcmUsIGlkLCBib2R5KSB7XG4gICAgcmV0dXJuIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgbGV0IHtjb25maWcsIGhvb2tzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9JHtlbmRwb2ludH1gO1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbm5lY3Rpb25TdGF0dXMoY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKS5lcnJvci5iYWNrRW5kQ29ubmVjdGVkICE9PSBjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBjb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgcGF5bG9hZDoge2lkLCBzdGF0dXM6ICdsb2FkaW5nJ31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0W21ldGhvZF0odXJsLCBjb25maWcuZmV0Y2gsIGJvZHkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggcmVqZWN0aW9uIC0gdGhpcyBtZWFucyB0aGUgcmVxdWVzdCBkaWRuJ3QgcmV0dXJuLFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBnZXQgaGVyZSBmcm9tIDQwMC81MDAgZXJyb3JzLCBvbmx5IG5ldHdvcmtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3JzIG9yIHVucmVzcG9uc2l2ZSBzZXJ2ZXJzLlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmV0Y2ggZXJyb3InLCByZXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gU1RBVFVTLlVOQVVUSE9SSVpFRCB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuQkFEX1JFUVVFU1RcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoSldUX0VYUElSRURfTUVTU0FHRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdKd3QgPSBhd2FpdCBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uLnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCZWFyZXIgJy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld0p3dH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VEZWVwUmlnaHQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkSHR0cEhlYWRlcnMobmV3SGVhZGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXR1cyh0cnVlKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCkudGhlbihqc29uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGpzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBsb2dXYXJuaW5nT25jZShcbiAgICAgICAgICAgICAgICAnUmVzcG9uc2UgaXMgbWlzc2luZyBoZWFkZXI6IGNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnRXJyb3IgZnJvbSBBUEkgY2FsbDogJyArIGVuZHBvaW50O1xuICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnIsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGludGVyc2VjdGlvbiwga2V5cywgbWFwLCBtZXJnZURlZXBSaWdodCwgcGF0aCwgcGljaywgcGx1Y2ssIHZhbHVlcywgdG9QYWlycywgemlwLCBhc3NvY1BhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBTVEFUVVMsIEpXVF9FWFBJUkVEX01FU1NBR0UgfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9BVVRIX1JFVFJJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0FjdGlvblR5cGUsIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVkLCBzdHJpbmdpZnlJZCwgaXNNdWx0aU91dHB1dFByb3AgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyB1cmxCYXNlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDU1JGSGVhZGVyLCBkaXNwYXRjaEVycm9yIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7IGFkZEh0dHBIZWFkZXJzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBoYW5kbGVQYXRjaCwgaXNQYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHsgcmVxdWVzdERlcGVuZGVuY2llcyB9IGZyb20gJy4vcmVxdWVzdERlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBsb2FkTGlicmFyeSB9IGZyb20gJy4uL3V0aWxzL2xpYnJhcmllcyc7XG5pbXBvcnQgeyBwYXJzZVBNQ0lkIH0gZnJvbSAnLi9wYXR0ZXJuTWF0Y2hpbmcnO1xuaW1wb3J0IHsgcmVwbGFjZVBNQyB9IGZyb20gJy4vcGF0dGVybk1hdGNoaW5nJztcbmltcG9ydCB7IGxvYWRlZCwgbG9hZGluZyB9IGZyb20gJy4vbG9hZGluZyc7XG5leHBvcnQgY29uc3QgYWRkQmxvY2tlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZCk7XG5leHBvcnQgY29uc3QgYWRkQ29tcGxldGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZCk7XG5leHBvcnQgY29uc3QgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmcpO1xuZXhwb3J0IGNvbnN0IGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZCk7XG5leHBvcnQgY29uc3QgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFN0b3JlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkKTtcbmV4cG9ydCBjb25zdCBhZGRXYXRjaGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVFeGVjdXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUJsb2NrZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nKTtcbmV4cG9ydCBjb25zdCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVTdG9yZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZCk7XG5leHBvcnQgY29uc3QgYWdncmVnYXRlQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGUpO1xuY29uc3QgdXBkYXRlUmVzb3VyY2VVc2FnZSA9IGNyZWF0ZUFjdGlvbignVVBEQVRFX1JFU09VUkNFX1VTQUdFJyk7XG5jb25zdCBhZGRDYWxsYmFja0pvYiA9IGNyZWF0ZUFjdGlvbignQUREX0NBTExCQUNLX0pPQicpO1xuY29uc3QgcmVtb3ZlQ2FsbGJhY2tKb2IgPSBjcmVhdGVBY3Rpb24oJ1JFTU9WRV9DQUxMQkFDS19KT0InKTtcbmNvbnN0IHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQgPSBjcmVhdGVBY3Rpb24oJ0NBTExCQUNLX0pPQl9PVVREQVRFRCcpO1xuZnVuY3Rpb24gdW53cmFwSWZOb3RNdWx0aShwYXRocywgaWRQcm9wcywgc3BlYywgYW55VmFscywgZGVwVHlwZSkge1xuICAgIGxldCBtc2cgPSAnJztcbiAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjKSkge1xuICAgICAgICByZXR1cm4gW2lkUHJvcHMsIG1zZ107XG4gICAgfVxuICAgIGlmIChpZFByb3BzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICBpZiAoIWlkUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc3BlYy5hbGxvd19vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGlkUHJvcHMgPSBbeyAuLi5zcGVjLCB2YWx1ZTogbnVsbCB9XTtcbiAgICAgICAgICAgICAgICBtc2cgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RyID0gdHlwZW9mIHNwZWMuaWQgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIG1zZyA9XG4gICAgICAgICAgICAgICAgICAgICdBIG5vbmV4aXN0ZW50IG9iamVjdCB3YXMgdXNlZCBpbiBhbiBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBUeXBlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdgIG9mIGEgRGFzaCBjYWxsYmFjay4gVGhlIGlkIG9mIHRoaXMgb2JqZWN0IGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGlzU3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYCcgKyBzcGVjLmlkICsgJ2AnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbnlWYWxzID8gJyB3aXRoIE1BVENIIHZhbHVlcyAnICsgYW55VmFscyA6ICcnKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBhbmQgdGhlIHByb3BlcnR5IGlzIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMucHJvcGVydHkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGlzU3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYC4gVGhlIHN0cmluZyBpZHMgaW4gdGhlIGN1cnJlbnQgbGF5b3V0IGFyZTogWycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzKHBhdGhzLnN0cnMpLmpvaW4oJywgJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdgLiBUaGUgd2lsZGNhcmQgaWRzIGN1cnJlbnRseSBhdmFpbGFibGUgYXJlIGxvZ2dlZCBhYm92ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1zZyA9XG4gICAgICAgICAgICAgICAgJ011bHRpcGxlIG9iamVjdHMgd2VyZSBmb3VuZCBmb3IgYW4gYCcgK1xuICAgICAgICAgICAgICAgICAgICBkZXBUeXBlICtcbiAgICAgICAgICAgICAgICAgICAgJ2Agb2YgYSBjYWxsYmFjayB0aGF0IG9ubHkgdGFrZXMgb25lIHZhbHVlLiBUaGUgaWQgc3BlYyBpcyAnICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3BlYy5pZCkgK1xuICAgICAgICAgICAgICAgICAgICAoYW55VmFscyA/ICcgd2l0aCBNQVRDSCB2YWx1ZXMgJyArIGFueVZhbHMgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnIGFuZCB0aGUgcHJvcGVydHkgaXMgYCcgK1xuICAgICAgICAgICAgICAgICAgICBzcGVjLnByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAgICAgJ2AuIFRoZSBvYmplY3RzIHdlIGZvdW5kIGFyZTogJyArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1hcChwaWNrKFsnaWQnLCAncHJvcGVydHknXSksIGlkUHJvcHMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2lkUHJvcHNbMF0sIG1zZ107XG59XG5mdW5jdGlvbiBmaWxsVmFscyhwYXRocywgbGF5b3V0LCBjYiwgc3BlY3MsIGRlcFR5cGUsIGFsbG93QWxsTWlzc2luZyA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2V0dGVyID0gZGVwVHlwZSA9PT0gJ0lucHV0JyA/IGNiLmdldElucHV0cyA6IGNiLmdldFN0YXRlO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGxldCBlbXB0eU11bHRpVmFsdWVzID0gMDtcbiAgICBjb25zdCBpbnB1dFZhbHMgPSBnZXR0ZXIocGF0aHMpLm1hcCgoaW5wdXRMaXN0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IFtpbnB1dHMsIGlucHV0RXJyb3JdID0gdW53cmFwSWZOb3RNdWx0aShwYXRocywgaW5wdXRMaXN0Lm1hcCgoeyBpZCwgcHJvcGVydHksIHBhdGg6IHBhdGhfIH0pID0+ICh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgdmFsdWU6IHBhdGgoWy4uLnBhdGhfLCAncHJvcHMnLCBwcm9wZXJ0eV0sIGxheW91dClcbiAgICAgICAgfSkpLCBzcGVjc1tpXSwgY2IuYW55VmFscywgZGVwVHlwZSk7XG4gICAgICAgIGlmIChpc011bHRpVmFsdWVkKHNwZWNzW2ldKSAmJiAhaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZW1wdHlNdWx0aVZhbHVlcysrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dEVycm9yKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChpbnB1dEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH0pO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChhbGxvd0FsbE1pc3NpbmcgJiZcbiAgICAgICAgICAgIGVycm9ycy5sZW5ndGggKyBlbXB0eU11bHRpVmFsdWVzID09PSBpbnB1dFZhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IG9uZSBub24tbXVsdGl2YWx1ZWQgaW5wdXQsIGJ1dCBhbGwgc2ltcGxlIGFuZFxuICAgICAgICAgICAgLy8gbXVsdGktdmFsdWVkIGlucHV0cyBhcmUgbWlzc2luZy5cbiAgICAgICAgICAgIC8vIChpZiBhbGwgaW5wdXRzIGFyZSBtdWx0aXZhbHVlZCBhbmQgYWxsIG1pc3Npbmcgd2Ugc3RpbGwgcmV0dXJuXG4gICAgICAgICAgICAvLyB0aGVtIGFzIG5vcm1hbCwgYW5kIGZpcmUgdGhlIGNhbGxiYWNrLilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHdlIGhhdmUgc29tZSBtaXNzaW5nIGFuZCBzb21lIHByZXNlbnQgaW5wdXRzLlxuICAgICAgICAvLyBPciBhbGwgbWlzc2luZyBpbiBhIGNvbnRleHQgdGhhdCBkb2Vzbid0IGFsbG93IHRoaXMuXG4gICAgICAgIC8vIFRoYXQncyBhIHJlYWwgcHJvYmxlbSwgc28gdGhyb3cgdGhlIGZpcnN0IG1lc3NhZ2UgYXMgYW4gZXJyb3IuXG4gICAgICAgIHJlZkVycihlcnJvcnMsIHBhdGhzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0VmFscztcbn1cbmZ1bmN0aW9uIHJlZkVycihlcnJvcnMsIHBhdGhzKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3JzWzBdO1xuICAgIGlmIChlcnIuaW5kZXhPZignbG9nZ2VkIGFib3ZlJykgIT09IC0xKSB7XG4gICAgICAgIC8vIFdpbGRjYXJkIHJlZmVyZW5jZSBlcnJvcnMgbWVudGlvbiBhIGxpc3Qgb2Ygd2lsZGNhcmQgc3BlY3MgbG9nZ2VkXG4gICAgICAgIC8vIFRPRE86IHVud3JhcHBlZCBsaXN0IG9mIHdpbGRjYXJkIGlkcz9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcihwYXRocy5vYmpzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGVycik7XG59XG5jb25zdCBnZXRWYWxzID0gKGlucHV0KSA9PiBBcnJheS5pc0FycmF5KGlucHV0KSA/IHBsdWNrKCd2YWx1ZScsIGlucHV0KSA6IGlucHV0LnZhbHVlO1xuY29uc3QgemlwSWZBcnJheSA9IChhLCBiKSA9PiBBcnJheS5pc0FycmF5KGEpID8gemlwKGEsIGIpIDogW1thLCBiXV07XG5mdW5jdGlvbiBjbGVhbk91dHB1dFByb3AocHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkuc3BsaXQoJ0AnKVswXTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNsaWVudHNpZGUoZGlzcGF0Y2gsIGNsaWVudHNpZGVfZnVuY3Rpb24sIGNvbmZpZywgcGF5bG9hZCkge1xuICAgIGNvbnN0IGRjID0gKHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgPVxuICAgICAgICB3aW5kb3cuZGFzaF9jbGllbnRzaWRlIHx8IHt9KTtcbiAgICBpZiAoIWRjLm5vX3VwZGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdub191cGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1JldHVybiB0byBwcmV2ZW50IHVwZGF0aW5nIGFuIE91dHB1dC4nIH0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYywgJ1ByZXZlbnRVcGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1Rocm93IHRvIHByZXZlbnQgdXBkYXRpbmcgYWxsIE91dHB1dHMuJyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cywgc3RhdGUgfSA9IHBheWxvYWQ7XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGlucHV0RGljdCA9IGlucHV0c1RvRGljdChpbnB1dHMpO1xuICAgIGNvbnN0IHN0YXRlRGljdCA9IGlucHV0c1RvRGljdChzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgbGV0IHN0YXR1cyA9IFNUQVRVUy5PSztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB7IG5hbWVzcGFjZSwgZnVuY3Rpb25fbmFtZSB9ID0gY2xpZW50c2lkZV9mdW5jdGlvbjtcbiAgICAgICAgbGV0IGFyZ3MgPSBpbnB1dHMubWFwKGdldFZhbHMpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBjb25jYXQoYXJncywgc3RhdGUubWFwKGdldFZhbHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXR1cCBjYWxsYmFjayBjb250ZXh0XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQgPSB7fTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC50cmlnZ2VyZWQgPSBwYXlsb2FkLmNoYW5nZWRQcm9wSWRzLm1hcChwcm9wX2lkID0+ICh7XG4gICAgICAgICAgICBwcm9wX2lkOiBwcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0RGljdFtwcm9wX2lkXVxuICAgICAgICB9KSk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQudHJpZ2dlcmVkX2lkID0gZ2V0VHJpZ2dlcmVkSWQocGF5bG9hZC5jaGFuZ2VkUHJvcElkcyk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzX2xpc3QgPSBpbnB1dHM7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzID0gaW5wdXREaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlc19saXN0ID0gc3RhdGU7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuc3RhdGVzID0gc3RhdGVEaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0Lm91dHB1dHNfbGlzdCA9IG91dHB1dHM7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGRjW25hbWVzcGFjZV1bZnVuY3Rpb25fbmFtZV0oLi4uYXJncyk7XG4gICAgICAgIGRlbGV0ZSBkYy5jYWxsYmFja19jb250ZXh0O1xuICAgICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlPy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGF3YWl0IHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXRzKSB7XG4gICAgICAgICAgICB6aXBJZkFycmF5KG91dHB1dHMsIHJldHVyblZhbHVlKS5mb3JFYWNoKChbb3V0aSwgcmV0aV0pID0+IHtcbiAgICAgICAgICAgICAgICB6aXBJZkFycmF5KG91dGksIHJldGkpLmZvckVhY2goKFtvdXRpaiwgcmV0aWpdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQsIHByb3BlcnR5IH0gPSBvdXRpajtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JJZCA9IChyZXN1bHRbaWRTdHJdID0gcmVzdWx0W2lkU3RyXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRpaiAhPT0gZGMubm9fdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRm9ySWRbY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KV0gPSByZXRpajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IGRjLlByZXZlbnRVcGRhdGUpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5QUkVWRU5UX1VQREFURTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5DTElFTlRTSURFX0VSUk9SO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG4gICAgICAgIC8vIFNldHRpbmcgc2VydmVyID0gY2xpZW50IGZvcmNlcyBuZXR3b3JrID0gMFxuICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHtcbiAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50KGNvbXBvbmVudF9pZCwgcHJvcHMsIGNiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBwYXRocywgY29uZmlnIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50X2lkKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkoJ0lEIHJ1bm5pbmcgY29tcG9uZW50IG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICAgICAgICAgICdDb21wb25lbnQgZGVmaW5lZCBpbiBydW5uaW5nIGtleXdvcmQgbm90IGZvdW5kIGluIGxheW91dC4nLFxuICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50IGlkOiBcIiR7c3RyaW5naWZ5SWQoY29tcG9uZW50X2lkKX1cImAsXG4gICAgICAgICAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOicsXG4gICAgICAgICAgICAgICAgICAgIGAke2NiLm91dHB1dH1gLFxuICAgICAgICAgICAgICAgICAgICAnWW91IGNhbiBzdXBwcmVzcyB0aGlzIGV4Y2VwdGlvbiBieSBzZXR0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCBmdXJ0aGVyIHByb2Nlc3NpbmcgYmVjYXVzZSBmdW5jdGlvbnMgZnVydGhlciBvblxuICAgICAgICAgICAgLy8gY2FuJ3Qgb3BlcmF0ZSBvbiBhbiAndW5kZWZpbmVkJyBvYmplY3QsIGFuZCB0aGV5IHdpbGwgdGhyb3cgYW5cbiAgICAgICAgICAgIC8vIGVycm9yLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2FsbGJhY2snXG4gICAgICAgIH0pKTtcbiAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHsgaWQ6IGNvbXBvbmVudF9pZCwgcHJvcHMgfSkpO1xuICAgIH07XG59XG4vKipcbiAqIFVwZGF0ZSBhIGNvbXBvbmVudCBwcm9wcyB3aXRoIGBydW5uaW5nYC9gcHJvZ3Jlc3NgL2BzZXRfcHJvcHNgIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRzIFByb3BzIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSBjYiBUaGUgb3JpZ2luYXRpbmcgY2FsbGJhY2sgaW5mby5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHNpZGVVcGRhdGUob3V0cHV0cywgY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB0b1BhaXJzKG91dHB1dHMpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIFtpZCwgdmFsdWVdLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50SWQgPSBpZCwgcHJvcE5hbWUsIHJlcGxhY2VkSWRzID0gW107XG4gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBwYXJzZVBNQ0lkKGlkKTtcbiAgICAgICAgICAgICAgICByZXBsYWNlZElkcyA9IHJlcGxhY2VQTUMoY29tcG9uZW50SWQsIGNiLCBpLCBnZXRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBpZC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBwcm9wTmFtZSA/IHsgW3Byb3BOYW1lXTogdmFsdWUgfSA6IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtjb21wb25lbnRJZCwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtyZXBsYWNlZElkc1swXSwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkSWRzLmZvckVhY2goKHJlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2MucHVzaChbcmVwLCBwcm9wc10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuZm9yRWFjaCgoW2lkLCBpZFByb3BzXSkgPT4ge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlQ29tcG9uZW50KGlkLCBpZFByb3BzLCBjYikpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIGNvbmZpZywgcGF5bG9hZCwgYmFja2dyb3VuZCwgYWRkaXRpb25hbEFyZ3MsIGdldFN0YXRlLCBydW5uaW5nKSB7XG4gICAgaWYgKGhvb2tzLnJlcXVlc3RfcHJlKSB7XG4gICAgICAgIGhvb2tzLnJlcXVlc3RfcHJlKHBheWxvYWQpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIGxldCBjYWNoZUtleTtcbiAgICBsZXQgam9iO1xuICAgIGxldCBydW5uaW5nT2ZmO1xuICAgIGxldCBwcm9ncmVzc0RlZmF1bHQ7XG4gICAgbGV0IG1vcmVBcmdzID0gYWRkaXRpb25hbEFyZ3M7XG4gICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nLnJ1bm5pbmcsIHBheWxvYWQpKTtcbiAgICAgICAgcnVubmluZ09mZiA9IHJ1bm5pbmcucnVubmluZ09mZjtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGdldENTUkZIZWFkZXIoKTtcbiAgICAgICAgbGV0IHVybCA9IGAke3VybEJhc2UoY29uZmlnKX1fZGFzaC11cGRhdGUtY29tcG9uZW50YDtcbiAgICAgICAgbGV0IG5ld0JvZHkgPSBib2R5O1xuICAgICAgICBjb25zdCBhZGRBcmcgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBkZWxpbSA9ICc/JztcbiAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJz8nKSkge1xuICAgICAgICAgICAgICAgIGRlbGltID0gJyYnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7ZGVsaW19JHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjYWNoZUtleSB8fCBqb2IpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUtleSlcbiAgICAgICAgICAgICAgICBhZGRBcmcoJ2NhY2hlS2V5JywgY2FjaGVLZXkpO1xuICAgICAgICAgICAgaWYgKGpvYilcbiAgICAgICAgICAgICAgICBhZGRBcmcoJ2pvYicsIGpvYik7XG4gICAgICAgICAgICAvLyBjbGVhciBpbnB1dHMgYXMgYmFja2dyb3VuZCBjYWxsYmFjayBkb2VzbnQgbmVlZCBpbnB1dHMsIGp1c3QgdmVyaWZ5IGZvciBjb250ZXh0XG4gICAgICAgICAgICBjb25zdCB0bXBCb2R5ID0gSlNPTi5wYXJzZShuZXdCb2R5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG1wQm9keS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0bXBCb2R5LmlucHV0c1tpXVsndmFsdWUnXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0bXBCb2R5Py5zdGF0ZSB8fCBbXSkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0bXBCb2R5LnN0YXRlW2ldWyd2YWx1ZSddID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0JvZHkgPSBKU09OLnN0cmluZ2lmeSh0bXBCb2R5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9yZUFyZ3MpIHtcbiAgICAgICAgICAgIG1vcmVBcmdzLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gYWRkQXJnKGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgIG1vcmVBcmdzID0gbW9yZUFyZ3MuZmlsdGVyKChbXywgX18sIHNpbmdsZV0pID0+ICFzaW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaCh1cmwsIG1lcmdlRGVlcFJpZ2h0KGNvbmZpZy5mZXRjaCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogbmV3Qm9keVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVPdXRwdXQgPSAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrSm9iID0gZ2V0U3RhdGUoKS5jYWxsYmFja0pvYnNbam9iXTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tKb2I/Lm91dGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHJlbW92ZUNhbGxiYWNrSm9iKHsgam9iSWQ6IGpvYiB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiByZWNvcmRQcm9maWxlKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgcHJvZmlsaW5nIC0gb25seSByZWxldmFudCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyB1aVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZ0hlYWRlcnMgPSByZXMuaGVhZGVycy5nZXQoJ1NlcnZlci1UaW1pbmcnKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgdGltaW5nSGVhZGVycy5zcGxpdCgnLCcpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhlYWRlci5zcGxpdCgnOycpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyID0gaGVhZGVyLm1hdGNoKC87ZHVyPVswLTkuXSsvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbbmFtZV0gPSBOdW1iZXIoZHVyWzBdLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmluaXNoTGluZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtdWx0aSwgcmVzcG9uc2UgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG91dHB1dC5zdWJzdHIoMCwgb3V0cHV0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IFtpZF06IHJlc3BvbnNlLnByb3BzIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29tcGxldGVKb2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7IGpvYklkOiBqb2IgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ09mZikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHByb2dyZXNzRGVmYXVsdCwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgICAgICByZXMuanNvbigpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZUtleSAmJiBkYXRhLmNhY2hlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IGRhdGEuY2FjaGVLZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IgJiYgZGF0YS5qb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvYkluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iSWQ6IGRhdGEuam9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBkYXRhLmNhY2hlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbElucHV0czogZGF0YS5jYW5jZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0OiBkYXRhLnByb2dyZXNzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQub3V0cHV0cylcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRDYWxsYmFja0pvYihqb2JJbmZvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2IgPSBkYXRhLmpvYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zaWRlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGRhdGEuc2lkZVVwZGF0ZSwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGRhdGEucHJvZ3Jlc3MsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2dyZXNzRGVmYXVsdCAmJiBkYXRhLnByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0ID0gZGF0YS5wcm9ncmVzc0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kIHx8IGRhdGEucmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGRhdGEuZGlzdC5tYXAobG9hZExpYnJhcnkpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTGluZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTGluZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvbGwgY2hhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZSwgYmFja2dyb3VuZC5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBiYWNrZ3JvdW5kLmludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVUy5QUkVWRU5UX1VQREFURSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZSh7fSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgIHJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5OT19SRVNQT05TRSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdDYWxsYmFjayBmYWlsZWQ6IHRoZSBzZXJ2ZXIgZGlkIG5vdCByZXNwb25kLicpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2hDYWxsYmFjaygpLnRoZW4oaGFuZGxlT3V0cHV0LCBoYW5kbGVFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGhhbmRsZSgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaW5wdXRzVG9EaWN0KGlucHV0c19saXN0KSB7XG4gICAgLy8gUG9ydGVkIGRpcmVjdGx5IGZyb20gX3V0aWxzLnB5LCBpbnB1dHNfdG9fZGljdFxuICAgIC8vIHRha2VzIGFuIGFycmF5IG9mIGlucHV0cyAoc29tZSBpbnB1dHMgbWF5IGJlIGFuIGFycmF5KVxuICAgIC8vIHJldHVybnMgYW4gT2JqZWN0IChtYXApOlxuICAgIC8vICBrZXlzIG9mIHRoZSBmb3JtIGBpZC5wcm9wZXJ0eWAgb3IgYHtcImlkXCI6IDB9LnByb3BlcnR5YFxuICAgIC8vICB2YWx1ZXMgY29udGFpbiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICBpZiAoIWlucHV0c19saXN0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHNfbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHNfbGlzdFtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c2kgPSBpbnB1dHNfbGlzdFtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBpbnB1dHNpLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c2lbaWldLmlkKX0uJHtpbnB1dHNpW2lpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgICAgIGlucHV0c1tpZF9zdHJdID0gaW5wdXRzaVtpaV0udmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c19saXN0W2ldLmlkKX0uJHtpbnB1dHNfbGlzdFtpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNfbGlzdFtpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VyZWRJZCh0cmlnZ2VyZWQpIHtcbiAgICAvLyBmb3IgcmVndWxhciBjYWxsYmFja3MsICB0YWtlcyB0aGUgZmlyc3QgdHJpZ2dlcmVkIHByb3BfaWQsIGUuZy4gIFwiYnRuLm5fY2xpY2tzXCIgYW5kIHJldHVybnMgXCJidG5cIlxuICAgIC8vIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGNhbGxiYWNrLCBlLmcuICd7XCJpbmRleFwiOjAsIFwidHlwZVwiOlwiYnRuXCJ9JyBhbmQgcmV0dXJucyB7aW5kZXg6MCwgdHlwZTogXCJidG5cIn0nXG4gICAgaWYgKHRyaWdnZXJlZCAmJiB0cmlnZ2VyZWQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRyaWcgPSB0cmlnZ2VyZWRbMF07XG4gICAgICAgIGxldCBjb21wb25lbnRJZDtcbiAgICAgICAgaWYgKHRyaWcuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UodHJpZy5zdWJzdHJpbmcoMCwgdHJpZy5sYXN0SW5kZXhPZignfScpICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50SWQgPSB0cmlnLnNwbGl0KCcuJylbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIHsgYWxsT3V0cHV0cyB9LCBkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7IG91dHB1dCwgaW5wdXRzLCBzdGF0ZSwgY2xpZW50c2lkZV9mdW5jdGlvbiwgYmFja2dyb3VuZCwgZHluYW1pY19jcmVhdG9yIH0gPSBjYi5jYWxsYmFjaztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpblZhbHMgPSBmaWxsVmFscyhwYXRocywgbGF5b3V0LCBjYiwgaW5wdXRzLCAnSW5wdXQnLCB0cnVlKTtcbiAgICAgICAgLyogUHJldmVudCBjYWxsYmFjayBpZiB0aGVyZSdzIG5vIGlucHV0cyAqL1xuICAgICAgICBpZiAoaW5WYWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXRFcnJvcnMgPSBbXTtcbiAgICAgICAgYWxsT3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvdXRpLCBlcnJpXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIG1hcChwaWNrKFsnaWQnLCAncHJvcGVydHknXSksIG91dCksIGNiLmNhbGxiYWNrLm91dHB1dHNbaV0sIGNiLmFueVZhbHMsICdPdXRwdXQnKTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChvdXRpKTtcbiAgICAgICAgICAgIGlmIChlcnJpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0RXJyb3JzLnB1c2goZXJyaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0cHV0RXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW4oaW5WYWxzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZWZFcnIob3V0cHV0RXJyb3JzLCBwYXRocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgYWxsLWVtcHR5IG11bHRpdmFsdWVkIHdpbGRjYXJkIGlucHV0cyxcbiAgICAgICAgICAgIC8vIHdoaWNoIHdlIHdvdWxkIG5vcm1hbGx5IGZpcmUgdGhlIGNhbGxiYWNrIGZvciwgZXhjZXB0XG4gICAgICAgICAgICAvLyBzb21lIG91dHB1dHMgYXJlIG1pc3NpbmcuIFNvIGluc3RlYWQgd2UgdHJlYXQgaXQgbGlrZVxuICAgICAgICAgICAgLy8gcmVndWxhciBtaXNzaW5nIGlucHV0cyBhbmQganVzdCBzaWxlbnRseSBwcmV2ZW50IGl0LlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmdPdXRwdXRzID0gb3V0cHV0cy5tYXAob3V0ID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChwYXRocywgb3V0LmlkKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogb3V0LnByb3BlcnR5Py5zcGxpdCgnQCcpWzBdLFxuICAgICAgICAgICAgICAgIGlkOiBvdXQuaWRcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGxvYWRpbmcobG9hZGluZ091dHB1dHMpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BJZHMgPSBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMgPSBjaGFuZ2VkUHJvcElkcy5tYXAocHJvcElkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BJZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVBNQ0lkKHByb3BJZClbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBpblZhbHMsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBjYi5jYWxsYmFjay5zdGF0ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHN0YXRlLCAnU3RhdGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgaGFuZGxlQ2xpZW50c2lkZShkaXNwYXRjaCwgY2xpZW50c2lkZV9mdW5jdGlvbiwgY29uZmlnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHBheWxvYWQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yLCBwYXlsb2FkIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICBsZXQgbmV3SGVhZGVycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsQXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25PdXRwdXQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkLm91dHB1dHMpO1xuICAgICAgICAgICAgICAgIHZhbHVlcyhnZXRTdGF0ZSgpLmNhbGxiYWNrSm9icykuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uT3V0cHV0ID09PSBqb2Iub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIG9sZCBqb2JzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBhcyBvdXRkYXRlZCBmb3IgdGhlIGNhbGxiYWNrIHByb21pc2UgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgYW5kIHJlbW92ZSBhZnRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBcmdzLnB1c2goWydvbGRKb2InLCBqb2Iuam9iSWQsIHRydWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQoeyBqb2JJZDogam9iLmpvYklkIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWpvYi5jYW5jZWxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlciA9IGludGVyc2VjdGlvbihqb2IuY2FuY2VsSW5wdXRzLCBjYi5jYWxsYmFjay5pbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnY2FuY2VsSm9iJywgam9iLmpvYklkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoam9iLnByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUoam9iLnByb2dyZXNzRGVmYXVsdCwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcmV0cnkgPSAwOyByZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTOyByZXRyeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGhhbmRsZVNlcnZlcnNpZGUoZGlzcGF0Y2gsIGhvb2tzLCBuZXdDb25maWcsIHBheWxvYWQsIGJhY2tncm91bmQsIGFkZGl0aW9uYWxBcmdzLmxlbmd0aCA/IGFkZGl0aW9uYWxBcmdzIDogdW5kZWZpbmVkLCBnZXRTdGF0ZSwgY2IuY2FsbGJhY2sucnVubmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFkZEh0dHBIZWFkZXJzKG5ld0hlYWRlcnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExheW91dCA9IGdldFN0YXRlKCkubGF5b3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihvdXRwdXRzKS5mb3JFYWNoKChvdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IGNsZWFuT3V0cHV0UHJvcChvdXQucHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBnZXRQYXRoKHBhdGhzLCBvdXQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwYXRoKG91dHB1dFBhdGguY29uY2F0KFsncHJvcHMnLCBwcm9wTmFtZV0pLCBjdXJyZW50TGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IFtzdHJpbmdpZnlJZChvdXQuaWQpLCBwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBwYXRoKGRhdGFQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRjaChvdXRwdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGF0Y2ggdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzc29jUGF0aChkYXRhUGF0aCwgaGFuZGxlUGF0Y2gocHJldmlvdXNWYWx1ZSwgb3V0cHV0VmFsdWUpLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX2NyZWF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGRpc3BhdGNoKHJlcXVlc3REZXBlbmRlbmNpZXMoKSksIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgcGF5bG9hZCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy5zdGF0dXMgPT09IFNUQVRVUy5VTkFVVEhPUklaRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gU1RBVFVTLkJBRF9SRVFVRVNUKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5LmluY2x1ZGVzKEpXVF9FWFBJUkVEX01FU1NBR0UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkSnd0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkSnd0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZldGNoLmhlYWRlcnMuQXV0aG9yaXphdGlvbi5zdWJzdHIoJ0JlYXJlciAnLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdKd3QgPSBhd2FpdCBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KG9sZEp3dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld0p3dH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2UgcmVhY2ggaGVyZSB3aGVuIHdlIHJ1biBvdXQgb2YgcmV0cmllcy5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbGFzdEVycm9yLCBwYXlsb2FkOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciwgcGF5bG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gobG9hZGVkKGxvYWRpbmdPdXRwdXRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld0NiID0ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBfX2V4ZWN1dGUoKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3Q2I7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiB7IGVycm9yLCBwYXlsb2FkOiBudWxsIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCJjb25zdCBhY3Rpb25MaXN0ID0ge1xuICAgIE9OX1BST1BfQ0hBTkdFOiAxLFxuICAgIFNFVF9SRVFVRVNUX1FVRVVFOiAxLFxuICAgIFNFVF9HUkFQSFM6IDEsXG4gICAgU0VUX1BBVEhTOiAxLFxuICAgIFNFVF9MQVlPVVQ6IDEsXG4gICAgU0VUX0FQUF9MSUZFQ1lDTEU6IDEsXG4gICAgU0VUX0NPTkZJRzogMSxcbiAgICBBRERfSFRUUF9IRUFERVJTOiAxLFxuICAgIE9OX0VSUk9SOiAxLFxuICAgIFNFVF9IT09LUzogMSxcbiAgICBJTlNFUlRfQ09NUE9ORU5UOiAxLFxuICAgIFJFTU9WRV9DT01QT05FTlQ6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb25MaXN0W2FjdGlvbl0pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGlvbn0gaXMgbm90IGRlZmluZWQuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgTUFYX0FVVEhfUkVUUklFUyA9IDE7XG4iLCJpbXBvcnQge0RlcEdyYXBofSBmcm9tICdkZXBlbmRlbmN5LWdyYXBoJztcbmltcG9ydCBpc051bWVyaWMgZnJvbSAnZmFzdC1pc251bWVyaWMnO1xuaW1wb3J0IHtcbiAgICBhbGwsXG4gICAgYW55LFxuICAgIGFwLFxuICAgIGFzc29jLFxuICAgIGRpZmZlcmVuY2UsXG4gICAgZXF1YWxzLFxuICAgIGV2b2x2ZSxcbiAgICBmaW5kSW5kZXgsXG4gICAgZmxhdHRlbixcbiAgICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgICBpbmNsdWRlcyxcbiAgICBpbnRlcnNlY3Rpb24sXG4gICAgaXNFbXB0eSxcbiAgICBrZXlzLFxuICAgIG1hcCxcbiAgICBtZXJnZVJpZ2h0LFxuICAgIHBhdGgsXG4gICAgcGx1Y2ssXG4gICAgcHJvcHMsXG4gICAgc3RhcnRzV2l0aCxcbiAgICB2YWx1ZXMsXG4gICAgemlwLFxuICAgIHppcE9ialxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7XG4gICAgY29tYmluZUlkQW5kUHJvcCxcbiAgICBnZXRDYWxsYmFja3NCeUlucHV0LFxuICAgIGdldFByaW9yaXR5LFxuICAgIElORElSRUNULFxuICAgIG1lcmdlTWF4LFxuICAgIG1ha2VSZXNvbHZlZENhbGxiYWNrLFxuICAgIHJlc29sdmVEZXBzXG59IGZyb20gJy4vZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7Y29tcHV0ZVBhdGhzLCBnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcblxuaW1wb3J0IHtjcmF3bExheW91dH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9yZWdpc3RyeSc7XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmV4cG9ydCBjb25zdCBpc011bHRpT3V0cHV0UHJvcCA9IGlkQW5kUHJvcCA9PiBpZEFuZFByb3Auc3RhcnRzV2l0aCgnLi4nKTtcblxuY29uc3QgQUxMID0ge3dpbGQ6ICdBTEwnLCBtdWx0aTogMX07XG5jb25zdCBNQVRDSCA9IHt3aWxkOiAnTUFUQ0gnfTtcbmNvbnN0IEFMTFNNQUxMRVIgPSB7d2lsZDogJ0FMTFNNQUxMRVInLCBtdWx0aTogMSwgZXhwYW5kOiAxfTtcbmNvbnN0IHdpbGRjYXJkcyA9IHtBTEwsIE1BVENILCBBTExTTUFMTEVSfTtcbmNvbnN0IGFsbG93ZWRXaWxkY2FyZHMgPSB7XG4gICAgT3V0cHV0OiB7QUxMLCBNQVRDSH0sXG4gICAgSW5wdXQ6IHdpbGRjYXJkcyxcbiAgICBTdGF0ZTogd2lsZGNhcmRzXG59O1xuY29uc3Qgd2lsZGNhcmRWYWxUeXBlcyA9IFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ107XG5cbmNvbnN0IGlkSW52YWxpZENoYXJzID0gWycuJywgJ3snXTtcblxuLypcbiAqIElmIHRoaXMgSUQgaXMgYSB3aWxkY2FyZCwgaXQgaXMgYSBzdHJpbmdpZmllZCBKU09OIG9iamVjdFxuICogdGhlIFwie1wiIGNoYXJhY3RlciBpcyBkaXNhbGxvd2VkIGZyb20gcmVndWxhciBzdHJpbmcgSURzXG4gKi9cbmNvbnN0IGlzV2lsZGNhcmRJZCA9IGlkU3RyID0+IGlkU3RyLnN0YXJ0c1dpdGgoJ3snKTtcblxuLypcbiAqIFR1cm4gc3RyaW5naWZpZWQgd2lsZGNhcmQgSURzIGludG8gb2JqZWN0cy5cbiAqIFdpbGRjYXJkcyBhcmUgZW5jb2RlZCBhcyBzaW5nbGUtaXRlbSBhcnJheXMgY29udGFpbmluZyB0aGUgd2lsZGNhcmQgbmFtZVxuICogYXMgYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2lsZGNhcmRJZChpZFN0cikge1xuICAgIHJldHVybiBtYXAoXG4gICAgICAgIHZhbCA9PiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHdpbGRjYXJkc1t2YWxbMF1dKSB8fCB2YWwsXG4gICAgICAgIEpTT04ucGFyc2UoaWRTdHIpXG4gICAgKTtcbn1cblxuLypcbiAqIElmIHRoaXMgdXBkYXRlIGlzIGZvciBtdWx0aXBsZSBvdXRwdXRzLCB0aGVuIGl0IGhhc1xuICogc3RhcnRpbmcgJiB0cmFpbGluZyBgLi5gIGFuZCBlYWNoIHByb3BJZCBwYWlyIGlzIHNlcGFyYXRlZFxuICogYnkgYC4uLmAsIGUuZy5cbiAqIFwiLi5vdXRwdXQtMS52YWx1ZS4uLm91dHB1dC0yLnZhbHVlLi4ub3V0cHV0LTMudmFsdWUuLi5vdXRwdXQtNC52YWx1ZS4uXCJcbiAqL1xuZnVuY3Rpb24gcGFyc2VNdWx0aXBsZU91dHB1dHMob3V0cHV0SWRBbmRQcm9wKSB7XG4gICAgcmV0dXJuIG91dHB1dElkQW5kUHJvcC5zdWJzdHIoMiwgb3V0cHV0SWRBbmRQcm9wLmxlbmd0aCAtIDQpLnNwbGl0KCcuLi4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0SWRBbmRQcm9wKGlkQW5kUHJvcCkge1xuICAgIC8vIHNpbmNlIHdpbGRjYXJkIGlkcyBjYW4gaGF2ZSAuIGluIHRoZW0gYnV0IHByb3BzIGNhbid0LFxuICAgIC8vIGxvb2sgZm9yIHRoZSBsYXN0IC4gaW4gdGhlIHN0cmluZyBhbmQgc3BsaXQgdGhlcmVcbiAgICBjb25zdCBkb3RQb3MgPSBpZEFuZFByb3AubGFzdEluZGV4T2YoJy4nKTtcbiAgICBjb25zdCBpZFN0ciA9IGlkQW5kUHJvcC5zdWJzdHIoMCwgZG90UG9zKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogcGFyc2VJZldpbGRjYXJkKGlkU3RyKSxcbiAgICAgICAgcHJvcGVydHk6IGlkQW5kUHJvcC5zdWJzdHIoZG90UG9zICsgMSlcbiAgICB9O1xufVxuXG4vKlxuICogQ2hlY2sgaWYgdGhpcyBJRCBpcyBhIHN0cmluZ2lmaWVkIG9iamVjdCwgYW5kIGlmIHNvIHBhcnNlIGl0IHRvIHRoYXQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlmV2lsZGNhcmQoaWRTdHIpIHtcbiAgICByZXR1cm4gaXNXaWxkY2FyZElkKGlkU3RyKSA/IHBhcnNlV2lsZGNhcmRJZChpZFN0cikgOiBpZFN0cjtcbn1cblxuLypcbiAqIEpTT04uc3RyaW5naWZ5IC0gZm9yIHRoZSBvYmplY3QgZm9ybSAtIGJ1dCBlbnN1cmluZyBrZXlzIGFyZSBzb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUlkKGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBjb25zdCBzdHJpbmdpZnlWYWwgPSB2ID0+ICh2ICYmIHYud2lsZCkgfHwgSlNPTi5zdHJpbmdpZnkodik7XG4gICAgY29uc3QgcGFydHMgPSBPYmplY3Qua2V5cyhpZClcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAubWFwKGsgPT4gSlNPTi5zdHJpbmdpZnkoaykgKyAnOicgKyBzdHJpbmdpZnlWYWwoaWRba10pKTtcbiAgICByZXR1cm4gJ3snICsgcGFydHMuam9pbignLCcpICsgJ30nO1xufVxuXG4vKlxuICogaWQgZGljdCB2YWx1ZXMgY2FuIGJlIG51bWJlcnMsIHN0cmluZ3MsIGFuZCBib29sZWFucy5cbiAqIFdlIG5lZWQgYSBkZWZpbml0ZSBvcmRlcmluZyB0aGF0IHdpbGwgd29yayBhY3Jvc3MgdHlwZXMsXG4gKiBldmVuIGlmIHNhbmUgdXNlcnMgd291bGQgbm90IG1peCB0eXBlcy5cbiAqIC0gbnVtZXJpYyBzdHJpbmdzIGFyZSB0cmVhdGVkIGFzIG51bWJlcnNcbiAqIC0gYm9vbGVhbnMgY29tZSBhZnRlciBudW1iZXJzLCBiZWZvcmUgc3RyaW5ncy4gZmFsc2UsIHRoZW4gdHJ1ZS5cbiAqIC0gbm9uLW51bWVyaWMgc3RyaW5ncyBjb21lIGxhc3RcbiAqL1xuZnVuY3Rpb24gaWRWYWxTb3J0KGEsIGIpIHtcbiAgICBjb25zdCBiSXNOdW1lcmljID0gaXNOdW1lcmljKGIpO1xuICAgIGlmIChpc051bWVyaWMoYSkpIHtcbiAgICAgICAgaWYgKGJJc051bWVyaWMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFOID0gTnVtYmVyKGEpO1xuICAgICAgICAgICAgY29uc3QgYk4gPSBOdW1iZXIoYik7XG4gICAgICAgICAgICByZXR1cm4gYU4gPiBiTiA/IDEgOiBhTiA8IGJOID8gLTEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGJJc051bWVyaWMpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGNvbnN0IGFJc0Jvb2wgPSB0eXBlb2YgYSA9PT0gJ2Jvb2xlYW4nO1xuICAgIGlmIChhSXNCb29sICE9PSAodHlwZW9mIGIgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgcmV0dXJuIGFJc0Jvb2wgPyAtMSA6IDE7XG4gICAgfVxuICAgIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDtcbn1cblxuLypcbiAqIFByb3ZpZGUgYSB2YWx1ZSBrbm93biB0byBiZSBiZWZvcmUgb3IgYWZ0ZXIgdiwgYWNjb3JkaW5nIHRvIGlkVmFsU29ydFxuICovXG5jb25zdCB2YWxCZWZvcmUgPSB2ID0+IChpc051bWVyaWModikgPyB2IC0gMSA6IDApO1xuY29uc3QgdmFsQWZ0ZXIgPSB2ID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2ICsgJ3onIDogJ3onKTtcblxuZnVuY3Rpb24gYWRkTWFwKGRlcE1hcCwgaWQsIHByb3AsIGRlcGVuZGVuY3kpIHtcbiAgICBjb25zdCBpZE1hcCA9IChkZXBNYXBbaWRdID0gZGVwTWFwW2lkXSB8fCB7fSk7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gKGlkTWFwW3Byb3BdID0gaWRNYXBbcHJvcF0gfHwgW10pO1xuICAgIGNhbGxiYWNrcy5wdXNoKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBhZGRQYXR0ZXJuKGRlcE1hcCwgaWRTcGVjLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkU3BlYykuc29ydCgpO1xuICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKGtleXMsIGlkU3BlYyk7XG4gICAgY29uc3Qga2V5Q2FsbGJhY2tzID0gKGRlcE1hcFtrZXlTdHJdID0gZGVwTWFwW2tleVN0cl0gfHwge30pO1xuICAgIGNvbnN0IHByb3BDYWxsYmFja3MgPSAoa2V5Q2FsbGJhY2tzW3Byb3BdID0ga2V5Q2FsbGJhY2tzW3Byb3BdIHx8IFtdKTtcbiAgICBsZXQgdmFsTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BDYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVxdWFscyh2YWx1ZXMsIHByb3BDYWxsYmFja3NbaV0udmFsdWVzKSkge1xuICAgICAgICAgICAgdmFsTWF0Y2ggPSBwcm9wQ2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF2YWxNYXRjaCkge1xuICAgICAgICB2YWxNYXRjaCA9IHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrczogW119O1xuICAgICAgICBwcm9wQ2FsbGJhY2tzLnB1c2godmFsTWF0Y2gpO1xuICAgIH1cbiAgICB2YWxNYXRjaC5jYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMocGFyc2VkRGVwZW5kZW5jaWVzLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgY29uc3Qgb3V0U3RycyA9IHt9O1xuICAgIGNvbnN0IG91dE9ianMgPSBbXTtcblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgIGNvbnN0IHtpbnB1dHMsIG91dHB1dHMsIHN0YXRlfSA9IGRlcDtcbiAgICAgICAgbGV0IGhhc091dHB1dHMgPSB0cnVlO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDEgJiYgIW91dHB1dHNbMF0uaWQgJiYgIW91dHB1dHNbMF0ucHJvcGVydHkpIHtcbiAgICAgICAgICAgIGhhc091dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWQgPVxuICAgICAgICAgICAgJ0luIHRoZSBjYWxsYmFjayBmb3Igb3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBvdXRwdXRzLm1hcChjb21iaW5lSWRBbmRQcm9wKS5qb2luKCdcXG4gICcpO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQSBjYWxsYmFjayBpcyBtaXNzaW5nIElucHV0cycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICd0aGVyZSBhcmUgbm8gYElucHV0YCBlbGVtZW50cy4nLFxuICAgICAgICAgICAgICAgICdXaXRob3V0IGBJbnB1dGAgZWxlbWVudHMsIGl0IHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4nLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICdTdWJzY3JpYmluZyB0byBgSW5wdXRgIGNvbXBvbmVudHMgd2lsbCBjYXVzZSB0aGUnLFxuICAgICAgICAgICAgICAgICdjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlaXIgdmFsdWVzIGNoYW5nZS4nXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWMgPSBbXG4gICAgICAgICAgICBbb3V0cHV0cywgJ091dHB1dCddLFxuICAgICAgICAgICAgW2lucHV0cywgJ0lucHV0J10sXG4gICAgICAgICAgICBbc3RhdGUsICdTdGF0ZSddXG4gICAgICAgIF07XG4gICAgICAgIHNwZWMuZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgICAgIGlmIChjbHMgPT09ICdPdXRwdXQnICYmICFoYXNPdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgLy8ganVzdCBhIHF1aXJrIG9mIGhvdyB3ZSBwYXNzICYgcGFyc2Ugb3V0cHV0cyAtIGlmIHlvdSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIHByb3ZpZGUgb25lLCBpdCBsb29rcyBsaWtlIGEgc2luZ2xlIGJsYW5rIG91dHB1dC4gVGhpcyBpc1xuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVzZWZ1bCBmb3IgZ3JhY2VmdWwgZmFpbHVyZSwgc28gd2Ugd29yayBhcm91bmQgaXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGBDYWxsYmFjayAke2Nsc30ocykgbXVzdCBiZSBhbiBBcnJheWAsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYEZvciAke2Nsc30ocykgd2UgZm91bmQ6YCxcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYXJncyksXG4gICAgICAgICAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYW4gQXJyYXkuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncy5mb3JFYWNoKChpZFByb3AsIGkpID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUFyZyhpZFByb3AsIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhhc091dHB1dHMpIHtcbiAgICAgICAgICAgIGZpbmREdXBsaWNhdGVPdXRwdXRzKFxuICAgICAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yLFxuICAgICAgICAgICAgICAgIG91dFN0cnMsXG4gICAgICAgICAgICAgICAgb3V0T2Jqc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKFxuICAgICAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFyZyh7aWQsIHByb3BlcnR5fSwgaGVhZCwgY2xzLCBpLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgfHwgIXByb3BlcnR5KSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHByb3BlcnR5IGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0ucHJvcGVydHkgPSAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX1gLFxuICAgICAgICAgICAgJ2J1dCB3ZSBleHBlY3RlZCBgcHJvcGVydHlgIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0VtcHR5KGlkKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgaXRlbSBtaXNzaW5nIElEJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9IHt9YCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHYsIGspID0+IHtcbiAgICAgICAgICAgIGlmICghaykge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkIGhhcyBrZXkgXCIke2t9XCJgLFxuICAgICAgICAgICAgICAgICAgICAnS2V5cyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2LndpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFdpbGRjYXJkc1tjbHNdW3Yud2lsZF0gIT09IHYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgd2lsZGNhcmQgSUQgZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZFtcIiR7a31cIl0gPSAke3Yud2lsZH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYEFsbG93ZWQgd2lsZGNhcmRzIGZvciAke2Nsc31zIGFyZTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyhhbGxvd2VkV2lsZGNhcmRzW2Nsc10pLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghaW5jbHVkZXModHlwZW9mIHYsIHdpbGRjYXJkVmFsVHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgd2lsZGNhcmQgSUQgZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHtKU09OLnN0cmluZ2lmeSh2KX1gLFxuICAgICAgICAgICAgICAgICAgICAnV2lsZGNhcmQgY2FsbGJhY2sgSUQgdmFsdWVzIG11c3QgYmUgZWl0aGVyIHdpbGRjYXJkcycsXG4gICAgICAgICAgICAgICAgICAgICdvciBjb25zdGFudHMgb2Ygb25lIG9mIHRoZXNlIHR5cGVzOicsXG4gICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkVmFsVHlwZXMuam9pbignLCAnKVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSBcIiR7aWR9XCJgLFxuICAgICAgICAgICAgICAgICdFdmVyeSBpdGVtIGxpbmtlZCB0byBhIGNhbGxiYWNrIG5lZWRzIGFuIElEJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gaWRJbnZhbGlkQ2hhcnMuZmlsdGVyKGMgPT4gaW5jbHVkZXMoYywgaWQpKTtcbiAgICAgICAgaWYgKGludmFsaWRDaGFycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGludmFsaWQgSUQgc3RyaW5nJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9ICcke2lkfSdgLFxuICAgICAgICAgICAgICAgIGBjaGFyYWN0ZXJzICcke2ludmFsaWRDaGFycy5qb2luKFwiJywgJ1wiKX0nIGFyZSBub3QgYWxsb3dlZC5gXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIElEIHR5cGUgZXJyb3InLCBbXG4gICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9ICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAnSURzIG11c3QgYmUgc3RyaW5ncyBvciB3aWxkY2FyZC1jb21wYXRpYmxlIG9iamVjdHMuJ1xuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZpbmREdXBsaWNhdGVPdXRwdXRzKG91dHB1dHMsIGhlYWQsIGRpc3BhdGNoRXJyb3IsIG91dFN0cnMsIG91dE9ianMpIHtcbiAgICBjb25zdCBuZXdPdXRwdXRTdHJzID0ge307XG4gICAgY29uc3QgbmV3T3V0cHV0T2JqcyA9IFtdO1xuICAgIG91dHB1dHMuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3Aoe2lkLCBwcm9wZXJ0eX0pO1xuICAgICAgICAgICAgaWYgKG5ld091dHB1dFN0cnNbaWRQcm9wXSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0R1cGxpY2F0ZSBjYWxsYmFjayBPdXRwdXRzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7aWRQcm9wfSkgaXMgYWxyZWFkeSB1c2VkIGJ5IHRoaXMgY2FsbGJhY2suYFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgaW4gdXNlLmAsXG4gICAgICAgICAgICAgICAgICAgICdUbyByZXNvbHZlIHRoaXMsIHNldCBgYWxsb3dfZHVwbGljYXRlPVRydWVgIG9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2R1cGxpY2F0ZSBvdXRwdXRzLCBvciBjb21iaW5lIHRoZSBvdXRwdXRzIGludG8nLFxuICAgICAgICAgICAgICAgICAgICAnb25lIGNhbGxiYWNrIGZ1bmN0aW9uLCBkaXN0aW5ndWlzaGluZyB0aGUgdHJpZ2dlcicsXG4gICAgICAgICAgICAgICAgICAgICdieSB1c2luZyBgZGFzaC5jYWxsYmFja19jb250ZXh0YCBpZiBuZWNlc3NhcnkuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdPdXRwdXRTdHJzW2lkUHJvcF0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWRPYmogPSB7aWQsIHByb3BlcnR5fTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGZPdmVybGFwID0gd2lsZGNhcmRPdmVybGFwKGlkT2JqLCBuZXdPdXRwdXRPYmpzKTtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyT3ZlcmxhcCA9IHNlbGZPdmVybGFwIHx8IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgb3V0T2Jqcyk7XG4gICAgICAgICAgICBpZiAoc2VsZk92ZXJsYXAgfHwgb3RoZXJPdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQcm9wID0gY29tYmluZUlkQW5kUHJvcChpZE9iaik7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQcm9wMiA9IGNvbWJpbmVJZEFuZFByb3Aoc2VsZk92ZXJsYXAgfHwgb3RoZXJPdmVybGFwKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdPdmVybGFwcGluZyB3aWxkY2FyZCBjYWxsYmFjayBvdXRwdXRzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7aWRQcm9wfSlgLFxuICAgICAgICAgICAgICAgICAgICBgb3ZlcmxhcHMgYW5vdGhlciBvdXRwdXQgKCR7aWRQcm9wMn0pYCxcbiAgICAgICAgICAgICAgICAgICAgYHVzZWQgaW4gJHtzZWxmT3ZlcmxhcCA/ICd0aGlzJyA6ICdhIGRpZmZlcmVudCd9IGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0T2Jqcy5wdXNoKGlkT2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGtleXMobmV3T3V0cHV0U3RycykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgb3V0U3Ryc1trXSA9IDE7XG4gICAgfSk7XG4gICAgbmV3T3V0cHV0T2Jqcy5mb3JFYWNoKGlkT2JqID0+IHtcbiAgICAgICAgb3V0T2Jqcy5wdXNoKGlkT2JqKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJbk91dE92ZXJsYXAob3V0LCBpbnB1dHMpIHtcbiAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eTogb3V0UHJvcH0gPSBvdXQ7XG4gICAgcmV0dXJuIGlucHV0cy5zb21lKGluXyA9PiB7XG4gICAgICAgIGNvbnN0IHtpZDogaW5JZCwgcHJvcGVydHk6IGluUHJvcH0gPSBpbl87XG4gICAgICAgIGlmIChvdXRQcm9wICE9PSBpblByb3AgfHwgdHlwZW9mIG91dElkICE9PSB0eXBlb2YgaW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAob3V0SWQgPT09IGluSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3aWxkY2FyZE92ZXJsYXAoaW5fLCBbb3V0XSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZmluZE1pc21hdGNoZWRXaWxkY2FyZHMob3V0cHV0cywgaW5wdXRzLCBzdGF0ZSwgaGVhZCwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IHttYXRjaEtleXM6IG91dDBNYXRjaEtleXN9ID0gZmluZFdpbGRjYXJkS2V5cyhcbiAgICAgICAgb3V0cHV0cy5sZW5ndGggPyBvdXRwdXRzWzBdLmlkIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBvdXRwdXRzLmZvckVhY2goKG91dCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSAmJiAhZXF1YWxzKGZpbmRXaWxkY2FyZEtleXMob3V0LmlkKS5tYXRjaEtleXMsIG91dDBNYXRjaEtleXMpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdNaXNtYXRjaGVkIGBNQVRDSGAgd2lsZGNhcmRzIGFjcm9zcyBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7Y29tYmluZUlkQW5kUHJvcChvdXQpfSlgLFxuICAgICAgICAgICAgICAgICdkb2VzIG5vdCBoYXZlIE1BVENIIHdpbGRjYXJkcyBvbiB0aGUgc2FtZSBrZXlzIGFzJyxcbiAgICAgICAgICAgICAgICBgT3V0cHV0IDAgKCR7Y29tYmluZUlkQW5kUHJvcChvdXRwdXRzWzBdKX0pLmAsXG4gICAgICAgICAgICAgICAgJ01BVENIIHdpbGRjYXJkcyBtdXN0IGJlIG9uIHRoZSBzYW1lIGtleXMgZm9yIGFsbCBPdXRwdXRzLicsXG4gICAgICAgICAgICAgICAgJ0FMTCB3aWxkY2FyZHMgbmVlZCBub3QgbWF0Y2gsIG9ubHkgTUFUQ0guJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBbXG4gICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICBbc3RhdGUsICdTdGF0ZSddXG4gICAgXS5mb3JFYWNoKChbYXJncywgY2xzXSkgPT4ge1xuICAgICAgICBhcmdzLmZvckVhY2goKGFyZywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge21hdGNoS2V5cywgYWxsc21hbGxlcktleXN9ID0gZmluZFdpbGRjYXJkS2V5cyhhcmcuaWQpO1xuICAgICAgICAgICAgY29uc3QgYWxsV2lsZGNhcmRLZXlzID0gbWF0Y2hLZXlzLmNvbmNhdChhbGxzbWFsbGVyS2V5cyk7XG4gICAgICAgICAgICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZShhbGxXaWxkY2FyZEtleXMsIG91dDBNYXRjaEtleXMpO1xuICAgICAgICAgICAgaWYgKGRpZmYubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlmZi5zb3J0KCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignYElucHV0YCAvIGBTdGF0ZWAgd2lsZGNhcmRzIG5vdCBpbiBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc30gJHtpfSAoJHtjb21iaW5lSWRBbmRQcm9wKGFyZyl9KWAsXG4gICAgICAgICAgICAgICAgICAgIGBoYXMgTUFUQ0ggb3IgQUxMU01BTExFUiBvbiBrZXkocykgJHtkaWZmLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgYHdoZXJlIE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KWAsXG4gICAgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBoYXZlIGEgTUFUQ0ggd2lsZGNhcmQuIElucHV0cyBhbmQgU3RhdGUgZG8gbm90JyxcbiAgICAgICAgICAgICAgICAgICAgJ25lZWQgZXZlcnkgTUFUQ0ggZnJvbSB0aGUgT3V0cHV0KHMpLCBidXQgdGhleSBjYW5ub3QgaGF2ZScsXG4gICAgICAgICAgICAgICAgICAgICdleHRyYXMgYmV5b25kIHRoZSBPdXRwdXQocykuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuY29uc3QgbWF0Y2hXaWxkS2V5cyA9IChbYSwgYl0pID0+IHtcbiAgICBjb25zdCBhV2lsZCA9IGEgJiYgYS53aWxkO1xuICAgIGNvbnN0IGJXaWxkID0gYiAmJiBiLndpbGQ7XG4gICAgaWYgKGFXaWxkICYmIGJXaWxkKSB7XG4gICAgICAgIC8vIEV2ZXJ5IHdpbGRjYXJkIGNvbWJpbmF0aW9uIG92ZXJsYXBzIGV4Y2VwdCBNQVRDSDwtPkFMTFNNQUxMRVJcbiAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAoYSA9PT0gTUFUQ0ggJiYgYiA9PT0gQUxMU01BTExFUikgfHxcbiAgICAgICAgICAgIChhID09PSBBTExTTUFMTEVSICYmIGIgPT09IE1BVENIKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYSA9PT0gYiB8fCBhV2lsZCB8fCBiV2lsZDtcbn07XG5cbmZ1bmN0aW9uIHdpbGRjYXJkT3ZlcmxhcCh7aWQsIHByb3BlcnR5fSwgb2Jqcykge1xuICAgIGNvbnN0IGlkS2V5cyA9IGtleXMoaWQpLnNvcnQoKTtcbiAgICBjb25zdCBpZFZhbHMgPSBwcm9wcyhpZEtleXMsIGlkKTtcbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBvYmpzKSB7XG4gICAgICAgIGNvbnN0IHtpZDogaWQyLCBwcm9wZXJ0eTogcHJvcGVydHkyfSA9IG9iajtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcGVydHkyID09PSBwcm9wZXJ0eSAmJlxuICAgICAgICAgICAgdHlwZW9mIGlkMiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIGVxdWFscyhrZXlzKGlkMikuc29ydCgpLCBpZEtleXMpICYmXG4gICAgICAgICAgICBhbGwobWF0Y2hXaWxkS2V5cywgemlwKGlkVmFscywgcHJvcHMoaWRLZXlzLCBpZDIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2FsbGJhY2tzVG9MYXlvdXQoc3RhdGVfLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgY29uc3Qge2NvbmZpZywgZ3JhcGhzLCBsYXlvdXQ6IGxheW91dF8sIHBhdGhzOiBwYXRoc199ID0gc3RhdGVfO1xuICAgIGNvbnN0IHZhbGlkYXRlSWRzID0gIWNvbmZpZy5zdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zO1xuICAgIGxldCBsYXlvdXQsIHBhdGhzO1xuICAgIGlmICh2YWxpZGF0ZUlkcyAmJiBjb25maWcudmFsaWRhdGlvbl9sYXlvdXQpIHtcbiAgICAgICAgbGF5b3V0ID0gY29uZmlnLnZhbGlkYXRpb25fbGF5b3V0O1xuICAgICAgICBwYXRocyA9IGNvbXB1dGVQYXRocyhsYXlvdXQsIFtdLCBudWxsLCBwYXRoc18uZXZlbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQgPSBsYXlvdXRfO1xuICAgICAgICBwYXRocyA9IHBhdGhzXztcbiAgICB9XG4gICAgY29uc3Qge291dHB1dE1hcCwgaW5wdXRNYXAsIG91dHB1dFBhdHRlcm5zLCBpbnB1dFBhdHRlcm5zfSA9IGdyYXBocztcblxuICAgIGZ1bmN0aW9uIHRhaWwoY2FsbGJhY2tzKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnVGhpcyBJRCB3YXMgdXNlZCBpbiB0aGUgY2FsbGJhY2socykgZm9yIE91dHB1dChzKTpcXG4gICcgK1xuICAgICAgICAgICAgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgLm1hcCgoe291dHB1dHN9KSA9PiBvdXRwdXRzLm1hcChjb21iaW5lSWRBbmRQcm9wKS5qb2luKCcsICcpKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4gICcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWlzc2luZ0lkKGlkLCBjbHMsIGNhbGxiYWNrcykge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdJRCBub3QgZm91bmQgaW4gbGF5b3V0JywgW1xuICAgICAgICAgICAgYEF0dGVtcHRpbmcgdG8gY29ubmVjdCBhIGNhbGxiYWNrICR7Y2xzfSBpdGVtIHRvIGNvbXBvbmVudDpgLFxuICAgICAgICAgICAgYCAgXCIke3N0cmluZ2lmeUlkKGlkKX1cImAsXG4gICAgICAgICAgICAnYnV0IG5vIGNvbXBvbmVudHMgd2l0aCB0aGF0IGlkIGV4aXN0IGluIHRoZSBsYXlvdXQuJyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJ0lmIHlvdSBhcmUgYXNzaWduaW5nIGNhbGxiYWNrcyB0byBjb21wb25lbnRzIHRoYXQgYXJlJyxcbiAgICAgICAgICAgICdnZW5lcmF0ZWQgYnkgb3RoZXIgY2FsbGJhY2tzIChhbmQgdGhlcmVmb3JlIG5vdCBpbiB0aGUnLFxuICAgICAgICAgICAgJ2luaXRpYWwgbGF5b3V0KSwgeW91IGNhbiBzdXBwcmVzcyB0aGlzIGV4Y2VwdGlvbiBieSBzZXR0aW5nJyxcbiAgICAgICAgICAgICdgc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucz1UcnVlYC4nLFxuICAgICAgICAgICAgdGFpbChjYWxsYmFja3MpXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlUHJvcChpZCwgaWRQYXRoLCByYXdQcm9wLCBjbHMsIGNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCBwcm9wID0gcmF3UHJvcC5zcGxpdCgnQCcpWzBdO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoKGlkUGF0aCwgbGF5b3V0KTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUoY29tcG9uZW50KTtcblxuICAgICAgICAvLyBub3RlOiBGbG93IGNvbXBvbmVudHMgZG8gbm90IGhhdmUgcHJvcFR5cGVzLCBzbyB3ZSBjYW4ndCB2YWxpZGF0ZS5cbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wcm9wVHlwZXMgJiYgIWVsZW1lbnQucHJvcFR5cGVzW3Byb3BdKSB7XG4gICAgICAgICAgICAvLyBsb29rIGZvciB3aWxkY2FyZCBwcm9wcyAoaWUgZGF0YS0qIGV0YylcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gZWxlbWVudC5wcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gcHJvcE5hbWUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLmNoYXJBdChsYXN0KSA9PT0gJyonICYmXG4gICAgICAgICAgICAgICAgICAgIHByb3Auc3Vic3RyKDAsIGxhc3QpID09PSBwcm9wTmFtZS5zdWJzdHIoMCwgbGFzdClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHt0eXBlLCBuYW1lc3BhY2V9ID0gY29tcG9uZW50O1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignSW52YWxpZCBwcm9wIGZvciB0aGlzIGNvbXBvbmVudCcsIFtcbiAgICAgICAgICAgICAgICBgUHJvcGVydHkgXCIke3Byb3B9XCIgd2FzIHVzZWQgd2l0aCBjb21wb25lbnQgSUQ6YCxcbiAgICAgICAgICAgICAgICBgICAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgICAgIGBpbiBvbmUgb2YgdGhlICR7Y2xzfSBpdGVtcyBvZiBhIGNhbGxiYWNrLmAsXG4gICAgICAgICAgICAgICAgYFRoaXMgSUQgaXMgYXNzaWduZWQgdG8gYSAke25hbWVzcGFjZX0uJHt0eXBlfSBjb21wb25lbnRgLFxuICAgICAgICAgICAgICAgICdpbiB0aGUgbGF5b3V0LCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcHJvcGVydHkuJyxcbiAgICAgICAgICAgICAgICB0YWlsKGNhbGxiYWNrcylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgcmVzb2x2ZURlcHMoKShwYXRocykoe2lkLCBwcm9wZXJ0eX0pLmZvckVhY2goZGVwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtpZDogaWRSZXNvbHZlZCwgcGF0aDogaWRQYXRofSA9IGRlcDtcbiAgICAgICAgICAgIHZhbGlkYXRlUHJvcChpZFJlc29sdmVkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlID0ge307XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0YXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHtzdGF0ZSwgb3V0cHV0fSA9IGNhbGxiYWNrO1xuXG4gICAgICAgIC8vIGVuc3VyZSB3ZSBkb24ndCBjaGVjayB0aGUgc2FtZSBjYWxsYmFjayBmb3Igc3RhdGUgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgaWYgKGNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlW291dHB1dF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZVtvdXRwdXRdID0gMTtcblxuICAgICAgICBjb25zdCBjbHMgPSAnU3RhdGUnO1xuXG4gICAgICAgIHN0YXRlLmZvckVhY2goKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdJZChpZCwgY2xzLCBbY2FsbGJhY2tdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJvcChpZCwgaWRQYXRoLCBwcm9wZXJ0eSwgY2xzLCBbY2FsbGJhY2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPbmx5IHZhbGlkYXRlIHByb3BzIGZvciBTdGF0ZSBvYmplY3QgaWRzIHRoYXQgd2UgZG9uJ3QgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVzb2x2ZSB0aGVtIHRvIHNwZWNpZmljIGlucHV0cyBvciBvdXRwdXRzXG4gICAgICAgICAgICBlbHNlIGlmICghaW50ZXJzZWN0aW9uKFtNQVRDSCwgQUxMU01BTExFUl0sIHZhbHVlcyhpZCkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlSWRQYXR0ZXJuUHJvcChpZCwgcHJvcGVydHksIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlTWFwKG1hcCwgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gbWFwKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3BzID0gbWFwW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGlkUGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGlmICghaWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pc3NpbmdJZChpZCwgY2xzLCBmbGF0dGVuKHZhbHVlcyhpZFByb3BzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBpZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGlkUHJvcHNbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBjaGVjayBzdGF0ZSBvbiBib3RoIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG91dHB1dHMgLSBzbyBvbmx5IHNldCBkb1N0YXRlIGZvciBvdXRwdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZU1hcChvdXRwdXRNYXAsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZU1hcChpbnB1dE1hcCwgJ0lucHV0Jyk7XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVBhdHRlcm5zKHBhdHRlcm5zLCBjbHMsIGRvU3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXlTdHIgaW4gcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVBhdHRlcm5zID0gcGF0dGVybnNba2V5U3RyXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4ga2V5UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBrZXlQYXR0ZXJuc1twcm9wZXJ0eV0uZm9yRWFjaCgoe2tleXMsIHZhbHVlcywgY2FsbGJhY2tzfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHppcE9iaihrZXlzLCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaCh2YWxpZGF0ZVN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXR0ZXJucyhvdXRwdXRQYXR0ZXJucywgJ091dHB1dCcsIHRydWUpO1xuICAgIHZhbGlkYXRlUGF0dGVybnMoaW5wdXRQYXR0ZXJucywgJ0lucHV0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JhcGhzKGRlcGVuZGVuY2llcywgZGlzcGF0Y2hFcnJvcikge1xuICAgIC8vIG11bHRpR3JhcGggaXMganVzdCBmb3IgZmluZGluZyBjaXJjdWxhciBkZXBzXG4gICAgY29uc3QgbXVsdGlHcmFwaCA9IG5ldyBEZXBHcmFwaCgpO1xuXG4gICAgY29uc3Qgd2lsZGNhcmRQbGFjZWhvbGRlcnMgPSB7fTtcblxuICAgIGNvbnN0IGZpeElkcyA9IG1hcChldm9sdmUoe2lkOiBwYXJzZUlmV2lsZGNhcmR9KSk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbWFwKGRlcCA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXQsIG5vX291dHB1dH0gPSBkZXA7XG4gICAgICAgIGNvbnN0IG91dCA9IGV2b2x2ZSh7aW5wdXRzOiBmaXhJZHMsIHN0YXRlOiBmaXhJZHN9LCBkZXApO1xuICAgICAgICBpZiAobm9fb3V0cHV0KSB7XG4gICAgICAgICAgICAvLyBObyBvdXRwdXQgY2FzZVxuICAgICAgICAgICAgb3V0Lm91dHB1dHMgPSBbXTtcbiAgICAgICAgICAgIG91dC5ub091dHB1dCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQub3V0cHV0cyA9IG1hcChcbiAgICAgICAgICAgICAgICBvdXRpID0+IGFzc29jKCdvdXQnLCB0cnVlLCBzcGxpdElkQW5kUHJvcChvdXRpKSksXG4gICAgICAgICAgICAgICAgaXNNdWx0aU91dHB1dFByb3Aob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgOiBbb3V0cHV0XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IHdyYXBwZWRERSA9IChtZXNzYWdlLCBsaW5lcykgPT4ge1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IobWVzc2FnZSwgbGluZXMpO1xuICAgIH07XG4gICAgdmFsaWRhdGVEZXBlbmRlbmNpZXMocGFyc2VkRGVwZW5kZW5jaWVzLCB3cmFwcGVkREUpO1xuXG4gICAgLypcbiAgICAgKiBGb3IgcmVndWxhciBpZHMsIG91dHB1dE1hcCBhbmQgaW5wdXRNYXAgYXJlOlxuICAgICAqICAge1tpZF06IHtbcHJvcF06IFtjYWxsYmFjaywgLi4uXX19XG4gICAgICogd2hlcmUgY2FsbGJhY2tzIGFyZSB0aGUgbWF0Y2hpbmcgc3BlY3MgZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkZXBlbmRlbmNpZXNSZXF1ZXN0LCBidXQgd2l0aCBvdXRwdXRzIHBhcnNlZCB0byBsb29rIGxpa2UgaW5wdXRzLFxuICAgICAqIGFuZCBhIGxpc3QgbWF0Y2hLZXlzIGFkZGVkIGlmIHRoZSBvdXRwdXRzIGhhdmUgTUFUQ0ggd2lsZGNhcmRzLlxuICAgICAqIEZvciBvdXRwdXRNYXAgdGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgY2FsbGJhY2sgcGVyIGlkL3Byb3BcbiAgICAgKiBidXQgZm9yIGlucHV0TWFwIHRoZXJlIG1heSBiZSBtYW55LlxuICAgICAqXG4gICAgICogRm9yIHdpbGRjYXJkIGlkcywgb3V0cHV0UGF0dGVybnMgYW5kIGlucHV0UGF0dGVybnMgYXJlOlxuICAgICAqICAge1xuICAgICAqICAgICAgIFtrZXlzdHJdOiB7XG4gICAgICogICAgICAgICAgIFtwcm9wXTogW1xuICAgICAqICAgICAgICAgICAgICAge2tleXM6IFsuLi5dLCB2YWx1ZXM6IFsuLi5dLCBjYWxsYmFja3M6IFtjYWxsYmFjaywgLi4uXX0sXG4gICAgICogICAgICAgICAgICAgICB7Li4ufVxuICAgICAqICAgICAgICAgICBdXG4gICAgICogICAgICAgfVxuICAgICAqICAgfVxuICAgICAqIGtleXN0ciBpcyBhIHN0cmluZ2lmaWVkIG9yZGVyZWQgbGlzdCBvZiBrZXlzIGluIHRoZSBpZFxuICAgICAqIGtleXMgaXMgdGhlIHNhbWUgb3JkZXJlZCBsaXN0IChqdXN0IGNvcGllZCBmb3IgY29udmVuaWVuY2UpXG4gICAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIGV4cGxpY2l0IG9yIHdpbGRjYXJkIHZhbHVlcyBmb3IgZWFjaCBrZXkgaW4ga2V5c1xuICAgICAqL1xuICAgIGNvbnN0IG91dHB1dE1hcCA9IHt9O1xuICAgIGNvbnN0IGlucHV0TWFwID0ge307XG4gICAgY29uc3Qgb3V0cHV0UGF0dGVybnMgPSB7fTtcbiAgICBjb25zdCBpbnB1dFBhdHRlcm5zID0ge307XG5cbiAgICBjb25zdCBmaW5hbEdyYXBocyA9IHtcbiAgICAgICAgTXVsdGlHcmFwaDogbXVsdGlHcmFwaCxcbiAgICAgICAgb3V0cHV0TWFwLFxuICAgICAgICBpbnB1dE1hcCxcbiAgICAgICAgb3V0cHV0UGF0dGVybnMsXG4gICAgICAgIGlucHV0UGF0dGVybnMsXG4gICAgICAgIGNhbGxiYWNrczogcGFyc2VkRGVwZW5kZW5jaWVzXG4gICAgfTtcblxuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgICAvLyBsZWF2ZSB0aGUgZ3JhcGhzIGVtcHR5IGlmIHdlIGZvdW5kIGFuIGVycm9yLCBzbyB3ZSBkb24ndCB0cnkgdG9cbiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgYnJva2VuIGNhbGxiYWNrcy5cbiAgICAgICAgcmV0dXJuIGZpbmFsR3JhcGhzO1xuICAgIH1cblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcGVuZGVuY3kgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0cywgaW5wdXRzfSA9IGRlcGVuZGVuY3k7XG5cbiAgICAgICAgb3V0cHV0cy5jb25jYXQoaW5wdXRzKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlQbGFjZWhvbGRlcnMgPSB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmIHZhbC53aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmV4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leHBhbmQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlQbGFjZWhvbGRlcnMuZXhhY3QuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UGxhY2Vob2xkZXJzLmV4YWN0LnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBmb3JFYWNoT2JqSW5kZXhlZChrZXlQbGFjZWhvbGRlcnMgPT4ge1xuICAgICAgICBjb25zdCB7ZXhhY3QsIGV4cGFuZH0gPSBrZXlQbGFjZWhvbGRlcnM7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBleGFjdC5zbGljZSgpLnNvcnQoaWRWYWxTb3J0KTtcbiAgICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBhbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscy5zcGxpY2UoMCwgMCwgW3ZhbEJlZm9yZSh2YWxzWzBdKV0pO1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2godmFsQWZ0ZXIodmFsc1t2YWxzLmxlbmd0aCAtIDFdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZXhhY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBvbmx5IE1BVENIL0FMTCAtIHN0aWxsIG5lZWQgYSB2YWx1ZVxuICAgICAgICAgICAgdmFscy5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGtleVBsYWNlaG9sZGVycy52YWxzID0gdmFscztcbiAgICB9LCB3aWxkY2FyZFBsYWNlaG9sZGVycyk7XG5cbiAgICBmdW5jdGlvbiBtYWtlQWxsSWRzKGlkU3BlYywgb3V0SWRGaW5hbCkge1xuICAgICAgICBsZXQgaWRMaXN0ID0gW3t9XTtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0VmFscyA9IHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0udmFscztcbiAgICAgICAgICAgIGNvbnN0IG91dFZhbEluZGV4ID0gdGVzdFZhbHMuaW5kZXhPZihvdXRJZEZpbmFsW2tleV0pO1xuICAgICAgICAgICAgbGV0IG5ld1ZhbHMgPSBbdmFsXTtcbiAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLndpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdXRWYWxJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMgPSB0ZXN0VmFscy5zbGljZSgwLCBvdXRWYWxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzbWFsbGVyIGl0ZW1zIC0gZGVsZXRlIGFsbCBvdXRwdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggb3IgQUxMXG4gICAgICAgICAgICAgICAgICAgIC8vIE1BVENIICppcyogQUxMIGZvciBvdXRwdXRzLCBpZSB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzcGVjaWZpZWQgaW4gYG91dElkRmluYWxgXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0VmFsSW5kZXggPT09IC0xIHx8IHZhbCA9PT0gQUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0ZXN0VmFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW291dElkRmluYWxba2V5XV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVwbGljYXRlcyBldmVyeXRoaW5nIGluIGlkTGlzdCBvbmNlIGZvciBlYWNoIGl0ZW0gaW5cbiAgICAgICAgICAgIC8vIG5ld1ZhbHMsIGF0dGFjaGluZyBlYWNoIHZhbHVlIGF0IGtleS5cbiAgICAgICAgICAgIGlkTGlzdCA9IGFwKGFwKFthc3NvYyhrZXkpXSwgbmV3VmFscyksIGlkTGlzdCk7XG4gICAgICAgIH0sIGlkU3BlYyk7XG4gICAgICAgIHJldHVybiBpZExpc3Q7XG4gICAgfVxuXG4gICAgLyogbXVsdGlHcmFwaCBpcyB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgY2lyY3VsYXJpdHlcbiAgICAgKlxuICAgICAqIEVhY2ggY29tcG9uZW50K3Byb3BlcnR5IHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dCBvciBvdXRwdXQgaXMgYWRkZWQgYXMgYSBub2RlXG4gICAgICogdG8gYSBkaXJlY3RlZCBncmFwaCB3aXRoIGEgZGVwZW5kZW5jeSBmcm9tIGVhY2ggaW5wdXQgdG8gZWFjaCBvdXRwdXQuIFRoZVxuICAgICAqIGZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0U3RhdGUgaW4gaW5kZXguanMgdGhlbiBjaGVja3MgdGhpcyBncmFwaCBmb3IgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBhbGxvdyB0aGUgc2FtZSBjb21wb25lbnQrcHJvcGVydHkgdG8gYmUgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0XG4gICAgICogb2YgdGhlIHNhbWUgY2FsbGJhY2ssIGEgdHdvIHBhc3MgYXBwcm9hY2ggaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEluIHRoZSBmaXJzdCBwYXNzLCB0aGUgZ3JhcGggaXMgYnVpbHQgdXAgbm9ybWFsbHkgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXRcbiAgICAgKiBpbiBjYXNlcyB3aGVyZSBhbiBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCB0byB0aGUgc2FtZSBjYWxsYmFjayBhIHNwZWNpYWxcbiAgICAgKiBcIm91dHB1dFwiIG5vZGUgaXMgYWRkZWQgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGFyZ2V0IHRoaXMgb3V0cHV0IG5vZGUgaW5zdGVhZC5cbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYHNsaWRlci52YWx1ZWAgaXMgYm90aCBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LCB0aGVuIHRoZSBhIG5ld1xuICAgICAqIG5vZGUgYHNsaWRlci52YWx1ZV9fb3V0cHV0YCB3aWxsIGJlIGFkZGVkIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gYHNsaWRlci52YWx1ZWBcbiAgICAgKiB0byBgc2xpZGVyLnZhbHVlX19vdXRwdXRgLiBTcGxpdHRpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgaW50byBzZXBhcmF0ZSBub2Rlc1xuICAgICAqIHJlbW92ZXMgdGhlIGNpcmN1bGFyaXR5LlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gc3RpbGwgZGV0ZWN0IG90aGVyIGZvcm1zIG9mIGNpcmN1bGFyaXR5LCBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gYVxuICAgICAqIHNlY29uZCBwYXNzIGFuZCBhZGQgdGhlIG5ldyBvdXRwdXQgbm9kZXMgYXMgYSBkZXBlbmRlbmN5IGluIGFueSAqb3RoZXIqIGNhbGxiYWNrc1xuICAgICAqIHdoZXJlIHRoZSBvcmlnaW5hbCBub2RlIHdhcyBhbiBpbnB1dC4gQ29udGludWluZyB0aGUgZXhhbXBsZSwgYW55IG90aGVyIGNhbGxiYWNrXG4gICAgICogdGhhdCBoYWQgYHNsaWRlci52YWx1ZWAgYXMgYW4gaW5wdXQgZGVwZW5kZW5jeSBhbHNvIG5lZWRzIHRvIGhhdmVcbiAgICAgKiBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIGFzIGEgZGVwZW5kZW5jeS4gVG8gbWFrZSB0aGlzIGVmZmljaWVudCwgYWxsIHRoZSBpbnB1dHNcbiAgICAgKiBhbmQgb3V0cHV0cyBmb3IgZWFjaCBjYWxsYmFjayBhcmUgc3RvcmVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAgKi9cblxuICAgIGNvbnN0IG91dHB1dFRhZyA9ICdfX291dHB1dCc7XG4gICAgY29uc3QgZHVwbGljYXRlT3V0cHV0cyA9IFtdO1xuICAgIGNvbnN0IGNiSW4gPSBbXTtcbiAgICBjb25zdCBjYk91dCA9IFtdO1xuXG4gICAgZnVuY3Rpb24gYWRkSW5wdXRUb011bHRpKGluSWRQcm9wLCBvdXRJZFByb3AsIGZpcnN0UGFzcyA9IHRydWUpIHtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKGluSWRQcm9wKTtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGREZXBlbmRlbmN5KGluSWRQcm9wLCBvdXRJZFByb3ApO1xuICAgICAgICAvLyBvbmx5IHN0b3JlIGNhbGxiYWNrIGlucHV0cyBhbmQgb3V0cHV0cyBkdXJpbmcgdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgaWYgKGZpcnN0UGFzcykge1xuICAgICAgICAgICAgY2JJbltjYkluLmxlbmd0aCAtIDFdLnB1c2goaW5JZFByb3ApO1xuICAgICAgICAgICAgY2JPdXRbY2JPdXQubGVuZ3RoIC0gMV0ucHVzaChvdXRJZFByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICAvLyBuZXcgY2FsbGJhY2ssIGFkZCBhbiBlbXB0eSBhcnJheSBmb3IgaXRzIGlucHV0cyBhbmQgb3V0cHV0c1xuICAgICAgICBjYkluLnB1c2goW10pO1xuICAgICAgICBjYk91dC5wdXNoKFtdKTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRPdXRwdXRUb011bHRpKG91dElkRmluYWwsIG91dElkUHJvcCkge1xuICAgICAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKG91dElkUHJvcCk7XG4gICAgICAgICAgICBpbnB1dHMuZm9yRWFjaChpbk9iaiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2lkOiBpbklkLCBwcm9wZXJ0eX0gPSBpbk9iajtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluSWRMaXN0ID0gbWFrZUFsbElkcyhpbklkLCBvdXRJZEZpbmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW5JZExpc3QuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZUlkQW5kUHJvcCh7aWQsIHByb3BlcnR5fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWRQcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkoY29tYmluZUlkQW5kUHJvcChpbk9iaiksIG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSdsbCBjb250aW51ZSB0byB1c2UgZGVwLm91dHB1dCBhcyBpdHMgaWQsIGJ1dCBhZGQgb3V0cHV0cyBhcyB3ZWxsXG4gICAgICAgIC8vIGZvciBjb252ZW5pZW5jZSBhbmQgc3ltbWV0cnkgd2l0aCB0aGUgc3RydWN0dXJlIG9mIGlucHV0cyBhbmQgc3RhdGUuXG4gICAgICAgIC8vIEFsc28gY29sbGVjdCBNQVRDSCBrZXlzIGluIHRoZSBvdXRwdXQgKGFsbCBvdXRwdXRzIG11c3Qgc2hhcmUgdGhlc2UpXG4gICAgICAgIC8vIGFuZCBBTEwga2V5cyBpbiB0aGUgZmlyc3Qgb3V0cHV0IChuZWVkIG5vdCBiZSBzaGFyZWQgYnV0IHdlJ2xsIHVzZVxuICAgICAgICAvLyB0aGUgZmlyc3Qgb3V0cHV0IGZvciBjYWxjdWxhdGlvbnMpIGZvciBsYXRlciBjb252ZW5pZW5jZS5cbiAgICAgICAgY29uc3Qge21hdGNoS2V5c30gPSBmaW5kV2lsZGNhcmRLZXlzKFxuICAgICAgICAgICAgb3V0cHV0cy5sZW5ndGggPyBvdXRwdXRzWzBdLmlkIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpcnN0U2luZ2xlT3V0cHV0ID0gZmluZEluZGV4KG8gPT4gIWlzTXVsdGlWYWx1ZWQoby5pZCksIG91dHB1dHMpO1xuICAgICAgICBjb25zdCBmaW5hbERlcGVuZGVuY3kgPSBtZXJnZVJpZ2h0KFxuICAgICAgICAgICAge21hdGNoS2V5cywgZmlyc3RTaW5nbGVPdXRwdXQsIG91dHB1dHN9LFxuICAgICAgICAgICAgZGVwZW5kZW5jeVxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRJZFByb3AgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHl9ID0gb3V0SWRQcm9wO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCB0byB0aGUgc2FtZSBjYWxsYmFja1xuICAgICAgICAgICAgY29uc3QgYWxzb0lucHV0ID0gY2hlY2tJbk91dE92ZXJsYXAob3V0SWRQcm9wLCBpbnB1dHMpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRJZExpc3QgPSBtYWtlQWxsSWRzKG91dElkLCB7fSk7XG4gICAgICAgICAgICAgICAgb3V0SWRMaXN0LmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wT3V0SWRQcm9wID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdXRJZE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKHRlbXBPdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsc29JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKHRlbXBPdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWROYW1lICs9IG91dHB1dFRhZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXRUb011bHRpKGlkLCBvdXRJZE5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ob3V0cHV0UGF0dGVybnMsIG91dElkLCBwcm9wZXJ0eSwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3Aob3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoYWxzb0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZU91dHB1dHMucHVzaChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICBvdXRJZE5hbWUgKz0gb3V0cHV0VGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRPdXRwdXRUb011bHRpKHt9LCBvdXRJZE5hbWUpO1xuICAgICAgICAgICAgICAgIGFkZE1hcChvdXRwdXRNYXAsIG91dElkLCBwcm9wZXJ0eSwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXRPYmplY3QgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBpbklkLCBwcm9wZXJ0eTogaW5Qcm9wfSA9IGlucHV0T2JqZWN0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbklkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4oaW5wdXRQYXR0ZXJucywgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRNYXAoaW5wdXRNYXAsIGluSWQsIGluUHJvcCwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBzZWNvbmQgcGFzcyBmb3IgYWRkaW5nIG5ldyBvdXRwdXQgbm9kZXMgYXMgZGVwZW5kZW5jaWVzIHdoZXJlIG5lZWRlZFxuICAgIGR1cGxpY2F0ZU91dHB1dHMuZm9yRWFjaChkdXBlT3V0SWRQcm9wID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gY29tYmluZUlkQW5kUHJvcChkdXBlT3V0SWRQcm9wKTtcbiAgICAgICAgY29uc3QgbmV3TmFtZSA9IG9yaWdpbmFsTmFtZS5jb25jYXQob3V0cHV0VGFnKTtcbiAgICAgICAgZm9yICh2YXIgY250ID0gMDsgY250IDwgY2JJbi5sZW5ndGg7IGNudCsrKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBpbnB1dCB0byB0aGUgY2FsbGJhY2tcbiAgICAgICAgICAgIGlmIChjYkluW2NudF0uc29tZShpbk5hbWUgPT4gaW5OYW1lID09PSBvcmlnaW5hbE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGl0J3Mgbm90IGFsc28gYW4gb3V0cHV0IG9mIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAqICh0aGlzIHdpbGwgYmUgdGhlIG9yaWdpbmFsIGNhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmICghY2JPdXRbY250XS5zb21lKG91dE5hbWUgPT4gb3V0TmFtZSA9PT0gbmV3TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2JPdXRbY250XS5mb3JFYWNoKG91dE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXRUb011bHRpKG5ld05hbWUsIG91dE5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmluYWxHcmFwaHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRXaWxkY2FyZEtleXMoaWQpIHtcbiAgICBjb25zdCBtYXRjaEtleXMgPSBbXTtcbiAgICBjb25zdCBhbGxzbWFsbGVyS2V5cyA9IFtdO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gTUFUQ0gpIHtcbiAgICAgICAgICAgICAgICBtYXRjaEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICBhbGxzbWFsbGVyS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGlkKTtcbiAgICAgICAgbWF0Y2hLZXlzLnNvcnQoKTtcbiAgICAgICAgYWxsc21hbGxlcktleXMuc29ydCgpO1xuICAgIH1cbiAgICByZXR1cm4ge21hdGNoS2V5cywgYWxsc21hbGxlcktleXN9O1xufVxuXG4vKlxuICogRG8gdGhlIGdpdmVuIGlkIHZhbHVlcyBgdmFsc2AgbWF0Y2ggdGhlIHBhdHRlcm4gYHBhdHRlcm5WYWxzYD9cbiAqIGBrZXlzYCwgYHBhdHRlcm5WYWxzYCwgYW5kIGB2YWxzYCBhcmUgYWxsIGFycmF5cywgYW5kIHdlIGFscmVhZHkga25vdyB0aGF0XG4gKiB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgaWRzIHdpdGggdGhlIHNhbWUga2V5cyBhcyB0aGUgcGF0dGVybi5cbiAqXG4gKiBPcHRpb25hbGx5LCBpbmNsdWRlIGFub3RoZXIgcmVmZXJlbmNlIHNldCBvZiB0aGUgc2FtZSAtIHRvIGVuc3VyZSB0aGVcbiAqIGNvcnJlY3QgbWF0Y2hpbmcgb2YgTUFUQ0ggb3IgQUxMU01BTExFUiBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgaXRlbXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZE1hdGNoKFxuICAgIGtleXMsXG4gICAgdmFscyxcbiAgICBwYXR0ZXJuVmFscyxcbiAgICByZWZLZXlzLFxuICAgIHJlZlZhbHMsXG4gICAgcmVmUGF0dGVyblZhbHNcbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWwgPSB2YWxzW2ldO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFsID0gcGF0dGVyblZhbHNbaV07XG4gICAgICAgIGlmIChwYXR0ZXJuVmFsLndpbGQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzZWNvbmQgaWQsIGNvbXBhcmUgdGhlIHdpbGRjYXJkIHZhbHVlcy5cbiAgICAgICAgICAgIC8vIFdpdGhvdXQgYSBzZWNvbmQgaWQsIGFsbCB3aWxkY2FyZHMgcGFzcyBhdCB0aGlzIHN0YWdlLlxuICAgICAgICAgICAgaWYgKHJlZktleXMgJiYgcGF0dGVyblZhbCAhPT0gQUxMKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmSW5kZXggPSByZWZLZXlzLmluZGV4T2Yoa2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmUGF0dGVyblZhbCA9IHJlZlBhdHRlcm5WYWxzW3JlZkluZGV4XTtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2suIFNob3VsZG4ndCBldmVyIGZhaWwgdGhpcywgaWYgdGhlIGJhY2sgZW5kXG4gICAgICAgICAgICAgICAgLy8gZGlkIGl0cyBqb2IgdmFsaWRhdGluZyBjYWxsYmFja3MuXG4gICAgICAgICAgICAgICAgLy8gWW91IGNhbid0IHJlc29sdmUgYW4gaW5wdXQgYWdhaW5zdCBhbiBpbnB1dCwgYmVjYXVzZVxuICAgICAgICAgICAgICAgIC8vIHR3byBBTExTTUFMTEVSJ3Mgd291bGRuJ3QgbWFrZSBzZW5zZSFcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUiAmJiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHdpbGRjYXJkIGlkIHBhaXI6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZktleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpZFZhbFNvcnQodmFsLCByZWZWYWxzW3JlZkluZGV4XSkgIT09XG4gICAgICAgICAgICAgICAgICAgIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSXG4gICAgICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbCAhPT0gcGF0dGVyblZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWxzW2ldID09PSBNQVRDSCkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHZhbHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KG1hdGNoZXMpIDogJyc7XG59XG5cbi8qXG4gKiBEb2VzIHRoaXMgaXRlbSAoaW5wdXQgLyBvdXRwdXQgLyBzdGF0ZSkgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXM/XG4gKiBzdHJpbmcgSURzIGRvIG5vdDsgd2lsZGNhcmQgSURzIG9ubHkgZG8gaWYgdGhleSBjb250YWluIEFMTCBvciBBTExTTUFMTEVSXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpVmFsdWVkKHtpZH0pIHtcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnb2JqZWN0JyAmJiBhbnkodiA9PiB2Lm11bHRpLCB2YWx1ZXMoaWQpKTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIG91dHB1dCBpZCBhbmQgcHJvcCwgZmluZCB0aGUgY2FsbGJhY2sgZ2VuZXJhdGluZyBpdC5cbiAqIElmIG5vIGNhbGxiYWNrIGlzIGZvdW5kLCByZXR1cm5zIGZhbHNlLlxuICogSWYgb25lIGlzIGZvdW5kLCByZXR1cm5zOlxuICoge1xuICogICAgIGNhbGxiYWNrOiB0aGUgY2FsbGJhY2sgc3BlYyB7b3V0cHV0cywgaW5wdXRzLCBzdGF0ZSBldGN9XG4gKiAgICAgYW55VmFsczogc3RyaW5naWZpZWQgbGlzdCBvZiByZXNvbHZlZCBNQVRDSCBrZXlzIHdlIG1hdGNoZWRcbiAqICAgICByZXNvbHZlZElkOiB0aGUgXCJvdXRwdXRzXCIgaWQgc3RyaW5nIHBsdXMgTUFUQ0ggdmFsdWVzIHdlIG1hdGNoZWRcbiAqICAgICBnZXRPdXRwdXRzOiBhY2Nlc3NvciBmdW5jdGlvbiB0byBnaXZlIGFsbCByZXNvbHZlZCBvdXRwdXRzIG9mIHRoaXNcbiAqICAgICAgICAgY2FsbGJhY2suIFRha2VzIGBwYXRoc2AgYXMgYXJndW1lbnQgdG8gYXBwbHkgd2hlbiB0aGUgY2FsbGJhY2sgaXNcbiAqICAgICAgICAgZGlzcGF0Y2hlZCwgaW4gY2FzZSBhIHByZXZpb3VzIGNhbGxiYWNrIGhhcyBhbHRlcmVkIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHtpZCAoc3RyaW5nIG9yIG9iamVjdCksIHByb3BlcnR5IChzdHJpbmcpfVxuICogICAgIGdldElucHV0czogc2FtZSBmb3IgaW5wdXRzXG4gKiAgICAgZ2V0U3RhdGU6IHNhbWUgZm9yIHN0YXRlXG4gKiAgICAgY2hhbmdlZFByb3BJZHM6IGFuIG9iamVjdCBvZiB7W2lkQW5kUHJvcF06IHZ9IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFja1xuICogICAgICAgICB2ID0gRElSRUNUICgyKTogdGhlIHByb3Agd2FzIGNoYW5nZWQgaW4gdGhlIGZyb250IGVuZCwgc28gZGVwZW5kZW50XG4gKiAgICAgICAgICAgICBjYWxsYmFja3MgKk1VU1QqIGJlIGV4ZWN1dGVkLlxuICogICAgICAgICB2ID0gSU5ESVJFQ1QgKDEpOiB0aGUgcHJvcCBpcyBleHBlY3RlZCB0byBiZSBjaGFuZ2VkIGJ5IGEgY2FsbGJhY2ssXG4gKiAgICAgICAgICAgICBidXQgaWYgdGhpcyBpcyBwcmV2ZW50ZWQsIGRlcGVuZGVudCBjYWxsYmFja3MgbWF5IGJlIHBydW5lZC5cbiAqICAgICBpbml0aWFsQ2FsbDogYm9vbGVhbiwgaWYgdHJ1ZSB3ZSBkb24ndCByZXF1aXJlIGFueSBjaGFuZ2VkUHJvcElkc1xuICogICAgICAgICB0byBrZWVwIHRoaXMgY2FsbGJhY2sgYXJvdW5kLCBhcyBpdCdzIHRoZSBpbml0aWFsIGNhbGwgdG8gcG9wdWxhdGVcbiAqICAgICAgICAgdGhpcyB2YWx1ZSBvbiBwYWdlIGxvYWQgb3IgY2hhbmdpbmcgcGFydCBvZiB0aGUgbGF5b3V0LlxuICogICAgICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSBmb3IgY2FsbGJhY2tzIGdlbmVyYXRlZCBieVxuICogICAgICAgICBnZXRDYWxsYmFja0J5T3V0cHV0LCBmYWxzZSBmcm9tIGdldENhbGxiYWNrc0J5SW5wdXQuXG4gKiB9XG4gKi9cbmZ1bmN0aW9uIGdldENhbGxiYWNrQnlPdXRwdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3ApIHtcbiAgICBsZXQgcmVzb2x2ZTtcbiAgICBsZXQgY2FsbGJhY2s7XG4gICAgbGV0IGFueVZhbHMgPSAnJztcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMub3V0cHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCB2YWxzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAocGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHBhdHRlcm5zW2ldLnZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXR0ZXJuc1tpXS5jYWxsYmFja3NbMF07XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlRGVwcyhrZXlzLCB2YWxzLCBwYXR0ZXJuVmFscyk7XG4gICAgICAgICAgICAgICAgICAgIGFueVZhbHMgPSBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VSZXNvbHZlZENhbGxiYWNrKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhjYWxsYmFjaywgb3V0UGF0dGVybiwgb3V0cywgbWF0Y2hlcykge1xuICAgIGNvbnN0IG91dDBLZXlzID0gT2JqZWN0LmtleXMob3V0UGF0dGVybi5pZCkuc29ydCgpO1xuICAgIGNvbnN0IG91dDBQYXR0ZXJuVmFscyA9IHByb3BzKG91dDBLZXlzLCBvdXRQYXR0ZXJuLmlkKTtcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgb3V0cy5mb3JFYWNoKCh7aWQ6IG91dElkfSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gcHJvcHMob3V0MEtleXMsIG91dElkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgcmVzb2x2ZURlcHMob3V0MEtleXMsIG91dFZhbHMsIG91dDBQYXR0ZXJuVmFscyksXG4gICAgICAgICAgICBnZXRBbnlWYWxzKG91dDBQYXR0ZXJuVmFscywgb3V0VmFscylcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge3Jlc29sdmVkSWR9ID0gcmVzb2x2ZWQ7XG4gICAgICAgIGlmICghZm91bmRDYklkc1tyZXNvbHZlZElkXSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgIGZvdW5kQ2JJZHNbcmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmUsIHBhdGhzLCBtYXRjaGVzKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrID0+IHtcbiAgICAgICAgY29uc3Qge21hdGNoS2V5cywgZmlyc3RTaW5nbGVPdXRwdXQsIG91dHB1dHN9ID0gY2FsbGJhY2s7XG4gICAgICAgIGlmIChtYXRjaEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzaW5nbGVPdXRQYXR0ZXJuID0gb3V0cHV0c1tmaXJzdFNpbmdsZU91dHB1dF07XG4gICAgICAgICAgICBpZiAoc2luZ2xlT3V0UGF0dGVybikge1xuICAgICAgICAgICAgICAgIGFkZFJlc29sdmVkRnJvbU91dHB1dHMoXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVPdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGhzKShzaW5nbGVPdXRQYXR0ZXJuKSxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogSWYgZXZlcnkgb3V0cHV0IGhhcyBBTEwgd2UgbmVlZCB0byByZWR1Y2UgcmVzb2x2ZWQgc2V0XG4gICAgICAgICAgICAgICAgICogdG8gb25lIGl0ZW0gcGVyIGNvbWJpbmF0aW9uIG9mIE1BVENIIHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgKiBUaGF0IHdpbGwgZ2l2ZSBvbmUgcmVzdWx0IHBlciBjYWxsYmFjayBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGFueVNlZW4gPSB7fTtcbiAgICAgICAgICAgICAgICBvdXRwdXRzLmZvckVhY2gob3V0UGF0dGVybiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dFNldCA9IHJlc29sdmUocGF0aHMpKG91dFBhdHRlcm4pLmZpbHRlcihpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoU3RyID0gSlNPTi5zdHJpbmdpZnkocHJvcHMobWF0Y2hLZXlzLCBpLmlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFueVNlZW5bbWF0Y2hTdHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55U2VlblttYXRjaFN0cl0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0UGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dFNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2FsbGJhY2ssIHJlc29sdmUsICcnKTtcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChjYik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKlxuICogRm9yIGEgZ2l2ZW4gaWQgYW5kIHByb3AgZmluZCBhbGwgY2FsbGJhY2tzIGl0J3MgYW4gaW5wdXQgb2YuXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGV9XG4gKiAgIFNlZSBnZXRDYWxsYmFja0J5T3V0cHV0IGZvciBkZXRhaWxzLlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgb3JpZ2luYWwgaW5wdXQgY29udGFpbnMgYW4gQUxMU01BTExFUiB3aWxkY2FyZCxcbiAqIHRoZXJlIG1heSBiZSBtYW55IGVudHJpZXMgZm9yIHRoZSBzYW1lIGNhbGxiYWNrLCBidXQgYW55IGdpdmVuIG91dHB1dFxuICogKHdpdGggYW4gTUFUQ0ggY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQncyBBTExTTUFMTEVSKSB3aWxsIG9ubHkgYXBwZWFyXG4gKiBpbiBvbmUgZW50cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYXRjaGVkS2V5cyhpZCwgbmV3UHJvcHMsIGdyYXBocykge1xuICAgIGlmICghKGlkICYmIGdyYXBocyAmJiBuZXdQcm9wcy5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBncmFwaHMuaW5wdXRNYXBbaWRdO1xuICAgICAgICByZXR1cm4gaW5wdXRzID8gbmV3UHJvcHMuZmlsdGVyKG5ld1Byb3AgPT4gaW5wdXRzW25ld1Byb3BdKSA6IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgY29uc3Qga2V5UGF0dGVybnMgPSBncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdO1xuICAgIGlmICgha2V5UGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UHJvcHMuZmlsdGVyKHByb3AgPT4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGtleVBhdHRlcm5zW3Byb3BdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcGF0dGVybnMgJiZcbiAgICAgICAgICAgIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBpZE1hdGNoKGtleXMsIHZhbHMsIHBhdHRlcm4udmFsdWVzKSlcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cblxuLypcbiAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGNhbGxiYWNrcyByZWZlcmVuY2luZyBhIGNodW5rIG9mIHRoZSBsYXlvdXQsXG4gKiBlaXRoZXIgYXMgaW5wdXRzIG9yIG91dHB1dHMuXG4gKlxuICogb3B0cy5vdXRwdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgd2hlbiBjcmF3bGluZyB0aGUgKndob2xlKiBsYXlvdXQsXG4gKiAgIGJlY2F1c2Ugb3V0cHV0cyBhcmUgZW5vdWdoIHRvIGdldCBldmVyeXRoaW5nLlxuICogb3B0cy5yZW1vdmVkQXJyYXlJbnB1dHNPbmx5OiBib29sZWFuLCBzZXQgdHJ1ZSB0byBvbmx5IGxvb2sgZm9yIGlucHV0cyBpblxuICogICB3aWxkY2FyZCBhcnJheXMgKEFMTCBvciBBTExTTUFMTEVSKSwgbm8gb3V0cHV0cy4gVGhpcyBnZXRzIHVzZWQgdG8gdGVsbFxuICogICB3aGVuIHRoZSBuZXcgKmFic2VuY2UqIG9mIGEgZ2l2ZW4gY29tcG9uZW50IHNob3VsZCB0cmlnZ2VyIGEgY2FsbGJhY2suXG4gKiBvcHRzLm5ld1BhdGhzOiBwYXRocyBvYmplY3QgYWZ0ZXIgdGhlIGVkaXQgLSB0byBiZSB1c2VkIHdpdGhcbiAqICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhbGxiYWNrIHN0aWxsIGhhcyBpdHMgb3V0cHV0c1xuICogb3B0cy5jaHVua1BhdGg6IHBhdGggdG8gdGhlIG5ldyBjaHVuayAtIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFueSBvdXRwdXRzIGFyZVxuICogICBvdXRzaWRlIG9mIHRoaXMgY2h1bmssIGJlY2F1c2UgdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXRzIGluc2lkZSB0aGVcbiAqICAgY2h1bmsgY291bnQgYXMgaGF2aW5nIGNoYW5nZWRcbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHM6XG4gKiAgIHtjYWxsYmFjaywgcmVzb2x2ZWRJZCwgZ2V0T3V0cHV0cywgZ2V0SW5wdXRzLCBnZXRTdGF0ZSwgLi4uZXRjfVxuICogICBTZWUgZ2V0Q2FsbGJhY2tCeU91dHB1dCBmb3IgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0Q2h1bmssIG9wdHMpIHtcbiAgICBjb25zdCB7b3V0cHV0c09ubHksIHJlbW92ZWRBcnJheUlucHV0c09ubHksIG5ld1BhdGhzLCBjaHVua1BhdGh9ID0gb3B0cztcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgY29uc3QgY2FsbGJhY2tzID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRDYWxsYmFjayhjYWxsYmFjaykge1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBmb3VuZENiSWRzW2NhbGxiYWNrLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ2IgPSBjYWxsYmFja3NbZm91bmRJbmRleF07XG4gICAgICAgICAgICAgICAgZm91bmRDYi5jaGFuZ2VkUHJvcElkcyA9IG1lcmdlTWF4KFxuICAgICAgICAgICAgICAgICAgICBmb3VuZENiLmNoYW5nZWRQcm9wSWRzLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jaGFuZ2VkUHJvcElkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmluaXRpYWxDYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kQ2IuaW5pdGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm91bmRDYklkc1tjYWxsYmFjay5yZXNvbHZlZElkXSA9IGNhbGxiYWNrcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ2FsbGJhY2tJZkFycmF5KGlkU3RyKSB7XG4gICAgICAgIHJldHVybiBjYiA9PlxuICAgICAgICAgICAgY2IuZ2V0SW5wdXRzKHBhdGhzKS5zb21lKGluaSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGluaSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5pLnNvbWUoaW5paiA9PiBzdHJpbmdpZnlJZChpbmlqLmlkKSA9PT0gaWRTdHIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgc2hvdWxkIHRyaWdnZXIgZXZlbiB3aXRoIG5vIGNoYW5nZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHByb3BzIHRoYXQgY2hhbmdlZCBubyBsb25nZXIgZXhpc3QuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGtpbmQgb2YgYWJ1c2luZyB0aGUgYGluaXRpYWxDYWxsYCBmbGFnIGhlcmUsIGl0J3NcbiAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBsaWtlIGEgXCJmaW5hbCBjYWxsXCIgZm9yIHRoZSByZW1vdmVkIGlucHV0cywgYnV0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FzZSBpcyBub3Qgc3ViamVjdCB0byBgcHJldmVudF9pbml0aWFsX2NhbGxgLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhdHRlbihjYi5nZXRPdXRwdXRzKG5ld1BhdGhzKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5jaGFuZ2VkUHJvcElkcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FsbGJhY2soY2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVPbmVJZChpZCwgb3V0SWRDYWxsYmFja3MsIGluSWRDYWxsYmFja3MpIHtcbiAgICAgICAgaWYgKG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBnZXRDYWxsYmFja0J5T3V0cHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBmb3VuZCBpbiB0aGUgbGF5b3V0IGJ5IG91dHB1dCBzaG91bGQgYWx3YXlzIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCBub3QgdG8uXG4gICAgICAgICAgICAgICAgICAgIC8vIGllIHRoaXMgaXMgdGhlIGluaXRpYWwgY2FsbCBvZiB0aGlzIGNhbGxiYWNrIGV2ZW4gaWYgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIHBhZ2UgaW5pdGlhbGl6YXRpb24gYnV0IGp1c3QgYSBuZXcgbGF5b3V0IGNodW5rXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2IuY2FsbGJhY2sucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW91dHB1dHNPbmx5ICYmIGluSWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlQWRkQ2FsbGJhY2sgPSByZW1vdmVkQXJyYXlJbnB1dHNPbmx5XG4gICAgICAgICAgICAgICAgPyBhZGRDYWxsYmFja0lmQXJyYXkoc3RyaW5naWZ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIDogYWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICBsZXQgaGFuZGxlVGhpc0NhbGxiYWNrID0gbWF5YmVBZGRDYWxsYmFjaztcbiAgICAgICAgICAgIGlmIChjaHVua1BhdGgpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUaGlzQ2FsbGJhY2sgPSBjYiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICFhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzV2l0aChjaHVua1BhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWNrKCdwYXRoJywgZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVBZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dChcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaChoYW5kbGVUaGlzQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQobGF5b3V0Q2h1bmssIGNoaWxkID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoKFsncHJvcHMnLCAnaWQnXSwgY2hpbGQpO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmICFyZW1vdmVkQXJyYXlJbnB1dHNPbmx5KSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoaWQsIGdyYXBocy5vdXRwdXRNYXBbaWRdLCBncmFwaHMuaW5wdXRNYXBbaWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5U3RyID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSAmJiBncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtYXAoXG4gICAgICAgIGNiID0+ICh7XG4gICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgIHByaW9yaXR5OiBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBjYilcbiAgICAgICAgfSksXG4gICAgICAgIGNhbGxiYWNrc1xuICAgICk7XG59XG4iLCJpbXBvcnQgeyBhbGwsIGFzc29jLCBjb25jYXQsIGRpZmZlcmVuY2UsIGZpbHRlciwgZmxhdHRlbiwgaXNFbXB0eSwga2V5cywgbWFwLCBtZXJnZVdpdGgsIHBhcnRpdGlvbiwgcGF0aCwgcGlja0J5LCBwcm9wcywgcmVkdWNlLCB6aXBPYmogfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzLCBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzLCBpZE1hdGNoLCBpc011bHRpVmFsdWVkLCBzcGxpdElkQW5kUHJvcCwgc3RyaW5naWZ5SWQgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5leHBvcnQgY29uc3QgRElSRUNUID0gMjtcbmV4cG9ydCBjb25zdCBJTkRJUkVDVCA9IDE7XG5leHBvcnQgY29uc3QgbWVyZ2VNYXggPSBtZXJnZVdpdGgoTWF0aC5tYXgpO1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVJZEFuZFByb3AgPSAoeyBpZCwgcHJvcGVydHkgfSkgPT4gYCR7c3RyaW5naWZ5SWQoaWQpfS4ke3Byb3BlcnR5fWA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcCwgY2hhbmdlVHlwZSwgd2l0aFByaW9yaXR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICBjb25zdCBpZEFuZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHsgaWQsIHByb3BlcnR5OiBwcm9wIH0pO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGlkIHZlcnNpb25cbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKGdyYXBocy5pbnB1dE1hcFtpZF0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZURlcHMoKSwgcGF0aHMsIG1hdGNoZXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHdpbGRjYXJkIHZlcnNpb25cbiAgICAgICAgY29uc3QgX2tleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCB2YWxzID0gcHJvcHMoX2tleXMsIGlkKTtcbiAgICAgICAgY29uc3Qga2V5U3RyID0gX2tleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm5zLmZvckVhY2gocGF0dGVybiA9PiB7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaChfa2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybi5jYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVEZXBzKF9rZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcyksIHBhdGhzLCBtYXRjaGVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgICBtYXRjaC5jaGFuZ2VkUHJvcElkc1tpZEFuZFByb3BdID0gY2hhbmdlVHlwZSB8fCBESVJFQ1Q7XG4gICAgICAgIGlmICh3aXRoUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG1hdGNoLnByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgbWF0Y2gpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG59XG4vKlxuICogQnVpbGRzIGEgdHJlZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGUgcHJvdmlkZWQgY2FsbGJhY2suXG4gKiBVc2VzIHRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIGF0IGVhY2ggdHJlZSBkZXB0aCBhbmQgdGhlIHRvdGFsIGRlcHRoIG9mIHRoZSB0cmVlXG4gKiB0byBjcmVhdGUgYSBzb3J0YWJsZSBwcmlvcml0eSBoYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBjb25zdCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIGNvbnN0IHRvdWNoZWRDYklkcyA9IHt9O1xuICAgIGNvbnN0IHByaW9yaXR5ID0gW107XG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tzID0gZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHRvdWNoZWRDYklkc1tjLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRvdWNoZWQ7XG4gICAgICAgIH0sIGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBmaWx0ZXIobyA9PiAhdG91Y2hlZE91dHB1dHNbY29tYmluZUlkQW5kUHJvcChvKV0sIGZsYXR0ZW4obWFwKGNiID0+IGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLCBjYWxsYmFja3MpKSk7XG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvID0+ICh0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSA9IHRydWUpKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmlvcml0eS5wdXNoKGNhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaW9yaXR5LnVuc2hpZnQocHJpb3JpdHkubGVuZ3RoKTtcbiAgICByZXR1cm4gbWFwKGkgPT4gTWF0aC5taW4oaSwgMzUpLnRvU3RyaW5nKDM2KSwgcHJpb3JpdHkpLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBsZXQgdG91Y2hlZE91dHB1dHMgPSB7fTtcbiAgICAvLyB0aGlzIHRyYXZlcnNlcyB0aGUgZ3JhcGggYWxsIHRoZSB3YXkgdG8gdGhlIGVuZFxuICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGRvbid0IGFkZCBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBiYXNlZCBvbiBpZCBhbmQgcHJvcHNcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgdG91Y2hlZE91dHB1dHMgPSByZWR1Y2UoKHRvdWNoZWQsIG8pID0+IGFzc29jKGNvbWJpbmVJZEFuZFByb3AobyksIHRydWUsIHRvdWNoZWQpLCB0b3VjaGVkT3V0cHV0cywgb3V0cHV0cyk7XG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4obWFwKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSwgSU5ESVJFQ1QsIGZhbHNlKSwgb3V0cHV0cykpO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2hlZE91dHB1dHM7XG59XG5leHBvcnQgY29uc3QgZ2V0UmVhZHlDYWxsYmFja3MgPSAocGF0aHMsIGNhbmRpZGF0ZXMsIGNhbGxiYWNrcyA9IGNhbmRpZGF0ZXMsIGdyYXBocyA9IHt9KSA9PiB7XG4gICAgLy8gU2tpcCBpZiB0aGVyZSdzIG5vIGNhbmRpZGF0ZXNcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gRmluZCBhbGwgb3V0cHV0cyBvZiBhbGwgYWN0aXZlIGNhbGxiYWNrc1xuICAgIGNvbnN0IG91dHB1dHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgcmVkdWNlKChvLCBjYikgPT4gY29uY2F0KG8sIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSwgW10sIGNhbGxiYWNrcykpO1xuICAgIC8vIE1ha2UgYG91dHB1dHNgIGhhc2ggdGFibGUgZm9yIGZhc3RlciBhY2Nlc3NcbiAgICBsZXQgb3V0cHV0c01hcCA9IHt9O1xuICAgIG91dHB1dHMuZm9yRWFjaChvdXRwdXQgPT4gKG91dHB1dHNNYXBbb3V0cHV0XSA9IHRydWUpKTtcbiAgICAvLyBmaW5kIGFsbCB0aGUgb3V0cHV0cyB0b3VjaGVkIGJ5IGFjdGl2ZUNhbGxiYWNrc1xuICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGlmIGdyYXBoIGlzIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgaWYgKE9iamVjdC5rZXlzKGdyYXBocykubGVuZ3RoKSB7XG4gICAgICAgIC8vbm90IHN1cmUgaWYgZ3JhcGggd2lsbCBiZSBhY2Nlc3NpYmxlIGFsbCB0aGUgdGltZVxuICAgICAgICBjb25zdCBhbGxUb3VjaGVkT3V0cHV0cyA9IGZsYXR0ZW4obWFwKGNiID0+IGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2IpLCBjYWxsYmFja3MpKTtcbiAgICAgICAgLy8gb3ZlcnJyaWRlcyB0aGUgb3V0cHV0c01hcCwgd2lsbCBkdXBsaWNhdGUgY2FsbGJhY2tzIGZpbHRlcmVkXG4gICAgICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHRvIHNpbGVuY2UgdHlwZXNjcmlwdCBlcnJvcnNcbiAgICAgICAgaWYgKGFsbFRvdWNoZWRPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dHNNYXAgPSBPYmplY3QuYXNzaWduKGFsbFRvdWNoZWRPdXRwdXRzWzBdLCAuLi5hbGxUb3VjaGVkT3V0cHV0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmFtZGEuSlMgYGRpZmZlcmVuY2VgIGZ1bmN0aW9uIGlzIHNsb3cgYmVjYXVzZSBpdCBjb21wYXJlcyBvYmplY3RzIGVudGlyZWx5XG4gICAgLy8gVGhpcyBjYXVzZSB0aGUgZm9sbG93aW5nIGBmaWx0ZXJgIHRvIGJlIGV4cG9uZW50aWFsbHkgc2xvdyBhcyB0aGUgbnVtYmVyIG9mIGlucHV0cyBvciBvdXRwdXRzIGdyb3dcbiAgICAvLyBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBjb21wYXJpbmcgb25seSB0aGUgYGlkK3Byb3BgIHBhcnQgb2YgdGhlIGlucHV0cyAmIG91dHB1dHMuXG4gICAgLy8gT3JpZ2luYWwgZGlmZmVyZW5jZSB0YWtlcyAzODBtcyBvbiBhdmVyYWdlIHRvIGNvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIwMCBpbnB1dHMgYW5kIDEgb3V0cHV0LlxuICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGFrZXMgMS0ybXMgb24gYXZlcmFnZS5cbiAgICBjb25zdCBkaWZmZXJlbmNlQmFzZWRPbklkID0gKGlucHV0cywgb3V0cHV0cykgPT4gaW5wdXRzLmZpbHRlcihpbnB1dCA9PiAhb3V0cHV0cy5zb21lKG91dHB1dCA9PiBjb21iaW5lSWRBbmRQcm9wKGlucHV0KSA9PT0gY29tYmluZUlkQW5kUHJvcChvdXRwdXQpKSk7XG4gICAgLy8gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgLy8gT3V0cHV0cyB3aGljaCBvdmVybGFwIGFuIGlucHV0IGRvIG5vdCBjb3VudCBhcyBhbiBvdXRzdGFuZGluZyBvdXRwdXRcbiAgICByZXR1cm4gZmlsdGVyKGNiID0+IGFsbChjYnAgPT4gIW91dHB1dHNNYXBbY29tYmluZUlkQW5kUHJvcChjYnApXSwgZGlmZmVyZW5jZUJhc2VkT25JZChmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSkpLCBjYW5kaWRhdGVzKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0TGF5b3V0Q2FsbGJhY2tzID0gKGdyYXBocywgcGF0aHMsIGxheW91dCwgb3B0aW9ucykgPT4ge1xuICAgIGxldCBleGNsdXNpb25zID0gW107XG4gICAgbGV0IGNhbGxiYWNrcyA9IGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKTtcbiAgICAvKlxuICAgICAgICBSZW1vdmUgZnJvbSB0aGUgaW5pdGlhbCBjYWxsYmFja3MgdGhvc2UgdGhhdCBhcmUgbGVmdCB3aXRoIG9ubHkgZXhjbHVkZWQgaW5wdXRzLlxuXG4gICAgICAgIEV4Y2x1c2lvbiBvZiBpbnB1dHMgaGFwcGVucyB3aGVuOlxuICAgICAgICAtIGFuIGlucHV0IGlzIG1pc3NpbmdcbiAgICAgICAgLSBhbiBpbnB1dCBpbiB0aGUgaW5pdGlhbCBjYWxsYmFjayBjaGFpbiBkZXBlbmRzIG9ubHkgb24gZXhjbHVkZWQgaW5wdXRzXG5cbiAgICAgICAgRnVydGhlciBleGNsdXNpb24gbWlnaHQgaGFwcGVuIGFmdGVyIGNhbGxiYWNrcyByZXR1cm4gd2l0aDpcbiAgICAgICAgLSBQcmV2ZW50VXBkYXRlXG4gICAgICAgIC0gbm9fdXBkYXRlXG4gICAgKi9cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBGaW5kIGNhbGxiYWNrcyBmb3Igd2hpY2ggYWxsIGlucHV0cyBhcmUgbWlzc2luZyBvciBpbiB0aGUgZXhjbHVzaW9uc1xuICAgICAgICBjb25zdCBbaW5jbHVkZWQsIGV4Y2x1ZGVkXSA9IHBhcnRpdGlvbigoeyBjYWxsYmFjazogeyBpbnB1dHMgfSwgZ2V0SW5wdXRzIH0pID0+IGFsbChpc011bHRpVmFsdWVkLCBpbnB1dHMpIHx8XG4gICAgICAgICAgICAhaXNFbXB0eShkaWZmZXJlbmNlKG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGdldElucHV0cyhwYXRocykpKSwgZXhjbHVzaW9ucykpLCBjYWxsYmFja3MpO1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGFkZGl0aW9uYWwgZXhjbHVzaW9ucywgYnJlYWsgbG9vcCAtIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2xlYW5lZFxuICAgICAgICBpZiAoIWV4Y2x1ZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzID0gaW5jbHVkZWQ7XG4gICAgICAgIC8vIHVwZGF0ZSBleGNsdXNpb25zIHdpdGggYWxsIGFkZGl0aW9uYWwgZXhjbHVkZWQgb3V0cHV0c1xuICAgICAgICBleGNsdXNpb25zID0gY29uY2F0KGV4Y2x1c2lvbnMsIG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKG1hcCgoeyBnZXRPdXRwdXRzIH0pID0+IGdldE91dHB1dHMocGF0aHMpLCBleGNsdWRlZCkpKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZpbHRlclJvb3QpIHtcbiAgICAgICAgbGV0IHJvb3RJZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBsYXlvdXQpO1xuICAgICAgICBpZiAocm9vdElkKSB7XG4gICAgICAgICAgICByb290SWQgPSBzdHJpbmdpZnlJZChyb290SWQpO1xuICAgICAgICAgICAgLy8gRmlsdGVyIGlucHV0cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IuY2FsbGJhY2suaW5wdXRzLnJlZHVjZSgocHJldmlvdXMsIGlucHV0KSA9PiBwcmV2aW91cyB8fFxuICAgICAgICAgICAgICAgIChzdHJpbmdpZnlJZChpbnB1dC5pZCkgPT0gcm9vdElkICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyUm9vdC5pbmNsdWRlcyhpbnB1dC5wcm9wZXJ0eSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICAgIFJldHVybiBhbGwgY2FsbGJhY2tzIHdpdGggYW4gYGV4ZWN1dGlvbkdyb3VwYCB0byBhbGxvdyBncm91cC1wcm9jZXNzaW5nXG4gICAgKi9cbiAgICBjb25zdCBleGVjdXRpb25Hcm91cCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBtYXAoY2IgPT4gKHsgLi4uY2IsIGV4ZWN1dGlvbkdyb3VwIH0pLCBjYWxsYmFja3MpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVbmlxdWVJZGVudGlmaWVyID0gKHsgYW55VmFscywgY2FsbGJhY2s6IHsgaW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSB9IH0pID0+IGNvbmNhdChtYXAoY29tYmluZUlkQW5kUHJvcCwgWy4uLmlucHV0cywgLi4ub3V0cHV0cywgLi4uc3RhdGVdKSwgQXJyYXkuaXNBcnJheShhbnlWYWxzKSA/IGFueVZhbHMgOiBhbnlWYWxzID09PSAnJyA/IFtdIDogW2FueVZhbHNdKS5qb2luKCcsJyk7XG5leHBvcnQgZnVuY3Rpb24gaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcGVydGllcywgZ3JhcGhzLCBwYXRocykge1xuICAgIHJldHVybiBmbGF0dGVuKG1hcChwcm9wTmFtZSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wTmFtZSksIGtleXMocHJvcGVydGllcykpKTtcbn1cbi8qXG4gKiBDcmVhdGUgYSBwZW5kaW5nIGNhbGxiYWNrIG9iamVjdC4gSW5jbHVkZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGRlZmluaXRpb24sXG4gKiBpdHMgcmVzb2x2ZWQgSUQgKGluY2x1ZGluZyB0aGUgdmFsdWUgb2YgYWxsIE1BVENIIHdpbGRjYXJkcyksXG4gKiBhY2Nlc3NvcnMgdG8gZmluZCBhbGwgaW5wdXRzLCBvdXRwdXRzLCBhbmQgc3RhdGUgaW52b2x2ZWQgaW4gdGhpc1xuICogY2FsbGJhY2sgKGxhenkgYXMgbm90IGFsbCB1c2VycyB3aWxsIHdhbnQgYWxsIG9mIHRoZXNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2VSZXNvbHZlZENhbGxiYWNrID0gKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKSA9PiAoe1xuICAgIGNhbGxiYWNrLFxuICAgIGFueVZhbHMsXG4gICAgcmVzb2x2ZWRJZDogY2FsbGJhY2sub3V0cHV0ICsgYW55VmFscyxcbiAgICBnZXRPdXRwdXRzOiBwYXRocyA9PiBjYWxsYmFjay5vdXRwdXRzLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgZ2V0SW5wdXRzOiBwYXRocyA9PiBjYWxsYmFjay5pbnB1dHMubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBnZXRTdGF0ZTogcGF0aHMgPT4gY2FsbGJhY2suc3RhdGUubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBjaGFuZ2VkUHJvcElkczoge30sXG4gICAgaW5pdGlhbENhbGw6IGZhbHNlXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUNhbGxiYWNrcyhjYWxsYmFja3MsIHBhdGhzKSB7XG4gICAgY29uc3QgWywgcmVtb3ZlZF0gPSBwYXJ0aXRpb24oKHsgZ2V0T3V0cHV0cywgY2FsbGJhY2s6IHsgb3V0cHV0cyB9IH0pID0+IGZsYXR0ZW4oZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCA9PT0gb3V0cHV0cy5sZW5ndGgsIGNhbGxiYWNrcyk7XG4gICAgY29uc3QgWywgbW9kaWZpZWRdID0gcGFydGl0aW9uKCh7IGdldE91dHB1dHMgfSkgPT4gIWZsYXR0ZW4oZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCwgcmVtb3ZlZCk7XG4gICAgY29uc3QgYWRkZWQgPSBtYXAoY2IgPT4gYXNzb2MoJ2NoYW5nZWRQcm9wSWRzJywgcGlja0J5KChfLCBwcm9wSWQpID0+IGdldFBhdGgocGF0aHMsIHNwbGl0SWRBbmRQcm9wKHByb3BJZCkuaWQpLCBjYi5jaGFuZ2VkUHJvcElkcyksIGNiKSwgbW9kaWZpZWQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFkZGVkLFxuICAgICAgICByZW1vdmVkXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVwcyhyZWZLZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscykge1xuICAgIHJldHVybiAocGF0aHMpID0+ICh7IGlkOiBpZFBhdHRlcm4sIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZFBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRocywgaWRQYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiBwYXRoID8gW3sgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhdGggfV0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfa2V5cyA9IE9iamVjdC5rZXlzKGlkUGF0dGVybikuc29ydCgpO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHByb3BzKF9rZXlzLCBpZFBhdHRlcm4pO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGtleVBhdGhzID0gcGF0aHMub2Jqc1trZXlTdHJdO1xuICAgICAgICBpZiAoIWtleVBhdGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGtleVBhdGhzLmZvckVhY2goKHsgdmFsdWVzOiB2YWxzLCBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChpZE1hdGNoKF9rZXlzLCB2YWxzLCBwYXR0ZXJuVmFscywgcmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBpZDogemlwT2JqKF9rZXlzLCB2YWxzKSwgcHJvcGVydHksIHBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4iLCJpbXBvcnQge29uY2UsIHBhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ufSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7YWRkUmVxdWVzdGVkQ2FsbGJhY2tzfSBmcm9tICcuL2NhbGxiYWNrcyc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBjb29raWUgZnJvbSAnY29va2llJztcbmltcG9ydCB7dmFsaWRhdGVDYWxsYmFja3NUb0xheW91dH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtpbmNsdWRlT2JzZXJ2ZXJzLCBnZXRMYXlvdXRDYWxsYmFja3N9IGZyb20gJy4vZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7Y29tcHV0ZVBhdGhzLCBnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7cmVjb3JkVWlFZGl0fSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5cbmV4cG9ydCBjb25zdCBvbkVycm9yID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fRVJST1InKSk7XG5leHBvcnQgY29uc3Qgc2V0QXBwTGlmZWN5Y2xlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKSk7XG5leHBvcnQgY29uc3Qgc2V0Q29uZmlnID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0NPTkZJRycpKTtcbmV4cG9ydCBjb25zdCBhZGRIdHRwSGVhZGVycyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSk7XG5leHBvcnQgY29uc3Qgc2V0R3JhcGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0dSQVBIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRIb29rcyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9IT09LUycpKTtcbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpO1xuZXhwb3J0IGNvbnN0IHNldFBhdGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX1BBVEhTJykpO1xuZXhwb3J0IGNvbnN0IHNldFJlcXVlc3RRdWV1ZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9SRVFVRVNUX1FVRVVFJykpO1xuZXhwb3J0IGNvbnN0IGluc2VydENvbXBvbmVudCA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0lOU0VSVF9DT01QT05FTlQnKSk7XG5leHBvcnQgY29uc3QgcmVtb3ZlQ29tcG9uZW50ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignUkVNT1ZFX0NPTVBPTkVOVCcpKTtcblxuZXhwb3J0IGNvbnN0IG9uUHJvcENoYW5nZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJykpO1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUHJvcHMocGF5bG9hZCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHBhdGgocGF5bG9hZC5pdGVtcGF0aCwgZ2V0U3RhdGUoKS5sYXlvdXQpO1xuICAgICAgICByZWNvcmRVaUVkaXQoY29tcG9uZW50LCBwYXlsb2FkLnByb3BzLCBkaXNwYXRjaCk7XG4gICAgICAgIGRpc3BhdGNoKG9uUHJvcENoYW5nZShwYXlsb2FkKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZENvbXBvbmVudFRvTGF5b3V0ID0gcGF5bG9hZCA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3Qge3BhdGhzfSA9IGdldFN0YXRlKCk7XG4gICAgZGlzcGF0Y2goaW5zZXJ0Q29tcG9uZW50KHBheWxvYWQpKTtcbiAgICBkaXNwYXRjaChcbiAgICAgICAgc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHBheWxvYWQuY29tcG9uZW50LCBwYXlsb2FkLmNvbXBvbmVudFBhdGgsIHBhdGhzKSlcbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoRXJyb3IgPSBkaXNwYXRjaCA9PiAobWVzc2FnZSwgbGluZXMpID0+XG4gICAgZGlzcGF0Y2goXG4gICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgZXJyb3I6IHttZXNzYWdlLCBodG1sOiBsaW5lcy5qb2luKCdcXG4nKX1cbiAgICAgICAgfSlcbiAgICApO1xuXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZUluaXRpYWxPdXRwdXRzKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIHZhbGlkYXRlQ2FsbGJhY2tzVG9MYXlvdXQoZ2V0U3RhdGUoKSwgZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkpO1xuICAgICAgICB0cmlnZ2VyRGVmYXVsdFN0YXRlKGRpc3BhdGNoLCBnZXRTdGF0ZSk7XG4gICAgICAgIGRpc3BhdGNoKHNldEFwcExpZmVjeWNsZShnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkpO1xuICAgIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG5jb25zdCBsb2dXYXJuaW5nT25jZSA9IG9uY2UoY29uc29sZS53YXJuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENTUkZIZWFkZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdYLUNTUkZUb2tlbic6IGNvb2tpZS5wYXJzZShkb2N1bWVudC5jb29raWUpLl9jc3JmX3Rva2VuXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dXYXJuaW5nT25jZShlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IGdldFN0YXRlKCk7XG5cbiAgICAvLyBvdmVyYWxsT3JkZXIgd2lsbCBhc3NlcnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGZvciBtdWx0aSBvdXRwdXQuXG4gICAgdHJ5IHtcbiAgICAgICAgZ3JhcGhzLk11bHRpR3JhcGgub3ZlcmFsbE9yZGVyKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaXJjdWxhciBEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgICAgICBodG1sOiBlcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZGlzcGF0Y2goXG4gICAgICAgIGFkZFJlcXVlc3RlZENhbGxiYWNrcyhcbiAgICAgICAgICAgIGdldExheW91dENhbGxiYWNrcyhncmFwaHMsIHBhdGhzLCBsYXlvdXQsIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzT25seTogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCByZWRvID0gbW92ZUhpc3RvcnkoJ1JFRE8nKTtcbmV4cG9ydCBjb25zdCB1bmRvID0gbW92ZUhpc3RvcnkoJ1VORE8nKTtcbmV4cG9ydCBjb25zdCByZXZlcnQgPSBtb3ZlSGlzdG9yeSgnUkVWRVJUJyk7XG5cbmZ1bmN0aW9uIG1vdmVIaXN0b3J5KGNoYW5nZVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICBjb25zdCB7aGlzdG9yeSwgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZGlzcGF0Y2goY3JlYXRlQWN0aW9uKGNoYW5nZVR5cGUpKCkpO1xuICAgICAgICBjb25zdCB7aWQsIHByb3BzfSA9XG4gICAgICAgICAgICAoY2hhbmdlVHlwZSA9PT0gJ1JFRE8nXG4gICAgICAgICAgICAgICAgPyBoaXN0b3J5LmZ1dHVyZVswXVxuICAgICAgICAgICAgICAgIDogaGlzdG9yeS5wYXN0W2hpc3RvcnkucGFzdC5sZW5ndGggLSAxXSkgfHwge307XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHByb3BzXG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVBY3Rpb24oJ1VORE9fUFJPUF9DSEFOR0UnKSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1wYXRoOiBnZXRQYXRoKHBhdGhzLCBpZCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7aWQsIHByb3BzfSkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vdGlmeU9ic2VydmVycyh7aWQsIHByb3BzfSkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKGluY2x1ZGVPYnNlcnZlcnMoaWQsIHByb3BzLCBncmFwaHMsIHBhdGhzKSlcbiAgICAgICAgKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlQXN5bmNFcnJvcihlcnIsIG1lc3NhZ2UsIGRpc3BhdGNoKSB7XG4gICAgLy8gSGFuZGxlIGh0bWwgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKGVyciAmJiB0eXBlb2YgZXJyLnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyLnRleHQoKS50aGVuKHRleHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7bWVzc2FnZSwgaHRtbDogdGV4dH07XG4gICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yfSkpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDoge21lc3NhZ2UsIGh0bWw6IGVycn07XG4gICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3J9KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2lzUmVhZHl9IGZyb20gJ0BwbG90bHkvZGFzaC1jb21wb25lbnQtcGx1Z2lucyc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9yZWdpc3RyeSc7XG5pbXBvcnQge2dldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgZGVmYXVsdCAobGF5b3V0LCBwYXRocywgdGFyZ2V0cykgPT4ge1xuICAgIGlmICghdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBjb25zdCB7ZXZlbnRzfSA9IHBhdGhzO1xuICAgIGNvbnN0IHJlbmRlcmVkID0gbmV3IFByb21pc2UocmVzb2x2ZVJlbmRlcmVkID0+IHtcbiAgICAgICAgZXZlbnRzLm9uY2UoJ3JlbmRlcmVkJywgcmVzb2x2ZVJlbmRlcmVkKTtcbiAgICB9KTtcblxuICAgIHRhcmdldHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhPZklkID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICBpZiAoIXBhdGhPZklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSBwYXRoKHBhdGhPZklkLCBsYXlvdXQpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gUmVnaXN0cnkucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgICBjb25zdCByZWFkeSA9IGlzUmVhZHkoY29tcG9uZW50KTtcblxuICAgICAgICBpZiAocmVhZHkgJiYgdHlwZW9mIHJlYWR5LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICAgICAgcmVhZHksXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHJpbmdpZnlJZChpZCkpICYmIHJlYWR5XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb21pc2VzLmxlbmd0aCA/IFByb21pc2UuYWxsKHByb21pc2VzKSA6IHRydWU7XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQgeyBJc0xvYWRpbmdBY3Rpb25UeXBlIH0gZnJvbSAnLi4vcmVkdWNlcnMvaXNMb2FkaW5nJztcbmV4cG9ydCBjb25zdCBzZXRJc0xvYWRpbmcgPSBjcmVhdGVBY3Rpb24oSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQpO1xuIiwiaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5leHBvcnQgY29uc3QgbG9hZGluZyA9IGNyZWF0ZUFjdGlvbignTE9BRElORycpO1xuZXhwb3J0IGNvbnN0IGxvYWRlZCA9IGNyZWF0ZUFjdGlvbignTE9BREVEJyk7XG4iLCJpbXBvcnQgeyBhcHBlbmQsIGFzc29jUGF0aCwgY29uY2F0LCBkaXNzb2NQYXRoLCBlbXB0eSwgZXF1YWxzLCBoYXMsIGluc2VydCwgaXMsIHBhdGgsIHByZXBlbmQsIHJldmVyc2UgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgZnVuY3Rpb24gaXNQYXRjaChvYmopIHtcbiAgICByZXR1cm4gaGFzKCdfX2Rhc2hfcGF0Y2hfdXBkYXRlJywgb2JqKTtcbn1cbmZ1bmN0aW9uIGdldExvY2F0aW9uSW5kZXgodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKGlzKE51bWJlciwgdmFsdWUpICYmIHZhbHVlIDwgMCkge1xuICAgICAgICByZXR1cm4gcHJldmlvdXMubGVuZ3RoICsgdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldExvY2F0aW9uUGF0aChsb2NhdGlvbiwgb2JqKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRMb2NhdGlvbkluZGV4KGxvY2F0aW9uW2ldLCBwYXRoKGN1cnJlbnQsIG9iaikpO1xuICAgICAgICBjdXJyZW50LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmNvbnN0IHBhdGNoSGFuZGxlcnMgPSB7XG4gICAgQXNzaWduOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcGFyYW1zLCBsb2NhdGlvbiB9ID0gcGF0Y2hPcGVyYXRpb247XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgobG9jYXRpb24sIHBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgTWVyZ2U6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIC4uLnBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZVxuICAgICAgICB9LCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBFeHRlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgY29uY2F0KHByZXYsIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIERlbGV0ZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gZGlzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgSW5zZXJ0OiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGluc2VydChnZXRMb2NhdGlvbkluZGV4KHBhdGNoT3BlcmF0aW9uLnBhcmFtcy5pbmRleCwgcHJldiksIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEFwcGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBhcHBlbmQocGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUHJlcGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmVwZW5kKHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEFkZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2ICsgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBTdWI6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAtIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgTXVsOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgKiBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIERpdjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2IC8gcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBDbGVhcjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBlbXB0eShwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUmV2ZXJzZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCByZXZlcnNlKHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBSZW1vdmU6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldi5maWx0ZXIoKGl0ZW0pID0+ICFlcXVhbHMoaXRlbSwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlKSksIHByZXZpb3VzKTtcbiAgICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhdGNoKHByZXZpb3VzVmFsdWUsIHBhdGNoVmFsdWUpIHtcbiAgICBsZXQgcmVkdWNlZFZhbHVlID0gcHJldmlvdXNWYWx1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGNoVmFsdWUub3BlcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhdGNoVmFsdWUub3BlcmF0aW9uc1tpXTtcbiAgICAgICAgcGF0Y2gubG9jYXRpb24gPSBnZXRMb2NhdGlvblBhdGgocGF0Y2gubG9jYXRpb24sIHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBwYXRjaEhhbmRsZXJzW3BhdGNoLm9wZXJhdGlvbl07XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE9wZXJhdGlvbiAke3BhdGNoLm9wZXJhdGlvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZWR1Y2VkVmFsdWUgPSBoYW5kbGVyKHJlZHVjZWRWYWx1ZSwgcGF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlZFZhbHVlO1xufVxuIiwiaW1wb3J0IHtcbiAgICBjb25jYXQsXG4gICAgZmlsdGVyLFxuICAgIGZpbmQsXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5zZXJ0LFxuICAgIHBhdGgsXG4gICAgcHJvcEVxLFxuICAgIHByb3BzLFxuICAgIGluZGV4T2Zcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2NyYXdsTGF5b3V0fSBmcm9tICcuL3V0aWxzJztcblxuLypcbiAqIHN0YXRlLnBhdGhzIGhhcyBzdHJ1Y3R1cmU6XG4gKiB7XG4gKiAgIHN0cnM6IHtbaWRdOiBwYXRofSAvLyBmb3IgcmVndWxhciBzdHJpbmcgaWRzXG4gKiAgIG9ianM6IHtba2V5U3RyXTogW3t2YWx1ZXMsIHBhdGh9XX0gLy8gZm9yIHdpbGRjYXJkIGlkc1xuICogfVxuICoga2V5U3RyOiBzb3J0ZWQga2V5cyBvZiB0aGUgaWQsIGpvaW5lZCB3aXRoICcsJyBpbnRvIG9uZSBzdHJpbmdcbiAqIHZhbHVlczogYXJyYXkgb2YgdmFsdWVzIGluIHRoZSBpZCwgaW4gb3JkZXIgb2Yga2V5c1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUGF0aHMoc3ViVHJlZSwgc3RhcnRpbmdQYXRoLCBvbGRQYXRocywgZXZlbnRzKSB7XG4gICAgY29uc3Qge3N0cnM6IG9sZFN0cnMsIG9ianM6IG9sZE9ianN9ID0gb2xkUGF0aHMgfHwge3N0cnM6IHt9LCBvYmpzOiB7fX07XG5cbiAgICBjb25zdCBkaWZmSGVhZCA9IHBhdGggPT4gc3RhcnRpbmdQYXRoLnNvbWUoKHYsIGkpID0+IHBhdGhbaV0gIT09IHYpO1xuXG4gICAgY29uc3Qgc3BMZW4gPSBzdGFydGluZ1BhdGgubGVuZ3RoO1xuICAgIC8vIGlmIHdlJ3JlIHVwZGF0aW5nIGEgc3VidHJlZSwgY2xlYXIgb3V0IGFsbCBvZiB0aGUgZXhpc3RpbmcgaXRlbXNcbiAgICBjb25zdCBzdHJzID0gc3BMZW4gPyBmaWx0ZXIoZGlmZkhlYWQsIG9sZFN0cnMpIDoge307XG4gICAgY29uc3Qgb2JqcyA9IHt9O1xuICAgIGlmIChzcExlbikge1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgob2xkVmFsUGF0aHMsIG9sZEtleXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHMgPSBmaWx0ZXIoKHtwYXRofSkgPT4gZGlmZkhlYWQocGF0aCksIG9sZFZhbFBhdGhzKTtcbiAgICAgICAgICAgIGlmIChuZXdWYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG9ianNbb2xkS2V5c10gPSBuZXdWYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvbGRPYmpzKTtcbiAgICB9XG5cbiAgICBjcmF3bExheW91dChzdWJUcmVlLCAoY2hpbGQsIGl0ZW1wYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGNoaWxkKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IChvYmpzW2tleVN0cl0gPSBvYmpzW2tleVN0cl0gfHwgW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZGllID0gb2xkT2Jqc1trZXlTdHJdIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7dmFsdWVzLCBwYXRoOiBjb25jYXQoc3RhcnRpbmdQYXRoLCBpdGVtcGF0aCl9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZihpdGVtLCBvbGRpZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ianNba2V5U3RyXSA9IGluc2VydChpbmRleCwgaXRlbSwgcGF0aHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3Ryc1tpZF0gPSBjb25jYXQoc3RhcnRpbmdQYXRoLCBpdGVtcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdlIGluY2x1ZGUgYW4gZXZlbnQgZW1pdHRlciBoZXJlIGJlY2F1c2UgaXQgd2lsbCBiZSB1c2VkIGFsb25nIHdpdGhcbiAgICAvLyBwYXRocyB0byBkZXRlcm1pbmUgd2hlbiB0aGUgYXBwIGlzIHJlYWR5IGZvciBjYWxsYmFja3MuXG4gICAgcmV0dXJuIHtzdHJzLCBvYmpzLCBldmVudHM6IGV2ZW50cyB8fCBvbGRQYXRocy5ldmVudHN9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aChwYXRocywgaWQpIHtcbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGtleVBhdGhzID0gcGF0aHMub2Jqc1trZXlTdHJdO1xuICAgICAgICBpZiAoIWtleVBhdGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICBjb25zdCBwYXRoT2JqID0gZmluZChwcm9wRXEodmFsdWVzLCAndmFsdWVzJyksIGtleVBhdGhzKTtcbiAgICAgICAgcmV0dXJuIHBhdGhPYmogJiYgcGF0aE9iai5wYXRoO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHMuc3Ryc1tpZF07XG59XG4iLCJpbXBvcnQgeyBrZXlzLCBlcXVhbHMsIGRpc3NvYywgdG9QYWlycyB9IGZyb20gJ3JhbWRhJztcbi8qKlxuICogRGVzZXJpYWxpemUgcGF0dGVybiBtYXRjaGluZyBpZHMgdGhhdCBjb21lIGluIG9uZSBvZiB0aGUgZm9ybTpcbiAqIC0gJ3tcInR5cGVcIjpcImNvbXBvbmVudFwiLFwiaW5kZXhcIjpbXCJNQVRDSFwiXX0uY2hpbGRyZW4nXG4gKiAtICd7XCJ0eXBlXCI6XCJjb21wb25lbnRcIixcImluZGV4XCI6W1wiTUFUQ0hcIl19J1xuICpcbiAqIEBwYXJhbSBpZCBUaGUgcmF3IG9iamVjdCBhcyBhIHN0cmluZyBpZC5cbiAqIEByZXR1cm5zIFRoZSBpZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBNQ0lkKGlkKSB7XG4gICAgbGV0IGNvbXBvbmVudElkLCBwcm9wTmFtZTtcbiAgICBjb25zdCBpbmRleCA9IGlkLmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGluZGV4ICsgMiA8IGlkLmxlbmd0aCkge1xuICAgICAgICBwcm9wTmFtZSA9IGlkLnN1YnN0cmluZyhpbmRleCArIDIpO1xuICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UoaWQuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBKU09OLnBhcnNlKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIFtjb21wb25lbnRJZCwgcHJvcE5hbWVdO1xufVxuLyoqXG4gKiBHZXQgYWxsIHRoZSBhc3NvY2lhdGVkIGlkcyBmb3IgYW4gaWQuXG4gKlxuICogQHBhcmFtIGlkIElkIHRvIGdldCBhbGwgdGhlIHBtYyBpZHMgZnJvbS5cbiAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBvZiB0aGUgc3RvcmUuXG4gKiBAcGFyYW0gdHJpZ2dlcktleSBLZXkgdG8gcmVtb3ZlIGZyb20gdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUE1DSWRzKGlkLCBzdGF0ZSwgdHJpZ2dlcktleSkge1xuICAgIGNvbnN0IGtleXNPZklkcyA9IGtleXMoaWQpO1xuICAgIGNvbnN0IGlkS2V5ID0ga2V5c09mSWRzLmpvaW4oJywnKTtcbiAgICByZXR1cm4gc3RhdGUucGF0aHMub2Jqc1tpZEtleV1cbiAgICAgICAgLm1hcCgob2JqKSA9PiBrZXlzT2ZJZHMucmVkdWNlKChhY2MsIGtleSwgaSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IG9iai52YWx1ZXNbaV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pKVxuICAgICAgICAuZmlsdGVyKChvYmopID0+IGVxdWFscyhkaXNzb2ModHJpZ2dlcktleSwgb2JqKSwgZGlzc29jKHRyaWdnZXJLZXksIGlkKSkpO1xufVxuLyoqXG4gKiBSZXBsYWNlIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlkcyB3aXRoIHRoZSBhY3R1YWwgdHJpZ2dlciB2YWx1ZVxuICogZm9yIE1BVENILCBhbGwgdGhlIGlkcyBmb3IgQUxMIGFuZCBzbWFsbGVyIHRoYW4gdGhlIHRyaWdnZXIgdmFsdWVcbiAqIGZvciBBTExTTUFMTEVSLlxuICpcbiAqIEBwYXJhbSBpZCBUaGUgcGFyc2VkIGlkIGluIGRpY3Rpb25hcnkgZm9ybWF0LlxuICogQHBhcmFtIGNiIE9yaWdpbmFsIGNhbGxiYWNrIGluZm8uXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIGRlcGVuZGVuY3kgaW4gY2FzZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoYW5nZWQgaWQuXG4gKiBAcGFyYW0gZ2V0U3RhdGUgRnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgcmVkdXggc3RvcmUuXG4gKiBAcmV0dXJucyBMaXN0IG9mIHJlcGxhY2VkIGlkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQTUMoaWQsIGNiLCBpbmRleCwgZ2V0U3RhdGUpIHtcbiAgICBsZXQgZXh0cmFzID0gW107XG4gICAgY29uc3QgcmVwbGFjZWQgPSB7fTtcbiAgICB0b1BhaXJzKGlkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGV4dHJhcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEFsbCBkb25lLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclZhbHVlID0gKGNiLnBhcnNlZENoYW5nZWRQcm9wc0lkc1tpbmRleF0gfHxcbiAgICAgICAgICAgICAgICBjYi5wYXJzZWRDaGFuZ2VkUHJvcHNJZHNbMF0pW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJ01BVENIJykpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlZFtrZXldID0gdHJpZ2dlclZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJ0FMTCcpKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFzID0gZ2V0QWxsUE1DSWRzKGlkLCBnZXRTdGF0ZSgpLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJ0FMTFNNQUxMRVInKSkge1xuICAgICAgICAgICAgICAgIGV4dHJhcyA9IGdldEFsbFBNQ0lkcyhpZCwgZ2V0U3RhdGUoKSwga2V5KS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPCB0cmlnZ2VyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVwbGFjZWRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGV4dHJhcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGV4dHJhcztcbiAgICB9XG4gICAgcmV0dXJuIFtyZXBsYWNlZF07XG59XG4iLCJpbXBvcnQgeyBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHNldEdyYXBocyB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4vYXBpJztcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0RGVwZW5kZW5jaWVzKCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0R3JhcGhzKHsgLi4uZ3JhcGhzLCByZXNldDogdHJ1ZSB9KSk7XG4gICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX2Rhc2gtZGVwZW5kZW5jaWVzJywgJ0dFVCcsICdkZXBlbmRlbmNpZXNSZXF1ZXN0JykpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgICBhcHBlbmQsXG4gICAgY29uY2F0LFxuICAgIGhhcyxcbiAgICBwYXRoLFxuICAgIHBhdGhPcixcbiAgICB0eXBlLFxuICAgIGZpbmRJbmRleCxcbiAgICBpbmNsdWRlcyxcbiAgICBzbGljZVxufSBmcm9tICdyYW1kYSc7XG5cbi8qXG4gKiByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXggaXMgdGhlIG5ldyBjb25maWcgcGFyYW1ldGVyIGludHJvZHVjZWQgaW5cbiAqIGRhc2g9PTAuMTguMC4gVGhlIHByZXZpb3VzIHZlcnNpb25zIGp1c3QgaGFkIHVybF9iYXNlX3BhdGhuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCYXNlKGNvbmZpZykge1xuICAgIGNvbnN0IGhhc1VybEJhc2UgPSBoYXMoJ3VybF9iYXNlX3BhdGhuYW1lJywgY29uZmlnKTtcbiAgICBjb25zdCBoYXNSZXFQcmVmaXggPSBoYXMoJ3JlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeCcsIGNvbmZpZyk7XG4gICAgaWYgKHR5cGUoY29uZmlnKSAhPT0gJ09iamVjdCcgfHwgKCFoYXNVcmxCYXNlICYmICFoYXNSZXFQcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFRyeWluZyB0byBtYWtlIGFuIEFQSSByZXF1ZXN0IGJ1dCBuZWl0aGVyXG4gICAgICAgICAgICBcInVybF9iYXNlX3BhdGhuYW1lXCIgbm9yIFwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XCJcbiAgICAgICAgICAgIGlzIGluIFxcYGNvbmZpZ1xcYC4gXFxgY29uZmlnXFxgIGlzOiBgLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGhhc1JlcVByZWZpeFxuICAgICAgICA/IGNvbmZpZy5yZXF1ZXN0c19wYXRobmFtZV9wcmVmaXhcbiAgICAgICAgOiBjb25maWcudXJsX2Jhc2VfcGF0aG5hbWU7XG5cbiAgICByZXR1cm4gYmFzZS5jaGFyQXQoYmFzZS5sZW5ndGggLSAxKSA9PT0gJy8nID8gYmFzZSA6IGJhc2UgKyAnLyc7XG59XG5cbmNvbnN0IHByb3BzQ2hpbGRyZW4gPSBbJ3Byb3BzJywgJ2NoaWxkcmVuJ107XG5cbi8vIGNyYXdsIGEgbGF5b3V0IG9iamVjdCBvciBjaGlsZHJlbiBhcnJheSwgYXBwbHkgYSBmdW5jdGlvbiBvbiBldmVyeSBvYmplY3RcbmV4cG9ydCBjb25zdCBjcmF3bExheW91dCA9IChcbiAgICBvYmplY3QsXG4gICAgZnVuYyxcbiAgICBjdXJyZW50UGF0aCA9IFtdLFxuICAgIGV4dHJhUGF0aCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAvLyBjaGlsZHJlbiBhcnJheVxuICAgICAgICBvYmplY3QuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpPZiA9IGZpbmRJbmRleChwID0+IGluY2x1ZGVzKCd7fScsIHApLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChvYmpPZiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBzbGljZSgwLCBvYmpPZiwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFjayA9IHNsaWNlKG9iak9mLCBleHRyYVBhdGgubGVuZ3RoLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGZyb250LCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGZyb250KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnJlcGxhY2UoJ3t9JywgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFBhdGggPSBjb25jYXQoW2ldLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPYmogPSBwYXRoKGJhY2tQYXRoLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hpbGRPYmpba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChjdXJyZW50UGF0aCwgY2hpbGRQYXRoLmNvbmNhdChba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChleHRyYVBhdGgsIGNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChjaGlsZCwgZnVuYywgYXBwZW5kKGksIGN1cnJlbnRQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShvYmplY3QpID09PSAnT2JqZWN0Jykge1xuICAgICAgICBmdW5jKG9iamVjdCwgY3VycmVudFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChwcm9wc0NoaWxkcmVuLCBvYmplY3QpO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIHByb3BzQ2hpbGRyZW4pO1xuICAgICAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGRyZW4sIGZ1bmMsIG5ld1BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW29iamVjdC5uYW1lc3BhY2UsIG9iamVjdC50eXBlXSxcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgY2hpbGRyZW5Qcm9wcy5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtmcm9udFBhdGgsIGJhY2tQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IGNvbmNhdChbJ3Byb3BzJ10sIGZyb250UGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIGZyb250KTtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChwYXRoKGZyb250LCBvYmplY3QpLCBmdW5jLCBiYXNlUGF0aCwgYmFja1BhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250UGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQYXRoID0gb3BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGN1clBhdGguaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goY3VyUGF0aC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRQYXRoXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9WYWx1ZSA9IHBhdGgoWydwcm9wcycsIC4uLmZyb250UGF0aF0sIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvVmFsdWVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChiYWNrUGF0aCwgdmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChuZXdQYXRoLCBba2V5LCAuLi5iYWNrUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQodmFsdWUsIGZ1bmMsIFsuLi5uZXdQYXRoLCBrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChbJ3Byb3BzJywgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyldLCBvYmplY3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8vIFRoZXJlIGFyZSBwYWNrYWdlcyBmb3IgdGhpcyBidXQgaXQncyBzaW1wbGUgZW5vdWdoLCBJIGp1c3Rcbi8vIGFkYXB0ZWQgaXQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9tdWRnZS81ODMwMzgyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZXYgPSB7fTtcbiAgICB9XG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9ICh0aGlzLl9ldltldmVudF0gPSB0aGlzLl9ldltldmVudF0gfHwgW10pO1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldltldmVudF07XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV2ZW50cy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuX2V2W2V2ZW50XTtcbiAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKlxuICogQ29waWVkIG91dCBvZiBwcm9wLXR5cGVzIGFuZCBtb2RpZmllZCAtIGluc3BpcmVkIGJ5IGNoZWNrLXByb3AtdHlwZXMsIGJ1dFxuICogc2ltcGxpZmllZCBhbmQgdHdlYWtlZCB0byBvdXIgbmVlZHM6IHdlIGRvbid0IG5lZWQgdGhlIE5PREVfRU5WIGNoZWNrLFxuICogd2UgcmVwb3J0IGFsbCBlcnJvcnMsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBkb24ndCBuZWVkIHRoZSB0aHJvd2luZ1xuICogdmFyaWFudCBgYXNzZXJ0UHJvcFR5cGVzYC5cbiAqL1xuaW1wb3J0IFJlYWN0UHJvcFR5cGVzU2VjcmV0IGZyb20gJ3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0JztcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFueSBlcnJvciBtZXNzYWdlIHJlc3VsdGluZyBmcm9tIGNoZWNraW5nIHRoZSB0eXBlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjaGVja1Byb3BUeXBlcyhcbiAgICB0eXBlU3BlY3MsXG4gICAgdmFsdWVzLFxuICAgIGxvY2F0aW9uLFxuICAgIGNvbXBvbmVudE5hbWUsXG4gICAgZ2V0U3RhY2sgPSBudWxsXG4pIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHR5cGUgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgLidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0UHJvcFR5cGVzU2VjcmV0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnJvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YWNrID0gKGdldFN0YWNrICYmIGdldFN0YWNrKCkpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIHN0YWNrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuZnVuY3Rpb24gTG9hZGluZyhwcm9wcykge1xuICAgIGlmIChwcm9wcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1sb2FkaW5nLWNhbGxiYWNrJyAvPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbkxvYWRpbmcucHJvcFR5cGVzID0ge1xuICAgIGlzTG9hZGluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGlzTG9hZGluZzogc3RhdGUuaXNMb2FkaW5nXG59KSkoTG9hZGluZyk7XG4iLCJpbXBvcnQge1xuICAgIGNvbXBhcmF0b3IsXG4gICAgZXF1YWxzLFxuICAgIGZvckVhY2gsXG4gICAgaGFzLFxuICAgIGlzRW1wdHksXG4gICAgbHQsXG4gICAgcGF0aCxcbiAgICBwYXRoT3IsXG4gICAgc29ydFxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4uLy4uL2FjdGlvbnMvYXBpJztcblxuY2xhc3MgUmVsb2FkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKHByb3BzLmNvbmZpZy5ob3RfcmVsb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB7aW50ZXJ2YWwsIG1heF9yZXRyeX0gPSBwcm9wcy5jb25maWcuaG90X3JlbG9hZDtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGludGVydmFsSWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFja2FnZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgbWF4X3JldHJ5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXRyeSA9IDA7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCA9IHRoaXMuY2xlYXJJbnRlcnZhbC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWQ6IG51bGx9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFNhdmUgdGhlIG5vbi1sb2FkaW5nIHJlcXVlc3RzIGluIHRoZSBzdGF0ZSBpbiBvcmRlciB0byBjb21wYXJlXG4gICAgICAgICAqIGN1cnJlbnQgaGFzaGVzIHdpdGggcHJldmlvdXMgaGFzaGVzLlxuICAgICAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgd2Fzbid0IGEgXCJsb2FkaW5nXCIgc3RhdGUgZm9yIHRoZSByZXF1ZXN0cyxcbiAgICAgICAgICogdGhlbiB3ZSAgY291bGQgc2ltcGx5IGNvbXBhcmUgYHByb3BzYCB3aXRoIGBwcmV2UHJvcHNgIGluXG4gICAgICAgICAqIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRW1wdHkocHJvcHMucmVsb2FkUmVxdWVzdCkgJiZcbiAgICAgICAgICAgIHByb3BzLnJlbG9hZFJlcXVlc3Quc3RhdHVzICE9PSAnbG9hZGluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge3JlbG9hZFJlcXVlc3Q6IHByb3BzLnJlbG9hZFJlcXVlc3R9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCB7cmVsb2FkUmVxdWVzdH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICAvLyBJbiB0aGUgYmVnaW5uaW5nLCByZWxvYWRSZXF1ZXN0IHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgaWYgKCFyZWxvYWRSZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBXaGVuIHJlbG9hZFJlcXVlc3QgaXMgZmlyc3QgZGVmaW5lZCwgcHJldlN0YXRlIHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgICogZm9yIG9uZSByZW5kZXIgbG9vcC5cbiAgICAgICAgICogVGhlIGZpcnN0IHJlbG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgaW5pdGlhbC9iYXNlbGluZSBoYXNoIC1cbiAgICAgICAgICogaXQgZG9lc24ndCByZXF1aXJlIGEgcmVsb2FkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIWhhcygncmVsb2FkUmVxdWVzdCcsIHByZXZTdGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlbG9hZFJlcXVlc3Quc3RhdHVzID09PSAyMDAgJiZcbiAgICAgICAgICAgIHBhdGgoWydjb250ZW50JywgJ3JlbG9hZEhhc2gnXSwgcmVsb2FkUmVxdWVzdCkgIT09XG4gICAgICAgICAgICAgICAgcGF0aChbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdyZWxvYWRIYXNoJ10sIHByZXZTdGF0ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgQ1NTICghY29udGVudC5oYXJkKSBvciBuZXcgcGFja2FnZSBhc3NldHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuaGFyZCB8fFxuICAgICAgICAgICAgICAgICFlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgIHJlbG9hZFJlcXVlc3QuY29udGVudC5wYWNrYWdlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhPcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAhZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICBzb3J0KGNvbXBhcmF0b3IobHQpLCByZWxvYWRSZXF1ZXN0LmNvbnRlbnQucGFja2FnZXMpLFxuICAgICAgICAgICAgICAgICAgICBzb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcihsdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoT3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgaWYgaXQgd2FzIGEgY3NzIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSBvZiByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNfY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNfY3NzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9EaXNhYmxlID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG9sZCBmaWxlIGJ5IHhwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLy9saW5rW2NvbnRhaW5zKEBocmVmLCBcIiR7YS51cmx9XCIpXWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gaXQuaXRlcmF0ZU5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGlzYWJsZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBpdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT4gbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0Rpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm1vZGlmaWVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gYCR7YS51cmx9P209JHthLm1vZGlmaWVkfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsc2UgdGhlIGZpbGUgd2FzIGRlbGV0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFub3RoZXIga2luZCBvZiBmaWxlIGhlcmUgZG8gYSBoYXJkIHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghd2FzX2Nzcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3NldHMgZmlsZSBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBjb21wb25lbnQgbGliIGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQgLVxuICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGRvIGEgaGFyZCByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBjb2RlIGNoYW5nZWQgLSBjYW4gZG8gYSBzb2Z0IHJlbG9hZCBpbiBwbGFjZVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHt0eXBlOiAnUkVMT0FEJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnRlcnZhbElkICE9PSBudWxsICYmXG4gICAgICAgICAgICByZWxvYWRSZXF1ZXN0LnN0YXR1cyA9PT0gNTAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JldHJ5ID4gdGhpcy5zdGF0ZS5tYXhfcmV0cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgICAgICAgICAvLyBJbnRlZ3JhdGUgd2l0aCBkZXYgdG9vbHMgdWk/IVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgICAgICAgICAgICAgYEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQgYWZ0ZXIgZmFpbGluZyAke3RoaXMuX3JldHJ5fSB0aW1lcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGNoZWNrIHlvdXIgYXBwbGljYXRpb24gZm9yIGVycm9ycywgdGhlbiByZWZyZXNoIHRoZSBwYWdlLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmV0cnkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2gsIHJlbG9hZFJlcXVlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge2Rpc2FibGVkLCBpbnRlcnZhbH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBpZiAoIWRpc2FibGVkICYmICF0aGlzLnN0YXRlLmludGVydmFsSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgcmVxdWVzdHMgZnJvbSBwaWxpbmcgdXAgLSByZWxvYWRpbmcgY2FuIHRha2VcbiAgICAgICAgICAgICAgICAvLyBtYW55IHNlY29uZHMgKDEwLTMwKSBhbmQgdGhlIGludGVydmFsIGlzIDNzIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkUmVxdWVzdC5zdGF0dXMgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX3JlbG9hZC1oYXNoJywgJ0dFVCcsICdyZWxvYWRSZXF1ZXN0JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuZGlzYWJsZWQgJiYgdGhpcy5zdGF0ZS5pbnRlcnZhbElkKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5SZWxvYWRlci5kZWZhdWx0UHJvcHMgPSB7fTtcblxuUmVsb2FkZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICByZWxvYWRSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpbnRlcnZhbDogUHJvcFR5cGVzLm51bWJlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZyxcbiAgICAgICAgcmVsb2FkUmVxdWVzdDogc3RhdGUucmVsb2FkUmVxdWVzdFxuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShSZWxvYWRlcik7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVG9vbGJhci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7cmVkbywgdW5kb30gZnJvbSAnLi4vLi4vYWN0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgJy4vVG9vbGJhci5jc3MnO1xuXG5mdW5jdGlvbiBVbmNvbm5lY3RlZFRvb2xiYXIocHJvcHMpIHtcbiAgICBjb25zdCB7ZGlzcGF0Y2gsIGhpc3Rvcnl9ID0gcHJvcHM7XG5cbiAgICBjb25zdCB1bmRvTGluayA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT0ndW5kb0xpbmsnXG4gICAgICAgICAgICBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1saW5rJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZGlzcGF0Y2godW5kbyl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1pY29uLXVuZG8nPuKGujwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1sYWJlbCc+dW5kbzwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIGNvbnN0IHJlZG9MaW5rID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PSdyZWRvTGluaydcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxpbmsnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkaXNwYXRjaChyZWRvKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLWljb24tcmVkbyc+4oa7PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxhYmVsJz5yZWRvPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkbyc+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtoaXN0b3J5LnBhc3QubGVuZ3RoID4gMCA/IHVuZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7aGlzdG9yeS5mdXR1cmUubGVuZ3RoID4gMCA/IHJlZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5VbmNvbm5lY3RlZFRvb2xiYXIucHJvcFR5cGVzID0ge1xuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBUb29sYmFyID0gY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5XG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkVG9vbGJhcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xiYXI7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2Nvbm5lY3QsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgQ3l0b3NjYXBlQ29tcG9uZW50IGZyb20gJ3JlYWN0LWN5dG9zY2FwZWpzJztcbmltcG9ydCBkYWdyZSBmcm9tICdjeXRvc2NhcGUtZGFncmUnO1xuaW1wb3J0IGZjb3NlIGZyb20gJ2N5dG9zY2FwZS1mY29zZSc7XG5pbXBvcnQge0pTT05UcmVlfSBmcm9tICdyZWFjdC1qc29uLXRyZWUnO1xuaW1wb3J0IHtrZXlzLCBtZXJnZVJpZ2h0LCBvbWl0LCBwYXRoLCB2YWx1ZXN9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtnZXRQYXRofSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7b25FcnJvcn0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucyc7XG5cbmltcG9ydCAnLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyc7XG5pbXBvcnQgc3R5bGVzaGVldCBmcm9tICcuL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0JztcbmltcG9ydCB7XG4gICAgdXBkYXRlU2VsZWN0ZWROb2RlLFxuICAgIHVwZGF0ZUNoYW5nZWRQcm9wcyxcbiAgICB1cGRhdGVDYWxsYmFja1xufSBmcm9tICcuL0NhbGxiYWNrR3JhcGhFZmZlY3RzJztcblxuQ3l0b3NjYXBlLnVzZShkYWdyZSk7XG5DeXRvc2NhcGUudXNlKGZjb3NlKTtcblxuLypcbiAqIEdlbmVyYXRlcyBhbGwgdGhlIGVsZW1lbnRzIChub2RlcywgZWRnZXMpIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50cyhncmFwaHMsIHByb2ZpbGUsIGV4dHJhTGlua3MpIHtcbiAgICBjb25zdCBjb25zdW1lZCA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgY29uc3Qgc3RydWN0dXJlID0ge307XG5cbiAgICBmdW5jdGlvbiByZWNvcmROb2RlKGlkLCByYXdQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHJhd1Byb3BlcnR5LnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0eXBlb2YgaWQgPT09ICdvYmplY3QnID8gJ3dpbGRjYXJkJyA6ICdjb21wb25lbnQnO1xuXG4gICAgICAgIC8vIGRhZ3JlIGxheW91dCBoYXMgcHJvYmxlbXMgd2l0aCBlZyBgd2lkdGhgIHByb3BlcnR5IC0gc28gcHJlcGVuZCBhbiBYXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gaWRTdHI7XG4gICAgICAgIGNvbnN0IGNoaWxkSWQgPSBgJHtwYXJlbnRJZH0uWCR7cHJvcGVydHl9YDtcblxuICAgICAgICBpZiAoIWNvbnN1bWVkLmluY2x1ZGVzKHBhcmVudElkKSkge1xuICAgICAgICAgICAgY29uc3VtZWQucHVzaChwYXJlbnRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGlkU3RyLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpZFR5cGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uc3VtZWQuaW5jbHVkZXMoY2hpbGRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN1bWVkLnB1c2goY2hpbGRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjaGlsZElkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9wZXJ0eSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0ucHVzaChjaGlsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZElkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY29yZEVkZ2Uoc291cmNlLCB0YXJnZXQsIHR5cGUpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAoZ3JhcGhzLmNhbGxiYWNrcyB8fCBbXSkuZm9yRWFjaCgoY2FsbGJhY2ssIGkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBgX19kYXNoX2NhbGxiYWNrX18uJHtjYWxsYmFjay5vdXRwdXR9YDtcbiAgICAgICAgY29uc3QgY2JQcm9maWxlID0gcHJvZmlsZS5jYWxsYmFja3NbY2FsbGJhY2sub3V0cHV0XSB8fCB7fTtcbiAgICAgICAgY29uc3QgY291bnQgPSBjYlByb2ZpbGUuY291bnQgfHwgMDtcbiAgICAgICAgY29uc3QgdGltZSA9IGNiUHJvZmlsZS50b3RhbCB8fCAwO1xuXG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGlkOiBjYixcbiAgICAgICAgICAgICAgICBsYWJlbDogYGNhbGxiYWNrLiR7aX1gLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjYWxsYmFjaycsXG4gICAgICAgICAgICAgICAgbW9kZTogY2FsbGJhY2suY2xpZW50c2lkZV9mdW5jdGlvbiA/ICdjbGllbnQnIDogJ3NlcnZlcicsXG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgICAgICAgIHRpbWU6IGNvdW50ID4gMCA/IE1hdGgucm91bmQodGltZSAvIGNvdW50KSA6IDAsXG4gICAgICAgICAgICAgICAgbG9hZGluZ1NldDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBlcnJvclNldDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5vdXRwdXRzLm1hcCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2UoY2IsIG5vZGVJZCwgJ291dHB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5pbnB1dHMubWFwKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShub2RlSWQsIGNiLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2suc3RhdGUubWFwKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShub2RlSWQsIGNiLCAnc3RhdGUnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBwdWxsIHRvZ2V0aGVyIHByb3BzIGluIHRoZSBzYW1lIGNvbXBvbmVudFxuICAgIGlmIChleHRyYUxpbmtzKSB7XG4gICAgICAgIHZhbHVlcyhzdHJ1Y3R1cmUpLmZvckVhY2goY2hpbGRJZHMgPT4ge1xuICAgICAgICAgICAgY2hpbGRJZHMuZm9yRWFjaChjaGlsZEZyb20gPT4ge1xuICAgICAgICAgICAgICAgIGNoaWxkSWRzLmZvckVhY2goY2hpbGRUbyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZyb20gIT09IGNoaWxkVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZEVkZ2UoY2hpbGRGcm9tLCBjaGlsZFRvLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVN0YXR1cyhzdGF0dXMpIHtcbiAgICBpZiAoa2V5cyhzdGF0dXMpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gc3RhdHVzLmxhdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbk91dHB1dHMocmVzKSB7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHt9O1xuICAgIGZvciAoY29uc3QgaWRTdHIgaW4gcmVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiByZXNbaWRTdHJdKSB7XG4gICAgICAgICAgICBvdXRwdXRzW2lkU3RyICsgJy4nICsgcHJvcF0gPSByZXNbaWRTdHJdW3Byb3BdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuSW5wdXRzKGluQXJyYXksIGZpbmFsKSB7XG4gICAgKGluQXJyYXkgfHwgW10pLmZvckVhY2goaW5JdGVtID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5JdGVtKSkge1xuICAgICAgICAgICAgZmxhdHRlbklucHV0cyhpbkl0ZW0sIGZpbmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgcHJvcGVydHksIHZhbHVlfSA9IGluSXRlbTtcbiAgICAgICAgICAgIGZpbmFsW3N0cmluZ2lmeUlkKGlkKSArICcuJyArIHByb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbmFsO1xufVxuXG5mdW5jdGlvbiBjbGVhbk91dHB1dElkKG91dHB1dElkKSB7XG4gICAgcmV0dXJuIG91dHB1dElkXG4gICAgICAgIC5yZXBsYWNlKC8oXlxcLlxcLnxcXC5cXC4kKS9nLCAnJylcbiAgICAgICAgLnNwbGl0KCcuLi4nKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKGFnZywgbmV4dCkgPT5cbiAgICAgICAgICAgICAgICBhZ2cuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICBuZXh0LnJlcGxhY2UoLyguKlxcLi4qKShALispJC8sIChhLCBiKSA9PiBiICsgJyAoRHVwbGljYXRlKScpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJy4uLicpO1xufVxuXG4vLyBsZW4oJ19fZGFzaF9jYWxsYmFja19fLicpXG5jb25zdCBjYlByZWZpeExlbiA9IDE4O1xuXG5jb25zdCBkYWdyZUxheW91dCA9IHtcbiAgICBuYW1lOiAnZGFncmUnLFxuICAgIHBhZGRpbmc6IDEwLFxuICAgIHJhbmtlcjogJ3RpZ2h0LXRyZWUnXG59O1xuXG5jb25zdCBmb3JjZUxheW91dCA9IHtuYW1lOiAnZmNvc2UnLCBwYWRkaW5nOiAxMCwgYW5pbWF0ZTogZmFsc2V9O1xuXG5jb25zdCBsYXlvdXRzID0ge1xuICAgICd0b3AtZG93bic6IHsuLi5kYWdyZUxheW91dCwgc3BhY2luZ0ZhY3RvcjogMC44fSxcbiAgICAnbGVmdC1yaWdodCc6IHsuLi5kYWdyZUxheW91dCwgbm9kZVNlcDogMCwgcmFua1NlcDogODAsIHJhbmtEaXI6ICdMUid9LFxuICAgIGZvcmNlOiBmb3JjZUxheW91dCxcbiAgICAnZm9yY2UtbG9vc2UnOiBmb3JjZUxheW91dFxufTtcblxuZnVuY3Rpb24gQ2FsbGJhY2tHcmFwaCgpIHtcbiAgICAvLyBHcmFiIGl0ZW1zIGZyb20gdGhlIHJlZHV4IHN0b3JlLlxuICAgIGNvbnN0IHBhdGhzID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUucGF0aHMpO1xuICAgIGNvbnN0IGxheW91dCA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmxheW91dCk7XG4gICAgY29uc3QgZ3JhcGhzID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuZ3JhcGhzKTtcbiAgICBjb25zdCBwcm9maWxlID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUucHJvZmlsZSk7XG4gICAgY29uc3QgY2hhbmdlZCA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmNoYW5nZWQpO1xuICAgIGNvbnN0IGxpZmVjeWNsZVN0YXRlID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuYXBwTGlmZWN5Y2xlKTtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY3l0b3NjYXBlIHJlZmVyZW5jZSBhbmQgdXNlciBzZWxlY3RlZCBpdGVtcy5cbiAgICBjb25zdCBbc2VsZWN0ZWQsIHNldFNlbGVjdGVkXSA9IHVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IFtjeXRvc2NhcGUsIHNldEN5dG9zY2FwZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICAgIGNvbnN0IHtncmFwaExheW91dH0gPSBwcm9maWxlO1xuICAgIGNvbnN0IGNob3NlblR5cGUgPSBncmFwaExheW91dD8uX2Nob3NlblR5cGU7XG4gICAgY29uc3QgbGF5b3V0U2VsZWN0b3IgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW2xheW91dFR5cGUsIHNldExheW91dFR5cGVdID0gdXNlU3RhdGUoY2hvc2VuVHlwZSB8fCAndG9wLWRvd24nKTtcblxuICAgIC8vIEdlbmVyYXRlIGFuZCBtZW1vaXplIHRoZSBlbGVtZW50cy5cbiAgICBjb25zdCBlbGVtZW50cyA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+IGdlbmVyYXRlRWxlbWVudHMoZ3JhcGhzLCBwcm9maWxlLCBsYXlvdXRUeXBlID09PSAnZm9yY2UnKSxcbiAgICAgICAgW2dyYXBocywgbGF5b3V0VHlwZV1cbiAgICApO1xuXG4gICAgLy8gQ3VzdG9tIGhvb2sgdG8gbWFrZSBzdXJlIGN5dG9zY2FwZSBpcyBsb2FkZWQuXG4gICAgY29uc3QgdXNlQ3l0b3NjYXBlRWZmZWN0ID0gKGVmZmVjdCwgY29uZGl0aW9uKSA9PiB7XG4gICAgICAgIHVzZUVmZmVjdChcbiAgICAgICAgICAgICgpID0+IChjeXRvc2NhcGUgJiYgZWZmZWN0KGN5dG9zY2FwZSkpIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmRpdGlvblxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnQoaWQpIHtcbiAgICAgICAgLy8gZm9yIG5vdyBpZ25vcmUgcGF0dGVybi1tYXRjaGluZyBJRHNcbiAgICAgICAgLy8gdG8gZG8gYmV0dGVyIHdlIG1heSBuZWVkIHRvIHN0b3JlIHRoZSAqYWN0dWFsKiBJRHMgdXNlZCBmb3IgZWFjaFxuICAgICAgICAvLyBjYWxsYmFjayBpbnZvY2F0aW9uLCBzaW5jZSB0aGV5IG5lZWQgbm90IG1hdGNoIHdoYXQncyBvbiB0aGUgcGFnZSBub3cuXG4gICAgICAgIGlmIChpZC5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgaGFzUGF0dGVybnMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIHJldHVybiBpZFBhdGggPyBwYXRoKGlkUGF0aCwgbGF5b3V0KSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQcm9wVmFsdWUoZGF0YSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRDb21wb25lbnQoZGF0YS5wYXJlbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LnByb3BzW2RhdGEubGFiZWxdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFByZXNldExheW91dCh7Y3l9KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBjeS5ub2RlcygpLmVhY2gobiA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnNbbi5pZCgpXSA9IG4ucG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFjayEgV2UncmUgbXV0YXRpbmcgdGhlIHJlZHV4IHN0b3JlIGRpcmVjdGx5IGhlcmUsIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIGFuIGFjdGlvbiwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoaXMgdG8gdHJpZ2dlciBhXG4gICAgICAgIC8vIHJlcmVuZGVyLCB3ZSBqdXN0IHdhbnQgdGhlIGxheW91dCB0byBwZXJzaXN0IHdoZW4gdGhlIGNhbGxiYWNrIGdyYXBoXG4gICAgICAgIC8vIGlzIHJlcmVuZGVyZWQgLSBlaXRoZXIgYmVjYXVzZSB0aGVyZSdzIG5ldyBwcm9maWxlIGluZm9ybWF0aW9uIHRvXG4gICAgICAgIC8vIGRpc3BsYXkgb3IgYmVjYXVzZSB0aGUgZ3JhcGggd2FzIGNsb3NlZCBhbmQgcmVvcGVuZWQuIFRoZSBsYXR0ZXIgaXNcbiAgICAgICAgLy8gdGhlIHJlYXNvbiB3ZSdyZSBub3QgdXNpbmcgY29tcG9uZW50IHN0YXRlIHRvIHN0b3JlIHRoZSBsYXlvdXQuXG4gICAgICAgIHByb2ZpbGUuZ3JhcGhMYXlvdXQgPSB7XG4gICAgICAgICAgICBuYW1lOiAncHJlc2V0JyxcbiAgICAgICAgICAgIGZpdDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvbnMsXG4gICAgICAgICAgICB6b29tOiBjeS56b29tKCksXG4gICAgICAgICAgICBwYW46IGN5LnBhbigpLFxuICAgICAgICAgICAgX2Nob3NlblR5cGU6IGxheW91dFNlbGVjdG9yLmN1cnJlbnQ/LnZhbHVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQWRkcyBjYWxsYmFja3Mgb25jZSBjeWN0b3NjYXBlIGlzIGluaXRpYWxpemVkLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4ge1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd0YXAnLCAnbm9kZScsIGUgPT4gc2V0U2VsZWN0ZWQoZS50YXJnZXQpKTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigndGFwJywgZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBjeSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbignem9vbScsIHNldFByZXNldExheW91dCk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3BhbicsIHNldFByZXNldExheW91dCk7XG4gICAgICAgICAgICBjeXRvc2NhcGUubm9kZXMoKS5vbigncG9zaXRpb24nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICB9LFxuICAgICAgICBbY3l0b3NjYXBlXVxuICAgICk7XG5cbiAgICAvLyBTZXQgbm9kZSBjbGFzc2VzIG9uIHNlbGVjdGVkLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4gc2VsZWN0ZWQgJiYgdXBkYXRlU2VsZWN0ZWROb2RlKGN5LCBzZWxlY3RlZC5kYXRhKCkuaWQpLFxuICAgICAgICBbc2VsZWN0ZWRdXG4gICAgKTtcblxuICAgIC8vIEZsYXNoIGNsYXNzZXMgd2hlbiBwcm9wcyBjaGFuZ2UuIFVzZXMgY2hhbmdlZCBhcyBhIHRyaWdnZXIuIEFsc29cbiAgICAvLyBmbGFzaCBhbGwgaW5wdXQgZWRnZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGlzIG5vZGUgYW5kIGhpZ2hsaWdodFxuICAgIC8vIHRoZSBzdWJ0cmVlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIG5vZGUuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiBjaGFuZ2VkICYmIHVwZGF0ZUNoYW5nZWRQcm9wcyhjeSwgY2hhbmdlZC5pZCwgY2hhbmdlZC5wcm9wcyksXG4gICAgICAgIFtjaGFuZ2VkXVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgY2FsbGJhY2tzIGZyb20gcHJvZmlsaW5nIGluZm9ybWF0aW9uLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT5cbiAgICAgICAgICAgIHByb2ZpbGUudXBkYXRlZC5mb3JFYWNoKGNiID0+XG4gICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soY3ksIGNiLCBwcm9maWxlLmNhbGxiYWNrc1tjYl0pXG4gICAgICAgICAgICApLFxuICAgICAgICBbcHJvZmlsZS51cGRhdGVkXVxuICAgICk7XG5cbiAgICBpZiAobGlmZWN5Y2xlU3RhdGUgIT09ICdIWURSQVRFRCcpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdG9vIGVhcmx5IC0gbW9zdCBsaWtlbHkgZHVyaW5nIGhvdCByZWxvYWRpbmcgLSB0aGVuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gYmFpbCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBmdWxsIHN0YXRlIHRvIGJlIGF2YWlsYWJsZVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+V2FpdGluZyBmb3IgYXBwIHRvIGJlIHJlYWR5Li4uPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogTW92ZSB0byBhIG5ldyBjb21wb25lbnQ/XG4gICAgLy8gR2VuZXJhdGUgdGhlIGVsZW1lbnQgaW50cm9zcGVjdGlvbiBkYXRhLlxuICAgIGxldCBlbGVtZW50TmFtZSA9ICcnO1xuICAgIGxldCBlbGVtZW50SW5mbyA9IHt9O1xuICAgIGxldCBoYXNQYXR0ZXJucyA9IGZhbHNlO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzZWxlY3RlZC5kYXRhKCk7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN0ID0gb21pdChbJ2lkJ10sIGdldENvbXBvbmVudChkYXRhLmlkKT8ucHJvcHMpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvID0gcmVzdDtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3Byb3BlcnR5Jzoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gZGF0YS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm9bZGF0YS5sYWJlbF0gPSBnZXRQcm9wVmFsdWUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGxiYWNrXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm8udHlwZSA9IGRhdGEubW9kZTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB1aWQgYW5kIHNldCBwcm9maWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrT3V0cHV0SWQgPSBkYXRhLmlkLnNsaWNlKGNiUHJlZml4TGVuKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGNsZWFuT3V0cHV0SWQoY2FsbGJhY2tPdXRwdXRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2JQcm9maWxlID0gcHJvZmlsZS5jYWxsYmFja3NbY2FsbGJhY2tPdXRwdXRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGNiUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICB9ID0gY2JQcm9maWxlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2ZyA9IHYgPT4gTWF0aC5yb3VuZCh2IC8gKGNvdW50IHx8IDEpKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snY2FsbCBjb3VudCddID0gY291bnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnN0YXR1cyA9IHJlZHVjZVN0YXR1cyhzdGF0dXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZyA9IChlbGVtZW50SW5mb1sndGltZSAoYXZnIG1pbGxpc2Vjb25kcyknXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiBhdmcodG90YWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZTogYXZnKGNvbXB1dGUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RlID09PSAnc2VydmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLm5ldHdvcmsgPSBhdmcobmV0d29yay50aW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2RhdGEgdHJhbnNmZXIgKGF2ZyBieXRlcyknXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZDogYXZnKG5ldHdvcmsuZG93bmxvYWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZDogYXZnKG5ldHdvcmsudXBsb2FkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ1sndXNlcjogJyArIGtleV0gPSBhdmcocmVzb3VyY2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8ub3V0cHV0cyA9IGZsYXR0ZW5PdXRwdXRzKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLmlucHV0cyA9IGZsYXR0ZW5JbnB1dHMoaW5wdXRzLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnN0YXRlID0gZmxhdHRlbklucHV0cyhzdGF0ZSwge30pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydjYWxsIGNvdW50J10gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN5TGF5b3V0ID1cbiAgICAgICAgY2hvc2VuVHlwZSA9PT0gbGF5b3V0VHlwZVxuICAgICAgICAgICAgPyBncmFwaExheW91dFxuICAgICAgICAgICAgOiBtZXJnZVJpZ2h0KGxheW91dHNbbGF5b3V0VHlwZV0sIHtyZWFkeTogc2V0UHJlc2V0TGF5b3V0fSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgc3R5bGU9e3t3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJ319XG4gICAgICAgICAgICAgICAgY3k9e3NldEN5dG9zY2FwZX1cbiAgICAgICAgICAgICAgICBlbGVtZW50cz17ZWxlbWVudHN9XG4gICAgICAgICAgICAgICAgbGF5b3V0PXtjeUxheW91dH1cbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtzZWxlY3RlZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWluZm8nPlxuICAgICAgICAgICAgICAgICAgICB7aGFzUGF0dGVybnMgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gaXNuJ3Qgc3VwcG9ydGVkIGZvciBwYXR0ZXJuLW1hdGNoaW5nIElEcyBhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8SlNPTlRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2VsZW1lbnRJbmZvfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWU9J3N1bW1lcmZydWl0J1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZW5kZXJlcj17X2tleXMgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa2V5cy5sZW5ndGggPT09IDEgPyBlbGVtZW50TmFtZSA6IF9rZXlzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtU3RyaW5nPXsodHlwZSwgZGF0YSwgaXRlbVR5cGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57aXRlbVR5cGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEV4cGFuZE5vZGU9eyhrZXlOYW1lLCBkYXRhLCBsZXZlbCkgPT4gbGV2ZWwgPCAxfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbGF5b3V0U2VsZWN0b3InXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0TGF5b3V0VHlwZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2xheW91dFR5cGV9XG4gICAgICAgICAgICAgICAgcmVmPXtsYXlvdXRTZWxlY3Rvcn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7a2V5cyhsYXlvdXRzKS5tYXAoayA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9e2t9IGtleT17a30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7a31cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuQ2FsbGJhY2tHcmFwaC5wcm9wVHlwZXMgPSB7fTtcblxuY2xhc3MgVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7aGFzRXJyb3I6IGZhbHNlfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKF8pIHtcbiAgICAgICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgbXlJRDogdGhpcy5zdGF0ZS5teUlELFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmhhc0Vycm9yID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+T29wcyEgVGhlIGNhbGxiYWNrIGdyYXBoIHRocmV3IGFuIGVycm9yLjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PkNoZWNrIHRoZSBlcnJvciBsaXN0IGZvciBkZXRhaWxzLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgICA8Q2FsbGJhY2tHcmFwaCAvPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IENhbGxiYWNrR3JhcGhDb250YWluZXIgPSBjb25uZWN0KG51bGwsIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KSkoXG4gICAgVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyXG4pO1xuXG5leHBvcnQge0NhbGxiYWNrR3JhcGhDb250YWluZXJ9O1xuIiwiY29uc3Qgc3R5bGVzaGVldCA9IFtcbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnKicsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnZm9udC1zaXplJzogMTIsXG4gICAgICAgICAgICAnZm9udC1mYW1pbHknOiAnVmVyZGFuYSwgc2Fucy1zZXJpZidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctc2hhcGUnOiAndHJpYW5nbGUnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1maWxsJzogJ2ZpbGxlZCcsXG4gICAgICAgICAgICAnYXJyb3ctc2NhbGUnOiAxLFxuICAgICAgICAgICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcicsXG4gICAgICAgICAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ2xpbmUtY29sb3IsIHRhcmdldC1hcnJvdy1jb2xvcicsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwiaGlkZGVuXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJvdXRwdXRcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnIzAwODBEMCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMDgwRDAnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cInN0YXRlXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLXN0eWxlJzogJ2Rhc2hlZCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMzMzMzMnLFxuICAgICAgICAgICAgcGFkZGluZzogNixcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMixcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdib3JkZXItb3BhY2l0eScsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDM1LFxuICAgICAgICAgICAgaGVpZ2h0OiAyNSxcbiAgICAgICAgICAgIHNoYXBlOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGxhYmVsOiBlID0+IGAke2UuZGF0YSgpLmNvdW50fVxcbiR7ZS5kYXRhKCkudGltZX0gbXNgLFxuICAgICAgICAgICAgJ3RleHQtd3JhcCc6ICd3cmFwJyxcbiAgICAgICAgICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnY2VudGVyJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwiY2xpZW50XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRjBEQjRGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwic2VydmVyXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMDBDQzk2J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjb21wb25lbnRcIl0sIG5vZGVbdHlwZT1cIndpbGRjYXJkXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgLy8gaGVpZ2h0OiAnbGFiZWwnLFxuICAgICAgICAgICAgc2hhcGU6ICdyZWN0YW5nbGUnLFxuICAgICAgICAgICAgY29udGVudDogZSA9PiBlLmRhdGEoKS5sYWJlbC5yZXBsYWNlKC9cIi9nLCAnJyksXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAndG9wJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNCOUMyQ0UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cInByb3BlcnR5XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdkYXRhKGxhYmVsKScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMxMDlERkYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5zZWxlY3RlZC1ub2RlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdob3N0OiAneWVzJyxcbiAgICAgICAgICAgICdnaG9zdC1vZmZzZXQteCc6IDIsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXknOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9wYWNpdHknOiAwLjI1LFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcucHJvcC1jaGFuZ2VkLCAuY2FsbGJhY2stbG9hZGluZycsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAxXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5jYWxsYmFjay1lcnJvcicsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRTEzMzJFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcudHJpZ2dlcmVkJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjQ0M0M0I3J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuaW5hY3RpdmUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgb3BhY2l0eTogMC41XG4gICAgICAgIH1cbiAgICB9XG5dO1xuXG5leHBvcnQgZGVmYXVsdCBzdHlsZXNoZWV0O1xuIiwiaW1wb3J0IHtTVEFUVVMsIFNUQVRVU01BUH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5cbi8qKlxuICogZ2V0RWRnZVR5cGVzXG4gKlxuICogRmluZHMgYWxsIGVkZ2VzIGNvbm5lY3RlZCB0byBhIG5vZGUgYW5kIHNwbGl0cyB0aGVtIGJ5IHR5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBDeXRvc2NhcGUgbm9kZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVkZ2VzLCBzb3J0ZWQgYnkgdHlwZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWRnZVR5cGVzKG5vZGUpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKSxcbiAgICAgICAgc3RhdGU6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcInN0YXRlXCJdJyksXG4gICAgICAgIG91dHB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwib3V0cHV0XCJdJylcbiAgICB9O1xufVxuXG4vKipcbiAqIHVwZGF0ZVNlbGVjdGVkXG4gKlxuICogVXBkYXRlcyB0aGUgY2xhc3NlcyBvZiB0aGUgc2VsZWN0ZWQgbm9kZSBhbmQgcmVjZW50ZXJzIHRoZSB2aWV3cG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3kgLSBSZWZlcmVuY2UgdG8gdGhlIGN5dG9zY2FwZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gLSBjbGVhbnVwIGZ1bmN0aW9uLCBmb3IgdXNlRWZmZWN0IGhvb2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgaWQpIHtcbiAgICBmdW5jdGlvbiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbikge1xuICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGluY2x1ZGUgU3RhdGUgcGFyZW50cyBidXQgbm9uLXJlY3Vyc2l2ZWx5P1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdpbnB1dCcgOiAnb3V0cHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBlZGdlcy5zb3VyY2VzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKHBhcmVudHMpO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRzLmZvckVhY2gobm9kZSA9PiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbikge1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdvdXRwdXQnIDogJ2lucHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZWRnZXMudGFyZ2V0cygpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGVkZ2VzKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShjaGlsZHJlbik7XG4gICAgICAgIGlmIChub2RlLmRhdGEoKS50eXBlID09PSAncHJvcGVydHknKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKG5vZGUuYW5jZXN0b3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2gobm9kZSA9PiBkZXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcblxuICAgICAgICAvLyBIaWdobGlnaHQgdGhlIHNlbGVjdGVkIG5vZGUuXG5cbiAgICAgICAgbm9kZS5hZGRDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHN1YnRyZWUgdGhhdCB0aGUgbm9kZSBiZWxvbmdzIHRvLiBBIHN1YnRyZWUgY29udGFpbnNcbiAgICAgICAgLy8gYWxsIGFsbCBhbmNlc3RvcnMgYW5kIGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNvbm5lY3RlZCB2aWEgSW5wdXRzXG4gICAgICAgIC8vIG9yIE91dHB1dHMgKGJ1dCBub3QgU3RhdGUpLlxuXG4gICAgICAgIC8vIFdBUk5JTkc6IE5vIGN5Y2xlIGRldGVjdGlvbiFcblxuICAgICAgICBjb25zdCBzdWJ0cmVlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBzdWJ0cmVlLm1lcmdlKG5vZGUpO1xuICAgICAgICBhc2NlbmQobm9kZSwgc3VidHJlZSk7XG4gICAgICAgIGRlc2NlbmQobm9kZSwgc3VidHJlZSk7XG5cbiAgICAgICAgY29uc3Qgb3RoZXIgPSBzdWJ0cmVlLmFic29sdXRlQ29tcGxlbWVudCgpO1xuICAgICAgICBvdGhlci5hZGRDbGFzcygnaW5hY3RpdmUnKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuICAgICAgICAgICAgb3RoZXIucmVtb3ZlQ2xhc3MoJ2luYWN0aXZlJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogdXBkYXRlQ2hhbmdlZFByb3BcbiAqXG4gKiBGbGFzaGVzIHByb3BlcnR5IG5vZGVzIHRoYXQgdXBkYXRlZCBhbmQgYW55IGlucHV0cyB0aGV5IGFyZSBjb25uZWN0ZWQgdG8uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgY29tcG9uZW50IGlkIHdoaWNoIHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBUaGUgcHJvcHMgdGhhdCB1cGRhdGVkLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWRQcm9wcyhjeSwgaWQsIHByb3BzLCBmbGFzaFRpbWUgPSA1MDApIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGAke2lkfS4ke3Byb3B9YCk7XG4gICAgICAgIG5vZGUuZmxhc2hDbGFzcygncHJvcC1jaGFuZ2VkJywgZmxhc2hUaW1lKTtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJylcbiAgICAgICAgICAgIC5maWx0ZXIoJ1t0eXBlID0gXCJpbnB1dFwiXScpXG4gICAgICAgICAgICAuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiB1cGRhdGVDYWxsYmFja1xuICpcbiAqIFVwZGF0ZXMgYSBjYWxsYmFjayBub2RlIHdpdGggcHJvZmlsaW5nIGluZm9ybWF0aW9uIChjYWxsIGNvdW50LCBhdmcgdGltZSlcbiAqIGFuZCBhZGRzIG9yIHJlbW92ZXMgY2xhc3NlcyBhcyBuZWNlc3NhcnkuIENsYXNzZXMgYXJlIGFsd2F5cyBhc3NlcnQgZm9yXG4gKiBhdCBsZWFzdCBmbGFzaFRpbWUgbXMgc28gdGhhdCB0aGV5IGNhbiBiZSB2aXN1YWxseSBvYnNlcnZlZC4gV2hlbiBjYWxsYmFja3NcbiAqIHJlc29sdmUsIGFsbCBvdXRwdXQgZWRnZXMgYXJlIGZsYXNoZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIGNhbGxiYWNrIChpLmUuLCBpdCdzIG91dHB1dCBpZGVudGlmaWVyKVxuICogQHBhcmFtIHtPYmplY3R9IHByb2ZpbGUgLSBUaGUgY2FsbGJhY2sgcHJvZmlsaW5nIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGN5LCBpZCwgcHJvZmlsZSwgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2lkfWApO1xuICAgIGNvbnN0IHtjb3VudCwgdG90YWwsIHN0YXR1c30gPSBwcm9maWxlO1xuICAgIGNvbnN0IHtsYXRlc3R9ID0gc3RhdHVzO1xuXG4gICAgLy8gVXBkYXRlIGRhdGEuXG4gICAgY29uc3QgYXZnVGltZSA9IGNvdW50ID4gMCA/IHRvdGFsIC8gY291bnQgOiAwO1xuICAgIG5vZGUuZGF0YSgnY291bnQnLCBjb3VudCk7XG4gICAgbm9kZS5kYXRhKCd0aW1lJywgTWF0aC5yb3VuZChhdmdUaW1lKSk7XG5cbiAgICAvLyBFaXRoZXIgZmxhc2ggdGhlIGNsYXNzZXMgT1IgbWFpbnRhaW4gaXQgZm9yIGxvbmcgY2FsbGJhY2tzLlxuICAgIGlmIChsYXRlc3QgPT09ICdsb2FkaW5nJykge1xuICAgICAgICBub2RlLmRhdGEoJ2xvYWRpbmdTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stbG9hZGluZycpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stbG9hZGluZycpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gbm9kZS5kYXRhKCdsb2FkaW5nU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stbG9hZGluZycpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBsYXRlc3QgIT09ICdsb2FkaW5nJyAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuT0tdICYmXG4gICAgICAgIGxhdGVzdCAhPT0gU1RBVFVTTUFQW1NUQVRVUy5QUkVWRU5UX1VQREFURV1cbiAgICApIHtcbiAgICAgICAgbm9kZS5kYXRhKCdlcnJvclNldCcsIERhdGUubm93KCkpO1xuICAgICAgICBub2RlLmFkZENsYXNzKCdjYWxsYmFjay1lcnJvcicpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stZXJyb3InKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnZXJyb3JTZXQnKSArIGZsYXNoVGltZSAtIERhdGUubm93KCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiBub2RlLnJlbW92ZUNsYXNzKCdjYWxsYmFjay1lcnJvcicpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IFRoaXMgd2lsbCBmbGFzaCBicmFuY2hlcyB0aGF0IHJldHVybiBub191cGRhdGUhIVxuICAgIC8vIElmIHRoZSBjYWxsYmFjayByZXNvbHZlZCBwcm9wZXJseSwgZmxhc2ggdGhlIG91dHB1dHMuXG4gICAgaWYgKGxhdGVzdCA9PT0gU1RBVFVTTUFQW1NUQVRVUy5PS10pIHtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJykuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7b25FcnJvciwgcmV2ZXJ0fSBmcm9tICcuLi8uLi9hY3Rpb25zJztcblxuY2xhc3MgQ29tcG9uZW50RXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgbXlJRDogcHJvcHMuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBvbGRDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoXykge1xuICAgICAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBteUlEOiB0aGlzLnN0YXRlLm15SUQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBkaXNwYXRjaChyZXZlcnQpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGRyZW4gPSBwcmV2UHJvcHMuY2hpbGRyZW47XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmhhc0Vycm9yICYmXG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4gIT09IHByZXZTdGF0ZS5vbGRDaGlsZHJlbiAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICkge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlICovXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvbGRDaGlsZHJlbjogcHJldkNoaWxkcmVuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2hhc0Vycm9yLCBvbGRDaGlsZHJlbn0gPSB0aGlzLnN0YXRlO1xuICAgICAgICByZXR1cm4gaGFzRXJyb3IgPyBvbGRDaGlsZHJlbiA6IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxufVxuXG5Db21wb25lbnRFcnJvckJvdW5kYXJ5LnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb21wb25lbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvbmVudEVycm9yQm91bmRhcnk7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgJy4vRnJvbnRFbmRFcnJvci5jc3MnO1xuaW1wb3J0IHtDb21wb25lbnQsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbGxhcHNlSWNvbiBmcm9tICcuLi9pY29ucy9Db2xsYXBzZUljb24uc3ZnJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJy4uL1BlcmN5LmNzcyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvdXRpbHMnO1xuXG5pbXBvcnQgd2Vya3pldWdDc3MgZnJvbSAnLi4vd2Vya3pldWdjc3MnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMucHJvcHMuaXNMaXN0SXRlbVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2UsIGluQWxlcnRzVHJheX0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7Y29sbGFwc2VkfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgY29uc3QgY2FyZENsYXNzZXMgPVxuICAgICAgICAgICAgJ2Rhc2gtZXJyb3ItY2FyZF9fY29udGVudCcgK1xuICAgICAgICAgICAgKGluQWxlcnRzVHJheSA/ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheScgOiAnJyk7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG4gICAgICAgIGNvbnN0IGVycm9ySGVhZGVyID0gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci1pdGVtIHRlc3QtZGV2dG9vbHMtZXJyb3ItdG9nZ2xlJ1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogIWNvbGxhcHNlZH0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aXRsZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZS5lcnJvci5tZXNzYWdlIHx8ICdFcnJvcid9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1oaWRlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtgJHtlLnRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKX1gfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHBlcmN5LXNob3cnPlxuICAgICAgICAgICAgICAgICAgICAgICAgey8qIFNwZWNpYWwgcGVyY3kgdGltZXN0YW1wIGZvciB2aXN1YWwgdGVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhpZGRlbiBkdXJpbmcgcmVndWxhciB1c2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIDAwOjAwOjAwIFBNXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8Q29sbGFwc2VJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BkYXNoLWZlLWVycm9yX19jb2xsYXBzZSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdkYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHtjb2xsYXBzZWQ6ICFjb2xsYXBzZWR9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICB7ZXJyb3JIZWFkZXJ9XG4gICAgICAgICAgICAgICAgeyFjb2xsYXBzZWQgJiYgPEVycm9yQ29udGVudCBlcnJvcj17ZS5lcnJvcn0gLz59XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEJhY2tlbmRFcnJvcih7ZXJyb3IsIGJhc2V9KSB7XG4gICAgY29uc3QgaWZyYW1lUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtoZWlnaHQsIHNldEhlaWdodF0gPSB1c2VTdGF0ZSgnNTAwcHgnKTsgLy8gRGVmYXVsdCBoZWlnaHRcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gJ0lGUkFNRV9IRUlHSFQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRIZWlnaHQoYCR7ZXZlbnQuZGF0YS5oZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICByZWY9e2lmcmFtZVJlZn1cbiAgICAgICAgICAgIHNyY0RvYz17ZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAnPC9oZWFkPicsXG4gICAgICAgICAgICAgICAgICAgIGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt3ZXJremV1Z0Nzc308L3N0eWxlPlxuICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PlxuICBmdW5jdGlvbiBzZW5kSGVpZ2h0KCkge1xuICAgIGNvbnN0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIklGUkFNRV9IRUlHSFRcIiwgaGVpZ2h0IH0sIFwiKlwiKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBzZW5kSGVpZ2h0KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgc2VuZEhlaWdodCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgc2VuZEhlaWdodCk7XG48L3NjcmlwdD48L2hlYWQ+YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnPVwiP19fZGVidWdnZXJfXycsIGA9XCIke2Jhc2V9P19fZGVidWdnZXJfX2ApfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIDY3cHggb2YgcGFkZGluZyBhbmQgbWFyZ2luIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAqIGlmcmFtZSBhbmQgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICogNjcgd2FzIGRldGVybWluZWQgbWFudWFsbHkgaW4gdGhlXG4gICAgICAgICAgICAgICAgICogYnJvd3NlcidzIGRldiB0b29scy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB3aWR0aDogJ2NhbGMoNjAwcHggLSA2N3B4KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgKTtcbn1cblxuY29uc3QgTUFYX01FU1NBR0VfTEVOR1RIID0gNDA7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbmZ1bmN0aW9uIFVuY29ubmVjdGVkRXJyb3JDb250ZW50KHtlcnJvciwgYmFzZX0pIHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgIHsvKlxuICAgICAgICAgICAgICogNDAgaXMgYSByb3VnaCBoZXVyaXN0aWMgLSBpZiBsb25nZXIgdGhhbiA0MCB0aGVuIHRoZVxuICAgICAgICAgICAgICogbWVzc2FnZSBtaWdodCBvdmVyZmxvdyBpbnRvIGVsbGlwc2VzIGluIHRoZSB0aXRsZSBhYm92ZSAmXG4gICAgICAgICAgICAgKiB3aWxsIG5lZWQgdG8gYmUgZGlzcGxheWVkIGluIGZ1bGwgaW4gdGhpcyBlcnJvciBib2R5XG4gICAgICAgICAgICAgKi99XG4gICAgICAgICAgICB7dHlwZW9mIGVycm9yLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlLmxlbmd0aCA8IE1BWF9NRVNTQUdFX0xFTkdUSCA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2luZm8gZGFzaC1mZS1lcnJvcl9fY3VydmVkJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3Iuc3RhY2sgIT09ICdzdHJpbmcnID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBlcnJvciBvcmlnaW5hdGVkIGZyb20gdGhlIGJ1aWx0LWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU2NyaXB0IGNvZGUgdGhhdCBydW5zIERhc2ggYXBwcy4gQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSB0aGUgZnVsbCBzdGFjayB0cmFjZSBvciBvcGVuIHlvdXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIncyBjb25zb2xlLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5zdGFjay5zcGxpdCgnXFxuJykubWFwKChsaW5lLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGtleT17aX0+e2xpbmV9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7LyogQmFja2VuZCBFcnJvciAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3IuaHRtbCAhPT0gJ3N0cmluZycgPyBudWxsIDogZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAnPCFkb2N0eXBlJy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKSA9PT0gJzwhZG9jdHlwZScgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+XG4gICAgICAgICAgICAgICAgICAgICAgICB7LyogRW1iZWQgd2Vya3pldWcgZGVidWdnZXIgaW4gYW4gaWZyYW1lIHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1MgbGVha2luZyAtIHdlcmt6ZXVnIEhUTUwgaW5jbHVkZXMgYSBidW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIENTUyBvbiBiYXNlIGh0bWwgZWxlbWVudHMgbGlrZSBgPGJvZHkvPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgPEJhY2tlbmRFcnJvciBlcnJvcj17ZXJyb3J9IGJhc2U9e2Jhc2V9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3RyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+e2Vycm9yLmh0bWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cblxuY29uc3QgZXJyb3JQcm9wVHlwZXMgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIG1lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAvKiBmcm9udC1lbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBzdGFjazogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBodG1sOiBQcm9wVHlwZXMuc3RyaW5nXG59KTtcblxuVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQucHJvcFR5cGVzID0ge1xuICAgIGVycm9yOiBlcnJvclByb3BUeXBlcyxcbiAgICBiYXNlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBFcnJvckNvbnRlbnQgPSBjb25uZWN0KHN0YXRlID0+ICh7YmFzZTogdXJsQmFzZShzdGF0ZS5jb25maWcpfSkpKFxuICAgIFVuY29ubmVjdGVkRXJyb3JDb250ZW50XG4pO1xuXG5Gcm9udEVuZEVycm9yLnByb3BUeXBlcyA9IHtcbiAgICBlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB0aW1lc3RhbXA6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGVycm9yOiBlcnJvclByb3BUeXBlc1xuICAgIH0pLFxuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmJvb2wsXG4gICAgaXNMaXN0SXRlbTogUHJvcFR5cGVzLmJvb2xcbn07XG5cbkZyb250RW5kRXJyb3IuZGVmYXVsdFByb3BzID0ge1xuICAgIGluQWxlcnRzVHJheTogZmFsc2UsXG4gICAgaXNMaXN0SXRlbTogZmFsc2Vcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvcn07XG4iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAnLi9Gcm9udEVuZEVycm9yLmNzcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtGcm9udEVuZEVycm9yfSBmcm9tICcuL0Zyb250RW5kRXJyb3IucmVhY3QnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7ZXJyb3JzLCBjb25uZWN0ZWQsIGNsaWNrSGFuZGxlcn0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IGluQWxlcnRzVHJheSA9IHRoaXMucHJvcHMuaW5BbGVydHNUcmF5O1xuICAgICAgICBsZXQgY2FyZENsYXNzZXMgPSAnZGFzaC1lcnJvci1jYXJkIGRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyJztcblxuICAgICAgICBjb25zdCBlcnJvckVsZW1lbnRzID0gZXJyb3JzLm1hcCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8RnJvbnRFbmRFcnJvciBlPXtlcnJvcn0gaXNMaXN0SXRlbT17dHJ1ZX0ga2V5PXtpfSAvPjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbkFsZXJ0c1RyYXkpIHtcbiAgICAgICAgICAgIGNhcmRDbGFzc2VzICs9ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXJkQ2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fdG9wYmFyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25uZWN0ZWQgPyBudWxsIDogJ1xcdTAwYTAg8J+aqyBTZXJ2ZXIgVW5hdmFpbGFibGUnfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pY29uLXgnXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjbGlja0hhbmRsZXIoKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbGlzdCc+e2Vycm9yRWxlbWVudHN9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkZyb250RW5kRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGNvbm5lY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYW55XG59O1xuXG5Gcm9udEVuZEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5hbnlcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn07XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7RGVidWdNZW51fSBmcm9tICcuL21lbnUvRGVidWdNZW51LnJlYWN0JztcblxuY2xhc3MgVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2NvbmZpZywgZXJyb3IsIGNoaWxkcmVufSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1nbG9iYWwtZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8RGVidWdNZW51XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17Y29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcj17ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIGhvdFJlbG9hZD17Qm9vbGVhbihjb25maWcuaG90X3JlbG9hZCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1hcHAtY29udGVudCc+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvRGVidWdNZW51PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmNvbnN0IEdsb2JhbEVycm9yQ29udGFpbmVyID0gY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGNvbmZpZzogc3RhdGUuY29uZmlnLFxuICAgIGVycm9yOiBzdGF0ZS5lcnJvclxufSkpKFVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBHbG9iYWxFcnJvckNvbnRhaW5lcjtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QZXJjeS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2hlY2tJY29uID0gZnVuY3Rpb24gU3ZnQ2hlY2tJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNCAxNFwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcIiMwNjgwMEFcIixcbiAgICBmaWxsT3BhY2l0eTogMC44LFxuICAgIGQ6IFwiTTkuODU0IDUuMTQ2YS41LjUgMCAwIDEgMCAuNzA4bC0zLjUgMy41YS41LjUgMCAwIDEtLjcwOCAwbC0xLjUtMS41YS41LjUgMCAxIDEgLjcwOC0uNzA4TDYgOC4yOTNsMy4xNDYtMy4xNDdhLjUuNSAwIDAgMSAuNzA4IDBNMTMuNSA3QTYuNSA2LjUgMCAxIDEgNyAuNSA2LjUwNyA2LjUwNyAwIDAgMSAxMy41IDdtLTEgMEE1LjUgNS41IDAgMSAwIDcgMTIuNSA1LjUwNyA1LjUwNyAwIDAgMCAxMi41IDdcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NoZWNrSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Nsb2NrSWNvbiA9IGZ1bmN0aW9uIFN2Z0Nsb2NrSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgdmlld0JveDogXCIwIDAgNTQgMjRcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcIiNmZmZcIixcbiAgICBzdHJva2VXaWR0aDogNCxcbiAgICBkOiBcIk0yNyAwdjIyaDIyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDbG9ja0ljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDb2xsYXBzZUljb24gPSBmdW5jdGlvbiBTdmdDb2xsYXBzZUljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDYsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjQTJCMUM2XCIsXG4gICAgZDogXCJtMSAxIDQgNCA0LTRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NvbGxhcHNlSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Vycm9ySWNvbiA9IGZ1bmN0aW9uIFN2Z0Vycm9ySWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDEyLFxuICAgIGhlaWdodDogMTAsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgZDogXCJNMTEuMSA3LjgxNyA3IC42OTdBMS4xNiAxLjE2IDAgMCAwIDUgLjY5OGwtNC4xIDcuMTJhMS4xMDIgMS4xMDIgMCAwIDAgMCAxLjExMkExLjE0MSAxLjE0MSAwIDAgMCAxLjkgOS41SDEwLjFhMS4xNDEgMS4xNDEgMCAwIDAgMS4xNS0xLjEyN2MwLS4xOTYtLjA1MS0uMzg3LS4xNS0uNTU2bS0uNjUuNzM2YS40LjQgMCAwIDEtLjM1MS4xOTdIMS45YS4zOTguMzk4IDAgMCAxLS4zNS0uMTk3LjM1Ni4zNTYgMCAwIDEgMC0uMzYybDQuMDk5LTcuMTE5YS40MS40MSAwIDAgMSAuNzAzIDBsNC4xIDcuMTJhLjM1Ni4zNTYgMCAwIDEtLjAwMy4zNjFNNS42MjQgNS43NVYzLjg3NWEuMzc1LjM3NSAwIDEgMSAuNzUgMFY1Ljc1YS4zNzUuMzc1IDAgMCAxLS43NSAwbS45MzcgMS42ODhhLjU2Mi41NjIgMCAxIDEtMS4xMjUgMCAuNTYyLjU2MiAwIDAgMSAxLjEyNSAwXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdFcnJvckljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdFeHBhbmQgPSBmdW5jdGlvbiBTdmdFeHBhbmQocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAzMCxcbiAgICBoZWlnaHQ6IDMwLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMDEuNTQgNTQuNDZBMTA0IDEwNCAwIDAgMCA1NC40NiAyMDEuNTQgMTA0IDEwNCAwIDAgMCAyMDEuNTQgNTQuNDZabS0xMS4zMSAxMzUuNzdhODggODggMCAxIDEgMC0xMjQuNDYgODguMTEgODguMTEgMCAwIDEgMCAxMjQuNDZtLTE2LjU3LTg4LjU3TDE0Ny4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMybC0zMi0zMmE4IDggMCAwIDEgMC0xMS4zMmwzMi0zMmE4IDggMCAwIDEgMTEuMzIgMTEuMzJtLTU2IDBMOTEuMzEgMTI4bDI2LjM1IDI2LjM0YTggOCAwIDAgMS0xMS4zMiAxMS4zMmwtMzItMzJhOCA4IDAgMCAxIDAtMTEuMzJsMzItMzJhOCA4IDAgMCAxIDExLjMyIDExLjMyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdFeHBhbmQ7IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdHcmFwaEljb24gPSBmdW5jdGlvbiBTdmdHcmFwaEljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDEwLFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGQ6IFwiTTguMzc1IDYuMTI1Yy0uMzMxIDAtLjY1My4xMS0uOTE1LjMxM2wtMS4wODMtLjg0NGMuMDgxLS4xODcuMTIzLS4zOS4xMjMtLjU5NCAwLS4wMzUgMC0uMDctLjAwMy0uMTA0bC42Mi0uMjA2YTEuNSAxLjUgMCAxIDAtLjI0Mi0uODE1YzAgLjAzNSAwIC4wNy4wMDQuMTA0bC0uNjIuMjA2YTEuNSAxLjUgMCAwIDAtMS41MDYtLjY2NGwtLjMyLS43MjRhMS41IDEuNSAwIDEgMC0uNjg2LjMwN2wuMzIuNzIyYTEuNDk2IDEuNDk2IDAgMCAwLS40IDEuODU4TDIuNDYgNi43NTVhMS41MDMgMS41MDMgMCAxIDAgLjQ5OC41NjJsMS4yMDUtMS4wN2ExLjQ5NiAxLjQ5NiAwIDAgMCAxLjc1Mi0uMDU4bDEuMDgzLjg0M2ExLjQ4NCAxLjQ4NCAwIDAgMCAuMTMgMS40MjYgMS41IDEuNSAwIDEgMCAxLjI0Ni0yLjMzM20wLTNhLjc1Ljc1IDAgMSAxIDAgMS41Ljc1Ljc1IDAgMCAxIDAtMS41bS01LjYyNS0xLjVhLjc1Ljc1IDAgMSAxIDEuNSAwIC43NS43NSAwIDAgMS0xLjUgMFpNMS42MjUgOC43NWEuNzUuNzUgMCAxIDEgMC0xLjUuNzUuNzUgMCAwIDEgMCAxLjVNNC4yNSA1YS43NS43NSAwIDEgMSAxLjUgMCAuNzUuNzUgMCAwIDEtMS41IDBtNC4xMjUgMy4zNzVhLjc1Ljc1IDAgMSAxIDAtMS41Ljc1Ljc1IDAgMCAxIDAgMS41XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdHcmFwaEljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdPZmZJY29uID0gZnVuY3Rpb24gU3ZnT2ZmSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMTgsXG4gICAgZmlsbDogXCIjQzczQTNBXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNjUuNjYgMTAxLjY2IDEzOS4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMyTDEyOCAxMzkuMzFsLTI2LjM0IDI2LjM1YTggOCAwIDAgMS0xMS4zMi0xMS4zMkwxMTYuNjkgMTI4bC0yNi4zNS0yNi4zNGE4IDggMCAwIDEgMTEuMzItMTEuMzJMMTI4IDExNi42OWwyNi4zNC0yNi4zNWE4IDggMCAwIDEgMTEuMzIgMTEuMzJNMjMyIDEyOEExMDQgMTA0IDAgMSAxIDEyOCAyNGExMDQuMTEgMTA0LjExIDAgMCAxIDEwNCAxMDRtLTE2IDBhODggODggMCAxIDAtODggODggODguMSA4OC4xIDAgMCAwIDg4LTg4XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdPZmZJY29uOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9EZWJ1Z01lbnUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9EZWJ1Z01lbnUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCAnLi9EZWJ1Z01lbnUuY3NzJztcblxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICcuLi9pY29ucy9DaGVja0ljb24uc3ZnJztcbmltcG9ydCBDbG9ja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2xvY2tJY29uLnN2Zyc7XG5pbXBvcnQgRXJyb3JJY29uIGZyb20gJy4uL2ljb25zL0Vycm9ySWNvbi5zdmcnO1xuaW1wb3J0IEdyYXBoSWNvbiBmcm9tICcuLi9pY29ucy9HcmFwaEljb24uc3ZnJztcbmltcG9ydCBPZmZJY29uIGZyb20gJy4uL2ljb25zL09mZkljb24uc3ZnJztcbmltcG9ydCBFeHBhbmQgZnJvbSAnLi4vaWNvbnMvRXhwYW5kLnN2Zyc7XG5pbXBvcnQge1ZlcnNpb25JbmZvfSBmcm9tICcuL1ZlcnNpb25JbmZvLnJlYWN0JztcbmltcG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn0gZnJvbSAnLi4vQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn0gZnJvbSAnLi4vRnJvbnRFbmQvRnJvbnRFbmRFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5cbmNvbnN0IGNsYXNzZXMgPSAoYmFzZSwgdmFyaWFudCwgdmFyaWFudDIpID0+XG4gICAgYCR7YmFzZX0gJHtiYXNlfS0tJHt2YXJpYW50fWAgKyAodmFyaWFudDIgPyBgICR7YmFzZX0tLSR7dmFyaWFudDJ9YCA6ICcnKTtcblxuY29uc3QgaXNDb2xsYXBzZWQgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoX2RlYnVnX21lbnVfY29sbGFwc2VkJykgPT09ICd0cnVlJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuXG5jb25zdCBNZW51Q29udGVudCA9ICh7XG4gICAgaG90UmVsb2FkLFxuICAgIGNvbm5lY3RlZCxcbiAgICBwb3B1cCxcbiAgICB0b2dnbGVFcnJvcnMsXG4gICAgZXJyQ291bnQsXG4gICAgdG9nZ2xlQ2FsbGJhY2tHcmFwaCxcbiAgICBjb25maWdcbn0pID0+IHtcbiAgICBjb25zdCBfU3RhdHVzSWNvbiA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyBDaGVja0ljb25cbiAgICAgICAgICAgIDogT2ZmSWNvblxuICAgICAgICA6IENsb2NrSWNvbjtcblxuICAgIGNvbnN0IHN0YXR1cyA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyAnYXZhaWxhYmxlJ1xuICAgICAgICAgICAgOiAndW5hdmFpbGFibGUnXG4gICAgICAgIDogJ2NvbGQnO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fY29udGVudCc+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgIChwb3B1cCA9PSAnZXJyb3JzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlkPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9ycy1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEVycm9ySWNvbiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbicgLz5cbiAgICAgICAgICAgICAgICBFcnJvcnNcbiAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3Rlc3QtZGV2dG9vbHMtZXJyb3ItY291bnQgZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnR9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNhbGxiYWNrR3JhcGh9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgKHBvcHVwID09ICdjYWxsYmFja0dyYXBoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJykgKyAnIGRhc2gtZGVidWctbWVudV9fYnV0dG9uJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZD0nZGFzaC1kZWJ1Zy1tZW51X19jYWxsYmFjay1ncmFwaC1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEdyYXBoSWNvbiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbicgLz5cbiAgICAgICAgICAgICAgICBDYWxsYmFja3NcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZGl2aWRlcicgLz5cbiAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBjb25maWc9e2NvbmZpZ30gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInIC8+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGFzaC1kZWJ1Zy1tZW51X19zdGF0dXMgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLSR7c3RhdHVzfWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2VydmVyXG4gICAgICAgICAgICAgICAgPF9TdGF0dXNJY29uIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInXG4gICAgICAgICAgICAgICAgc3R5bGU9e3ttYXJnaW5SaWdodDogMH19XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuY29uc3QgRGVidWdNZW51ID0gKHtlcnJvciwgaG90UmVsb2FkLCBjb25maWcsIGNoaWxkcmVufSkgPT4ge1xuICAgIGNvbnN0IFtwb3B1cCwgc2V0UG9wdXBdID0gdXNlU3RhdGUoJ2Vycm9ycycpO1xuICAgIGNvbnN0IFtjb2xsYXBzZWQsIHNldENvbGxhcHNlZF0gPSB1c2VTdGF0ZShpc0NvbGxhcHNlZCk7XG5cbiAgICBjb25zdCBlcnJDb3VudCA9IGVycm9yLmZyb250RW5kLmxlbmd0aCArIGVycm9yLmJhY2tFbmQubGVuZ3RoO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGVycm9yLmJhY2tFbmRDb25uZWN0ZWQ7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZXJyQ291bnQgPiAwICYmIHBvcHVwID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFBvcHVwKCdlcnJvcnMnKTtcbiAgICAgICAgfVxuICAgIH0sIFtlcnJDb3VudF0pO1xuXG4gICAgY29uc3QgdG9nZ2xlRXJyb3JzID0gKCkgPT4ge1xuICAgICAgICBzZXRQb3B1cChwb3B1cCA9PSAnZXJyb3JzJyA/IG51bGwgOiAnZXJyb3JzJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHRvZ2dsZUNhbGxiYWNrR3JhcGggPSAoKSA9PiB7XG4gICAgICAgIHNldFBvcHVwKHBvcHVwID09ICdjYWxsYmFja0dyYXBoJyA/IG51bGwgOiAnY2FsbGJhY2tHcmFwaCcpO1xuICAgIH07XG5cbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZWQgPSAoKSA9PiB7XG4gICAgICAgIHNldENvbGxhcHNlZCghY29sbGFwc2VkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoX2RlYnVnX21lbnVfY29sbGFwc2VkJywgIWNvbGxhcHNlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JzID0gY29uY2F0KGVycm9yLmZyb250RW5kLCBlcnJvci5iYWNrRW5kKTtcblxuICAgIGNvbnN0IHBvcHVwQ29udGVudCA9IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fcG9wdXAnPlxuICAgICAgICAgICAge3BvcHVwID09ICdjYWxsYmFja0dyYXBoJyA/IDxDYWxsYmFja0dyYXBoQ29udGFpbmVyIC8+IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAge3BvcHVwID09ICdlcnJvcnMnICYmIGVyckNvdW50ID4gMCA/IChcbiAgICAgICAgICAgICAgICA8RnJvbnRFbmRFcnJvckNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXI9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzPXtlcnJvcnN9XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZD17ZXJyb3IuYmFja0VuZENvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcblxuICAgIGNvbnN0IG1lbnVDb250ZW50ID0gY29sbGFwc2VkID8gdW5kZWZpbmVkIDogKFxuICAgICAgICA8TWVudUNvbnRlbnRcbiAgICAgICAgICAgIHBvcHVwPXtwb3B1cH1cbiAgICAgICAgICAgIGVyckNvdW50PXtlcnJDb3VudH1cbiAgICAgICAgICAgIHRvZ2dsZUVycm9ycz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgdG9nZ2xlQ2FsbGJhY2tHcmFwaD17dG9nZ2xlQ2FsbGJhY2tHcmFwaH1cbiAgICAgICAgICAgIGNvbmZpZz17Y29uZmlnfVxuICAgICAgICAgICAgaG90UmVsb2FkPXtob3RSZWxvYWR9XG4gICAgICAgICAgICBjb25uZWN0ZWQ9e2Nvbm5lY3RlZH1cbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoXG4gICAgICAgICAgICAgICAgICAgICdkYXNoLWRlYnVnLW1lbnVfX291dGVyJyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkID8gJ2NvbGxhcHNlZCcgOiAnZXhwYW5kZWQnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cG9wdXBDb250ZW50fVxuICAgICAgICAgICAgICAgIHttZW51Q29udGVudH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNvbGxhcHNlZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rhc2gtZGVidWctbWVudV9fdG9nZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEV4cGFuZCAvPlxuICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwICYmIGNvbGxhcHNlZCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvcicgLz5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbkRlYnVnTWVudS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG90UmVsb2FkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmV4cG9ydCB7RGVidWdNZW51fTtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9WZXJzaW9uSW5mby5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1ZlcnNpb25JbmZvLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0ICcuL1ZlcnNpb25JbmZvLmNzcyc7XG5cbmNvbnN0IERBWV9JTl9NUyA9IDg2NDAwMDAwO1xuXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbnModjEsIHYyKSB7XG4gICAgLy8gUmVtb3ZlIGFueSBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGZyb20gdGhlIHZlcnNpb24gc3RyaW5nc1xuICAgIC8vIGFuZCBhbnl0aGluZyBhZnRlciB0aGVtIChlLmcuIDEuMi4zLXJjLjEgLT4gMS4yLjMsIDEuMi4zK2J1aWxkLjEgLT4gMS4yLjMpXG4gICAgdjEgPSB2MS5yZXBsYWNlKC9cXC4/W14wLTkuXS4qJC8sICcnKTtcbiAgICB2MiA9IHYyLnJlcGxhY2UoL1xcLj9bXjAtOS5dLiokLywgJycpO1xuXG4gICAgY29uc3QgdjFQYXJ0cyA9IHYxLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgdjJQYXJ0cyA9IHYyLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KHYxUGFydHMubGVuZ3RoLCB2MlBhcnRzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0MSA9IHYxUGFydHNbaV0gfHwgMDtcbiAgICAgICAgY29uc3QgcGFydDIgPSB2MlBhcnRzW2ldIHx8IDA7XG5cbiAgICAgICAgaWYgKHBhcnQxID4gcGFydDIpIHJldHVybiAxO1xuICAgICAgICBpZiAocGFydDEgPCBwYXJ0MikgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0RGFzaFZlcnNpb25JbmZvKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGFzaF92ZXJzaW9uOiBjdXJyZW50RGFzaFZlcnNpb24sXG4gICAgICAgIGRhc2hfdmVyc2lvbl91cmw6IGRhc2hWZXJzaW9uVXJsLFxuICAgICAgICBweXRob25fdmVyc2lvbjogcHl0aG9uVmVyc2lvbixcbiAgICAgICAgZGRrX3ZlcnNpb246IGRka1ZlcnNpb24sXG4gICAgICAgIHBsb3RseV92ZXJzaW9uOiBwbG90bHlWZXJzaW9uXG4gICAgfSA9IGNvbmZpZztcbiAgICBsZXQgY2FjaGVkVmVyc2lvbkluZm8sIGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluaywgbGFzdEZldGNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkVmVyc2lvbkluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkTmV3RGFzaFZlcnNpb24nKTtcbiAgICAgICAgY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rJ1xuICAgICAgICApO1xuICAgICAgICBsYXN0RmV0Y2hlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RmV0Y2hlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIGxhc3RGZXRjaGVkICYmXG4gICAgICAgIERhdGUubm93KCkgLSBOdW1iZXIobGFzdEZldGNoZWQpIDwgREFZX0lOX01TICYmXG4gICAgICAgIGNhY2hlZFZlcnNpb25JbmZvXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBKU09OLnBhcnNlKGNhY2hlZFZlcnNpb25JbmZvKSxcbiAgICAgICAgICAgIGxpbms6IGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGlua1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc2hvdWxkUmVxdWVzdERhc2hWZXJzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIGRhc2hfdmVyc2lvbjogY3VycmVudERhc2hWZXJzaW9uLFxuICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246IHB5dGhvblZlcnNpb24sXG4gICAgICAgICAgICBkZGtfdmVyc2lvbjogZGRrVmVyc2lvbixcbiAgICAgICAgICAgIHBsb3RseV92ZXJzaW9uOiBwbG90bHlWZXJzaW9uXG4gICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBmZXRjaChkYXNoVmVyc2lvblVybCArICc/JyArIHF1ZXJ5UGFyYW1zLCB7bW9kZTogJ2NvcnMnfSlcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgICAgIC50aGVuKGJvZHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIGJvZHkudmVyc2lvbiAmJiBib2R5LmxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWNoZWROZXdEYXNoVmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYm9keS52ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkubGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYXN0RmV0Y2hlZCcsIERhdGUubm93KCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVxdWVzdERhc2hWZXJzaW9uKGNvbmZpZykge1xuICAgIC8vIElmIHZlcnNpb24gY2hlY2sgaXMgZGlzYWJsZWQsIHJldHVybiBmYWxzZSB0byBhdm9pZFxuICAgIC8vIGNoZWNraW5nIGxvY2FsU3RvcmFnZSB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKGNvbmZpZy5kaXNhYmxlX3ZlcnNpb25fY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgc2hvd05vdGlmaWNhdGlvbnMsIGxhc3RGZXRjaGVkO1xuICAgIHRyeSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zID1cbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93Tm90aWZpY2F0aW9ucycpICE9PSAnZmFsc2UnO1xuICAgICAgICBsYXN0RmV0Y2hlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RmV0Y2hlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zICYmXG4gICAgICAgICghbGFzdEZldGNoZWQgfHwgRGF0ZS5ub3coKSAtIE51bWJlcihsYXN0RmV0Y2hlZCkgPiBEQVlfSU5fTVMpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24oXG4gICAgY3VycmVudERhc2hWZXJzaW9uLFxuICAgIG5ld0Rhc2hWZXJzaW9uLFxuICAgIGNvbmZpZ1xuKSB7XG4gICAgLy8gSWYgdmVyc2lvbiBjaGVjayBpcyBkaXNhYmxlZCwgcmV0dXJuIGZhbHNlIHRvIGF2b2lkXG4gICAgLy8gY2hlY2tpbmcgbG9jYWxTdG9yYWdlIHVubmVjZXNzYXJpbHlcbiAgICBpZiAoY29uZmlnLmRpc2FibGVfdmVyc2lvbl9jaGVjaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBzaG93Tm90aWZpY2F0aW9ucywgbGFzdERpc21pc3NlZCwgbGFzdERpc21pc3NlZFZlcnNpb247XG4gICAgdHJ5IHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbnMgPVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nob3dOb3RpZmljYXRpb25zJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGxhc3REaXNtaXNzZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdERpc21pc3NlZCcpO1xuICAgICAgICBsYXN0RGlzbWlzc2VkVmVyc2lvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RGlzbWlzc2VkVmVyc2lvbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgbmV3RGFzaFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb21wYXJlVmVyc2lvbnMoY3VycmVudERhc2hWZXJzaW9uLCBuZXdEYXNoVmVyc2lvbikgPj0gMCB8fFxuICAgICAgICAhc2hvd05vdGlmaWNhdGlvbnNcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGxhc3REaXNtaXNzZWQgJiZcbiAgICAgICAgRGF0ZS5ub3coKSAtIE51bWJlcihsYXN0RGlzbWlzc2VkKSA+IERBWV9JTl9NU1xuICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsYXN0RGlzbWlzc2VkVmVyc2lvbiAmJlxuICAgICAgICAhbGFzdERpc21pc3NlZCAmJlxuICAgICAgICBjb21wYXJlVmVyc2lvbnMobGFzdERpc21pc3NlZFZlcnNpb24sIG5ld0Rhc2hWZXJzaW9uKSA8IDBcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFsYXN0RGlzbWlzc2VkICYmICFsYXN0RGlzbWlzc2VkVmVyc2lvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBWZXJzaW9uSW5mbyA9ICh7Y29uZmlnfSkgPT4ge1xuICAgIGNvbnN0IFtuZXdEYXNoVmVyc2lvbiwgc2V0TmV3RGFzaFZlcnNpb25dID0gdXNlU3RhdGUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBbbmV3RGFzaFZlcnNpb25MaW5rLCBzZXROZXdEYXNoVmVyc2lvbkxpbmtdID0gdXNlU3RhdGUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBbdXBncmFkZVRvb2x0aXBPcGVuZWQsIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IHNldERvbnRTaG93QWdhaW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgbm90aWZpY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2hvd05vdGlmaWNhdGlvbnMnLCBmYWxzZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgaWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgfVxuICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldFJlbWluZE1lTGF0ZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgbm90aWZpY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdERpc21pc3NlZCcsIERhdGUubm93KCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRTa2lwVGhpc1ZlcnNpb24gPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgdmVyc2lvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3REaXNtaXNzZWRWZXJzaW9uJywgbmV3RGFzaFZlcnNpb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXF1ZXN0RGFzaFZlcnNpb25JbmZvKGNvbmZpZykudGhlbihib2R5ID0+IHtcbiAgICAgICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICAgICAgc2V0TmV3RGFzaFZlcnNpb25MaW5rKGJvZHkubGluayk7XG4gICAgICAgICAgICAgICAgc2V0TmV3RGFzaFZlcnNpb24oYm9keS52ZXJzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaGlkZVVwZ3JhZGVUb29sdGlwID0gZSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdXBncmFkZVRvb2x0aXBPcGVuZWQgJiZcbiAgICAgICAgICAgICAgICAhZS50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICAgICAgICAgJy5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24sIC5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24gKidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIENsb3NlIHRoZSB1cGdyYWRlIHRvb2x0aXAgaWYgdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgaXRcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVXBncmFkZVRvb2x0aXApO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVVcGdyYWRlVG9vbHRpcCk7XG4gICAgfSwgW3VwZ3JhZGVUb29sdGlwT3BlbmVkXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uJz5cbiAgICAgICAgICAgIHt1cGdyYWRlVG9vbHRpcE9wZW5lZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAnPlxuICAgICAgICAgICAgICAgICAgICB7bmV3RGFzaFZlcnNpb25MaW5rID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e25ld0Rhc2hWZXJzaW9uTGlua30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZCBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3NldFNraXBUaGlzVmVyc2lvbn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBTa2lwIHRoaXMgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXRSZW1pbmRNZUxhdGVyfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlbWluZCBtZSB0b21vcnJvd1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXREb250U2hvd0FnYWlufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNpbGVuY2UgYWxsIHZlcnNpb24gbm90aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPHNwYW4+dntjb25maWcuZGFzaF92ZXJzaW9ufTwvc3Bhbj5cbiAgICAgICAgICAgIHtzaG91bGRTaG93VXBncmFkZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICBjb25maWcuZGFzaF92ZXJzaW9uLFxuICAgICAgICAgICAgICAgIG5ld0Rhc2hWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgKSA/IChcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKCF1cGdyYWRlVG9vbHRpcE9wZW5lZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgRGFzaCB1cGRhdGUgYXZhaWxhYmxlIC0gdntuZXdEYXNoVmVyc2lvbn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcbiIsIi8vIFdlcmt6ZXVnIGNzcyBpbmNsdWRlZCBhcyBhIHN0cmluZywgYmVjYXVzZSB3ZSB3YW50IHRvIGluamVjdFxuLy8gaXQgaW50byBhbiBpZnJhbWUgc3JjRG9jXG5cbmV4cG9ydCBkZWZhdWx0IGBcbmJvZHkge1xuICAgIG1hcmdpbjogMHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm9yZGVyLXJhZGl1czogMHB4IDBweCA0cHggNHB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG5oMi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3JkZXItYm90dG9tOiAwcHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDBweCAwcHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbmgyLnRyYWNlYmFjayBlbSB7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcbn1cblxuLnRyYWNlYmFjayBwcmUsIC5kZWJ1Z2dlciB0ZXh0YXJlYSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0YzRjZGQTtcbn1cblxuLmRlYnVnZ2VyIGgxIHtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xufVxuXG4uZXhwbGFuYXRpb24ge1xuICAgIGNvbG9yOiAjQTJCMUM2O1xufVxuXG4vKiBIaWRlIHRoZSBEb24ndCBQYW5pYyEgZm9vdGVyICovXG4uZGVidWdnZXIgLmZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogSGlkZSBhbGwgb2YgdGhlIERhc2ggdHJhY2ViYWNrIHN0dWZmIHRoYXQgbGVhZHMgdXAgdG8gdGhlIGNhbGwgKi9cbi5saW5lLmJlZm9yZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2LmRlYnVnZ2VyIHtcbiAgICBwYWRkaW5nOiAwcHg7XG59XG5cbi5kZWJ1Z2dlciBoMSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIC5lcnJvcm1zZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcGFkZGluZzogMTBweDtcbn1cblxuLmRlYnVnZ2VyIC5wYXN0ZW1lc3NhZ2UgaW5wdXQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciAuZXhwbGFuYXRpb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciBkaXYucGxhaW4ge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuLnBsYWluIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuLnBsYWluID4gZm9ybSA+IHAge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucGxhaW4gcHJlIHtcbiAgICBwYWRkaW5nOiAxNXB4ICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxuXG4uZGVidWdnZXIgZGl2LnRyYWNlYmFjayBwcmUge1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmRlYnVnZ2VyIC50cmFjZWJhY2sgLnNvdXJjZSBwcmUubGluZSBpbWcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5gO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29uZmlnRnJvbURPTSgpIHtcbiAgICBjb25zdCBjb25maWdFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19kYXNoLWNvbmZpZycpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ0VsZW1lbnQ/LnRleHRDb250ZW50ID8gY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgOiAne30nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBSRURJUkVDVF9VUklfUEFUSE5BTUUgPSAnL19vYXV0aDIvY2FsbGJhY2snO1xuZXhwb3J0IGNvbnN0IE9BVVRIX0NPT0tJRV9OQU1FID0gJ3Bsb3RseV9vYXV0aF90b2tlbic7XG5leHBvcnQgY29uc3QgSldUX0VYUElSRURfTUVTU0FHRSA9ICdKV1QgRXhwaXJlZCc7XG5cbmV4cG9ydCBjb25zdCBTVEFUVVMgPSB7XG4gICAgT0s6IDIwMCxcbiAgICBQUkVWRU5UX1VQREFURTogMjA0LFxuICAgIC8vIFdlIGFjY2VwdCBib3RoIDQwMCBhbmQgNDAxIGZvciBKV1QgdG9rZW4gZXhwaXJ5IHJlc3BvbnNlcy5cbiAgICAvLyBTb21lIHNlcnZlcnMgdXNlIGNvZGUgNDAwIGZvciBleHBpcmVkIHRva2VucywgYmVjYXVzZVxuICAgIC8vIHRoZXkgcmVzZXJ2ZSA0MDEgZm9yIGNhc2VzIHRoYXQgcmVxdWlyZSB1c2VyIGFjdGlvblxuICAgIEJBRF9SRVFVRVNUOiA0MDAsXG4gICAgVU5BVVRIT1JJWkVEOiA0MDEsXG4gICAgQ0xJRU5UU0lERV9FUlJPUjogJ0NMSUVOVFNJREVfRVJST1InLFxuICAgIE5PX1JFU1BPTlNFOiAnTk9fUkVTUE9OU0UnXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTTUFQID0ge1xuICAgIFtTVEFUVVMuT0tdOiAnU1VDQ0VTUycsXG4gICAgW1NUQVRVUy5QUkVWRU5UX1VQREFURV06ICdOT19VUERBVEUnXG59O1xuIiwiaW1wb3J0IHsgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IERhc2hDb250ZXh0LCB1c2VEYXNoQ29udGV4dCB9IGZyb20gJy4vd3JhcHBlci9EYXNoQ29udGV4dCc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldFN0b3JlcyB9IGZyb20gJy4vdXRpbHMvc3RvcmVzJztcbmltcG9ydCBFeHRlcm5hbFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0V4dGVybmFsV3JhcHBlcic7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuLyoqXG4gKiBHZXQgdGhlIGRhc2ggcHJvcHMgZnJvbSBhIGNvbXBvbmVudCBwYXRoIG9yIGlkLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRQYXRoT3JJZCBUaGUgcGF0aCBvciB0aGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIHByb3BzIG9mLlxuICogQHBhcmFtIHByb3BQYXRoIEFkZGl0aW9uYWwga2V5IHRvIGdldCB0aGUgcHJvcGVydHkgaW5zdGVhZCBvZiBwbGFpbiBwcm9wcy5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldExheW91dChjb21wb25lbnRQYXRoT3JJZCkge1xuICAgIGNvbnN0IGRzID0gZ2V0U3RvcmVzKCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBkcy5sZW5ndGg7IHkrKykge1xuICAgICAgICBjb25zdCB7IHBhdGhzLCBsYXlvdXQgfSA9IGRzW3ldLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBjb21wb25lbnRQYXRoO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcG9uZW50UGF0aE9ySWQpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50UGF0aE9ySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGNvbXBvbmVudFBhdGhPcklkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0gcGF0aChjb21wb25lbnRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBpZiAocHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9XG4gICAgfVxufVxud2luZG93LmRhc2hfY29tcG9uZW50X2FwaSA9IHtcbiAgICBFeHRlcm5hbFdyYXBwZXIsXG4gICAgRGFzaENvbnRleHQsXG4gICAgdXNlRGFzaENvbnRleHQsXG4gICAgZ2V0TGF5b3V0LFxuICAgIHN0cmluZ2lmeUlkXG59O1xuIiwiaW1wb3J0IHtoYXMsIGluY2x1ZGVzfSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVHlwZUVycm9ySGFuZGxlcihtZXNzYWdlLCBwcm9wcywgdHlwZSkge1xuICAgIC8qXG4gICAgICogcHJvcFR5cGUgZXJyb3IgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkIGluXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzXG4gICAgICogKFZlcnNpb24gMTUuNy4yKVxuICAgICAqXG4gICAgICogUGFyc2UgdGhlc2UgZXhjZXB0aW9uIG9iamVjdHMgdG8gcmVtb3ZlIEpTIHNvdXJjZSBjb2RlIGFuZCBpbXByb3ZlXG4gICAgICogdGhlIGNsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJZiB3cm9uZyBwcm9wIHR5cGUgd2FzIHBhc3NlZCBpbiwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogRXJyb3I6IFwiRmFpbGVkIGNvbXBvbmVudCBwcm9wIHR5cGU6IEludmFsaWQgY29tcG9uZW50IHByb3AgYGFuaW1hdGVgIG9mIHR5cGUgYG51bWJlcmAgc3VwcGxpZWQgdG8gYGZ1bmN0aW9uIEdyYXBoV2l0aERlZmF1bHRzKHByb3BzKSB7XG4gICAgICogICB2YXIgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogZ2VuZXJhdGVJZCgpO1xuICAgICAqICAgcmV0dXJuIHJlYWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoUGxvdGx5R3JhcGgsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAqICAgICBpZDogaWRcbiAgICAgKiAgIH0pKTtcbiAgICAgKiB9YCwgZXhwZWN0ZWQgYGJvb2xlYW5gLlwiXG4gICAgICpcbiAgICAgKlxuICAgICAqIElmIGEgcmVxdWlyZWQgcHJvcCB0eXBlIHdhcyBvbWl0dGVkLCBtZXNzYWdlIGxvb2tzIGxpa2U6XG4gICAgICpcbiAgICAgKiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBUaGUgY29tcG9uZW50IHByb3AgYG9wdGlvbnNbMF0udmFsdWVgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiBgZnVuY3Rpb24gQ2hlY2tsaXN0KHByb3BzKSB7XG4gICAgICogICAgdmFyIF90aGlzO1xuICAgICAqXG4gICAgICogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrbGlzdCk7XG4gICAgICpcbiAgICAgKiAgICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQ2hlY2tsaXN0KS5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgICogICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAqICAgICAgIHZhbHVlczogcHJvcHMudmFsdWVzXG4gICAgICogICAgIH07XG4gICAgICogICAgIHJldHVybiBfdGhpcztcbiAgICAgKiAgIH1gLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLlwiXG4gICAgICpcbiAgICAgKi9cblxuICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJ2AnKTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgIGlmIChpbmNsdWRlcygnaXMgbWFya2VkIGFzIHJlcXVpcmVkJywgbWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtpbnZhbGlkUHJvcFBhdGh9IGluICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyBpcyByZXF1aXJlZCBidXQgaXQgd2FzIG5vdCBwcm92aWRlZC4nO1xuICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoJ0JhZCBvYmplY3QnLCBtZXNzYWdlKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIYW5kbGUgLmV4YWN0IGVycm9yc1xuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDQzOC1MNDQyXG4gICAgICAgICAqL1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnc3VwcGxpZWQgdG8gJylbMF0gK1xuICAgICAgICAgICAgYHN1cHBsaWVkIHRvICR7dHlwZX1gICtcbiAgICAgICAgICAgICcuXFxuQmFkJyArXG4gICAgICAgICAgICBtZXNzYWdlLnNwbGl0KCcuXFxuQmFkJylbMV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5jbHVkZXMoJ0ludmFsaWQgJywgbWVzc2FnZSkgJiZcbiAgICAgICAgaW5jbHVkZXMoJyBzdXBwbGllZCB0byAnLCBtZXNzYWdlKVxuICAgICkge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFBhdGggPSBtZXNzYWdlUGFydHNbMV07XG5cbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYEludmFsaWQgYXJndW1lbnQgXFxgJHtpbnZhbGlkUHJvcFBhdGh9XFxgIHBhc3NlZCBpbnRvICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJy4nO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgZXhwZWN0ZWQgdmFsdWUuXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnLCBleHBlY3RlZCAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRQcm9wVHlwZSA9IG1lc3NhZ2Uuc3BsaXQoJywgZXhwZWN0ZWQgJylbMV07XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbkV4cGVjdGVkICR7ZXhwZWN0ZWRQcm9wVHlwZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGFsbCBlcnJvciBtZXNzYWdlcyBpbmNsdWRlIHRoZSB0eXBlXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnIG9mIHR5cGUgYCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCA9IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyBvZiB0eXBlIGAnKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnYCcpWzBdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5XYXMgc3VwcGxpZWQgdHlwZSBcXGAke2ludmFsaWRQcm9wVHlwZVByb3ZpZGVkfVxcYC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhcyhpbnZhbGlkUHJvcFBhdGgsIHByb3BzKSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGludmFsaWRQcm9wUGF0aCBtYXkgYmUgbmVzdGVkIGxpa2UgYG9wdGlvbnNbMF0udmFsdWVgLlxuICAgICAgICAgICAgICogRm9yIG5vdywgd2Ugd29uJ3QgdHJ5IHRvIHVucGFjayB0aGVzZSBuZXN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICogYnV0IHdlIGNvdWxkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGpzb25TdXBwbGllZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgcHJvcHNbaW52YWxpZFByb3BQYXRoXSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoanNvblN1cHBsaWVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMoJ1xcbicsIGpzb25TdXBwbGllZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblZhbHVlIHByb3ZpZGVkOiBcXG4ke2pzb25TdXBwbGllZFZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhd2FyZSBvZiBvdGhlciBwcm9wIHR5cGUgd2FybmluZyBtZXNzYWdlcy5cbiAgICAgICAgICogQnV0LCBpZiB0aGV5IGV4aXN0LCB0aGVuIGF0IGxlYXN0IHRocm93IHRoZSBkZWZhdWx0XG4gICAgICAgICAqIHJlYWN0IHByb3AgdHlwZXMgZXJyb3JcbiAgICAgICAgICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbn1cbiIsImltcG9ydCB7aW5jbHVkZXMsIHR5cGV9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdOdWxsJywgJ0Jvb2xlYW4nXTtcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50ID0+IGluY2x1ZGVzKHR5cGUoY29tcG9uZW50KSwgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyk7XG4iLCJjb25zdCB1cGRhdGVUaXRsZSA9IChnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlnLCBpc0xvYWRpbmcgfSA9IGdldFN0YXRlKCk7XG4gICAgY29uc3QgdXBkYXRlX3RpdGxlID0gY29uZmlnPy51cGRhdGVfdGl0bGU7XG4gICAgaWYgKCF1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC50aXRsZSAhPT0gdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci50aXRsZSA9IGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSB1cGRhdGVfdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChkb2N1bWVudC50aXRsZSA9PT0gdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IG9ic2VydmVyLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIudGl0bGUgPSBkb2N1bWVudC50aXRsZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBpbnB1dHM6IFsnaXNMb2FkaW5nJ10sXG4gICAgbXV0YXRpb25PYnNlcnZlcjogdW5kZWZpbmVkLFxuICAgIG9ic2VydmVyOiAoeyBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY29uZmlnICE9PSBjb25maWcpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB1cGRhdGVUaXRsZShnZXRTdGF0ZSkpO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRpdGxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVRpdGxlKGdldFN0YXRlKTtcbiAgICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGlzRW1wdHksIGlzTmlsLCBtYXAsIHBhdGgsIGtleXMsIHBpY2tCeSwgdG9QYWlycywgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzLCBhZGRDb21wbGV0ZWRDYWxsYmFja3MsIGFkZFN0b3JlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IHBhcnNlSWZXaWxkY2FyZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AsIGdldENhbGxiYWNrc0J5SW5wdXQsIGdldExheW91dENhbGxiYWNrcywgaW5jbHVkZU9ic2VydmVycyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzLCBzZXRQYXRocywgaGFuZGxlQXN5bmNFcnJvciB9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgZ2V0UGF0aCwgY29tcHV0ZVBhdGhzIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBhcHBseVBlcnNpc3RlbmNlLCBwcnVuZVBlcnNpc3RlbmNlIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5UHJvcHMoaWQsIHVwZGF0ZWRQcm9wcykge1xuICAgICAgICAgICAgY29uc3QgeyBsYXlvdXQsIHBhdGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgaXRlbXBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1wYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNhbGxiYWNrLWdlbmVyYXRlZCB1cGRhdGUuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGludmFsaWRhdGVzIGV4aXN0aW5nIHBlcnNpc3RlZCBwcm9wIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIG9yIGlmIHBlcnNpc3RlbmNlIGNoYW5nZWQsIHdoZXRoZXIgdGhpcyB1cGRhdGVzIG90aGVyIHByb3BzLlxuICAgICAgICAgICAgdXBkYXRlZFByb3BzID0gcHJ1bmVQZXJzaXN0ZW5jZShwYXRoKGl0ZW1wYXRoLCBsYXlvdXQpLCB1cGRhdGVkUHJvcHMsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHVwZGF0ZSBjb250YWlucyB3aG9sZSBjb21wb25lbnRzLCBzZWUgaWYgYW55IG9mXG4gICAgICAgICAgICAvLyB0aG9zZSBjb21wb25lbnRzIGhhdmUgcHJvcHMgdG8gdXBkYXRlIHRvIHBlcnNpc3QgdXNlciBlZGl0cy5cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IGFwcGx5UGVyc2lzdGVuY2UoeyBwcm9wczogdXBkYXRlZFByb3BzIH0sIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgICAgICBpdGVtcGF0aCxcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2NhbGxiYWNrJ1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXF1ZXN0ZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RvcmVkQ2FsbGJhY2tzID0gW107XG4gICAgICAgIGV4ZWN1dGVkLmZvckVhY2goY2IgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZGVjZXNzb3JzID0gY29uY2F0KGNiLnByZWRlY2Vzc29ycyA/PyBbXSwgW2NiLmNhbGxiYWNrXSk7XG4gICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrOiB7IGNsaWVudHNpZGVfZnVuY3Rpb24sIG91dHB1dCB9LCBleGVjdXRpb25SZXN1bHQgfSA9IGNiO1xuICAgICAgICAgICAgaWYgKGlzTmlsKGV4ZWN1dGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yLCBwYXlsb2FkIH0gPSBleGVjdXRpb25SZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2lkLCBwcm9wc10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUlmV2lsZGNhcmQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGdyYXBocywgbGF5b3V0OiBvbGRMYXlvdXQsIHBhdGhzOiBvbGRQYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcG9uZW50cyB3aWxsIHRyaWdnZXIgY2FsbGJhY2tzIG9uIHRoZWlyIG93biBhcyByZXF1aXJlZCAoZWcuIGRlcml2ZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcGxpZWRQcm9wcyA9IGFwcGx5UHJvcHMocGFyc2VkSWQsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNhbGxiYWNrcyBmb3IgbW9kaWZpZWQgaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGZsYXR0ZW4obWFwKHByb3AgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIG9sZFBhdGhzLCBwYXJzZWRJZCwgcHJvcCwgdHJ1ZSksIGtleXMocHJvcHMpKSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VQYXRoID0gZ2V0UGF0aChvbGRQYXRocywgcGFyc2VkSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkT2JqID0gcGF0aChiYXNlUGF0aCwgb2xkTGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcignZGVmYXVsdFZhbHVlJywgW29sZE9iai5uYW1lc3BhY2UsIG9sZE9iai50eXBlXSwgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBhdGhzID0gKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgb2xkQ2hpbGRyZW5QYXRoLCBmaWx0ZXJSb290ID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9QYXRocyA9IGdldFN0YXRlKCkucGF0aHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IGNvbXB1dGVQYXRocyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW5QYXRoLCBvUGF0aHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2V0UGF0aHMocGF0aHMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBjYWxsYmFja3MgZm9yIG5ldyBsYXlvdXQgKHcvIGV4ZWN1dGlvbiBncm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGdldExheW91dENhbGxiYWNrcyhncmFwaHMsIHBhdGhzLCBjaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUGF0aDogb2xkQ2hpbGRyZW5QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lsZGNhcmQgY2FsbGJhY2tzIHdpdGggYXJyYXkgaW5wdXRzIChBTEwgLyBBTExTTUFMTEVSKSBuZWVkIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gZHVlIHRvIHRoZSBkZWxldGlvbiBvZiBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBnZXRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBvbGRQYXRocywgb2xkQ2hpbGRyZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkQXJyYXlJbnB1dHNPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGhzOiBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGg6IG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJSb290XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgWydjaGlsZHJlbiddXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGNoaWxkcmVuUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjaGlsZHJlblByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zyb250UGF0aF0gPSBjaGlsZHJlblByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdbXScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnNwbGl0KCcuJykuZmlsdGVyKGUgPT4gZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250T2JqID0gcGF0aChmcm9udFBhdGgsIGFwcGxpZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmcm9udE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyYXdsIGxheW91dCBuZWVkcyB0aGUgbnMvdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdGhzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub2xkT2JqLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub2xkT2JqLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXBwbGllZFByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvbGRPYmosIGJhc2VQYXRoLCBrZXlzKGFwcGxpZWRQcm9wcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gaXQgb25jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbXB1dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcFBhdGggPSBjaGlsZHJlblByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBhdGgoY2hpbGRyZW5Qcm9wUGF0aCwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW5QYXRoID0gY29uY2F0KGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKSwgWydwcm9wcyddLmNvbmNhdChjaGlsZHJlblByb3BQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBwYXRoKG9sZENoaWxkcmVuUGF0aCwgb2xkTGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXRocyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZW5jZSBlZGdlIGNhc2U6IGlmIHlvdSBleHBsaWNpdGx5IHVwZGF0ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyc2lzdGVuY2Uga2V5LCBvdGhlciBwcm9wcyBtYXkgY2hhbmdlIHRoYXQgcmVxdWlyZSB1c1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBmaXJlIGFkZGl0aW9uYWwgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkUHJvcHMgPSBwaWNrQnkoKF8sIGspID0+ICEoayBpbiBwcm9wcyksIGFwcGxpZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShhZGRlZFByb3BzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBncmFwaHM6IGN1cnJlbnRHcmFwaHMsIHBhdGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgaW5jbHVkZU9ic2VydmVycyhpZCwgYWRkZWRQcm9wcywgY3VycmVudEdyYXBocywgcGF0aHMpLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGluZm9ybWF0aW9uIGFib3V0IHBvdGVudGlhbGx5IHVwZGF0ZWQgb3V0cHV0cyB2cy4gdXBkYXRlZCBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGRyb3AgY2FsbGJhY2tzIGZyb20gZXhlY3V0aW9uIGdyb3VwcyB3aGVuIG5vIG91dHB1dFxuICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHRoZSBkb3duc3RyZWFtIGNhbGxiYWNrJ3MgaW5wdXRzIHdlcmUgbW9kaWZpZWRcbiAgICAgICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25NZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wczogbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhnZXRTdGF0ZSgpLnBhdGhzKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByb3BzOiBmbGF0dGVuKG1hcCgoW2lkLCB2YWx1ZV0pID0+IG1hcChwcm9wZXJ0eSA9PiBjb21iaW5lSWRBbmRQcm9wKHsgaWQsIHByb3BlcnR5IH0pLCBrZXlzKHZhbHVlKSksIHRvUGFpcnMoZGF0YSkpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIGlmIChjYi5jYWxsYmFjay5ub19vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdHMgPSBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYENhbGxiYWNrIGVycm9yIHdpdGggbm8gb3V0cHV0IGZyb20gaW5wdXQgJHtpbnB0c31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oW3BheWxvYWQub3V0cHV0c10pKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBDYWxsYmFjayBlcnJvciB1cGRhdGluZyAke291dHB1dHN9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudHNpZGVfZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lc3BhY2U6IG5zLCBmdW5jdGlvbl9uYW1lOiBmbiB9ID0gY2xpZW50c2lkZV9mdW5jdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgIHZpYSBjbGllbnRzaWRlIGZ1bmN0aW9uICR7bnN9LiR7Zm59YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnJvciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb3BzOiBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihjYi5nZXRPdXRwdXRzKGdldFN0YXRlKCkucGF0aHMpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJvcHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICBleGVjdXRlZC5sZW5ndGggPyByZW1vdmVFeGVjdXRlZENhbGxiYWNrcyhleGVjdXRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gYWRkQ29tcGxldGVkQ2FsbGJhY2tzKGV4ZWN1dGVkLmxlbmd0aCkgOiBudWxsLFxuICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkU3RvcmVkQ2FsbGJhY2tzKHN0b3JlZENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MocmVxdWVzdGVkQ2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGVkJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGFzc29jLCBmaW5kLCBwYXJ0aXRpb24gfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZGRFeGVjdXRlZENhbGxiYWNrcywgYWRkV2F0Y2hlZENhbGxiYWNrcywgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MsIHJlbW92ZVdhdGNoZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRBcHBTdGF0ZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0aW5nIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtkZWZlcnJlZCwgc2tpcHBlZE9yUmVhZHldID0gcGFydGl0aW9uKGNiID0+IGNiLmV4ZWN1dGlvblByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlLCBleGVjdXRpbmcpO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgZXhlY3V0aW5nLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyhleGVjdXRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGRlZmVycmVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3MoZGVmZXJyZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHNraXBwZWRPclJlYWR5Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkRXhlY3V0ZWRDYWxsYmFja3Moc2tpcHBlZE9yUmVhZHkubWFwKGNiID0+IGFzc29jKCdleGVjdXRpb25SZXN1bHQnLCBjYi5leGVjdXRpb25Qcm9taXNlLCBjYikpKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgICAgIGRlZmVycmVkLmZvckVhY2goYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYi5leGVjdXRpb25Qcm9taXNlO1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgd2F0Y2hlZCB9LCBhcHBMaWZlY3ljbGUsIGhvb2tzOiB7IGNhbGxiYWNrX3Jlc29sdmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYWxsYmFja19yZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkKGNiLmNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYHdhdGNoZWRgIGxpc3Qgc2luY2UgLSBvbiBjYWxsYmFjayBjb21wbGV0aW9uLCBhbm90aGVyIGNhbGxiYWNrIG1heSBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNhbGxiYWNrIGluc3RhbmNlIG9yIG9uZSB0aGF0IG1hdGNoZXMgaXRzIHByb21pc2UgKGVnLiBjb3VsZCBoYXZlIGJlZW4gcHJ1bmVkKVxuICAgICAgICAgICAgY29uc3QgY3VycmVudENiID0gZmluZChfY2IgPT4gX2NiID09PSBjYiB8fCBfY2IuZXhlY3V0aW9uUHJvbWlzZSA9PT0gY2IuZXhlY3V0aW9uUHJvbWlzZSwgd2F0Y2hlZCk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRDYikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBtb3ZlIHRvIGBleGVjdXRlZGAgYW5kIHJlbW92ZSBmcm9tIGB3YXRjaGVkYFxuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzKFtjdXJyZW50Q2JdKSxcbiAgICAgICAgICAgICAgICBhZGRFeGVjdXRlZENhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDYixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvblJlc3VsdDogcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MuZXhlY3V0aW5nJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGdldFBlbmRpbmdDYWxsYmFja3MgfSBmcm9tICcuLi91dGlscy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgc2V0SXNMb2FkaW5nIH0gZnJvbSAnLi4vYWN0aW9ucy9pc0xvYWRpbmcnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzLCBpc0xvYWRpbmcgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdDYWxsYmFja3MgPSBnZXRQZW5kaW5nQ2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBCb29sZWFuKHBlbmRpbmdDYWxsYmFja3MubGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzTG9hZGluZyAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0SXNMb2FkaW5nKG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBmaW5kLCBmbGF0dGVuLCBtYXAsIHBhcnRpdGlvbiwgc29ydCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFkZEJsb2NrZWRDYWxsYmFja3MsIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcywgYWdncmVnYXRlQ2FsbGJhY2tzLCBleGVjdXRlQ2FsbGJhY2ssIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MsIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IGlzQXBwUmVhZHkgZnJvbSAnLi4vYWN0aW9ucy9pc0FwcFJlYWR5JztcbmltcG9ydCB7IGdldEFwcFN0YXRlIH0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmNvbnN0IHNvcnRQcmlvcml0eSA9IChjMSwgYzIpID0+IHtcbiAgICByZXR1cm4gKGMxLnByaW9yaXR5ID8/ICcnKSA+IChjMi5wcmlvcml0eSA/PyAnJykgPyAtMSA6IDE7XG59O1xuY29uc3QgZ2V0U3Rhc2ggPSAoY2IsIHBhdGhzKSA9PiB7XG4gICAgY29uc3QgeyBnZXRPdXRwdXRzIH0gPSBjYjtcbiAgICBjb25zdCBhbGxPdXRwdXRzID0gZ2V0T3V0cHV0cyhwYXRocyk7XG4gICAgY29uc3QgZmxhdE91dHB1dHMgPSBmbGF0dGVuKGFsbE91dHB1dHMpO1xuICAgIGNvbnN0IGFsbFByb3BJZHMgPSBbXTtcbiAgICBjb25zdCByZXFPdXQgPSB7fTtcbiAgICBmbGF0T3V0cHV0cy5mb3JFYWNoKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICBjb25zdCBpZE91dCA9IChyZXFPdXRbaWRTdHJdID0gcmVxT3V0W2lkU3RyXSB8fCBbXSk7XG4gICAgICAgIGlkT3V0LnB1c2gocHJvcGVydHkpO1xuICAgICAgICBhbGxQcm9wSWRzLnB1c2goY29tYmluZUlkQW5kUHJvcCh7IGlkOiBpZFN0ciwgcHJvcGVydHkgfSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGFsbE91dHB1dHMsIGFsbFByb3BJZHMgfTtcbn07XG5jb25zdCBnZXRJZHMgPSAoY2IsIHBhdGhzKSA9PiB7XG4gICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAgIC4uLmZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksXG4gICAgICAgIC4uLmZsYXR0ZW4oY2IuZ2V0U3RhdGUocGF0aHMpKVxuICAgIF07XG4gICAgY29uc3QgdW5pcXVlSWRzID0gbmV3IE1hcChpdGVtcy5tYXAoaXRlbSA9PiBbc3RyaW5naWZ5SWQoaXRlbS5pZCksIGl0ZW1dKSk7XG4gICAgY29uc3QgdW5pcXVlSXRlbXMgPSBBcnJheS5mcm9tKHVuaXF1ZUlkcy52YWx1ZXMoKSk7XG4gICAgcmV0dXJuIHVuaXF1ZUl0ZW1zO1xufTtcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiBhc3luYyAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRpbmcsIHdhdGNoZWQgfSwgY29uZmlnLCBob29rcywgbGF5b3V0LCBwYXRocywgYXBwTGlmZWN5Y2xlIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgeyBjYWxsYmFja3M6IHsgcHJpb3JpdGl6ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKGFwcExpZmVjeWNsZSAhPT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBNYXRoLm1heCgwLCAxMiAtIGV4ZWN1dGluZy5sZW5ndGggLSB3YXRjaGVkLmxlbmd0aCk7XG4gICAgICAgIC8vIE9yZGVyIHByaW9yaXRpemVkIGNhbGxiYWNrcyBiYXNlZCBvbiBkZXB0aCBhbmQgYnJlYWR0aCBvZiBjYWxsYmFjayBjaGFpblxuICAgICAgICBwcmlvcml0aXplZCA9IHNvcnQoc29ydFByaW9yaXR5LCBwcmlvcml0aXplZCk7XG4gICAgICAgIC8vIERpdmlkZSBiZXR3ZWVuIHN5bmMgYW5kIGFzeW5jXG4gICAgICAgIGNvbnN0IFtzeW5jQ2FsbGJhY2tzLCBhc3luY0NhbGxiYWNrc10gPSBwYXJ0aXRpb24oY2IgPT4gaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSkgPT09IHRydWUsIHByaW9yaXRpemVkKTtcbiAgICAgICAgY29uc3QgcGlja2VkU3luY0NhbGxiYWNrcyA9IHN5bmNDYWxsYmFja3Muc2xpY2UoMCwgYXZhaWxhYmxlKTtcbiAgICAgICAgY29uc3QgcGlja2VkQXN5bmNDYWxsYmFja3MgPSBhc3luY0NhbGxiYWNrcy5zbGljZSgwLCBhdmFpbGFibGUgLSBwaWNrZWRTeW5jQ2FsbGJhY2tzLmxlbmd0aCk7XG4gICAgICAgIGlmIChwaWNrZWRTeW5jQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwaWNrZWRTeW5jQ2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgICBhZGRFeGVjdXRpbmdDYWxsYmFja3MobWFwKGNiID0+IGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgZ2V0U3Rhc2goY2IsIHBhdGhzKSwgZGlzcGF0Y2gsIGdldFN0YXRlKSwgcGlja2VkU3luY0NhbGxiYWNrcykpXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpY2tlZEFzeW5jQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBtYXAoY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAuLi5nZXRTdGFzaChjYiwgcGF0aHMpLFxuICAgICAgICAgICAgICAgIGlzUmVhZHk6IGlzQXBwUmVhZHkobGF5b3V0LCBwYXRocywgZ2V0SWRzKGNiLCBwYXRocykpXG4gICAgICAgICAgICB9KSwgcGlja2VkQXN5bmNDYWxsYmFja3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwaWNrZWRBc3luY0NhbGxiYWNrcyksXG4gICAgICAgICAgICAgICAgYWRkQmxvY2tlZENhbGxiYWNrcyhkZWZlcnJlZClcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIGRlZmVycmVkLmZvckVhY2goYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2IuaXNSZWFkeTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBibG9ja2VkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYGJsb2NrZWRgIGxpc3Qgc2luY2UgLSBvblxuICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGNvbXBsZXRpb24sIGFub3RoZXIgY2FsbGJhY2sgbWF5IGJlIGNhbmNlbGxlZFxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNhbGxiYWNrIGluc3RhbmNlIG9yIG9uZSB0aGF0IG1hdGNoZXMgaXRzIHByb21pc2VcbiAgICAgICAgICAgICAgICAvLyAoZWcuIGNvdWxkIGhhdmUgYmVlbiBwcnVuZWQpXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENiID0gZmluZChfY2IgPT4gX2NiID09PSBjYiB8fCBfY2IuaXNSZWFkeSA9PT0gY2IuaXNSZWFkeSwgYmxvY2tlZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRpbmdDYWxsYmFjayA9IGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgY2IsIGRpc3BhdGNoLCBnZXRTdGF0ZSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyhbY2JdKSxcbiAgICAgICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKFtleGVjdXRpbmdDYWxsYmFja10pXG4gICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MucHJpb3JpdGl6ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBhbGwsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLCBncm91cEJ5LCBpbmNsdWRlcywgaW50ZXJzZWN0aW9uLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBtZXJnZUxlZnQsIG1lcmdlV2l0aCwgcGx1Y2ssIHJlZHVjZSwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzLCBhZGRQcmlvcml0aXplZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZGRXYXRjaGVkQ2FsbGJhY2tzLCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzLCBhZGRCbG9ja2VkQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGlzTXVsdGlWYWx1ZWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRSZWFkeUNhbGxiYWNrcywgZ2V0VW5pcXVlSWRlbnRpZmllciwgcHJ1bmVDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuLy4uL3V0aWxzL3dhaXQnO1xuaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdCgwKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MsIGNhbGxiYWNrczogeyBwcmlvcml0aXplZCwgYmxvY2tlZCwgZXhlY3V0aW5nLCB3YXRjaGVkLCBzdG9yZWQgfSwgcGF0aHMsIGdyYXBocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHsgY2FsbGJhY2tzOiB7IHJlcXVlc3RlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsUmVxdWVzdGVkID0gcmVxdWVzdGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMC4gUHJ1bmUgY2lyY3VsYXIgY2FsbGJhY2tzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgdGhlIGxvb3BcbiAgICAgICAgICAgIC0gY2IuY2FsbGJhY2sgaW5jbHVkZWQgaW4gY2IucHJlZGVjZXNzb3JzXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHJDaXJjdWxhcnMgPSBmaWx0ZXIoY2IgPT4gaW5jbHVkZXMoY2IuY2FsbGJhY2ssIGNiLnByZWRlY2Vzc29ycyA/PyBbXSksIHJlcXVlc3RlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgY2lyY3VsYXJzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgckNpcmN1bGFycyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAxLiBSZW1vdmUgZHVwbGljYXRlZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgLSBnaXZlIHByZWNlZGVuY2UgdG8gbmV3ZXIgY2FsbGJhY2tzIG92ZXIgb2xkZXIgb25lc1xuICAgICAgICAqL1xuICAgICAgICBsZXQgckR1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgck1lcmdlZER1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgcmVxdWVzdGVkKSkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpZiBpdHMgdGhlIG9ubHkgb25lIG9mIGl0cyBraW5kXG4gICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZmluZChjYiA9PiBjYi5pbml0aWFsQ2FsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBjYWxsYmFjayBpZiBpdCdzIG5vdCBhbG9uZVxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcy5wdXNoKGluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFdpdGhvdXRJbml0aWFsID0gZ3JvdXAuZmlsdGVyKGNiID0+IGNiICE9PSBpbml0aWFsKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBXaXRob3V0SW5pdGlhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBjYWxsYmFjayBiZXNpZGUgdGhlIGluaXRpYWwgb25lLCBrZWVwIHRoYXQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFdpdGhvdXRJbml0aWFsWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBtZXJnZSBhbGwgcmVtYWluaW5nIGNhbGxiYWNrcyB0b2dldGhlclxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcyA9IGNvbmNhdChyRHVwbGljYXRlcywgZ3JvdXBXaXRob3V0SW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2gobWVyZ2VMZWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiByZWR1Y2UobWVyZ2VXaXRoKE1hdGgubWF4KSwge30sIHBsdWNrKCdjaGFuZ2VkUHJvcElkcycsIGdyb3VwV2l0aG91dEluaXRpYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkdyb3VwOiBmaWx0ZXIoZXhnID0+IEJvb2xlYW4oZXhnKSwgcGx1Y2soJ2V4ZWN1dGlvbkdyb3VwJywgZ3JvdXBXaXRob3V0SW5pdGlhbCkpLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgICAgICAgICB9LCBncm91cFdpdGhvdXRJbml0aWFsLnNsaWNlKC0xKVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgZHVwbGljYXRlcyB3aWxsIGJlIHJlbW92ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gck1lcmdlZER1cGxpY2F0ZXM7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAyLiBSZW1vdmUgZHVwbGljYXRlZCBgcHJpb3JpdGl6ZWRgLCBgZXhlY3V0aW5nYCBhbmQgYHdhdGNoaW5nYCBjYWxsYmFja3NcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgICAgIEV4dHJhY3QgYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbGJhY2sgZnJvbSBlYWNoIElPUy1rZXkgZ3JvdXBcbiAgICAgICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgYHByaW9yaXRpemVkYCBhbmQgZHVwbGljYXRlcy5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcER1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChwcmlvcml0aXplZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGJEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoYmxvY2tlZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGVEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoZXhlY3V0aW5nLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3Qgd0R1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdCh3YXRjaGVkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDMuIE1vZGlmeSBvciByZW1vdmUgY2FsbGJhY2tzIHRoYXQgYXJlIG91dHB1dHRpbmcgdG8gbm9uLWV4aXN0aW5nIGxheW91dCBgaWRgLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IGFkZGVkOiByQWRkZWQsIHJlbW92ZWQ6IHJSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhyZXF1ZXN0ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogcEFkZGVkLCByZW1vdmVkOiBwUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MocHJpb3JpdGl6ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogYkFkZGVkLCByZW1vdmVkOiBiUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MoYmxvY2tlZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBlQWRkZWQsIHJlbW92ZWQ6IGVSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhleGVjdXRpbmcsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogd0FkZGVkLCByZW1vdmVkOiB3UmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3Mod2F0Y2hlZCwgcGF0aHMpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBjb25jYXQoZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJSZW1vdmVkKSwgckFkZGVkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDQuIEZpbmQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIG91dHN0YW5kaW5nIG91dHB1dCAoYXMgZWl0aGVyIGlucHV0IG9yIHN0YXRlKVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVhZHlDYWxsYmFja3MgPSBnZXRSZWFkeUNhbGxiYWNrcyhwYXRocywgcmVxdWVzdGVkLCBwZW5kaW5nQ2FsbGJhY2tzLCBncmFwaHMpO1xuICAgICAgICBsZXQgb2xkQmxvY2tlZCA9IFtdO1xuICAgICAgICBsZXQgbmV3QmxvY2tlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgOlxuICAgICAgICAgKiAtIG5vIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgKiAtIGF0IGxlYXN0IG9uZSByZXF1ZXN0ZWQgY2FsbGJhY2tcbiAgICAgICAgICogLSBubyBhZGRpdGlvbmFsIHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIGNhbiBhc3N1bWU6XG4gICAgICAgICAqIC0gdGhlIHJlcXVlc3RlZCBjYWxsYmFja3MgYXJlIHBhcnQgb2YgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BcbiAgICAgICAgICpcbiAgICAgICAgICogdGhlbiByZWN1cnNpdmVseTpcbiAgICAgICAgICogLSBhc3N1bWUgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0IGlzIHJlYWR5ICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBsb29wKVxuICAgICAgICAgKiAtIGNoZWNrIHdoYXQgY2FsbGJhY2tzIGFyZSBibG9ja2VkIC8gcmVhZHkgd2l0aCB0aGUgYXNzdW1wdGlvblxuICAgICAgICAgKiAtIHVwZGF0ZSB0aGUgbWlzc2luZyBwcmVkZWNlc3NvcnMgYmFzZWQgb24gYXNzdW1wdGlvbnNcbiAgICAgICAgICogLSBjb250aW51ZSB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGNhbmRpZGF0ZXNcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGlmICghcmVhZHlDYWxsYmFja3MubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoID09PSBwZW5kaW5nQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aGlsZSAoY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgMXN0IGNhbGxiYWNrIGlzIHJlYWR5IGFuZFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW5kaWRhdGVzIC8gcmVhZHlDYWxsYmFja3MgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrID0gY2FuZGlkYXRlc1swXTtcbiAgICAgICAgICAgICAgICByZWFkeUNhbGxiYWNrcy5wdXNoKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBjYW5kaWRhdGVzIGFyZSBub3QgYmxvY2tlZCBieSBjdXJyZW50IGFzc3VtcHRpb25zXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGdldFJlYWR5Q2FsbGJhY2tzKHBhdGhzLCBjYW5kaWRhdGVzLCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2tlZCByZXF1ZXN0cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdGhlIGNhbGxiYWNrIGFzIGEgcHJlZGVjZXNzb3JcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2VkQnlBc3N1bXB0aW9ucyA9IGRpZmZlcmVuY2UoY2FuZGlkYXRlcywgY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBmaWx0ZXIoY2IgPT4gIWNiLnByZWRlY2Vzc29ycyB8fFxuICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXMocmVhZHlDYWxsYmFjay5jYWxsYmFjaywgY2IucHJlZGVjZXNzb3JzKSwgYmxvY2tlZEJ5QXNzdW1wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9sZEJsb2NrZWQgPSBjb25jYXQob2xkQmxvY2tlZCwgbW9kaWZpZWQpO1xuICAgICAgICAgICAgICAgIG5ld0Jsb2NrZWQgPSBjb25jYXQobmV3QmxvY2tlZCwgbW9kaWZpZWQubWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnM6IGNvbmNhdChjYi5wcmVkZWNlc3NvcnMgPz8gW10sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2suY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgb2xkQmxvY2tlZCksIG5ld0Jsb2NrZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgNS4gUHJ1bmUgY2FsbGJhY2tzIHRoYXQgYmVjYW1lIGlycmVsZXZhbnQgaW4gdGhlaXIgYGV4ZWN1dGlvbkdyb3VwYFxuICAgICAgICAqL1xuICAgICAgICAvLyBHcm91cCBieSBleGVjdXRpb25Hcm91cCwgZHJvcCBub24tZXhlY3V0aW9uR3JvdXAgY2FsbGJhY2tzXG4gICAgICAgIC8vIHRob3NlIHdlcmUgbm90IHRyaWdnZXJlZCBieSBsYXlvdXQgY2hhbmdlcyBhbmQgZG9uJ3QgaGF2ZSBcInN0cm9uZ1wiIGludGVyZGVwZW5kZW5jeSBmb3JcbiAgICAgICAgLy8gY2FsbGJhY2sgY2hhaW4gY29tcGxldGlvblxuICAgICAgICBjb25zdCBwZW5kaW5nR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZmlsdGVyKGNiID0+ICFpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCkpO1xuICAgICAgICBjb25zdCBkcm9wcGVkID0gZmlsdGVyKGNiID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGBzdG9yZWRgIGNhbGxiYWNrIGZvciB0aGUgZ3JvdXAsIG5vIG91dHB1dHMgd2VyZSBkcm9wcGVkIC0+IGBjYmAgaXMga2VwdFxuICAgICAgICAgICAgaWYgKCFjYi5leGVjdXRpb25Hcm91cCB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIGlucHV0cyBmb3IgYGNiYFxuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSkpO1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcG90ZW50aWFsbHkgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgYWxsUHJvcHMgPSBmbGF0dGVuKG1hcChnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEuYWxsUHJvcHMsIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdKSk7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gZmxhdHRlbihtYXAoZ2NiID0+IGdjYi5leGVjdXRpb25NZXRhLnVwZGF0ZWRQcm9wcywgcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0pKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB1cGRhdGVkIHByb3BzIGFuZCB0aGUgaW5wdXRzLFxuICAgICAgICAgICAgLy8gKyB0aGVyZSdzIG5vIHByb3BzIHRoYXQgYXJlbid0IGNvdmVyZWQgYnkgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMsXG4gICAgICAgICAgICAvLyBhbmQgbm90IGFsbCBpbnB1dHMgYXJlIG11bHRpIHZhbHVlZFxuICAgICAgICAgICAgLy8gLT4gZHJvcCBgY2JgXG4gICAgICAgICAgICBjb25zdCByZXMgPSBpc0VtcHR5KGludGVyc2VjdGlvbihpbnB1dHMsIHVwZGF0ZWQpKSAmJlxuICAgICAgICAgICAgICAgIGlzRW1wdHkoZGlmZmVyZW5jZShpbnB1dHMsIGFsbFByb3BzKSkgJiZcbiAgICAgICAgICAgICAgICAhYWxsKGlzTXVsdGlWYWx1ZWQsIGNiLmNhbGxiYWNrLmlucHV0cyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBkcm9wcGVkKTtcbiAgICAgICAgcmVhZHlDYWxsYmFja3MgPSBkaWZmZXJlbmNlKHJlYWR5Q2FsbGJhY2tzLCBkcm9wcGVkKTtcbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgaW5pdGlhbFJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmZXJlbmNlKGluaXRpYWxSZXF1ZXN0ZWQsIHJlcXVlc3RlZCk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBhZGRlZC5sZW5ndGggPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoYWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzKHJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGR1cGxpY2F0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBwRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGJEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYkR1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIGVEdXBsaWNhdGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHdEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZVdhdGNoZWRDYWxsYmFja3Mod0R1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIFBydW5lIGNhbGxiYWNrc1xuICAgICAgICAgICAgcFJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocFJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHBBZGRlZC5sZW5ndGggPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhwQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYlJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJBZGRlZC5sZW5ndGggPyBhZGRCbG9ja2VkQ2FsbGJhY2tzKGJBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZVJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBlQWRkZWQubGVuZ3RoID8gYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKGVBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgd1JlbW92ZWQubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3UmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgd0FkZGVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3Mod0FkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBQcm9tb3RlIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhyZWFkeUNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5yZXF1ZXN0ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZpbHRlciwgZ3JvdXBCeSwgaXNOaWwsIHBhcnRpdGlvbiwgcmVkdWNlLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgc3RvcmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtudWxsR3JvdXBDYWxsYmFja3MsIGdyb3VwQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihjYiA9PiBpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGdyb3VwQ2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBwZW5kaW5nQ2FsbGJhY2tzKSk7XG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSByZWR1Y2UoKHJlcywgW2V4ZWN1dGlvbkdyb3VwLCBleGVjdXRpb25Hcm91cENhbGxiYWNrc10pID0+ICFwZW5kaW5nR3JvdXBzW2V4ZWN1dGlvbkdyb3VwXVxuICAgICAgICAgICAgPyBjb25jYXQocmVzLCBleGVjdXRpb25Hcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgIDogcmVzLCBbXSwgdG9QYWlycyhleGVjdXRpb25Hcm91cHMpKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIG51bGxHcm91cENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVN0b3JlZENhbGxiYWNrcyhudWxsR3JvdXBDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgZHJvcHBlZC5sZW5ndGggPyByZW1vdmVTdG9yZWRDYWxsYmFja3MoZHJvcHBlZCkgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3Muc3RvcmVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiLyoqXG4gKiBHZW5lcmFsaXplZCBwZXJzaXN0ZW5jZSBmb3IgY29tcG9uZW50IHByb3BzXG4gKlxuICogV2hlbiB1c2VycyBpbnB1dCBuZXcgcHJvcCB2YWx1ZXMsIHRoZXkgY2FuIGJlIHN0b3JlZCBhbmQgcmVhcHBsaWVkIGxhdGVyLFxuICogd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlY3JlYXRlZCAoY2hhbmdpbmcgYFRhYmAgZm9yIGV4YW1wbGUpIG9yIHdoZW4gdGhlXG4gKiBwYWdlIGlzIHJlbG9hZGVkIChkZXBlbmRpbmcgb24gYHBlcnNpc3RlbmNlX3R5cGVgKS4gU3RvcmFnZSBpcyB0aWVkIHRvXG4gKiBjb21wb25lbnQgSUQsIGFuZCB0aGUgcHJvcCB2YWx1ZXMgd2lsbCBub3QgYmUgc3RvcmVkIHdpdGggY29tcG9uZW50c1xuICogd2l0aG91dCBhbiBJRC5cbiAqXG4gKiBSZW5kZXJlciBoYW5kbGVzIHRoZSBtZWNoYW5pY3MsIGJ1dCBjb21wb25lbnRzIG11c3QgZGVmaW5lIGEgZmV3IHByb3BzOlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlYDogYm9vbGVhbiwgc3RyaW5nLCBvciBudW1iZXIuIEZvciBzaW1wbGUgdXNhZ2UsIHNldCB0byBgdHJ1ZWBcbiAqICAgdG8gZW5hYmxlIHBlcnNpc3RlbmNlLCBvbWl0IG9yIHNldCBgZmFsc2VgIHRvIGRpc2FibGUuIEZvciBtb3JlIGNvbXBsZXhcbiAqICAgc2NlbmFyaW9zLCB1c2UgYW55IHRydXRoeSB2YWx1ZSwgYW5kIGNoYW5nZSB0byBhICpkaWZmZXJlbnQqIHRydXRoeSB2YWx1ZVxuICogICB3aGVuIHlvdSB3YW50IHRoZSBwZXJzaXN0ZWQgdmFsdWVzIGNsZWFyZWQuIChtb2RlbGVkIG9mZiBgdWlyZXZpc2lvbmAgaW4pXG4gKiAgIHBsb3RseS5qc1xuICogICBUeXBpY2FsbHkgc2hvdWxkIGhhdmUgbm8gZGVmYXVsdCwgYnV0IHRoZSBvdGhlciBwZXJzaXN0ZW5jZSBwcm9wcyBzaG91bGRcbiAqICAgaGF2ZSBkZWZhdWx0cywgc28gYWxsIGEgdXNlciBuZWVkcyB0byBkbyB0byBlbmFibGUgcGVyc2lzdGVuY2UgaXMgc2V0IHRoaXNcbiAqICAgb25lIHByb3AuXG4gKlxuICogLSBgcGVyc2lzdGVkX3Byb3BzYDogYXJyYXkgb2YgcHJvcCBuYW1lcyBvciBcIm5lc3RlZCBwcm9wIElEc1wiIGFsbG93ZWQgdG9cbiAqICAgcGVyc2lzdC4gTm9ybWFsbHkgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvcHMsXG4gKiAgIHNvIHRoZXkgY2FuIGFsbCBiZSBlbmFibGVkIGF0IG9uY2UuIFRoZSBtYWluIGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmXG4gKiAgIHRoZXJlJ3MgYSBwcm9wIHRoYXQgKmNhbiogYmUgcGVyc2lzdGVkIGJ1dCBtb3N0IHVzZXJzIHdvdWxkbid0IHdhbnQgdGhpcy5cbiAqICAgQSBuZXN0ZWQgcHJvcCBJRCBkZXNjcmliZXMgKnBhcnQqIG9mIGEgcHJvcCB0byBzdG9yZS4gSXQgbXVzdCBiZVxuICogICBcIjxwcm9wTmFtZT4uPHBpZWNlPlwiIHdoZXJlIHByb3BOYW1lIGlzIHRoZSBwcm9wIHRoYXQgaGFzIHRoaXMgaW5mbywgYW5kXG4gKiAgIHBpZWNlIG1heSBvciBtYXkgbm90IG1hcCB0byB0aGUgZXhhY3Qgc3Vic3RydWN0dXJlIGJlaW5nIHN0b3JlZCBidXQgaXNcbiAqICAgbWVhbmluZ2Z1bCB0byB0aGUgdXNlci4gRm9yIGV4YW1wbGUsIGluIGBkYXNoX3RhYmxlYCwgYGNvbHVtbnMubmFtZWBcbiAqICAgc3RvcmVzIGBjb2x1bW5zW2ldLm5hbWVgIGZvciBhbGwgY29sdW1ucyBgaWAuIE5lc3RlZCBwcm9wcyBhbHNvIG5lZWRcbiAqICAgZW50cmllcyBpbiBgcGVyc2lzdGVuY2VUcmFuc2Zvcm1zYCAtIHNlZSBiZWxvdy5cbiAqXG4gKiAtIGBwZXJzaXN0ZW5jZV90eXBlYDogb25lIG9mIFwibG9jYWxcIiwgXCJzZXNzaW9uXCIsIG9yIFwibWVtb3J5XCIsIGp1c3QgbGlrZVxuICogICBgZGNjLlN0b3JlYC4gQnV0IHRoZSBkZWZhdWx0IGhlcmUgc2hvdWxkIGJlIFwibG9jYWxcIiBiZWNhdXNlIHRoZSBtYWluIHVzZVxuICogICBjYXNlIGlzIHRvIG1haW50YWluIHNldHRpbmdzIGFjcm9zcyByZWxvYWRzLlxuICpcbiAqIElmIGFueSBgcGVyc2lzdGVkX3Byb3BzYCBhcmUgbmVzdGVkIHByb3AgSURzLCB0aGUgY29tcG9uZW50IHNob3VsZCBkZWZpbmUgYVxuICogY2xhc3MgcHJvcGVydHkgKG5vdCBhIFJlYWN0IHByb3ApIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgLCBhcyBhbiBvYmplY3Q6XG4gKiB7XG4gKiAgIFtwcm9wTmFtZV06IHtcbiAqICAgICBbcGllY2VdOiB7XG4gKiAgICAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gdmFsdWVUb1N0b3JlLFxuICogICAgICAgYXBwbHk6IChzdG9yZWRWYWx1ZSwgcHJvcFZhbHVlKSA9PiBuZXdQcm9wVmFsdWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIC0gYGV4dHJhY3RgIHR1cm5zIGEgcHJvcCB2YWx1ZSBpbnRvIGEgcmVkdWNlZCB2YWx1ZSB0byBzdG9yZS5cbiAqIC0gYGFwcGx5YCBwdXRzIGFuIGV4dHJhY3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIHByb3AuIE1ha2Ugc3VyZSB0aGlzIGNyZWF0ZXNcbiAqICAgYSBuZXcgb2JqZWN0IHJhdGhlciB0aGFuIG11dGF0aW5nIGBwcm9WYWx1ZWAsIGFuZCB0aGF0IGlmIHRoZXJlIGFyZVxuICogICBtdWx0aXBsZSBgcGllY2VgIGVudHJpZXMgZm9yIG9uZSBgcHJvcE5hbWVgLCB0aGVpciBgYXBwbHlgIGZ1bmN0aW9uc1xuICogICBjb21tdXRlIC0gd2hpY2ggc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSBpZiB0aGV5IGV4dHJhY3QgYW5kIGFwcGx5XG4gKiAgIG5vbi1pbnRlcnNlY3RpbmcgcGFydHMgb2YgdGhlIGZ1bGwgcHJvcC5cbiAqIFlvdSBvbmx5IG5lZWQgdG8gZGVmaW5lIHRoZXNlIGZvciB0aGUgcHJvcHMgdGhhdCBuZWVkIHRoZW0uXG4gKiBJdCdzIGltcG9ydGFudCB0aGF0IGBleHRyYWN0YCBwdWxscyBvdXQgKm9ubHkqIHRoZSByZWxldmFudCBwaWVjZXMgb2YgdGhlXG4gKiBwcm9wLCBiZWNhdXNlIHBlcnNpc3RlbmNlIGlzIG9ubHkgbWFpbnRhaW5lZCBpZiB0aGUgZXh0cmFjdGVkIHZhbHVlIG9mIHRoZVxuICogcHJvcCBiZWZvcmUgYXBwbHlpbmcgcGVyc2lzdGVuY2UgaXMgdGhlIHNhbWUgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdXNlcidzXG4gKiBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB7XG4gICAgZXF1YWxzLFxuICAgIGZpbHRlcixcbiAgICBmb3JFYWNoLFxuICAgIGtleXMsXG4gICAgbGVuc1BhdGgsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBzZXQsXG4gICAgdHlwZVxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuL3JlZ2lzdHJ5JztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc3RvcmVQcmVmaXggPSAnX2Rhc2hfcGVyc2lzdGVuY2UuJztcblxuZnVuY3Rpb24gZXJyKGUpIHtcbiAgICBjb25zdCBlcnJvciA9IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlKSA6IGU7XG5cbiAgICByZXR1cm4gY3JlYXRlQWN0aW9uKCdPTl9FUlJPUicpKHtcbiAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgZXJyb3JcbiAgICB9KTtcbn1cblxuLypcbiAqIERvZXMgYSBrZXkgZml0IHRoaXMgcHJlZml4PyBNdXN0IGVpdGhlciBiZSBhbiBleGFjdCBtYXRjaFxuICogb3IsIGlmIGEgc2VwYXJhdG9yIGlzIHByb3ZpZGVkLCBhIHNjb3BlZCBtYXRjaCAtIGV4YWN0IHByZWZpeFxuICogZm9sbG93ZWQgYnkgdGhlIHNlcGFyYXRvciAodGhlbiBhbnl0aGluZyBlbHNlKVxuICovXG5mdW5jdGlvbiBrZXlQcmVmaXhNYXRjaChwcmVmaXgsIHNlcGFyYXRvcikge1xuICAgIGNvbnN0IGZ1bGxTdHIgPSBwcmVmaXggKyBzZXBhcmF0b3I7XG4gICAgY29uc3QgZnVsbExlbiA9IGZ1bGxTdHIubGVuZ3RoO1xuICAgIHJldHVybiBrZXkgPT4ga2V5ID09PSBwcmVmaXggfHwga2V5LnN1YnN0cigwLCBmdWxsTGVuKSA9PT0gZnVsbFN0cjtcbn1cblxuY29uc3QgVU5ERUZJTkVEID0gJ1UnO1xuY29uc3QgX3BhcnNlID0gdmFsID0+ICh2YWwgPT09IFVOREVGSU5FRCA/IHVuZGVmaW5lZCA6IEpTT04ucGFyc2UodmFsIHx8IG51bGwpKTtcbmNvbnN0IF9zdHJpbmdpZnkgPSB2YWwgPT4gKHZhbCA9PT0gdW5kZWZpbmVkID8gVU5ERUZJTkVEIDogSlNPTi5zdHJpbmdpZnkodmFsKSk7XG5cbmNsYXNzIFdlYlN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrRW5kKSB7XG4gICAgICAgIHRoaXMuX25hbWUgPSBiYWNrRW5kO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gd2luZG93W2JhY2tFbmRdO1xuICAgIH1cblxuICAgIGhhc0l0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIC8vIG5vdGU6IF9zdG9yYWdlLmdldEl0ZW0gcmV0dXJucyBudWxsIG9uIG1pc3Npbmcga2V5c1xuICAgICAgICAvLyBhbmQgSlNPTi5wYXJzZShudWxsKSByZXR1cm5zIG51bGwgYXMgd2VsbFxuICAgICAgICByZXR1cm4gX3BhcnNlKHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShzdG9yZVByZWZpeCArIGtleSkpO1xuICAgIH1cblxuICAgIF9zZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gdW5wcm90ZWN0ZWQgdmVyc2lvbiBvZiBzZXRJdGVtLCBmb3IgdXNlIGJ5IHRyeUdldFdlYlN0b3JlXG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShzdG9yZVByZWZpeCArIGtleSwgX3N0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIHRoZSByZWd1bGFyIGtleS0+dmFsdWUgdG8gc2V0LCBzZXRJdGVtIHRha2VzXG4gICAgICogZGlzcGF0Y2ggYXMgYSBwYXJhbWV0ZXIsIHNvIGl0IGNhbiByZXBvcnQgT09NIHRvIGRldnRvb2xzXG4gICAgICovXG4gICAgc2V0SXRlbShrZXksIHZhbHVlLCBkaXNwYXRjaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgZXJyKFxuICAgICAgICAgICAgICAgICAgICBgJHtrZXl9IGZhaWxlZCB0byBzYXZlIGluICR7dGhpcy5fbmFtZX0uIFBlcnNpc3RlZCBwcm9wcyBtYXkgYmUgbG9zdC5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFRPRE86IGF0IHNvbWUgcG9pbnQgd2UgbWF5IHdhbnQgdG8gY29udmVydCB0aGlzIHRvIGZhbGwgYmFja1xuICAgICAgICAgICAgLy8gb24gbWVtb3J5LCBwdWxsaW5nIG91dCBhbGwgcGVyc2lzdGVuY2Uga2V5cyBhbmQgcHV0dGluZyB0aGVtXG4gICAgICAgICAgICAvLyBpbiBhIE1lbVN0b3JlIHRoYXQgZ2V0cyB1c2VkIGZyb20gdGhlbiBvbndhcmQuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGtleSkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogY2xlYXIgbWF0Y2hpbmcga2V5cyBtYXRjaGluZyAob3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGRvdCBhbmQgbW9yZVxuICAgICAqIGNoYXJhY3RlcnMpIC0gb3IgYWxsIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RvcmUgaWYgbm8gcHJlZml4LlxuICAgICAqL1xuICAgIGNsZWFyKGtleVByZWZpeCkge1xuICAgICAgICBjb25zdCBmdWxsUHJlZml4ID0gc3RvcmVQcmVmaXggKyAoa2V5UHJlZml4IHx8ICcnKTtcbiAgICAgICAgY29uc3Qga2V5TWF0Y2ggPSBrZXlQcmVmaXhNYXRjaChmdWxsUHJlZml4LCBrZXlQcmVmaXggPyAnLicgOiAnJyk7XG4gICAgICAgIGNvbnN0IGtleXNUb1JlbW92ZSA9IFtdO1xuICAgICAgICAvLyAyLXN0ZXAgcHJvY2Vzcywgc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGFueSBwYXJ0aWN1bGFyIGJlaGF2aW9yIG9mXG4gICAgICAgIC8vIGtleSBvcmRlciB3aGlsZSByZW1vdmluZyBzb21lXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc3RvcmFnZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHRoaXMuX3N0b3JhZ2Uua2V5KGkpO1xuICAgICAgICAgICAgaWYgKGtleU1hdGNoKGZ1bGxLZXkpKSB7XG4gICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goZnVsbEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaChrID0+IHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShrKSwga2V5c1RvUmVtb3ZlKTtcbiAgICB9XG59XG5cbmNsYXNzIE1lbVN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIGhhc0l0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICAvLyBydW4gdGhpcyBzdG9yYWdlIHRocm91Z2ggSlNPTiB0b28gc28gd2Uga25vdyB3ZSBnZXQgYSBmcmVzaCBvYmplY3RcbiAgICAgICAgLy8gZWFjaCByZXRyaWV2YWxcbiAgICAgICAgcmV0dXJuIF9wYXJzZSh0aGlzLl9kYXRhW2tleV0pO1xuICAgIH1cblxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSBfc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGtleSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGNsZWFyKGtleVByZWZpeCkge1xuICAgICAgICBpZiAoa2V5UHJlZml4KSB7XG4gICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgIGtleSA9PiBkZWxldGUgdGhpcy5fZGF0YVtrZXldLFxuICAgICAgICAgICAgICAgIGZpbHRlcihrZXlQcmVmaXhNYXRjaChrZXlQcmVmaXgsICcuJyksIGtleXModGhpcy5fZGF0YSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBNYWtlIGEgc3RyaW5nIDJeMTYgY2hhcmFjdGVycyBsb25nICgqMiBieXRlcy9jaGFyID0gMTMwa0IpLCB0byB0ZXN0IHN0b3JhZ2UuXG4vLyBUaGF0IHNob3VsZCBiZSBwbGVudHkgZm9yIGNvbW1vbiBwZXJzaXN0ZW5jZSB1c2UgY2FzZXMsXG4vLyB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUgbmVhciB0eXBpY2FsIGJyb3dzZXIgbGltaXRzXG5jb25zdCBwb3cgPSAxNjtcbmZ1bmN0aW9uIGxvbmdTdHJpbmcoKSB7XG4gICAgbGV0IHMgPSAnU3BhbSc7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBwb3c7IGkrKykge1xuICAgICAgICBzICs9IHM7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuXG5leHBvcnQgY29uc3Qgc3RvcmVzID0ge1xuICAgIG1lbW9yeTogbmV3IE1lbVN0b3JlKClcbiAgICAvLyBEZWZlciB0ZXN0aW5nICYgbWFraW5nIGxvY2FsL3Nlc3Npb24gc3RvcmVzIHVudGlsIHJlcXVlc3RlZC5cbiAgICAvLyBUaGF0IHdheSBpZiB3ZSBoYXZlIGVycm9ycyBoZXJlIHRoZXkgY2FuIHNob3cgdXAgaW4gZGV2dG9vbHMuXG59O1xuXG5jb25zdCBiYWNrRW5kcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsU3RvcmFnZScsXG4gICAgc2Vzc2lvbjogJ3Nlc3Npb25TdG9yYWdlJ1xufTtcblxuZnVuY3Rpb24gdHJ5R2V0V2ViU3RvcmUoYmFja0VuZCwgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBXZWJTdG9yZShiYWNrRW5kKTtcbiAgICBjb25zdCBmYWxsYmFja1N0b3JlID0gc3RvcmVzLm1lbW9yeTtcbiAgICBjb25zdCBzdG9yZVRlc3QgPSBsb25nU3RyaW5nKCk7XG4gICAgY29uc3QgdGVzdEtleSA9IHN0b3JlUHJlZml4ICsgJ3gueCc7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RvcmUuX3NldEl0ZW0odGVzdEtleSwgc3RvcmVUZXN0KTtcbiAgICAgICAgaWYgKHN0b3JlLmdldEl0ZW0odGVzdEtleSkgIT09IHN0b3JlVGVzdCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgZXJyKGAke2JhY2tFbmR9IGluaXQgZmFpbGVkIHNldC9nZXQsIGZhbGxpbmcgYmFjayB0byBtZW1vcnlgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxsYmFja1N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgZXJyKGAke2JhY2tFbmR9IGluaXQgZmlyc3QgdHJ5IGZhaWxlZDsgY2xlYXJpbmcgYW5kIHJldHJ5aW5nYClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgICAgc3RvcmUuX3NldEl0ZW0odGVzdEtleSwgc3RvcmVUZXN0KTtcbiAgICAgICAgaWYgKHN0b3JlLmdldEl0ZW0odGVzdEtleSkgIT09IHN0b3JlVGVzdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3BlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgICAgICAgZGlzcGF0Y2goZXJyKGAke2JhY2tFbmR9IGluaXQgc2V0L2dldCBzdWNjZWVkZWQgYWZ0ZXIgY2xlYXJpbmchYCkpO1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkaXNwYXRjaChlcnIoYCR7YmFja0VuZH0gaW5pdCBzdGlsbCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBtZW1vcnlgKSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1N0b3JlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmUodHlwZSwgZGlzcGF0Y2gpIHtcbiAgICBpZiAoIXN0b3Jlc1t0eXBlXSkge1xuICAgICAgICBzdG9yZXNbdHlwZV0gPSB0cnlHZXRXZWJTdG9yZShiYWNrRW5kc1t0eXBlXSwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVzW3R5cGVdO1xufVxuXG5jb25zdCBub29wVHJhbnNmb3JtID0ge1xuICAgIGV4dHJhY3Q6IHByb3BWYWx1ZSA9PiBwcm9wVmFsdWUsXG4gICAgYXBwbHk6IChzdG9yZWRWYWx1ZSwgX3Byb3BWYWx1ZSkgPT4gc3RvcmVkVmFsdWVcbn07XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zICYmXG4gICAgICAgIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXVxuICAgICkge1xuICAgICAgICBpZiAocHJvcFBhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV1bcHJvcFBhcnRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV07XG4gICAgfVxuICAgIHJldHVybiBub29wVHJhbnNmb3JtO1xufTtcblxuY29uc3QgZ2V0VmFsc0tleSA9IChpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpID0+XG4gICAgYCR7c3RyaW5naWZ5SWQoaWQpfS4ke3BlcnNpc3RlZFByb3B9LiR7SlNPTi5zdHJpbmdpZnkocGVyc2lzdGVuY2UpfWA7XG5cbmNvbnN0IGdldFByb3BzID0gbGF5b3V0ID0+IHtcbiAgICBjb25zdCB7cHJvcHMsIHR5cGUsIG5hbWVzcGFjZX0gPSBsYXlvdXQ7XG4gICAgaWYgKCF0eXBlIHx8ICFuYW1lc3BhY2UpIHtcbiAgICAgICAgLy8gbm90IGEgcmVhbCBjb21wb25lbnQgLSBqdXN0IG5lZWQgdGhlIHByb3BzIGZvciByZWN1cnNpb25cbiAgICAgICAgcmV0dXJuIHtwcm9wc307XG4gICAgfVxuICAgIGNvbnN0IHtpZCwgcGVyc2lzdGVuY2V9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShsYXlvdXQpO1xuICAgIGNvbnN0IGdldFZhbCA9IHByb3AgPT5cbiAgICAgICAgcHJvcHNbcHJvcF0gfHxcbiAgICAgICAgKGVsZW1lbnQuZGVmYXVsdFByb3BzIHx8IGVsZW1lbnQuZGFzaFBlcnNpc3RlbmNlIHx8IHt9KVtwcm9wXTtcbiAgICBjb25zdCBwZXJzaXN0ZWRfcHJvcHMgPSBnZXRWYWwoJ3BlcnNpc3RlZF9wcm9wcycpO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlX3R5cGUgPSBnZXRWYWwoJ3BlcnNpc3RlbmNlX3R5cGUnKTtcbiAgICBjb25zdCBjYW5QZXJzaXN0ID0gaWQgJiYgcGVyc2lzdGVkX3Byb3BzICYmIHBlcnNpc3RlbmNlX3R5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFVpRWRpdChsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICAvLyBpZiB0aGUgXCJwZXJzaXN0ZW5jZVwiIHByb3BlcnR5IGlzIGNoYW5nZWQgYXMgYSBjYWxsYmFjayBvdXRwdXQsXG4gICAgLy8gc2tpcCB0aGUgcGVyc2lzdGVuY2Ugc3RvcmFnZSBvdmVyd3JpdGluZy5cbiAgICBjb25zdCBpc1BlcnNpc3RlbmNlTWlzbWF0Y2ggPVxuICAgICAgICBuZXdQcm9wcz8ucGVyc2lzdGVuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZXdQcm9wcy5wZXJzaXN0ZW5jZSAhPT0gcGVyc2lzdGVuY2U7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIXBlcnNpc3RlbmNlIHx8IGlzUGVyc2lzdGVuY2VNaXNtYXRjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yRWFjaChwZXJzaXN0ZWRQcm9wID0+IHtcbiAgICAgICAgY29uc3QgW3Byb3BOYW1lLCBwcm9wUGFydF0gPSBwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChuZXdQcm9wc1twcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIGNvbnN0IHtleHRyYWN0fSA9IGdldFRyYW5zZm9ybShlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxzS2V5ID0gZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsID0gZXh0cmFjdChwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gZXh0cmFjdChuZXdQcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICAgICAgICAvLyBtYWlubHkgZm9yIG5lc3RlZCBwcm9wcyB3aXRoIG11bHRpcGxlIHBlcnNpc3RlZCBwYXJ0cywgaXQnc1xuICAgICAgICAgICAgLy8gcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBiZWZvcmUgLSBzaG91bGQgbm90IHN0b3JlXG4gICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxWYWwgIT09IG5ld1ZhbCkge1xuICAgICAgICAgICAgICAgIGlmIChzdG9yYWdlLmhhc0l0ZW0odmFsc0tleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWwgPSBzdG9yYWdlLmdldEl0ZW0odmFsc0tleSlbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtuZXdWYWxdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtuZXdWYWwsIG9yaWdpbmFsVmFsXTtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0odmFsc0tleSwgdmFscywgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgcGVyc2lzdGVkX3Byb3BzKTtcbn1cblxuLypcbiAqIFVzZWQgZm9yIGVudGlyZSBsYXlvdXRzIChvbiBsb2FkKSBvciBwYXJ0aWFsIGxheW91dHMgKGZyb20gY2hpbGRyZW5cbiAqIGNhbGxiYWNrcykgdG8gYXBwbHkgcHJldmlvdXNseS1zdG9yZWQgVUkgZWRpdHMgdG8gY29tcG9uZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQZXJzaXN0ZW5jZShsYXlvdXQsIGRpc3BhdGNoKSB7XG4gICAgaWYgKHR5cGUobGF5b3V0KSAhPT0gJ09iamVjdCcgfHwgIWxheW91dC5wcm9wcykge1xuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cblxuICAgIHJldHVybiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBsYXlvdXQsIFtdLCBkaXNwYXRjaCk7XG59XG5cbmNvbnN0IFVORE8gPSB0cnVlO1xuZnVuY3Rpb24gbW9kUHJvcChrZXksIHN0b3JhZ2UsIGVsZW1lbnQsIHByb3BzLCBwZXJzaXN0ZWRQcm9wLCB1cGRhdGUsIHVuZG8pIHtcbiAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKGtleSkpIHtcbiAgICAgICAgY29uc3QgW25ld1ZhbCwgb3JpZ2luYWxWYWxdID0gc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIGNvbnN0IGZyb21WYWwgPSB1bmRvID8gbmV3VmFsIDogb3JpZ2luYWxWYWw7XG4gICAgICAgIGNvbnN0IHRvVmFsID0gdW5kbyA/IG9yaWdpbmFsVmFsIDogbmV3VmFsO1xuICAgICAgICBjb25zdCBbcHJvcE5hbWUsIHByb3BQYXJ0XSA9IHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCk7XG5cbiAgICAgICAgaWYgKGVxdWFscyhmcm9tVmFsLCB0cmFuc2Zvcm0uZXh0cmFjdChwcm9wc1twcm9wTmFtZV0pKSkge1xuICAgICAgICAgICAgdXBkYXRlW3Byb3BOYW1lXSA9IHRyYW5zZm9ybS5hcHBseShcbiAgICAgICAgICAgICAgICB0b1ZhbCxcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSBpbiB1cGRhdGUgPyB1cGRhdGVbcHJvcE5hbWVdIDogcHJvcHNbcHJvcE5hbWVdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGhpcyBzYXZlZCBlZGl0IC0gd2UndmUgc3RhcnRlZCB3aXRoIHRoZSB3cm9uZ1xuICAgICAgICAgICAgLy8gdmFsdWUgZm9yIHRoaXMgcGVyc2lzdGVuY2UgSURcbiAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBjb21wb25lbnQsIHBhdGgsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9ID0gZ2V0UHJvcHMoY29tcG9uZW50KTtcblxuICAgIGxldCBsYXlvdXRPdXQgPSBsYXlvdXQ7XG4gICAgaWYgKGNhblBlcnNpc3QgJiYgcGVyc2lzdGVuY2UpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0ge307XG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBlcnNpc3RlZF9wcm9wc1xuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdXBkYXRlKSB7XG4gICAgICAgICAgICBsYXlvdXRPdXQgPSBzZXQoXG4gICAgICAgICAgICAgICAgbGVuc1BhdGgocGF0aC5jb25jYXQoJ3Byb3BzJywgcHJvcE5hbWUpKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICAgIGxheW91dE91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY3Vyc2UgaW53YXJkXG4gICAgY29uc3Qge2NoaWxkcmVufSA9IHByb3BzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUoY2hpbGQpID09PSAnT2JqZWN0JyAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5jb25jYXQoJ3Byb3BzJywgJ2NoaWxkcmVuJywgaSksXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlKGNoaWxkcmVuKSA9PT0gJ09iamVjdCcgJiYgY2hpbGRyZW4ucHJvcHMpIHtcbiAgICAgICAgbGF5b3V0T3V0ID0gcGVyc2lzdGVuY2VNb2RzKFxuICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXRoLmNvbmNhdCgncHJvcHMnLCAnY2hpbGRyZW4nKSxcbiAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRPdXQ7XG59XG5cbi8qXG4gKiBXaGVuIHdlIHJlY2VpdmUgbmV3IGV4cGxpY2l0IHByb3BzIGZyb20gYSBjYWxsYmFjayxcbiAqIHRoZXNlIG92ZXJyaWRlIFVJLWRyaXZlbiBlZGl0cyBvZiB0aG9zZSBleGFjdCBwcm9wc1xuICogYnV0IG5vdCBmb3IgcHJvcHMgbmVzdGVkIGluc2lkZSBjaGlsZHJlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVQZXJzaXN0ZW5jZShsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICBjb25zdCBnZXRGaW5hbCA9IChwcm9wTmFtZSwgcHJldlZhbCkgPT5cbiAgICAgICAgcHJvcE5hbWUgaW4gbmV3UHJvcHMgPyBuZXdQcm9wc1twcm9wTmFtZV0gOiBwcmV2VmFsO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2UgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2UnLCBwZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIShwZXJzaXN0ZW5jZSB8fCBmaW5hbFBlcnNpc3RlbmNlKSkge1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZVR5cGUgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2VfdHlwZScsIHBlcnNpc3RlbmNlX3R5cGUpO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVkUHJvcHMgPSBnZXRGaW5hbCgncGVyc2lzdGVkX3Byb3BzJywgcGVyc2lzdGVkX3Byb3BzKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZUNoYW5nZWQgPVxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlVHlwZSAhPT0gcGVyc2lzdGVuY2VfdHlwZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlZFByb3BzICE9PSBwZXJzaXN0ZWRfcHJvcHM7XG5cbiAgICBjb25zdCBub3RJbk5ld1Byb3BzID0gcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAhKHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKVswXSBpbiBuZXdQcm9wcyk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcblxuICAgIGxldCBkZXBlcnNpc3RlZFByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocGVyc2lzdGVuY2VDaGFuZ2VkICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIC8vIGNsZWFyIHByZXZpb3VzbHktYXBwbGllZCBwZXJzaXN0ZW5jZVxuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgVU5ET1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgcGVyc2lzdGVkX3Byb3BzKVxuICAgICAgICApO1xuICAgICAgICBkZXBlcnNpc3RlZFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxQZXJzaXN0ZW5jZSAmJiBwZXJzaXN0ZW5jZUNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxTdG9yYWdlID0gZ2V0U3RvcmUoZmluYWxQZXJzaXN0ZW5jZVR5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgLy8gYXBwbHkgbmV3IHBlcnNpc3RlbmNlXG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgZmluYWxQZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZXJzaXN0ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBmaW5hbFBlcnNpc3RlZFByb3BzKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VDaGFuZ2VkID8gbWVyZ2VSaWdodChuZXdQcm9wcywgdXBkYXRlKSA6IG5ld1Byb3BzO1xufVxuIiwiaW1wb3J0IHthc3NvYywgYXNzb2NQYXRoLCBtZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUFwaVJlZHVjZXIoc3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQXBpUmVkdWNlcihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gc3RvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgc3RhdHVzLCBjb250ZW50fSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHtzdGF0dXMsIGNvbnRlbnR9O1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvY1BhdGgoaWQsIG5ld1JlcXVlc3QsIHN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IGFzc29jKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbWVyZ2VSaWdodChzdGF0ZSwgbmV3UmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH07XG59XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBhcHBMaWZlY3ljbGUoc3RhdGUgPSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgZ2V0QWN0aW9uKCdTRVRfQVBQX0xJRkVDWUNMRScpOlxuICAgICAgICAgICAgcmV0dXJuIGdldEFwcFN0YXRlKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcExpZmVjeWNsZTtcbiIsImltcG9ydCB7IGFzc29jLCBhc3NvY1BhdGgsIGRpc3NvYyB9IGZyb20gJ3JhbWRhJztcbmNvbnN0IHNldEpvYiA9IChqb2IsIHN0YXRlKSA9PiBhc3NvYyhqb2Iuam9iSWQsIGpvYiwgc3RhdGUpO1xuY29uc3QgcmVtb3ZlSm9iID0gKGpvYklkLCBzdGF0ZSkgPT4gZGlzc29jKGpvYklkLCBzdGF0ZSk7XG5jb25zdCBzZXRPdXRkYXRlZCA9IChqb2JJZCwgc3RhdGUpID0+IGFzc29jUGF0aChbam9iSWQsICdvdXRkYXRlZCddLCB0cnVlLCBzdGF0ZSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdBRERfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRKb2IoYWN0aW9uLnBheWxvYWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0NBTExCQUNLX0pPQic6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlSm9iKGFjdGlvbi5wYXlsb2FkLmpvYklkLCBzdGF0ZSk7XG4gICAgICAgIGNhc2UgJ0NBTExCQUNLX0pPQl9PVVREQVRFRCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0T3V0ZGF0ZWQoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGRpZmZlcmVuY2UsIHJlZHVjZSB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuQWRkQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuQWRkRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuQWRkUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuQWRkU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFdhdGNoZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVdhdGNoZWRcIjtcbn0pKENhbGxiYWNrQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBY3Rpb25UeXBlID0ge30pKTtcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZGRDb21wbGV0ZWRcIl0gPSBcIkNhbGxiYWNrcy5Db21wbGV0ZWRcIjtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZ2dyZWdhdGVcIl0gPSBcIkNhbGxiYWNrcy5BZ2dyZWdhdGVcIjtcbn0pKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB7XG4gICAgYmxvY2tlZDogW10sXG4gICAgZXhlY3V0ZWQ6IFtdLFxuICAgIGV4ZWN1dGluZzogW10sXG4gICAgcHJpb3JpdGl6ZWQ6IFtdLFxuICAgIHJlcXVlc3RlZDogW10sXG4gICAgc3RvcmVkOiBbXSxcbiAgICB3YXRjaGVkOiBbXSxcbiAgICBjb21wbGV0ZWQ6IDBcbn07XG5jb25zdCB0cmFuc2Zvcm1zID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmddOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkXTogZGlmZmVyZW5jZVxufTtcbmNvbnN0IGZpZWxkcyA9IHtcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEJsb2NrZWRdOiAnYmxvY2tlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZF06ICdleGVjdXRlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiAnZXhlY3V0aW5nJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFByaW9yaXRpemVkXTogJ3ByaW9yaXRpemVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06ICdyZXF1ZXN0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkXTogJ3N0b3JlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogJ3dhdGNoZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiAnd2F0Y2hlZCdcbn07XG5jb25zdCBtdXRhdGVDb21wbGV0ZWQgPSAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjb21wbGV0ZWQ6IHN0YXRlLmNvbXBsZXRlZCArIGFjdGlvbi5wYXlsb2FkXG59KTtcbmNvbnN0IG11dGF0ZUNhbGxiYWNrcyA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtc1thY3Rpb24udHlwZV07XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHNbYWN0aW9uLnR5cGVdO1xuICAgIHJldHVybiAhdHJhbnNmb3JtIHx8ICFmaWVsZCB8fCBhY3Rpb24ucGF5bG9hZC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBzdGF0ZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgW2ZpZWxkXTogdHJhbnNmb3JtKHN0YXRlW2ZpZWxkXSwgYWN0aW9uLnBheWxvYWQpXG4gICAgICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiByZWR1Y2UoKHMsIGEpID0+IHtcbiAgICBpZiAoYSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVDb21wbGV0ZWQocywgYSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGVDYWxsYmFja3MocywgYSk7XG59LCBzdGF0ZSwgYWN0aW9uLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGVcbiAgICA/IGFjdGlvbi5wYXlsb2FkXG4gICAgOiBbYWN0aW9uXSk7XG4iLCJjb25zdCBpbml0aWFsQ2hhbmdlID0ge1xuICAgIGlkOiBudWxsLFxuICAgIHByb3BzOiB7fVxufTtcblxuZnVuY3Rpb24gY2hhbmdlZChzdGF0ZSA9IGluaXRpYWxDaGFuZ2UpIHtcbiAgICAvLyBUaGlzIGlzIGVtcHR5IGp1c3QgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmUuIENoYW5nZXNcbiAgICAvLyBhcmUgYWN0dWFsbHkgcmVjb3JkZWQgaW4gcmVkdWNlci5qcyBzbyB0aGF0IHdlIGNhblxuICAgIC8vIHJlc29sdmUgcGF0aHMgdG8gaWQuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjaGFuZ2VkO1xuIiwiaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4uL2FjdGlvbnMvY29uc3RhbnRzJztcbmltcG9ydCB7bWVyZ2VEZWVwUmlnaHR9IGZyb20gJ3JhbWRhJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uZmlnKHN0YXRlID0gbnVsbCwgYWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9DT05GSUcnKSkge1xuICAgICAgICAvLyBQdXQgdGhlIGNvbXBvbmVudHMgY2hpbGRyZW5Qcm9wcyBpbiB3aW5kb3dzIGZvciBzaWRlIHVzYWdlLlxuICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzID0gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzIHx8IHt9LFxuICAgICAgICAgICAgYWN0aW9uLnBheWxvYWQuY2hpbGRyZW5fcHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignQUREX0hUVFBfSEVBREVSUycpKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURlZXBSaWdodChzdGF0ZSwge1xuICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldEFwcFN0YXRlKHN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGVMaXN0ID0ge1xuICAgICAgICBTVEFSVEVEOiAnU1RBUlRFRCcsXG4gICAgICAgIEhZRFJBVEVEOiAnSFlEUkFURUQnLFxuICAgICAgICBERVNUUk9ZRUQ6ICdERVNUUk9ZRUQnXG4gICAgfTtcbiAgICBpZiAoc3RhdGVMaXN0W3N0YXRlXSkge1xuICAgICAgICByZXR1cm4gc3RhdGVMaXN0W3N0YXRlXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3N0YXRlfSBpcyBub3QgYSB2YWxpZCBhcHAgc3RhdGUuYCk7XG59XG4iLCJjb25zdCBpbml0aWFsR3JhcGggPSB7fTtcblxuY29uc3QgZ3JhcGhzID0gKHN0YXRlID0gaW5pdGlhbEdyYXBoLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdTRVRfR1JBUEhTJykge1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdyYXBocztcbiIsImltcG9ydCB7bWVyZ2VSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBpbml0aWFsRXJyb3IgPSB7XG4gICAgZnJvbnRFbmQ6IFtdLFxuICAgIGJhY2tFbmQ6IFtdLFxuICAgIGJhY2tFbmRDb25uZWN0ZWQ6IHRydWVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVycm9yKHN0YXRlID0gaW5pdGlhbEVycm9yLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ09OX0VSUk9SJzoge1xuICAgICAgICAgICAgY29uc3Qge2Zyb250RW5kLCBiYWNrRW5kLCBiYWNrRW5kQ29ubmVjdGVkfSA9IHN0YXRlO1xuICAgICAgICAgICAgLy8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZSBmb3Igc3RhY2sgdHJhY2luZyBhbmQgc28gdGhleSdyZVxuICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGV2ZW4gd2l0aCBkZWJ1Z2dpbmcgb2ZmXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24ucGF5bG9hZC5lcnJvcik7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC50eXBlID09PSAnZnJvbnRFbmQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRFbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlUmlnaHQoYWN0aW9uLnBheWxvYWQsIHt0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZyb250RW5kXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmQsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmRDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24ucGF5bG9hZC50eXBlID09PSAnYmFja0VuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9udEVuZCxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSaWdodChhY3Rpb24ucGF5bG9hZCwge3RpbWVzdGFtcDogbmV3IERhdGUoKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmFja0VuZFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnOiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VSaWdodChzdGF0ZSwge2JhY2tFbmRDb25uZWN0ZWQ6IGFjdGlvbi5wYXlsb2FkfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjb25zdCBpbml0aWFsSGlzdG9yeSA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiB7fSxcbiAgICBmdXR1cmU6IFtdXG59O1xuXG5mdW5jdGlvbiBoaXN0b3J5KHN0YXRlID0gaW5pdGlhbEhpc3RvcnksIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnVU5ETyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBwcmVzZW50LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHBhc3RbcGFzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IG5ld1Bhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBbcHJlc2VudCwgLi4uZnV0dXJlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JFRE8nOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgcHJlc2VudCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGZ1dHVyZVswXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Z1dHVyZSA9IGZ1dHVyZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogWy4uLnBhc3QsIHByZXNlbnRdLFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IG5leHQsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBuZXdGdXR1cmVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdSRVZFUlQnOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXN0W3Bhc3QubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBuZXdQYXN0ID0gcGFzdC5zbGljZSgwLCBwYXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBuZXdQYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IHByZXZpb3VzLFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogWy4uLmZ1dHVyZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhpc3Rvcnk7XG4iLCJjb25zdCBjdXN0b21Ib29rcyA9IChcbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgbGF5b3V0X3ByZTogbnVsbCxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcHJlOiBudWxsLFxuICAgICAgICByZXF1ZXN0X3Bvc3Q6IG51bGwsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBudWxsLFxuICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBudWxsLFxuICAgICAgICBiZWFyOiBmYWxzZVxuICAgIH0sXG4gICAgYWN0aW9uXG4pID0+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1NFVF9IT09LUyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tSG9va3M7XG4iLCJleHBvcnQgdmFyIElzTG9hZGluZ0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKElzTG9hZGluZ0FjdGlvblR5cGUpIHtcbiAgICBJc0xvYWRpbmdBY3Rpb25UeXBlW1wiU2V0XCJdID0gXCJJc0xvYWRpbmcuU2V0XCI7XG59KShJc0xvYWRpbmdBY3Rpb25UeXBlIHx8IChJc0xvYWRpbmdBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiAoYWN0aW9uLnR5cGUgPT09IElzTG9hZGluZ0FjdGlvblR5cGUuU2V0ID8gYWN0aW9uLnBheWxvYWQgOiBzdGF0ZSk7XG4iLCJpbXBvcnQge1xuICAgIGluY2x1ZGVzLFxuICAgIG1lcmdlUmlnaHQsXG4gICAgYXBwZW5kLFxuICAgIHZpZXcsXG4gICAgbGVuc1BhdGgsXG4gICAgYXNzb2NQYXRoLFxuICAgIGRpc3NvY1BhdGhcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuXG5jb25zdCBsYXlvdXQgPSAoc3RhdGUgPSB7fSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9MQVlPVVQnKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhY3Rpb24ucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uLnBheWxvYWRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7Li4uYWN0aW9uLnBheWxvYWR9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICBnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJylcbiAgICAgICAgXSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvcFBhdGggPSBhcHBlbmQoJ3Byb3BzJywgYWN0aW9uLnBheWxvYWQuaXRlbXBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1Byb3BzID0gdmlldyhsZW5zUGF0aChwcm9wUGF0aCksIHN0YXRlKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBtZXJnZVJpZ2h0KGV4aXN0aW5nUHJvcHMsIGFjdGlvbi5wYXlsb2FkLnByb3BzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwcm9wUGF0aCwgbWVyZ2VkUHJvcHMsIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIGNvbXBvbmVudCByZW5kZXJlZCBvdXQgb2YgdHJlZS5cbiAgICBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdJTlNFUlRfQ09NUE9ORU5UJykpIHtcbiAgICAgICAgY29uc3Qge2NvbXBvbmVudCwgY29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChjb21wb25lbnRQYXRoLCBjb21wb25lbnQsIHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1JFTU9WRV9DT01QT05FTlQnKSkge1xuICAgICAgICBjb25zdCB7Y29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbiIsImltcG9ydCB7IGFzc29jUGF0aCwgaW5jbHVkZXMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvYWRpbmcoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdMT0FERUQnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkLnJlZHVjZSgoYWNjLCBsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFBhdGggPSBbSlNPTi5zdHJpbmdpZnkobG9hZC5wYXRoKV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcihbXSwgbG9hZFBhdGgsIGFjYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2FkUGF0aCwgcHJldi5maWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcucHJvcGVydHkgIT09IGxvYWQucHJvcGVydHkpLCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBjYXNlICdMT0FESU5HJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZC5yZWR1Y2UoKGFjYywgbG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQYXRoID0gW0pTT04uc3RyaW5naWZ5KGxvYWQucGF0aCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoW10sIGxvYWRQYXRoLCBhY2MpO1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMobG9hZCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgcHJldi5wdXNoKGxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvYWRQYXRoLCBwcmV2LCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGluaXRpYWxQYXRocyA9IHtzdHJzOiB7fSwgb2Jqczoge319O1xuXG5jb25zdCBwYXRocyA9IChzdGF0ZSA9IGluaXRpYWxQYXRocywgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9QQVRIUycpKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aHM7XG4iLCJpbXBvcnQge2Nsb25lfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7U1RBVFVTTUFQfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgY29tcHV0ZTogMCxcbiAgICBuZXR3b3JrOiB7XG4gICAgICAgIHRpbWU6IDAsXG4gICAgICAgIHVwbG9hZDogMCxcbiAgICAgICAgZG93bmxvYWQ6IDBcbiAgICB9LFxuICAgIHJlc291cmNlczoge30sXG4gICAgc3RhdHVzOiB7XG4gICAgICAgIGxhdGVzdDogbnVsbFxuICAgIH0sXG4gICAgcmVzdWx0OiB7fVxufTtcblxuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuICAgIHVwZGF0ZWQ6IFtdLFxuICAgIHJlc291cmNlczoge30sXG4gICAgY2FsbGJhY2tzOiB7fSxcbiAgICBncmFwaExheW91dDogbnVsbFxufTtcblxuY29uc3QgcHJvZmlsZSA9IChzdGF0ZSA9IGRlZmF1bHRTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX1JFU09VUkNFX1VTQUdFJykge1xuICAgICAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UuIFRoaXNcbiAgICAgICAgLy8gaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIGhpc3RvcnkucHJlc2VudCBiZWNhdXNlXG4gICAgICAgIC8vIGl0IHdhdGNoZXMgYWxsIHByb3BzLCBub3QganVzdCBpbnB1dHMuXG4gICAgICAgIGNvbnN0IHtpZCwgdXNhZ2UsIHN0YXR1c30gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzTWFwcGVkID0gU1RBVFVTTUFQW3N0YXR1c10gfHwgc3RhdHVzO1xuXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGNhbGxiYWNrIHRoYXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICB1cGRhdGVkOiBbaWRdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBzdGF0ZS5yZXNvdXJjZXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHN0YXRlLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIGdyYXBoTGF5b3V0IGlzIG5ldmVyIHBhc3NlZCBpbiB2aWEgYWN0aW9ucywgYmVjYXVzZSB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gd2FudCBpdCB0byB0cmlnZ2VyIGEgcmVyZW5kZXIgb2YgdGhlIGNhbGxiYWNrIGdyYXBoLlxuICAgICAgICAgICAgLy8gU2VlIENhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3RcbiAgICAgICAgICAgIGdyYXBoTGF5b3V0OiBzdGF0ZS5ncmFwaExheW91dFxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld1N0YXRlLmNhbGxiYWNrc1tpZF0gPVxuICAgICAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSB8fCBjbG9uZShkZWZhdWx0UHJvZmlsZSk7XG5cbiAgICAgICAgY29uc3QgY2IgPSBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdO1xuICAgICAgICBjb25zdCBjYlJlc291cmNlcyA9IGNiLnJlc291cmNlcztcbiAgICAgICAgY29uc3QgdG90YWxSZXNvdXJjZXMgPSBuZXdTdGF0ZS5yZXNvdXJjZXM7XG5cbiAgICAgICAgLy8gVXBkYXRlIHJlc291cmNlIHVzYWdlICYgcGFyYW1zLlxuICAgICAgICBjYi5jb3VudCArPSAxO1xuICAgICAgICBjYi5zdGF0dXMubGF0ZXN0ID0gc3RhdHVzTWFwcGVkO1xuICAgICAgICBjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSA9IChjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSB8fCAwKSArIDE7XG4gICAgICAgIGNiLnJlc3VsdCA9IGFjdGlvbi5wYXlsb2FkLnJlc3VsdDtcbiAgICAgICAgY2IuaW5wdXRzID0gYWN0aW9uLnBheWxvYWQuaW5wdXRzO1xuICAgICAgICBjYi5zdGF0ZSA9IGFjdGlvbi5wYXlsb2FkLnN0YXRlO1xuXG4gICAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQsXG4gICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcixcbiAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkLFxuICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZCxcbiAgICAgICAgICAgICAgICAuLi51c2VyXG4gICAgICAgICAgICB9ID0gdXNhZ2U7XG5cbiAgICAgICAgICAgIGNiLnRvdGFsICs9IF9fZGFzaF9jbGllbnQ7XG4gICAgICAgICAgICBjYi5jb21wdXRlICs9IF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnRpbWUgKz0gX19kYXNoX2NsaWVudCAtIF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnVwbG9hZCArPSBfX2Rhc2hfdXBsb2FkO1xuICAgICAgICAgICAgY2IubmV0d29yay5kb3dubG9hZCArPSBfX2Rhc2hfZG93bmxvYWQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgciBpbiB1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIuaGFzT3duUHJvcGVydHkocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvdXJjZXNbcl0gPSAoY2JSZXNvdXJjZXNbcl0gfHwgMCkgKyB1c2VyW3JdO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc291cmNlc1tyXSA9ICh0b3RhbFJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2ZpbGU7XG4iLCJpbXBvcnQge2ZvckVhY2gsIGluY2x1ZGVzLCBpc0VtcHR5LCBrZXlzLCBwYXRoLCBhc3NvYywgcGF0aE9yfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NvbWJpbmVSZWR1Y2Vyc30gZnJvbSAncmVkdXgnO1xuXG5pbXBvcnQge2dldENhbGxiYWNrc0J5SW5wdXR9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcblxuaW1wb3J0IGNyZWF0ZUFwaVJlZHVjZXIgZnJvbSAnLi9hcGknO1xuaW1wb3J0IGFwcExpZmVjeWNsZSBmcm9tICcuL2FwcExpZmVjeWNsZSc7XG5pbXBvcnQgY2FsbGJhY2tzIGZyb20gJy4vY2FsbGJhY2tzJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IGdyYXBocyBmcm9tICcuL2RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgZXJyb3IgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgaGlzdG9yeSBmcm9tICcuL2hpc3RvcnknO1xuaW1wb3J0IGhvb2tzIGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHByb2ZpbGUgZnJvbSAnLi9wcm9maWxlJztcbmltcG9ydCBjaGFuZ2VkIGZyb20gJy4vY2hhbmdlZCc7XG5pbXBvcnQgaXNMb2FkaW5nIGZyb20gJy4vaXNMb2FkaW5nJztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi9sYXlvdXQnO1xuaW1wb3J0IHBhdGhzIGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IGNhbGxiYWNrSm9icyBmcm9tICcuL2NhbGxiYWNrSm9icyc7XG5pbXBvcnQgbG9hZGluZyBmcm9tICcuL2xvYWRpbmcnO1xuaW1wb3J0IHtzdHJpbmdpZnlQYXRofSBmcm9tICcuLi93cmFwcGVyL3dyYXBwaW5nJztcblxuZXhwb3J0IGNvbnN0IGFwaVJlcXVlc3RzID0gW1xuICAgICdkZXBlbmRlbmNpZXNSZXF1ZXN0JyxcbiAgICAnbGF5b3V0UmVxdWVzdCcsXG4gICAgJ3JlbG9hZFJlcXVlc3QnLFxuICAgICdsb2dpblJlcXVlc3QnXG5dO1xuXG5jb25zdCBsYXlvdXRIYXNoZXMgPSAoc3RhdGUgPSB7fSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKFxuICAgICAgICBpbmNsdWRlcyhhY3Rpb24udHlwZSwgW1xuICAgICAgICAgICAgJ1VORE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ1JFRE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ09OX1BST1BfQ0hBTkdFJ1xuICAgICAgICBdKVxuICAgICkge1xuICAgICAgICAvLyBMZXQgdXMgY29tcGFyZSB0aGUgcGF0aHMgc3VtcyB0byBnZXQgdXBkYXRlcyB3aXRob3V0IHRyaWdnZXJpbmdcbiAgICAgICAgLy8gcmVuZGVyIG9uIHRoZSBwYXJlbnQgY29udGFpbmVycy5cbiAgICAgICAgY29uc3QgYWN0aW9uUGF0aCA9IGFjdGlvbi5wYXlsb2FkLml0ZW1wYXRoO1xuICAgICAgICBjb25zdCBzdHJQYXRoID0gc3RyaW5naWZ5UGF0aChhY3Rpb25QYXRoKTtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcigwLCBbc3RyUGF0aCwgJ2hhc2gnXSwgc3RhdGUpO1xuICAgICAgICBzdGF0ZSA9IGFzc29jKFxuICAgICAgICAgICAgc3RyUGF0aCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoYXNoOiBwcmV2ICsgMSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcHM6IGFjdGlvbi5wYXlsb2FkLnByb3BzLFxuICAgICAgICAgICAgICAgIHJlbmRlclR5cGU6IGFjdGlvbi5wYXlsb2FkLnJlbmRlclR5cGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5mdW5jdGlvbiBtYWluUmVkdWNlcigpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjYWxsYmFja3MsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGdyYXBocyxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgaG9va3MsXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICAgIGNoYW5nZWQsXG4gICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBwYXRocyxcbiAgICAgICAgbGF5b3V0SGFzaGVzLFxuICAgICAgICBsb2FkaW5nXG4gICAgfTtcbiAgICBmb3JFYWNoKHIgPT4ge1xuICAgICAgICBwYXJ0c1tyXSA9IGNyZWF0ZUFwaVJlZHVjZXIocik7XG4gICAgfSwgYXBpUmVxdWVzdHMpO1xuXG4gICAgcGFydHMuY2FsbGJhY2tKb2JzID0gY2FsbGJhY2tKb2JzO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVSZWR1Y2VycyhwYXJ0cyk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIHN0YXRlLCByZWNvcmRDaGFuZ2VzKSB7XG4gICAgY29uc3Qge2dyYXBocywgcGF0aHMsIGxheW91dH0gPSBzdGF0ZTtcbiAgICBjb25zdCB7aXRlbXBhdGgsIHByb3BzfSA9IHBheWxvYWQ7XG4gICAgY29uc3QgcmVmUHJvcHMgPSBwYXRoKGl0ZW1wYXRoLmNvbmNhdChbJ3Byb3BzJ10pLCBsYXlvdXQpIHx8IHt9O1xuICAgIGNvbnN0IHtpZH0gPSByZWZQcm9wcztcblxuICAgIGxldCBoaXN0b3J5RW50cnk7XG4gICAgaWYgKGlkKSB7XG4gICAgICAgIGlmIChyZWNvcmRDaGFuZ2VzKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGFuZ2VkID0ge2lkLCBwcm9wc307XG4gICAgICAgIH1cblxuICAgICAgICBoaXN0b3J5RW50cnkgPSB7aWQsIHByb3BzOiB7fX07XG4gICAgICAgIGtleXMocHJvcHMpLmZvckVhY2gocHJvcEtleSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcEtleSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaGlzdG9yeUVudHJ5LnByb3BzW3Byb3BLZXldID0gcmVmUHJvcHNbcHJvcEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeUVudHJ5O1xufVxuXG5mdW5jdGlvbiByZWNvcmRIaXN0b3J5KHJlZHVjZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgLy8gUmVjb3JkIGluaXRpYWwgc3RhdGVcbiAgICAgICAgY29uc3Qge3R5cGUsIHBheWxvYWR9ID0gYWN0aW9uO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ09OX1BST1BfQ0hBTkdFJykge1xuICAgICAgICAgICAgLy8gaGlzdG9yeSByZWNvcmRzIGFsbCBwcm9wIGNoYW5nZXMgdGhhdCBhcmUgaW5wdXRzLlxuICAgICAgICAgICAgY29uc3QgaGlzdG9yeUVudHJ5ID0gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgc3RhdGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeSAmJiAhaXNFbXB0eShoaXN0b3J5RW50cnkucHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuaGlzdG9yeS5wcmVzZW50ID0gaGlzdG9yeUVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ09OX1BST1BfQ0hBTkdFJyAmJiBwYXlsb2FkLnNvdXJjZSAhPT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGlmIHRoZSBwcm9wIGNoYW5nZSBpcyBhbiBpbnB1dCwgdGhlblxuICAgICAgICAgICAgICogcmVjb3JkIGl0IHNvIHRoYXQgaXQgY2FuIGJlIHBsYXllZCBiYWNrXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlFbnRyeSA9IGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIG5leHRTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoaGlzdG9yeUVudHJ5ICYmICFpc0VtcHR5KGhpc3RvcnlFbnRyeS5wcm9wcykpIHtcbiAgICAgICAgICAgICAgICBuZXh0U3RhdGUuaGlzdG9yeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGFzdDogWy4uLm5leHRTdGF0ZS5oaXN0b3J5LnBhc3QsIHN0YXRlLmhpc3RvcnkucHJlc2VudF0sXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnQ6IGhpc3RvcnlFbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgZnV0dXJlOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJlbG9hZGVyUmVkdWNlcihyZWR1Y2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBjb25maWcsIGhvb2tzfSA9IHN0YXRlIHx8IHt9O1xuICAgICAgICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAnUkVMT0FEJykge1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7aGlzdG9yeSwgY29uZmlnLCBob29rc307XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdTRVRfQ09ORklHJykge1xuICAgICAgICAgICAgLy8gbmV3IGNvbmZpZyBhbHNvIHJlbG9hZHMsIGFuZCBldmVuIGNsZWFycyBoaXN0b3J5LFxuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSdzIGEgbmV3IHVzZXIgb3IgZXZlbiBhIHRvdGFsbHkgZGlmZmVyZW50IGFwcCFcbiAgICAgICAgICAgIC8vIGhvb2tzIGFyZSBzZXQgYXQgYW4gZXZlbiBoaWdoZXIgbGV2ZWwgdGhhbiBjb25maWcgdGhvdWdoLlxuICAgICAgICAgICAgbmV3U3RhdGUgPSB7aG9va3N9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKCkge1xuICAgIHJldHVybiByZWxvYWRlclJlZHVjZXIocmVjb3JkSGlzdG9yeShtYWluUmVkdWNlcigpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgcmVzb2x2ZTogY29tcG9uZW50ID0+IHtcbiAgICAgICAgY29uc3Qge3R5cGUsIG5hbWVzcGFjZX0gPSBjb21wb25lbnQ7XG5cbiAgICAgICAgY29uc3QgbnMgPSB3aW5kb3dbbmFtZXNwYWNlXTtcblxuICAgICAgICBpZiAobnMpIHtcbiAgICAgICAgICAgIGlmIChuc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuc1t0eXBlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHt0eXBlfSBub3QgZm91bmQgaW4gJHtuYW1lc3BhY2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZXNwYWNlfSB3YXMgbm90IGZvdW5kLmApO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyBvbmNlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUsIGFwcGx5TWlkZGxld2FyZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB0aHVuayBmcm9tICdyZWR1eC10aHVuayc7XG5pbXBvcnQgeyBjcmVhdGVSZWR1Y2VyIH0gZnJvbSAnLi9yZWR1Y2Vycy9yZWR1Y2VyJztcbmltcG9ydCBTdG9yZU9ic2VydmVyIGZyb20gJy4vU3RvcmVPYnNlcnZlcic7XG5pbXBvcnQgZG9jdW1lbnRUaXRsZSBmcm9tICcuL29ic2VydmVycy9kb2N1bWVudFRpdGxlJztcbmltcG9ydCBleGVjdXRlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcyc7XG5pbXBvcnQgZXhlY3V0aW5nQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGluZ0NhbGxiYWNrcyc7XG5pbXBvcnQgaXNMb2FkaW5nIGZyb20gJy4vb2JzZXJ2ZXJzL2lzTG9hZGluZyc7XG5pbXBvcnQgcHJpb3JpdGl6ZWRDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvcHJpb3JpdGl6ZWRDYWxsYmFja3MnO1xuaW1wb3J0IHJlcXVlc3RlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9yZXF1ZXN0ZWRDYWxsYmFja3MnO1xuaW1wb3J0IHN0b3JlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX19zdG9yZSA9IHRoaXMuaW5pdGlhbGl6ZVN0b3JlKCk7XG4gICAgfVxuICAgIF9fc3RvcmU7XG4gICAgZ2V0IHN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH1cbiAgICBzdG9yZU9ic2VydmVyID0gbmV3IFN0b3JlT2JzZXJ2ZXIoKTtcbiAgICBzZXRPYnNlcnZlcnMgPSBvbmNlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZSA9IHRoaXMuc3RvcmVPYnNlcnZlci5vYnNlcnZlO1xuICAgICAgICAvLyBGSVhNRSBSZW1vdmUgb2JzZXJ2ZXIgcGF0dGVybiBhbmQgcmVmYWN0b3IgdG8gc3RhbmRhcmQgcmVkdWNlcnMvYWN0aW9ucy9zZWxlY3RvcnMuXG4gICAgICAgIG9ic2VydmUoZG9jdW1lbnRUaXRsZSk7XG4gICAgICAgIG9ic2VydmUoaXNMb2FkaW5nKTtcbiAgICAgICAgb2JzZXJ2ZShyZXF1ZXN0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHByaW9yaXRpemVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShleGVjdXRpbmdDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShzdG9yZWRDYWxsYmFja3MpO1xuICAgIH0pO1xuICAgIGNyZWF0ZUFwcFN0b3JlID0gKHJlZHVjZXIsIG1pZGRsZXdhcmUpID0+IHtcbiAgICAgICAgdGhpcy5fX3N0b3JlID0gY3JlYXRlU3RvcmUocmVkdWNlciwgbWlkZGxld2FyZSk7XG4gICAgICAgIHRoaXMuc3RvcmVPYnNlcnZlci5zZXRTdG9yZSh0aGlzLl9fc3RvcmUpO1xuICAgICAgICBjb25zdCBkcyA9ICh3aW5kb3cuZGFzaF9zdG9yZXMgPVxuICAgICAgICAgICAgd2luZG93LmRhc2hfc3RvcmVzIHx8IFtdKTtcbiAgICAgICAgaWYgKCFkcy5pbmNsdWRlcyh0aGlzLl9fc3RvcmUpKSB7XG4gICAgICAgICAgICBkcy5wdXNoKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRPYnNlcnZlcnMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBSZWR1eCBzdG9yZSB3aXRoIHRodW5rLCBwbHVzIGxvZ2dpbmcgKG9ubHkgaW4gZGV2ZWxvcG1lbnQgbW9kZSkgbWlkZGxld2FyZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sfSByZXNldDogZGlzY2FyZCBhbnkgcHJldmlvdXMgc3RvcmVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdG9yZTxHZW5lcmljU3RvcmVFbmhhbmNlcj59XG4gICAgICogIEFuIGluaXRpYWxpemVkIHJlZHV4IHN0b3JlIHdpdGggbWlkZGxld2FyZSBhbmQgcG9zc2libGUgaG90IHJlbG9hZGluZyBvZiByZWR1Y2Vyc1xuICAgICAqL1xuICAgIGluaXRpYWxpemVTdG9yZSA9IChyZXNldCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fX3N0b3JlICYmICFyZXNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcigpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvY2Vzcy1lbnZcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBvbmx5IGF0dGFjaCBsb2dnZXIgdG8gbWlkZGxld2FyZSBpbiBub24tcHJvZHVjdGlvbiBtb2RlXG4gICAgICAgICAgICBjb25zdCByZWR1eERURUMgPSB3aW5kb3dcbiAgICAgICAgICAgICAgICAuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fO1xuICAgICAgICAgICAgaWYgKHJlZHV4RFRFQykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgcmVkdXhEVEVDKHsgYWN0aW9uc0RlbnlsaXN0OiBbJ3JlbG9hZFJlcXVlc3QnXSB9KShhcHBseU1pZGRsZXdhcmUodGh1bmspKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKHJlZHVjZXIsIGFwcGx5TWlkZGxld2FyZSh0aHVuaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzZXQpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gLSBQcm90ZWN0IHRoaXMgdW5kZXIgYSBkZWJ1ZyBtb2RlP1xuICAgICAgICAgICAgd2luZG93LnN0b3JlID0gdGhpcy5fX3N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2R1bGUuaG90KSB7XG4gICAgICAgICAgICAvLyBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCBmb3IgcmVkdWNlcnNcbiAgICAgICAgICAgIG1vZHVsZS5ob3QuYWNjZXB0KCcuL3JlZHVjZXJzL3JlZHVjZXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvb3RSZWR1Y2VyID0gcmVxdWlyZSgnLi9yZWR1Y2Vycy9yZWR1Y2VyJykuY3JlYXRlUmVkdWNlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX19zdG9yZS5yZXBsYWNlUmVkdWNlcihuZXh0Um9vdFJlZHVjZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgb21pdCwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGNvbnN0IGdldFBlbmRpbmdDYWxsYmFja3MgPSAoc3RhdGUpID0+IEFycmF5KCkuY29uY2F0KC4uLnZhbHVlcyhvbWl0KFsnc3RvcmVkJywgJ2NvbXBsZXRlZCddLCBzdGF0ZSkpKTtcbiIsImltcG9ydCB7IHVwZGF0ZVByb3BzLCBub3RpZnlPYnNlcnZlcnMgfSBmcm9tICcuLi9hY3Rpb25zL2luZGV4JztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldFN0b3JlcyB9IGZyb20gJy4vc3RvcmVzJztcbi8qKlxuICogU2V0IHRoZSBwcm9wcyBvZiBhIGRhc2ggY29tcG9uZW50IGJ5IGlkIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGlkT3JQYXRoIFBhdGggb3IgaWQgb2YgdGhlIGRhc2ggY29tcG9uZW50IHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcHMgdG8gdXBkYXRlLlxuICovXG5mdW5jdGlvbiBzZXRfcHJvcHMoaWRPclBhdGgsIHByb3BzKSB7XG4gICAgY29uc3QgZHMgPSBnZXRTdG9yZXMoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0gPSBkc1t5XTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFBhdGg7XG4gICAgICAgIGNvbnN0IHsgcGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpZE9yUGF0aCkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZE9yUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gaWRPclBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdjbGllbnRzaWRlQXBpJ1xuICAgICAgICB9KSk7XG4gICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7IGlkOiBpZE9yUGF0aCwgcHJvcHMgfSkpO1xuICAgIH1cbn1cbi8vIENsZWFuIHVybCBjb2RlIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJhaW50cmVlL3Nhbml0aXplLXVybC9ibG9iL21haW4vc3JjL2NvbnN0YW50cy50c1xuLy8gdG8gYWxsb3cgZm9yIGRhdGEgcHJvdG9jb2wuXG5jb25zdCBpbnZhbGlkUHJvdG9jb2xzID0gL14oW15cXHddKikoamF2YXNjcmlwdHx2YnNjcmlwdCkvaW07XG5jb25zdCBuZXdMaW5lcyA9IC8mKHRhYnxuZXdsaW5lKTsvZ2k7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgY3RybENoYXJzID0gL1tcXHUwMDAwLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMERcXHVGRUZGXS9naW07XG5jb25zdCBodG1sRW50aXRpZXMgPSAvJiMoXFx3KykoXlxcd3w7KT8vZztcbmNvbnN0IGNsZWFuX3VybCA9ICh1cmwsIGZhbGxiYWNrID0gJ2Fib3V0OmJsYW5rJykgPT4ge1xuICAgIGlmICh1cmwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIGNvbnN0IGNsZWFuZWQgPSB1cmxcbiAgICAgICAgLnJlcGxhY2UobmV3TGluZXMsICcnKVxuICAgICAgICAucmVwbGFjZShjdHJsQ2hhcnMsICcnKVxuICAgICAgICAucmVwbGFjZShodG1sRW50aXRpZXMsIChfLCBkZWMpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoZGVjKSlcbiAgICAgICAgLnRyaW0oKTtcbiAgICBpZiAoaW52YWxpZFByb3RvY29scy50ZXN0KGNsZWFuZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbn07XG5jb25zdCBkYyA9ICh3aW5kb3cuZGFzaF9jbGllbnRzaWRlID1cbiAgICB3aW5kb3cuZGFzaF9jbGllbnRzaWRlIHx8IHt9KTtcbmRjWydzZXRfcHJvcHMnXSA9IHNldF9wcm9wcztcbmRjWydjbGVhbl91cmwnXSA9IGRjWydjbGVhbl91cmwnXSA9PT0gdW5kZWZpbmVkID8gY2xlYW5fdXJsIDogZGNbJ2NsZWFuX3VybCddO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGxvYWRMaWJyYXJ5KHJlc291cmNlKSB7XG4gICAgbGV0IHByb207XG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ19qc19kaXN0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gcmVzb3VyY2UudXJsO1xuICAgICAgICBlbGVtZW50LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcHJvbSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGVhZD8uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc291cmNlLnR5cGUgPT09ICdfY3NzX2Rpc3QnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGVsZW1lbnQuaHJlZiA9IHJlc291cmNlLnVybDtcbiAgICAgICAgZWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWQ/LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZXMoKSB7XG4gICAgY29uc3Qgc3RvcmVzID0gKHdpbmRvdy5kYXNoX3N0b3JlcyA9XG4gICAgICAgIHdpbmRvdy5kYXNoX3N0b3JlcyB8fCBbXSk7XG4gICAgcmV0dXJuIHN0b3Jlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGFzeW5jIChkdXJhdGlvbikgPT4ge1xuICAgIGxldCBfcmVzb2x2ZTtcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiAoX3Jlc29sdmUgPSByZXNvbHZlKSk7XG4gICAgc2V0VGltZW91dChfcmVzb2x2ZSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBwO1xufTtcbiIsImltcG9ydCBjaGVja1Byb3BUeXBlcyBmcm9tICcuLi9jaGVja1Byb3BUeXBlcyc7XG5pbXBvcnQgeyBwcm9wVHlwZUVycm9ySGFuZGxlciB9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVDb21wb25lbnQgfSBmcm9tICcuL3dyYXBwaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENoZWNrZWRDb21wb25lbnQocCkge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuLCBjb21wb25lbnQgfSA9IHA7XG4gICAgdmFsaWRhdGVDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBjaGVja1Byb3BUeXBlcyhlbGVtZW50LnByb3BUeXBlcywgcHJvcHMsICdjb21wb25lbnQgcHJvcCcsIGVsZW1lbnQpO1xuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcHJvcFR5cGVFcnJvckhhbmRsZXIoZXJyb3JNZXNzYWdlLCBwcm9wcywgY29tcG9uZW50LnR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdG9yZSwgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgY29uY2F0LCBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgY29uc3QgRGFzaENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBmdW5jdGlvbiBEYXNoQ29udGV4dFByb3ZpZGVyKHByb3BzKSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiwgY29tcG9uZW50UGF0aCB9ID0gcHJvcHM7XG4gICAgY29uc3Qgc3RyaW5nUGF0aCA9IHVzZU1lbW8oKCkgPT4gSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50UGF0aCksIFtjb21wb25lbnRQYXRoXSk7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZSgpO1xuICAgIGNvbnN0IGlzTG9hZGluZyA9IHVzZUNhbGxiYWNrKChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZXh0cmFQYXRoLCByYXdQYXRoLCBmaWx0ZXJGdW5jIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBsZXQgbG9hZGluZ1BhdGggPSBbc3RyaW5nUGF0aF07XG4gICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbmNhdChjb21wb25lbnRQYXRoLCBleHRyYVBhdGgpKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYXdQYXRoKSB7XG4gICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtKU09OLnN0cmluZ2lmeShyYXdQYXRoKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHBhdGhPcihbXSwgbG9hZGluZ1BhdGgsIHN0b3JlLmdldFN0YXRlKCkubG9hZGluZyk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJGdW5jXG4gICAgICAgICAgICA/IGxvYWRpbmcuZmlsdGVyKGZpbHRlckZ1bmMpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIDogbG9hZGluZy5sZW5ndGggPiAwO1xuICAgIH0sIFtzdHJpbmdQYXRoXSk7XG4gICAgY29uc3QgdXNlTG9hZGluZyA9IHVzZUNhbGxiYWNrKChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsdGVyRnVuYywgZXh0cmFQYXRoLCByYXdQYXRoIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdXNlU2VsZWN0b3IoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbG9hZGluZ1BhdGggPSBbc3RyaW5nUGF0aF07XG4gICAgICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbmNhdChjb21wb25lbnRQYXRoLCBleHRyYVBhdGgpKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyYXdQYXRoKSB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbSlNPTi5zdHJpbmdpZnkocmF3UGF0aCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9hZCA9IHBhdGhPcihbXSwgbG9hZGluZ1BhdGgsIHN0YXRlLmxvYWRpbmcpO1xuICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZC5maWx0ZXIoZmlsdGVyRnVuYykubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsb2FkLmxlbmd0aCA+IDA7XG4gICAgICAgIH0pO1xuICAgIH0sIFtzdHJpbmdQYXRoXSk7XG4gICAgY29uc3QgY3R4VmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgICAgICB1c2VMb2FkaW5nLFxuICAgICAgICAgICAgdXNlU2VsZWN0b3IsXG4gICAgICAgICAgICB1c2VTdG9yZSxcbiAgICAgICAgICAgIHVzZURpc3BhdGNoXG4gICAgICAgIH07XG4gICAgfSwgW3N0cmluZ1BhdGhdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGFzaENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGN0eFZhbHVlIH0sIGNoaWxkcmVuKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlRGFzaENvbnRleHQoKSB7XG4gICAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChEYXNoQ29udGV4dCk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignRGFzaCBDb250ZXh0IHdhcyBub3QgZm91bmQsIGNvbXBvbmVudCB3YXMgcmVuZGVyZWQgd2l0aG91dCBhIHdyYXBwZXIuIFVzZSBgd2luZG93LmRhc2hfY29tcG9uZW50X2FwaS5FeHRlcm5hbFdyYXBwZXJgIHRvIG1ha2Ugc3VyZSB0aGUgY29tcG9uZW50IGlzIHByb3Blcmx5IGNvbm5lY3RlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGN0eCB8fCB7fTtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGF0aCwgY29uY2F0LCBwaWNrQnksIGVxdWFscywga2V5cywgaXMsIGlzRW1wdHksIHBpY2ssIGFzc29jUGF0aCwgcGF0aE9yLCBtZXJnZVJpZ2h0LCBkaXNzb2MsIGFzc29jLCBtYXBPYmpJbmRleGVkLCB0eXBlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoLCBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDb21wb25lbnRFcnJvckJvdW5kYXJ5IGZyb20gJy4uL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdCc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIG9uRXJyb3IsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRXYXRjaGVkS2V5cywgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBnZXRDb21wb25lbnRMYXlvdXQsIGlzRHJ5Q29tcG9uZW50LCBjaGVja1JlbmRlclR5cGVQcm9wLCBzdHJpbmdpZnlQYXRoIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4uL2lzU2ltcGxlQ29tcG9uZW50JztcbmltcG9ydCB7IHNlbGVjdERhc2hQcm9wcywgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiwgc2VsZWN0Q29uZmlnIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xuaW1wb3J0IENoZWNrZWRDb21wb25lbnQgZnJvbSAnLi9DaGVja2VkQ29tcG9uZW50JztcbmltcG9ydCB7IERhc2hDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL0Rhc2hDb250ZXh0JztcbmZ1bmN0aW9uIERhc2hXcmFwcGVyKHsgY29tcG9uZW50UGF0aCwgX2Rhc2hwcml2YXRlX2Vycm9yLCBfcGFzc2VkQ29tcG9uZW50LCAvLyBwYXNzIGNvbXBvbmVudCB0byB0aGUgRGFzaFdyYXBwZXIgaW4gdGhlIGV2ZW50IHRoYXQgaXQgaXMgYSBuZXdSZW5kZXIgYW5kIHRoZXJlIGFyZSBubyBsYXlvdXRoYXNoZXNcbl9uZXdSZW5kZXIsIC8vIHRoaXMgaXMgdG8gZm9yY2UgdGhlIGNvbXBvbmVudCB0byBuZXdseSByZW5kZXIgcmVnYXJkbGVzcyBvZiBwcm9wcyAocmVkcmF3IGFuZCBjb21wb25lbnQgYXMgcHJvcHMpIGlzIHBhc3NlZCBmcm9tIHRoZSBwYXJlbnRcbi4uLmV4dHJhcyB9KSB7XG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuICAgIGNvbnN0IG1lbW9pemVkS2V5cyA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgbmV3UmVuZGVyID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCByZW5kZXJlZFBhdGggPSB1c2VSZWYoY29tcG9uZW50UGF0aCk7XG4gICAgbGV0IHJlbmRlckNvbXBvbmVudCA9IG51bGw7XG4gICAgbGV0IHJlbmRlckNvbXBvbmVudFByb3BzID0gbnVsbDtcbiAgICBsZXQgcmVuZGVySCA9IG51bGw7XG4gICAgLy8gR2V0IHRoZSBjb25maWcgZm9yIHRoZSBjb21wb25lbnQgYXMgcHJvcHNcbiAgICBjb25zdCBjb25maWcgPSB1c2VTZWxlY3RvcihzZWxlY3RDb25maWcpO1xuICAgIC8vIFNlbGVjdCBjb21wb25lbnQgYW5kIGl0J3MgcHJvcHMsIGFsb25nIHdpdGggcmVuZGVyIGhhc2gsIGNoYW5nZWQgcHJvcHMgYW5kIHRoZSByZWFzb24gZm9yIHJlbmRlclxuICAgIGNvbnN0IFtjb21wb25lbnQsIGNvbXBvbmVudFByb3BzLCBoLCBjaGFuZ2VkUHJvcHMsIHJlbmRlclR5cGVdID0gdXNlU2VsZWN0b3Ioc2VsZWN0RGFzaFByb3BzKGNvbXBvbmVudFBhdGgpLCBzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuKTtcbiAgICByZW5kZXJDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBjb21wb25lbnRQcm9wcztcbiAgICByZW5kZXJIID0gaDtcbiAgICB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKF9uZXdSZW5kZXIpIHtcbiAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlbmRlckggPSAwO1xuICAgICAgICAgICAgaWYgKHJlbmRlckggaW4gbWVtb2l6ZWRLZXlzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkUGF0aC5jdXJyZW50ID0gY29tcG9uZW50UGF0aDtcbiAgICB9LCBbX25ld1JlbmRlcl0pO1xuICAgIGNvbnN0IHNldFByb3BzID0gKG5ld1Byb3BzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IHJlbmRlckNvbXBvbmVudFByb3BzO1xuICAgICAgICBjb25zdCB7IF9kYXNoX2Vycm9yLCAuLi5yZXN0UHJvcHMgfSA9IG5ld1Byb3BzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGlzcGF0Y2goKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzIH0gPSBjdXJyZW50U3RhdGU7XG4gICAgICAgICAgICBjb25zdCBvbGRMYXlvdXQgPSBnZXRDb21wb25lbnRMYXlvdXQocmVuZGVyZWRQYXRoLmN1cnJlbnQsIGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoIW9sZExheW91dClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB7IHByb3BzOiBvbGRQcm9wcyB9ID0gb2xkTGF5b3V0O1xuICAgICAgICAgICAgaWYgKCFvbGRQcm9wcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSBwaWNrQnkoKHZhbCwga2V5KSA9PiAhZXF1YWxzKHZhbCwgb2xkUHJvcHNba2V5XSksIHJlc3RQcm9wcyk7XG4gICAgICAgICAgICBpZiAoX2Rhc2hfZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9kYXNoX2Vycm9yXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2hhbmdlZFByb3BzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSBtb2RpZmllZCBwcm9wcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgY2FsbGJhY2tzXG4gICAgICAgICAgICBjb25zdCB3YXRjaGVkS2V5cyA9IGdldFdhdGNoZWRLZXlzKGlkLCBrZXlzKGNoYW5nZWRQcm9wcyksIGdyYXBocyk7XG4gICAgICAgICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkaXNwYXRjaCBjaGFuZ2VzIHRvIERhc2ggaWYgYSB3YXRjaGVkIHByb3AgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmICh3YXRjaGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHBpY2sod2F0Y2hlZEtleXMsIGNoYW5nZWRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHRoaXMgY29tcG9uZW50J3MgcHJvcHNcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBjaGFuZ2VkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1wYXRoOiByZW5kZXJlZFBhdGguY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2ludGVybmFsJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGNyZWF0ZUNvbnRhaW5lciA9IHVzZUNhbGxiYWNrKChjb250YWluZXIsIGNvbnRhaW5lclBhdGgsIF9jaGlsZE5ld1JlbmRlcikgPT4ge1xuICAgICAgICBpZiAoaXNTaW1wbGVDb21wb25lbnQocmVuZGVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlckNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGFzaFdyYXBwZXIsIHsga2V5OiBjb250YWluZXI/LnByb3BzPy5pZFxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5SWQoY29udGFpbmVyLnByb3BzLmlkKVxuICAgICAgICAgICAgICAgIDogc3RyaW5naWZ5UGF0aChjb250YWluZXJQYXRoKSwgX2Rhc2hwcml2YXRlX2Vycm9yOiBfZGFzaHByaXZhdGVfZXJyb3IsIGNvbXBvbmVudFBhdGg6IGNvbnRhaW5lclBhdGgsIF9wYXNzZWRDb21wb25lbnQ6IGNvbnRhaW5lciwgX25ld1JlbmRlcjogX2NoaWxkTmV3UmVuZGVyIH0pKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3Qgd3JhcENoaWxkcmVuUHJvcCA9IHVzZUNhbGxiYWNrKChub2RlLCBjaGlsZHJlblBhdGgsIF9jaGlsZE5ld1JlbmRlcikgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFwKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRHJ5Q29tcG9uZW50KG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobiwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgICAgIF0pLCBfY2hpbGROZXdSZW5kZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEcnlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobm9kZSwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFsncHJvcHMnLCAuLi5jaGlsZHJlblBhdGhdKSwgX2NoaWxkTmV3UmVuZGVyKTtcbiAgICB9LCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IGV4dHJhUHJvcHMgPSB7XG4gICAgICAgIHNldFByb3BzLFxuICAgICAgICAuLi5leHRyYXNcbiAgICB9O1xuICAgIGlmIChjaGVja1JlbmRlclR5cGVQcm9wKHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgZXh0cmFQcm9wc1snZGFzaFJlbmRlclR5cGUnXSA9IG5ld1JlbmRlci5jdXJyZW50XG4gICAgICAgICAgICA/ICdwYXJlbnQnXG4gICAgICAgICAgICA6IGNoYW5nZWRQcm9wc1xuICAgICAgICAgICAgICAgID8gcmVuZGVyVHlwZVxuICAgICAgICAgICAgICAgIDogJ3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IHNldEh5ZHJhdGVkUHJvcHMgPSAoY29tcG9uZW50LCBjb21wb25lbnRQcm9wcykgPT4ge1xuICAgICAgICAvLyBIeWRyYXRlIGNvbXBvbmVudHMgcHJvcHNcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihbXSwgWydjaGlsZHJlbl9wcm9wcycsIGNvbXBvbmVudD8ubmFtZXNwYWNlLCBjb21wb25lbnQ/LnR5cGVdLCBjb25maWcpO1xuICAgICAgICBsZXQgcHJvcHMgPSBtZXJnZVJpZ2h0KGRpc3NvYygnY2hpbGRyZW4nLCBjb21wb25lbnRQcm9wcyksIGV4dHJhUHJvcHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcCA9IGNoaWxkcmVuUHJvcHNbaV07XG4gICAgICAgICAgICBsZXQgY2hpbGROZXdSZW5kZXIgPSAwO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpWzBdXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1tdJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3t9JywgJycpIGluIGNoYW5nZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgIXJlbmRlckgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZE5ld1JlbmRlciA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKG9iaiwgb3BhdGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqSW5kZXhlZCgobm9kZSwgaykgPT4gd3JhcENoaWxkcmVuUHJvcChub2RlLCBbLi4ub3BhdGgsIGtdLCBjaGlsZE5ld1JlbmRlciksIG9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXSwgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2UsIGhhc09iamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaXJzdCB0aGUgY2hpbGRyZW5QYXRoIGlzIGFsd2F5cyBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykucmVwbGFjZSgnW10nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXRoKGZyb250UGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8ICFub2RlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHBhdGgoYmFja1BhdGgsIG5vZGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gbm9kZS5tYXAoKGVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50UGF0aCA9IGNvbmNhdChmcm9udFBhdGgsIGNvbmNhdChbaV0sIGJhY2tQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KHBhdGgoYmFja1BhdGgsIGVsKSwgZWxlbWVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KGVsLCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gd3JhcENoaWxkcmVuUHJvcChwYXRoKGJhY2tQYXRoLCBlbCksIGVsZW1lbnRQYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGJhY2tQYXRoLCBsaXN0VmFsdWUsIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGZyb250UGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNCYWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlblBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBjaGlsZHJlblBhdGhbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljID0gY29uY2F0KGZyb250LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIucmVwbGFjZSgne30nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgY2hpbGRyZW5QYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHluVmFsdWUgPSBwYXRoKGR5bmFtaWMsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGR5bmFtaWMgZm9yIHByb3BlciB0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG1hcE9iakluZGV4ZWQoKGQsIGspID0+IHdyYXBDaGlsZHJlblByb3AoaGFzQmFjayA/IHBhdGgoYmFja1BhdGgsIGQpIDogZCwgaGFzQmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmNhdChkeW5hbWljLCBjb25jYXQoW2tdLCBiYWNrUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uY2F0KGR5bmFtaWMsIFtrXSksIGNoaWxkTmV3UmVuZGVyKSwgZHluVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGR5bmFtaWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gcGF0aChjaGlsZHJlblBhdGgsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IHdyYXBDaGlsZHJlblByb3Aobm9kZSwgY2hpbGRyZW5QYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgoY2hpbGRyZW5QYXRoLCBub2RlVmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnJlcGxhY2UoJ3t9JywgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGggPSBvcGF0aC5yZXBsYWNlKCdbXScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbb3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhUGF0aCA9IGNvbmNhdChbb3BhdGhdLCBbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChhUGF0aCwgaGFuZGxlT2JqZWN0KG5vZGVbal0sIGFQYXRoKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2Mob3BhdGgsIGhhbmRsZU9iamVjdChub2RlLCBbb3BhdGhdKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbY2hpbGRyZW5Qcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhjaGlsZHJlblByb3AsIHdyYXBDaGlsZHJlblByb3Aobm9kZSwgW2NoaWxkcmVuUHJvcF0sIGNoaWxkTmV3UmVuZGVyKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlKHByb3BzLmlkKSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFR1cm4gb2JqZWN0IGlkcyAoZm9yIHdpbGRjYXJkcykgaW50byB1bmlxdWUgc3RyaW5ncy5cbiAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGBkaXNzb2NgIGFib3ZlIHdlJ3JlIG5vdCBtdXRhdGluZyB0aGUgbGF5b3V0LFxuICAgICAgICAgICAgLy8ganVzdCB0aGUgaWQgd2UgcGFzcyBvbiB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAgICAgICAgICBwcm9wcy5pZCA9IHN0cmluZ2lmeUlkKHByb3BzLmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICBjb25zdCBoeWRyYXRlRnVuYyA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5ld1JlbmRlci5jdXJyZW50KSB7XG4gICAgICAgICAgICByZW5kZXJDb21wb25lbnQgPSBfcGFzc2VkQ29tcG9uZW50O1xuICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBfcGFzc2VkQ29tcG9uZW50Py5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlbmRlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUocmVuZGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWRQcm9wcyA9IHNldEh5ZHJhdGVkUHJvcHMocmVuZGVyQ29tcG9uZW50LCByZW5kZXJDb21wb25lbnRQcm9wcyk7XG4gICAgICAgIGxldCBoeWRyYXRlZENoaWxkcmVuO1xuICAgICAgICBpZiAocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRDaGlsZHJlbiA9IHdyYXBDaGlsZHJlblByb3AocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4sIFsnY2hpbGRyZW4nXSwgIXJlbmRlckggfHwgbmV3UmVuZGVyLmN1cnJlbnQgfHwgJ2NoaWxkcmVuJyBpbiBjaGFuZ2VkUHJvcHNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnByb3BzX2NoZWNrID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tlZENvbXBvbmVudCwgeyBlbGVtZW50OiBlbGVtZW50LCBwcm9wczogaHlkcmF0ZWRQcm9wcywgY29tcG9uZW50OiByZW5kZXJDb21wb25lbnQgfSwgY3JlYXRlRWxlbWVudChlbGVtZW50LCBoeWRyYXRlZFByb3BzLCBleHRyYVByb3BzLCBoeWRyYXRlZENoaWxkcmVuKSkpIDogKGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgaHlkcmF0ZWRQcm9wcywgZXh0cmFQcm9wcywgaHlkcmF0ZWRDaGlsZHJlbikpO1xuICAgIH07XG4gICAgbGV0IGh5ZHJhdGVkID0gbnVsbDtcbiAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCAmJiAhbmV3UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgICAgaHlkcmF0ZWQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudChtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXSlcbiAgICAgICAgICAgID8gbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCFoeWRyYXRlZCkge1xuICAgICAgICBoeWRyYXRlZCA9IGh5ZHJhdGVGdW5jKCk7XG4gICAgICAgIG1lbW9pemVkS2V5cy5jdXJyZW50ID0geyBbcmVuZGVySF06IGh5ZHJhdGVkIH07XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJDb21wb25lbnQgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnRFcnJvckJvdW5kYXJ5LCB7IGNvbXBvbmVudFR5cGU6IHJlbmRlckNvbXBvbmVudC50eXBlLCBjb21wb25lbnRJZDogaXMoT2JqZWN0LCByZW5kZXJDb21wb25lbnRQcm9wcy5pZClcbiAgICAgICAgICAgID8gc3RyaW5naWZ5SWQocmVuZGVyQ29tcG9uZW50UHJvcHMuaWQpXG4gICAgICAgICAgICA6IHJlbmRlckNvbXBvbmVudFByb3BzLmlkLCBlcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBkaXNwYXRjaDogZGlzcGF0Y2ggfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoQ29udGV4dFByb3ZpZGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoaHlkcmF0ZWQpID8gaHlkcmF0ZWQgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpKSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGFzaFdyYXBwZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGJhdGNoLCB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBEYXNoV3JhcHBlciBmcm9tICcuL0Rhc2hXcmFwcGVyJztcbmltcG9ydCB7IGFkZENvbXBvbmVudFRvTGF5b3V0LCBub3RpZnlPYnNlcnZlcnMsIHJlbW92ZUNvbXBvbmVudCwgdXBkYXRlUHJvcHMgfSBmcm9tICcuLi9hY3Rpb25zJztcbi8qKlxuICogRm9yIHJlbmRlcmluZyBjb21wb25lbnRzIHRoYXQgYXJlIG91dCBvZiB0aGUgcmVndWxhciBsYXlvdXQgdHJlZS5cbiAqL1xuZnVuY3Rpb24gRXh0ZXJuYWxXcmFwcGVyKHsgY29tcG9uZW50LCBjb21wb25lbnRQYXRoLCB0ZW1wID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcbiAgICBjb25zdCBbaW5zZXJ0ZWQsIHNldEluc2VydGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAvLyBHaXZlIGVtcHR5IHByb3BzIGZvciB0aGUgaW5zZXJ0ZWQgY29tcG9uZW50cy5cbiAgICAgICAgLy8gVGhlIHByb3BzIHdpbGwgY29tZSBmcm9tIHRoZSBwYXJlbnQgc28gdGhleSBjYW4gYmUgdXBkYXRlZC5cbiAgICAgICAgZGlzcGF0Y2goYWRkQ29tcG9uZW50VG9MYXlvdXQoe1xuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgY29tcG9uZW50UGF0aFxuICAgICAgICB9KSk7XG4gICAgICAgIHNldEluc2VydGVkKHRydWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbXApIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDb21wb25lbnQoeyBjb21wb25lbnRQYXRoIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoeyBpdGVtcGF0aDogY29tcG9uZW50UGF0aCwgcHJvcHM6IGNvbXBvbmVudC5wcm9wcyB9KSk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnByb3BzLmlkKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbXBvbmVudC5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGNvbXBvbmVudC5wcm9wc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW2NvbXBvbmVudC5wcm9wc10pO1xuICAgIGlmICghaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJlbmRlciBhIHdyYXBwZXIgd2l0aCB0aGUgYWN0dWFsIHByb3BzLlxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSk7XG59XG5leHBvcnQgZGVmYXVsdCBFeHRlcm5hbFdyYXBwZXI7XG4iLCJpbXBvcnQgeyBnZXRDb21wb25lbnRMYXlvdXQsIHN0cmluZ2lmeVBhdGgsIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgeyBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5jb25zdCBwcmV2aW91c0hhc2hlcyA9IHt9O1xuY29uc3QgaXNGaXJzdExldmVsUHJvcHNDaGlsZCA9ICh1cGRhdGVkUGF0aCwgc3RyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRTZWdtZW50cyA9IHVwZGF0ZWRQYXRoLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgZnVsbFNlZ21lbnRzID0gc3RyUGF0aC5zcGxpdCgnLCcpO1xuICAgIC8vIENoZWNrIHRoYXQgc3RyUGF0aCBhY3R1YWxseSBzdGFydHMgd2l0aCB1cGRhdGVkUGF0aFxuICAgIGNvbnN0IHN0YXJ0c1dpdGhQYXRoID0gZnVsbFNlZ21lbnRzLmV2ZXJ5KChzZWcsIGkpID0+IHVwZGF0ZWRTZWdtZW50c1tpXSA9PT0gc2VnKTtcbiAgICBpZiAoIXN0YXJ0c1dpdGhQYXRoKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCBbXV07XG4gICAgLy8gR2V0IHRoZSByZW1haW5pbmcgcGF0aCBhZnRlciB0aGUgcHJlZml4XG4gICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSB1cGRhdGVkU2VnbWVudHMuc2xpY2UoZnVsbFNlZ21lbnRzLmxlbmd0aCk7XG4gICAgY29uc3QgcHJvcHNDb3VudCA9IHJlbWFpbmluZ1NlZ21lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwcm9wcycpLmxlbmd0aDtcbiAgICByZXR1cm4gW3Byb3BzQ291bnQgPCAyLCByZW1haW5pbmdTZWdtZW50c107XG59O1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ2hhbmdlZFByb3BzKHN0YXRlLCBzdHJQYXRoKSB7XG4gICAgbGV0IGNvbWJpbmVkSGFzaCA9IDA7XG4gICAgbGV0IHJlbmRlclR5cGU7IC8vIERlZmF1bHQgcmVuZGVyIHR5cGUsIGFkanVzdCBhcyBuZWVkZWRcbiAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhzdGF0ZS5sYXlvdXRIYXNoZXMpLmZvckVhY2goKFt1cGRhdGVkUGF0aCwgcGF0aEhhc2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IFtkZXNjZW5kYW50LCByZW1haW5pbmdTZWdtZW50c10gPSBpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkKHVwZGF0ZWRQYXRoLCBzdHJQYXRoKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSGFzaCA9IHBhdGhPcih7fSwgW3VwZGF0ZWRQYXRoXSwgcHJldmlvdXNIYXNoZXMpO1xuICAgICAgICAgICAgY29tYmluZWRIYXNoICs9IHBhdGhPcigwLCBbJ2hhc2gnXSwgcGF0aEhhc2gpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzSGFzaCAhPT0gcGF0aEhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFBhdGggIT09IHN0clBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIHsgW3JlbWFpbmluZ1NlZ21lbnRzWzFdXTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZSA9ICdjb21wb25lbnRzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBwYXRoT3Ioe30sIFsnY2hhbmdlZFByb3BzJ10sIHBhdGhIYXNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGUgPSBwYXRoT3Ioe30sIFsncmVuZGVyVHlwZSddLCBwYXRoSGFzaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzSGFzaGVzW3VwZGF0ZWRQYXRoXSA9IHBhdGhIYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGFzaDogY29tYmluZWRIYXNoLFxuICAgICAgICBjaGFuZ2VkUHJvcHMsXG4gICAgICAgIHJlbmRlclR5cGVcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdERhc2hQcm9wcyA9IChjb21wb25lbnRQYXRoKSA9PiAoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjID0gZ2V0Q29tcG9uZW50TGF5b3V0KGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICAvLyBMYXlvdXQgaGFzaGVzIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHBhdGggaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAvLyBzdW0gd2l0aCB0aGUgcGFyZW50cyBoYXNoIChtYXRjaCB3aXRob3V0IHRoZSBsYXN0ICddJykgdG8gZ2V0IHRoZSByZWFsIGhhc2hcbiAgICAvLyBUaGVuIGl0IGNhbiBiZSBlYXNpbHkgY29tcGFyZWQgd2l0aG91dCBoYXZpbmcgdG8gY29tcGFyZSB0aGUgcHJvcHMuXG4gICAgY29uc3Qgc3RyUGF0aCA9IHN0cmluZ2lmeVBhdGgoY29tcG9uZW50UGF0aCk7XG4gICAgbGV0IGhhc2g7XG4gICAgaWYgKGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGMpKSB7XG4gICAgICAgIGhhc2ggPSBkZXRlcm1pbmVDaGFuZ2VkUHJvcHMoc3RhdGUsIHN0clBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaGFzaCA9IHN0YXRlLmxheW91dEhhc2hlc1tzdHJQYXRoXTtcbiAgICB9XG4gICAgbGV0IGggPSAwO1xuICAgIGxldCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBsZXQgcmVuZGVyVHlwZSA9ICcnO1xuICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGggPSBoYXNoWydoYXNoJ107XG4gICAgICAgIGNoYW5nZWRQcm9wcyA9IGhhc2hbJ2NoYW5nZWRQcm9wcyddO1xuICAgICAgICByZW5kZXJUeXBlID0gaGFzaFsncmVuZGVyVHlwZSddO1xuICAgIH1cbiAgICByZXR1cm4gW2MsIGM/LnByb3BzLCBoLCBjaGFuZ2VkUHJvcHMsIHJlbmRlclR5cGVdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuKFtfLCBfXywgaGFzaF0sIFtfX18sIF9fX18sIHByZXZpb3VzSGFzaF0pIHtcbiAgICAvLyBPbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgaGFzaCBhcyBhbnkgY2hhbmdlIGlzIHN1bW1lZCB1cFxuICAgIHJldHVybiBoYXNoID09PSBwcmV2aW91c0hhc2g7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29uZmlnKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZVJpZ2h0LCBwYXRoLCB0eXBlLCBoYXMsIGpvaW4sIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGFsbFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgZXh0cmFQcm9wcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCAuLi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCBjaGlsZHJlbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEcnlDb21wb25lbnQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlKG9iaikgPT09ICdPYmplY3QnICYmXG4gICAgICAgIGhhcygndHlwZScsIG9iaikgJiZcbiAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBvYmopICYmXG4gICAgICAgIGhhcygncHJvcHMnLCBvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdBcnJheScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYSBjb21wb25lbnQgaXMgYSBsaXN0IG9mIGxpc3RzLCBpbnN0ZWFkICcgK1xuICAgICAgICAgICAgJ29mIGp1c3QgYSBsaXN0LiBUaGlzIGNhbiBzb21ldGltZXMgYmUgZHVlIHRvIGEgdHJhaWxpbmcgY29tbWEuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cyAnICtcbiAgICAgICAgICAgICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGUgbGV2ZWxzIG9mIG5lc3Rpbmc6IFxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAodHlwZShjb21wb25lbnREZWZpbml0aW9uKSA9PT0gJ09iamVjdCcgJiZcbiAgICAgICAgIShoYXMoJ25hbWVzcGFjZScsIGNvbXBvbmVudERlZmluaXRpb24pICYmXG4gICAgICAgICAgICBoYXMoJ3R5cGUnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCdwcm9wcycsIGNvbXBvbmVudERlZmluaXRpb24pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgYGNoaWxkcmVuYCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICdzdHJpbmcsIG9yIG51bWJlciAob3IgbGlzdCBvZiB0aG9zZSkuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlOlxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlQYXRoKGxheW91dFBhdGgpIHtcbiAgICByZXR1cm4gam9pbignLCcsIGxheW91dFBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSkge1xuICAgIHJldHVybiBwYXRoKGNvbXBvbmVudFBhdGgsIHN0YXRlLmxheW91dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tSZW5kZXJUeXBlUHJvcChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICgnZGFzaFJlbmRlclR5cGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICByZXR1cm4gKCdkYXNoQ2hpbGRyZW5VcGRhdGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJQcm9wVHlwZXNcIl07IiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJSZWFjdFwiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0RE9NXCJdOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5uYyA9IHVuZGVmaW5lZDsiLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbnZhciBnID1cbiAgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzKSB8fFxuICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSB8fFxuICB7fVxuXG52YXIgc3VwcG9ydCA9IHtcbiAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBnLFxuICBpdGVyYWJsZTogJ1N5bWJvbCcgaW4gZyAmJiAnaXRlcmF0b3InIGluIFN5bWJvbCxcbiAgYmxvYjpcbiAgICAnRmlsZVJlYWRlcicgaW4gZyAmJlxuICAgICdCbG9iJyBpbiBnICYmXG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KSgpLFxuICBmb3JtRGF0YTogJ0Zvcm1EYXRhJyBpbiBnLFxuICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBnXG59XG5cbmZ1bmN0aW9uIGlzRGF0YVZpZXcob2JqKSB7XG4gIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKVxufVxuXG5pZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgXVxuXG4gIHZhciBpc0FycmF5QnVmZmVyVmlldyA9XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3IHx8XG4gICAgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgbmFtZSA9IFN0cmluZyhuYW1lKVxuICB9XG4gIGlmICgvW15hLXowLTlcXC0jJCUmJyorLl5fYHx+IV0vaS50ZXN0KG5hbWUpIHx8IG5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWU6IFwiJyArIG5hbWUgKyAnXCInKVxuICB9XG4gIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbmZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKSB7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW1zLnNoaWZ0KClcbiAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdGhpcy5tYXAgPSB7fVxuXG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlci5sZW5ndGggIT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdIZWFkZXJzIGNvbnN0cnVjdG9yOiBleHBlY3RlZCBuYW1lL3ZhbHVlIHBhaXIgdG8gYmUgbGVuZ3RoIDIsIGZvdW5kJyArIGhlYWRlci5sZW5ndGgpXG4gICAgICB9XG4gICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKGhlYWRlcnMpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pXG4gICAgfSwgdGhpcylcbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICB2YWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXVxuICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUgKyAnLCAnICsgdmFsdWUgOiB2YWx1ZVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihuYW1lKSB7XG4gIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcylcbiAgICB9XG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKG5hbWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIGl0ZW1zLnB1c2godmFsdWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcbn1cblxuZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICBpZiAoYm9keS5fbm9Cb2R5KSByZXR1cm5cbiAgaWYgKGJvZHkuYm9keVVzZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gIH1cbiAgYm9keS5ib2R5VXNlZCA9IHRydWVcbn1cblxuZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KVxuICAgIH1cbiAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICB2YXIgbWF0Y2ggPSAvY2hhcnNldD0oW0EtWmEtejAtOV8tXSspLy5leGVjKGJsb2IudHlwZSlcbiAgdmFyIGVuY29kaW5nID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICd1dGYtOCdcbiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYiwgZW5jb2RpbmcpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRBcnJheUJ1ZmZlckFzVGV4dChidWYpIHtcbiAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpXG4gIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmlld1tpXSlcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJylcbn1cblxuZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gIGlmIChidWYuc2xpY2UpIHtcbiAgICByZXR1cm4gYnVmLnNsaWNlKDApXG4gIH0gZWxzZSB7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aClcbiAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWYpKVxuICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICB9XG59XG5cbmZ1bmN0aW9uIEJvZHkoKSB7XG4gIHRoaXMuYm9keVVzZWQgPSBmYWxzZVxuXG4gIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24oYm9keSkge1xuICAgIC8qXG4gICAgICBmZXRjaC1tb2NrIHdyYXBzIHRoZSBSZXNwb25zZSBvYmplY3QgaW4gYW4gRVM2IFByb3h5IHRvXG4gICAgICBwcm92aWRlIHVzZWZ1bCB0ZXN0IGhhcm5lc3MgZmVhdHVyZXMgc3VjaCBhcyBmbHVzaC4gSG93ZXZlciwgb25cbiAgICAgIEVTNSBicm93c2VycyB3aXRob3V0IGZldGNoIG9yIFByb3h5IHN1cHBvcnQgcG9sbHlmaWxscyBtdXN0IGJlIHVzZWQ7XG4gICAgICB0aGUgcHJveHktcG9sbHlmaWxsIGlzIHVuYWJsZSB0byBwcm94eSBhbiBhdHRyaWJ1dGUgdW5sZXNzIGl0IGV4aXN0c1xuICAgICAgb24gdGhlIG9iamVjdCBiZWZvcmUgdGhlIFByb3h5IGlzIGNyZWF0ZWQuIFRoaXMgY2hhbmdlIGVuc3VyZXNcbiAgICAgIFJlc3BvbnNlLmJvZHlVc2VkIGV4aXN0cyBvbiB0aGUgaW5zdGFuY2UsIHdoaWxlIG1haW50YWluaW5nIHRoZVxuICAgICAgc2VtYW50aWMgb2Ygc2V0dGluZyBSZXF1ZXN0LmJvZHlVc2VkIGluIHRoZSBjb25zdHJ1Y3RvciBiZWZvcmVcbiAgICAgIF9pbml0Qm9keSBpcyBjYWxsZWQuXG4gICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICB0aGlzLmJvZHlVc2VkID0gdGhpcy5ib2R5VXNlZFxuICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgIGlmICghYm9keSkge1xuICAgICAgdGhpcy5fbm9Cb2R5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keS50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcilcbiAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsIHRoaXMuX2JvZHlCbG9iLnR5cGUpXG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgaXNDb25zdW1lZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAoaXNDb25zdW1lZCkge1xuICAgICAgICByZXR1cm4gaXNDb25zdW1lZFxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5fYm9keUFycmF5QnVmZmVyKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5idWZmZXIuc2xpY2UoXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0ICsgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgYXMgQXJyYXlCdWZmZXInKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oZGVjb2RlKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbnZhciBtZXRob2RzID0gWydDT05ORUNUJywgJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BBVENIJywgJ1BPU1QnLCAnUFVUJywgJ1RSQUNFJ11cblxuZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlcXVlc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHlcblxuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgIH1cbiAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFsc1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZFxuICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbFxuICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdFxuICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMudXJsID0gU3RyaW5nKGlucHV0KVxuICB9XG5cbiAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nXG4gIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgfVxuICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsXG4gIHRoaXMuc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgfHwgdGhpcy5zaWduYWwgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ0Fib3J0Q29udHJvbGxlcicgaW4gZykge1xuICAgICAgdmFyIGN0cmwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXR1cm4gY3RybC5zaWduYWw7XG4gICAgfVxuICB9KCkpO1xuICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cycpXG4gIH1cbiAgdGhpcy5faW5pdEJvZHkoYm9keSlcblxuICBpZiAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gJ25vLXN0b3JlJyB8fCBvcHRpb25zLmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAvLyBTZWFyY2ggZm9yIGEgJ18nIHBhcmFtZXRlciBpbiB0aGUgcXVlcnkgc3RyaW5nXG4gICAgICB2YXIgcmVQYXJhbVNlYXJjaCA9IC8oWz8mXSlfPVteJl0qL1xuICAgICAgaWYgKHJlUGFyYW1TZWFyY2gudGVzdCh0aGlzLnVybCkpIHtcbiAgICAgICAgLy8gSWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlbiBzZXQgdGhlIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnJlcGxhY2UocmVQYXJhbVNlYXJjaCwgJyQxXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGEgbmV3ICdfJyBwYXJhbWV0ZXIgdG8gdGhlIGVuZCB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdmFyIHJlUXVlcnlTdHJpbmcgPSAvXFw/L1xuICAgICAgICB0aGlzLnVybCArPSAocmVRdWVyeVN0cmluZy50ZXN0KHRoaXMudXJsKSA/ICcmJyA6ICc/JykgKyAnXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHtib2R5OiB0aGlzLl9ib2R5SW5pdH0pXG59XG5cbmZ1bmN0aW9uIGRlY29kZShib2R5KSB7XG4gIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgYm9keVxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJyYnKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gZm9ybVxufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgLy8gUmVwbGFjZSBpbnN0YW5jZXMgb2YgXFxyXFxuIGFuZCBcXG4gZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIHNwYWNlIG9yIGhvcml6b250YWwgdGFiIHdpdGggYSBzcGFjZVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMlxuICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXFxyP1xcbltcXHQgXSsvZywgJyAnKVxuICAvLyBBdm9pZGluZyBzcGxpdCB2aWEgcmVnZXggdG8gd29yayBhcm91bmQgYSBjb21tb24gSUUxMSBidWcgd2l0aCB0aGUgY29yZS1qcyAzLjYuMCByZWdleCBwb2x5ZmlsbFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2ZldGNoL2lzc3Vlcy83NDhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzc1MVxuICBwcmVQcm9jZXNzZWRIZWFkZXJzXG4gICAgLnNwbGl0KCdcXHInKVxuICAgIC5tYXAoZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXR1cm4gaGVhZGVyLmluZGV4T2YoJ1xcbicpID09PSAwID8gaGVhZGVyLnN1YnN0cigxLCBoZWFkZXIubGVuZ3RoKSA6IGhlYWRlclxuICAgIH0pXG4gICAgLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnOicpXG4gICAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKS50cmltKClcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOicpLnRyaW0oKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdSZXNwb25zZSAnICsgZXJyb3IubWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbkJvZHkuY2FsbChSZXF1ZXN0LnByb3RvdHlwZSlcblxuZXhwb3J0IGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNwb25zZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cblxuICB0aGlzLnR5cGUgPSAnZGVmYXVsdCdcbiAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXNcbiAgaWYgKHRoaXMuc3RhdHVzIDwgMjAwIHx8IHRoaXMuc3RhdHVzID4gNTk5KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXNwb25zZSc6IFRoZSBzdGF0dXMgcHJvdmlkZWQgKDApIGlzIG91dHNpZGUgdGhlIHJhbmdlIFsyMDAsIDU5OV0uXCIpXG4gIH1cbiAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICB0aGlzLnN0YXR1c1RleHQgPSBvcHRpb25zLnN0YXR1c1RleHQgPT09IHVuZGVmaW5lZCA/ICcnIDogJycgKyBvcHRpb25zLnN0YXR1c1RleHRcbiAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KVxufVxuXG5Cb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwge1xuICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgdXJsOiB0aGlzLnVybFxuICB9KVxufVxuXG5SZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMjAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gIHJlc3BvbnNlLm9rID0gZmFsc2VcbiAgcmVzcG9uc2Uuc3RhdHVzID0gMFxuICByZXNwb25zZS50eXBlID0gJ2Vycm9yJ1xuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxudmFyIHJlZGlyZWN0U3RhdHVzZXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5cblJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxufVxuXG5leHBvcnQgdmFyIERPTUV4Y2VwdGlvbiA9IGcuRE9NRXhjZXB0aW9uXG50cnkge1xuICBuZXcgRE9NRXhjZXB0aW9uKClcbn0gY2F0Y2ggKGVycikge1xuICBET01FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFja1xuICB9XG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcblxuICAgIGZ1bmN0aW9uIGFib3J0WGhyKCkge1xuICAgICAgeGhyLmFib3J0KClcbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgfHwgJycpXG4gICAgICB9XG4gICAgICAvLyBUaGlzIGNoZWNrIGlmIHNwZWNpZmljYWxseSBmb3Igd2hlbiBhIHVzZXIgZmV0Y2hlcyBhIGZpbGUgbG9jYWxseSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICAgICAgLy8gT25seSBpZiB0aGUgc3RhdHVzIGlzIG91dCBvZiBhIG5vcm1hbCByYW5nZVxuICAgICAgaWYgKHJlcXVlc3QudXJsLmluZGV4T2YoJ2ZpbGU6Ly8nKSA9PT0gMCAmJiAoeGhyLnN0YXR1cyA8IDIwMCB8fCB4aHIuc3RhdHVzID4gNTk5KSkge1xuICAgICAgICBvcHRpb25zLnN0YXR1cyA9IDIwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0geGhyLnN0YXR1cztcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCBvcHRpb25zKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgdGltZWQgb3V0JykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpeFVybCh1cmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cmwgPT09ICcnICYmIGcubG9jYXRpb24uaHJlZiA/IGcubG9jYXRpb24uaHJlZiA6IHVybFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdXJsXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIGZpeFVybChyZXF1ZXN0LnVybCksIHRydWUpXG5cbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKSB7XG4gICAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHN1cHBvcnQuYXJyYXlCdWZmZXJcbiAgICAgICkge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmhlYWRlcnMgPT09ICdvYmplY3QnICYmICEoaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycyB8fCAoZy5IZWFkZXJzICYmIGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIGcuSGVhZGVycykpKSB7XG4gICAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaXQuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIG5hbWVzLnB1c2gobm9ybWFsaXplTmFtZShuYW1lKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgbm9ybWFsaXplVmFsdWUoaW5pdC5oZWFkZXJzW25hbWVdKSlcbiAgICAgIH0pXG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAobmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkge1xuICAgICAgcmVxdWVzdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcblxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICB9KVxufVxuXG5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcblxuaWYgKCFnLmZldGNoKSB7XG4gIGcuZmV0Y2ggPSBmZXRjaFxuICBnLkhlYWRlcnMgPSBIZWFkZXJzXG4gIGcuUmVxdWVzdCA9IFJlcXVlc3RcbiAgZy5SZXNwb25zZSA9IFJlc3BvbnNlXG59XG4iLCJpbXBvcnQge0Rhc2hSZW5kZXJlcn0gZnJvbSAnLi9EYXNoUmVuZGVyZXInO1xuaW1wb3J0ICcuL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMnO1xuXG4vLyBtYWtlIERhc2hSZW5kZXJlciBnbG9iYWxseSBhdmFpbGFibGVcbndpbmRvdy5EYXNoUmVuZGVyZXIgPSBEYXNoUmVuZGVyZXI7XG4iXSwibmFtZXMiOlsid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJfdHlwZW9mIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzE0MF9fIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIl8iLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwidGd0IiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNyY3MiLCJBcnJheSIsIl9rZXkiLCJmb3JFYWNoIiwic3JjIiwia2V5cyIsImsiLCJfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwiX3NsaWNlZFRvQXJyYXkiLCJzbGljZUl0ZXJhdG9yIiwiYXJyIiwiaSIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJ1bmRlZmluZWQiLCJfaSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX3MiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJUeXBlRXJyb3IiLCJMaW5rZWRMaXN0IiwibGF5b3V0QmFzZSIsImF1eGlsaWFyeSIsImdldFRvcE1vc3ROb2RlcyIsIm5vZGVzIiwibm9kZXNNYXAiLCJpZCIsInJvb3RzIiwiZmlsdGVyIiwiZWxlIiwicGFyZW50IiwiY29ubmVjdENvbXBvbmVudHMiLCJjeSIsImVsZXMiLCJ0b3BNb3N0Tm9kZXMiLCJkdW1teU5vZGVzIiwicXVldWUiLCJ2aXNpdGVkIiwiU2V0IiwidmlzaXRlZFRvcE1vc3ROb2RlcyIsImN1cnJlbnROZWlnaGJvciIsIm1pbkRlZ3JlZU5vZGUiLCJtaW5EZWdyZWUiLCJpc0Nvbm5lY3RlZCIsImNvdW50Iiwibm9kZXNDb25uZWN0ZWRUb0R1bW15IiwiY29tcG9uZW50cyIsIl9sb29wIiwiY21wdCIsImNvbGxlY3Rpb24iLCJjdXJyZW50Tm9kZSIsImNoaWxkcmVuT2ZDdXJyZW50Tm9kZSIsIm1lcmdlIiwiZGVzY2VuZGFudHMiLCJpbnRlcnNlY3Rpb24iLCJub2RlIiwiYWRkIiwiX2xvb3AyIiwic2hpZnQiLCJuZWlnaGJvck5vZGVzIiwibmVpZ2hib3Job29kIiwiZWRnZXNXaXRoIiwibmVpZ2hib3JOb2RlIiwidW5pb24iLCJhbmNlc3RvcnMiLCJoYXMiLCJjaGlsZHJlbk9mTmVpZ2hib3IiLCJjb25uZWN0ZWRFZGdlcyIsImUiLCJzb3VyY2UiLCJ0YXJnZXQiLCJ0ZW1wIiwiZGlmZmVyZW5jZSIsInNldCIsInNpemUiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0Iiwib3B0aW9ucyIsImZpeGVkTm9kZUNvbnN0cmFpbnQiLCJtaW5YQ29vcmQiLCJOdW1iZXIiLCJQT1NJVElWRV9JTkZJTklUWSIsIm1heFhDb29yZCIsIk5FR0FUSVZFX0lORklOSVRZIiwibWluWUNvb3JkIiwibWF4WUNvb3JkIiwicXVhbGl0eSIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24iLCJfZGlkSXRlcmF0b3JFcnJvciIsIl9pdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yIiwibm9kZUluZGV4ZXMiLCJfc3RlcCIsIl9yZWYiLCJfcmVmMiIsImtleSIsImN5Tm9kZSIsImdldEVsZW1lbnRCeUlkIiwibm9kZUJCIiwiYm91bmRpbmdCb3giLCJsZWZ0WCIsInhDb29yZHMiLCJ3IiwicmlnaHRYIiwidG9wWSIsInlDb29yZHMiLCJoIiwiYm90dG9tWSIsInJldHVybiIsImRpZmZPblgiLCJ4IiwiZGlmZk9uWSIsInkiLCJtYXAiLCJpdGVtIiwiZ2V0UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwiX2RpZmZPblgiLCJfZGlmZk9uWSIsInNldENlbnRlciIsImdldENlbnRlclgiLCJnZXRDZW50ZXJZIiwiY2FsY0JvdW5kaW5nQm94IiwicGFyZW50Tm9kZSIsImxlZnQiLCJNQVhfU0FGRV9JTlRFR0VSIiwicmlnaHQiLCJNSU5fU0FGRV9JTlRFR0VSIiwidG9wIiwiYm90dG9tIiwibm9kZUxlZnQiLCJub2RlUmlnaHQiLCJub2RlVG9wIiwibm9kZUJvdHRvbSIsIm5vdCIsInMiLCJnZXQiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwiY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJwYXJlbnRzV2l0aG91dENoaWxkcmVuIiwiY2hlY2siLCJjaGlsZHJlbiIsImNoaWxkIiwiY3NzIiwiYXV4IiwiQ29TRUxheW91dCIsIkNvU0VOb2RlIiwiUG9pbnREIiwiRGltZW5zaW9uRCIsIkxheW91dENvbnN0YW50cyIsIkZETGF5b3V0Q29uc3RhbnRzIiwiQ29TRUNvbnN0YW50cyIsImNvc2VMYXlvdXQiLCJzcGVjdHJhbFJlc3VsdCIsImVkZ2VzIiwiaWRUb0xOb2RlIiwicmFuZG9taXplIiwiaXNGbiIsImZuIiwib3B0Rm4iLCJvcHQiLCJwcm9jZXNzQ2hpbGRyZW5MaXN0IiwibGF5b3V0IiwidGhlQ2hpbGQiLCJjaGlsZHJlbl9vZl9jaGlsZHJlbiIsInRoZU5vZGUiLCJkaW1lbnNpb25zIiwibGF5b3V0RGltZW5zaW9ucyIsIm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscyIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsImlzUGFyZW50IiwiZ3JhcGhNYW5hZ2VyIiwicGFyc2VGbG9hdCIsInBhcmVudEluZm8iLCJwb3NpdGlvbiIsImRhdGEiLCJub2RlUmVwdWxzaW9uIiwicGFkZGluZ0xlZnQiLCJwYXJzZUludCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwibGFiZWxXaWR0aCIsImluY2x1ZGVMYWJlbHMiLCJpbmNsdWRlTm9kZXMiLCJpbmNsdWRlT3ZlcmxheXMiLCJsYWJlbEhlaWdodCIsImxhYmVsUG9zVmVydGljYWwiLCJsYWJlbFBvc0hvcml6b250YWwiLCJpc05hTiIsInJlY3QiLCJ0aGVOZXdHcmFwaCIsImdldEdyYXBoTWFuYWdlciIsIm5ld0dyYXBoIiwicHJvY2Vzc0VkZ2VzIiwiZ20iLCJpZGVhbExlbmd0aFRvdGFsIiwiZWRnZUNvdW50IiwiZWRnZSIsInNvdXJjZU5vZGUiLCJ0YXJnZXROb2RlIiwiZ2V0RWRnZXNCZXR3ZWVuIiwiZTEiLCJuZXdFZGdlIiwiaWRlYWxMZW5ndGgiLCJpZGVhbEVkZ2VMZW5ndGgiLCJlZGdlRWxhc3RpY2l0eSIsIkRFRkFVTFRfRURHRV9MRU5HVEgiLCJNSU5fUkVQVUxTSU9OX0RJU1QiLCJERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OIiwicHJvY2Vzc0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhbGlnbm1lbnRDb25zdHJhaW50IiwicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50IiwibmVzdGluZ0ZhY3RvciIsIlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IiLCJncmF2aXR5IiwiREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIIiwibnVtSXRlciIsIk1BWF9JVEVSQVRJT05TIiwiZ3Jhdml0eVJhbmdlIiwiREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiIsImdyYXZpdHlDb21wb3VuZCIsIkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCIsImdyYXZpdHlSYW5nZUNvbXBvdW5kIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiIsImluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsIiwiREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCIsInRpbGluZ0NvbXBhcmVCeSIsIlRJTElOR19DT01QQVJFX0JZIiwiUVVBTElUWSIsIk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyIsIkRFRkFVTFRfSU5DUkVNRU5UQUwiLCJBTklNQVRFIiwiYW5pbWF0ZSIsIlRJTEUiLCJ0aWxlIiwiVElMSU5HX1BBRERJTkdfVkVSVElDQUwiLCJ0aWxpbmdQYWRkaW5nVmVydGljYWwiLCJjYWxsIiwiVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTCIsInRpbGluZ1BhZGRpbmdIb3Jpem9udGFsIiwiUFVSRV9JTkNSRU1FTlRBTCIsIkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMiLCJ1bmlmb3JtTm9kZURpbWVuc2lvbnMiLCJzdGVwIiwiVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkciLCJFTkZPUkNFX0NPTlNUUkFJTlRTIiwiQVBQTFlfTEFZT1VUIiwiVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwiLCJuZXdHcmFwaE1hbmFnZXIiLCJhZGRSb290IiwicnVuTGF5b3V0IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImRlZmluZVByb3BlcnR5IiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJwcm90b3R5cGUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIl9yZXF1aXJlIiwic3BlY3RyYWxMYXlvdXQiLCJfcmVxdWlyZTIiLCJkZWZhdWx0cyIsImZyZWV6ZSIsImFuaW1hdGlvbkR1cmF0aW9uIiwiYW5pbWF0aW9uRWFzaW5nIiwiZml0IiwicGFkZGluZyIsInBhY2tDb21wb25lbnRzIiwic2FtcGxpbmdUeXBlIiwic2FtcGxlU2l6ZSIsIm5vZGVTZXBhcmF0aW9uIiwicGlUb2wiLCJyZWFkeSIsInN0b3AiLCJMYXlvdXQiLCJydW4iLCJjb3NlUmVzdWx0IiwiY29tcG9uZW50Q2VudGVycyIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsImNvbnN0cmFpbnRFeGlzdCIsImxheVV0aWwiLCJwYWNraW5nRW5hYmxlZCIsImxheW91dFV0aWxpdGllcyIsIngxIiwieTEiLCJyZXN1bHQiLCJjb21wb25lbnQiLCJ0b0JlVGlsZWROb2RlcyIsIk1hcCIsIl94Q29vcmRzIiwiX3lDb29yZHMiLCJ0ZW1wU3BlY3RyYWxSZXN1bHQiLCJpbmRleGVzVG9CZURlbGV0ZWQiLCJpbmRleCIsIl9ib3VuZGluZ0JveCIsInNwbGljZSIsImNvbXBvbmVudHNFdmFsdWF0ZWQiLCJzdWJncmFwaHMiLCJoaWRkZW5FbGVzIiwic3ViZ3JhcGgiLCJub2RlSW5kZXgiLCJib3VuZGluZ2JveCIsImdldExlZnQiLCJnZXRUb3AiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInNvdXJjZU5vZGVJbmRleCIsInRhcmdldE5vZGVJbmRleCIsInNvdXJjZUNlbnRlciIsInRhcmdldENlbnRlciIsIl9wYXJlbnRJbmZvIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzaGlmdFJlc3VsdCIsInNoaWZ0cyIsIm5ld1hDb29yZHMiLCJkeCIsIm5ld1lDb29yZHMiLCJkeSIsIl9jb3VudCIsIm5vZGVSZWN0YW5nbGUiLCJnZXRQb3NpdGlvbnMiLCJwb3MiLCJ0aGVJZCIsIl9wb3MiLCJfaGlkZGVuRWxlcyIsImxheW91dFBvc2l0aW9ucyIsImNvbnNvbGUiLCJsb2ciLCJNYXRyaXgiLCJTVkQiLCJwYXJlbnROb2RlcyIsInBhcmVudENoaWxkTWFwIiwiYWxsTm9kZXNOZWlnaGJvcmhvb2QiLCJzYW1wbGVzQ29sdW1uIiwibWluRGlzdGFuY2VzQ29sdW1uIiwiQyIsIlBISSIsIklOViIsImZpcnN0U2FtcGxlIiwibm9kZVNpemUiLCJpbmZpbml0eSIsInNtYWxsIiwicmFuZG9tU2FtcGxlQ1IiLCJzYW1wbGUiLCJmbGFnIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiQkZTIiwicGl2b3QiLCJzYW1wbGluZ01ldGhvZCIsInBhdGgiLCJmcm9udCIsImJhY2siLCJjdXJyZW50IiwiZGlzdGFuY2UiLCJtYXhfZGlzdCIsIm1heF9pbmQiLCJuZWlnaGJvcnMiLCJfaTIiLCJfaTMiLCJhbGxCRlMiLCJfaTQiLCJfaTUiLCJfaTYiLCJqIiwiX2k3IiwiX2k4IiwiX2oiLCJTVkRSZXN1bHQiLCJzdmQiLCJhX3EiLCJTIiwiYV91IiwiVSIsImFfdiIsIlYiLCJtYXhfcyIsImFfU2lnIiwibXVsdE1hdCIsInRyYW5zcG9zZSIsInBvd2VySXRlcmF0aW9uIiwidGhldGExIiwidGhldGEyIiwiWTEiLCJZMiIsIlYxIiwiVjIiLCJub3JtYWxpemUiLCJwcmV2aW91cyIsIl9pOSIsIm11bHRHYW1tYSIsIm11bHRMIiwiZG90UHJvZHVjdCIsImFicyIsIl9pMTAiLCJfaTExIiwibWludXNPcCIsIm11bHRDb25zIiwiX2kxMiIsInNxcnQiLCJfaTEzIiwibWluIiwiZWxlMiIsImVsZUluZGV4IiwiZGlzY29ubmVjdGVkSWQiLCJfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiIsIl9kaWRJdGVyYXRvckVycm9yMiIsIl9pdGVyYXRvckVycm9yMiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfaTE0IiwiX2kxNSIsImZpcnN0Tm9kZSIsImZpcnN0Tm9kZVBvcyIsImZpcnN0Tm9kZVdpZHRoIiwic2Vjb25kTm9kZSIsInNlY29uZE5vZGVXaWR0aCIsImltcGwiLCJyZWdpc3RlciIsImN5dG9zY2FwZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jdXJyeTIiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJhbGwiLCJsaXN0IiwiaWR4IiwiX2N1cnJ5MSIsImFsd2F5cyIsInZhbCIsIl94YW55IiwiYW55IiwiX2NvbmNhdCIsIl9yZWR1Y2UiLCJhcCIsImFwcGx5RiIsImFwcGx5WCIsImFjYyIsImYiLCJhcHBlbmQiLCJlbCIsIl9jdXJyeTMiLCJhc3NvY1BhdGgiLCJhc3NvYyIsInByb3AiLCJvYmoiLCJfaGFzIiwiX2lzSW50ZWdlciIsIl9hc3NvYyIsImlzTmlsIiwibmV4dE9iaiIsInNsaWNlIiwiX2FyaXR5IiwidGhpc09iaiIsImFwcGx5IiwiX2Nsb25lIiwiY2xvbmUiLCJjb21wYXJhdG9yIiwicHJlZCIsImEiLCJiIiwiX2lzQXJyYXkiLCJfaXNGdW5jdGlvbiIsIl9pc1N0cmluZyIsInRvU3RyaW5nIiwiY29uY2F0IiwiX21hcCIsImN1cnJ5TiIsIm1heCIsInBsdWNrIiwicmVkdWNlIiwiY29udmVyZ2UiLCJhZnRlciIsImZucyIsImFyZ3MiLCJjb250ZXh0IiwiX2N1cnJ5TiIsImRlZmF1bHRUbyIsImQiLCJ2IiwiX1NldCIsImZpcnN0Iiwic2Vjb25kIiwib3V0IiwiZmlyc3RMZW4iLCJzZWNvbmRMZW4iLCJ0b0ZpbHRlck91dCIsImRpc3NvY1BhdGgiLCJkaXNzb2MiLCJfZGlzc29jIiwiX3NoYWxsb3dDbG9uZU9iamVjdCIsInAiLCJoZWFkIiwidGFpbCIsIl9pc0FyZ3VtZW50cyIsIl9pc09iamVjdCIsIl9pc1R5cGVkQXJyYXkiLCJlbXB0eSIsImNvbnN0cnVjdG9yIiwiZnJvbSIsIl9lcXVhbHMiLCJlcXVhbHMiLCJldm9sdmUiLCJ0cmFuc2Zvcm1hdGlvbnMiLCJvYmplY3QiLCJ0cmFuc2Zvcm1hdGlvbiIsInR5cGUiLCJfYXJyYXlSZWR1Y2UiLCJfZmlsdGVyIiwiX3hmaWx0ZXIiLCJmaWx0ZXJhYmxlIiwiX3hmaW5kIiwiZmluZCIsImxlbiIsIl94ZmluZEluZGV4IiwiZmluZEluZGV4IiwiX21ha2VGbGF0IiwiZmxhdHRlbiIsIl9jaGVja0Zvck1ldGhvZCIsImZvckVhY2hPYmpJbmRleGVkIiwia2V5TGlzdCIsInJlZHVjZUJ5IiwiZ3JvdXBCeSIsImhhc1BhdGgiLCJfcGF0aCIsIl9pZGVudGl0eSIsImlkZW50aXR5IiwiX2luY2x1ZGVzIiwiaW5jbHVkZXMiLCJfaW5kZXhPZiIsImluZGV4T2YiLCJ4cyIsImluc2VydCIsImVsdCIsIl9uYXRpdmVTZXQiLCJfaXRlbXMiLCJoYXNPckFkZCIsInNob3VsZEFkZCIsInByZXZTaXplIiwibmV3U2l6ZSIsIkluZmluaXR5IiwiYklkeCIsIm4iLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsIkVycm9yIiwiX2FycmF5RnJvbUl0ZXJhdG9yIiwiaXRlciIsInJlZHVjZXIiLCJtZXRob2RuYW1lIiwiX2Nsb25lUmVnRXhwIiwiZGVlcCIsIl9PYmplY3RNYXAiLCJfaXNQcmltaXRpdmUiLCJjb3B5IiwiY29waWVkVmFsdWUiLCJjYWNoZWRDb3B5IiwiaGFzT3duUHJvcGVydHkiLCJjcmVhdGUiLCJnZXRQcm90b3R5cGVPZiIsIkRhdGUiLCJ2YWx1ZU9mIiwicGFyYW0iLCJoYXNoZWRLZXkiLCJoYXNoIiwiYnVja2V0Iiwiam9pbiIsImVsZW1lbnQiLCJwYXR0ZXJuIiwiUmVnRXhwIiwiZmxhZ3MiLCJnbG9iYWwiLCJpZ25vcmVDYXNlIiwibXVsdGlsaW5lIiwic3RpY2t5IiwidW5pY29kZSIsImRvdEFsbCIsIl9jb21wbGVtZW50Iiwic2V0MSIsInNldDIiLCJsZW4xIiwibGVuMiIsIl9pc0FycmF5TGlrZSIsInN5bUl0ZXJhdG9yIiwiX2NyZWF0ZVJlZHVjZSIsImFycmF5UmVkdWNlIiwibWV0aG9kUmVkdWNlIiwiaXRlcmFibGVSZWR1Y2UiLCJ4ZiIsIl9pc1BsYWNlaG9sZGVyIiwiZjEiLCJmMiIsIl9iIiwiX2EiLCJmMyIsImMiLCJfYyIsInJlY2VpdmVkIiwiY29tYmluZWQiLCJhcmdzSWR4IiwiY29tYmluZWRJZHgiLCJoYXNQbGFjZWhvbGRlciIsIl9pc1RyYW5zZm9ybWVyIiwibWV0aG9kTmFtZXMiLCJ0cmFuc2R1Y2VyQ3JlYXRvciIsInRyYW5zZHVjZXIiLCJyZW1vdmUiLCJfaW5jbHVkZXNXaXRoIiwiX2Z1bmN0aW9uTmFtZSIsIl9vYmplY3RJcyIsIl91bmlxQ29udGVudEVxdWFscyIsImFJdGVyYXRvciIsImJJdGVyYXRvciIsInN0YWNrQSIsInN0YWNrQiIsImVxIiwiYUl0ZW0iLCJ0eXBlQSIsIm5hbWUiLCJtZXNzYWdlIiwiZW50cmllcyIsInZhbHVlcyIsImtleXNBIiwiZXh0ZW5kZWRTdGFja0EiLCJleHRlbmRlZFN0YWNrQiIsIm1hdGNoIiwiU3RyaW5nIiwiaW5mIiwiaXNBcnJheUxpa2UiLCJpc0ludGVnZXIiLCJyZWN1cnNpdmUiLCJmbGF0dCIsImpsZW4iLCJpbGVuIiwiZnVuY3RvciIsIl9udGgiLCJvZmZzZXQiLCJjaGFyQXQiLCJfb2JqZWN0QXNzaWduIiwib3V0cHV0IiwibmV4dEtleSIsImlzIiwicGF0aEFyIiwiX3F1b3RlIiwiZXNjYXBlZCIsInJlcGxhY2UiLCJfaXRlcmFibGVSZWR1Y2UiLCJfbWV0aG9kUmVkdWNlIiwibWV0aG9kTmFtZSIsIl9yZWR1Y2VkIiwicGFkIiwiX3RvSVNPU3RyaW5nIiwidG9JU09TdHJpbmciLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJ0b0ZpeGVkIiwicmVqZWN0IiwiX3RvU3RyaW5nIiwic2VlbiIsInJlY3VyIiwibWFwUGFpcnMiLCJzb3J0IiwidGVzdCIsIk5hTiIsInJlcHIiLCJfeEFycmF5UmVkdWNlIiwiX3hJdGVyYWJsZVJlZHVjZSIsIl94TWV0aG9kUmVkdWNlIiwiX3hSZWR1Y2UiLCJfeGZCYXNlIiwiWEFsbCIsImluaXQiLCJpbnB1dCIsIlhBbnkiLCJYRmlsdGVyIiwiWEZpbmQiLCJmb3VuZCIsIlhGaW5kSW5kZXgiLCJYTWFwIiwiX3htYXAiLCJYUmVkdWNlQnkiLCJ2YWx1ZUZuIiwidmFsdWVBY2MiLCJrZXlGbiIsImlucHV0cyIsIl94cmVkdWNlQnkiLCJYVGFrZSIsInJldCIsIl94dGFrZSIsIlhVbmlxQnkiLCJfeHVuaXFCeSIsIlhXcmFwIiwiX3h3cmFwIiwidW5pcSIsImxpc3QxIiwibGlzdDIiLCJ0b0tlZXAiLCJpbnZva2VyIiwiYXJpdHkiLCJtZXRob2QiLCJDdG9yIiwiaXNFbXB0eSIsImp1eHQiLCJoYXNFbnVtQnVnIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJub25FbnVtZXJhYmxlUHJvcHMiLCJoYXNBcmdzRW51bUJ1ZyIsImNvbnRhaW5zIiwibklkeCIsImtzIiwiY2hlY2tBcmdzTGVuZ3RoIiwibGVucyIsImdldHRlciIsInNldHRlciIsInRvRnVuY3RvckZuIiwiZm9jdXMiLCJsZW5zUGF0aCIsImx0IiwibWFwT2JqSW5kZXhlZCIsInNhZmVNYXgiLCJtYXhCeVZhbHVlIiwibWF4QnlUeXBlIiwic3RyaW5nQSIsIm1heEJ5U3RyaW5nVmFsdWUiLCJtZW1vaXplV2l0aCIsImtleUdlbiIsImNhY2hlIiwibWVyZ2VEZWVwV2l0aEtleSIsIm1lcmdlRGVlcFJpZ2h0IiwibE9iaiIsInJPYmoiLCJsVmFsIiwiclZhbCIsIm1lcmdlV2l0aEtleSIsIm1lcmdlTGVmdCIsImwiLCJyIiwibWVyZ2VSaWdodCIsIm1lcmdlV2l0aCIsIl9sIiwiX3IiLCJvbWl0IiwibmFtZXMiLCJvbmNlIiwiY2FsbGVkIiwiSWRlbnRpdHkiLCJvdmVyIiwicGFydGl0aW9uIiwicGF0aE9yIiwicGljayIsInBpY2tCeSIsInByZXBlbmQiLCJwcm9wRXEiLCJwcyIsInN0YXJ0IiwicmV2ZXJzZSIsInNwbGl0IiwiZnJvbUluZGV4IiwidG9JbmRleCIsInRha2UiLCJzdGFydHNXaXRoIiwicHJlZml4IiwidG9QYWlycyIsInBhaXJzIiwidW5pcUJ5IiwiYXBwbGllZEl0ZW0iLCJ2YWxzIiwiQ29uc3QiLCJmYW50YXN5TGFuZF9tYXAiLCJ2aWV3IiwiemlwIiwicnYiLCJ6aXBPYmoiLCJvIiwidCIsInN0cmluZyIsImFycmF5IiwibnVtYmVyIiwiYm9vbCIsIm9uZU9mVHlwZSIsInUiLCJmdW5jIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJlbGVtZW50cyIsInN0eWxlc2hlZXQiLCJwYW4iLCJ6b29tIiwicGFubmluZ0VuYWJsZWQiLCJ1c2VyUGFubmluZ0VuYWJsZWQiLCJtaW5ab29tIiwibWF4Wm9vbSIsInpvb21pbmdFbmFibGVkIiwidXNlclpvb21pbmdFbmFibGVkIiwiYm94U2VsZWN0aW9uRW5hYmxlZCIsImF1dG91bmdyYWJpZnkiLCJhdXRvbG9jayIsImF1dG91bnNlbGVjdGlmeSIsInRvSnNvbiIsImRpZmYiLCJoZWFkbGVzcyIsInN0eWxlRW5hYmxlZCIsImhpZGVFZGdlc09uVmlld3BvcnQiLCJ0ZXh0dXJlT25WaWV3cG9ydCIsIm1vdGlvbkJsdXIiLCJtb3Rpb25CbHVyT3BhY2l0eSIsIndoZWVsU2Vuc2l0aXZpdHkiLCJwaXhlbFJhdGlvIiwic29tZSIsIm0iLCJsYWJlbCIsInNlbGVjdG9yIiwiYmF0Y2giLCJFIiwiZyIsImZyb21Kc29uIiwidXBkYXRlIiwiZWxlMSIsIk8iLCJzY3JhdGNoIiwianNvbiIsIl9lJENvbXBvbmVudCIsIl90aGlzIiwiX2NhbGxTdXBlciIsImRpc3BsYXlOYW1lIiwiY29udGFpbmVyUmVmIiwiY3JlYXRlUmVmIiwiX2luaGVyaXRzIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdGhpcyRwcm9wcyIsIl9jeSIsImNvbnRhaW5lciIsIndpbmRvdyIsInVwZGF0ZUN5dG9zY2FwZSIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZGVzdHJveSIsInJlbmRlciIsIl90aGlzJHByb3BzMiIsImNyZWF0ZUVsZW1lbnQiLCJyZWYiLCJub3JtYWxpemVFbGVtZW50cyIsIkNvbXBvbmVudCIsImRlZmF1bHQiLCJjcmVhdGVDb250ZXh0IiwiUmVhY3RSZWR1eENvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJSZWFjdCIsInVzZU1lbW8iLCJjcmVhdGVTdWJzY3JpcHRpb24iLCJ1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IiwiUHJvdmlkZXIiLCJzdG9yZSIsInNlcnZlclN0YXRlIiwiY29udGV4dFZhbHVlIiwic3Vic2NyaXB0aW9uIiwiZ2V0U2VydmVyU3RhdGUiLCJwcmV2aW91c1N0YXRlIiwiZ2V0U3RhdGUiLCJvblN0YXRlQ2hhbmdlIiwibm90aWZ5TmVzdGVkU3VicyIsInRyeVN1YnNjcmliZSIsInRyeVVuc3Vic2NyaWJlIiwiQ29udGV4dCIsIl9leHRlbmRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJfZXhjbHVkZWQiLCJob2lzdFN0YXRpY3MiLCJ1c2VDb250ZXh0IiwidXNlUmVmIiwiaXNWYWxpZEVsZW1lbnRUeXBlIiwiaXNDb250ZXh0Q29uc3VtZXIiLCJkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IiwibWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeSIsIm1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkiLCJtZXJnZVByb3BzRmFjdG9yeSIsInNoYWxsb3dFcXVhbCIsIndhcm5pbmciLCJub3RJbml0aWFsaXplZCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwiaW5pdGlhbGl6ZUNvbm5lY3QiLCJFTVBUWV9BUlJBWSIsIk5PX1NVQlNDUklQVElPTl9BUlJBWSIsInN0cmluZ2lmeUNvbXBvbmVudCIsIkNvbXAiLCJKU09OIiwic3RyaW5naWZ5IiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzIiwiZWZmZWN0RnVuYyIsImVmZmVjdEFyZ3MiLCJkZXBlbmRlbmNpZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJjYXB0dXJlV3JhcHBlclByb3BzIiwibGFzdFdyYXBwZXJQcm9wcyIsImxhc3RDaGlsZFByb3BzIiwicmVuZGVySXNTY2hlZHVsZWQiLCJ3cmFwcGVyUHJvcHMiLCJjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlIiwic3Vic2NyaWJlVXBkYXRlcyIsInNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyIsImNoaWxkUHJvcHNTZWxlY3RvciIsImlzTW91bnRlZCIsImFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lciIsImRpZFVuc3Vic2NyaWJlIiwibGFzdFRocm93bkVycm9yIiwiY2hlY2tGb3JVcGRhdGVzIiwibGF0ZXN0U3RvcmVTdGF0ZSIsIm5ld0NoaWxkUHJvcHMiLCJlcnJvciIsInVuc3Vic2NyaWJlV3JhcHBlciIsImluaXRTdGF0ZVVwZGF0ZXMiLCJzdHJpY3RFcXVhbCIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24iLCJjb25uZWN0IiwibWFwU3RhdGVUb1Byb3BzIiwibWFwRGlzcGF0Y2hUb1Byb3BzIiwibWVyZ2VQcm9wcyIsInB1cmUiLCJfcmVmJGFyZVN0YXRlc0VxdWFsIiwiYXJlU3RhdGVzRXF1YWwiLCJfcmVmJGFyZU93blByb3BzRXF1YWwiLCJhcmVPd25Qcm9wc0VxdWFsIiwiX3JlZiRhcmVTdGF0ZVByb3BzRXF1IiwiYXJlU3RhdGVQcm9wc0VxdWFsIiwiX3JlZiRhcmVNZXJnZWRQcm9wc0VxIiwiYXJlTWVyZ2VkUHJvcHNFcXVhbCIsIl9yZWYkZm9yd2FyZFJlZiIsImZvcndhcmRSZWYiLCJfcmVmJGNvbnRleHQiLCJpbml0TWFwU3RhdGVUb1Byb3BzIiwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyIsImluaXRNZXJnZVByb3BzIiwiQm9vbGVhbiIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0RnVuY3Rpb24iLCJfdXNlTWVtbyIsInJlYWN0UmVkdXhGb3J3YXJkZWRSZWYiLCJfdXNlTWVtbzIiLCJwcm9wc0NvbnRleHQiLCJDb250ZXh0VG9Vc2UiLCJDb25zdW1lciIsImRpZFN0b3JlQ29tZUZyb21Qcm9wcyIsImRpc3BhdGNoIiwiZGlkU3RvcmVDb21lRnJvbUNvbnRleHQiLCJfdXNlTWVtbzMiLCJfdXNlTWVtbzQiLCJvdmVycmlkZGVuQ29udGV4dFZhbHVlIiwiaXNQcm9jZXNzaW5nRGlzcGF0Y2giLCJsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yIiwiYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yIiwic3Vic2NyaWJlRm9yUmVhY3QiLCJzdWJzY3JpYmUiLCJyZWFjdExpc3RlbmVyIiwiYWN0dWFsQ2hpbGRQcm9wcyIsInN0YWNrIiwicmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50IiwicmVuZGVyZWRDaGlsZCIsIl9Db25uZWN0IiwibWVtbyIsIkNvbm5lY3QiLCJfZm9yd2FyZGVkIiwiZm9yd2FyZENvbm5lY3RSZWYiLCJmb3J3YXJkZWQiLCJjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSIsImFyZyIsImJpbmRBY3Rpb25DcmVhdG9ycyIsIndyYXBNYXBUb1Byb3BzQ29uc3RhbnQiLCJ3cmFwTWFwVG9Qcm9wc0Z1bmMiLCJ2ZXJpZnlQbGFpbk9iamVjdCIsImRlZmF1bHRNZXJnZVByb3BzIiwic3RhdGVQcm9wcyIsImRpc3BhdGNoUHJvcHMiLCJvd25Qcm9wcyIsIndyYXBNZXJnZVByb3BzRnVuYyIsImluaXRNZXJnZVByb3BzUHJveHkiLCJoYXNSdW5PbmNlIiwibWVyZ2VkUHJvcHMiLCJtZXJnZVByb3BzUHJveHkiLCJuZXh0TWVyZ2VkUHJvcHMiLCJ2ZXJpZnlTdWJzZWxlY3RvcnMiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsImhhc1J1bkF0TGVhc3RPbmNlIiwic3RhdGUiLCJoYW5kbGVGaXJzdENhbGwiLCJmaXJzdFN0YXRlIiwiZmlyc3RPd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUiLCJkZXBlbmRzT25Pd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzIiwiaGFuZGxlTmV3U3RhdGUiLCJuZXh0U3RhdGVQcm9wcyIsInN0YXRlUHJvcHNDaGFuZ2VkIiwiaGFuZGxlU3Vic2VxdWVudENhbGxzIiwibmV4dFN0YXRlIiwibmV4dE93blByb3BzIiwicHJvcHNDaGFuZ2VkIiwic3RhdGVDaGFuZ2VkIiwicHVyZUZpbmFsUHJvcHNTZWxlY3RvciIsImZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJ2ZXJpZnkiLCJnZXRDb25zdGFudCIsImluaXRDb25zdGFudFNlbGVjdG9yIiwiY29uc3RhbnQiLCJjb25zdGFudFNlbGVjdG9yIiwiZ2V0RGVwZW5kc09uT3duUHJvcHMiLCJtYXBUb1Byb3BzIiwiaW5pdFByb3h5U2VsZWN0b3IiLCJwcm94eSIsIm1hcFRvUHJvcHNQcm94eSIsInN0YXRlT3JEaXNwYXRjaCIsImRldGVjdEZhY3RvcnlBbmRWZXJpZnkiLCJ1c2VEaXNwYXRjaCIsImNyZWF0ZURpc3BhdGNoSG9vayIsInVzZVNlbGVjdG9yIiwiY3JlYXRlU2VsZWN0b3JIb29rIiwidXNlU3RvcmUiLCJjcmVhdGVTdG9yZUhvb2siLCJ1c2VEZWZhdWx0U3RvcmUiLCJ1c2VSZWR1eENvbnRleHQiLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlRGVmYXVsdFJlZHV4Q29udGV4dCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIiwiaW5pdGlhbGl6ZVVzZVNlbGVjdG9yIiwicmVmRXF1YWxpdHkiLCJlcXVhbGl0eUZuIiwiX3VzZVJlZHV4Q29udGV4dCIsInNlbGVjdGVkU3RhdGUiLCJhZGROZXN0ZWRTdWIiLCJ1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyIsInNldEJhdGNoIiwiZ2V0QmF0Y2giLCJjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24iLCJsYXN0IiwiY2xlYXIiLCJub3RpZnkiLCJsaXN0ZW5lciIsImNhbGxiYWNrIiwibGlzdGVuZXJzIiwiaXNTdWJzY3JpYmVkIiwicHJldiIsInVuc3Vic2NyaWJlIiwibnVsbExpc3RlbmVycyIsInBhcmVudFN1YiIsImhhbmRsZUNoYW5nZVdyYXBwZXIiLCJnZXRMaXN0ZW5lcnMiLCJkZWZhdWx0Tm9vcEJhdGNoIiwibmV3QmF0Y2giLCJhY3Rpb25DcmVhdG9ycyIsImJvdW5kQWN0aW9uQ3JlYXRvcnMiLCJhY3Rpb25DcmVhdG9yIiwiaXNQbGFpbk9iamVjdCIsInByb3RvIiwiYmFzZVByb3RvIiwib2JqQSIsIm9iakIiLCJrZXlzQiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsImNhblVzZURPTSIsImRvY3VtZW50IiwiUkVBQ1RfRUxFTUVOVF9UWVBFIiwiZm9yIiwiUkVBQ1RfUE9SVEFMX1RZUEUiLCJSRUFDVF9GUkFHTUVOVF9UWVBFIiwiUkVBQ1RfU1RSSUNUX01PREVfVFlQRSIsIlJFQUNUX1BST0ZJTEVSX1RZUEUiLCJSRUFDVF9QUk9WSURFUl9UWVBFIiwiUkVBQ1RfQ09OVEVYVF9UWVBFIiwiUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSIsIlJFQUNUX0ZPUldBUkRfUkVGX1RZUEUiLCJSRUFDVF9TVVNQRU5TRV9UWVBFIiwiUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIiwiUkVBQ1RfTUVNT19UWVBFIiwiUkVBQ1RfTEFaWV9UWVBFIiwiUkVBQ1RfT0ZGU0NSRUVOX1RZUEUiLCJlbmFibGVTY29wZUFQSSIsImVuYWJsZUNhY2hlRWxlbWVudCIsImVuYWJsZVRyYW5zaXRpb25UcmFjaW5nIiwiZW5hYmxlTGVnYWN5SGlkZGVuIiwiZW5hYmxlRGVidWdUcmFjaW5nIiwiUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSIsIiQkdHlwZW9mIiwiZ2V0TW9kdWxlSWQiLCJ0eXBlT2YiLCIkJHR5cGVvZlR5cGUiLCJDb250ZXh0Q29uc3VtZXIiLCJDb250ZXh0UHJvdmlkZXIiLCJFbGVtZW50IiwiRm9yd2FyZFJlZiIsIkZyYWdtZW50IiwiTGF6eSIsIk1lbW8iLCJQb3J0YWwiLCJQcm9maWxlciIsIlN0cmljdE1vZGUiLCJTdXNwZW5zZSIsIlN1c3BlbnNlTGlzdCIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSIsImlzQXN5bmNNb2RlIiwiaXNDb25jdXJyZW50TW9kZSIsImlzQ29udGV4dFByb3ZpZGVyIiwiaXNFbGVtZW50IiwiaXNGb3J3YXJkUmVmIiwiaXNGcmFnbWVudCIsImlzTGF6eSIsImlzTWVtbyIsImlzUG9ydGFsIiwiaXNQcm9maWxlciIsImlzU3RyaWN0TW9kZSIsImlzU3VzcGVuc2UiLCJpc1N1c3BlbnNlTGlzdCIsInRvU3RyaW5nVGFnIiwiR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsIkciLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfcmVnZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfbmV4dCIsIl90aHJvdyIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJfYXJyYXlMaWtlVG9BcnJheSIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJkaXNwYXRjaEVycm9yIiwiaHlkcmF0ZUluaXRpYWxPdXRwdXRzIiwib25FcnJvciIsInNldEdyYXBocyIsInNldFBhdGhzIiwic2V0TGF5b3V0IiwiY29tcHV0ZVBhdGhzIiwiY29tcHV0ZUdyYXBocyIsImFwaVRodW5rIiwiRXZlbnRFbWl0dGVyIiwiYXBwbHlQZXJzaXN0ZW5jZSIsImdldEFwcFN0YXRlIiwiU1RBVFVTIiwid2FpdCIsImlzU2ltcGxlQ29tcG9uZW50IiwiRGFzaFdyYXBwZXIiLCJVbmNvbm5lY3RlZENvbnRhaW5lciIsImFwcExpZmVjeWNsZSIsImNvbmZpZyIsImRlcGVuZGVuY2llc1JlcXVlc3QiLCJsYXlvdXRSZXF1ZXN0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsImV2ZW50cyIsInJlbmRlcmVkVHJlZSIsInN0b3JlRWZmZWN0IiwiX2NhbGxlZSIsIl9jb250ZXh0IiwiZW1pdCIsInNlcnZlX2xvY2FsbHkiLCJfZGFzaFBsb3RseUpTVVJMIiwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IiwicGxvdGx5anNfdXJsIiwiY29udGVudCIsInN0YXR1cyIsIk9LIiwidWkiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsIl9kYXNocHJpdmF0ZV9lcnJvciIsImNvbXBvbmVudFBhdGgiLCJncmFwaHMiLCJob29rcyIsImxheW91dF9wcmUiLCJsYXlvdXRfcG9zdCIsImZpbmFsTGF5b3V0IiwicmVzZXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsInByb3BUeXBlcyIsIm9uZU9mIiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwiZ2V0Q29uZmlnRnJvbURPTSIsInNldEhvb2tzIiwic2V0Q29uZmlnIiwiVW5jb25uZWN0ZWRBcHBDb250YWluZXIiLCJfUmVhY3QkQ29tcG9uZW50IiwicmVxdWVzdF9wcmUiLCJyZXF1ZXN0X3Bvc3QiLCJjYWxsYmFja19yZXNvbHZlZCIsInJlcXVlc3RfcmVmcmVzaF9qd3QiLCJfb2JqZWN0U3ByZWFkIiwiVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiQWNjZXB0Iiwic2hvd191bmRvX3JlZG8iLCJBcHBDb250YWluZXIiLCJTdG9yZSIsIkFwcFByb3ZpZGVyIiwiX3JlZiRob29rcyIsInNoYXBlIiwiUmVhY3RET00iLCJEYXNoUmVuZGVyZXIiLCJjcmVhdGVSb290IiwiU3RvcmVPYnNlcnZlciIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9ic2VydmVyIiwiX19maW5hbGl6ZV9fIiwiX19pbml0X18iLCJfdGhpcyRfdW5zdWJzY3JpYmUiLCJfdW5zdWJzY3JpYmUiLCJfc3RvcmUiLCJfb2JzZXJ2ZXJzIiwibGFzdFN0YXRlIiwiaW5wdXRQYXRocyIsInRyaWdnZXJlZCIsImdldENTUkZIZWFkZXIiLCJoYW5kbGVBc3luY0Vycm9yIiwiYWRkSHR0cEhlYWRlcnMiLCJ1cmxCYXNlIiwiTUFYX0FVVEhfUkVUUklFUyIsIkpXVF9FWFBJUkVEX01FU1NBR0UiLCJsb2dXYXJuaW5nT25jZSIsIndhcm4iLCJHRVQiLCJmZXRjaENvbmZpZyIsIlBPU1QiLCJib2R5IiwicmVxdWVzdCIsImVuZHBvaW50IiwiX2dldFN0YXRlIiwibmV3SGVhZGVycyIsInVybCIsInNldENvbm5lY3Rpb25TdGF0dXMiLCJyZXMiLCJyZXRyeSIsIl9ib2R5IiwibmV3Snd0IiwiY29udGVudFR5cGUiLCJfdCIsIl90MiIsIl9zZXRDb25uZWN0aW9uU3RhdHVzIiwiY29ubmVjdGVkIiwiYmFja0VuZENvbm5lY3RlZCIsInBheWxvYWQiLCJVTkFVVEhPUklaRUQiLCJCQURfUkVRVUVTVCIsInRleHQiLCJBdXRob3JpemF0aW9uIiwic3Vic3RyIiwiX3giLCJfeDIiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwib3duS2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiQ2FsbGJhY2tBY3Rpb25UeXBlIiwiQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIiwiaXNNdWx0aVZhbHVlZCIsInN0cmluZ2lmeUlkIiwiaXNNdWx0aU91dHB1dFByb3AiLCJjcmVhdGVBY3Rpb24iLCJub3RpZnlPYnNlcnZlcnMiLCJ1cGRhdGVQcm9wcyIsImhhbmRsZVBhdGNoIiwiaXNQYXRjaCIsImdldFBhdGgiLCJyZXF1ZXN0RGVwZW5kZW5jaWVzIiwibG9hZExpYnJhcnkiLCJwYXJzZVBNQ0lkIiwicmVwbGFjZVBNQyIsImxvYWRlZCIsImxvYWRpbmciLCJhZGRCbG9ja2VkQ2FsbGJhY2tzIiwiQWRkQmxvY2tlZCIsImFkZENvbXBsZXRlZENhbGxiYWNrcyIsIkFkZENvbXBsZXRlZCIsImFkZEV4ZWN1dGVkQ2FsbGJhY2tzIiwiQWRkRXhlY3V0ZWQiLCJhZGRFeGVjdXRpbmdDYWxsYmFja3MiLCJBZGRFeGVjdXRpbmciLCJhZGRQcmlvcml0aXplZENhbGxiYWNrcyIsIkFkZFByaW9yaXRpemVkIiwiYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIiwiQWRkUmVxdWVzdGVkIiwiYWRkU3RvcmVkQ2FsbGJhY2tzIiwiQWRkU3RvcmVkIiwiYWRkV2F0Y2hlZENhbGxiYWNrcyIsIkFkZFdhdGNoZWQiLCJyZW1vdmVFeGVjdXRlZENhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGVkIiwicmVtb3ZlQmxvY2tlZENhbGxiYWNrcyIsIlJlbW92ZUJsb2NrZWQiLCJyZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRpbmciLCJyZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbW92ZVByaW9yaXRpemVkIiwicmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIiwiUmVtb3ZlUmVxdWVzdGVkIiwicmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIiwiUmVtb3ZlU3RvcmVkIiwicmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyIsIlJlbW92ZVdhdGNoZWQiLCJhZ2dyZWdhdGVDYWxsYmFja3MiLCJBZ2dyZWdhdGUiLCJ1cGRhdGVSZXNvdXJjZVVzYWdlIiwiYWRkQ2FsbGJhY2tKb2IiLCJyZW1vdmVDYWxsYmFja0pvYiIsInNldENhbGxiYWNrSm9iT3V0ZGF0ZWQiLCJ1bndyYXBJZk5vdE11bHRpIiwicGF0aHMiLCJpZFByb3BzIiwic3BlYyIsImFueVZhbHMiLCJkZXBUeXBlIiwibXNnIiwiYWxsb3dfb3B0aW9uYWwiLCJpc1N0ciIsInByb3BlcnR5Iiwic3RycyIsImZpbGxWYWxzIiwiY2IiLCJzcGVjcyIsImFsbG93QWxsTWlzc2luZyIsImdldElucHV0cyIsImVycm9ycyIsImVtcHR5TXVsdGlWYWx1ZXMiLCJpbnB1dFZhbHMiLCJpbnB1dExpc3QiLCJfdW53cmFwSWZOb3RNdWx0aSIsInBhdGhfIiwiX3Vud3JhcElmTm90TXVsdGkyIiwiaW5wdXRFcnJvciIsInJlZkVyciIsIm9ianMiLCJSZWZlcmVuY2VFcnJvciIsImdldFZhbHMiLCJ6aXBJZkFycmF5IiwiY2xlYW5PdXRwdXRQcm9wIiwiaGFuZGxlQ2xpZW50c2lkZSIsIl94MyIsIl94NCIsIl9oYW5kbGVDbGllbnRzaWRlIiwiX2NhbGxlZTIiLCJjbGllbnRzaWRlX2Z1bmN0aW9uIiwiZGMiLCJvdXRwdXRzIiwicmVxdWVzdFRpbWUiLCJpbnB1dERpY3QiLCJzdGF0ZURpY3QiLCJfZGMkbmFtZXNwYWNlIiwiX3JldHVyblZhbHVlIiwibmFtZXNwYWNlIiwiZnVuY3Rpb25fbmFtZSIsInJldHVyblZhbHVlIiwidG90YWxUaW1lIiwicmVzb3VyY2VzIiwiX3Q0IiwiX2NvbnRleHQzIiwiZGFzaF9jbGllbnRzaWRlIiwibm9fdXBkYXRlIiwiZGVzY3JpcHRpb24iLCJub3ciLCJpbnB1dHNUb0RpY3QiLCJjYWxsYmFja19jb250ZXh0IiwiY2hhbmdlZFByb3BJZHMiLCJwcm9wX2lkIiwidHJpZ2dlcmVkX2lkIiwiZ2V0VHJpZ2dlcmVkSWQiLCJpbnB1dHNfbGlzdCIsInN0YXRlc19saXN0Iiwic3RhdGVzIiwib3V0cHV0c19saXN0IiwiX3JlZjEwIiwiX3JlZjExIiwib3V0aSIsInJldGkiLCJfcmVmMTIiLCJfcmVmMTMiLCJvdXRpaiIsInJldGlqIiwiaWRTdHIiLCJkYXRhRm9ySWQiLCJQcmV2ZW50VXBkYXRlIiwiUFJFVkVOVF9VUERBVEUiLCJDTElFTlRTSURFX0VSUk9SIiwiX19kYXNoX3NlcnZlciIsIl9fZGFzaF9jbGllbnQiLCJfX2Rhc2hfdXBsb2FkIiwiX19kYXNoX2Rvd25sb2FkIiwidXNhZ2UiLCJ1cGRhdGVDb21wb25lbnQiLCJjb21wb25lbnRfaWQiLCJzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zIiwiaXRlbXBhdGgiLCJyZW5kZXJUeXBlIiwic2lkZVVwZGF0ZSIsIl9yZWYzIiwiY29tcG9uZW50SWQiLCJwcm9wTmFtZSIsInJlcGxhY2VkSWRzIiwiX3BhcnNlUE1DSWQiLCJfcGFyc2VQTUNJZDIiLCJfaWQkc3BsaXQiLCJfaWQkc3BsaXQyIiwicmVwIiwiX3JlZjQiLCJfcmVmNSIsImhhbmRsZVNlcnZlcnNpZGUiLCJiYWNrZ3JvdW5kIiwiYWRkaXRpb25hbEFyZ3MiLCJydW5uaW5nIiwiY2FjaGVLZXkiLCJqb2IiLCJydW5uaW5nT2ZmIiwicHJvZ3Jlc3NEZWZhdWx0IiwibW9yZUFyZ3MiLCJmZXRjaENhbGxiYWNrIiwibmV3Qm9keSIsImFkZEFyZyIsImRlbGltIiwidG1wQm9keSIsInBhcnNlIiwiX3JlZjYiLCJfcmVmNyIsIl9yZWY4IiwiX3JlZjkiLCJfXyIsInNpbmdsZSIsImhhbmRsZU91dHB1dCIsImNhbGxiYWNrSm9iIiwiY2FsbGJhY2tKb2JzIiwib3V0ZGF0ZWQiLCJqb2JJZCIsInJlY29yZFByb2ZpbGUiLCJ0aW1pbmdIZWFkZXJzIiwiaGVhZGVyIiwiZHVyIiwiZmluaXNoTGluZSIsIm11bHRpIiwicmVzcG9uc2UiLCJsYXN0SW5kZXhPZiIsImNvbXBsZXRlSm9iIiwiam9iSW5mbyIsImNhbmNlbElucHV0cyIsImNhbmNlbCIsInByb2dyZXNzIiwiZGlzdCIsInNldFRpbWVvdXQiLCJoYW5kbGUiLCJpbnRlcnZhbCIsImhhbmRsZUVycm9yIiwiTk9fUkVTUE9OU0UiLCJpbnB1dHNpIiwiaWkiLCJfaW5wdXRzaSRpaSR2YWx1ZSIsImlkX3N0ciIsIl9pbnB1dHNfbGlzdCRpJHZhbHVlIiwidHJpZyIsInN1YnN0cmluZyIsImV4ZWN1dGVDYWxsYmFjayIsIl9yZWYwIiwiYWxsT3V0cHV0cyIsIl9jYiRjYWxsYmFjayIsImR5bmFtaWNfY3JlYXRvciIsImluVmFscyIsImV4ZWN1dGlvblByb21pc2UiLCJvdXRwdXRFcnJvcnMiLCJfdW53cmFwSWZOb3RNdWx0aTMiLCJfdW53cmFwSWZOb3RNdWx0aTQiLCJlcnJpIiwiX19leGVjdXRlIiwiX3JlZjEiLCJsb2FkaW5nT3V0cHV0cyIsInBhcnNlZENoYW5nZWRQcm9wc0lkcyIsIm5ld0NvbmZpZyIsImxhc3RFcnJvciIsImpzb25PdXRwdXQiLCJfcmV0IiwiX3QzIiwiX2NvbnRleHQyIiwiX291dCRwcm9wZXJ0eSIsInByb3BJZCIsImludGVyIiwiX2RhdGEiLCJjdXJyZW50TGF5b3V0Iiwib2xkSnd0Iiwib3V0cHV0UGF0aCIsInByZXZpb3VzVmFsdWUiLCJkYXRhUGF0aCIsIm91dHB1dFZhbHVlIiwiX3JlZ2VuZXJhdG9yVmFsdWVzIiwibmV3Q2IiLCJhY3Rpb25MaXN0IiwiT05fUFJPUF9DSEFOR0UiLCJTRVRfUkVRVUVTVF9RVUVVRSIsIlNFVF9HUkFQSFMiLCJTRVRfUEFUSFMiLCJTRVRfTEFZT1VUIiwiU0VUX0FQUF9MSUZFQ1lDTEUiLCJTRVRfQ09ORklHIiwiQUREX0hUVFBfSEVBREVSUyIsIk9OX0VSUk9SIiwiU0VUX0hPT0tTIiwiSU5TRVJUX0NPTVBPTkVOVCIsIlJFTU9WRV9DT01QT05FTlQiLCJnZXRBY3Rpb24iLCJhY3Rpb24iLCJEZXBHcmFwaCIsImlzTnVtZXJpYyIsImNvbWJpbmVJZEFuZFByb3AiLCJnZXRDYWxsYmFja3NCeUlucHV0IiwiZ2V0UHJpb3JpdHkiLCJJTkRJUkVDVCIsIm1lcmdlTWF4IiwibWFrZVJlc29sdmVkQ2FsbGJhY2siLCJyZXNvbHZlRGVwcyIsImNyYXdsTGF5b3V0IiwiUmVnaXN0cnkiLCJpZEFuZFByb3AiLCJBTEwiLCJ3aWxkIiwiTUFUQ0giLCJBTExTTUFMTEVSIiwiZXhwYW5kIiwid2lsZGNhcmRzIiwiYWxsb3dlZFdpbGRjYXJkcyIsIk91dHB1dCIsIklucHV0IiwiU3RhdGUiLCJ3aWxkY2FyZFZhbFR5cGVzIiwiaWRJbnZhbGlkQ2hhcnMiLCJpc1dpbGRjYXJkSWQiLCJwYXJzZVdpbGRjYXJkSWQiLCJwYXJzZU11bHRpcGxlT3V0cHV0cyIsIm91dHB1dElkQW5kUHJvcCIsInNwbGl0SWRBbmRQcm9wIiwiZG90UG9zIiwicGFyc2VJZldpbGRjYXJkIiwic3RyaW5naWZ5VmFsIiwicGFydHMiLCJpZFZhbFNvcnQiLCJiSXNOdW1lcmljIiwiYU4iLCJiTiIsImFJc0Jvb2wiLCJ2YWxCZWZvcmUiLCJ2YWxBZnRlciIsImFkZE1hcCIsImRlcE1hcCIsImRlcGVuZGVuY3kiLCJpZE1hcCIsImNhbGxiYWNrcyIsImFkZFBhdHRlcm4iLCJpZFNwZWMiLCJrZXlTdHIiLCJrZXlDYWxsYmFja3MiLCJwcm9wQ2FsbGJhY2tzIiwidmFsTWF0Y2giLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiZGVwIiwiaGFzT3V0cHV0cyIsImNscyIsImlkUHJvcCIsInZhbGlkYXRlQXJnIiwiZmluZER1cGxpY2F0ZU91dHB1dHMiLCJmaW5kTWlzbWF0Y2hlZFdpbGRjYXJkcyIsImludmFsaWRDaGFycyIsIm5ld091dHB1dFN0cnMiLCJuZXdPdXRwdXRPYmpzIiwiaWRPYmoiLCJzZWxmT3ZlcmxhcCIsIndpbGRjYXJkT3ZlcmxhcCIsIm90aGVyT3ZlcmxhcCIsImlkUHJvcDIiLCJjaGVja0luT3V0T3ZlcmxhcCIsIm91dElkIiwib3V0UHJvcCIsImluXyIsImluSWQiLCJpblByb3AiLCJfZmluZFdpbGRjYXJkS2V5cyIsImZpbmRXaWxkY2FyZEtleXMiLCJvdXQwTWF0Y2hLZXlzIiwibWF0Y2hLZXlzIiwiX2ZpbmRXaWxkY2FyZEtleXMyIiwiYWxsc21hbGxlcktleXMiLCJhbGxXaWxkY2FyZEtleXMiLCJtYXRjaFdpbGRLZXlzIiwiYVdpbGQiLCJiV2lsZCIsImlkS2V5cyIsImlkVmFscyIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiaWQyIiwicHJvcGVydHkyIiwidmFsaWRhdGVDYWxsYmFja3NUb0xheW91dCIsInN0YXRlXyIsImxheW91dF8iLCJwYXRoc18iLCJ2YWxpZGF0ZUlkcyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwiaW5wdXRNYXAiLCJvdXRwdXRQYXR0ZXJucyIsImlucHV0UGF0dGVybnMiLCJtaXNzaW5nSWQiLCJ2YWxpZGF0ZVByb3AiLCJpZFBhdGgiLCJyYXdQcm9wIiwidmFsaWRhdGVJZFBhdHRlcm5Qcm9wIiwiaWRSZXNvbHZlZCIsImNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlIiwidmFsaWRhdGVTdGF0ZSIsInZhbGlkYXRlTWFwIiwiZG9TdGF0ZSIsInZhbGlkYXRlUGF0dGVybnMiLCJwYXR0ZXJucyIsImtleVBhdHRlcm5zIiwibXVsdGlHcmFwaCIsIndpbGRjYXJkUGxhY2Vob2xkZXJzIiwiZml4SWRzIiwibm9fb3V0cHV0Iiwibm9PdXRwdXQiLCJ3cmFwcGVkREUiLCJsaW5lcyIsImZpbmFsR3JhcGhzIiwiTXVsdGlHcmFwaCIsImV4YWN0Iiwia2V5UGxhY2Vob2xkZXJzIiwibWFrZUFsbElkcyIsIm91dElkRmluYWwiLCJpZExpc3QiLCJ0ZXN0VmFscyIsIm91dFZhbEluZGV4IiwibmV3VmFscyIsIm91dHB1dFRhZyIsImR1cGxpY2F0ZU91dHB1dHMiLCJjYkluIiwiY2JPdXQiLCJhZGRJbnB1dFRvTXVsdGkiLCJpbklkUHJvcCIsIm91dElkUHJvcCIsImZpcnN0UGFzcyIsImFkZE5vZGUiLCJhZGREZXBlbmRlbmN5IiwiYWRkT3V0cHV0VG9NdWx0aSIsImluT2JqIiwiaW5JZExpc3QiLCJfZmluZFdpbGRjYXJkS2V5czMiLCJmaXJzdFNpbmdsZU91dHB1dCIsImZpbmFsRGVwZW5kZW5jeSIsImFsc29JbnB1dCIsIm91dElkTGlzdCIsInRlbXBPdXRJZFByb3AiLCJvdXRJZE5hbWUiLCJpbnB1dE9iamVjdCIsImR1cGVPdXRJZFByb3AiLCJvcmlnaW5hbE5hbWUiLCJuZXdOYW1lIiwiY250IiwiaW5OYW1lIiwib3V0TmFtZSIsImlkTWF0Y2giLCJwYXR0ZXJuVmFscyIsInJlZktleXMiLCJyZWZWYWxzIiwicmVmUGF0dGVyblZhbHMiLCJwYXR0ZXJuVmFsIiwicmVmSW5kZXgiLCJyZWZQYXR0ZXJuVmFsIiwiZ2V0QW55VmFscyIsIm1hdGNoZXMiLCJnZXRDYWxsYmFja0J5T3V0cHV0IiwiYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyIsIm91dFBhdHRlcm4iLCJvdXRzIiwib3V0MEtleXMiLCJvdXQwUGF0dGVyblZhbHMiLCJmb3VuZENiSWRzIiwib3V0VmFscyIsInJlc29sdmVkIiwicmVzb2x2ZWRJZCIsImFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMiLCJzaW5nbGVPdXRQYXR0ZXJuIiwiYW55U2VlbiIsIm91dFNldCIsIm1hdGNoU3RyIiwiZ2V0V2F0Y2hlZEtleXMiLCJuZXdQcm9wcyIsIm5ld1Byb3AiLCJnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzIiwibGF5b3V0Q2h1bmsiLCJvcHRzIiwib3V0cHV0c09ubHkiLCJyZW1vdmVkQXJyYXlJbnB1dHNPbmx5IiwibmV3UGF0aHMiLCJjaHVua1BhdGgiLCJhZGRDYWxsYmFjayIsImZvdW5kSW5kZXgiLCJmb3VuZENiIiwiaW5pdGlhbENhbGwiLCJhZGRDYWxsYmFja0lmQXJyYXkiLCJpbmkiLCJpbmlqIiwiZ2V0T3V0cHV0cyIsImhhbmRsZU9uZUlkIiwib3V0SWRDYWxsYmFja3MiLCJpbklkQ2FsbGJhY2tzIiwicHJldmVudF9pbml0aWFsX2NhbGwiLCJtYXliZUFkZENhbGxiYWNrIiwiaGFuZGxlVGhpc0NhbGxiYWNrIiwicHJpb3JpdHkiLCJESVJFQ1QiLCJjaGFuZ2VUeXBlIiwid2l0aFByaW9yaXR5IiwiX2tleXMiLCJ0b3VjaGVkT3V0cHV0cyIsInRvdWNoZWRDYklkcyIsInRvdWNoZWQiLCJ1bnNoaWZ0IiwiZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayIsImdldFJlYWR5Q2FsbGJhY2tzIiwiY2FuZGlkYXRlcyIsIm91dHB1dHNNYXAiLCJhbGxUb3VjaGVkT3V0cHV0cyIsImRpZmZlcmVuY2VCYXNlZE9uSWQiLCJjYnAiLCJnZXRMYXlvdXRDYWxsYmFja3MiLCJleGNsdXNpb25zIiwiX3BhcnRpdGlvbiIsIl9wYXJ0aXRpb24yIiwiaW5jbHVkZWQiLCJleGNsdWRlZCIsImZpbHRlclJvb3QiLCJyb290SWQiLCJleGVjdXRpb25Hcm91cCIsImdldFVuaXF1ZUlkZW50aWZpZXIiLCJfcmVmNiRjYWxsYmFjayIsImluY2x1ZGVPYnNlcnZlcnMiLCJwcm9wZXJ0aWVzIiwicHJ1bmVDYWxsYmFja3MiLCJfcGFydGl0aW9uMyIsIl9wYXJ0aXRpb240IiwicmVtb3ZlZCIsIl9wYXJ0aXRpb241IiwiX3BhcnRpdGlvbjYiLCJtb2RpZmllZCIsImFkZGVkIiwiaWRQYXR0ZXJuIiwia2V5UGF0aHMiLCJjb29raWUiLCJyZWNvcmRVaUVkaXQiLCJzZXRBcHBMaWZlY3ljbGUiLCJzZXRSZXF1ZXN0UXVldWUiLCJpbnNlcnRDb21wb25lbnQiLCJyZW1vdmVDb21wb25lbnQiLCJvblByb3BDaGFuZ2UiLCJhZGRDb21wb25lbnRUb0xheW91dCIsImh0bWwiLCJ0cmlnZ2VyRGVmYXVsdFN0YXRlIiwiX2NzcmZfdG9rZW4iLCJfZ2V0U3RhdGUyIiwib3ZlcmFsbE9yZGVyIiwicmVkbyIsIm1vdmVIaXN0b3J5IiwidW5kbyIsInJldmVydCIsIl9nZXRTdGF0ZTMiLCJmdXR1cmUiLCJwYXN0IiwiX2dldFN0YXRlNCIsImlzUmVhZHkiLCJ0YXJnZXRzIiwicHJvbWlzZXMiLCJyZW5kZXJlZCIsInJlc29sdmVSZW5kZXJlZCIsInBhdGhPZklkIiwicmFjZSIsIklzTG9hZGluZ0FjdGlvblR5cGUiLCJzZXRJc0xvYWRpbmciLCJnZXRMb2NhdGlvbkluZGV4IiwiZ2V0TG9jYXRpb25QYXRoIiwibG9jYXRpb24iLCJwYXRjaEhhbmRsZXJzIiwiQXNzaWduIiwicGF0Y2hPcGVyYXRpb24iLCJwYXJhbXMiLCJNZXJnZSIsIkV4dGVuZCIsIkRlbGV0ZSIsIkluc2VydCIsIkFwcGVuZCIsIlByZXBlbmQiLCJBZGQiLCJTdWIiLCJNdWwiLCJEaXYiLCJDbGVhciIsIlJldmVyc2UiLCJSZW1vdmUiLCJwYXRjaFZhbHVlIiwicmVkdWNlZFZhbHVlIiwib3BlcmF0aW9ucyIsInBhdGNoIiwiaGFuZGxlciIsIm9wZXJhdGlvbiIsInN1YlRyZWUiLCJzdGFydGluZ1BhdGgiLCJvbGRQYXRocyIsIm9sZFN0cnMiLCJvbGRPYmpzIiwiZGlmZkhlYWQiLCJzcExlbiIsIm9sZFZhbFBhdGhzIiwib2xkS2V5cyIsIm9sZGllIiwicGF0aE9iaiIsImdldEFsbFBNQ0lkcyIsInRyaWdnZXJLZXkiLCJrZXlzT2ZJZHMiLCJpZEtleSIsImV4dHJhcyIsInJlcGxhY2VkIiwidHJpZ2dlclZhbHVlIiwiaGFzVXJsQmFzZSIsImhhc1JlcVByZWZpeCIsImJhc2UiLCJ1cmxfYmFzZV9wYXRobmFtZSIsInByb3BzQ2hpbGRyZW4iLCJjdXJyZW50UGF0aCIsImV4dHJhUGF0aCIsIm9iak9mIiwiYmFja1BhdGgiLCJjaGlsZE9iaiIsImNoaWxkUGF0aCIsIm5ld1BhdGgiLCJjaGlsZHJlblByb3BzIiwiX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzIiwiY2hpbGRyZW5Qcm9wIiwiX2NoaWxkcmVuUHJvcCRzcGxpdCRtIiwiX2NoaWxkcmVuUHJvcCRzcGxpdCRtMiIsImZyb250UGF0aCIsImJhc2VQYXRoIiwib3BhdGgiLCJjdXJQYXRoIiwib1ZhbHVlIiwiX2NyYXdsTGF5b3V0IiwiX2V2Iiwib24iLCJldmVudCIsInJlbW92ZUxpc3RlbmVyIiwiX3RoaXMyIiwiX3RoaXMzIiwiX2xlbjIiLCJfa2V5MiIsIlJlYWN0UHJvcFR5cGVzU2VjcmV0IiwiY2hlY2tQcm9wVHlwZXMiLCJ0eXBlU3BlY3MiLCJjb21wb25lbnROYW1lIiwiZ2V0U3RhY2siLCJ0eXBlU3BlY05hbWUiLCJleCIsImlzTG9hZGluZyIsImlzUmVxdWlyZWQiLCJob3RfcmVsb2FkIiwiX3Byb3BzJGNvbmZpZyRob3RfcmVsIiwibWF4X3JldHJ5IiwiZGlzYWJsZWQiLCJpbnRlcnZhbElkIiwicGFja2FnZXMiLCJfcmV0cnkiLCJfaGVhZCIsInF1ZXJ5U2VsZWN0b3IiLCJjbGVhckludGVydmFsIiwic2V0U3RhdGUiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJyZWxvYWRSZXF1ZXN0IiwiaGFyZCIsIndhc19jc3MiLCJmaWxlcyIsImlzX2NzcyIsIm5vZGVzVG9EaXNhYmxlIiwiaXQiLCJldmFsdWF0ZSIsIml0ZXJhdGVOZXh0Iiwic2V0QXR0cmlidXRlIiwibGluayIsImhyZWYiLCJyZWwiLCJhcHBlbmRDaGlsZCIsInJlbG9hZCIsImFsZXJ0IiwiX3RoaXMkc3RhdGUiLCJzZXRJbnRlcnZhbCIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsImRlZmF1bHRQcm9wcyIsIlVuY29ubmVjdGVkVG9vbGJhciIsInVuZG9MaW5rIiwib25DbGljayIsInJlZG9MaW5rIiwiQ3l0b3NjYXBlIiwiQ3l0b3NjYXBlQ29tcG9uZW50IiwiZGFncmUiLCJmY29zZSIsIkpTT05UcmVlIiwidXBkYXRlU2VsZWN0ZWROb2RlIiwidXBkYXRlQ2hhbmdlZFByb3BzIiwidXBkYXRlQ2FsbGJhY2siLCJ1c2UiLCJnZW5lcmF0ZUVsZW1lbnRzIiwicHJvZmlsZSIsImV4dHJhTGlua3MiLCJjb25zdW1lZCIsInN0cnVjdHVyZSIsInJlY29yZE5vZGUiLCJyYXdQcm9wZXJ0eSIsImlkVHlwZSIsInBhcmVudElkIiwiY2hpbGRJZCIsInJlY29yZEVkZ2UiLCJjYlByb2ZpbGUiLCJ0aW1lIiwidG90YWwiLCJtb2RlIiwicm91bmQiLCJsb2FkaW5nU2V0IiwiZXJyb3JTZXQiLCJub2RlSWQiLCJjaGlsZElkcyIsImNoaWxkRnJvbSIsImNoaWxkVG8iLCJyZWR1Y2VTdGF0dXMiLCJsYXRlc3QiLCJmbGF0dGVuT3V0cHV0cyIsImZsYXR0ZW5JbnB1dHMiLCJpbkFycmF5IiwiZmluYWwiLCJpbkl0ZW0iLCJjbGVhbk91dHB1dElkIiwib3V0cHV0SWQiLCJhZ2ciLCJjYlByZWZpeExlbiIsImRhZ3JlTGF5b3V0IiwicmFua2VyIiwiZm9yY2VMYXlvdXQiLCJsYXlvdXRzIiwic3BhY2luZ0ZhY3RvciIsIm5vZGVTZXAiLCJyYW5rU2VwIiwicmFua0RpciIsImZvcmNlIiwiQ2FsbGJhY2tHcmFwaCIsImNoYW5nZWQiLCJsaWZlY3ljbGVTdGF0ZSIsInNlbGVjdGVkIiwic2V0U2VsZWN0ZWQiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNldEN5dG9zY2FwZSIsImdyYXBoTGF5b3V0IiwiY2hvc2VuVHlwZSIsIl9jaG9zZW5UeXBlIiwibGF5b3V0U2VsZWN0b3IiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxheW91dFR5cGUiLCJzZXRMYXlvdXRUeXBlIiwidXNlQ3l0b3NjYXBlRWZmZWN0IiwiZWZmZWN0IiwiY29uZGl0aW9uIiwiZ2V0Q29tcG9uZW50IiwiaGFzUGF0dGVybnMiLCJnZXRQcm9wVmFsdWUiLCJzZXRQcmVzZXRMYXlvdXQiLCJfbGF5b3V0U2VsZWN0b3IkY3VycmUiLCJwb3NpdGlvbnMiLCJlYWNoIiwidXBkYXRlZCIsImVsZW1lbnROYW1lIiwiZWxlbWVudEluZm8iLCJfZ2V0Q29tcG9uZW50IiwicmVzdCIsImNhbGxiYWNrT3V0cHV0SWQiLCJuZXR3b3JrIiwiY29tcHV0ZSIsImF2ZyIsInRpbWluZyIsImRvd25sb2FkIiwidXBsb2FkIiwiY3lMYXlvdXQiLCJ0aGVtZSIsImxhYmVsUmVuZGVyZXIiLCJnZXRJdGVtU3RyaW5nIiwiaXRlbVR5cGUiLCJzaG91bGRFeHBhbmROb2RlIiwia2V5TmFtZSIsImxldmVsIiwib25DaGFuZ2UiLCJVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIiLCJfQ29tcG9uZW50IiwiY29tcG9uZW50RGlkQ2F0Y2giLCJpbmZvIiwibXlJRCIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsIkNhbGxiYWNrR3JhcGhDb250YWluZXIiLCJkaXNwbGF5IiwiY29sb3IiLCJnaG9zdCIsIm9wYWNpdHkiLCJTVEFUVVNNQVAiLCJnZXRFZGdlVHlwZXMiLCJhc2NlbmQiLCJwYXJlbnRzIiwic291cmNlcyIsImRlc2NlbmQiLCJhZGRDbGFzcyIsInN1YnRyZWUiLCJvdGhlciIsImFic29sdXRlQ29tcGxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmxhc2hUaW1lIiwiZmxhc2hDbGFzcyIsImVkZ2VzVG8iLCJhdmdUaW1lIiwiaGFzQ2xhc3MiLCJ0aW1lTGVmdCIsIkNvbXBvbmVudEVycm9yQm91bmRhcnkiLCJvbGRDaGlsZHJlbiIsInByZXZDaGlsZHJlbiIsIkNvbGxhcHNlSWNvbiIsIndlcmt6ZXVnQ3NzIiwiRnJvbnRFbmRFcnJvciIsImNvbGxhcHNlZCIsImlzTGlzdEl0ZW0iLCJpbkFsZXJ0c1RyYXkiLCJjYXJkQ2xhc3NlcyIsImVycm9ySGVhZGVyIiwidGltZXN0YW1wIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwiRXJyb3JDb250ZW50IiwiQmFja2VuZEVycm9yIiwiaWZyYW1lUmVmIiwic2V0SGVpZ2h0IiwiaGFuZGxlTWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic3JjRG9jIiwiYm9yZGVyIiwiTUFYX01FU1NBR0VfTEVOR1RIIiwiVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQiLCJsaW5lIiwidG9Mb3dlckNhc2UiLCJlcnJvclByb3BUeXBlcyIsIkZyb250RW5kRXJyb3JDb250YWluZXIiLCJjbGlja0hhbmRsZXIiLCJlcnJvckVsZW1lbnRzIiwiRGVidWdNZW51IiwiVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciIsImhvdFJlbG9hZCIsIkNoZWNrSWNvbiIsIkNsb2NrSWNvbiIsIkVycm9ySWNvbiIsIkdyYXBoSWNvbiIsIk9mZkljb24iLCJFeHBhbmQiLCJWZXJzaW9uSW5mbyIsImNsYXNzZXMiLCJ2YXJpYW50IiwidmFyaWFudDIiLCJpc0NvbGxhcHNlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJNZW51Q29udGVudCIsInBvcHVwIiwidG9nZ2xlRXJyb3JzIiwiZXJyQ291bnQiLCJ0b2dnbGVDYWxsYmFja0dyYXBoIiwiX1N0YXR1c0ljb24iLCJtYXJnaW5SaWdodCIsInNldFBvcHVwIiwic2V0Q29sbGFwc2VkIiwidG9nZ2xlQ29sbGFwc2VkIiwic2V0SXRlbSIsInBvcHVwQ29udGVudCIsIm1lbnVDb250ZW50IiwiREFZX0lOX01TIiwiY29tcGFyZVZlcnNpb25zIiwidjEiLCJ2MiIsInYxUGFydHMiLCJ2MlBhcnRzIiwicGFydDEiLCJwYXJ0MiIsInJlcXVlc3REYXNoVmVyc2lvbkluZm8iLCJfcmVxdWVzdERhc2hWZXJzaW9uSW5mbyIsImN1cnJlbnREYXNoVmVyc2lvbiIsImRhc2hWZXJzaW9uVXJsIiwicHl0aG9uVmVyc2lvbiIsImRka1ZlcnNpb24iLCJwbG90bHlWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbkluZm8iLCJjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsiLCJsYXN0RmV0Y2hlZCIsInF1ZXJ5UGFyYW1zIiwiZGFzaF92ZXJzaW9uIiwiZGFzaF92ZXJzaW9uX3VybCIsInB5dGhvbl92ZXJzaW9uIiwiZGRrX3ZlcnNpb24iLCJwbG90bHlfdmVyc2lvbiIsInZlcnNpb24iLCJzaG91bGRSZXF1ZXN0RGFzaFZlcnNpb24iLCJVUkxTZWFyY2hQYXJhbXMiLCJjYXRjaCIsImRpc2FibGVfdmVyc2lvbl9jaGVjayIsInNob3dOb3RpZmljYXRpb25zIiwic2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24iLCJuZXdEYXNoVmVyc2lvbiIsImxhc3REaXNtaXNzZWQiLCJsYXN0RGlzbWlzc2VkVmVyc2lvbiIsInNldE5ld0Rhc2hWZXJzaW9uIiwibmV3RGFzaFZlcnNpb25MaW5rIiwic2V0TmV3RGFzaFZlcnNpb25MaW5rIiwidXBncmFkZVRvb2x0aXBPcGVuZWQiLCJzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZCIsInNldERvbnRTaG93QWdhaW4iLCJzZXRSZW1pbmRNZUxhdGVyIiwic2V0U2tpcFRoaXNWZXJzaW9uIiwiaGlkZVVwZ3JhZGVUb29sdGlwIiwiY29uZmlnRWxlbWVudCIsInRleHRDb250ZW50IiwiUkVESVJFQ1RfVVJJX1BBVEhOQU1FIiwiT0FVVEhfQ09PS0lFX05BTUUiLCJEYXNoQ29udGV4dCIsInVzZURhc2hDb250ZXh0IiwiZ2V0U3RvcmVzIiwiRXh0ZXJuYWxXcmFwcGVyIiwiZ2V0TGF5b3V0IiwiY29tcG9uZW50UGF0aE9ySWQiLCJkcyIsIl9kcyR5JGdldFN0YXRlIiwiZGFzaF9jb21wb25lbnRfYXBpIiwicHJvcFR5cGVFcnJvckhhbmRsZXIiLCJtZXNzYWdlUGFydHMiLCJlcnJvck1lc3NhZ2UiLCJpbnZhbGlkUHJvcFBhdGgiLCJleHBlY3RlZFByb3BUeXBlIiwiaW52YWxpZFByb3BUeXBlUHJvdmlkZWQiLCJqc29uU3VwcGxpZWRWYWx1ZSIsIlNJTVBMRV9DT01QT05FTlRfVFlQRVMiLCJ1cGRhdGVUaXRsZSIsInVwZGF0ZV90aXRsZSIsInRpdGxlIiwibXV0YXRpb25PYnNlcnZlciIsIl9vYnNlcnZlciRtdXRhdGlvbk9icyIsImRpc2Nvbm5lY3QiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsImF0dHJpYnV0ZXMiLCJjaGFyYWN0ZXJEYXRhIiwicHJ1bmVQZXJzaXN0ZW5jZSIsImV4ZWN1dGVkIiwiYXBwbHlQcm9wcyIsInVwZGF0ZWRQcm9wcyIsIl9hcHBseVBlcnNpc3RlbmNlIiwicmVxdWVzdGVkQ2FsbGJhY2tzIiwic3RvcmVkQ2FsbGJhY2tzIiwiX2NiJHByZWRlY2Vzc29ycyIsInByZWRlY2Vzc29ycyIsImV4ZWN1dGlvblJlc3VsdCIsInBhcnNlZElkIiwib2xkTGF5b3V0IiwiYXBwbGllZFByb3BzIiwicmNiIiwib2xkT2JqIiwiaGFuZGxlUGF0aHMiLCJvbGRDaGlsZHJlblBhdGgiLCJvUGF0aHMiLCJyZWNvbXB1dGVkIiwiZnJvbnRPYmoiLCJjaGlsZHJlblByb3BQYXRoIiwiYWRkZWRQcm9wcyIsImN1cnJlbnRHcmFwaHMiLCJleGVjdXRpb25NZXRhIiwiYWxsUHJvcHMiLCJpbnB0cyIsIm5zIiwiZXhlY3V0aW5nIiwiZGVmZXJyZWQiLCJza2lwcGVkT3JSZWFkeSIsIndhdGNoZWQiLCJjdXJyZW50Q2IiLCJfY2IiLCJnZXRQZW5kaW5nQ2FsbGJhY2tzIiwicGVuZGluZ0NhbGxiYWNrcyIsImlzQXBwUmVhZHkiLCJzb3J0UHJpb3JpdHkiLCJjMSIsImMyIiwiX2MxJHByaW9yaXR5IiwiX2MyJHByaW9yaXR5IiwiZ2V0U3Rhc2giLCJmbGF0T3V0cHV0cyIsImFsbFByb3BJZHMiLCJyZXFPdXQiLCJpZE91dCIsImdldElkcyIsIml0ZW1zIiwidW5pcXVlSWRzIiwidW5pcXVlSXRlbXMiLCJfb2JzZXJ2ZXIiLCJfZ2V0U3RhdGUkY2FsbGJhY2tzIiwicHJpb3JpdGl6ZWQiLCJhdmFpbGFibGUiLCJzeW5jQ2FsbGJhY2tzIiwiYXN5bmNDYWxsYmFja3MiLCJwaWNrZWRTeW5jQ2FsbGJhY2tzIiwicGlja2VkQXN5bmNDYWxsYmFja3MiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJzdG9yZWQiLCJyZXF1ZXN0ZWQiLCJpbml0aWFsUmVxdWVzdGVkIiwickNpcmN1bGFycyIsInJEdXBsaWNhdGVzIiwick1lcmdlZER1cGxpY2F0ZXMiLCJwRHVwbGljYXRlcyIsImJEdXBsaWNhdGVzIiwiZUR1cGxpY2F0ZXMiLCJ3RHVwbGljYXRlcyIsIl9wcnVuZUNhbGxiYWNrcyIsInJBZGRlZCIsInJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMiIsInBBZGRlZCIsInBSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMyIsImJBZGRlZCIsImJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNCIsImVBZGRlZCIsImVSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNSIsIndBZGRlZCIsIndSZW1vdmVkIiwicmVhZHlDYWxsYmFja3MiLCJvbGRCbG9ja2VkIiwibmV3QmxvY2tlZCIsInBlbmRpbmdHcm91cHMiLCJkcm9wcGVkIiwiZ3JvdXAiLCJpbml0aWFsIiwiZ3JvdXBXaXRob3V0SW5pdGlhbCIsImV4ZyIsInJlYWR5Q2FsbGJhY2siLCJibG9ja2VkQnlBc3N1bXB0aW9ucyIsIl9jYiRwcmVkZWNlc3NvcnMyIiwiZ2NiIiwibnVsbEdyb3VwQ2FsbGJhY2tzIiwiZ3JvdXBDYWxsYmFja3MiLCJleGVjdXRpb25Hcm91cHMiLCJleGVjdXRpb25Hcm91cENhbGxiYWNrcyIsInN0b3JlUHJlZml4Iiwia2V5UHJlZml4TWF0Y2giLCJzZXBhcmF0b3IiLCJmdWxsU3RyIiwiZnVsbExlbiIsIlVOREVGSU5FRCIsIl9wYXJzZSIsIl9zdHJpbmdpZnkiLCJXZWJTdG9yZSIsIl9uYW1lIiwiX3N0b3JhZ2UiLCJoYXNJdGVtIiwiX3NldEl0ZW0iLCJyZW1vdmVJdGVtIiwia2V5UHJlZml4IiwiZnVsbFByZWZpeCIsImtleU1hdGNoIiwia2V5c1RvUmVtb3ZlIiwiZnVsbEtleSIsIk1lbVN0b3JlIiwicG93IiwibG9uZ1N0cmluZyIsInN0b3JlcyIsIm1lbW9yeSIsImJhY2tFbmRzIiwibG9jYWwiLCJzZXNzaW9uIiwidHJ5R2V0V2ViU3RvcmUiLCJmYWxsYmFja1N0b3JlIiwic3RvcmVUZXN0IiwidGVzdEtleSIsImdldFN0b3JlIiwibm9vcFRyYW5zZm9ybSIsImV4dHJhY3QiLCJwcm9wVmFsdWUiLCJzdG9yZWRWYWx1ZSIsIl9wcm9wVmFsdWUiLCJnZXRUcmFuc2Zvcm0iLCJwcm9wUGFydCIsInBlcnNpc3RlbmNlVHJhbnNmb3JtcyIsImdldFZhbHNLZXkiLCJwZXJzaXN0ZWRQcm9wIiwicGVyc2lzdGVuY2UiLCJnZXRQcm9wcyIsImdldFZhbCIsImRhc2hQZXJzaXN0ZW5jZSIsInBlcnNpc3RlZF9wcm9wcyIsInBlcnNpc3RlbmNlX3R5cGUiLCJjYW5QZXJzaXN0IiwiX2dldFByb3BzIiwiaXNQZXJzaXN0ZW5jZU1pc21hdGNoIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQiLCJfcGVyc2lzdGVkUHJvcCRzcGxpdDIiLCJzdG9yYWdlIiwiX2dldFRyYW5zZm9ybSIsInZhbHNLZXkiLCJvcmlnaW5hbFZhbCIsIm5ld1ZhbCIsInBlcnNpc3RlbmNlTW9kcyIsIlVORE8iLCJtb2RQcm9wIiwiX3N0b3JhZ2UkZ2V0SXRlbSIsIl9zdG9yYWdlJGdldEl0ZW0yIiwiZnJvbVZhbCIsInRvVmFsIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQzIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQ0IiwidHJhbnNmb3JtIiwiX2dldFByb3BzMiIsImxheW91dE91dCIsIl9nZXRQcm9wczMiLCJnZXRGaW5hbCIsInByZXZWYWwiLCJmaW5hbFBlcnNpc3RlbmNlIiwiZmluYWxQZXJzaXN0ZW5jZVR5cGUiLCJmaW5hbFBlcnNpc3RlZFByb3BzIiwicGVyc2lzdGVuY2VDaGFuZ2VkIiwibm90SW5OZXdQcm9wcyIsImRlcGVyc2lzdGVkUHJvcHMiLCJmaW5hbFN0b3JhZ2UiLCJjcmVhdGVBcGlSZWR1Y2VyIiwiQXBpUmVkdWNlciIsIm5ld1N0YXRlIiwiX2FjdGlvbiRwYXlsb2FkIiwibmV3UmVxdWVzdCIsInNldEpvYiIsInJlbW92ZUpvYiIsInNldE91dGRhdGVkIiwiREVGQVVMVF9TVEFURSIsImNvbXBsZXRlZCIsInRyYW5zZm9ybXMiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJmaWVsZCIsImluaXRpYWxDaGFuZ2UiLCJjaGlsZHJlbl9wcm9wcyIsInN0YXRlTGlzdCIsIlNUQVJURUQiLCJIWURSQVRFRCIsIkRFU1RST1lFRCIsImluaXRpYWxHcmFwaCIsImluaXRpYWxFcnJvciIsImluaXRpYWxIaXN0b3J5IiwicHJlc2VudCIsIm5ld1Bhc3QiLCJuZXdGdXR1cmUiLCJjdXN0b21Ib29rcyIsImJlYXIiLCJwcm9wUGF0aCIsImV4aXN0aW5nUHJvcHMiLCJsb2FkIiwibG9hZFBhdGgiLCJpbml0aWFsUGF0aHMiLCJkZWZhdWx0UHJvZmlsZSIsImRlZmF1bHRTdGF0ZSIsInN0YXR1c01hcHBlZCIsImNiUmVzb3VyY2VzIiwidG90YWxSZXNvdXJjZXMiLCJ1c2VyIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiY29tYmluZVJlZHVjZXJzIiwic3RyaW5naWZ5UGF0aCIsImFwaVJlcXVlc3RzIiwibGF5b3V0SGFzaGVzIiwiYWN0aW9uUGF0aCIsInN0clBhdGgiLCJjaGFuZ2VkUHJvcHMiLCJtYWluUmVkdWNlciIsImdldElucHV0SGlzdG9yeVN0YXRlIiwicmVjb3JkQ2hhbmdlcyIsInJlZlByb3BzIiwiaGlzdG9yeUVudHJ5IiwicHJvcEtleSIsInJlY29yZEhpc3RvcnkiLCJyZWxvYWRlclJlZHVjZXIiLCJjcmVhdGVSZWR1Y2VyIiwiY3JlYXRlU3RvcmUiLCJhcHBseU1pZGRsZXdhcmUiLCJ0aHVuayIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJtaWRkbGV3YXJlIiwiX19zdG9yZSIsInNldFN0b3JlIiwiZGFzaF9zdG9yZXMiLCJzZXRPYnNlcnZlcnMiLCJjcmVhdGVBcHBTdG9yZSIsInJlZHV4RFRFQyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyIsImFjdGlvbnNEZW55bGlzdCIsImhvdCIsImFjY2VwdCIsIm5leHRSb290UmVkdWNlciIsInJlcGxhY2VSZWR1Y2VyIiwiaW5pdGlhbGl6ZVN0b3JlIiwiX0FycmF5Iiwic2V0X3Byb3BzIiwiaWRPclBhdGgiLCJfZHMkeSIsImludmFsaWRQcm90b2NvbHMiLCJuZXdMaW5lcyIsImN0cmxDaGFycyIsImh0bWxFbnRpdGllcyIsImNsZWFuX3VybCIsImZhbGxiYWNrIiwiY2xlYW5lZCIsImRlYyIsImZyb21DaGFyQ29kZSIsInRyaW0iLCJyZXNvdXJjZSIsInByb20iLCJhc3luYyIsIm9ubG9hZCIsIm9uZXJyb3IiLCJkdXJhdGlvbiIsIl9yZXNvbHZlIiwidmFsaWRhdGVDb21wb25lbnQiLCJDaGVja2VkQ29tcG9uZW50IiwidXNlQ2FsbGJhY2siLCJEYXNoQ29udGV4dFByb3ZpZGVyIiwic3RyaW5nUGF0aCIsInJhd1BhdGgiLCJmaWx0ZXJGdW5jIiwibG9hZGluZ1BhdGgiLCJ1c2VMb2FkaW5nIiwiY3R4VmFsdWUiLCJjdHgiLCJnZXRDb21wb25lbnRMYXlvdXQiLCJpc0RyeUNvbXBvbmVudCIsImNoZWNrUmVuZGVyVHlwZVByb3AiLCJzZWxlY3REYXNoUHJvcHMiLCJzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuIiwic2VsZWN0Q29uZmlnIiwiX3Bhc3NlZENvbXBvbmVudCIsIl9uZXdSZW5kZXIiLCJtZW1vaXplZEtleXMiLCJuZXdSZW5kZXIiLCJyZW5kZXJlZFBhdGgiLCJyZW5kZXJDb21wb25lbnQiLCJyZW5kZXJDb21wb25lbnRQcm9wcyIsInJlbmRlckgiLCJfdXNlU2VsZWN0b3IiLCJfdXNlU2VsZWN0b3IyIiwiY29tcG9uZW50UHJvcHMiLCJzZXRQcm9wcyIsIl9yZW5kZXJDb21wb25lbnRQcm9wcyIsIl9kYXNoX2Vycm9yIiwicmVzdFByb3BzIiwiX2V4Y2x1ZGVkMiIsImN1cnJlbnRTdGF0ZSIsIm9sZFByb3BzIiwid2F0Y2hlZEtleXMiLCJjcmVhdGVDb250YWluZXIiLCJjb250YWluZXJQYXRoIiwiX2NoaWxkTmV3UmVuZGVyIiwiX2NvbnRhaW5lciRwcm9wcyIsIndyYXBDaGlsZHJlblByb3AiLCJjaGlsZHJlblBhdGgiLCJleHRyYVByb3BzIiwic2V0SHlkcmF0ZWRQcm9wcyIsImNoaWxkTmV3UmVuZGVyIiwiaGFuZGxlT2JqZWN0Iiwibm9kZVZhbHVlIiwiX25vZGUiLCJoYXNPYmplY3QiLCJlbGVtZW50UGF0aCIsImxpc3RWYWx1ZSIsImR5bmFtaWMiLCJoYXNCYWNrIiwiY3VyIiwiZHluVmFsdWUiLCJhUGF0aCIsImh5ZHJhdGVGdW5jIiwiaHlkcmF0ZWRQcm9wcyIsImh5ZHJhdGVkQ2hpbGRyZW4iLCJwcm9wc19jaGVjayIsImh5ZHJhdGVkIiwiaXNWYWxpZEVsZW1lbnQiLCJjb21wb25lbnRUeXBlIiwiX3JlZiR0ZW1wIiwiaW5zZXJ0ZWQiLCJzZXRJbnNlcnRlZCIsImNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIiwicHJldmlvdXNIYXNoZXMiLCJpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkIiwidXBkYXRlZFBhdGgiLCJ1cGRhdGVkU2VnbWVudHMiLCJmdWxsU2VnbWVudHMiLCJzdGFydHNXaXRoUGF0aCIsImV2ZXJ5Iiwic2VnIiwicmVtYWluaW5nU2VnbWVudHMiLCJwcm9wc0NvdW50IiwiZGV0ZXJtaW5lQ2hhbmdlZFByb3BzIiwiY29tYmluZWRIYXNoIiwicGF0aEhhc2giLCJfaXNGaXJzdExldmVsUHJvcHNDaGkiLCJfaXNGaXJzdExldmVsUHJvcHNDaGkyIiwiZGVzY2VuZGFudCIsInByZXZpb3VzSGFzaCIsIl9fXyIsIl9fX18iLCJjb21wb25lbnREZWZpbml0aW9uIiwibGF5b3V0UGF0aCJdLCJzb3VyY2VSb290IjoiIn0=