"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_react-smooth_es6_index_js"],{ /***/ "../../../node_modules/react-smooth/es6/Animate.js": /*!*********************************************************!*\ !*** ../../../node_modules/react-smooth/es6/Animate.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* 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_6__ = __webpack_require__(/*! prop-types */ "../../../node_modules/prop-types/index.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var fast_equals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fast-equals */ "../../../node_modules/fast-equals/dist/esm/index.mjs"); /* harmony import */ var _AnimateManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AnimateManager */ "../../../node_modules/react-smooth/es6/AnimateManager.js"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./easing */ "../../../node_modules/react-smooth/es6/easing.js"); /* harmony import */ var _configUpdate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./configUpdate */ "../../../node_modules/react-smooth/es6/configUpdate.js"); /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "../../../node_modules/react-smooth/es6/util.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 _excluded = ["children", "begin", "duration", "attributeName", "easing", "isActive", "steps", "from", "to", "canBegin", "onAnimationEnd", "shouldReAnimate", "onAnimationReStart"]; function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var Animate = /*#__PURE__*/function (_PureComponent) { _inherits(Animate, _PureComponent); var _super = _createSuper(Animate); function Animate(props, context) { var _this; _classCallCheck(this, Animate); _this = _super.call(this, props, context); var _this$props = _this.props, isActive = _this$props.isActive, attributeName = _this$props.attributeName, from = _this$props.from, to = _this$props.to, steps = _this$props.steps, children = _this$props.children, duration = _this$props.duration; _this.handleStyleChange = _this.handleStyleChange.bind(_assertThisInitialized(_this)); _this.changeStyle = _this.changeStyle.bind(_assertThisInitialized(_this)); if (!isActive || duration <= 0) { _this.state = { style: {} }; // if children is a function and animation is not active, set style to 'to' if (typeof children === 'function') { _this.state = { style: to }; } return _possibleConstructorReturn(_this); } if (steps && steps.length) { _this.state = { style: steps[0].style }; } else if (from) { if (typeof children === 'function') { _this.state = { style: from }; return _possibleConstructorReturn(_this); } _this.state = { style: attributeName ? _defineProperty({}, attributeName, from) : from }; } else { _this.state = { style: {} }; } return _this; } _createClass(Animate, [{ key: "componentDidMount", value: function componentDidMount() { var _this$props2 = this.props, isActive = _this$props2.isActive, canBegin = _this$props2.canBegin; this.mounted = true; if (!isActive || !canBegin) { return; } this.runAnimation(this.props); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props3 = this.props, isActive = _this$props3.isActive, canBegin = _this$props3.canBegin, attributeName = _this$props3.attributeName, shouldReAnimate = _this$props3.shouldReAnimate, to = _this$props3.to, currentFrom = _this$props3.from; var style = this.state.style; if (!canBegin) { return; } if (!isActive) { var newState = { style: attributeName ? _defineProperty({}, attributeName, to) : to }; if (this.state && style) { if (attributeName && style[attributeName] !== to || !attributeName && style !== to) { // eslint-disable-next-line react/no-did-update-set-state this.setState(newState); } } return; } if ((0,fast_equals__WEBPACK_IMPORTED_MODULE_1__.deepEqual)(prevProps.to, to) && prevProps.canBegin && prevProps.isActive) { return; } var isTriggered = !prevProps.canBegin || !prevProps.isActive; if (this.manager) { this.manager.stop(); } if (this.stopJSAnimation) { this.stopJSAnimation(); } var from = isTriggered || shouldReAnimate ? currentFrom : prevProps.to; if (this.state && style) { var _newState = { style: attributeName ? _defineProperty({}, attributeName, from) : from }; if (attributeName && style[attributeName] !== from || !attributeName && style !== from) { // eslint-disable-next-line react/no-did-update-set-state this.setState(_newState); } } this.runAnimation(_objectSpread(_objectSpread({}, this.props), {}, { from: from, begin: 0 })); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.mounted = false; var onAnimationEnd = this.props.onAnimationEnd; if (this.unSubscribe) { this.unSubscribe(); } if (this.manager) { this.manager.stop(); this.manager = null; } if (this.stopJSAnimation) { this.stopJSAnimation(); } if (onAnimationEnd) { onAnimationEnd(); } } }, { key: "handleStyleChange", value: function handleStyleChange(style) { this.changeStyle(style); } }, { key: "changeStyle", value: function changeStyle(style) { if (this.mounted) { this.setState({ style: style }); } } }, { key: "runJSAnimation", value: function runJSAnimation(props) { var _this2 = this; var from = props.from, to = props.to, duration = props.duration, easing = props.easing, begin = props.begin, onAnimationEnd = props.onAnimationEnd, onAnimationStart = props.onAnimationStart; var startAnimation = (0,_configUpdate__WEBPACK_IMPORTED_MODULE_2__["default"])(from, to, (0,_easing__WEBPACK_IMPORTED_MODULE_3__.configEasing)(easing), duration, this.changeStyle); var finalStartAnimation = function finalStartAnimation() { _this2.stopJSAnimation = startAnimation(); }; this.manager.start([onAnimationStart, begin, finalStartAnimation, duration, onAnimationEnd]); } }, { key: "runStepAnimation", value: function runStepAnimation(props) { var _this3 = this; var steps = props.steps, begin = props.begin, onAnimationStart = props.onAnimationStart; var _steps$ = steps[0], initialStyle = _steps$.style, _steps$$duration = _steps$.duration, initialTime = _steps$$duration === void 0 ? 0 : _steps$$duration; var addStyle = function addStyle(sequence, nextItem, index) { if (index === 0) { return sequence; } var duration = nextItem.duration, _nextItem$easing = nextItem.easing, easing = _nextItem$easing === void 0 ? 'ease' : _nextItem$easing, style = nextItem.style, nextProperties = nextItem.properties, onAnimationEnd = nextItem.onAnimationEnd; var preItem = index > 0 ? steps[index - 1] : nextItem; var properties = nextProperties || Object.keys(style); if (typeof easing === 'function' || easing === 'spring') { return [].concat(_toConsumableArray(sequence), [_this3.runJSAnimation.bind(_this3, { from: preItem.style, to: style, duration: duration, easing: easing }), duration]); } var transition = (0,_util__WEBPACK_IMPORTED_MODULE_4__.getTransitionVal)(properties, duration, easing); var newStyle = _objectSpread(_objectSpread(_objectSpread({}, preItem.style), style), {}, { transition: transition }); return [].concat(_toConsumableArray(sequence), [newStyle, duration, onAnimationEnd]).filter(_util__WEBPACK_IMPORTED_MODULE_4__.identity); }; return this.manager.start([onAnimationStart].concat(_toConsumableArray(steps.reduce(addStyle, [initialStyle, Math.max(initialTime, begin)])), [props.onAnimationEnd])); } }, { key: "runAnimation", value: function runAnimation(props) { if (!this.manager) { this.manager = (0,_AnimateManager__WEBPACK_IMPORTED_MODULE_5__["default"])(); } var begin = props.begin, duration = props.duration, attributeName = props.attributeName, propsTo = props.to, easing = props.easing, onAnimationStart = props.onAnimationStart, onAnimationEnd = props.onAnimationEnd, steps = props.steps, children = props.children; var manager = this.manager; this.unSubscribe = manager.subscribe(this.handleStyleChange); if (typeof easing === 'function' || typeof children === 'function' || easing === 'spring') { this.runJSAnimation(props); return; } if (steps.length > 1) { this.runStepAnimation(props); return; } var to = attributeName ? _defineProperty({}, attributeName, propsTo) : propsTo; var transition = (0,_util__WEBPACK_IMPORTED_MODULE_4__.getTransitionVal)(Object.keys(to), duration, easing); manager.start([onAnimationStart, begin, _objectSpread(_objectSpread({}, to), {}, { transition: transition }), duration, onAnimationEnd]); } }, { key: "render", value: function render() { var _this$props4 = this.props, children = _this$props4.children, begin = _this$props4.begin, duration = _this$props4.duration, attributeName = _this$props4.attributeName, easing = _this$props4.easing, isActive = _this$props4.isActive, steps = _this$props4.steps, from = _this$props4.from, to = _this$props4.to, canBegin = _this$props4.canBegin, onAnimationEnd = _this$props4.onAnimationEnd, shouldReAnimate = _this$props4.shouldReAnimate, onAnimationReStart = _this$props4.onAnimationReStart, others = _objectWithoutProperties(_this$props4, _excluded); var count = react__WEBPACK_IMPORTED_MODULE_0__.Children.count(children); // eslint-disable-next-line react/destructuring-assignment var stateStyle = this.state.style; if (typeof children === 'function') { return children(stateStyle); } if (!isActive || count === 0 || duration <= 0) { return children; } var cloneContainer = function cloneContainer(container) { var _container$props = container.props, _container$props$styl = _container$props.style, style = _container$props$styl === void 0 ? {} : _container$props$styl, className = _container$props.className; var res = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(container, _objectSpread(_objectSpread({}, others), {}, { style: _objectSpread(_objectSpread({}, style), stateStyle), className: className })); return res; }; if (count === 1) { return cloneContainer(react__WEBPACK_IMPORTED_MODULE_0__.Children.only(children)); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0__.Children.map(children, function (child) { return cloneContainer(child); })); } }]); return Animate; }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); Animate.displayName = 'Animate'; Animate.defaultProps = { begin: 0, duration: 1000, from: '', to: '', attributeName: '', easing: 'ease', isActive: true, canBegin: true, steps: [], onAnimationEnd: function onAnimationEnd() {}, onAnimationStart: function onAnimationStart() {} }; Animate.propTypes = { from: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string)]), to: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string)]), attributeName: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string), // animation duration duration: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number), begin: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number), easing: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)]), steps: prop_types__WEBPACK_IMPORTED_MODULE_6___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_6___default().shape({ duration: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number).isRequired, style: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object).isRequired, easing: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOf(['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear']), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)]), // transition css properties(dash case), optional properties: prop_types__WEBPACK_IMPORTED_MODULE_6___default().arrayOf('string'), onAnimationEnd: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func) })), children: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().node), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)]), isActive: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool), canBegin: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool), onAnimationEnd: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func), // decide if it should reanimate with initial from style when props change shouldReAnimate: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool), onAnimationStart: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func), onAnimationReStart: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func) }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Animate); /***/ }), /***/ "../../../node_modules/react-smooth/es6/AnimateGroup.js": /*!**************************************************************!*\ !*** ../../../node_modules/react-smooth/es6/AnimateGroup.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-transition-group */ "../../../node_modules/react-transition-group/esm/TransitionGroup.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "../../../node_modules/prop-types/index.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _AnimateGroupChild__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AnimateGroupChild */ "../../../node_modules/react-smooth/es6/AnimateGroupChild.js"); function AnimateGroup(props) { var component = props.component, children = props.children, appear = props.appear, enter = props.enter, leave = props.leave; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_transition_group__WEBPACK_IMPORTED_MODULE_1__["default"], { component: component }, react__WEBPACK_IMPORTED_MODULE_0__.Children.map(children, function (child, index) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AnimateGroupChild__WEBPACK_IMPORTED_MODULE_2__["default"], { appearOptions: appear, enterOptions: enter, leaveOptions: leave, key: "child-".concat(index) // eslint-disable-line }, child); })); } AnimateGroup.propTypes = { appear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), enter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), leave: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), children: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().array), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().element)]), component: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any) }; AnimateGroup.defaultProps = { component: 'span' }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AnimateGroup); /***/ }), /***/ "../../../node_modules/react-smooth/es6/AnimateGroupChild.js": /*!*******************************************************************!*\ !*** ../../../node_modules/react-smooth/es6/AnimateGroupChild.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-transition-group */ "../../../node_modules/react-transition-group/esm/Transition.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "../../../node_modules/prop-types/index.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _Animate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Animate */ "../../../node_modules/react-smooth/es6/Animate.js"); var _excluded = ["children", "appearOptions", "enterOptions", "leaveOptions"]; 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 _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var parseDurationOfSingleTransition = function parseDurationOfSingleTransition() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var steps = options.steps, duration = options.duration; if (steps && steps.length) { return steps.reduce(function (result, entry) { return result + (Number.isFinite(entry.duration) && entry.duration > 0 ? entry.duration : 0); }, 0); } if (Number.isFinite(duration)) { return duration; } return 0; }; var AnimateGroupChild = /*#__PURE__*/function (_Component) { _inherits(AnimateGroupChild, _Component); var _super = _createSuper(AnimateGroupChild); function AnimateGroupChild() { var _this; _classCallCheck(this, AnimateGroupChild); _this = _super.call(this); _defineProperty(_assertThisInitialized(_this), "handleEnter", function (node, isAppearing) { var _this$props = _this.props, appearOptions = _this$props.appearOptions, enterOptions = _this$props.enterOptions; _this.handleStyleActive(isAppearing ? appearOptions : enterOptions); }); _defineProperty(_assertThisInitialized(_this), "handleExit", function () { var leaveOptions = _this.props.leaveOptions; _this.handleStyleActive(leaveOptions); }); _this.state = { isActive: false }; return _this; } _createClass(AnimateGroupChild, [{ key: "handleStyleActive", value: function handleStyleActive(style) { if (style) { var onAnimationEnd = style.onAnimationEnd ? function () { style.onAnimationEnd(); } : null; this.setState(_objectSpread(_objectSpread({}, style), {}, { onAnimationEnd: onAnimationEnd, isActive: true })); } } }, { key: "parseTimeout", value: function parseTimeout() { var _this$props2 = this.props, appearOptions = _this$props2.appearOptions, enterOptions = _this$props2.enterOptions, leaveOptions = _this$props2.leaveOptions; return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions); } }, { key: "render", value: function render() { var _this2 = this; var _this$props3 = this.props, children = _this$props3.children, appearOptions = _this$props3.appearOptions, enterOptions = _this$props3.enterOptions, leaveOptions = _this$props3.leaveOptions, props = _objectWithoutProperties(_this$props3, _excluded); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_transition_group__WEBPACK_IMPORTED_MODULE_1__["default"], _extends({}, props, { onEnter: this.handleEnter, onExit: this.handleExit, timeout: this.parseTimeout() }), function () { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Animate__WEBPACK_IMPORTED_MODULE_2__["default"], _this2.state, react__WEBPACK_IMPORTED_MODULE_0__.Children.only(children)); }); } }]); return AnimateGroupChild; }(react__WEBPACK_IMPORTED_MODULE_0__.Component); AnimateGroupChild.propTypes = { appearOptions: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), enterOptions: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), leaveOptions: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), children: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().element) }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AnimateGroupChild); /***/ }), /***/ "../../../node_modules/react-smooth/es6/AnimateManager.js": /*!****************************************************************!*\ !*** ../../../node_modules/react-smooth/es6/AnimateManager.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ createAnimateManager) /* harmony export */ }); /* harmony import */ var _setRafTimeout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setRafTimeout */ "../../../node_modules/react-smooth/es6/setRafTimeout.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 _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function createAnimateManager() { var currStyle = {}; var handleChange = function handleChange() { return null; }; var shouldStop = false; var setStyle = function setStyle(_style) { if (shouldStop) { return; } if (Array.isArray(_style)) { if (!_style.length) { return; } var styles = _style; var _styles = _toArray(styles), curr = _styles[0], restStyles = _styles.slice(1); if (typeof curr === 'number') { (0,_setRafTimeout__WEBPACK_IMPORTED_MODULE_0__["default"])(setStyle.bind(null, restStyles), curr); return; } setStyle(curr); (0,_setRafTimeout__WEBPACK_IMPORTED_MODULE_0__["default"])(setStyle.bind(null, restStyles)); return; } if (_typeof(_style) === 'object') { currStyle = _style; handleChange(currStyle); } if (typeof _style === 'function') { _style(); } }; return { stop: function stop() { shouldStop = true; }, start: function start(style) { shouldStop = false; setStyle(style); }, subscribe: function subscribe(_handleChange) { handleChange = _handleChange; return function () { handleChange = function handleChange() { return null; }; }; } }; } /***/ }), /***/ "../../../node_modules/react-smooth/es6/configUpdate.js": /*!**************************************************************!*\ !*** ../../../node_modules/react-smooth/es6/configUpdate.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "../../../node_modules/react-smooth/es6/util.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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var alpha = function alpha(begin, end, k) { return begin + (end - begin) * k; }; var needContinue = function needContinue(_ref) { var from = _ref.from, to = _ref.to; return from !== to; }; /* * @description: cal new from value and velocity in each stepper * @return: { [styleProperty]: { from, to, velocity } } */ var calStepperVals = function calStepperVals(easing, preVals, steps) { var nextStepVals = (0,_util__WEBPACK_IMPORTED_MODULE_0__.mapObject)(function (key, val) { if (needContinue(val)) { var _easing = easing(val.from, val.to, val.velocity), _easing2 = _slicedToArray(_easing, 2), newX = _easing2[0], newV = _easing2[1]; return _objectSpread(_objectSpread({}, val), {}, { from: newX, velocity: newV }); } return val; }, preVals); if (steps < 1) { return (0,_util__WEBPACK_IMPORTED_MODULE_0__.mapObject)(function (key, val) { if (needContinue(val)) { return _objectSpread(_objectSpread({}, val), {}, { velocity: alpha(val.velocity, nextStepVals[key].velocity, steps), from: alpha(val.from, nextStepVals[key].from, steps) }); } return val; }, preVals); } return calStepperVals(easing, nextStepVals, steps - 1); }; // configure update function /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (from, to, easing, duration, render) { var interKeys = (0,_util__WEBPACK_IMPORTED_MODULE_0__.getIntersectionKeys)(from, to); var timingStyle = interKeys.reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, [from[key], to[key]])); }, {}); var stepperStyle = interKeys.reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, { from: from[key], velocity: 0, to: to[key] })); }, {}); var cafId = -1; var preTime; var beginTime; var update = function update() { return null; }; var getCurrStyle = function getCurrStyle() { return (0,_util__WEBPACK_IMPORTED_MODULE_0__.mapObject)(function (key, val) { return val.from; }, stepperStyle); }; var shouldStopAnimation = function shouldStopAnimation() { return !Object.values(stepperStyle).filter(needContinue).length; }; // stepper timing function like spring var stepperUpdate = function stepperUpdate(now) { if (!preTime) { preTime = now; } var deltaTime = now - preTime; var steps = deltaTime / easing.dt; stepperStyle = calStepperVals(easing, stepperStyle, steps); // get union set and add compatible prefix render(_objectSpread(_objectSpread(_objectSpread({}, from), to), getCurrStyle(stepperStyle))); preTime = now; if (!shouldStopAnimation()) { cafId = requestAnimationFrame(update); } }; // t => val timing function like cubic-bezier var timingUpdate = function timingUpdate(now) { if (!beginTime) { beginTime = now; } var t = (now - beginTime) / duration; var currStyle = (0,_util__WEBPACK_IMPORTED_MODULE_0__.mapObject)(function (key, val) { return alpha.apply(void 0, _toConsumableArray(val).concat([easing(t)])); }, timingStyle); // get union set and add compatible prefix render(_objectSpread(_objectSpread(_objectSpread({}, from), to), currStyle)); if (t < 1) { cafId = requestAnimationFrame(update); } else { var finalStyle = (0,_util__WEBPACK_IMPORTED_MODULE_0__.mapObject)(function (key, val) { return alpha.apply(void 0, _toConsumableArray(val).concat([easing(1)])); }, timingStyle); render(_objectSpread(_objectSpread(_objectSpread({}, from), to), finalStyle)); } }; update = easing.isStepper ? stepperUpdate : timingUpdate; // return start animation method return function () { requestAnimationFrame(update); // return stop animation method return function () { cancelAnimationFrame(cafId); }; }; }); /***/ }), /***/ "../../../node_modules/react-smooth/es6/easing.js": /*!********************************************************!*\ !*** ../../../node_modules/react-smooth/es6/easing.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ configBezier: () => (/* binding */ configBezier), /* harmony export */ configEasing: () => (/* binding */ configEasing), /* harmony export */ configSpring: () => (/* binding */ configSpring) /* harmony export */ }); /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "../../../node_modules/react-smooth/es6/util.js"); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var ACCURACY = 1e-4; var cubicBezierFactor = function cubicBezierFactor(c1, c2) { return [0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1]; }; var multyTime = function multyTime(params, t) { return params.map(function (param, i) { return param * Math.pow(t, i); }).reduce(function (pre, curr) { return pre + curr; }); }; var cubicBezier = function cubicBezier(c1, c2) { return function (t) { var params = cubicBezierFactor(c1, c2); return multyTime(params, t); }; }; var derivativeCubicBezier = function derivativeCubicBezier(c1, c2) { return function (t) { var params = cubicBezierFactor(c1, c2); var newParams = [].concat(_toConsumableArray(params.map(function (param, i) { return param * i; }).slice(1)), [0]); return multyTime(newParams, t); }; }; // calculate cubic-bezier using Newton's method var configBezier = function configBezier() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var x1 = args[0], y1 = args[1], x2 = args[2], y2 = args[3]; if (args.length === 1) { switch (args[0]) { case 'linear': x1 = 0.0; y1 = 0.0; x2 = 1.0; y2 = 1.0; break; case 'ease': x1 = 0.25; y1 = 0.1; x2 = 0.25; y2 = 1.0; break; case 'ease-in': x1 = 0.42; y1 = 0.0; x2 = 1.0; y2 = 1.0; break; case 'ease-out': x1 = 0.42; y1 = 0.0; x2 = 0.58; y2 = 1.0; break; case 'ease-in-out': x1 = 0.0; y1 = 0.0; x2 = 0.58; y2 = 1.0; break; default: { var easing = args[0].split('('); if (easing[0] === 'cubic-bezier' && easing[1].split(')')[0].split(',').length === 4) { var _easing$1$split$0$spl = easing[1].split(')')[0].split(',').map(function (x) { return parseFloat(x); }); var _easing$1$split$0$spl2 = _slicedToArray(_easing$1$split$0$spl, 4); x1 = _easing$1$split$0$spl2[0]; y1 = _easing$1$split$0$spl2[1]; x2 = _easing$1$split$0$spl2[2]; y2 = _easing$1$split$0$spl2[3]; } else { (0,_util__WEBPACK_IMPORTED_MODULE_0__.warn)(false, '[configBezier]: arguments should be one of ' + "oneOf 'linear', 'ease', 'ease-in', 'ease-out', " + "'ease-in-out','cubic-bezier(x1,y1,x2,y2)', instead received %s", args); } } } } (0,_util__WEBPACK_IMPORTED_MODULE_0__.warn)([x1, x2, y1, y2].every(function (num) { return typeof num === 'number' && num >= 0 && num <= 1; }), '[configBezier]: arguments should be x1, y1, x2, y2 of [0, 1] instead received %s', args); var curveX = cubicBezier(x1, x2); var curveY = cubicBezier(y1, y2); var derCurveX = derivativeCubicBezier(x1, x2); var rangeValue = function rangeValue(value) { if (value > 1) { return 1; } if (value < 0) { return 0; } return value; }; var bezier = function bezier(_t) { var t = _t > 1 ? 1 : _t; var x = t; for (var i = 0; i < 8; ++i) { var evalT = curveX(x) - t; var derVal = derCurveX(x); if (Math.abs(evalT - t) < ACCURACY || derVal < ACCURACY) { return curveY(x); } x = rangeValue(x - evalT / derVal); } return curveY(x); }; bezier.isStepper = false; return bezier; }; var configSpring = function configSpring() { var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _config$stiff = config.stiff, stiff = _config$stiff === void 0 ? 100 : _config$stiff, _config$damping = config.damping, damping = _config$damping === void 0 ? 8 : _config$damping, _config$dt = config.dt, dt = _config$dt === void 0 ? 17 : _config$dt; var stepper = function stepper(currX, destX, currV) { var FSpring = -(currX - destX) * stiff; var FDamping = currV * damping; var newV = currV + (FSpring - FDamping) * dt / 1000; var newX = currV * dt / 1000 + currX; if (Math.abs(newX - destX) < ACCURACY && Math.abs(newV) < ACCURACY) { return [destX, 0]; } return [newX, newV]; }; stepper.isStepper = true; stepper.dt = dt; return stepper; }; var configEasing = function configEasing() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } var easing = args[0]; if (typeof easing === 'string') { switch (easing) { case 'ease': case 'ease-in-out': case 'ease-out': case 'ease-in': case 'linear': return configBezier(easing); case 'spring': return configSpring(); default: if (easing.split('(')[0] === 'cubic-bezier') { return configBezier(easing); } (0,_util__WEBPACK_IMPORTED_MODULE_0__.warn)(false, "[configEasing]: first argument should be one of 'ease', 'ease-in', " + "'ease-out', 'ease-in-out','cubic-bezier(x1,y1,x2,y2)', 'linear' and 'spring', instead received %s", args); } } if (typeof easing === 'function') { return easing; } (0,_util__WEBPACK_IMPORTED_MODULE_0__.warn)(false, '[configEasing]: first argument type should be function or string, instead received %s', args); return null; }; /***/ }), /***/ "../../../node_modules/react-smooth/es6/index.js": /*!*******************************************************!*\ !*** ../../../node_modules/react-smooth/es6/index.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimateGroup: () => (/* reexport safe */ _AnimateGroup__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ configBezier: () => (/* reexport safe */ _easing__WEBPACK_IMPORTED_MODULE_0__.configBezier), /* harmony export */ configSpring: () => (/* reexport safe */ _easing__WEBPACK_IMPORTED_MODULE_0__.configSpring), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _Animate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Animate */ "../../../node_modules/react-smooth/es6/Animate.js"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./easing */ "../../../node_modules/react-smooth/es6/easing.js"); /* harmony import */ var _AnimateGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AnimateGroup */ "../../../node_modules/react-smooth/es6/AnimateGroup.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_Animate__WEBPACK_IMPORTED_MODULE_2__["default"]); /***/ }), /***/ "../../../node_modules/react-smooth/es6/setRafTimeout.js": /*!***************************************************************!*\ !*** ../../../node_modules/react-smooth/es6/setRafTimeout.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ setRafTimeout) /* harmony export */ }); function safeRequestAnimationFrame(callback) { if (typeof requestAnimationFrame !== 'undefined') requestAnimationFrame(callback); } function setRafTimeout(callback) { var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var currTime = -1; var shouldUpdate = function shouldUpdate(now) { if (currTime < 0) { currTime = now; } if (now - currTime > timeout) { callback(now); currTime = -1; } else { safeRequestAnimationFrame(shouldUpdate); } }; requestAnimationFrame(shouldUpdate); } /***/ }), /***/ "../../../node_modules/react-smooth/es6/util.js": /*!******************************************************!*\ !*** ../../../node_modules/react-smooth/es6/util.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ debug: () => (/* binding */ debug), /* harmony export */ debugf: () => (/* binding */ debugf), /* harmony export */ getDashCase: () => (/* binding */ getDashCase), /* harmony export */ getIntersectionKeys: () => (/* binding */ getIntersectionKeys), /* harmony export */ getTransitionVal: () => (/* binding */ getTransitionVal), /* harmony export */ identity: () => (/* binding */ identity), /* harmony export */ log: () => (/* binding */ log), /* harmony export */ mapObject: () => (/* binding */ mapObject), /* harmony export */ warn: () => (/* binding */ warn) /* 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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /* eslint no-console: 0 */ var getIntersectionKeys = function getIntersectionKeys(preObj, nextObj) { return [Object.keys(preObj), Object.keys(nextObj)].reduce(function (a, b) { return a.filter(function (c) { return b.includes(c); }); }); }; var identity = function identity(param) { return param; }; /* * @description: convert camel case to dash case * string => string */ var getDashCase = function getDashCase(name) { return name.replace(/([A-Z])/g, function (v) { return "-".concat(v.toLowerCase()); }); }; var log = function log() { var _console; (_console = console).log.apply(_console, arguments); }; /* * @description: log the value of a varible * string => any => any */ var debug = function debug(name) { return function (item) { log(name, item); return item; }; }; /* * @description: log name, args, return value of a function * function => function */ var debugf = function debugf(tag, f) { return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var res = f.apply(void 0, args); var name = tag || f.name || 'anonymous function'; var argNames = "(".concat(args.map(JSON.stringify).join(', '), ")"); log("".concat(name, ": ").concat(argNames, " => ").concat(JSON.stringify(res))); return res; }; }; /* * @description: map object on every element in this object. * (function, object) => object */ var mapObject = function mapObject(fn, obj) { return Object.keys(obj).reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, fn(key, obj[key]))); }, {}); }; var getTransitionVal = function getTransitionVal(props, duration, easing) { return props.map(function (prop) { return "".concat(getDashCase(prop), " ").concat(duration, "ms ").concat(easing); }).join(','); }; var isDev = "development" !== 'production'; var warn = function warn(condition, format, a, b, c, d, e, f) { if (isDev && typeof console !== 'undefined' && console.warn) { if (format === undefined) { console.warn('LogUtils requires an error message argument'); } if (!condition) { if (format === undefined) { console.warn('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; console.warn(format.replace(/%s/g, function () { return args[argIndex++]; })); } } } }; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVhY3Qtc21vb3RoX2VzNl9pbmRleF9qcy52b2x1bnRlZXJhcGkuMzFhYTU4ZDkxZjA1YjQwNDUyZGEuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQkFBc0IsMkJBQTJCLG9HQUFvRyxtQkFBbUIsaUJBQWlCLHNIQUFzSDtBQUMvUztBQUNBLHNEQUFzRCwrQkFBK0IsOERBQThELFlBQVksb0NBQW9DLDZEQUE2RCxZQUFZLDZCQUE2QixPQUFPLDJCQUEyQiwwQ0FBMEMsd0VBQXdFLCtCQUErQjtBQUM1ZCwyREFBMkQsK0JBQStCLGlCQUFpQixzQ0FBc0MsWUFBWSxZQUFZLHVCQUF1QixPQUFPLHFCQUFxQiwwQ0FBMEMsNkJBQTZCO0FBQ25TLG1DQUFtQztBQUNuQyxnQ0FBZ0M7QUFDaEMsa0RBQWtELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7QUFDN1Msa0NBQWtDO0FBQ2xDLG1DQUFtQztBQUNuQyx1Q0FBdUMsdURBQXVELHVDQUF1QyxTQUFTLHVCQUF1QjtBQUNySyx5QkFBeUIsd0JBQXdCLG9DQUFvQyx5Q0FBeUMsa0NBQWtDLDBEQUEwRCwwQkFBMEI7QUFDcFAsNEJBQTRCLGdCQUFnQixzQkFBc0IsT0FBTyxrREFBa0Qsc0RBQXNELDhCQUE4QixtSkFBbUoscUVBQXFFLEtBQUs7QUFDNWEsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLGtEQUFrRCwwQ0FBMEM7QUFDNUYsNENBQTRDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7QUFDL1AsOERBQThELHNFQUFzRSw4REFBOEQsa0RBQWtELGlCQUFpQixHQUFHO0FBQ3hRLCtCQUErQix1Q0FBdUM7QUFDdEUscUNBQXFDLGlFQUFpRSxzQ0FBc0MsMEJBQTBCLCtDQUErQywyQ0FBMkMsdUVBQXVFO0FBQ3ZV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QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1zbW9vdGgvZXM2L0FuaW1hdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3Qtc21vb3RoL2VzNi9BbmltYXRlR3JvdXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3Qtc21vb3RoL2VzNi9BbmltYXRlR3JvdXBDaGlsZC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1zbW9vdGgvZXM2L0FuaW1hdGVNYW5hZ2VyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXNtb290aC9lczYvY29uZmlnVXBkYXRlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXNtb290aC9lczYvZWFzaW5nLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXNtb290aC9lczYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3Qtc21vb3RoL2VzNi9zZXRSYWZUaW1lb3V0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXNtb290aC9lczYvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIiwgXCJiZWdpblwiLCBcImR1cmF0aW9uXCIsIFwiYXR0cmlidXRlTmFtZVwiLCBcImVhc2luZ1wiLCBcImlzQWN0aXZlXCIsIFwic3RlcHNcIiwgXCJmcm9tXCIsIFwidG9cIiwgXCJjYW5CZWdpblwiLCBcIm9uQW5pbWF0aW9uRW5kXCIsIFwic2hvdWxkUmVBbmltYXRlXCIsIFwib25BbmltYXRpb25SZVN0YXJ0XCJdO1xuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIGNsb25lRWxlbWVudCwgQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnZmFzdC1lcXVhbHMnO1xuaW1wb3J0IGNyZWF0ZUFuaW1hdGVNYW5hZ2VyIGZyb20gJy4vQW5pbWF0ZU1hbmFnZXInO1xuaW1wb3J0IHsgY29uZmlnRWFzaW5nIH0gZnJvbSAnLi9lYXNpbmcnO1xuaW1wb3J0IGNvbmZpZ1VwZGF0ZSBmcm9tICcuL2NvbmZpZ1VwZGF0ZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uVmFsLCBpZGVudGl0eSB9IGZyb20gJy4vdXRpbCc7XG52YXIgQW5pbWF0ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFuaW1hdGUsIF9QdXJlQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBbmltYXRlKTtcbiAgZnVuY3Rpb24gQW5pbWF0ZShwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0ZSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCk7XG4gICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICBpc0FjdGl2ZSA9IF90aGlzJHByb3BzLmlzQWN0aXZlLFxuICAgICAgYXR0cmlidXRlTmFtZSA9IF90aGlzJHByb3BzLmF0dHJpYnV0ZU5hbWUsXG4gICAgICBmcm9tID0gX3RoaXMkcHJvcHMuZnJvbSxcbiAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICBzdGVwcyA9IF90aGlzJHByb3BzLnN0ZXBzLFxuICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgIGR1cmF0aW9uID0gX3RoaXMkcHJvcHMuZHVyYXRpb247XG4gICAgX3RoaXMuaGFuZGxlU3R5bGVDaGFuZ2UgPSBfdGhpcy5oYW5kbGVTdHlsZUNoYW5nZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICBfdGhpcy5jaGFuZ2VTdHlsZSA9IF90aGlzLmNoYW5nZVN0eWxlLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIGlmICghaXNBY3RpdmUgfHwgZHVyYXRpb24gPD0gMCkge1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIHN0eWxlOiB7fVxuICAgICAgfTtcblxuICAgICAgLy8gaWYgY2hpbGRyZW4gaXMgYSBmdW5jdGlvbiBhbmQgYW5pbWF0aW9uIGlzIG5vdCBhY3RpdmUsIHNldCBzdHlsZSB0byAndG8nXG4gICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgIHN0eWxlOiB0b1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcbiAgICB9XG4gICAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIHN0eWxlOiBzdGVwc1swXS5zdHlsZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGZyb20pIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgc3R5bGU6IGZyb21cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBzdHlsZTogYXR0cmlidXRlTmFtZSA/IF9kZWZpbmVQcm9wZXJ0eSh7fSwgYXR0cmlidXRlTmFtZSwgZnJvbSkgOiBmcm9tXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgc3R5bGU6IHt9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlzQWN0aXZlID0gX3RoaXMkcHJvcHMyLmlzQWN0aXZlLFxuICAgICAgICBjYW5CZWdpbiA9IF90aGlzJHByb3BzMi5jYW5CZWdpbjtcbiAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoIWlzQWN0aXZlIHx8ICFjYW5CZWdpbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bkFuaW1hdGlvbih0aGlzLnByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc0FjdGl2ZSA9IF90aGlzJHByb3BzMy5pc0FjdGl2ZSxcbiAgICAgICAgY2FuQmVnaW4gPSBfdGhpcyRwcm9wczMuY2FuQmVnaW4sXG4gICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfdGhpcyRwcm9wczMuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgc2hvdWxkUmVBbmltYXRlID0gX3RoaXMkcHJvcHMzLnNob3VsZFJlQW5pbWF0ZSxcbiAgICAgICAgdG8gPSBfdGhpcyRwcm9wczMudG8sXG4gICAgICAgIGN1cnJlbnRGcm9tID0gX3RoaXMkcHJvcHMzLmZyb207XG4gICAgICB2YXIgc3R5bGUgPSB0aGlzLnN0YXRlLnN0eWxlO1xuICAgICAgaWYgKCFjYW5CZWdpbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICBzdHlsZTogYXR0cmlidXRlTmFtZSA/IF9kZWZpbmVQcm9wZXJ0eSh7fSwgYXR0cmlidXRlTmFtZSwgdG8pIDogdG9cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgJiYgc3R5bGUpIHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSAmJiBzdHlsZVthdHRyaWJ1dGVOYW1lXSAhPT0gdG8gfHwgIWF0dHJpYnV0ZU5hbWUgJiYgc3R5bGUgIT09IHRvKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tZGlkLXVwZGF0ZS1zZXQtc3RhdGVcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGVlcEVxdWFsKHByZXZQcm9wcy50bywgdG8pICYmIHByZXZQcm9wcy5jYW5CZWdpbiAmJiBwcmV2UHJvcHMuaXNBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGlzVHJpZ2dlcmVkID0gIXByZXZQcm9wcy5jYW5CZWdpbiB8fCAhcHJldlByb3BzLmlzQWN0aXZlO1xuICAgICAgaWYgKHRoaXMubWFuYWdlcikge1xuICAgICAgICB0aGlzLm1hbmFnZXIuc3RvcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RvcEpTQW5pbWF0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RvcEpTQW5pbWF0aW9uKCk7XG4gICAgICB9XG4gICAgICB2YXIgZnJvbSA9IGlzVHJpZ2dlcmVkIHx8IHNob3VsZFJlQW5pbWF0ZSA/IGN1cnJlbnRGcm9tIDogcHJldlByb3BzLnRvO1xuICAgICAgaWYgKHRoaXMuc3RhdGUgJiYgc3R5bGUpIHtcbiAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IHtcbiAgICAgICAgICBzdHlsZTogYXR0cmlidXRlTmFtZSA/IF9kZWZpbmVQcm9wZXJ0eSh7fSwgYXR0cmlidXRlTmFtZSwgZnJvbSkgOiBmcm9tXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lICYmIHN0eWxlW2F0dHJpYnV0ZU5hbWVdICE9PSBmcm9tIHx8ICFhdHRyaWJ1dGVOYW1lICYmIHN0eWxlICE9PSBmcm9tKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShfbmV3U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bkFuaW1hdGlvbihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICBiZWdpbjogMFxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgICAgdmFyIG9uQW5pbWF0aW9uRW5kID0gdGhpcy5wcm9wcy5vbkFuaW1hdGlvbkVuZDtcbiAgICAgIGlmICh0aGlzLnVuU3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMudW5TdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnN0b3AoKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0b3BKU0FuaW1hdGlvbikge1xuICAgICAgICB0aGlzLnN0b3BKU0FuaW1hdGlvbigpO1xuICAgICAgfVxuICAgICAgaWYgKG9uQW5pbWF0aW9uRW5kKSB7XG4gICAgICAgIG9uQW5pbWF0aW9uRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZVN0eWxlQ2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVN0eWxlQ2hhbmdlKHN0eWxlKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2hhbmdlU3R5bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbmdlU3R5bGUoc3R5bGUpIHtcbiAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJydW5KU0FuaW1hdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW5KU0FuaW1hdGlvbihwcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgZnJvbSA9IHByb3BzLmZyb20sXG4gICAgICAgIHRvID0gcHJvcHMudG8sXG4gICAgICAgIGR1cmF0aW9uID0gcHJvcHMuZHVyYXRpb24sXG4gICAgICAgIGVhc2luZyA9IHByb3BzLmVhc2luZyxcbiAgICAgICAgYmVnaW4gPSBwcm9wcy5iZWdpbixcbiAgICAgICAgb25BbmltYXRpb25FbmQgPSBwcm9wcy5vbkFuaW1hdGlvbkVuZCxcbiAgICAgICAgb25BbmltYXRpb25TdGFydCA9IHByb3BzLm9uQW5pbWF0aW9uU3RhcnQ7XG4gICAgICB2YXIgc3RhcnRBbmltYXRpb24gPSBjb25maWdVcGRhdGUoZnJvbSwgdG8sIGNvbmZpZ0Vhc2luZyhlYXNpbmcpLCBkdXJhdGlvbiwgdGhpcy5jaGFuZ2VTdHlsZSk7XG4gICAgICB2YXIgZmluYWxTdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGZpbmFsU3RhcnRBbmltYXRpb24oKSB7XG4gICAgICAgIF90aGlzMi5zdG9wSlNBbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbigpO1xuICAgICAgfTtcbiAgICAgIHRoaXMubWFuYWdlci5zdGFydChbb25BbmltYXRpb25TdGFydCwgYmVnaW4sIGZpbmFsU3RhcnRBbmltYXRpb24sIGR1cmF0aW9uLCBvbkFuaW1hdGlvbkVuZF0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJydW5TdGVwQW5pbWF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1blN0ZXBBbmltYXRpb24ocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHN0ZXBzID0gcHJvcHMuc3RlcHMsXG4gICAgICAgIGJlZ2luID0gcHJvcHMuYmVnaW4sXG4gICAgICAgIG9uQW5pbWF0aW9uU3RhcnQgPSBwcm9wcy5vbkFuaW1hdGlvblN0YXJ0O1xuICAgICAgdmFyIF9zdGVwcyQgPSBzdGVwc1swXSxcbiAgICAgICAgaW5pdGlhbFN0eWxlID0gX3N0ZXBzJC5zdHlsZSxcbiAgICAgICAgX3N0ZXBzJCRkdXJhdGlvbiA9IF9zdGVwcyQuZHVyYXRpb24sXG4gICAgICAgIGluaXRpYWxUaW1lID0gX3N0ZXBzJCRkdXJhdGlvbiA9PT0gdm9pZCAwID8gMCA6IF9zdGVwcyQkZHVyYXRpb247XG4gICAgICB2YXIgYWRkU3R5bGUgPSBmdW5jdGlvbiBhZGRTdHlsZShzZXF1ZW5jZSwgbmV4dEl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBzZXF1ZW5jZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHVyYXRpb24gPSBuZXh0SXRlbS5kdXJhdGlvbixcbiAgICAgICAgICBfbmV4dEl0ZW0kZWFzaW5nID0gbmV4dEl0ZW0uZWFzaW5nLFxuICAgICAgICAgIGVhc2luZyA9IF9uZXh0SXRlbSRlYXNpbmcgPT09IHZvaWQgMCA/ICdlYXNlJyA6IF9uZXh0SXRlbSRlYXNpbmcsXG4gICAgICAgICAgc3R5bGUgPSBuZXh0SXRlbS5zdHlsZSxcbiAgICAgICAgICBuZXh0UHJvcGVydGllcyA9IG5leHRJdGVtLnByb3BlcnRpZXMsXG4gICAgICAgICAgb25BbmltYXRpb25FbmQgPSBuZXh0SXRlbS5vbkFuaW1hdGlvbkVuZDtcbiAgICAgICAgdmFyIHByZUl0ZW0gPSBpbmRleCA+IDAgPyBzdGVwc1tpbmRleCAtIDFdIDogbmV4dEl0ZW07XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gbmV4dFByb3BlcnRpZXMgfHwgT2JqZWN0LmtleXMoc3R5bGUpO1xuICAgICAgICBpZiAodHlwZW9mIGVhc2luZyA9PT0gJ2Z1bmN0aW9uJyB8fCBlYXNpbmcgPT09ICdzcHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc2VxdWVuY2UpLCBbX3RoaXMzLnJ1bkpTQW5pbWF0aW9uLmJpbmQoX3RoaXMzLCB7XG4gICAgICAgICAgICBmcm9tOiBwcmVJdGVtLnN0eWxlLFxuICAgICAgICAgICAgdG86IHN0eWxlLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmdcbiAgICAgICAgICB9KSwgZHVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IGdldFRyYW5zaXRpb25WYWwocHJvcGVydGllcywgZHVyYXRpb24sIGVhc2luZyk7XG4gICAgICAgIHZhciBuZXdTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmVJdGVtLnN0eWxlKSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHNlcXVlbmNlKSwgW25ld1N0eWxlLCBkdXJhdGlvbiwgb25BbmltYXRpb25FbmRdKS5maWx0ZXIoaWRlbnRpdHkpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuc3RhcnQoW29uQW5pbWF0aW9uU3RhcnRdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc3RlcHMucmVkdWNlKGFkZFN0eWxlLCBbaW5pdGlhbFN0eWxlLCBNYXRoLm1heChpbml0aWFsVGltZSwgYmVnaW4pXSkpLCBbcHJvcHMub25BbmltYXRpb25FbmRdKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJ1bkFuaW1hdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW5BbmltYXRpb24ocHJvcHMpIHtcbiAgICAgIGlmICghdGhpcy5tYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IGNyZWF0ZUFuaW1hdGVNYW5hZ2VyKCk7XG4gICAgICB9XG4gICAgICB2YXIgYmVnaW4gPSBwcm9wcy5iZWdpbixcbiAgICAgICAgZHVyYXRpb24gPSBwcm9wcy5kdXJhdGlvbixcbiAgICAgICAgYXR0cmlidXRlTmFtZSA9IHByb3BzLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIHByb3BzVG8gPSBwcm9wcy50byxcbiAgICAgICAgZWFzaW5nID0gcHJvcHMuZWFzaW5nLFxuICAgICAgICBvbkFuaW1hdGlvblN0YXJ0ID0gcHJvcHMub25BbmltYXRpb25TdGFydCxcbiAgICAgICAgb25BbmltYXRpb25FbmQgPSBwcm9wcy5vbkFuaW1hdGlvbkVuZCxcbiAgICAgICAgc3RlcHMgPSBwcm9wcy5zdGVwcyxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBtYW5hZ2VyID0gdGhpcy5tYW5hZ2VyO1xuICAgICAgdGhpcy51blN1YnNjcmliZSA9IG1hbmFnZXIuc3Vic2NyaWJlKHRoaXMuaGFuZGxlU3R5bGVDaGFuZ2UpO1xuICAgICAgaWYgKHR5cGVvZiBlYXNpbmcgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nIHx8IGVhc2luZyA9PT0gJ3NwcmluZycpIHtcbiAgICAgICAgdGhpcy5ydW5KU0FuaW1hdGlvbihwcm9wcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGVwcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMucnVuU3RlcEFuaW1hdGlvbihwcm9wcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB0byA9IGF0dHJpYnV0ZU5hbWUgPyBfZGVmaW5lUHJvcGVydHkoe30sIGF0dHJpYnV0ZU5hbWUsIHByb3BzVG8pIDogcHJvcHNUbztcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gZ2V0VHJhbnNpdGlvblZhbChPYmplY3Qua2V5cyh0byksIGR1cmF0aW9uLCBlYXNpbmcpO1xuICAgICAgbWFuYWdlci5zdGFydChbb25BbmltYXRpb25TdGFydCwgYmVnaW4sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdG8pLCB7fSwge1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uXG4gICAgICB9KSwgZHVyYXRpb24sIG9uQW5pbWF0aW9uRW5kXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczQuY2hpbGRyZW4sXG4gICAgICAgIGJlZ2luID0gX3RoaXMkcHJvcHM0LmJlZ2luLFxuICAgICAgICBkdXJhdGlvbiA9IF90aGlzJHByb3BzNC5kdXJhdGlvbixcbiAgICAgICAgYXR0cmlidXRlTmFtZSA9IF90aGlzJHByb3BzNC5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICBlYXNpbmcgPSBfdGhpcyRwcm9wczQuZWFzaW5nLFxuICAgICAgICBpc0FjdGl2ZSA9IF90aGlzJHByb3BzNC5pc0FjdGl2ZSxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczQuc3RlcHMsXG4gICAgICAgIGZyb20gPSBfdGhpcyRwcm9wczQuZnJvbSxcbiAgICAgICAgdG8gPSBfdGhpcyRwcm9wczQudG8sXG4gICAgICAgIGNhbkJlZ2luID0gX3RoaXMkcHJvcHM0LmNhbkJlZ2luLFxuICAgICAgICBvbkFuaW1hdGlvbkVuZCA9IF90aGlzJHByb3BzNC5vbkFuaW1hdGlvbkVuZCxcbiAgICAgICAgc2hvdWxkUmVBbmltYXRlID0gX3RoaXMkcHJvcHM0LnNob3VsZFJlQW5pbWF0ZSxcbiAgICAgICAgb25BbmltYXRpb25SZVN0YXJ0ID0gX3RoaXMkcHJvcHM0Lm9uQW5pbWF0aW9uUmVTdGFydCxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzNCwgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBjb3VudCA9IENoaWxkcmVuLmNvdW50KGNoaWxkcmVuKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9kZXN0cnVjdHVyaW5nLWFzc2lnbm1lbnRcbiAgICAgIHZhciBzdGF0ZVN0eWxlID0gdGhpcy5zdGF0ZS5zdHlsZTtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuKHN0YXRlU3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FjdGl2ZSB8fCBjb3VudCA9PT0gMCB8fCBkdXJhdGlvbiA8PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHZhciBjbG9uZUNvbnRhaW5lciA9IGZ1bmN0aW9uIGNsb25lQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgX2NvbnRhaW5lciRwcm9wcyA9IGNvbnRhaW5lci5wcm9wcyxcbiAgICAgICAgICBfY29udGFpbmVyJHByb3BzJHN0eWwgPSBfY29udGFpbmVyJHByb3BzLnN0eWxlLFxuICAgICAgICAgIHN0eWxlID0gX2NvbnRhaW5lciRwcm9wcyRzdHlsID09PSB2b2lkIDAgPyB7fSA6IF9jb250YWluZXIkcHJvcHMkc3R5bCxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfY29udGFpbmVyJHByb3BzLmNsYXNzTmFtZTtcbiAgICAgICAgdmFyIHJlcyA9IC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoY29udGFpbmVyLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG90aGVycyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBzdGF0ZVN0eWxlKSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuICAgICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgIHJldHVybiBjbG9uZUNvbnRhaW5lcihDaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNsb25lQ29udGFpbmVyKGNoaWxkKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFuaW1hdGU7XG59KFB1cmVDb21wb25lbnQpO1xuQW5pbWF0ZS5kaXNwbGF5TmFtZSA9ICdBbmltYXRlJztcbkFuaW1hdGUuZGVmYXVsdFByb3BzID0ge1xuICBiZWdpbjogMCxcbiAgZHVyYXRpb246IDEwMDAsXG4gIGZyb206ICcnLFxuICB0bzogJycsXG4gIGF0dHJpYnV0ZU5hbWU6ICcnLFxuICBlYXNpbmc6ICdlYXNlJyxcbiAgaXNBY3RpdmU6IHRydWUsXG4gIGNhbkJlZ2luOiB0cnVlLFxuICBzdGVwczogW10sXG4gIG9uQW5pbWF0aW9uRW5kOiBmdW5jdGlvbiBvbkFuaW1hdGlvbkVuZCgpIHt9LFxuICBvbkFuaW1hdGlvblN0YXJ0OiBmdW5jdGlvbiBvbkFuaW1hdGlvblN0YXJ0KCkge31cbn07XG5BbmltYXRlLnByb3BUeXBlcyA9IHtcbiAgZnJvbTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICB0bzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICBhdHRyaWJ1dGVOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBhbmltYXRpb24gZHVyYXRpb25cbiAgZHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIGJlZ2luOiBQcm9wVHlwZXMubnVtYmVyLFxuICBlYXNpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIHN0ZXBzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGR1cmF0aW9uOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBlYXNpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vbmVPZihbJ2Vhc2UnLCAnZWFzZS1pbicsICdlYXNlLW91dCcsICdlYXNlLWluLW91dCcsICdsaW5lYXInXSksIFByb3BUeXBlcy5mdW5jXSksXG4gICAgLy8gdHJhbnNpdGlvbiBjc3MgcHJvcGVydGllcyhkYXNoIGNhc2UpLCBvcHRpb25hbFxuICAgIHByb3BlcnRpZXM6IFByb3BUeXBlcy5hcnJheU9mKCdzdHJpbmcnKSxcbiAgICBvbkFuaW1hdGlvbkVuZDogUHJvcFR5cGVzLmZ1bmNcbiAgfSkpLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5mdW5jXSksXG4gIGlzQWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2FuQmVnaW46IFByb3BUeXBlcy5ib29sLFxuICBvbkFuaW1hdGlvbkVuZDogUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVhbmltYXRlIHdpdGggaW5pdGlhbCBmcm9tIHN0eWxlIHdoZW4gcHJvcHMgY2hhbmdlXG4gIHNob3VsZFJlQW5pbWF0ZTogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQW5pbWF0aW9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbkFuaW1hdGlvblJlU3RhcnQ6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgQW5pbWF0ZTsiLCJpbXBvcnQgUmVhY3QsIHsgQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uR3JvdXAgfSBmcm9tICdyZWFjdC10cmFuc2l0aW9uLWdyb3VwJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQW5pbWF0ZUdyb3VwQ2hpbGQgZnJvbSAnLi9BbmltYXRlR3JvdXBDaGlsZCc7XG5mdW5jdGlvbiBBbmltYXRlR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGFwcGVhciA9IHByb3BzLmFwcGVhcixcbiAgICBlbnRlciA9IHByb3BzLmVudGVyLFxuICAgIGxlYXZlID0gcHJvcHMubGVhdmU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uR3JvdXAsIHtcbiAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICB9LCBDaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW5pbWF0ZUdyb3VwQ2hpbGQsIHtcbiAgICAgIGFwcGVhck9wdGlvbnM6IGFwcGVhcixcbiAgICAgIGVudGVyT3B0aW9uczogZW50ZXIsXG4gICAgICBsZWF2ZU9wdGlvbnM6IGxlYXZlLFxuICAgICAga2V5OiBcImNoaWxkLVwiLmNvbmNhdChpbmRleCkgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0sIGNoaWxkKTtcbiAgfSkpO1xufVxuQW5pbWF0ZUdyb3VwLnByb3BUeXBlcyA9IHtcbiAgYXBwZWFyOiBQcm9wVHlwZXMub2JqZWN0LFxuICBlbnRlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgbGVhdmU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzLmFueVxufTtcbkFuaW1hdGVHcm91cC5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudDogJ3NwYW4nXG59O1xuZXhwb3J0IGRlZmF1bHQgQW5pbWF0ZUdyb3VwOyIsInZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcImFwcGVhck9wdGlvbnNcIiwgXCJlbnRlck9wdGlvbnNcIiwgXCJsZWF2ZU9wdGlvbnNcIl07XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEFuaW1hdGUgZnJvbSAnLi9BbmltYXRlJztcbnZhciBwYXJzZUR1cmF0aW9uT2ZTaW5nbGVUcmFuc2l0aW9uID0gZnVuY3Rpb24gcGFyc2VEdXJhdGlvbk9mU2luZ2xlVHJhbnNpdGlvbigpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICB2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzLFxuICAgIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbjtcbiAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGVwcy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZW50cnkpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoTnVtYmVyLmlzRmluaXRlKGVudHJ5LmR1cmF0aW9uKSAmJiBlbnRyeS5kdXJhdGlvbiA+IDAgPyBlbnRyeS5kdXJhdGlvbiA6IDApO1xuICAgIH0sIDApO1xuICB9XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG4gIHJldHVybiAwO1xufTtcbnZhciBBbmltYXRlR3JvdXBDaGlsZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQW5pbWF0ZUdyb3VwQ2hpbGQsIF9Db21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFuaW1hdGVHcm91cENoaWxkKTtcbiAgZnVuY3Rpb24gQW5pbWF0ZUdyb3VwQ2hpbGQoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlR3JvdXBDaGlsZCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRW50ZXJcIiwgZnVuY3Rpb24gKG5vZGUsIGlzQXBwZWFyaW5nKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgYXBwZWFyT3B0aW9ucyA9IF90aGlzJHByb3BzLmFwcGVhck9wdGlvbnMsXG4gICAgICAgIGVudGVyT3B0aW9ucyA9IF90aGlzJHByb3BzLmVudGVyT3B0aW9ucztcbiAgICAgIF90aGlzLmhhbmRsZVN0eWxlQWN0aXZlKGlzQXBwZWFyaW5nID8gYXBwZWFyT3B0aW9ucyA6IGVudGVyT3B0aW9ucyk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUV4aXRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGxlYXZlT3B0aW9ucyA9IF90aGlzLnByb3BzLmxlYXZlT3B0aW9ucztcbiAgICAgIF90aGlzLmhhbmRsZVN0eWxlQWN0aXZlKGxlYXZlT3B0aW9ucyk7XG4gICAgfSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBpc0FjdGl2ZTogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0ZUdyb3VwQ2hpbGQsIFt7XG4gICAga2V5OiBcImhhbmRsZVN0eWxlQWN0aXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVN0eWxlQWN0aXZlKHN0eWxlKSB7XG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgdmFyIG9uQW5pbWF0aW9uRW5kID0gc3R5bGUub25BbmltYXRpb25FbmQgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3R5bGUub25BbmltYXRpb25FbmQoKTtcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgb25BbmltYXRpb25FbmQ6IG9uQW5pbWF0aW9uRW5kLFxuICAgICAgICAgIGlzQWN0aXZlOiB0cnVlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VUaW1lb3V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlVGltZW91dCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBhcHBlYXJPcHRpb25zID0gX3RoaXMkcHJvcHMyLmFwcGVhck9wdGlvbnMsXG4gICAgICAgIGVudGVyT3B0aW9ucyA9IF90aGlzJHByb3BzMi5lbnRlck9wdGlvbnMsXG4gICAgICAgIGxlYXZlT3B0aW9ucyA9IF90aGlzJHByb3BzMi5sZWF2ZU9wdGlvbnM7XG4gICAgICByZXR1cm4gcGFyc2VEdXJhdGlvbk9mU2luZ2xlVHJhbnNpdGlvbihhcHBlYXJPcHRpb25zKSArIHBhcnNlRHVyYXRpb25PZlNpbmdsZVRyYW5zaXRpb24oZW50ZXJPcHRpb25zKSArIHBhcnNlRHVyYXRpb25PZlNpbmdsZVRyYW5zaXRpb24obGVhdmVPcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMzLmNoaWxkcmVuLFxuICAgICAgICBhcHBlYXJPcHRpb25zID0gX3RoaXMkcHJvcHMzLmFwcGVhck9wdGlvbnMsXG4gICAgICAgIGVudGVyT3B0aW9ucyA9IF90aGlzJHByb3BzMy5lbnRlck9wdGlvbnMsXG4gICAgICAgIGxlYXZlT3B0aW9ucyA9IF90aGlzJHByb3BzMy5sZWF2ZU9wdGlvbnMsXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzMywgX2V4Y2x1ZGVkKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgb25FbnRlcjogdGhpcy5oYW5kbGVFbnRlcixcbiAgICAgICAgb25FeGl0OiB0aGlzLmhhbmRsZUV4aXQsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMucGFyc2VUaW1lb3V0KClcbiAgICAgIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbmltYXRlLCBfdGhpczIuc3RhdGUsIENoaWxkcmVuLm9ubHkoY2hpbGRyZW4pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQW5pbWF0ZUdyb3VwQ2hpbGQ7XG59KENvbXBvbmVudCk7XG5BbmltYXRlR3JvdXBDaGlsZC5wcm9wVHlwZXMgPSB7XG4gIGFwcGVhck9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGVudGVyT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgbGVhdmVPcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmVsZW1lbnRcbn07XG5leHBvcnQgZGVmYXVsdCBBbmltYXRlR3JvdXBDaGlsZDsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfdG9BcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5pbXBvcnQgc2V0UmFmVGltZW91dCBmcm9tICcuL3NldFJhZlRpbWVvdXQnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQW5pbWF0ZU1hbmFnZXIoKSB7XG4gIHZhciBjdXJyU3R5bGUgPSB7fTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgdmFyIHNob3VsZFN0b3AgPSBmYWxzZTtcbiAgdmFyIHNldFN0eWxlID0gZnVuY3Rpb24gc2V0U3R5bGUoX3N0eWxlKSB7XG4gICAgaWYgKHNob3VsZFN0b3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoX3N0eWxlKSkge1xuICAgICAgaWYgKCFfc3R5bGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZXMgPSBfc3R5bGU7XG4gICAgICB2YXIgX3N0eWxlcyA9IF90b0FycmF5KHN0eWxlcyksXG4gICAgICAgIGN1cnIgPSBfc3R5bGVzWzBdLFxuICAgICAgICByZXN0U3R5bGVzID0gX3N0eWxlcy5zbGljZSgxKTtcbiAgICAgIGlmICh0eXBlb2YgY3VyciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0UmFmVGltZW91dChzZXRTdHlsZS5iaW5kKG51bGwsIHJlc3RTdHlsZXMpLCBjdXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0U3R5bGUoY3Vycik7XG4gICAgICBzZXRSYWZUaW1lb3V0KHNldFN0eWxlLmJpbmQobnVsbCwgcmVzdFN0eWxlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoX3R5cGVvZihfc3R5bGUpID09PSAnb2JqZWN0Jykge1xuICAgICAgY3VyclN0eWxlID0gX3N0eWxlO1xuICAgICAgaGFuZGxlQ2hhbmdlKGN1cnJTdHlsZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX3N0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBfc3R5bGUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHNob3VsZFN0b3AgPSB0cnVlO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KHN0eWxlKSB7XG4gICAgICBzaG91bGRTdG9wID0gZmFsc2U7XG4gICAgICBzZXRTdHlsZShzdHlsZSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShfaGFuZGxlQ2hhbmdlKSB7XG4gICAgICBoYW5kbGVDaGFuZ2UgPSBfaGFuZGxlQ2hhbmdlO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7IHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IHQpIHsgdmFyIGUsIG4sIGksIHUsIGEgPSBbXSwgZiA9ICEwLCBvID0gITE7IHRyeSB7IGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOyBmID0gITE7IH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTsgfSBjYXRjaCAocikgeyBvID0gITAsIG4gPSByOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIWYgJiYgbnVsbCAhPSB0LnJldHVybiAmJiAodSA9IHQucmV0dXJuKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCB7IGdldEludGVyc2VjdGlvbktleXMsIG1hcE9iamVjdCB9IGZyb20gJy4vdXRpbCc7XG52YXIgYWxwaGEgPSBmdW5jdGlvbiBhbHBoYShiZWdpbiwgZW5kLCBrKSB7XG4gIHJldHVybiBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBrO1xufTtcbnZhciBuZWVkQ29udGludWUgPSBmdW5jdGlvbiBuZWVkQ29udGludWUoX3JlZikge1xuICB2YXIgZnJvbSA9IF9yZWYuZnJvbSxcbiAgICB0byA9IF9yZWYudG87XG4gIHJldHVybiBmcm9tICE9PSB0bztcbn07XG5cbi8qXG4gKiBAZGVzY3JpcHRpb246IGNhbCBuZXcgZnJvbSB2YWx1ZSBhbmQgdmVsb2NpdHkgaW4gZWFjaCBzdGVwcGVyXG4gKiBAcmV0dXJuOiB7IFtzdHlsZVByb3BlcnR5XTogeyBmcm9tLCB0bywgdmVsb2NpdHkgfSB9XG4gKi9cbnZhciBjYWxTdGVwcGVyVmFscyA9IGZ1bmN0aW9uIGNhbFN0ZXBwZXJWYWxzKGVhc2luZywgcHJlVmFscywgc3RlcHMpIHtcbiAgdmFyIG5leHRTdGVwVmFscyA9IG1hcE9iamVjdChmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICBpZiAobmVlZENvbnRpbnVlKHZhbCkpIHtcbiAgICAgIHZhciBfZWFzaW5nID0gZWFzaW5nKHZhbC5mcm9tLCB2YWwudG8sIHZhbC52ZWxvY2l0eSksXG4gICAgICAgIF9lYXNpbmcyID0gX3NsaWNlZFRvQXJyYXkoX2Vhc2luZywgMiksXG4gICAgICAgIG5ld1ggPSBfZWFzaW5nMlswXSxcbiAgICAgICAgbmV3ViA9IF9lYXNpbmcyWzFdO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsKSwge30sIHtcbiAgICAgICAgZnJvbTogbmV3WCxcbiAgICAgICAgdmVsb2NpdHk6IG5ld1ZcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9LCBwcmVWYWxzKTtcbiAgaWYgKHN0ZXBzIDwgMSkge1xuICAgIHJldHVybiBtYXBPYmplY3QoZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgICBpZiAobmVlZENvbnRpbnVlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdmFsKSwge30sIHtcbiAgICAgICAgICB2ZWxvY2l0eTogYWxwaGEodmFsLnZlbG9jaXR5LCBuZXh0U3RlcFZhbHNba2V5XS52ZWxvY2l0eSwgc3RlcHMpLFxuICAgICAgICAgIGZyb206IGFscGhhKHZhbC5mcm9tLCBuZXh0U3RlcFZhbHNba2V5XS5mcm9tLCBzdGVwcylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0sIHByZVZhbHMpO1xuICB9XG4gIHJldHVybiBjYWxTdGVwcGVyVmFscyhlYXNpbmcsIG5leHRTdGVwVmFscywgc3RlcHMgLSAxKTtcbn07XG5cbi8vIGNvbmZpZ3VyZSB1cGRhdGUgZnVuY3Rpb25cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZnJvbSwgdG8sIGVhc2luZywgZHVyYXRpb24sIHJlbmRlcikge1xuICB2YXIgaW50ZXJLZXlzID0gZ2V0SW50ZXJzZWN0aW9uS2V5cyhmcm9tLCB0byk7XG4gIHZhciB0aW1pbmdTdHlsZSA9IGludGVyS2V5cy5yZWR1Y2UoZnVuY3Rpb24gKHJlcywga2V5KSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwga2V5LCBbZnJvbVtrZXldLCB0b1trZXldXSkpO1xuICB9LCB7fSk7XG4gIHZhciBzdGVwcGVyU3R5bGUgPSBpbnRlcktleXMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGtleSkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlcyksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIGtleSwge1xuICAgICAgZnJvbTogZnJvbVtrZXldLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICB0bzogdG9ba2V5XVxuICAgIH0pKTtcbiAgfSwge30pO1xuICB2YXIgY2FmSWQgPSAtMTtcbiAgdmFyIHByZVRpbWU7XG4gIHZhciBiZWdpblRpbWU7XG4gIHZhciB1cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIHZhciBnZXRDdXJyU3R5bGUgPSBmdW5jdGlvbiBnZXRDdXJyU3R5bGUoKSB7XG4gICAgcmV0dXJuIG1hcE9iamVjdChmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICAgIHJldHVybiB2YWwuZnJvbTtcbiAgICB9LCBzdGVwcGVyU3R5bGUpO1xuICB9O1xuICB2YXIgc2hvdWxkU3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uIHNob3VsZFN0b3BBbmltYXRpb24oKSB7XG4gICAgcmV0dXJuICFPYmplY3QudmFsdWVzKHN0ZXBwZXJTdHlsZSkuZmlsdGVyKG5lZWRDb250aW51ZSkubGVuZ3RoO1xuICB9O1xuXG4gIC8vIHN0ZXBwZXIgdGltaW5nIGZ1bmN0aW9uIGxpa2Ugc3ByaW5nXG4gIHZhciBzdGVwcGVyVXBkYXRlID0gZnVuY3Rpb24gc3RlcHBlclVwZGF0ZShub3cpIHtcbiAgICBpZiAoIXByZVRpbWUpIHtcbiAgICAgIHByZVRpbWUgPSBub3c7XG4gICAgfVxuICAgIHZhciBkZWx0YVRpbWUgPSBub3cgLSBwcmVUaW1lO1xuICAgIHZhciBzdGVwcyA9IGRlbHRhVGltZSAvIGVhc2luZy5kdDtcbiAgICBzdGVwcGVyU3R5bGUgPSBjYWxTdGVwcGVyVmFscyhlYXNpbmcsIHN0ZXBwZXJTdHlsZSwgc3RlcHMpO1xuICAgIC8vIGdldCB1bmlvbiBzZXQgYW5kIGFkZCBjb21wYXRpYmxlIHByZWZpeFxuICAgIHJlbmRlcihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnJvbSksIHRvKSwgZ2V0Q3VyclN0eWxlKHN0ZXBwZXJTdHlsZSkpKTtcbiAgICBwcmVUaW1lID0gbm93O1xuICAgIGlmICghc2hvdWxkU3RvcEFuaW1hdGlvbigpKSB7XG4gICAgICBjYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyB0ID0+IHZhbCB0aW1pbmcgZnVuY3Rpb24gbGlrZSBjdWJpYy1iZXppZXJcbiAgdmFyIHRpbWluZ1VwZGF0ZSA9IGZ1bmN0aW9uIHRpbWluZ1VwZGF0ZShub3cpIHtcbiAgICBpZiAoIWJlZ2luVGltZSkge1xuICAgICAgYmVnaW5UaW1lID0gbm93O1xuICAgIH1cbiAgICB2YXIgdCA9IChub3cgLSBiZWdpblRpbWUpIC8gZHVyYXRpb247XG4gICAgdmFyIGN1cnJTdHlsZSA9IG1hcE9iamVjdChmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICAgIHJldHVybiBhbHBoYS5hcHBseSh2b2lkIDAsIF90b0NvbnN1bWFibGVBcnJheSh2YWwpLmNvbmNhdChbZWFzaW5nKHQpXSkpO1xuICAgIH0sIHRpbWluZ1N0eWxlKTtcblxuICAgIC8vIGdldCB1bmlvbiBzZXQgYW5kIGFkZCBjb21wYXRpYmxlIHByZWZpeFxuICAgIHJlbmRlcihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnJvbSksIHRvKSwgY3VyclN0eWxlKSk7XG4gICAgaWYgKHQgPCAxKSB7XG4gICAgICBjYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmluYWxTdHlsZSA9IG1hcE9iamVjdChmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGFscGhhLmFwcGx5KHZvaWQgMCwgX3RvQ29uc3VtYWJsZUFycmF5KHZhbCkuY29uY2F0KFtlYXNpbmcoMSldKSk7XG4gICAgICB9LCB0aW1pbmdTdHlsZSk7XG4gICAgICByZW5kZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZyb20pLCB0byksIGZpbmFsU3R5bGUpKTtcbiAgICB9XG4gIH07XG4gIHVwZGF0ZSA9IGVhc2luZy5pc1N0ZXBwZXIgPyBzdGVwcGVyVXBkYXRlIDogdGltaW5nVXBkYXRlO1xuXG4gIC8vIHJldHVybiBzdGFydCBhbmltYXRpb24gbWV0aG9kXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7XG5cbiAgICAvLyByZXR1cm4gc3RvcCBhbmltYXRpb24gbWV0aG9kXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGNhZklkKTtcbiAgICB9O1xuICB9O1xufSk7IiwiZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7IHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IHQpIHsgdmFyIGUsIG4sIGksIHUsIGEgPSBbXSwgZiA9ICEwLCBvID0gITE7IHRyeSB7IGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOyBmID0gITE7IH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTsgfSBjYXRjaCAocikgeyBvID0gITAsIG4gPSByOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIWYgJiYgbnVsbCAhPSB0LnJldHVybiAmJiAodSA9IHQucmV0dXJuKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi91dGlsJztcbnZhciBBQ0NVUkFDWSA9IDFlLTQ7XG52YXIgY3ViaWNCZXppZXJGYWN0b3IgPSBmdW5jdGlvbiBjdWJpY0JlemllckZhY3RvcihjMSwgYzIpIHtcbiAgcmV0dXJuIFswLCAzICogYzEsIDMgKiBjMiAtIDYgKiBjMSwgMyAqIGMxIC0gMyAqIGMyICsgMV07XG59O1xudmFyIG11bHR5VGltZSA9IGZ1bmN0aW9uIG11bHR5VGltZShwYXJhbXMsIHQpIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtLCBpKSB7XG4gICAgcmV0dXJuIHBhcmFtICogTWF0aC5wb3codCwgaSk7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAocHJlLCBjdXJyKSB7XG4gICAgcmV0dXJuIHByZSArIGN1cnI7XG4gIH0pO1xufTtcbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKGMxLCBjMikge1xuICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICB2YXIgcGFyYW1zID0gY3ViaWNCZXppZXJGYWN0b3IoYzEsIGMyKTtcbiAgICByZXR1cm4gbXVsdHlUaW1lKHBhcmFtcywgdCk7XG4gIH07XG59O1xudmFyIGRlcml2YXRpdmVDdWJpY0JlemllciA9IGZ1bmN0aW9uIGRlcml2YXRpdmVDdWJpY0JlemllcihjMSwgYzIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgdmFyIHBhcmFtcyA9IGN1YmljQmV6aWVyRmFjdG9yKGMxLCBjMik7XG4gICAgdmFyIG5ld1BhcmFtcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICAgIHJldHVybiBwYXJhbSAqIGk7XG4gICAgfSkuc2xpY2UoMSkpLCBbMF0pO1xuICAgIHJldHVybiBtdWx0eVRpbWUobmV3UGFyYW1zLCB0KTtcbiAgfTtcbn07XG5cbi8vIGNhbGN1bGF0ZSBjdWJpYy1iZXppZXIgdXNpbmcgTmV3dG9uJ3MgbWV0aG9kXG5leHBvcnQgdmFyIGNvbmZpZ0JlemllciA9IGZ1bmN0aW9uIGNvbmZpZ0JlemllcigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgeDEgPSBhcmdzWzBdLFxuICAgIHkxID0gYXJnc1sxXSxcbiAgICB4MiA9IGFyZ3NbMl0sXG4gICAgeTIgPSBhcmdzWzNdO1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBzd2l0Y2ggKGFyZ3NbMF0pIHtcbiAgICAgIGNhc2UgJ2xpbmVhcic6XG4gICAgICAgIHgxID0gMC4wO1xuICAgICAgICB5MSA9IDAuMDtcbiAgICAgICAgeDIgPSAxLjA7XG4gICAgICAgIHkyID0gMS4wO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Vhc2UnOlxuICAgICAgICB4MSA9IDAuMjU7XG4gICAgICAgIHkxID0gMC4xO1xuICAgICAgICB4MiA9IDAuMjU7XG4gICAgICAgIHkyID0gMS4wO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Vhc2UtaW4nOlxuICAgICAgICB4MSA9IDAuNDI7XG4gICAgICAgIHkxID0gMC4wO1xuICAgICAgICB4MiA9IDEuMDtcbiAgICAgICAgeTIgPSAxLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZWFzZS1vdXQnOlxuICAgICAgICB4MSA9IDAuNDI7XG4gICAgICAgIHkxID0gMC4wO1xuICAgICAgICB4MiA9IDAuNTg7XG4gICAgICAgIHkyID0gMS4wO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Vhc2UtaW4tb3V0JzpcbiAgICAgICAgeDEgPSAwLjA7XG4gICAgICAgIHkxID0gMC4wO1xuICAgICAgICB4MiA9IDAuNTg7XG4gICAgICAgIHkyID0gMS4wO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZWFzaW5nID0gYXJnc1swXS5zcGxpdCgnKCcpO1xuICAgICAgICAgIGlmIChlYXNpbmdbMF0gPT09ICdjdWJpYy1iZXppZXInICYmIGVhc2luZ1sxXS5zcGxpdCgnKScpWzBdLnNwbGl0KCcsJykubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICB2YXIgX2Vhc2luZyQxJHNwbGl0JDAkc3BsID0gZWFzaW5nWzFdLnNwbGl0KCcpJylbMF0uc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoeCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBfZWFzaW5nJDEkc3BsaXQkMCRzcGwyID0gX3NsaWNlZFRvQXJyYXkoX2Vhc2luZyQxJHNwbGl0JDAkc3BsLCA0KTtcbiAgICAgICAgICAgIHgxID0gX2Vhc2luZyQxJHNwbGl0JDAkc3BsMlswXTtcbiAgICAgICAgICAgIHkxID0gX2Vhc2luZyQxJHNwbGl0JDAkc3BsMlsxXTtcbiAgICAgICAgICAgIHgyID0gX2Vhc2luZyQxJHNwbGl0JDAkc3BsMlsyXTtcbiAgICAgICAgICAgIHkyID0gX2Vhc2luZyQxJHNwbGl0JDAkc3BsMlszXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybihmYWxzZSwgJ1tjb25maWdCZXppZXJdOiBhcmd1bWVudHMgc2hvdWxkIGJlIG9uZSBvZiAnICsgXCJvbmVPZiAnbGluZWFyJywgJ2Vhc2UnLCAnZWFzZS1pbicsICdlYXNlLW91dCcsIFwiICsgXCInZWFzZS1pbi1vdXQnLCdjdWJpYy1iZXppZXIoeDEseTEseDIseTIpJywgaW5zdGVhZCByZWNlaXZlZCAlc1wiLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2FybihbeDEsIHgyLCB5MSwgeTJdLmV2ZXJ5KGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gdHlwZW9mIG51bSA9PT0gJ251bWJlcicgJiYgbnVtID49IDAgJiYgbnVtIDw9IDE7XG4gIH0pLCAnW2NvbmZpZ0Jlemllcl06IGFyZ3VtZW50cyBzaG91bGQgYmUgeDEsIHkxLCB4MiwgeTIgb2YgWzAsIDFdIGluc3RlYWQgcmVjZWl2ZWQgJXMnLCBhcmdzKTtcbiAgdmFyIGN1cnZlWCA9IGN1YmljQmV6aWVyKHgxLCB4Mik7XG4gIHZhciBjdXJ2ZVkgPSBjdWJpY0Jlemllcih5MSwgeTIpO1xuICB2YXIgZGVyQ3VydmVYID0gZGVyaXZhdGl2ZUN1YmljQmV6aWVyKHgxLCB4Mik7XG4gIHZhciByYW5nZVZhbHVlID0gZnVuY3Rpb24gcmFuZ2VWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA+IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuICB2YXIgYmV6aWVyID0gZnVuY3Rpb24gYmV6aWVyKF90KSB7XG4gICAgdmFyIHQgPSBfdCA+IDEgPyAxIDogX3Q7XG4gICAgdmFyIHggPSB0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgKytpKSB7XG4gICAgICB2YXIgZXZhbFQgPSBjdXJ2ZVgoeCkgLSB0O1xuICAgICAgdmFyIGRlclZhbCA9IGRlckN1cnZlWCh4KTtcbiAgICAgIGlmIChNYXRoLmFicyhldmFsVCAtIHQpIDwgQUNDVVJBQ1kgfHwgZGVyVmFsIDwgQUNDVVJBQ1kpIHtcbiAgICAgICAgcmV0dXJuIGN1cnZlWSh4KTtcbiAgICAgIH1cbiAgICAgIHggPSByYW5nZVZhbHVlKHggLSBldmFsVCAvIGRlclZhbCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJ2ZVkoeCk7XG4gIH07XG4gIGJlemllci5pc1N0ZXBwZXIgPSBmYWxzZTtcbiAgcmV0dXJuIGJlemllcjtcbn07XG5leHBvcnQgdmFyIGNvbmZpZ1NwcmluZyA9IGZ1bmN0aW9uIGNvbmZpZ1NwcmluZygpIHtcbiAgdmFyIGNvbmZpZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBfY29uZmlnJHN0aWZmID0gY29uZmlnLnN0aWZmLFxuICAgIHN0aWZmID0gX2NvbmZpZyRzdGlmZiA9PT0gdm9pZCAwID8gMTAwIDogX2NvbmZpZyRzdGlmZixcbiAgICBfY29uZmlnJGRhbXBpbmcgPSBjb25maWcuZGFtcGluZyxcbiAgICBkYW1waW5nID0gX2NvbmZpZyRkYW1waW5nID09PSB2b2lkIDAgPyA4IDogX2NvbmZpZyRkYW1waW5nLFxuICAgIF9jb25maWckZHQgPSBjb25maWcuZHQsXG4gICAgZHQgPSBfY29uZmlnJGR0ID09PSB2b2lkIDAgPyAxNyA6IF9jb25maWckZHQ7XG4gIHZhciBzdGVwcGVyID0gZnVuY3Rpb24gc3RlcHBlcihjdXJyWCwgZGVzdFgsIGN1cnJWKSB7XG4gICAgdmFyIEZTcHJpbmcgPSAtKGN1cnJYIC0gZGVzdFgpICogc3RpZmY7XG4gICAgdmFyIEZEYW1waW5nID0gY3VyclYgKiBkYW1waW5nO1xuICAgIHZhciBuZXdWID0gY3VyclYgKyAoRlNwcmluZyAtIEZEYW1waW5nKSAqIGR0IC8gMTAwMDtcbiAgICB2YXIgbmV3WCA9IGN1cnJWICogZHQgLyAxMDAwICsgY3Vyclg7XG4gICAgaWYgKE1hdGguYWJzKG5ld1ggLSBkZXN0WCkgPCBBQ0NVUkFDWSAmJiBNYXRoLmFicyhuZXdWKSA8IEFDQ1VSQUNZKSB7XG4gICAgICByZXR1cm4gW2Rlc3RYLCAwXTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdYLCBuZXdWXTtcbiAgfTtcbiAgc3RlcHBlci5pc1N0ZXBwZXIgPSB0cnVlO1xuICBzdGVwcGVyLmR0ID0gZHQ7XG4gIHJldHVybiBzdGVwcGVyO1xufTtcbmV4cG9ydCB2YXIgY29uZmlnRWFzaW5nID0gZnVuY3Rpb24gY29uZmlnRWFzaW5nKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cbiAgdmFyIGVhc2luZyA9IGFyZ3NbMF07XG4gIGlmICh0eXBlb2YgZWFzaW5nID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdlYXNlJzpcbiAgICAgIGNhc2UgJ2Vhc2UtaW4tb3V0JzpcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgIGNhc2UgJ2Vhc2UtaW4nOlxuICAgICAgY2FzZSAnbGluZWFyJzpcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0JlemllcihlYXNpbmcpO1xuICAgICAgY2FzZSAnc3ByaW5nJzpcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1NwcmluZygpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGVhc2luZy5zcGxpdCgnKCcpWzBdID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgIHJldHVybiBjb25maWdCZXppZXIoZWFzaW5nKTtcbiAgICAgICAgfVxuICAgICAgICB3YXJuKGZhbHNlLCBcIltjb25maWdFYXNpbmddOiBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgb25lIG9mICdlYXNlJywgJ2Vhc2UtaW4nLCBcIiArIFwiJ2Vhc2Utb3V0JywgJ2Vhc2UtaW4tb3V0JywnY3ViaWMtYmV6aWVyKHgxLHkxLHgyLHkyKScsICdsaW5lYXInIGFuZCAnc3ByaW5nJywgaW5zdGVhZCAgcmVjZWl2ZWQgJXNcIiwgYXJncyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgZWFzaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVhc2luZztcbiAgfVxuICB3YXJuKGZhbHNlLCAnW2NvbmZpZ0Vhc2luZ106IGZpcnN0IGFyZ3VtZW50IHR5cGUgc2hvdWxkIGJlIGZ1bmN0aW9uIG9yIHN0cmluZywgaW5zdGVhZCByZWNlaXZlZCAlcycsIGFyZ3MpO1xuICByZXR1cm4gbnVsbDtcbn07IiwiaW1wb3J0IEFuaW1hdGUgZnJvbSAnLi9BbmltYXRlJztcbmltcG9ydCB7IGNvbmZpZ0JlemllciwgY29uZmlnU3ByaW5nIH0gZnJvbSAnLi9lYXNpbmcnO1xuaW1wb3J0IEFuaW1hdGVHcm91cCBmcm9tICcuL0FuaW1hdGVHcm91cCc7XG5leHBvcnQgeyBjb25maWdTcHJpbmcsIGNvbmZpZ0JlemllciwgQW5pbWF0ZUdyb3VwIH07XG5leHBvcnQgZGVmYXVsdCBBbmltYXRlOyIsImZ1bmN0aW9uIHNhZmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFmVGltZW91dChjYWxsYmFjaykge1xuICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGN1cnJUaW1lID0gLTE7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRVcGRhdGUobm93KSB7XG4gICAgaWYgKGN1cnJUaW1lIDwgMCkge1xuICAgICAgY3VyclRpbWUgPSBub3c7XG4gICAgfVxuICAgIGlmIChub3cgLSBjdXJyVGltZSA+IHRpbWVvdXQpIHtcbiAgICAgIGNhbGxiYWNrKG5vdyk7XG4gICAgICBjdXJyVGltZSA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBzYWZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNob3VsZFVwZGF0ZSk7XG4gICAgfVxuICB9O1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2hvdWxkVXBkYXRlKTtcbn0iLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gX3R5cGVvZihrZXkpID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAoX3R5cGVvZihpbnB1dCkgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAoX3R5cGVvZihyZXMpICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbi8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG5cbmV4cG9ydCB2YXIgZ2V0SW50ZXJzZWN0aW9uS2V5cyA9IGZ1bmN0aW9uIGdldEludGVyc2VjdGlvbktleXMocHJlT2JqLCBuZXh0T2JqKSB7XG4gIHJldHVybiBbT2JqZWN0LmtleXMocHJlT2JqKSwgT2JqZWN0LmtleXMobmV4dE9iaildLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGIuaW5jbHVkZXMoYyk7XG4gICAgfSk7XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eShwYXJhbSkge1xuICByZXR1cm4gcGFyYW07XG59O1xuXG4vKlxuICogQGRlc2NyaXB0aW9uOiBjb252ZXJ0IGNhbWVsIGNhc2UgdG8gZGFzaCBjYXNlXG4gKiBzdHJpbmcgPT4gc3RyaW5nXG4gKi9cbmV4cG9ydCB2YXIgZ2V0RGFzaENhc2UgPSBmdW5jdGlvbiBnZXREYXNoQ2FzZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gXCItXCIuY29uY2F0KHYudG9Mb3dlckNhc2UoKSk7XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgbG9nID0gZnVuY3Rpb24gbG9nKCkge1xuICB2YXIgX2NvbnNvbGU7XG4gIChfY29uc29sZSA9IGNvbnNvbGUpLmxvZy5hcHBseShfY29uc29sZSwgYXJndW1lbnRzKTtcbn07XG5cbi8qXG4gKiBAZGVzY3JpcHRpb246IGxvZyB0aGUgdmFsdWUgb2YgYSB2YXJpYmxlXG4gKiBzdHJpbmcgPT4gYW55ID0+IGFueVxuICovXG5leHBvcnQgdmFyIGRlYnVnID0gZnVuY3Rpb24gZGVidWcobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBsb2cobmFtZSwgaXRlbSk7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG59O1xuXG4vKlxuICogQGRlc2NyaXB0aW9uOiBsb2cgbmFtZSwgYXJncywgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb25cbiAqIGZ1bmN0aW9uID0+IGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZGVidWdmID0gZnVuY3Rpb24gZGVidWdmKHRhZywgZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IGYuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB2YXIgbmFtZSA9IHRhZyB8fCBmLm5hbWUgfHwgJ2Fub255bW91cyBmdW5jdGlvbic7XG4gICAgdmFyIGFyZ05hbWVzID0gXCIoXCIuY29uY2F0KGFyZ3MubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKCcsICcpLCBcIilcIik7XG4gICAgbG9nKFwiXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KGFyZ05hbWVzLCBcIiA9PiBcIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xufTtcblxuLypcbiAqIEBkZXNjcmlwdGlvbjogbWFwIG9iamVjdCBvbiBldmVyeSBlbGVtZW50IGluIHRoaXMgb2JqZWN0LlxuICogKGZ1bmN0aW9uLCBvYmplY3QpID0+IG9iamVjdFxuICovXG5leHBvcnQgdmFyIG1hcE9iamVjdCA9IGZ1bmN0aW9uIG1hcE9iamVjdChmbiwgb2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShmdW5jdGlvbiAocmVzLCBrZXkpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXMpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIGZuKGtleSwgb2JqW2tleV0pKSk7XG4gIH0sIHt9KTtcbn07XG5leHBvcnQgdmFyIGdldFRyYW5zaXRpb25WYWwgPSBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uVmFsKHByb3BzLCBkdXJhdGlvbiwgZWFzaW5nKSB7XG4gIHJldHVybiBwcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZ2V0RGFzaENhc2UocHJvcCksIFwiIFwiKS5jb25jYXQoZHVyYXRpb24sIFwibXMgXCIpLmNvbmNhdChlYXNpbmcpO1xuICB9KS5qb2luKCcsJyk7XG59O1xudmFyIGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcbmV4cG9ydCB2YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKGlzRGV2ICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTG9nVXRpbHMgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICAgIGNvbnNvbGUud2Fybihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==