"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_recharts_es6_component_Cell_js-node_modules_recharts_es6_component_Curso-e8e03b"],{ /***/ "../../../node_modules/recharts/es6/component/Cell.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Cell.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cell: () => (/* binding */ Cell) /* harmony export */ }); /** * @fileOverview Cross */ var Cell = function Cell(_props) { return null; }; Cell.displayName = 'Cell'; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Cursor.js": /*!**************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Cursor.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cursor: () => (/* binding */ Cursor) /* 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 clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _shape_Curve__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shape/Curve */ "../../../node_modules/recharts/es6/shape/Curve.js"); /* harmony import */ var _shape_Cross__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shape/Cross */ "../../../node_modules/recharts/es6/shape/Cross.js"); /* harmony import */ var _util_cursor_getCursorRectangle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/cursor/getCursorRectangle */ "../../../node_modules/recharts/es6/util/cursor/getCursorRectangle.js"); /* harmony import */ var _shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shape/Rectangle */ "../../../node_modules/recharts/es6/shape/Rectangle.js"); /* harmony import */ var _util_cursor_getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/cursor/getRadialCursorPoints */ "../../../node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js"); /* harmony import */ var _shape_Sector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../shape/Sector */ "../../../node_modules/recharts/es6/shape/Sector.js"); /* harmony import */ var _util_cursor_getCursorPoints__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/cursor/getCursorPoints */ "../../../node_modules/recharts/es6/util/cursor/getCursorPoints.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* * Cursor is the background, or a highlight, * that shows when user mouses over or activates * an area. * * It usually shows together with a tooltip * to emphasise which part of the chart does the tooltip refer to. */ function Cursor(props) { var _element$props$cursor, _defaultProps; var element = props.element, tooltipEventType = props.tooltipEventType, isActive = props.isActive, activeCoordinate = props.activeCoordinate, activePayload = props.activePayload, offset = props.offset, activeTooltipIndex = props.activeTooltipIndex, tooltipAxisBandSize = props.tooltipAxisBandSize, layout = props.layout, chartName = props.chartName; var elementPropsCursor = (_element$props$cursor = element.props.cursor) !== null && _element$props$cursor !== void 0 ? _element$props$cursor : (_defaultProps = element.type.defaultProps) === null || _defaultProps === void 0 ? void 0 : _defaultProps.cursor; if (!element || !elementPropsCursor || !isActive || !activeCoordinate || chartName !== 'ScatterChart' && tooltipEventType !== 'axis') { return null; } var restProps; var cursorComp = _shape_Curve__WEBPACK_IMPORTED_MODULE_2__.Curve; if (chartName === 'ScatterChart') { restProps = activeCoordinate; cursorComp = _shape_Cross__WEBPACK_IMPORTED_MODULE_3__.Cross; } else if (chartName === 'BarChart') { restProps = (0,_util_cursor_getCursorRectangle__WEBPACK_IMPORTED_MODULE_4__.getCursorRectangle)(layout, activeCoordinate, offset, tooltipAxisBandSize); cursorComp = _shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__.Rectangle; } else if (layout === 'radial') { var _getRadialCursorPoint = (0,_util_cursor_getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_6__.getRadialCursorPoints)(activeCoordinate), cx = _getRadialCursorPoint.cx, cy = _getRadialCursorPoint.cy, radius = _getRadialCursorPoint.radius, startAngle = _getRadialCursorPoint.startAngle, endAngle = _getRadialCursorPoint.endAngle; restProps = { cx: cx, cy: cy, startAngle: startAngle, endAngle: endAngle, innerRadius: radius, outerRadius: radius }; cursorComp = _shape_Sector__WEBPACK_IMPORTED_MODULE_7__.Sector; } else { restProps = { points: (0,_util_cursor_getCursorPoints__WEBPACK_IMPORTED_MODULE_8__.getCursorPoints)(layout, activeCoordinate, offset) }; cursorComp = _shape_Curve__WEBPACK_IMPORTED_MODULE_2__.Curve; } var cursorProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({ stroke: '#ccc', pointerEvents: 'none' }, offset), restProps), (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__.filterProps)(elementPropsCursor, false)), {}, { payload: activePayload, payloadIndex: activeTooltipIndex, className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-tooltip-cursor', elementPropsCursor.className) }); return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(elementPropsCursor) ? /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(elementPropsCursor, cursorProps) : /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(cursorComp, cursorProps); } /***/ }), /***/ "../../../node_modules/recharts/es6/component/DefaultLegendContent.js": /*!****************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/DefaultLegendContent.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DefaultLegendContent: () => (/* binding */ DefaultLegendContent) /* 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 lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _container_Surface__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../container/Surface */ "../../../node_modules/recharts/es6/container/Surface.js"); /* harmony import */ var _shape_Symbols__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shape/Symbols */ "../../../node_modules/recharts/es6/shape/Symbols.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.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 _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 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 _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } 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() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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 _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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Default Legend Content */ var SIZE = 32; var DefaultLegendContent = /*#__PURE__*/function (_PureComponent) { function DefaultLegendContent() { _classCallCheck(this, DefaultLegendContent); return _callSuper(this, DefaultLegendContent, arguments); } _inherits(DefaultLegendContent, _PureComponent); return _createClass(DefaultLegendContent, [{ key: "renderIcon", value: /** * Render the path of icon * @param {Object} data Data of each legend item * @return {String} Path element */ function renderIcon(data) { var inactiveColor = this.props.inactiveColor; var halfSize = SIZE / 2; var sixthSize = SIZE / 6; var thirdSize = SIZE / 3; var color = data.inactive ? inactiveColor : data.color; if (data.type === 'plainline') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { strokeWidth: 4, fill: "none", stroke: color, strokeDasharray: data.payload.strokeDasharray, x1: 0, y1: halfSize, x2: SIZE, y2: halfSize, className: "recharts-legend-icon" }); } if (data.type === 'line') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { strokeWidth: 4, fill: "none", stroke: color, d: "M0,".concat(halfSize, "h").concat(thirdSize, "\n A").concat(sixthSize, ",").concat(sixthSize, ",0,1,1,").concat(2 * thirdSize, ",").concat(halfSize, "\n H").concat(SIZE, "M").concat(2 * thirdSize, ",").concat(halfSize, "\n A").concat(sixthSize, ",").concat(sixthSize, ",0,1,1,").concat(thirdSize, ",").concat(halfSize), className: "recharts-legend-icon" }); } if (data.type === 'rect') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { stroke: "none", fill: color, d: "M0,".concat(SIZE / 8, "h").concat(SIZE, "v").concat(SIZE * 3 / 4, "h").concat(-SIZE, "z"), className: "recharts-legend-icon" }); } if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(data.legendIcon)) { var iconProps = _objectSpread({}, data); delete iconProps.legendIcon; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(data.legendIcon, iconProps); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Symbols__WEBPACK_IMPORTED_MODULE_3__.Symbols, { fill: color, cx: halfSize, cy: halfSize, size: SIZE, sizeType: "diameter", type: data.type }); } /** * Draw items of legend * @return {ReactElement} Items */ }, { key: "renderItems", value: function renderItems() { var _this = this; var _this$props = this.props, payload = _this$props.payload, iconSize = _this$props.iconSize, layout = _this$props.layout, formatter = _this$props.formatter, inactiveColor = _this$props.inactiveColor; var viewBox = { x: 0, y: 0, width: SIZE, height: SIZE }; var itemStyle = { display: layout === 'horizontal' ? 'inline-block' : 'block', marginRight: 10 }; var svgStyle = { display: 'inline-block', verticalAlign: 'middle', marginRight: 4 }; return payload.map(function (entry, i) { var finalFormatter = entry.formatter || formatter; var className = (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(_defineProperty(_defineProperty({ 'recharts-legend-item': true }, "legend-item-".concat(i), true), "inactive", entry.inactive)); if (entry.type === 'none') { return null; } // Do not render entry.value as functions. Always require static string properties. var entryValue = !lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(entry.value) ? entry.value : null; (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_4__.warn)(!lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(entry.value), "The name property is also required when using a function for the dataKey of a chart's cartesian components. Ex: " // eslint-disable-line max-len ); var color = entry.inactive ? inactiveColor : entry.color; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", _extends({ className: className, style: itemStyle // eslint-disable-next-line react/no-array-index-key , key: "legend-item-".concat(i) }, (0,_util_types__WEBPACK_IMPORTED_MODULE_5__.adaptEventsOfChild)(_this.props, entry, i)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Surface__WEBPACK_IMPORTED_MODULE_6__.Surface, { width: iconSize, height: iconSize, viewBox: viewBox, style: svgStyle }, _this.renderIcon(entry)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-legend-item-text", style: { color: color } }, finalFormatter ? finalFormatter(entryValue, entry, i) : entryValue)); }); } }, { key: "render", value: function render() { var _this$props2 = this.props, payload = _this$props2.payload, layout = _this$props2.layout, align = _this$props2.align; if (!payload || !payload.length) { return null; } var finalStyle = { padding: 0, margin: 0, textAlign: layout === 'horizontal' ? align : 'left' }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "recharts-default-legend", style: finalStyle }, this.renderItems()); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(DefaultLegendContent, "displayName", 'Legend'); _defineProperty(DefaultLegendContent, "defaultProps", { iconSize: 14, layout: 'horizontal', align: 'center', verticalAlign: 'middle', inactiveColor: '#ccc' }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/DefaultTooltipContent.js": /*!*****************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/DefaultTooltipContent.js ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DefaultTooltipContent: () => (/* binding */ DefaultTooltipContent) /* 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 lodash_sortBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/sortBy */ "../../../node_modules/lodash/sortBy.js"); /* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_sortBy__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.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 _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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Default Tooltip Content */ function defaultFormatter(value) { return Array.isArray(value) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(value[0]) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(value[1]) ? value.join(' ~ ') : value; } var DefaultTooltipContent = function DefaultTooltipContent(props) { var _props$separator = props.separator, separator = _props$separator === void 0 ? ' : ' : _props$separator, _props$contentStyle = props.contentStyle, contentStyle = _props$contentStyle === void 0 ? {} : _props$contentStyle, _props$itemStyle = props.itemStyle, itemStyle = _props$itemStyle === void 0 ? {} : _props$itemStyle, _props$labelStyle = props.labelStyle, labelStyle = _props$labelStyle === void 0 ? {} : _props$labelStyle, payload = props.payload, formatter = props.formatter, itemSorter = props.itemSorter, wrapperClassName = props.wrapperClassName, labelClassName = props.labelClassName, label = props.label, labelFormatter = props.labelFormatter, _props$accessibilityL = props.accessibilityLayer, accessibilityLayer = _props$accessibilityL === void 0 ? false : _props$accessibilityL; var renderContent = function renderContent() { if (payload && payload.length) { var listStyle = { padding: 0, margin: 0 }; var items = (itemSorter ? lodash_sortBy__WEBPACK_IMPORTED_MODULE_1___default()(payload, itemSorter) : payload).map(function (entry, i) { if (entry.type === 'none') { return null; } var finalItemStyle = _objectSpread({ display: 'block', paddingTop: 4, paddingBottom: 4, color: entry.color || '#000' }, itemStyle); var finalFormatter = entry.formatter || formatter || defaultFormatter; var value = entry.value, name = entry.name; var finalValue = value; var finalName = name; if (finalFormatter && finalValue != null && finalName != null) { var formatted = finalFormatter(value, name, entry, i, payload); if (Array.isArray(formatted)) { var _formatted = _slicedToArray(formatted, 2); finalValue = _formatted[0]; finalName = _formatted[1]; } else { finalValue = formatted; } } return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { className: "recharts-tooltip-item", key: "tooltip-item-".concat(i), style: finalItemStyle }, (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(finalName) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-name" }, finalName) : null, (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(finalName) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-separator" }, separator) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-value" }, finalValue), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-unit" }, entry.unit || '')) ); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "recharts-tooltip-item-list", style: listStyle }, items); } return null; }; var finalStyle = _objectSpread({ margin: 0, padding: 10, backgroundColor: '#fff', border: '1px solid #ccc', whiteSpace: 'nowrap' }, contentStyle); var finalLabelStyle = _objectSpread({ margin: 0 }, labelStyle); var hasLabel = !lodash_isNil__WEBPACK_IMPORTED_MODULE_2___default()(label); var finalLabel = hasLabel ? label : ''; var wrapperCN = (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-default-tooltip', wrapperClassName); var labelCN = (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-tooltip-label', labelClassName); if (hasLabel && labelFormatter && payload !== undefined && payload !== null) { finalLabel = labelFormatter(label, payload); } var accessibilityAttributes = accessibilityLayer ? { role: 'status', 'aria-live': 'assertive' } : {}; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", _extends({ className: wrapperCN, style: finalStyle }, accessibilityAttributes), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: labelCN, style: finalLabelStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(finalLabel) ? finalLabel : "".concat(finalLabel)), renderContent()); }; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Label.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Label.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Label: () => (/* binding */ Label) /* 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 lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.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 = ["offset"]; 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 _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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { 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 _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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _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); } var getLabel = function getLabel(props) { var value = props.value, formatter = props.formatter; var label = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(props.children) ? value : props.children; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(formatter)) { return formatter(label); } return label; }; var getDeltaAngle = function getDeltaAngle(startAngle, endAngle) { var sign = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.mathSign)(endAngle - startAngle); var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 360); return sign * deltaAngle; }; var renderRadialLabel = function renderRadialLabel(labelProps, label, attrs) { var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className; var _ref = viewBox, cx = _ref.cx, cy = _ref.cy, innerRadius = _ref.innerRadius, outerRadius = _ref.outerRadius, startAngle = _ref.startAngle, endAngle = _ref.endAngle, clockWise = _ref.clockWise; var radius = (innerRadius + outerRadius) / 2; var deltaAngle = getDeltaAngle(startAngle, endAngle); var sign = deltaAngle >= 0 ? 1 : -1; var labelAngle, direction; if (position === 'insideStart') { labelAngle = startAngle + sign * offset; direction = clockWise; } else if (position === 'insideEnd') { labelAngle = endAngle - sign * offset; direction = !clockWise; } else if (position === 'end') { labelAngle = endAngle + sign * offset; direction = clockWise; } direction = deltaAngle <= 0 ? direction : !direction; var startPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, radius, labelAngle); var endPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, radius, labelAngle + (direction ? 1 : -1) * 359); var path = "M".concat(startPoint.x, ",").concat(startPoint.y, "\n A").concat(radius, ",").concat(radius, ",0,1,").concat(direction ? 0 : 1, ",\n ").concat(endPoint.x, ",").concat(endPoint.y); var id = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(labelProps.id) ? (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.uniqueId)('recharts-radial-line-') : labelProps.id; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("text", _extends({}, attrs, { dominantBaseline: "central", className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-radial-bar-label', className) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("defs", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { id: id, d: path })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textPath", { xlinkHref: "#".concat(id) }, label)); }; var getAttrsOfPolarLabel = function getAttrsOfPolarLabel(props) { var viewBox = props.viewBox, offset = props.offset, position = props.position; var _ref2 = viewBox, cx = _ref2.cx, cy = _ref2.cy, innerRadius = _ref2.innerRadius, outerRadius = _ref2.outerRadius, startAngle = _ref2.startAngle, endAngle = _ref2.endAngle; var midAngle = (startAngle + endAngle) / 2; if (position === 'outside') { var _polarToCartesian = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x, _y = _polarToCartesian.y; return { x: _x, y: _y, textAnchor: _x >= cx ? 'start' : 'end', verticalAnchor: 'middle' }; } if (position === 'center') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'middle' }; } if (position === 'centerTop') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'start' }; } if (position === 'centerBottom') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'end' }; } var r = (innerRadius + outerRadius) / 2; var _polarToCartesian2 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, r, midAngle), x = _polarToCartesian2.x, y = _polarToCartesian2.y; return { x: x, y: y, textAnchor: 'middle', verticalAnchor: 'middle' }; }; var getAttrsOfCartesianLabel = function getAttrsOfCartesianLabel(props) { var viewBox = props.viewBox, parentViewBox = props.parentViewBox, offset = props.offset, position = props.position; var _ref3 = viewBox, x = _ref3.x, y = _ref3.y, width = _ref3.width, height = _ref3.height; // Define vertical offsets and position inverts based on the value being positive or negative var verticalSign = height >= 0 ? 1 : -1; var verticalOffset = verticalSign * offset; var verticalEnd = verticalSign > 0 ? 'end' : 'start'; var verticalStart = verticalSign > 0 ? 'start' : 'end'; // Define horizontal offsets and position inverts based on the value being positive or negative var horizontalSign = width >= 0 ? 1 : -1; var horizontalOffset = horizontalSign * offset; var horizontalEnd = horizontalSign > 0 ? 'end' : 'start'; var horizontalStart = horizontalSign > 0 ? 'start' : 'end'; if (position === 'top') { var attrs = { x: x + width / 2, y: y - verticalSign * offset, textAnchor: 'middle', verticalAnchor: verticalEnd }; return _objectSpread(_objectSpread({}, attrs), parentViewBox ? { height: Math.max(y - parentViewBox.y, 0), width: width } : {}); } if (position === 'bottom') { var _attrs = { x: x + width / 2, y: y + height + verticalOffset, textAnchor: 'middle', verticalAnchor: verticalStart }; return _objectSpread(_objectSpread({}, _attrs), parentViewBox ? { height: Math.max(parentViewBox.y + parentViewBox.height - (y + height), 0), width: width } : {}); } if (position === 'left') { var _attrs2 = { x: x - horizontalOffset, y: y + height / 2, textAnchor: horizontalEnd, verticalAnchor: 'middle' }; return _objectSpread(_objectSpread({}, _attrs2), parentViewBox ? { width: Math.max(_attrs2.x - parentViewBox.x, 0), height: height } : {}); } if (position === 'right') { var _attrs3 = { x: x + width + horizontalOffset, y: y + height / 2, textAnchor: horizontalStart, verticalAnchor: 'middle' }; return _objectSpread(_objectSpread({}, _attrs3), parentViewBox ? { width: Math.max(parentViewBox.x + parentViewBox.width - _attrs3.x, 0), height: height } : {}); } var sizeAttrs = parentViewBox ? { width: width, height: height } : {}; if (position === 'insideLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + height / 2, textAnchor: horizontalStart, verticalAnchor: 'middle' }, sizeAttrs); } if (position === 'insideRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + height / 2, textAnchor: horizontalEnd, verticalAnchor: 'middle' }, sizeAttrs); } if (position === 'insideTop') { return _objectSpread({ x: x + width / 2, y: y + verticalOffset, textAnchor: 'middle', verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideBottom') { return _objectSpread({ x: x + width / 2, y: y + height - verticalOffset, textAnchor: 'middle', verticalAnchor: verticalEnd }, sizeAttrs); } if (position === 'insideTopLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + verticalOffset, textAnchor: horizontalStart, verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideTopRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + verticalOffset, textAnchor: horizontalEnd, verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideBottomLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + height - verticalOffset, textAnchor: horizontalStart, verticalAnchor: verticalEnd }, sizeAttrs); } if (position === 'insideBottomRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + height - verticalOffset, textAnchor: horizontalEnd, verticalAnchor: verticalEnd }, sizeAttrs); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default()(position) && ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(position.x) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isPercent)(position.x)) && ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(position.y) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isPercent)(position.y))) { return _objectSpread({ x: x + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getPercentValue)(position.x, width), y: y + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getPercentValue)(position.y, height), textAnchor: 'end', verticalAnchor: 'end' }, sizeAttrs); } return _objectSpread({ x: x + width / 2, y: y + height / 2, textAnchor: 'middle', verticalAnchor: 'middle' }, sizeAttrs); }; var isPolar = function isPolar(viewBox) { return 'cx' in viewBox && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(viewBox.cx); }; function Label(_ref4) { var _ref4$offset = _ref4.offset, offset = _ref4$offset === void 0 ? 5 : _ref4$offset, restProps = _objectWithoutProperties(_ref4, _excluded); var props = _objectSpread({ offset: offset }, restProps); var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, textBreakAll = props.textBreakAll; if (!viewBox || lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(value) && lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children) && ! /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(content) && !lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(content)) { return null; } if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(content)) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(content, props); } var label; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(content)) { label = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(content, props); if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(label)) { return label; } } else { label = getLabel(props); } var isPolarLabel = isPolar(viewBox); var attrs = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(props, true); if (isPolarLabel && (position === 'insideStart' || position === 'insideEnd' || position === 'end')) { return renderRadialLabel(props, label, attrs); } var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Text__WEBPACK_IMPORTED_MODULE_8__.Text, _extends({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-label', className) }, attrs, positionAttrs, { breakAll: textBreakAll }), label); } Label.displayName = 'Label'; var parseViewBox = function parseViewBox(props) { var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise, labelViewBox = props.labelViewBox; if (labelViewBox) { return labelViewBox; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(width) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(height)) { if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(x) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(y)) { return { x: x, y: y, width: width, height: height }; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(top) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(left)) { return { x: top, y: left, width: width, height: height }; } } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(x) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(y)) { return { x: x, y: y, width: 0, height: 0 }; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(cx) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(cy)) { return { cx: cx, cy: cy, startAngle: startAngle || angle || 0, endAngle: endAngle || angle || 0, innerRadius: innerRadius || 0, outerRadius: outerRadius || radius || r || 0, clockWise: clockWise }; } if (props.viewBox) { return props.viewBox; } return {}; }; var parseLabel = function parseLabel(label, viewBox) { if (!label) { return null; } if (label === true) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", viewBox: viewBox }); } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumOrStr)(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", viewBox: viewBox, value: label }); } if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(label)) { if (label.type === Label) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(label, { key: 'label-implicit', viewBox: viewBox }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", content: label, viewBox: viewBox }); } if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", content: label, viewBox: viewBox }); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, _extends({ viewBox: viewBox }, label, { key: "label-implicit" })); } return null; }; var renderCallByParent = function renderCallByParent(parentProps, viewBox) { var checkPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!parentProps || !parentProps.children && checkPropsLabel && !parentProps.label) { return null; } var children = parentProps.children; var parentViewBox = parseViewBox(parentProps); var explicitChildren = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.findAllByType)(children, Label).map(function (child, index) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, { viewBox: viewBox || parentViewBox, // eslint-disable-next-line react/no-array-index-key key: "label-".concat(index) }); }); if (!checkPropsLabel) { return explicitChildren; } var implicitLabel = parseLabel(parentProps.label, viewBox || parentViewBox); return [implicitLabel].concat(_toConsumableArray(explicitChildren)); }; Label.parseViewBox = parseViewBox; Label.renderCallByParent = renderCallByParent; /***/ }), /***/ "../../../node_modules/recharts/es6/component/LabelList.js": /*!*****************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/LabelList.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LabelList: () => (/* binding */ LabelList) /* 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 lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_last__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/last */ "../../../node_modules/lodash/last.js"); /* harmony import */ var lodash_last__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_last__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.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 = ["valueAccessor"], _excluded2 = ["data", "dataKey", "clockWise", "id", "textBreakAll"]; 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 _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 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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } var defaultAccessor = function defaultAccessor(entry) { return Array.isArray(entry.value) ? lodash_last__WEBPACK_IMPORTED_MODULE_4___default()(entry.value) : entry.value; }; function LabelList(_ref) { var _ref$valueAccessor = _ref.valueAccessor, valueAccessor = _ref$valueAccessor === void 0 ? defaultAccessor : _ref$valueAccessor, restProps = _objectWithoutProperties(_ref, _excluded); var data = restProps.data, dataKey = restProps.dataKey, clockWise = restProps.clockWise, id = restProps.id, textBreakAll = restProps.textBreakAll, others = _objectWithoutProperties(restProps, _excluded2); if (!data || !data.length) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_5__.Layer, { className: "recharts-label-list" }, data.map(function (entry, index) { var value = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(dataKey) ? valueAccessor(entry, index) : (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_6__.getValueByDataKey)(entry && entry.payload, dataKey); var idProps = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(id) ? {} : { id: "".concat(id, "-").concat(index) }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Label__WEBPACK_IMPORTED_MODULE_7__.Label, _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__.filterProps)(entry, true), others, idProps, { parentViewBox: entry.parentViewBox, value: value, textBreakAll: textBreakAll, viewBox: _Label__WEBPACK_IMPORTED_MODULE_7__.Label.parseViewBox(lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(clockWise) ? entry : _objectSpread(_objectSpread({}, entry), {}, { clockWise: clockWise })), key: "label-".concat(index) // eslint-disable-line react/no-array-index-key , index: index })); })); } LabelList.displayName = 'LabelList'; function parseLabelList(label, data) { if (!label) { return null; } if (label === true) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, { key: "labelList-implicit", data: data }); } if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(label) || lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, { key: "labelList-implicit", data: data, content: label }); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, _extends({ data: data }, label, { key: "labelList-implicit" })); } return null; } function renderCallByParent(parentProps, data) { var checkPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!parentProps || !parentProps.children && checkPropsLabel && !parentProps.label) { return null; } var children = parentProps.children; var explicitChildren = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__.findAllByType)(children, LabelList).map(function (child, index) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, { data: data, // eslint-disable-next-line react/no-array-index-key key: "labelList-".concat(index) }); }); if (!checkPropsLabel) { return explicitChildren; } var implicitLabelList = parseLabelList(parentProps.label, data); return [implicitLabelList].concat(_toConsumableArray(explicitChildren)); } LabelList.renderCallByParent = renderCallByParent; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Legend.js": /*!**************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Legend.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Legend: () => (/* binding */ Legend) /* 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 _DefaultLegendContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultLegendContent */ "../../../node_modules/recharts/es6/component/DefaultLegendContent.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/payload/getUniqPayload */ "../../../node_modules/recharts/es6/util/payload/getUniqPayload.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 = ["ref"]; 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 _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } 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() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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 _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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } /** * @fileOverview Legend */ function defaultUniqBy(entry) { return entry.value; } function renderContent(content, props) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(content)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(content, props); } if (typeof content === 'function') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(content, props); } var ref = props.ref, otherProps = _objectWithoutProperties(props, _excluded); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DefaultLegendContent__WEBPACK_IMPORTED_MODULE_1__.DefaultLegendContent, otherProps); } var EPS = 1; var Legend = /*#__PURE__*/function (_PureComponent) { function Legend() { var _this; _classCallCheck(this, Legend); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, Legend, [].concat(args)); _defineProperty(_this, "lastBoundingBox", { width: -1, height: -1 }); return _this; } _inherits(Legend, _PureComponent); return _createClass(Legend, [{ key: "componentDidMount", value: function componentDidMount() { this.updateBBox(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.updateBBox(); } }, { key: "getBBox", value: function getBBox() { if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) { var box = this.wrapperNode.getBoundingClientRect(); box.height = this.wrapperNode.offsetHeight; box.width = this.wrapperNode.offsetWidth; return box; } return null; } }, { key: "updateBBox", value: function updateBBox() { var onBBoxUpdate = this.props.onBBoxUpdate; var box = this.getBBox(); if (box) { if (Math.abs(box.width - this.lastBoundingBox.width) > EPS || Math.abs(box.height - this.lastBoundingBox.height) > EPS) { this.lastBoundingBox.width = box.width; this.lastBoundingBox.height = box.height; if (onBBoxUpdate) { onBBoxUpdate(box); } } } else if (this.lastBoundingBox.width !== -1 || this.lastBoundingBox.height !== -1) { this.lastBoundingBox.width = -1; this.lastBoundingBox.height = -1; if (onBBoxUpdate) { onBBoxUpdate(null); } } } }, { key: "getBBoxSnapshot", value: function getBBoxSnapshot() { if (this.lastBoundingBox.width >= 0 && this.lastBoundingBox.height >= 0) { return _objectSpread({}, this.lastBoundingBox); } return { width: 0, height: 0 }; } }, { key: "getDefaultPosition", value: function getDefaultPosition(style) { var _this$props = this.props, layout = _this$props.layout, align = _this$props.align, verticalAlign = _this$props.verticalAlign, margin = _this$props.margin, chartWidth = _this$props.chartWidth, chartHeight = _this$props.chartHeight; var hPos, vPos; if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) { if (align === 'center' && layout === 'vertical') { var box = this.getBBoxSnapshot(); hPos = { left: ((chartWidth || 0) - box.width) / 2 }; } else { hPos = align === 'right' ? { right: margin && margin.right || 0 } : { left: margin && margin.left || 0 }; } } if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) { if (verticalAlign === 'middle') { var _box = this.getBBoxSnapshot(); vPos = { top: ((chartHeight || 0) - _box.height) / 2 }; } else { vPos = verticalAlign === 'bottom' ? { bottom: margin && margin.bottom || 0 } : { top: margin && margin.top || 0 }; } } return _objectSpread(_objectSpread({}, hPos), vPos); } }, { key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, content = _this$props2.content, width = _this$props2.width, height = _this$props2.height, wrapperStyle = _this$props2.wrapperStyle, payloadUniqBy = _this$props2.payloadUniqBy, payload = _this$props2.payload; var outerStyle = _objectSpread(_objectSpread({ position: 'absolute', width: width || 'auto', height: height || 'auto' }, this.getDefaultPosition(wrapperStyle)), wrapperStyle); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "recharts-legend-wrapper", style: outerStyle, ref: function ref(node) { _this2.wrapperNode = node; } }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, { payload: (0,_util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__.getUniqPayload)(payload, payloadUniqBy, defaultUniqBy) }))); } }], [{ key: "getWithHeight", value: function getWithHeight(item, chartWidth) { var _this$defaultProps$it = _objectSpread(_objectSpread({}, this.defaultProps), item.props), layout = _this$defaultProps$it.layout; if (layout === 'vertical' && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_3__.isNumber)(item.props.height)) { return { height: item.props.height }; } if (layout === 'horizontal') { return { width: item.props.width || chartWidth }; } return null; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(Legend, "displayName", 'Legend'); _defineProperty(Legend, "defaultProps", { iconSize: 14, layout: 'horizontal', align: 'center', verticalAlign: 'bottom' }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/ResponsiveContainer.js": /*!***************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/ResponsiveContainer.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ResponsiveContainer: () => (/* binding */ ResponsiveContainer) /* harmony export */ }); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/throttle */ "../../../node_modules/lodash/throttle.js"); /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(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; } /** * @fileOverview Wrapper component to make charts adapt to the size of parent * DOM */ var ResponsiveContainer = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (_ref, ref) { var aspect = _ref.aspect, _ref$initialDimension = _ref.initialDimension, initialDimension = _ref$initialDimension === void 0 ? { width: -1, height: -1 } : _ref$initialDimension, _ref$width = _ref.width, width = _ref$width === void 0 ? '100%' : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? '100%' : _ref$height, _ref$minWidth = _ref.minWidth, minWidth = _ref$minWidth === void 0 ? 0 : _ref$minWidth, minHeight = _ref.minHeight, maxHeight = _ref.maxHeight, children = _ref.children, _ref$debounce = _ref.debounce, debounce = _ref$debounce === void 0 ? 0 : _ref$debounce, id = _ref.id, className = _ref.className, onResize = _ref.onResize, _ref$style = _ref.style, style = _ref$style === void 0 ? {} : _ref$style; var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var onResizeRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(); onResizeRef.current = onResize; (0,react__WEBPACK_IMPORTED_MODULE_1__.useImperativeHandle)(ref, function () { return Object.defineProperty(containerRef.current, 'current', { get: function get() { // eslint-disable-next-line no-console console.warn('The usage of ref.current.current is deprecated and will no longer be supported.'); return containerRef.current; }, configurable: true }); }); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({ containerWidth: initialDimension.width, containerHeight: initialDimension.height }), _useState2 = _slicedToArray(_useState, 2), sizes = _useState2[0], setSizes = _useState2[1]; var setContainerSize = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(function (newWidth, newHeight) { setSizes(function (prevState) { var roundedWidth = Math.round(newWidth); var roundedHeight = Math.round(newHeight); if (prevState.containerWidth === roundedWidth && prevState.containerHeight === roundedHeight) { return prevState; } return { containerWidth: roundedWidth, containerHeight: roundedHeight }; }); }, []); (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { var callback = function callback(entries) { var _onResizeRef$current; var _entries$0$contentRec = entries[0].contentRect, containerWidth = _entries$0$contentRec.width, containerHeight = _entries$0$contentRec.height; setContainerSize(containerWidth, containerHeight); (_onResizeRef$current = onResizeRef.current) === null || _onResizeRef$current === void 0 || _onResizeRef$current.call(onResizeRef, containerWidth, containerHeight); }; if (debounce > 0) { callback = lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default()(callback, debounce, { trailing: true, leading: false }); } var observer = new ResizeObserver(callback); var _containerRef$current = containerRef.current.getBoundingClientRect(), containerWidth = _containerRef$current.width, containerHeight = _containerRef$current.height; setContainerSize(containerWidth, containerHeight); observer.observe(containerRef.current); return function () { observer.disconnect(); }; }, [setContainerSize, debounce]); var chartContent = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () { var containerWidth = sizes.containerWidth, containerHeight = sizes.containerHeight; if (containerWidth < 0 || containerHeight < 0) { return null; } (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(width) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(height), "The width(%s) and height(%s) are both fixed numbers,\n maybe you don't need to use a ResponsiveContainer.", width, height); (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)(!aspect || aspect > 0, 'The aspect(%s) must be greater than zero.', aspect); var calculatedWidth = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(width) ? containerWidth : width; var calculatedHeight = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(height) ? containerHeight : height; if (aspect && aspect > 0) { // Preserve the desired aspect ratio if (calculatedWidth) { // Will default to using width for aspect ratio calculatedHeight = calculatedWidth / aspect; } else if (calculatedHeight) { // But we should also take height into consideration calculatedWidth = calculatedHeight * aspect; } // if maxHeight is set, overwrite if calculatedHeight is greater than maxHeight if (maxHeight && calculatedHeight > maxHeight) { calculatedHeight = maxHeight; } } (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)(calculatedWidth > 0 || calculatedHeight > 0, "The width(%s) and height(%s) of chart should be greater than 0,\n please check the style of container, or the props width(%s) and height(%s),\n or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the\n height and width.", calculatedWidth, calculatedHeight, width, height, minWidth, minHeight, aspect); var isCharts = !Array.isArray(children) && (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.getDisplayName)(children.type).endsWith('Chart'); return react__WEBPACK_IMPORTED_MODULE_1___default().Children.map(children, function (child) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().isValidElement(child)) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.cloneElement)(child, _objectSpread({ width: calculatedWidth, height: calculatedHeight }, isCharts ? { style: _objectSpread({ height: '100%', width: '100%', maxHeight: calculatedHeight, maxWidth: calculatedWidth }, child.props.style) } : {})); } return child; }); }, [aspect, children, height, maxHeight, minHeight, minWidth, sizes, width]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { id: id ? "".concat(id) : undefined, className: (0,clsx__WEBPACK_IMPORTED_MODULE_0__["default"])('recharts-responsive-container', className), style: _objectSpread(_objectSpread({}, style), {}, { width: width, height: height, minWidth: minWidth, minHeight: minHeight, maxHeight: maxHeight }), ref: containerRef }, chartContent); }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/Text.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Text.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Text: () => (/* binding */ Text) /* 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 lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/DOMUtils */ "../../../node_modules/recharts/es6/util/DOMUtils.js"); /* harmony import */ var _util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ReduceCSSCalc */ "../../../node_modules/recharts/es6/util/ReduceCSSCalc.js"); var _excluded = ["x", "y", "lineHeight", "capHeight", "scaleToFit", "textAnchor", "verticalAnchor", "fill"], _excluded2 = ["dx", "dy", "angle", "className", "breakAll"]; 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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } 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 BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/; var calculateWordWidths = function calculateWordWidths(_ref) { var children = _ref.children, breakAll = _ref.breakAll, style = _ref.style; try { var words = []; if (!lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children)) { if (breakAll) { words = children.toString().split(''); } else { words = children.toString().split(BREAKING_SPACES); } } var wordsWithComputedWidth = words.map(function (word) { return { word: word, width: (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__.getStringSize)(word, style).width }; }); var spaceWidth = breakAll ? 0 : (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__.getStringSize)("\xA0", style).width; return { wordsWithComputedWidth: wordsWithComputedWidth, spaceWidth: spaceWidth }; } catch (e) { return null; } }; var calculateWordsByLines = function calculateWordsByLines(_ref2, initialWordsWithComputedWith, spaceWidth, lineWidth, scaleToFit) { var maxLines = _ref2.maxLines, children = _ref2.children, style = _ref2.style, breakAll = _ref2.breakAll; var shouldLimitLines = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(maxLines); var text = children; var calculate = function calculate() { var words = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return words.reduce(function (result, _ref3) { var word = _ref3.word, width = _ref3.width; var currentLine = result[result.length - 1]; if (currentLine && (lineWidth == null || scaleToFit || currentLine.width + width + spaceWidth < Number(lineWidth))) { // Word can be added to an existing line currentLine.words.push(word); currentLine.width += width + spaceWidth; } else { // Add first word to line or word is too long to scaleToFit on existing line var newLine = { words: [word], width: width }; result.push(newLine); } return result; }, []); }; var originalResult = calculate(initialWordsWithComputedWith); var findLongestLine = function findLongestLine(words) { return words.reduce(function (a, b) { return a.width > b.width ? a : b; }); }; if (!shouldLimitLines) { return originalResult; } var suffix = '…'; var checkOverflow = function checkOverflow(index) { var tempText = text.slice(0, index); var words = calculateWordWidths({ breakAll: breakAll, style: style, children: tempText + suffix }).wordsWithComputedWidth; var result = calculate(words); var doesOverflow = result.length > maxLines || findLongestLine(result).width > Number(lineWidth); return [doesOverflow, result]; }; var start = 0; var end = text.length - 1; var iterations = 0; var trimmedResult; while (start <= end && iterations <= text.length - 1) { var middle = Math.floor((start + end) / 2); var prev = middle - 1; var _checkOverflow = checkOverflow(prev), _checkOverflow2 = _slicedToArray(_checkOverflow, 2), doesPrevOverflow = _checkOverflow2[0], result = _checkOverflow2[1]; var _checkOverflow3 = checkOverflow(middle), _checkOverflow4 = _slicedToArray(_checkOverflow3, 1), doesMiddleOverflow = _checkOverflow4[0]; if (!doesPrevOverflow && !doesMiddleOverflow) { start = middle + 1; } if (doesPrevOverflow && doesMiddleOverflow) { end = middle - 1; } if (!doesPrevOverflow && doesMiddleOverflow) { trimmedResult = result; break; } iterations++; } // Fallback to originalResult (result without trimming) if we cannot find the // where to trim. This should not happen :tm: return trimmedResult || originalResult; }; var getWordsWithoutCalculate = function getWordsWithoutCalculate(children) { var words = !lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children) ? children.toString().split(BREAKING_SPACES) : []; return [{ words: words }]; }; var getWordsByLines = function getWordsByLines(_ref4) { var width = _ref4.width, scaleToFit = _ref4.scaleToFit, children = _ref4.children, style = _ref4.style, breakAll = _ref4.breakAll, maxLines = _ref4.maxLines; // Only perform calculations if using features that require them (multiline, scaleToFit) if ((width || scaleToFit) && !_util_Global__WEBPACK_IMPORTED_MODULE_5__.Global.isSsr) { var wordsWithComputedWidth, spaceWidth; var wordWidths = calculateWordWidths({ breakAll: breakAll, children: children, style: style }); if (wordWidths) { var wcw = wordWidths.wordsWithComputedWidth, sw = wordWidths.spaceWidth; wordsWithComputedWidth = wcw; spaceWidth = sw; } else { return getWordsWithoutCalculate(children); } return calculateWordsByLines({ breakAll: breakAll, children: children, maxLines: maxLines, style: style }, wordsWithComputedWidth, spaceWidth, width, scaleToFit); } return getWordsWithoutCalculate(children); }; var DEFAULT_FILL = '#808080'; var Text = function Text(_ref5) { var _ref5$x = _ref5.x, propsX = _ref5$x === void 0 ? 0 : _ref5$x, _ref5$y = _ref5.y, propsY = _ref5$y === void 0 ? 0 : _ref5$y, _ref5$lineHeight = _ref5.lineHeight, lineHeight = _ref5$lineHeight === void 0 ? '1em' : _ref5$lineHeight, _ref5$capHeight = _ref5.capHeight, capHeight = _ref5$capHeight === void 0 ? '0.71em' : _ref5$capHeight, _ref5$scaleToFit = _ref5.scaleToFit, scaleToFit = _ref5$scaleToFit === void 0 ? false : _ref5$scaleToFit, _ref5$textAnchor = _ref5.textAnchor, textAnchor = _ref5$textAnchor === void 0 ? 'start' : _ref5$textAnchor, _ref5$verticalAnchor = _ref5.verticalAnchor, verticalAnchor = _ref5$verticalAnchor === void 0 ? 'end' : _ref5$verticalAnchor, _ref5$fill = _ref5.fill, fill = _ref5$fill === void 0 ? DEFAULT_FILL : _ref5$fill, props = _objectWithoutProperties(_ref5, _excluded); var wordsByLines = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return getWordsByLines({ breakAll: props.breakAll, children: props.children, maxLines: props.maxLines, scaleToFit: scaleToFit, style: props.style, width: props.width }); }, [props.breakAll, props.children, props.maxLines, scaleToFit, props.style, props.width]); var dx = props.dx, dy = props.dy, angle = props.angle, className = props.className, breakAll = props.breakAll, textProps = _objectWithoutProperties(props, _excluded2); if (!(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(propsX) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(propsY)) { return null; } var x = propsX + ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(dx) ? dx : 0); var y = propsY + ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(dy) ? dy : 0); var startDy; switch (verticalAnchor) { case 'start': startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat(capHeight, ")")); break; case 'middle': startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat((wordsByLines.length - 1) / 2, " * -").concat(lineHeight, " + (").concat(capHeight, " / 2))")); break; default: startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat(wordsByLines.length - 1, " * -").concat(lineHeight, ")")); break; } var transforms = []; if (scaleToFit) { var lineWidth = wordsByLines[0].width; var width = props.width; transforms.push("scale(".concat(((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(width) ? width / lineWidth : 1) / lineWidth, ")")); } if (angle) { transforms.push("rotate(".concat(angle, ", ").concat(x, ", ").concat(y, ")")); } if (transforms.length) { textProps.transform = transforms.join(' '); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("text", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(textProps, true), { x: x, y: y, className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-text', className), textAnchor: textAnchor, fill: fill.includes('url') ? DEFAULT_FILL : fill }), wordsByLines.map(function (line, index) { var words = line.words.join(breakAll ? '' : ' '); return ( /*#__PURE__*/ // duplicate words will cause duplicate keys // eslint-disable-next-line react/no-array-index-key react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tspan", { x: x, dy: index === 0 ? startDy : lineHeight, key: "".concat(words, "-").concat(index) }, words) ); })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Tooltip.js": /*!***************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Tooltip.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Tooltip: () => (/* binding */ Tooltip) /* 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 _DefaultTooltipContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultTooltipContent */ "../../../node_modules/recharts/es6/component/DefaultTooltipContent.js"); /* harmony import */ var _TooltipBoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TooltipBoundingBox */ "../../../node_modules/recharts/es6/component/TooltipBoundingBox.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/payload/getUniqPayload */ "../../../node_modules/recharts/es6/util/payload/getUniqPayload.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _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 _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } 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() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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 _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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Tooltip */ function defaultUniqBy(entry) { return entry.dataKey; } function renderContent(content, props) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(content)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(content, props); } if (typeof content === 'function') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(content, props); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DefaultTooltipContent__WEBPACK_IMPORTED_MODULE_1__.DefaultTooltipContent, props); } var Tooltip = /*#__PURE__*/function (_PureComponent) { function Tooltip() { _classCallCheck(this, Tooltip); return _callSuper(this, Tooltip, arguments); } _inherits(Tooltip, _PureComponent); return _createClass(Tooltip, [{ key: "render", value: function render() { var _this = this; var _this$props = this.props, active = _this$props.active, allowEscapeViewBox = _this$props.allowEscapeViewBox, animationDuration = _this$props.animationDuration, animationEasing = _this$props.animationEasing, content = _this$props.content, coordinate = _this$props.coordinate, filterNull = _this$props.filterNull, isAnimationActive = _this$props.isAnimationActive, offset = _this$props.offset, payload = _this$props.payload, payloadUniqBy = _this$props.payloadUniqBy, position = _this$props.position, reverseDirection = _this$props.reverseDirection, useTranslate3d = _this$props.useTranslate3d, viewBox = _this$props.viewBox, wrapperStyle = _this$props.wrapperStyle; var finalPayload = payload !== null && payload !== void 0 ? payload : []; if (filterNull && finalPayload.length) { finalPayload = (0,_util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__.getUniqPayload)(payload.filter(function (entry) { return entry.value != null && (entry.hide !== true || _this.props.includeHidden); }), payloadUniqBy, defaultUniqBy); } var hasPayload = finalPayload.length > 0; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TooltipBoundingBox__WEBPACK_IMPORTED_MODULE_3__.TooltipBoundingBox, { allowEscapeViewBox: allowEscapeViewBox, animationDuration: animationDuration, animationEasing: animationEasing, isAnimationActive: isAnimationActive, active: active, coordinate: coordinate, hasPayload: hasPayload, offset: offset, position: position, reverseDirection: reverseDirection, useTranslate3d: useTranslate3d, viewBox: viewBox, wrapperStyle: wrapperStyle }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, { payload: finalPayload }))); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(Tooltip, "displayName", 'Tooltip'); _defineProperty(Tooltip, "defaultProps", { accessibilityLayer: false, allowEscapeViewBox: { x: false, y: false }, animationDuration: 400, animationEasing: 'ease', contentStyle: {}, coordinate: { x: 0, y: 0 }, cursor: true, cursorStyle: {}, filterNull: true, isAnimationActive: !_util_Global__WEBPACK_IMPORTED_MODULE_4__.Global.isSsr, itemStyle: {}, labelStyle: {}, offset: 10, reverseDirection: { x: false, y: false }, separator: ' : ', trigger: 'hover', useTranslate3d: false, viewBox: { x: 0, y: 0, height: 0, width: 0 }, wrapperStyle: {} }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/TooltipBoundingBox.js": /*!**************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/TooltipBoundingBox.js ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TooltipBoundingBox: () => (/* binding */ TooltipBoundingBox) /* 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 _util_tooltip_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/tooltip/translate */ "../../../node_modules/recharts/es6/util/tooltip/translate.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _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 _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } 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() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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 _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(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var EPSILON = 1; var TooltipBoundingBox = /*#__PURE__*/function (_PureComponent) { function TooltipBoundingBox() { var _this; _classCallCheck(this, TooltipBoundingBox); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, TooltipBoundingBox, [].concat(args)); _defineProperty(_this, "state", { dismissed: false, dismissedAtCoordinate: { x: 0, y: 0 }, lastBoundingBox: { width: -1, height: -1 } }); _defineProperty(_this, "handleKeyDown", function (event) { if (event.key === 'Escape') { var _this$props$coordinat, _this$props$coordinat2, _this$props$coordinat3, _this$props$coordinat4; _this.setState({ dismissed: true, dismissedAtCoordinate: { x: (_this$props$coordinat = (_this$props$coordinat2 = _this.props.coordinate) === null || _this$props$coordinat2 === void 0 ? void 0 : _this$props$coordinat2.x) !== null && _this$props$coordinat !== void 0 ? _this$props$coordinat : 0, y: (_this$props$coordinat3 = (_this$props$coordinat4 = _this.props.coordinate) === null || _this$props$coordinat4 === void 0 ? void 0 : _this$props$coordinat4.y) !== null && _this$props$coordinat3 !== void 0 ? _this$props$coordinat3 : 0 } }); } }); return _this; } _inherits(TooltipBoundingBox, _PureComponent); return _createClass(TooltipBoundingBox, [{ key: "updateBBox", value: function updateBBox() { if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) { var box = this.wrapperNode.getBoundingClientRect(); if (Math.abs(box.width - this.state.lastBoundingBox.width) > EPSILON || Math.abs(box.height - this.state.lastBoundingBox.height) > EPSILON) { this.setState({ lastBoundingBox: { width: box.width, height: box.height } }); } } else if (this.state.lastBoundingBox.width !== -1 || this.state.lastBoundingBox.height !== -1) { this.setState({ lastBoundingBox: { width: -1, height: -1 } }); } } }, { key: "componentDidMount", value: function componentDidMount() { document.addEventListener('keydown', this.handleKeyDown); this.updateBBox(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('keydown', this.handleKeyDown); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var _this$props$coordinat5, _this$props$coordinat6; if (this.props.active) { this.updateBBox(); } if (!this.state.dismissed) { return; } if (((_this$props$coordinat5 = this.props.coordinate) === null || _this$props$coordinat5 === void 0 ? void 0 : _this$props$coordinat5.x) !== this.state.dismissedAtCoordinate.x || ((_this$props$coordinat6 = this.props.coordinate) === null || _this$props$coordinat6 === void 0 ? void 0 : _this$props$coordinat6.y) !== this.state.dismissedAtCoordinate.y) { this.state.dismissed = false; } } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, active = _this$props.active, allowEscapeViewBox = _this$props.allowEscapeViewBox, animationDuration = _this$props.animationDuration, animationEasing = _this$props.animationEasing, children = _this$props.children, coordinate = _this$props.coordinate, hasPayload = _this$props.hasPayload, isAnimationActive = _this$props.isAnimationActive, offset = _this$props.offset, position = _this$props.position, reverseDirection = _this$props.reverseDirection, useTranslate3d = _this$props.useTranslate3d, viewBox = _this$props.viewBox, wrapperStyle = _this$props.wrapperStyle; var _getTooltipTranslate = (0,_util_tooltip_translate__WEBPACK_IMPORTED_MODULE_1__.getTooltipTranslate)({ allowEscapeViewBox: allowEscapeViewBox, coordinate: coordinate, offsetTopLeft: offset, position: position, reverseDirection: reverseDirection, tooltipBox: this.state.lastBoundingBox, useTranslate3d: useTranslate3d, viewBox: viewBox }), cssClasses = _getTooltipTranslate.cssClasses, cssProperties = _getTooltipTranslate.cssProperties; var outerStyle = _objectSpread(_objectSpread({ transition: isAnimationActive && active ? "transform ".concat(animationDuration, "ms ").concat(animationEasing) : undefined }, cssProperties), {}, { pointerEvents: 'none', visibility: !this.state.dismissed && active && hasPayload ? 'visible' : 'hidden', position: 'absolute', top: 0, left: 0 }, wrapperStyle); return ( /*#__PURE__*/ // This element allow listening to the `Escape` key. // See https://github.com/recharts/recharts/pull/2925 react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { tabIndex: -1, className: cssClasses, style: outerStyle, ref: function ref(node) { _this2.wrapperNode = node; } }, children) ); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); /***/ }), /***/ "../../../node_modules/recharts/es6/container/Layer.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/container/Layer.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Layer: () => (/* binding */ Layer) /* 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 clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["children", "className"]; 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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } var Layer = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().forwardRef(function (props, ref) { var children = props.children, className = props.className, others = _objectWithoutProperties(props, _excluded); var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-layer', className); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", _extends({ className: layerClass }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { ref: ref }), children); }); /***/ }), /***/ "../../../node_modules/recharts/es6/container/Surface.js": /*!***************************************************************!*\ !*** ../../../node_modules/recharts/es6/container/Surface.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Surface: () => (/* binding */ Surface) /* 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 clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["children", "width", "height", "viewBox", "className", "style", "title", "desc"]; 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 = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } /** * @fileOverview Surface */ function Surface(props) { var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, title = props.title, desc = props.desc, others = _objectWithoutProperties(props, _excluded); var svgView = viewBox || { width: width, height: height, x: 0, y: 0 }; var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-surface', className); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true, 'svg'), { className: layerClass, width: width, height: height, style: style, viewBox: "".concat(svgView.x, " ").concat(svgView.y, " ").concat(svgView.width, " ").concat(svgView.height) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("title", null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("desc", null, desc), children); } /***/ }), /***/ "../../../node_modules/recharts/es6/context/chartLayoutContext.js": /*!************************************************************************!*\ !*** ../../../node_modules/recharts/es6/context/chartLayoutContext.js ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ChartHeightContext: () => (/* binding */ ChartHeightContext), /* harmony export */ ChartLayoutContextProvider: () => (/* binding */ ChartLayoutContextProvider), /* harmony export */ ChartWidthContext: () => (/* binding */ ChartWidthContext), /* harmony export */ ClipPathIdContext: () => (/* binding */ ClipPathIdContext), /* harmony export */ OffsetContext: () => (/* binding */ OffsetContext), /* harmony export */ ViewBoxContext: () => (/* binding */ ViewBoxContext), /* harmony export */ XAxisContext: () => (/* binding */ XAxisContext), /* harmony export */ YAxisContext: () => (/* binding */ YAxisContext), /* harmony export */ useArbitraryXAxis: () => (/* binding */ useArbitraryXAxis), /* harmony export */ useArbitraryYAxis: () => (/* binding */ useArbitraryYAxis), /* harmony export */ useChartHeight: () => (/* binding */ useChartHeight), /* harmony export */ useChartWidth: () => (/* binding */ useChartWidth), /* harmony export */ useClipPathId: () => (/* binding */ useClipPathId), /* harmony export */ useOffset: () => (/* binding */ useOffset), /* harmony export */ useViewBox: () => (/* binding */ useViewBox), /* harmony export */ useXAxisOrThrow: () => (/* binding */ useXAxisOrThrow), /* harmony export */ useYAxisOrThrow: () => (/* binding */ useYAxisOrThrow), /* harmony export */ useYAxisWithFiniteDomainOrRandom: () => (/* binding */ useYAxisWithFiniteDomainOrRandom) /* 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 tiny_invariant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-invariant */ "../../../node_modules/tiny-invariant/dist/esm/tiny-invariant.js"); /* harmony import */ var lodash_find__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/find */ "../../../node_modules/lodash/find.js"); /* harmony import */ var lodash_find__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_find__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/every */ "../../../node_modules/lodash/every.js"); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_every__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _util_calculateViewBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/calculateViewBox */ "../../../node_modules/recharts/es6/util/calculateViewBox.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.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 XAxisContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var YAxisContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var ViewBoxContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var OffsetContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({}); var ClipPathIdContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var ChartHeightContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(0); var ChartWidthContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(0); /** * Will add all the properties required to render all individual Recharts components into a React Context. * * If you want to read these properties, see the collection of hooks exported from this file. * * @param {object} props CategoricalChartState, plus children * @returns {ReactElement} React Context Provider */ var ChartLayoutContextProvider = function ChartLayoutContextProvider(props) { var _props$state = props.state, xAxisMap = _props$state.xAxisMap, yAxisMap = _props$state.yAxisMap, offset = _props$state.offset, clipPathId = props.clipPathId, children = props.children, width = props.width, height = props.height; /** * Perhaps we should compute this property when reading? Let's see what is more often used */ var viewBox = (0,_util_calculateViewBox__WEBPACK_IMPORTED_MODULE_4__.calculateViewBox)(offset); /* * This pretends to be a single context but actually is split into multiple smaller ones. * Why? * Because one React Context only allows to set one value. * But we need to set multiple values. * If we do that with one context, then we force re-render on components that might not even be interested * in the part of the state that has changed. * * By splitting into smaller contexts, we allow each components to be optimized and only re-render when its dependencies change. * * To actually achieve the optimal re-render, it is necessary to use React.memo(). * See the test file for details. */ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(XAxisContext.Provider, { value: xAxisMap }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(YAxisContext.Provider, { value: yAxisMap }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(OffsetContext.Provider, { value: offset }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ViewBoxContext.Provider, { value: viewBox }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ClipPathIdContext.Provider, { value: clipPathId }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartHeightContext.Provider, { value: height }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartWidthContext.Provider, { value: width }, children))))))); }; var useClipPathId = function useClipPathId() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ClipPathIdContext); }; function getKeysForDebug(object) { var keys = Object.keys(object); if (keys.length === 0) { return 'There are no available ids.'; } return "Available ids are: ".concat(keys, "."); } /** * This either finds and returns Axis by the specified ID, or throws an exception if an axis with this ID does not exist. * * @param xAxisId identifier of the axis - it's either autogenerated ('0'), or passed via `id` prop as * @returns axis configuration object * @throws Error if no axis with this ID exists */ var useXAxisOrThrow = function useXAxisOrThrow(xAxisId) { var xAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(XAxisContext); !(xAxisMap != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, 'Could not find Recharts context; are you sure this is rendered inside a Recharts wrapper component?') : 0 : void 0; var xAxis = xAxisMap[xAxisId]; !(xAxis != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, "Could not find xAxis by id \"".concat(xAxisId, "\" [").concat(_typeof(xAxisId), "]. ").concat(getKeysForDebug(xAxisMap))) : 0 : void 0; return xAxis; }; /** * This will find an arbitrary first XAxis. If there's exactly one it always returns that one * - but if there are multiple then it can return any of those. * * If you want specific XAxis out of multiple then prefer using useXAxisOrThrow * * @returns X axisOptions, or undefined - if there are no X axes */ var useArbitraryXAxis = function useArbitraryXAxis() { var xAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(XAxisContext); return (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(xAxisMap); }; /** * This will find an arbitrary first YAxis. If there's exactly one it always returns that one * - but if there are multiple then it can return any of those. * * If you want specific YAxis out of multiple then prefer using useXAxisOrThrow * * @returns Y axisOptions, or undefined - if there are no Y axes */ var useArbitraryYAxis = function useArbitraryYAxis() { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); return (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(yAxisMap); }; /** * This hooks will: * 1st attempt to find an YAxis that has all elements in its domain finite * If no such axis exists, it will return an arbitrary YAxis * if there are no Y axes then it returns undefined * * @returns Either Y axisOptions, or undefined if there are no Y axes */ var useYAxisWithFiniteDomainOrRandom = function useYAxisWithFiniteDomainOrRandom() { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); var yAxisWithFiniteDomain = lodash_find__WEBPACK_IMPORTED_MODULE_2___default()(yAxisMap, function (axis) { return lodash_every__WEBPACK_IMPORTED_MODULE_3___default()(axis.domain, Number.isFinite); }); return yAxisWithFiniteDomain || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(yAxisMap); }; /** * This either finds and returns Axis by the specified ID, or throws an exception if an axis with this ID does not exist. * * @param yAxisId identifier of the axis - it's either autogenerated ('0'), or passed via `id` prop as * @returns axis configuration object * @throws Error if no axis with this ID exists */ var useYAxisOrThrow = function useYAxisOrThrow(yAxisId) { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); !(yAxisMap != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, 'Could not find Recharts context; are you sure this is rendered inside a Recharts wrapper component?') : 0 : void 0; var yAxis = yAxisMap[yAxisId]; !(yAxis != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, "Could not find yAxis by id \"".concat(yAxisId, "\" [").concat(_typeof(yAxisId), "]. ").concat(getKeysForDebug(yAxisMap))) : 0 : void 0; return yAxis; }; var useViewBox = function useViewBox() { var viewBox = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ViewBoxContext); return viewBox; }; var useOffset = function useOffset() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(OffsetContext); }; var useChartWidth = function useChartWidth() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ChartWidthContext); }; var useChartHeight = function useChartHeight() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ChartHeightContext); }; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVjaGFydHNfZXM2X2NvbXBvbmVudF9DZWxsX2pzLW5vZGVfbW9kdWxlc19yZWNoYXJ0c19lczZfY29tcG9uZW50X0N1cnNvLWU4ZTAzYi52b2x1bnRlZXJhcGkuYTI5NzI4YTFkZmRiYjM1ZjhmZjkuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQQSxzQkFBc0IsMkJBQTJCLG9HQUFvRyxtQkFBbUIsaUJBQWlCLHNIQUFzSDtBQUMvUyx5QkFBeUIsd0JBQXdCLG9DQUFvQyx5Q0FBeUMsa0NBQWtDLDBEQUEwRCwwQkFBMEI7QUFDcFAsNEJBQTRCLGdCQUFnQixzQkFBc0IsT0FBTyxrREFBa0Qsc0RBQXNELDhCQUE4QixtSkFBbUoscUVBQXFFLEtBQUs7QUFDNWEsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLDZCQUE2QixtQ0FBbUM7QUFDaEUsOEJBQThCLDRDQUE0QywrQkFBK0Isb0JBQW9CLG1DQUFtQyxzQ0FBc0MsdUVBQXVFO0FBQ3pNO0FBQzVDO0FBQ2U7QUFDQTtBQUNnQztBQUN4QjtBQUM4QjtBQUNwQztBQUN3QjtBQUNoQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwrQ0FBSztBQUN4QjtBQUNBO0FBQ0EsaUJBQWlCLCtDQUFLO0FBQ3RCLElBQUk7QUFDSixnQkFBZ0IsbUZBQWtCO0FBQ2xDLGlCQUFpQix1REFBUztBQUMxQixJQUFJO0FBQ0osZ0NBQWdDLHlGQUFxQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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cUksQ0FBZ0I7QUFDM047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpQkFBaUIsaURBQVU7QUFDM0IsU0FBUyxzRUFBcUI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaUJBQWlCLGlEQUFVO0FBQzNCLFNBQVMsc0VBQXFCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlCQUFpQixpREFBVTtBQUMzQiw4QkFBOEIsa0RBQUk7QUFDbEMsV0FBVyxtREFBSztBQUNoQixHQUFHO0FBQ0gsa0NBQWtDLHNFQUFxQjtBQUN2RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaUJBQWlCLGlEQUFVO0FBQzNCLHdCQUF3QixLQUFxQyxHQUFHLDBEQUFTLDBDQUEwQyx1RUFBdUUsQ0FBZ0I7QUFDMU07QUFDQSxxQkFBcUIsS0FBcUMsR0FBRywwREFBUyxxSUFBcUksQ0FBZ0I7QUFDM047QUFDQTtBQUNPO0FBQ1AsZ0JBQWdCLGlEQUFVO0FBQzFCO0FBQ0E7QUFDTztBQUNQLFNBQVMsaURBQVU7QUFDbkI7QUFDTztBQUNQLFNBQVMsaURBQVU7QUFDbkI7QUFDTztBQUNQLFNBQVMsaURBQVU7QUFDbkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L0NlbGwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9DdXJzb3IuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9EZWZhdWx0TGVnZW5kQ29udGVudC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L0RlZmF1bHRUb29sdGlwQ29udGVudC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L0xhYmVsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvTGFiZWxMaXN0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvTGVnZW5kLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvUmVzcG9uc2l2ZUNvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L1RleHQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9Ub29sdGlwLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvVG9vbHRpcEJvdW5kaW5nQm94LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb250YWluZXIvTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbnRhaW5lci9TdXJmYWNlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb250ZXh0L2NoYXJ0TGF5b3V0Q29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgQ3Jvc3NcbiAqL1xuXG5leHBvcnQgdmFyIENlbGwgPSBmdW5jdGlvbiBDZWxsKF9wcm9wcykge1xuICByZXR1cm4gbnVsbDtcbn07XG5DZWxsLmRpc3BsYXlOYW1lID0gJ0NlbGwnOyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGNyZWF0ZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL3NoYXBlL0N1cnZlJztcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnLi4vc2hhcGUvQ3Jvc3MnO1xuaW1wb3J0IHsgZ2V0Q3Vyc29yUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbC9jdXJzb3IvZ2V0Q3Vyc29yUmVjdGFuZ2xlJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uL3NoYXBlL1JlY3RhbmdsZSc7XG5pbXBvcnQgeyBnZXRSYWRpYWxDdXJzb3JQb2ludHMgfSBmcm9tICcuLi91dGlsL2N1cnNvci9nZXRSYWRpYWxDdXJzb3JQb2ludHMnO1xuaW1wb3J0IHsgU2VjdG9yIH0gZnJvbSAnLi4vc2hhcGUvU2VjdG9yJztcbmltcG9ydCB7IGdldEN1cnNvclBvaW50cyB9IGZyb20gJy4uL3V0aWwvY3Vyc29yL2dldEN1cnNvclBvaW50cyc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG4vKlxuICogQ3Vyc29yIGlzIHRoZSBiYWNrZ3JvdW5kLCBvciBhIGhpZ2hsaWdodCxcbiAqIHRoYXQgc2hvd3Mgd2hlbiB1c2VyIG1vdXNlcyBvdmVyIG9yIGFjdGl2YXRlc1xuICogYW4gYXJlYS5cbiAqXG4gKiBJdCB1c3VhbGx5IHNob3dzIHRvZ2V0aGVyIHdpdGggYSB0b29sdGlwXG4gKiB0byBlbXBoYXNpc2Ugd2hpY2ggcGFydCBvZiB0aGUgY2hhcnQgZG9lcyB0aGUgdG9vbHRpcCByZWZlciB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEN1cnNvcihwcm9wcykge1xuICB2YXIgX2VsZW1lbnQkcHJvcHMkY3Vyc29yLCBfZGVmYXVsdFByb3BzO1xuICB2YXIgZWxlbWVudCA9IHByb3BzLmVsZW1lbnQsXG4gICAgdG9vbHRpcEV2ZW50VHlwZSA9IHByb3BzLnRvb2x0aXBFdmVudFR5cGUsXG4gICAgaXNBY3RpdmUgPSBwcm9wcy5pc0FjdGl2ZSxcbiAgICBhY3RpdmVDb29yZGluYXRlID0gcHJvcHMuYWN0aXZlQ29vcmRpbmF0ZSxcbiAgICBhY3RpdmVQYXlsb2FkID0gcHJvcHMuYWN0aXZlUGF5bG9hZCxcbiAgICBvZmZzZXQgPSBwcm9wcy5vZmZzZXQsXG4gICAgYWN0aXZlVG9vbHRpcEluZGV4ID0gcHJvcHMuYWN0aXZlVG9vbHRpcEluZGV4LFxuICAgIHRvb2x0aXBBeGlzQmFuZFNpemUgPSBwcm9wcy50b29sdGlwQXhpc0JhbmRTaXplLFxuICAgIGxheW91dCA9IHByb3BzLmxheW91dCxcbiAgICBjaGFydE5hbWUgPSBwcm9wcy5jaGFydE5hbWU7XG4gIHZhciBlbGVtZW50UHJvcHNDdXJzb3IgPSAoX2VsZW1lbnQkcHJvcHMkY3Vyc29yID0gZWxlbWVudC5wcm9wcy5jdXJzb3IpICE9PSBudWxsICYmIF9lbGVtZW50JHByb3BzJGN1cnNvciAhPT0gdm9pZCAwID8gX2VsZW1lbnQkcHJvcHMkY3Vyc29yIDogKF9kZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSA9PT0gbnVsbCB8fCBfZGVmYXVsdFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZGVmYXVsdFByb3BzLmN1cnNvcjtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50UHJvcHNDdXJzb3IgfHwgIWlzQWN0aXZlIHx8ICFhY3RpdmVDb29yZGluYXRlIHx8IGNoYXJ0TmFtZSAhPT0gJ1NjYXR0ZXJDaGFydCcgJiYgdG9vbHRpcEV2ZW50VHlwZSAhPT0gJ2F4aXMnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHJlc3RQcm9wcztcbiAgdmFyIGN1cnNvckNvbXAgPSBDdXJ2ZTtcbiAgaWYgKGNoYXJ0TmFtZSA9PT0gJ1NjYXR0ZXJDaGFydCcpIHtcbiAgICByZXN0UHJvcHMgPSBhY3RpdmVDb29yZGluYXRlO1xuICAgIGN1cnNvckNvbXAgPSBDcm9zcztcbiAgfSBlbHNlIGlmIChjaGFydE5hbWUgPT09ICdCYXJDaGFydCcpIHtcbiAgICByZXN0UHJvcHMgPSBnZXRDdXJzb3JSZWN0YW5nbGUobGF5b3V0LCBhY3RpdmVDb29yZGluYXRlLCBvZmZzZXQsIHRvb2x0aXBBeGlzQmFuZFNpemUpO1xuICAgIGN1cnNvckNvbXAgPSBSZWN0YW5nbGU7XG4gIH0gZWxzZSBpZiAobGF5b3V0ID09PSAncmFkaWFsJykge1xuICAgIHZhciBfZ2V0UmFkaWFsQ3Vyc29yUG9pbnQgPSBnZXRSYWRpYWxDdXJzb3JQb2ludHMoYWN0aXZlQ29vcmRpbmF0ZSksXG4gICAgICBjeCA9IF9nZXRSYWRpYWxDdXJzb3JQb2ludC5jeCxcbiAgICAgIGN5ID0gX2dldFJhZGlhbEN1cnNvclBvaW50LmN5LFxuICAgICAgcmFkaXVzID0gX2dldFJhZGlhbEN1cnNvclBvaW50LnJhZGl1cyxcbiAgICAgIHN0YXJ0QW5nbGUgPSBfZ2V0UmFkaWFsQ3Vyc29yUG9pbnQuc3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gX2dldFJhZGlhbEN1cnNvclBvaW50LmVuZEFuZ2xlO1xuICAgIHJlc3RQcm9wcyA9IHtcbiAgICAgIGN4OiBjeCxcbiAgICAgIGN5OiBjeSxcbiAgICAgIHN0YXJ0QW5nbGU6IHN0YXJ0QW5nbGUsXG4gICAgICBlbmRBbmdsZTogZW5kQW5nbGUsXG4gICAgICBpbm5lclJhZGl1czogcmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXM6IHJhZGl1c1xuICAgIH07XG4gICAgY3Vyc29yQ29tcCA9IFNlY3RvcjtcbiAgfSBlbHNlIHtcbiAgICByZXN0UHJvcHMgPSB7XG4gICAgICBwb2ludHM6IGdldEN1cnNvclBvaW50cyhsYXlvdXQsIGFjdGl2ZUNvb3JkaW5hdGUsIG9mZnNldClcbiAgICB9O1xuICAgIGN1cnNvckNvbXAgPSBDdXJ2ZTtcbiAgfVxuICB2YXIgY3Vyc29yUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBzdHJva2U6ICcjY2NjJyxcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgfSwgb2Zmc2V0KSwgcmVzdFByb3BzKSwgZmlsdGVyUHJvcHMoZWxlbWVudFByb3BzQ3Vyc29yLCBmYWxzZSkpLCB7fSwge1xuICAgIHBheWxvYWQ6IGFjdGl2ZVBheWxvYWQsXG4gICAgcGF5bG9hZEluZGV4OiBhY3RpdmVUb29sdGlwSW5kZXgsXG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy10b29sdGlwLWN1cnNvcicsIGVsZW1lbnRQcm9wc0N1cnNvci5jbGFzc05hbWUpXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGVsZW1lbnRQcm9wc0N1cnNvcikgPyAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGVsZW1lbnRQcm9wc0N1cnNvciwgY3Vyc29yUHJvcHMpIDogLyojX19QVVJFX18qL2NyZWF0ZUVsZW1lbnQoY3Vyc29yQ29tcCwgY3Vyc29yUHJvcHMpO1xufSIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgRGVmYXVsdCBMZWdlbmQgQ29udGVudFxuICovXG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL3V0aWwvTG9nVXRpbHMnO1xuaW1wb3J0IHsgU3VyZmFjZSB9IGZyb20gJy4uL2NvbnRhaW5lci9TdXJmYWNlJztcbmltcG9ydCB7IFN5bWJvbHMgfSBmcm9tICcuLi9zaGFwZS9TeW1ib2xzJztcbmltcG9ydCB7IGFkYXB0RXZlbnRzT2ZDaGlsZCB9IGZyb20gJy4uL3V0aWwvdHlwZXMnO1xudmFyIFNJWkUgPSAzMjtcbmV4cG9ydCB2YXIgRGVmYXVsdExlZ2VuZENvbnRlbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIERlZmF1bHRMZWdlbmRDb250ZW50KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEZWZhdWx0TGVnZW5kQ29udGVudCk7XG4gICAgcmV0dXJuIF9jYWxsU3VwZXIodGhpcywgRGVmYXVsdExlZ2VuZENvbnRlbnQsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2luaGVyaXRzKERlZmF1bHRMZWdlbmRDb250ZW50LCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoRGVmYXVsdExlZ2VuZENvbnRlbnQsIFt7XG4gICAga2V5OiBcInJlbmRlckljb25cIixcbiAgICB2YWx1ZTpcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgdGhlIHBhdGggb2YgaWNvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIERhdGEgb2YgZWFjaCBsZWdlbmQgaXRlbVxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUGF0aCBlbGVtZW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVuZGVySWNvbihkYXRhKSB7XG4gICAgICB2YXIgaW5hY3RpdmVDb2xvciA9IHRoaXMucHJvcHMuaW5hY3RpdmVDb2xvcjtcbiAgICAgIHZhciBoYWxmU2l6ZSA9IFNJWkUgLyAyO1xuICAgICAgdmFyIHNpeHRoU2l6ZSA9IFNJWkUgLyA2O1xuICAgICAgdmFyIHRoaXJkU2l6ZSA9IFNJWkUgLyAzO1xuICAgICAgdmFyIGNvbG9yID0gZGF0YS5pbmFjdGl2ZSA/IGluYWN0aXZlQ29sb3IgOiBkYXRhLmNvbG9yO1xuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3BsYWlubGluZScpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGluZVwiLCB7XG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgICAgICBzdHJva2VEYXNoYXJyYXk6IGRhdGEucGF5bG9hZC5zdHJva2VEYXNoYXJyYXksXG4gICAgICAgICAgeDE6IDAsXG4gICAgICAgICAgeTE6IGhhbGZTaXplLFxuICAgICAgICAgIHgyOiBTSVpFLFxuICAgICAgICAgIHkyOiBoYWxmU2l6ZSxcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtbGVnZW5kLWljb25cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdsaW5lJykge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgICBzdHJva2VXaWR0aDogNCxcbiAgICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgICBzdHJva2U6IGNvbG9yLFxuICAgICAgICAgIGQ6IFwiTTAsXCIuY29uY2F0KGhhbGZTaXplLCBcImhcIikuY29uY2F0KHRoaXJkU2l6ZSwgXCJcXG4gICAgICAgICAgICBBXCIpLmNvbmNhdChzaXh0aFNpemUsIFwiLFwiKS5jb25jYXQoc2l4dGhTaXplLCBcIiwwLDEsMSxcIikuY29uY2F0KDIgKiB0aGlyZFNpemUsIFwiLFwiKS5jb25jYXQoaGFsZlNpemUsIFwiXFxuICAgICAgICAgICAgSFwiKS5jb25jYXQoU0laRSwgXCJNXCIpLmNvbmNhdCgyICogdGhpcmRTaXplLCBcIixcIikuY29uY2F0KGhhbGZTaXplLCBcIlxcbiAgICAgICAgICAgIEFcIikuY29uY2F0KHNpeHRoU2l6ZSwgXCIsXCIpLmNvbmNhdChzaXh0aFNpemUsIFwiLDAsMSwxLFwiKS5jb25jYXQodGhpcmRTaXplLCBcIixcIikuY29uY2F0KGhhbGZTaXplKSxcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtbGVnZW5kLWljb25cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdyZWN0Jykge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICAgIGZpbGw6IGNvbG9yLFxuICAgICAgICAgIGQ6IFwiTTAsXCIuY29uY2F0KFNJWkUgLyA4LCBcImhcIikuY29uY2F0KFNJWkUsIFwidlwiKS5jb25jYXQoU0laRSAqIDMgLyA0LCBcImhcIikuY29uY2F0KC1TSVpFLCBcInpcIiksXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWxlZ2VuZC1pY29uXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChkYXRhLmxlZ2VuZEljb24pKSB7XG4gICAgICAgIHZhciBpY29uUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHt9LCBkYXRhKTtcbiAgICAgICAgZGVsZXRlIGljb25Qcm9wcy5sZWdlbmRJY29uO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChkYXRhLmxlZ2VuZEljb24sIGljb25Qcm9wcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ltYm9scywge1xuICAgICAgICBmaWxsOiBjb2xvcixcbiAgICAgICAgY3g6IGhhbGZTaXplLFxuICAgICAgICBjeTogaGFsZlNpemUsXG4gICAgICAgIHNpemU6IFNJWkUsXG4gICAgICAgIHNpemVUeXBlOiBcImRpYW1ldGVyXCIsXG4gICAgICAgIHR5cGU6IGRhdGEudHlwZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBpdGVtcyBvZiBsZWdlbmRcbiAgICAgKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IEl0ZW1zXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVySXRlbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVySXRlbXMoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcGF5bG9hZCA9IF90aGlzJHByb3BzLnBheWxvYWQsXG4gICAgICAgIGljb25TaXplID0gX3RoaXMkcHJvcHMuaWNvblNpemUsXG4gICAgICAgIGxheW91dCA9IF90aGlzJHByb3BzLmxheW91dCxcbiAgICAgICAgZm9ybWF0dGVyID0gX3RoaXMkcHJvcHMuZm9ybWF0dGVyLFxuICAgICAgICBpbmFjdGl2ZUNvbG9yID0gX3RoaXMkcHJvcHMuaW5hY3RpdmVDb2xvcjtcbiAgICAgIHZhciB2aWV3Qm94ID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3aWR0aDogU0laRSxcbiAgICAgICAgaGVpZ2h0OiBTSVpFXG4gICAgICB9O1xuICAgICAgdmFyIGl0ZW1TdHlsZSA9IHtcbiAgICAgICAgZGlzcGxheTogbGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgPyAnaW5saW5lLWJsb2NrJyA6ICdibG9jaycsXG4gICAgICAgIG1hcmdpblJpZ2h0OiAxMFxuICAgICAgfTtcbiAgICAgIHZhciBzdmdTdHlsZSA9IHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICBtYXJnaW5SaWdodDogNFxuICAgICAgfTtcbiAgICAgIHJldHVybiBwYXlsb2FkLm1hcChmdW5jdGlvbiAoZW50cnksIGkpIHtcbiAgICAgICAgdmFyIGZpbmFsRm9ybWF0dGVyID0gZW50cnkuZm9ybWF0dGVyIHx8IGZvcm1hdHRlcjtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsc3goX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgICAgJ3JlY2hhcnRzLWxlZ2VuZC1pdGVtJzogdHJ1ZVxuICAgICAgICB9LCBcImxlZ2VuZC1pdGVtLVwiLmNvbmNhdChpKSwgdHJ1ZSksIFwiaW5hY3RpdmVcIiwgZW50cnkuaW5hY3RpdmUpKTtcbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdub25lJykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IHJlbmRlciBlbnRyeS52YWx1ZSBhcyBmdW5jdGlvbnMuIEFsd2F5cyByZXF1aXJlIHN0YXRpYyBzdHJpbmcgcHJvcGVydGllcy5cbiAgICAgICAgdmFyIGVudHJ5VmFsdWUgPSAhaXNGdW5jdGlvbihlbnRyeS52YWx1ZSkgPyBlbnRyeS52YWx1ZSA6IG51bGw7XG4gICAgICAgIHdhcm4oIWlzRnVuY3Rpb24oZW50cnkudmFsdWUpLCBcIlRoZSBuYW1lIHByb3BlcnR5IGlzIGFsc28gcmVxdWlyZWQgd2hlbiB1c2luZyBhIGZ1bmN0aW9uIGZvciB0aGUgZGF0YUtleSBvZiBhIGNoYXJ0J3MgY2FydGVzaWFuIGNvbXBvbmVudHMuIEV4OiA8QmFyIG5hbWU9XFxcIk5hbWUgb2YgbXkgRGF0YVxcXCIvPlwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICAgICAgICApO1xuICAgICAgICB2YXIgY29sb3IgPSBlbnRyeS5pbmFjdGl2ZSA/IGluYWN0aXZlQ29sb3IgOiBlbnRyeS5jb2xvcjtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2V4dGVuZHMoe1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBpdGVtU3R5bGVcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgICAgLFxuICAgICAgICAgIGtleTogXCJsZWdlbmQtaXRlbS1cIi5jb25jYXQoaSlcbiAgICAgICAgfSwgYWRhcHRFdmVudHNPZkNoaWxkKF90aGlzLnByb3BzLCBlbnRyeSwgaSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdXJmYWNlLCB7XG4gICAgICAgICAgd2lkdGg6IGljb25TaXplLFxuICAgICAgICAgIGhlaWdodDogaWNvblNpemUsXG4gICAgICAgICAgdmlld0JveDogdmlld0JveCxcbiAgICAgICAgICBzdHlsZTogc3ZnU3R5bGVcbiAgICAgICAgfSwgX3RoaXMucmVuZGVySWNvbihlbnRyeSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1sZWdlbmQtaXRlbS10ZXh0XCIsXG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfSwgZmluYWxGb3JtYXR0ZXIgPyBmaW5hbEZvcm1hdHRlcihlbnRyeVZhbHVlLCBlbnRyeSwgaSkgOiBlbnRyeVZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBwYXlsb2FkID0gX3RoaXMkcHJvcHMyLnBheWxvYWQsXG4gICAgICAgIGxheW91dCA9IF90aGlzJHByb3BzMi5sYXlvdXQsXG4gICAgICAgIGFsaWduID0gX3RoaXMkcHJvcHMyLmFsaWduO1xuICAgICAgaWYgKCFwYXlsb2FkIHx8ICFwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBmaW5hbFN0eWxlID0ge1xuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIHRleHRBbGlnbjogbGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgPyBhbGlnbiA6ICdsZWZ0J1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWRlZmF1bHQtbGVnZW5kXCIsXG4gICAgICAgIHN0eWxlOiBmaW5hbFN0eWxlXG4gICAgICB9LCB0aGlzLnJlbmRlckl0ZW1zKCkpO1xuICAgIH1cbiAgfV0pO1xufShQdXJlQ29tcG9uZW50KTtcbl9kZWZpbmVQcm9wZXJ0eShEZWZhdWx0TGVnZW5kQ29udGVudCwgXCJkaXNwbGF5TmFtZVwiLCAnTGVnZW5kJyk7XG5fZGVmaW5lUHJvcGVydHkoRGVmYXVsdExlZ2VuZENvbnRlbnQsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgaWNvblNpemU6IDE0LFxuICBsYXlvdXQ6ICdob3Jpem9udGFsJyxcbiAgYWxpZ246ICdjZW50ZXInLFxuICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgaW5hY3RpdmVDb2xvcjogJyNjY2MnXG59KTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBEZWZhdWx0IFRvb2x0aXAgQ29udGVudFxuICovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc29ydEJ5IGZyb20gJ2xvZGFzaC9zb3J0QnknO1xuaW1wb3J0IGlzTmlsIGZyb20gJ2xvZGFzaC9pc05pbCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGlzTnVtT3JTdHIgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5mdW5jdGlvbiBkZWZhdWx0Rm9ybWF0dGVyKHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBpc051bU9yU3RyKHZhbHVlWzBdKSAmJiBpc051bU9yU3RyKHZhbHVlWzFdKSA/IHZhbHVlLmpvaW4oJyB+ICcpIDogdmFsdWU7XG59XG5leHBvcnQgdmFyIERlZmF1bHRUb29sdGlwQ29udGVudCA9IGZ1bmN0aW9uIERlZmF1bHRUb29sdGlwQ29udGVudChwcm9wcykge1xuICB2YXIgX3Byb3BzJHNlcGFyYXRvciA9IHByb3BzLnNlcGFyYXRvcixcbiAgICBzZXBhcmF0b3IgPSBfcHJvcHMkc2VwYXJhdG9yID09PSB2b2lkIDAgPyAnIDogJyA6IF9wcm9wcyRzZXBhcmF0b3IsXG4gICAgX3Byb3BzJGNvbnRlbnRTdHlsZSA9IHByb3BzLmNvbnRlbnRTdHlsZSxcbiAgICBjb250ZW50U3R5bGUgPSBfcHJvcHMkY29udGVudFN0eWxlID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRjb250ZW50U3R5bGUsXG4gICAgX3Byb3BzJGl0ZW1TdHlsZSA9IHByb3BzLml0ZW1TdHlsZSxcbiAgICBpdGVtU3R5bGUgPSBfcHJvcHMkaXRlbVN0eWxlID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRpdGVtU3R5bGUsXG4gICAgX3Byb3BzJGxhYmVsU3R5bGUgPSBwcm9wcy5sYWJlbFN0eWxlLFxuICAgIGxhYmVsU3R5bGUgPSBfcHJvcHMkbGFiZWxTdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbGFiZWxTdHlsZSxcbiAgICBwYXlsb2FkID0gcHJvcHMucGF5bG9hZCxcbiAgICBmb3JtYXR0ZXIgPSBwcm9wcy5mb3JtYXR0ZXIsXG4gICAgaXRlbVNvcnRlciA9IHByb3BzLml0ZW1Tb3J0ZXIsXG4gICAgd3JhcHBlckNsYXNzTmFtZSA9IHByb3BzLndyYXBwZXJDbGFzc05hbWUsXG4gICAgbGFiZWxDbGFzc05hbWUgPSBwcm9wcy5sYWJlbENsYXNzTmFtZSxcbiAgICBsYWJlbCA9IHByb3BzLmxhYmVsLFxuICAgIGxhYmVsRm9ybWF0dGVyID0gcHJvcHMubGFiZWxGb3JtYXR0ZXIsXG4gICAgX3Byb3BzJGFjY2Vzc2liaWxpdHlMID0gcHJvcHMuYWNjZXNzaWJpbGl0eUxheWVyLFxuICAgIGFjY2Vzc2liaWxpdHlMYXllciA9IF9wcm9wcyRhY2Nlc3NpYmlsaXR5TCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkYWNjZXNzaWJpbGl0eUw7XG4gIHZhciByZW5kZXJDb250ZW50ID0gZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgdmFyIGxpc3RTdHlsZSA9IHtcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgbWFyZ2luOiAwXG4gICAgICB9O1xuICAgICAgdmFyIGl0ZW1zID0gKGl0ZW1Tb3J0ZXIgPyBzb3J0QnkocGF5bG9hZCwgaXRlbVNvcnRlcikgOiBwYXlsb2FkKS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmluYWxJdGVtU3R5bGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgIHBhZGRpbmdUb3A6IDQsXG4gICAgICAgICAgcGFkZGluZ0JvdHRvbTogNCxcbiAgICAgICAgICBjb2xvcjogZW50cnkuY29sb3IgfHwgJyMwMDAnXG4gICAgICAgIH0sIGl0ZW1TdHlsZSk7XG4gICAgICAgIHZhciBmaW5hbEZvcm1hdHRlciA9IGVudHJ5LmZvcm1hdHRlciB8fCBmb3JtYXR0ZXIgfHwgZGVmYXVsdEZvcm1hdHRlcjtcbiAgICAgICAgdmFyIHZhbHVlID0gZW50cnkudmFsdWUsXG4gICAgICAgICAgbmFtZSA9IGVudHJ5Lm5hbWU7XG4gICAgICAgIHZhciBmaW5hbFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBmaW5hbE5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAoZmluYWxGb3JtYXR0ZXIgJiYgZmluYWxWYWx1ZSAhPSBudWxsICYmIGZpbmFsTmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IGZpbmFsRm9ybWF0dGVyKHZhbHVlLCBuYW1lLCBlbnRyeSwgaSwgcGF5bG9hZCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgdmFyIF9mb3JtYXR0ZWQgPSBfc2xpY2VkVG9BcnJheShmb3JtYXR0ZWQsIDIpO1xuICAgICAgICAgICAgZmluYWxWYWx1ZSA9IF9mb3JtYXR0ZWRbMF07XG4gICAgICAgICAgICBmaW5hbE5hbWUgPSBfZm9ybWF0dGVkWzFdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFZhbHVlID0gZm9ybWF0dGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy10b29sdGlwLWl0ZW1cIixcbiAgICAgICAgICAgIGtleTogXCJ0b29sdGlwLWl0ZW0tXCIuY29uY2F0KGkpLFxuICAgICAgICAgICAgc3R5bGU6IGZpbmFsSXRlbVN0eWxlXG4gICAgICAgICAgfSwgaXNOdW1PclN0cihmaW5hbE5hbWUpID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy10b29sdGlwLWl0ZW0tbmFtZVwiXG4gICAgICAgICAgfSwgZmluYWxOYW1lKSA6IG51bGwsIGlzTnVtT3JTdHIoZmluYWxOYW1lKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtdG9vbHRpcC1pdGVtLXNlcGFyYXRvclwiXG4gICAgICAgICAgfSwgc2VwYXJhdG9yKSA6IG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtdG9vbHRpcC1pdGVtLXZhbHVlXCJcbiAgICAgICAgICB9LCBmaW5hbFZhbHVlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy10b29sdGlwLWl0ZW0tdW5pdFwiXG4gICAgICAgICAgfSwgZW50cnkudW5pdCB8fCAnJykpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXRvb2x0aXAtaXRlbS1saXN0XCIsXG4gICAgICAgIHN0eWxlOiBsaXN0U3R5bGVcbiAgICAgIH0sIGl0ZW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIHZhciBmaW5hbFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDEwLFxuICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmYnLFxuICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJ1xuICB9LCBjb250ZW50U3R5bGUpO1xuICB2YXIgZmluYWxMYWJlbFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgbWFyZ2luOiAwXG4gIH0sIGxhYmVsU3R5bGUpO1xuICB2YXIgaGFzTGFiZWwgPSAhaXNOaWwobGFiZWwpO1xuICB2YXIgZmluYWxMYWJlbCA9IGhhc0xhYmVsID8gbGFiZWwgOiAnJztcbiAgdmFyIHdyYXBwZXJDTiA9IGNsc3goJ3JlY2hhcnRzLWRlZmF1bHQtdG9vbHRpcCcsIHdyYXBwZXJDbGFzc05hbWUpO1xuICB2YXIgbGFiZWxDTiA9IGNsc3goJ3JlY2hhcnRzLXRvb2x0aXAtbGFiZWwnLCBsYWJlbENsYXNzTmFtZSk7XG4gIGlmIChoYXNMYWJlbCAmJiBsYWJlbEZvcm1hdHRlciAmJiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIGZpbmFsTGFiZWwgPSBsYWJlbEZvcm1hdHRlcihsYWJlbCwgcGF5bG9hZCk7XG4gIH1cbiAgdmFyIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVzID0gYWNjZXNzaWJpbGl0eUxheWVyID8ge1xuICAgIHJvbGU6ICdzdGF0dXMnLFxuICAgICdhcmlhLWxpdmUnOiAnYXNzZXJ0aXZlJ1xuICB9IDoge307XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ04sXG4gICAgc3R5bGU6IGZpbmFsU3R5bGVcbiAgfSwgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZXMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBcIiwge1xuICAgIGNsYXNzTmFtZTogbGFiZWxDTixcbiAgICBzdHlsZTogZmluYWxMYWJlbFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChmaW5hbExhYmVsKSA/IGZpbmFsTGFiZWwgOiBcIlwiLmNvbmNhdChmaW5hbExhYmVsKSksIHJlbmRlckNvbnRlbnQoKSk7XG59OyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbnZhciBfZXhjbHVkZWQgPSBbXCJvZmZzZXRcIl07XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCBSZWFjdCwgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50LCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzTmlsIGZyb20gJ2xvZGFzaC9pc05pbCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnbG9kYXNoL2lzT2JqZWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4vVGV4dCc7XG5pbXBvcnQgeyBmaW5kQWxsQnlUeXBlLCBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5pbXBvcnQgeyBpc051bU9yU3RyLCBpc051bWJlciwgaXNQZXJjZW50LCBnZXRQZXJjZW50VmFsdWUsIHVuaXF1ZUlkLCBtYXRoU2lnbiB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IHBvbGFyVG9DYXJ0ZXNpYW4gfSBmcm9tICcuLi91dGlsL1BvbGFyVXRpbHMnO1xudmFyIGdldExhYmVsID0gZnVuY3Rpb24gZ2V0TGFiZWwocHJvcHMpIHtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZm9ybWF0dGVyID0gcHJvcHMuZm9ybWF0dGVyO1xuICB2YXIgbGFiZWwgPSBpc05pbChwcm9wcy5jaGlsZHJlbikgPyB2YWx1ZSA6IHByb3BzLmNoaWxkcmVuO1xuICBpZiAoaXNGdW5jdGlvbihmb3JtYXR0ZXIpKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlcihsYWJlbCk7XG4gIH1cbiAgcmV0dXJuIGxhYmVsO1xufTtcbnZhciBnZXREZWx0YUFuZ2xlID0gZnVuY3Rpb24gZ2V0RGVsdGFBbmdsZShzdGFydEFuZ2xlLCBlbmRBbmdsZSkge1xuICB2YXIgc2lnbiA9IG1hdGhTaWduKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSk7XG4gIHZhciBkZWx0YUFuZ2xlID0gTWF0aC5taW4oTWF0aC5hYnMoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSwgMzYwKTtcbiAgcmV0dXJuIHNpZ24gKiBkZWx0YUFuZ2xlO1xufTtcbnZhciByZW5kZXJSYWRpYWxMYWJlbCA9IGZ1bmN0aW9uIHJlbmRlclJhZGlhbExhYmVsKGxhYmVsUHJvcHMsIGxhYmVsLCBhdHRycykge1xuICB2YXIgcG9zaXRpb24gPSBsYWJlbFByb3BzLnBvc2l0aW9uLFxuICAgIHZpZXdCb3ggPSBsYWJlbFByb3BzLnZpZXdCb3gsXG4gICAgb2Zmc2V0ID0gbGFiZWxQcm9wcy5vZmZzZXQsXG4gICAgY2xhc3NOYW1lID0gbGFiZWxQcm9wcy5jbGFzc05hbWU7XG4gIHZhciBfcmVmID0gdmlld0JveCxcbiAgICBjeCA9IF9yZWYuY3gsXG4gICAgY3kgPSBfcmVmLmN5LFxuICAgIGlubmVyUmFkaXVzID0gX3JlZi5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IF9yZWYub3V0ZXJSYWRpdXMsXG4gICAgc3RhcnRBbmdsZSA9IF9yZWYuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IF9yZWYuZW5kQW5nbGUsXG4gICAgY2xvY2tXaXNlID0gX3JlZi5jbG9ja1dpc2U7XG4gIHZhciByYWRpdXMgPSAoaW5uZXJSYWRpdXMgKyBvdXRlclJhZGl1cykgLyAyO1xuICB2YXIgZGVsdGFBbmdsZSA9IGdldERlbHRhQW5nbGUoc3RhcnRBbmdsZSwgZW5kQW5nbGUpO1xuICB2YXIgc2lnbiA9IGRlbHRhQW5nbGUgPj0gMCA/IDEgOiAtMTtcbiAgdmFyIGxhYmVsQW5nbGUsIGRpcmVjdGlvbjtcbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlU3RhcnQnKSB7XG4gICAgbGFiZWxBbmdsZSA9IHN0YXJ0QW5nbGUgKyBzaWduICogb2Zmc2V0O1xuICAgIGRpcmVjdGlvbiA9IGNsb2NrV2lzZTtcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZUVuZCcpIHtcbiAgICBsYWJlbEFuZ2xlID0gZW5kQW5nbGUgLSBzaWduICogb2Zmc2V0O1xuICAgIGRpcmVjdGlvbiA9ICFjbG9ja1dpc2U7XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdlbmQnKSB7XG4gICAgbGFiZWxBbmdsZSA9IGVuZEFuZ2xlICsgc2lnbiAqIG9mZnNldDtcbiAgICBkaXJlY3Rpb24gPSBjbG9ja1dpc2U7XG4gIH1cbiAgZGlyZWN0aW9uID0gZGVsdGFBbmdsZSA8PSAwID8gZGlyZWN0aW9uIDogIWRpcmVjdGlvbjtcbiAgdmFyIHN0YXJ0UG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgcmFkaXVzLCBsYWJlbEFuZ2xlKTtcbiAgdmFyIGVuZFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIHJhZGl1cywgbGFiZWxBbmdsZSArIChkaXJlY3Rpb24gPyAxIDogLTEpICogMzU5KTtcbiAgdmFyIHBhdGggPSBcIk1cIi5jb25jYXQoc3RhcnRQb2ludC54LCBcIixcIikuY29uY2F0KHN0YXJ0UG9pbnQueSwgXCJcXG4gICAgQVwiKS5jb25jYXQocmFkaXVzLCBcIixcIikuY29uY2F0KHJhZGl1cywgXCIsMCwxLFwiKS5jb25jYXQoZGlyZWN0aW9uID8gMCA6IDEsIFwiLFxcbiAgICBcIikuY29uY2F0KGVuZFBvaW50LngsIFwiLFwiKS5jb25jYXQoZW5kUG9pbnQueSk7XG4gIHZhciBpZCA9IGlzTmlsKGxhYmVsUHJvcHMuaWQpID8gdW5pcXVlSWQoJ3JlY2hhcnRzLXJhZGlhbC1saW5lLScpIDogbGFiZWxQcm9wcy5pZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dFwiLCBfZXh0ZW5kcyh7fSwgYXR0cnMsIHtcbiAgICBkb21pbmFudEJhc2VsaW5lOiBcImNlbnRyYWxcIixcbiAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLXJhZGlhbC1iYXItbGFiZWwnLCBjbGFzc05hbWUpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBpZDogaWQsXG4gICAgZDogcGF0aFxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dFBhdGhcIiwge1xuICAgIHhsaW5rSHJlZjogXCIjXCIuY29uY2F0KGlkKVxuICB9LCBsYWJlbCkpO1xufTtcbnZhciBnZXRBdHRyc09mUG9sYXJMYWJlbCA9IGZ1bmN0aW9uIGdldEF0dHJzT2ZQb2xhckxhYmVsKHByb3BzKSB7XG4gIHZhciB2aWV3Qm94ID0gcHJvcHMudmlld0JveCxcbiAgICBvZmZzZXQgPSBwcm9wcy5vZmZzZXQsXG4gICAgcG9zaXRpb24gPSBwcm9wcy5wb3NpdGlvbjtcbiAgdmFyIF9yZWYyID0gdmlld0JveCxcbiAgICBjeCA9IF9yZWYyLmN4LFxuICAgIGN5ID0gX3JlZjIuY3ksXG4gICAgaW5uZXJSYWRpdXMgPSBfcmVmMi5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IF9yZWYyLm91dGVyUmFkaXVzLFxuICAgIHN0YXJ0QW5nbGUgPSBfcmVmMi5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gX3JlZjIuZW5kQW5nbGU7XG4gIHZhciBtaWRBbmdsZSA9IChzdGFydEFuZ2xlICsgZW5kQW5nbGUpIC8gMjtcbiAgaWYgKHBvc2l0aW9uID09PSAnb3V0c2lkZScpIHtcbiAgICB2YXIgX3BvbGFyVG9DYXJ0ZXNpYW4gPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgb3V0ZXJSYWRpdXMgKyBvZmZzZXQsIG1pZEFuZ2xlKSxcbiAgICAgIF94ID0gX3BvbGFyVG9DYXJ0ZXNpYW4ueCxcbiAgICAgIF95ID0gX3BvbGFyVG9DYXJ0ZXNpYW4ueTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogX3gsXG4gICAgICB5OiBfeSxcbiAgICAgIHRleHRBbmNob3I6IF94ID49IGN4ID8gJ3N0YXJ0JyA6ICdlbmQnLFxuICAgICAgdmVydGljYWxBbmNob3I6ICdtaWRkbGUnXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGN4LFxuICAgICAgeTogY3ksXG4gICAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyVG9wJykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjeCxcbiAgICAgIHk6IGN5LFxuICAgICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogJ3N0YXJ0J1xuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyQm90dG9tJykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjeCxcbiAgICAgIHk6IGN5LFxuICAgICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogJ2VuZCdcbiAgICB9O1xuICB9XG4gIHZhciByID0gKGlubmVyUmFkaXVzICsgb3V0ZXJSYWRpdXMpIC8gMjtcbiAgdmFyIF9wb2xhclRvQ2FydGVzaWFuMiA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCByLCBtaWRBbmdsZSksXG4gICAgeCA9IF9wb2xhclRvQ2FydGVzaWFuMi54LFxuICAgIHkgPSBfcG9sYXJUb0NhcnRlc2lhbjIueTtcbiAgcmV0dXJuIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgdmVydGljYWxBbmNob3I6ICdtaWRkbGUnXG4gIH07XG59O1xudmFyIGdldEF0dHJzT2ZDYXJ0ZXNpYW5MYWJlbCA9IGZ1bmN0aW9uIGdldEF0dHJzT2ZDYXJ0ZXNpYW5MYWJlbChwcm9wcykge1xuICB2YXIgdmlld0JveCA9IHByb3BzLnZpZXdCb3gsXG4gICAgcGFyZW50Vmlld0JveCA9IHByb3BzLnBhcmVudFZpZXdCb3gsXG4gICAgb2Zmc2V0ID0gcHJvcHMub2Zmc2V0LFxuICAgIHBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gIHZhciBfcmVmMyA9IHZpZXdCb3gsXG4gICAgeCA9IF9yZWYzLngsXG4gICAgeSA9IF9yZWYzLnksXG4gICAgd2lkdGggPSBfcmVmMy53aWR0aCxcbiAgICBoZWlnaHQgPSBfcmVmMy5oZWlnaHQ7XG5cbiAgLy8gRGVmaW5lIHZlcnRpY2FsIG9mZnNldHMgYW5kIHBvc2l0aW9uIGludmVydHMgYmFzZWQgb24gdGhlIHZhbHVlIGJlaW5nIHBvc2l0aXZlIG9yIG5lZ2F0aXZlXG4gIHZhciB2ZXJ0aWNhbFNpZ24gPSBoZWlnaHQgPj0gMCA/IDEgOiAtMTtcbiAgdmFyIHZlcnRpY2FsT2Zmc2V0ID0gdmVydGljYWxTaWduICogb2Zmc2V0O1xuICB2YXIgdmVydGljYWxFbmQgPSB2ZXJ0aWNhbFNpZ24gPiAwID8gJ2VuZCcgOiAnc3RhcnQnO1xuICB2YXIgdmVydGljYWxTdGFydCA9IHZlcnRpY2FsU2lnbiA+IDAgPyAnc3RhcnQnIDogJ2VuZCc7XG5cbiAgLy8gRGVmaW5lIGhvcml6b250YWwgb2Zmc2V0cyBhbmQgcG9zaXRpb24gaW52ZXJ0cyBiYXNlZCBvbiB0aGUgdmFsdWUgYmVpbmcgcG9zaXRpdmUgb3IgbmVnYXRpdmVcbiAgdmFyIGhvcml6b250YWxTaWduID0gd2lkdGggPj0gMCA/IDEgOiAtMTtcbiAgdmFyIGhvcml6b250YWxPZmZzZXQgPSBob3Jpem9udGFsU2lnbiAqIG9mZnNldDtcbiAgdmFyIGhvcml6b250YWxFbmQgPSBob3Jpem9udGFsU2lnbiA+IDAgPyAnZW5kJyA6ICdzdGFydCc7XG4gIHZhciBob3Jpem9udGFsU3RhcnQgPSBob3Jpem9udGFsU2lnbiA+IDAgPyAnc3RhcnQnIDogJ2VuZCc7XG4gIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICB2YXIgYXR0cnMgPSB7XG4gICAgICB4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgeTogeSAtIHZlcnRpY2FsU2lnbiAqIG9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsRW5kXG4gICAgfTtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhdHRycyksIHBhcmVudFZpZXdCb3ggPyB7XG4gICAgICBoZWlnaHQ6IE1hdGgubWF4KHkgLSBwYXJlbnRWaWV3Qm94LnksIDApLFxuICAgICAgd2lkdGg6IHdpZHRoXG4gICAgfSA6IHt9KTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgdmFyIF9hdHRycyA9IHtcbiAgICAgIHg6IHggKyB3aWR0aCAvIDIsXG4gICAgICB5OiB5ICsgaGVpZ2h0ICsgdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbFN0YXJ0XG4gICAgfTtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfYXR0cnMpLCBwYXJlbnRWaWV3Qm94ID8ge1xuICAgICAgaGVpZ2h0OiBNYXRoLm1heChwYXJlbnRWaWV3Qm94LnkgKyBwYXJlbnRWaWV3Qm94LmhlaWdodCAtICh5ICsgaGVpZ2h0KSwgMCksXG4gICAgICB3aWR0aDogd2lkdGhcbiAgICB9IDoge30pO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgdmFyIF9hdHRyczIgPSB7XG4gICAgICB4OiB4IC0gaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyBoZWlnaHQgLyAyLFxuICAgICAgdGV4dEFuY2hvcjogaG9yaXpvbnRhbEVuZCxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH07XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX2F0dHJzMiksIHBhcmVudFZpZXdCb3ggPyB7XG4gICAgICB3aWR0aDogTWF0aC5tYXgoX2F0dHJzMi54IC0gcGFyZW50Vmlld0JveC54LCAwKSxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSA6IHt9KTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICB2YXIgX2F0dHJzMyA9IHtcbiAgICAgIHg6IHggKyB3aWR0aCArIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxTdGFydCxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH07XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX2F0dHJzMyksIHBhcmVudFZpZXdCb3ggPyB7XG4gICAgICB3aWR0aDogTWF0aC5tYXgocGFyZW50Vmlld0JveC54ICsgcGFyZW50Vmlld0JveC53aWR0aCAtIF9hdHRyczMueCwgMCksXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0gOiB7fSk7XG4gIH1cbiAgdmFyIHNpemVBdHRycyA9IHBhcmVudFZpZXdCb3ggPyB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0gOiB7fTtcbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlTGVmdCcpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICB4OiB4ICsgaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyBoZWlnaHQgLyAyLFxuICAgICAgdGV4dEFuY2hvcjogaG9yaXpvbnRhbFN0YXJ0LFxuICAgICAgdmVydGljYWxBbmNob3I6ICdtaWRkbGUnXG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdpbnNpZGVSaWdodCcpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICB4OiB4ICsgd2lkdGggLSBob3Jpem9udGFsT2Zmc2V0LFxuICAgICAgeTogeSArIGhlaWdodCAvIDIsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsRW5kLFxuICAgICAgdmVydGljYWxBbmNob3I6ICdtaWRkbGUnXG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdpbnNpZGVUb3AnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIHdpZHRoIC8gMixcbiAgICAgIHk6IHkgKyB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsU3RhcnRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZUJvdHRvbScpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICB4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgeTogeSArIGhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxFbmRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZVRvcExlZnQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsU3RhcnQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxTdGFydFxuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlVG9wUmlnaHQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIHdpZHRoIC0gaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxFbmQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxTdGFydFxuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlQm90dG9tTGVmdCcpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICB4OiB4ICsgaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyBoZWlnaHQgLSB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxTdGFydCxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbEVuZFxuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlQm90dG9tUmlnaHQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIHdpZHRoIC0gaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyBoZWlnaHQgLSB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxFbmQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxFbmRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChpc09iamVjdChwb3NpdGlvbikgJiYgKGlzTnVtYmVyKHBvc2l0aW9uLngpIHx8IGlzUGVyY2VudChwb3NpdGlvbi54KSkgJiYgKGlzTnVtYmVyKHBvc2l0aW9uLnkpIHx8IGlzUGVyY2VudChwb3NpdGlvbi55KSkpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICB4OiB4ICsgZ2V0UGVyY2VudFZhbHVlKHBvc2l0aW9uLngsIHdpZHRoKSxcbiAgICAgIHk6IHkgKyBnZXRQZXJjZW50VmFsdWUocG9zaXRpb24ueSwgaGVpZ2h0KSxcbiAgICAgIHRleHRBbmNob3I6ICdlbmQnLFxuICAgICAgdmVydGljYWxBbmNob3I6ICdlbmQnXG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgeDogeCArIHdpZHRoIC8gMixcbiAgICB5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICB2ZXJ0aWNhbEFuY2hvcjogJ21pZGRsZSdcbiAgfSwgc2l6ZUF0dHJzKTtcbn07XG52YXIgaXNQb2xhciA9IGZ1bmN0aW9uIGlzUG9sYXIodmlld0JveCkge1xuICByZXR1cm4gJ2N4JyBpbiB2aWV3Qm94ICYmIGlzTnVtYmVyKHZpZXdCb3guY3gpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBMYWJlbChfcmVmNCkge1xuICB2YXIgX3JlZjQkb2Zmc2V0ID0gX3JlZjQub2Zmc2V0LFxuICAgIG9mZnNldCA9IF9yZWY0JG9mZnNldCA9PT0gdm9pZCAwID8gNSA6IF9yZWY0JG9mZnNldCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjQsIF9leGNsdWRlZCk7XG4gIHZhciBwcm9wcyA9IF9vYmplY3RTcHJlYWQoe1xuICAgIG9mZnNldDogb2Zmc2V0XG4gIH0sIHJlc3RQcm9wcyk7XG4gIHZhciB2aWV3Qm94ID0gcHJvcHMudmlld0JveCxcbiAgICBwb3NpdGlvbiA9IHByb3BzLnBvc2l0aW9uLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICBfcHJvcHMkY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZSxcbiAgICB0ZXh0QnJlYWtBbGwgPSBwcm9wcy50ZXh0QnJlYWtBbGw7XG4gIGlmICghdmlld0JveCB8fCBpc05pbCh2YWx1ZSkgJiYgaXNOaWwoY2hpbGRyZW4pICYmICEgLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGNvbnRlbnQpICYmICFpc0Z1bmN0aW9uKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQoY29udGVudCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjb250ZW50LCBwcm9wcyk7XG4gIH1cbiAgdmFyIGxhYmVsO1xuICBpZiAoaXNGdW5jdGlvbihjb250ZW50KSkge1xuICAgIGxhYmVsID0gLyojX19QVVJFX18qL2NyZWF0ZUVsZW1lbnQoY29udGVudCwgcHJvcHMpO1xuICAgIGlmICggLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGxhYmVsKSkge1xuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsYWJlbCA9IGdldExhYmVsKHByb3BzKTtcbiAgfVxuICB2YXIgaXNQb2xhckxhYmVsID0gaXNQb2xhcih2aWV3Qm94KTtcbiAgdmFyIGF0dHJzID0gZmlsdGVyUHJvcHMocHJvcHMsIHRydWUpO1xuICBpZiAoaXNQb2xhckxhYmVsICYmIChwb3NpdGlvbiA9PT0gJ2luc2lkZVN0YXJ0JyB8fCBwb3NpdGlvbiA9PT0gJ2luc2lkZUVuZCcgfHwgcG9zaXRpb24gPT09ICdlbmQnKSkge1xuICAgIHJldHVybiByZW5kZXJSYWRpYWxMYWJlbChwcm9wcywgbGFiZWwsIGF0dHJzKTtcbiAgfVxuICB2YXIgcG9zaXRpb25BdHRycyA9IGlzUG9sYXJMYWJlbCA/IGdldEF0dHJzT2ZQb2xhckxhYmVsKHByb3BzKSA6IGdldEF0dHJzT2ZDYXJ0ZXNpYW5MYWJlbChwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1sYWJlbCcsIGNsYXNzTmFtZSlcbiAgfSwgYXR0cnMsIHBvc2l0aW9uQXR0cnMsIHtcbiAgICBicmVha0FsbDogdGV4dEJyZWFrQWxsXG4gIH0pLCBsYWJlbCk7XG59XG5MYWJlbC5kaXNwbGF5TmFtZSA9ICdMYWJlbCc7XG52YXIgcGFyc2VWaWV3Qm94ID0gZnVuY3Rpb24gcGFyc2VWaWV3Qm94KHByb3BzKSB7XG4gIHZhciBjeCA9IHByb3BzLmN4LFxuICAgIGN5ID0gcHJvcHMuY3ksXG4gICAgYW5nbGUgPSBwcm9wcy5hbmdsZSxcbiAgICBzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IHByb3BzLmVuZEFuZ2xlLFxuICAgIHIgPSBwcm9wcy5yLFxuICAgIHJhZGl1cyA9IHByb3BzLnJhZGl1cyxcbiAgICBpbm5lclJhZGl1cyA9IHByb3BzLmlubmVyUmFkaXVzLFxuICAgIG91dGVyUmFkaXVzID0gcHJvcHMub3V0ZXJSYWRpdXMsXG4gICAgeCA9IHByb3BzLngsXG4gICAgeSA9IHByb3BzLnksXG4gICAgdG9wID0gcHJvcHMudG9wLFxuICAgIGxlZnQgPSBwcm9wcy5sZWZ0LFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGNsb2NrV2lzZSA9IHByb3BzLmNsb2NrV2lzZSxcbiAgICBsYWJlbFZpZXdCb3ggPSBwcm9wcy5sYWJlbFZpZXdCb3g7XG4gIGlmIChsYWJlbFZpZXdCb3gpIHtcbiAgICByZXR1cm4gbGFiZWxWaWV3Qm94O1xuICB9XG4gIGlmIChpc051bWJlcih3aWR0aCkgJiYgaXNOdW1iZXIoaGVpZ2h0KSkge1xuICAgIGlmIChpc051bWJlcih4KSAmJiBpc051bWJlcih5KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKHRvcCkgJiYgaXNOdW1iZXIobGVmdCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRvcCxcbiAgICAgICAgeTogbGVmdCxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHgpICYmIGlzTnVtYmVyKHkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5LFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICB9XG4gIGlmIChpc051bWJlcihjeCkgJiYgaXNOdW1iZXIoY3kpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN4OiBjeCxcbiAgICAgIGN5OiBjeSxcbiAgICAgIHN0YXJ0QW5nbGU6IHN0YXJ0QW5nbGUgfHwgYW5nbGUgfHwgMCxcbiAgICAgIGVuZEFuZ2xlOiBlbmRBbmdsZSB8fCBhbmdsZSB8fCAwLFxuICAgICAgaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzIHx8IDAsXG4gICAgICBvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMgfHwgcmFkaXVzIHx8IHIgfHwgMCxcbiAgICAgIGNsb2NrV2lzZTogY2xvY2tXaXNlXG4gICAgfTtcbiAgfVxuICBpZiAocHJvcHMudmlld0JveCkge1xuICAgIHJldHVybiBwcm9wcy52aWV3Qm94O1xuICB9XG4gIHJldHVybiB7fTtcbn07XG52YXIgcGFyc2VMYWJlbCA9IGZ1bmN0aW9uIHBhcnNlTGFiZWwobGFiZWwsIHZpZXdCb3gpIHtcbiAgaWYgKCFsYWJlbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChsYWJlbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwge1xuICAgICAga2V5OiBcImxhYmVsLWltcGxpY2l0XCIsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzTnVtT3JTdHIobGFiZWwpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsLCB7XG4gICAgICBrZXk6IFwibGFiZWwtaW1wbGljaXRcIixcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB2YWx1ZTogbGFiZWxcbiAgICB9KTtcbiAgfVxuICBpZiAoIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChsYWJlbCkpIHtcbiAgICBpZiAobGFiZWwudHlwZSA9PT0gTGFiZWwpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGxhYmVsLCB7XG4gICAgICAgIGtleTogJ2xhYmVsLWltcGxpY2l0JyxcbiAgICAgICAgdmlld0JveDogdmlld0JveFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwge1xuICAgICAga2V5OiBcImxhYmVsLWltcGxpY2l0XCIsXG4gICAgICBjb250ZW50OiBsYWJlbCxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3hcbiAgICB9KTtcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihsYWJlbCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIHtcbiAgICAgIGtleTogXCJsYWJlbC1pbXBsaWNpdFwiLFxuICAgICAgY29udGVudDogbGFiZWwsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGxhYmVsKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwgX2V4dGVuZHMoe1xuICAgICAgdmlld0JveDogdmlld0JveFxuICAgIH0sIGxhYmVsLCB7XG4gICAgICBrZXk6IFwibGFiZWwtaW1wbGljaXRcIlxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG52YXIgcmVuZGVyQ2FsbEJ5UGFyZW50ID0gZnVuY3Rpb24gcmVuZGVyQ2FsbEJ5UGFyZW50KHBhcmVudFByb3BzLCB2aWV3Qm94KSB7XG4gIHZhciBjaGVja1Byb3BzTGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmICghcGFyZW50UHJvcHMgfHwgIXBhcmVudFByb3BzLmNoaWxkcmVuICYmIGNoZWNrUHJvcHNMYWJlbCAmJiAhcGFyZW50UHJvcHMubGFiZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBwYXJlbnRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHBhcmVudFZpZXdCb3ggPSBwYXJzZVZpZXdCb3gocGFyZW50UHJvcHMpO1xuICB2YXIgZXhwbGljaXRDaGlsZHJlbiA9IGZpbmRBbGxCeVR5cGUoY2hpbGRyZW4sIExhYmVsKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICB2aWV3Qm94OiB2aWV3Qm94IHx8IHBhcmVudFZpZXdCb3gsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICBrZXk6IFwibGFiZWwtXCIuY29uY2F0KGluZGV4KVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKCFjaGVja1Byb3BzTGFiZWwpIHtcbiAgICByZXR1cm4gZXhwbGljaXRDaGlsZHJlbjtcbiAgfVxuICB2YXIgaW1wbGljaXRMYWJlbCA9IHBhcnNlTGFiZWwocGFyZW50UHJvcHMubGFiZWwsIHZpZXdCb3ggfHwgcGFyZW50Vmlld0JveCk7XG4gIHJldHVybiBbaW1wbGljaXRMYWJlbF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShleHBsaWNpdENoaWxkcmVuKSk7XG59O1xuTGFiZWwucGFyc2VWaWV3Qm94ID0gcGFyc2VWaWV3Qm94O1xuTGFiZWwucmVuZGVyQ2FsbEJ5UGFyZW50ID0gcmVuZGVyQ2FsbEJ5UGFyZW50OyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbnZhciBfZXhjbHVkZWQgPSBbXCJ2YWx1ZUFjY2Vzc29yXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiZGF0YVwiLCBcImRhdGFLZXlcIiwgXCJjbG9ja1dpc2VcIiwgXCJpZFwiLCBcInRleHRCcmVha0FsbFwiXTtcbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuaW1wb3J0IFJlYWN0LCB7IGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJ2xvZGFzaC9pc09iamVjdCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgbGFzdCBmcm9tICdsb2Rhc2gvbGFzdCc7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4vTGFiZWwnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb250YWluZXIvTGF5ZXInO1xuaW1wb3J0IHsgZmluZEFsbEJ5VHlwZSwgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeURhdGFLZXkgfSBmcm9tICcuLi91dGlsL0NoYXJ0VXRpbHMnO1xudmFyIGRlZmF1bHRBY2Nlc3NvciA9IGZ1bmN0aW9uIGRlZmF1bHRBY2Nlc3NvcihlbnRyeSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShlbnRyeS52YWx1ZSkgPyBsYXN0KGVudHJ5LnZhbHVlKSA6IGVudHJ5LnZhbHVlO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBMYWJlbExpc3QoX3JlZikge1xuICB2YXIgX3JlZiR2YWx1ZUFjY2Vzc29yID0gX3JlZi52YWx1ZUFjY2Vzc29yLFxuICAgIHZhbHVlQWNjZXNzb3IgPSBfcmVmJHZhbHVlQWNjZXNzb3IgPT09IHZvaWQgMCA/IGRlZmF1bHRBY2Nlc3NvciA6IF9yZWYkdmFsdWVBY2Nlc3NvcixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGRhdGEgPSByZXN0UHJvcHMuZGF0YSxcbiAgICBkYXRhS2V5ID0gcmVzdFByb3BzLmRhdGFLZXksXG4gICAgY2xvY2tXaXNlID0gcmVzdFByb3BzLmNsb2NrV2lzZSxcbiAgICBpZCA9IHJlc3RQcm9wcy5pZCxcbiAgICB0ZXh0QnJlYWtBbGwgPSByZXN0UHJvcHMudGV4dEJyZWFrQWxsLFxuICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhyZXN0UHJvcHMsIF9leGNsdWRlZDIpO1xuICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWxhYmVsLWxpc3RcIlxuICB9LCBkYXRhLm1hcChmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7XG4gICAgdmFyIHZhbHVlID0gaXNOaWwoZGF0YUtleSkgPyB2YWx1ZUFjY2Vzc29yKGVudHJ5LCBpbmRleCkgOiBnZXRWYWx1ZUJ5RGF0YUtleShlbnRyeSAmJiBlbnRyeS5wYXlsb2FkLCBkYXRhS2V5KTtcbiAgICB2YXIgaWRQcm9wcyA9IGlzTmlsKGlkKSA/IHt9IDoge1xuICAgICAgaWQ6IFwiXCIuY29uY2F0KGlkLCBcIi1cIikuY29uY2F0KGluZGV4KVxuICAgIH07XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsLCBfZXh0ZW5kcyh7fSwgZmlsdGVyUHJvcHMoZW50cnksIHRydWUpLCBvdGhlcnMsIGlkUHJvcHMsIHtcbiAgICAgIHBhcmVudFZpZXdCb3g6IGVudHJ5LnBhcmVudFZpZXdCb3gsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB0ZXh0QnJlYWtBbGw6IHRleHRCcmVha0FsbCxcbiAgICAgIHZpZXdCb3g6IExhYmVsLnBhcnNlVmlld0JveChpc05pbChjbG9ja1dpc2UpID8gZW50cnkgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVudHJ5KSwge30sIHtcbiAgICAgICAgY2xvY2tXaXNlOiBjbG9ja1dpc2VcbiAgICAgIH0pKSxcbiAgICAgIGtleTogXCJsYWJlbC1cIi5jb25jYXQoaW5kZXgpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9KSk7XG4gIH0pKTtcbn1cbkxhYmVsTGlzdC5kaXNwbGF5TmFtZSA9ICdMYWJlbExpc3QnO1xuZnVuY3Rpb24gcGFyc2VMYWJlbExpc3QobGFiZWwsIGRhdGEpIHtcbiAgaWYgKCFsYWJlbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChsYWJlbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbExpc3QsIHtcbiAgICAgIGtleTogXCJsYWJlbExpc3QtaW1wbGljaXRcIixcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfVxuICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChsYWJlbCkgfHwgaXNGdW5jdGlvbihsYWJlbCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWxMaXN0LCB7XG4gICAgICBrZXk6IFwibGFiZWxMaXN0LWltcGxpY2l0XCIsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgY29udGVudDogbGFiZWxcbiAgICB9KTtcbiAgfVxuICBpZiAoaXNPYmplY3QobGFiZWwpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsTGlzdCwgX2V4dGVuZHMoe1xuICAgICAgZGF0YTogZGF0YVxuICAgIH0sIGxhYmVsLCB7XG4gICAgICBrZXk6IFwibGFiZWxMaXN0LWltcGxpY2l0XCJcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiByZW5kZXJDYWxsQnlQYXJlbnQocGFyZW50UHJvcHMsIGRhdGEpIHtcbiAgdmFyIGNoZWNrUHJvcHNMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgaWYgKCFwYXJlbnRQcm9wcyB8fCAhcGFyZW50UHJvcHMuY2hpbGRyZW4gJiYgY2hlY2tQcm9wc0xhYmVsICYmICFwYXJlbnRQcm9wcy5sYWJlbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IHBhcmVudFByb3BzLmNoaWxkcmVuO1xuICB2YXIgZXhwbGljaXRDaGlsZHJlbiA9IGZpbmRBbGxCeVR5cGUoY2hpbGRyZW4sIExhYmVsTGlzdCkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgIGtleTogXCJsYWJlbExpc3QtXCIuY29uY2F0KGluZGV4KVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKCFjaGVja1Byb3BzTGFiZWwpIHtcbiAgICByZXR1cm4gZXhwbGljaXRDaGlsZHJlbjtcbiAgfVxuICB2YXIgaW1wbGljaXRMYWJlbExpc3QgPSBwYXJzZUxhYmVsTGlzdChwYXJlbnRQcm9wcy5sYWJlbCwgZGF0YSk7XG4gIHJldHVybiBbaW1wbGljaXRMYWJlbExpc3RdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZXhwbGljaXRDaGlsZHJlbikpO1xufVxuTGFiZWxMaXN0LnJlbmRlckNhbGxCeVBhcmVudCA9IHJlbmRlckNhbGxCeVBhcmVudDsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1wicmVmXCJdO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IExlZ2VuZFxuICovXG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERlZmF1bHRMZWdlbmRDb250ZW50IH0gZnJvbSAnLi9EZWZhdWx0TGVnZW5kQ29udGVudCc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGdldFVuaXFQYXlsb2FkIH0gZnJvbSAnLi4vdXRpbC9wYXlsb2FkL2dldFVuaXFQYXlsb2FkJztcbmZ1bmN0aW9uIGRlZmF1bHRVbmlxQnkoZW50cnkpIHtcbiAgcmV0dXJuIGVudHJ5LnZhbHVlO1xufVxuZnVuY3Rpb24gcmVuZGVyQ29udGVudChjb250ZW50LCBwcm9wcykge1xuICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRlbnQsIHByb3BzKTtcbiAgfVxuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGVudCwgcHJvcHMpO1xuICB9XG4gIHZhciByZWYgPSBwcm9wcy5yZWYsXG4gICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlZmF1bHRMZWdlbmRDb250ZW50LCBvdGhlclByb3BzKTtcbn1cbnZhciBFUFMgPSAxO1xuZXhwb3J0IHZhciBMZWdlbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIExlZ2VuZCgpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExlZ2VuZCk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBfdGhpcyA9IF9jYWxsU3VwZXIodGhpcywgTGVnZW5kLCBbXS5jb25jYXQoYXJncykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJsYXN0Qm91bmRpbmdCb3hcIiwge1xuICAgICAgd2lkdGg6IC0xLFxuICAgICAgaGVpZ2h0OiAtMVxuICAgIH0pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfaW5oZXJpdHMoTGVnZW5kLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoTGVnZW5kLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMudXBkYXRlQkJveCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy51cGRhdGVCQm94KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJCb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QkJveCgpIHtcbiAgICAgIGlmICh0aGlzLndyYXBwZXJOb2RlICYmIHRoaXMud3JhcHBlck5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgIHZhciBib3ggPSB0aGlzLndyYXBwZXJOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBib3guaGVpZ2h0ID0gdGhpcy53cmFwcGVyTm9kZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGJveC53aWR0aCA9IHRoaXMud3JhcHBlck5vZGUub2Zmc2V0V2lkdGg7XG4gICAgICAgIHJldHVybiBib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlQkJveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVCQm94KCkge1xuICAgICAgdmFyIG9uQkJveFVwZGF0ZSA9IHRoaXMucHJvcHMub25CQm94VXBkYXRlO1xuICAgICAgdmFyIGJveCA9IHRoaXMuZ2V0QkJveCgpO1xuICAgICAgaWYgKGJveCkge1xuICAgICAgICBpZiAoTWF0aC5hYnMoYm94LndpZHRoIC0gdGhpcy5sYXN0Qm91bmRpbmdCb3gud2lkdGgpID4gRVBTIHx8IE1hdGguYWJzKGJveC5oZWlnaHQgLSB0aGlzLmxhc3RCb3VuZGluZ0JveC5oZWlnaHQpID4gRVBTKSB7XG4gICAgICAgICAgdGhpcy5sYXN0Qm91bmRpbmdCb3gud2lkdGggPSBib3gud2lkdGg7XG4gICAgICAgICAgdGhpcy5sYXN0Qm91bmRpbmdCb3guaGVpZ2h0ID0gYm94LmhlaWdodDtcbiAgICAgICAgICBpZiAob25CQm94VXBkYXRlKSB7XG4gICAgICAgICAgICBvbkJCb3hVcGRhdGUoYm94KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0Qm91bmRpbmdCb3gud2lkdGggIT09IC0xIHx8IHRoaXMubGFzdEJvdW5kaW5nQm94LmhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5sYXN0Qm91bmRpbmdCb3gud2lkdGggPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0Qm91bmRpbmdCb3guaGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChvbkJCb3hVcGRhdGUpIHtcbiAgICAgICAgICBvbkJCb3hVcGRhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QkJveFNuYXBzaG90XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJCb3hTbmFwc2hvdCgpIHtcbiAgICAgIGlmICh0aGlzLmxhc3RCb3VuZGluZ0JveC53aWR0aCA+PSAwICYmIHRoaXMubGFzdEJvdW5kaW5nQm94LmhlaWdodCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmxhc3RCb3VuZGluZ0JveCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWZhdWx0UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVmYXVsdFBvc2l0aW9uKHN0eWxlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wcy5sYXlvdXQsXG4gICAgICAgIGFsaWduID0gX3RoaXMkcHJvcHMuYWxpZ24sXG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSBfdGhpcyRwcm9wcy52ZXJ0aWNhbEFsaWduLFxuICAgICAgICBtYXJnaW4gPSBfdGhpcyRwcm9wcy5tYXJnaW4sXG4gICAgICAgIGNoYXJ0V2lkdGggPSBfdGhpcyRwcm9wcy5jaGFydFdpZHRoLFxuICAgICAgICBjaGFydEhlaWdodCA9IF90aGlzJHByb3BzLmNoYXJ0SGVpZ2h0O1xuICAgICAgdmFyIGhQb3MsIHZQb3M7XG4gICAgICBpZiAoIXN0eWxlIHx8IChzdHlsZS5sZWZ0ID09PSB1bmRlZmluZWQgfHwgc3R5bGUubGVmdCA9PT0gbnVsbCkgJiYgKHN0eWxlLnJpZ2h0ID09PSB1bmRlZmluZWQgfHwgc3R5bGUucmlnaHQgPT09IG51bGwpKSB7XG4gICAgICAgIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicgJiYgbGF5b3V0ID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgdmFyIGJveCA9IHRoaXMuZ2V0QkJveFNuYXBzaG90KCk7XG4gICAgICAgICAgaFBvcyA9IHtcbiAgICAgICAgICAgIGxlZnQ6ICgoY2hhcnRXaWR0aCB8fCAwKSAtIGJveC53aWR0aCkgLyAyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoUG9zID0gYWxpZ24gPT09ICdyaWdodCcgPyB7XG4gICAgICAgICAgICByaWdodDogbWFyZ2luICYmIG1hcmdpbi5yaWdodCB8fCAwXG4gICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIGxlZnQ6IG1hcmdpbiAmJiBtYXJnaW4ubGVmdCB8fCAwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzdHlsZSB8fCAoc3R5bGUudG9wID09PSB1bmRlZmluZWQgfHwgc3R5bGUudG9wID09PSBudWxsKSAmJiAoc3R5bGUuYm90dG9tID09PSB1bmRlZmluZWQgfHwgc3R5bGUuYm90dG9tID09PSBudWxsKSkge1xuICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgICB2YXIgX2JveCA9IHRoaXMuZ2V0QkJveFNuYXBzaG90KCk7XG4gICAgICAgICAgdlBvcyA9IHtcbiAgICAgICAgICAgIHRvcDogKChjaGFydEhlaWdodCB8fCAwKSAtIF9ib3guaGVpZ2h0KSAvIDJcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZQb3MgPSB2ZXJ0aWNhbEFsaWduID09PSAnYm90dG9tJyA/IHtcbiAgICAgICAgICAgIGJvdHRvbTogbWFyZ2luICYmIG1hcmdpbi5ib3R0b20gfHwgMFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICB0b3A6IG1hcmdpbiAmJiBtYXJnaW4udG9wIHx8IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBoUG9zKSwgdlBvcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMyLmNvbnRlbnQsXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHMyLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczIuaGVpZ2h0LFxuICAgICAgICB3cmFwcGVyU3R5bGUgPSBfdGhpcyRwcm9wczIud3JhcHBlclN0eWxlLFxuICAgICAgICBwYXlsb2FkVW5pcUJ5ID0gX3RoaXMkcHJvcHMyLnBheWxvYWRVbmlxQnksXG4gICAgICAgIHBheWxvYWQgPSBfdGhpcyRwcm9wczIucGF5bG9hZDtcbiAgICAgIHZhciBvdXRlclN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHdpZHRoOiB3aWR0aCB8fCAnYXV0bycsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IHx8ICdhdXRvJ1xuICAgICAgfSwgdGhpcy5nZXREZWZhdWx0UG9zaXRpb24od3JhcHBlclN0eWxlKSksIHdyYXBwZXJTdHlsZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtbGVnZW5kLXdyYXBwZXJcIixcbiAgICAgICAgc3R5bGU6IG91dGVyU3R5bGUsXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICBfdGhpczIud3JhcHBlck5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9LCByZW5kZXJDb250ZW50KGNvbnRlbnQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIHBheWxvYWQ6IGdldFVuaXFQYXlsb2FkKHBheWxvYWQsIHBheWxvYWRVbmlxQnksIGRlZmF1bHRVbmlxQnkpXG4gICAgICB9KSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldFdpdGhIZWlnaHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0V2l0aEhlaWdodChpdGVtLCBjaGFydFdpZHRoKSB7XG4gICAgICB2YXIgX3RoaXMkZGVmYXVsdFByb3BzJGl0ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmRlZmF1bHRQcm9wcyksIGl0ZW0ucHJvcHMpLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRkZWZhdWx0UHJvcHMkaXQubGF5b3V0O1xuICAgICAgaWYgKGxheW91dCA9PT0gJ3ZlcnRpY2FsJyAmJiBpc051bWJlcihpdGVtLnByb3BzLmhlaWdodCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IGl0ZW0ucHJvcHMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobGF5b3V0ID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogaXRlbS5wcm9wcy53aWR0aCB8fCBjaGFydFdpZHRoXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcbn0oUHVyZUNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoTGVnZW5kLCBcImRpc3BsYXlOYW1lXCIsICdMZWdlbmQnKTtcbl9kZWZpbmVQcm9wZXJ0eShMZWdlbmQsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgaWNvblNpemU6IDE0LFxuICBsYXlvdXQ6ICdob3Jpem9udGFsJyxcbiAgYWxpZ246ICdjZW50ZXInLFxuICB2ZXJ0aWNhbEFsaWduOiAnYm90dG9tJ1xufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFdyYXBwZXIgY29tcG9uZW50IHRvIG1ha2UgY2hhcnRzIGFkYXB0IHRvIHRoZSBzaXplIG9mIHBhcmVudCAqIERPTVxuICovXG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCBjbG9uZUVsZW1lbnQsIHVzZVN0YXRlLCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJztcbmltcG9ydCB7IGlzUGVyY2VudCB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi91dGlsL0xvZ1V0aWxzJztcbmltcG9ydCB7IGdldERpc3BsYXlOYW1lIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmV4cG9ydCB2YXIgUmVzcG9uc2l2ZUNvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgdmFyIGFzcGVjdCA9IF9yZWYuYXNwZWN0LFxuICAgIF9yZWYkaW5pdGlhbERpbWVuc2lvbiA9IF9yZWYuaW5pdGlhbERpbWVuc2lvbixcbiAgICBpbml0aWFsRGltZW5zaW9uID0gX3JlZiRpbml0aWFsRGltZW5zaW9uID09PSB2b2lkIDAgPyB7XG4gICAgICB3aWR0aDogLTEsXG4gICAgICBoZWlnaHQ6IC0xXG4gICAgfSA6IF9yZWYkaW5pdGlhbERpbWVuc2lvbixcbiAgICBfcmVmJHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICB3aWR0aCA9IF9yZWYkd2lkdGggPT09IHZvaWQgMCA/ICcxMDAlJyA6IF9yZWYkd2lkdGgsXG4gICAgX3JlZiRoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICBoZWlnaHQgPSBfcmVmJGhlaWdodCA9PT0gdm9pZCAwID8gJzEwMCUnIDogX3JlZiRoZWlnaHQsXG4gICAgX3JlZiRtaW5XaWR0aCA9IF9yZWYubWluV2lkdGgsXG4gICAgbWluV2lkdGggPSBfcmVmJG1pbldpZHRoID09PSB2b2lkIDAgPyAwIDogX3JlZiRtaW5XaWR0aCxcbiAgICBtaW5IZWlnaHQgPSBfcmVmLm1pbkhlaWdodCxcbiAgICBtYXhIZWlnaHQgPSBfcmVmLm1heEhlaWdodCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgX3JlZiRkZWJvdW5jZSA9IF9yZWYuZGVib3VuY2UsXG4gICAgZGVib3VuY2UgPSBfcmVmJGRlYm91bmNlID09PSB2b2lkIDAgPyAwIDogX3JlZiRkZWJvdW5jZSxcbiAgICBpZCA9IF9yZWYuaWQsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25SZXNpemUgPSBfcmVmLm9uUmVzaXplLFxuICAgIF9yZWYkc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIHN0eWxlID0gX3JlZiRzdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcmVmJHN0eWxlO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgb25SZXNpemVSZWYgPSB1c2VSZWYoKTtcbiAgb25SZXNpemVSZWYuY3VycmVudCA9IG9uUmVzaXplO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyUmVmLmN1cnJlbnQsICdjdXJyZW50Jywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIHVzYWdlIG9mIHJlZi5jdXJyZW50LmN1cnJlbnQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkLicpO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoe1xuICAgICAgY29udGFpbmVyV2lkdGg6IGluaXRpYWxEaW1lbnNpb24ud2lkdGgsXG4gICAgICBjb250YWluZXJIZWlnaHQ6IGluaXRpYWxEaW1lbnNpb24uaGVpZ2h0XG4gICAgfSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc2l6ZXMgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFNpemVzID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHNldENvbnRhaW5lclNpemUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgIHNldFNpemVzKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgIHZhciByb3VuZGVkV2lkdGggPSBNYXRoLnJvdW5kKG5ld1dpZHRoKTtcbiAgICAgIHZhciByb3VuZGVkSGVpZ2h0ID0gTWF0aC5yb3VuZChuZXdIZWlnaHQpO1xuICAgICAgaWYgKHByZXZTdGF0ZS5jb250YWluZXJXaWR0aCA9PT0gcm91bmRlZFdpZHRoICYmIHByZXZTdGF0ZS5jb250YWluZXJIZWlnaHQgPT09IHJvdW5kZWRIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRhaW5lcldpZHRoOiByb3VuZGVkV2lkdGgsXG4gICAgICAgIGNvbnRhaW5lckhlaWdodDogcm91bmRlZEhlaWdodFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBfb25SZXNpemVSZWYkY3VycmVudDtcbiAgICAgIHZhciBfZW50cmllcyQwJGNvbnRlbnRSZWMgPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LFxuICAgICAgICBjb250YWluZXJXaWR0aCA9IF9lbnRyaWVzJDAkY29udGVudFJlYy53aWR0aCxcbiAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gX2VudHJpZXMkMCRjb250ZW50UmVjLmhlaWdodDtcbiAgICAgIHNldENvbnRhaW5lclNpemUoY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCk7XG4gICAgICAoX29uUmVzaXplUmVmJGN1cnJlbnQgPSBvblJlc2l6ZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfb25SZXNpemVSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9vblJlc2l6ZVJlZiRjdXJyZW50LmNhbGwob25SZXNpemVSZWYsIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQpO1xuICAgIH07XG4gICAgaWYgKGRlYm91bmNlID4gMCkge1xuICAgICAgY2FsbGJhY2sgPSB0aHJvdHRsZShjYWxsYmFjaywgZGVib3VuY2UsIHtcbiAgICAgICAgdHJhaWxpbmc6IHRydWUsXG4gICAgICAgIGxlYWRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBjb250YWluZXJXaWR0aCA9IF9jb250YWluZXJSZWYkY3VycmVudC53aWR0aCxcbiAgICAgIGNvbnRhaW5lckhlaWdodCA9IF9jb250YWluZXJSZWYkY3VycmVudC5oZWlnaHQ7XG4gICAgc2V0Q29udGFpbmVyU2l6ZShjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzZXRDb250YWluZXJTaXplLCBkZWJvdW5jZV0pO1xuICB2YXIgY2hhcnRDb250ZW50ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRhaW5lcldpZHRoID0gc2l6ZXMuY29udGFpbmVyV2lkdGgsXG4gICAgICBjb250YWluZXJIZWlnaHQgPSBzaXplcy5jb250YWluZXJIZWlnaHQ7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDwgMCB8fCBjb250YWluZXJIZWlnaHQgPCAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgd2Fybihpc1BlcmNlbnQod2lkdGgpIHx8IGlzUGVyY2VudChoZWlnaHQpLCBcIlRoZSB3aWR0aCglcykgYW5kIGhlaWdodCglcykgYXJlIGJvdGggZml4ZWQgbnVtYmVycyxcXG4gICAgICAgbWF5YmUgeW91IGRvbid0IG5lZWQgdG8gdXNlIGEgUmVzcG9uc2l2ZUNvbnRhaW5lci5cIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgd2FybighYXNwZWN0IHx8IGFzcGVjdCA+IDAsICdUaGUgYXNwZWN0KCVzKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicsIGFzcGVjdCk7XG4gICAgdmFyIGNhbGN1bGF0ZWRXaWR0aCA9IGlzUGVyY2VudCh3aWR0aCkgPyBjb250YWluZXJXaWR0aCA6IHdpZHRoO1xuICAgIHZhciBjYWxjdWxhdGVkSGVpZ2h0ID0gaXNQZXJjZW50KGhlaWdodCkgPyBjb250YWluZXJIZWlnaHQgOiBoZWlnaHQ7XG4gICAgaWYgKGFzcGVjdCAmJiBhc3BlY3QgPiAwKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZGVzaXJlZCBhc3BlY3QgcmF0aW9cbiAgICAgIGlmIChjYWxjdWxhdGVkV2lkdGgpIHtcbiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIHVzaW5nIHdpZHRoIGZvciBhc3BlY3QgcmF0aW9cbiAgICAgICAgY2FsY3VsYXRlZEhlaWdodCA9IGNhbGN1bGF0ZWRXaWR0aCAvIGFzcGVjdDtcbiAgICAgIH0gZWxzZSBpZiAoY2FsY3VsYXRlZEhlaWdodCkge1xuICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkIGFsc28gdGFrZSBoZWlnaHQgaW50byBjb25zaWRlcmF0aW9uXG4gICAgICAgIGNhbGN1bGF0ZWRXaWR0aCA9IGNhbGN1bGF0ZWRIZWlnaHQgKiBhc3BlY3Q7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG1heEhlaWdodCBpcyBzZXQsIG92ZXJ3cml0ZSBpZiBjYWxjdWxhdGVkSGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiBtYXhIZWlnaHRcbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgY2FsY3VsYXRlZEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICBjYWxjdWxhdGVkSGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICB3YXJuKGNhbGN1bGF0ZWRXaWR0aCA+IDAgfHwgY2FsY3VsYXRlZEhlaWdodCA+IDAsIFwiVGhlIHdpZHRoKCVzKSBhbmQgaGVpZ2h0KCVzKSBvZiBjaGFydCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAsXFxuICAgICAgIHBsZWFzZSBjaGVjayB0aGUgc3R5bGUgb2YgY29udGFpbmVyLCBvciB0aGUgcHJvcHMgd2lkdGgoJXMpIGFuZCBoZWlnaHQoJXMpLFxcbiAgICAgICBvciBhZGQgYSBtaW5XaWR0aCglcykgb3IgbWluSGVpZ2h0KCVzKSBvciB1c2UgYXNwZWN0KCVzKSB0byBjb250cm9sIHRoZVxcbiAgICAgICBoZWlnaHQgYW5kIHdpZHRoLlwiLCBjYWxjdWxhdGVkV2lkdGgsIGNhbGN1bGF0ZWRIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQsIGFzcGVjdCk7XG4gICAgdmFyIGlzQ2hhcnRzID0gIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pICYmIGdldERpc3BsYXlOYW1lKGNoaWxkcmVuLnR5cGUpLmVuZHNXaXRoKCdDaGFydCcpO1xuICAgIHJldHVybiBSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGNoaWxkLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB3aWR0aDogY2FsY3VsYXRlZFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FsY3VsYXRlZEhlaWdodFxuICAgICAgICB9LCBpc0NoYXJ0cyA/IHtcbiAgICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IGNhbGN1bGF0ZWRIZWlnaHQsXG4gICAgICAgICAgICBtYXhXaWR0aDogY2FsY3VsYXRlZFdpZHRoXG4gICAgICAgICAgfSwgY2hpbGQucHJvcHMuc3R5bGUpXG4gICAgICAgIH0gOiB7fSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xuICB9LCBbYXNwZWN0LCBjaGlsZHJlbiwgaGVpZ2h0LCBtYXhIZWlnaHQsIG1pbkhlaWdodCwgbWluV2lkdGgsIHNpemVzLCB3aWR0aF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGlkOiBpZCA/IFwiXCIuY29uY2F0KGlkKSA6IHVuZGVmaW5lZCxcbiAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLXJlc3BvbnNpdmUtY29udGFpbmVyJywgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1pbldpZHRoOiBtaW5XaWR0aCxcbiAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0LFxuICAgICAgbWF4SGVpZ2h0OiBtYXhIZWlnaHRcbiAgICB9KSxcbiAgICByZWY6IGNvbnRhaW5lclJlZlxuICB9LCBjaGFydENvbnRlbnQpO1xufSk7IiwidmFyIF9leGNsdWRlZCA9IFtcInhcIiwgXCJ5XCIsIFwibGluZUhlaWdodFwiLCBcImNhcEhlaWdodFwiLCBcInNjYWxlVG9GaXRcIiwgXCJ0ZXh0QW5jaG9yXCIsIFwidmVydGljYWxBbmNob3JcIiwgXCJmaWxsXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiZHhcIiwgXCJkeVwiLCBcImFuZ2xlXCIsIFwiY2xhc3NOYW1lXCIsIFwiYnJlYWtBbGxcIl07XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzTmlsIGZyb20gJ2xvZGFzaC9pc05pbCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGlzTnVtYmVyLCBpc051bU9yU3RyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi4vdXRpbC9HbG9iYWwnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgZ2V0U3RyaW5nU2l6ZSB9IGZyb20gJy4uL3V0aWwvRE9NVXRpbHMnO1xuaW1wb3J0IHsgcmVkdWNlQ1NTQ2FsYyB9IGZyb20gJy4uL3V0aWwvUmVkdWNlQ1NTQ2FsYyc7XG52YXIgQlJFQUtJTkdfU1BBQ0VTID0gL1sgXFxmXFxuXFxyXFx0XFx2XFx1MjAyOFxcdTIwMjldKy87XG52YXIgY2FsY3VsYXRlV29yZFdpZHRocyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVdvcmRXaWR0aHMoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGJyZWFrQWxsID0gX3JlZi5icmVha0FsbCxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gIHRyeSB7XG4gICAgdmFyIHdvcmRzID0gW107XG4gICAgaWYgKCFpc05pbChjaGlsZHJlbikpIHtcbiAgICAgIGlmIChicmVha0FsbCkge1xuICAgICAgICB3b3JkcyA9IGNoaWxkcmVuLnRvU3RyaW5nKCkuc3BsaXQoJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd29yZHMgPSBjaGlsZHJlbi50b1N0cmluZygpLnNwbGl0KEJSRUFLSU5HX1NQQUNFUyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoID0gd29yZHMubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3b3JkOiB3b3JkLFxuICAgICAgICB3aWR0aDogZ2V0U3RyaW5nU2l6ZSh3b3JkLCBzdHlsZSkud2lkdGhcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdmFyIHNwYWNlV2lkdGggPSBicmVha0FsbCA/IDAgOiBnZXRTdHJpbmdTaXplKFwiXFx4QTBcIiwgc3R5bGUpLndpZHRoO1xuICAgIHJldHVybiB7XG4gICAgICB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoOiB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoLFxuICAgICAgc3BhY2VXaWR0aDogc3BhY2VXaWR0aFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcbnZhciBjYWxjdWxhdGVXb3Jkc0J5TGluZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVXb3Jkc0J5TGluZXMoX3JlZjIsIGluaXRpYWxXb3Jkc1dpdGhDb21wdXRlZFdpdGgsIHNwYWNlV2lkdGgsIGxpbmVXaWR0aCwgc2NhbGVUb0ZpdCkge1xuICB2YXIgbWF4TGluZXMgPSBfcmVmMi5tYXhMaW5lcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuLFxuICAgIHN0eWxlID0gX3JlZjIuc3R5bGUsXG4gICAgYnJlYWtBbGwgPSBfcmVmMi5icmVha0FsbDtcbiAgdmFyIHNob3VsZExpbWl0TGluZXMgPSBpc051bWJlcihtYXhMaW5lcyk7XG4gIHZhciB0ZXh0ID0gY2hpbGRyZW47XG4gIHZhciBjYWxjdWxhdGUgPSBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7XG4gICAgdmFyIHdvcmRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICByZXR1cm4gd29yZHMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIF9yZWYzKSB7XG4gICAgICB2YXIgd29yZCA9IF9yZWYzLndvcmQsXG4gICAgICAgIHdpZHRoID0gX3JlZjMud2lkdGg7XG4gICAgICB2YXIgY3VycmVudExpbmUgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGN1cnJlbnRMaW5lICYmIChsaW5lV2lkdGggPT0gbnVsbCB8fCBzY2FsZVRvRml0IHx8IGN1cnJlbnRMaW5lLndpZHRoICsgd2lkdGggKyBzcGFjZVdpZHRoIDwgTnVtYmVyKGxpbmVXaWR0aCkpKSB7XG4gICAgICAgIC8vIFdvcmQgY2FuIGJlIGFkZGVkIHRvIGFuIGV4aXN0aW5nIGxpbmVcbiAgICAgICAgY3VycmVudExpbmUud29yZHMucHVzaCh3b3JkKTtcbiAgICAgICAgY3VycmVudExpbmUud2lkdGggKz0gd2lkdGggKyBzcGFjZVdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkIGZpcnN0IHdvcmQgdG8gbGluZSBvciB3b3JkIGlzIHRvbyBsb25nIHRvIHNjYWxlVG9GaXQgb24gZXhpc3RpbmcgbGluZVxuICAgICAgICB2YXIgbmV3TGluZSA9IHtcbiAgICAgICAgICB3b3JkczogW3dvcmRdLFxuICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQucHVzaChuZXdMaW5lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xuICB9O1xuICB2YXIgb3JpZ2luYWxSZXN1bHQgPSBjYWxjdWxhdGUoaW5pdGlhbFdvcmRzV2l0aENvbXB1dGVkV2l0aCk7XG4gIHZhciBmaW5kTG9uZ2VzdExpbmUgPSBmdW5jdGlvbiBmaW5kTG9uZ2VzdExpbmUod29yZHMpIHtcbiAgICByZXR1cm4gd29yZHMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS53aWR0aCA+IGIud2lkdGggPyBhIDogYjtcbiAgICB9KTtcbiAgfTtcbiAgaWYgKCFzaG91bGRMaW1pdExpbmVzKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0O1xuICB9XG4gIHZhciBzdWZmaXggPSAn4oCmJztcbiAgdmFyIGNoZWNrT3ZlcmZsb3cgPSBmdW5jdGlvbiBjaGVja092ZXJmbG93KGluZGV4KSB7XG4gICAgdmFyIHRlbXBUZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XG4gICAgdmFyIHdvcmRzID0gY2FsY3VsYXRlV29yZFdpZHRocyh7XG4gICAgICBicmVha0FsbDogYnJlYWtBbGwsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBjaGlsZHJlbjogdGVtcFRleHQgKyBzdWZmaXhcbiAgICB9KS53b3Jkc1dpdGhDb21wdXRlZFdpZHRoO1xuICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGUod29yZHMpO1xuICAgIHZhciBkb2VzT3ZlcmZsb3cgPSByZXN1bHQubGVuZ3RoID4gbWF4TGluZXMgfHwgZmluZExvbmdlc3RMaW5lKHJlc3VsdCkud2lkdGggPiBOdW1iZXIobGluZVdpZHRoKTtcbiAgICByZXR1cm4gW2RvZXNPdmVyZmxvdywgcmVzdWx0XTtcbiAgfTtcbiAgdmFyIHN0YXJ0ID0gMDtcbiAgdmFyIGVuZCA9IHRleHQubGVuZ3RoIC0gMTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB2YXIgdHJpbW1lZFJlc3VsdDtcbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCAmJiBpdGVyYXRpb25zIDw9IHRleHQubGVuZ3RoIC0gMSkge1xuICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTtcbiAgICB2YXIgcHJldiA9IG1pZGRsZSAtIDE7XG4gICAgdmFyIF9jaGVja092ZXJmbG93ID0gY2hlY2tPdmVyZmxvdyhwcmV2KSxcbiAgICAgIF9jaGVja092ZXJmbG93MiA9IF9zbGljZWRUb0FycmF5KF9jaGVja092ZXJmbG93LCAyKSxcbiAgICAgIGRvZXNQcmV2T3ZlcmZsb3cgPSBfY2hlY2tPdmVyZmxvdzJbMF0sXG4gICAgICByZXN1bHQgPSBfY2hlY2tPdmVyZmxvdzJbMV07XG4gICAgdmFyIF9jaGVja092ZXJmbG93MyA9IGNoZWNrT3ZlcmZsb3cobWlkZGxlKSxcbiAgICAgIF9jaGVja092ZXJmbG93NCA9IF9zbGljZWRUb0FycmF5KF9jaGVja092ZXJmbG93MywgMSksXG4gICAgICBkb2VzTWlkZGxlT3ZlcmZsb3cgPSBfY2hlY2tPdmVyZmxvdzRbMF07XG4gICAgaWYgKCFkb2VzUHJldk92ZXJmbG93ICYmICFkb2VzTWlkZGxlT3ZlcmZsb3cpIHtcbiAgICAgIHN0YXJ0ID0gbWlkZGxlICsgMTtcbiAgICB9XG4gICAgaWYgKGRvZXNQcmV2T3ZlcmZsb3cgJiYgZG9lc01pZGRsZU92ZXJmbG93KSB7XG4gICAgICBlbmQgPSBtaWRkbGUgLSAxO1xuICAgIH1cbiAgICBpZiAoIWRvZXNQcmV2T3ZlcmZsb3cgJiYgZG9lc01pZGRsZU92ZXJmbG93KSB7XG4gICAgICB0cmltbWVkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIG9yaWdpbmFsUmVzdWx0IChyZXN1bHQgd2l0aG91dCB0cmltbWluZykgaWYgd2UgY2Fubm90IGZpbmQgdGhlXG4gIC8vIHdoZXJlIHRvIHRyaW0uICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIDp0bTpcbiAgcmV0dXJuIHRyaW1tZWRSZXN1bHQgfHwgb3JpZ2luYWxSZXN1bHQ7XG59O1xudmFyIGdldFdvcmRzV2l0aG91dENhbGN1bGF0ZSA9IGZ1bmN0aW9uIGdldFdvcmRzV2l0aG91dENhbGN1bGF0ZShjaGlsZHJlbikge1xuICB2YXIgd29yZHMgPSAhaXNOaWwoY2hpbGRyZW4pID8gY2hpbGRyZW4udG9TdHJpbmcoKS5zcGxpdChCUkVBS0lOR19TUEFDRVMpIDogW107XG4gIHJldHVybiBbe1xuICAgIHdvcmRzOiB3b3Jkc1xuICB9XTtcbn07XG52YXIgZ2V0V29yZHNCeUxpbmVzID0gZnVuY3Rpb24gZ2V0V29yZHNCeUxpbmVzKF9yZWY0KSB7XG4gIHZhciB3aWR0aCA9IF9yZWY0LndpZHRoLFxuICAgIHNjYWxlVG9GaXQgPSBfcmVmNC5zY2FsZVRvRml0LFxuICAgIGNoaWxkcmVuID0gX3JlZjQuY2hpbGRyZW4sXG4gICAgc3R5bGUgPSBfcmVmNC5zdHlsZSxcbiAgICBicmVha0FsbCA9IF9yZWY0LmJyZWFrQWxsLFxuICAgIG1heExpbmVzID0gX3JlZjQubWF4TGluZXM7XG4gIC8vIE9ubHkgcGVyZm9ybSBjYWxjdWxhdGlvbnMgaWYgdXNpbmcgZmVhdHVyZXMgdGhhdCByZXF1aXJlIHRoZW0gKG11bHRpbGluZSwgc2NhbGVUb0ZpdClcbiAgaWYgKCh3aWR0aCB8fCBzY2FsZVRvRml0KSAmJiAhR2xvYmFsLmlzU3NyKSB7XG4gICAgdmFyIHdvcmRzV2l0aENvbXB1dGVkV2lkdGgsIHNwYWNlV2lkdGg7XG4gICAgdmFyIHdvcmRXaWR0aHMgPSBjYWxjdWxhdGVXb3JkV2lkdGhzKHtcbiAgICAgIGJyZWFrQWxsOiBicmVha0FsbCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pO1xuICAgIGlmICh3b3JkV2lkdGhzKSB7XG4gICAgICB2YXIgd2N3ID0gd29yZFdpZHRocy53b3Jkc1dpdGhDb21wdXRlZFdpZHRoLFxuICAgICAgICBzdyA9IHdvcmRXaWR0aHMuc3BhY2VXaWR0aDtcbiAgICAgIHdvcmRzV2l0aENvbXB1dGVkV2lkdGggPSB3Y3c7XG4gICAgICBzcGFjZVdpZHRoID0gc3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXRXb3Jkc1dpdGhvdXRDYWxjdWxhdGUoY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gY2FsY3VsYXRlV29yZHNCeUxpbmVzKHtcbiAgICAgIGJyZWFrQWxsOiBicmVha0FsbCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgIG1heExpbmVzOiBtYXhMaW5lcyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIHdvcmRzV2l0aENvbXB1dGVkV2lkdGgsIHNwYWNlV2lkdGgsIHdpZHRoLCBzY2FsZVRvRml0KTtcbiAgfVxuICByZXR1cm4gZ2V0V29yZHNXaXRob3V0Q2FsY3VsYXRlKGNoaWxkcmVuKTtcbn07XG52YXIgREVGQVVMVF9GSUxMID0gJyM4MDgwODAnO1xuZXhwb3J0IHZhciBUZXh0ID0gZnVuY3Rpb24gVGV4dChfcmVmNSkge1xuICB2YXIgX3JlZjUkeCA9IF9yZWY1LngsXG4gICAgcHJvcHNYID0gX3JlZjUkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWY1JHgsXG4gICAgX3JlZjUkeSA9IF9yZWY1LnksXG4gICAgcHJvcHNZID0gX3JlZjUkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWY1JHksXG4gICAgX3JlZjUkbGluZUhlaWdodCA9IF9yZWY1LmxpbmVIZWlnaHQsXG4gICAgbGluZUhlaWdodCA9IF9yZWY1JGxpbmVIZWlnaHQgPT09IHZvaWQgMCA/ICcxZW0nIDogX3JlZjUkbGluZUhlaWdodCxcbiAgICBfcmVmNSRjYXBIZWlnaHQgPSBfcmVmNS5jYXBIZWlnaHQsXG4gICAgY2FwSGVpZ2h0ID0gX3JlZjUkY2FwSGVpZ2h0ID09PSB2b2lkIDAgPyAnMC43MWVtJyA6IF9yZWY1JGNhcEhlaWdodCxcbiAgICBfcmVmNSRzY2FsZVRvRml0ID0gX3JlZjUuc2NhbGVUb0ZpdCxcbiAgICBzY2FsZVRvRml0ID0gX3JlZjUkc2NhbGVUb0ZpdCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRzY2FsZVRvRml0LFxuICAgIF9yZWY1JHRleHRBbmNob3IgPSBfcmVmNS50ZXh0QW5jaG9yLFxuICAgIHRleHRBbmNob3IgPSBfcmVmNSR0ZXh0QW5jaG9yID09PSB2b2lkIDAgPyAnc3RhcnQnIDogX3JlZjUkdGV4dEFuY2hvcixcbiAgICBfcmVmNSR2ZXJ0aWNhbEFuY2hvciA9IF9yZWY1LnZlcnRpY2FsQW5jaG9yLFxuICAgIHZlcnRpY2FsQW5jaG9yID0gX3JlZjUkdmVydGljYWxBbmNob3IgPT09IHZvaWQgMCA/ICdlbmQnIDogX3JlZjUkdmVydGljYWxBbmNob3IsXG4gICAgX3JlZjUkZmlsbCA9IF9yZWY1LmZpbGwsXG4gICAgZmlsbCA9IF9yZWY1JGZpbGwgPT09IHZvaWQgMCA/IERFRkFVTFRfRklMTCA6IF9yZWY1JGZpbGwsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjUsIF9leGNsdWRlZCk7XG4gIHZhciB3b3Jkc0J5TGluZXMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0V29yZHNCeUxpbmVzKHtcbiAgICAgIGJyZWFrQWxsOiBwcm9wcy5icmVha0FsbCxcbiAgICAgIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG1heExpbmVzOiBwcm9wcy5tYXhMaW5lcyxcbiAgICAgIHNjYWxlVG9GaXQ6IHNjYWxlVG9GaXQsXG4gICAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgICB3aWR0aDogcHJvcHMud2lkdGhcbiAgICB9KTtcbiAgfSwgW3Byb3BzLmJyZWFrQWxsLCBwcm9wcy5jaGlsZHJlbiwgcHJvcHMubWF4TGluZXMsIHNjYWxlVG9GaXQsIHByb3BzLnN0eWxlLCBwcm9wcy53aWR0aF0pO1xuICB2YXIgZHggPSBwcm9wcy5keCxcbiAgICBkeSA9IHByb3BzLmR5LFxuICAgIGFuZ2xlID0gcHJvcHMuYW5nbGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGJyZWFrQWxsID0gcHJvcHMuYnJlYWtBbGwsXG4gICAgdGV4dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgaWYgKCFpc051bU9yU3RyKHByb3BzWCkgfHwgIWlzTnVtT3JTdHIocHJvcHNZKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB4ID0gcHJvcHNYICsgKGlzTnVtYmVyKGR4KSA/IGR4IDogMCk7XG4gIHZhciB5ID0gcHJvcHNZICsgKGlzTnVtYmVyKGR5KSA/IGR5IDogMCk7XG4gIHZhciBzdGFydER5O1xuICBzd2l0Y2ggKHZlcnRpY2FsQW5jaG9yKSB7XG4gICAgY2FzZSAnc3RhcnQnOlxuICAgICAgc3RhcnREeSA9IHJlZHVjZUNTU0NhbGMoXCJjYWxjKFwiLmNvbmNhdChjYXBIZWlnaHQsIFwiKVwiKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgc3RhcnREeSA9IHJlZHVjZUNTU0NhbGMoXCJjYWxjKFwiLmNvbmNhdCgod29yZHNCeUxpbmVzLmxlbmd0aCAtIDEpIC8gMiwgXCIgKiAtXCIpLmNvbmNhdChsaW5lSGVpZ2h0LCBcIiArIChcIikuY29uY2F0KGNhcEhlaWdodCwgXCIgLyAyKSlcIikpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXJ0RHkgPSByZWR1Y2VDU1NDYWxjKFwiY2FsYyhcIi5jb25jYXQod29yZHNCeUxpbmVzLmxlbmd0aCAtIDEsIFwiICogLVwiKS5jb25jYXQobGluZUhlaWdodCwgXCIpXCIpKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHZhciB0cmFuc2Zvcm1zID0gW107XG4gIGlmIChzY2FsZVRvRml0KSB7XG4gICAgdmFyIGxpbmVXaWR0aCA9IHdvcmRzQnlMaW5lc1swXS53aWR0aDtcbiAgICB2YXIgd2lkdGggPSBwcm9wcy53aWR0aDtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJzY2FsZShcIi5jb25jYXQoKGlzTnVtYmVyKHdpZHRoKSA/IHdpZHRoIC8gbGluZVdpZHRoIDogMSkgLyBsaW5lV2lkdGgsIFwiKVwiKSk7XG4gIH1cbiAgaWYgKGFuZ2xlKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwicm90YXRlKFwiLmNvbmNhdChhbmdsZSwgXCIsIFwiKS5jb25jYXQoeCwgXCIsIFwiKS5jb25jYXQoeSwgXCIpXCIpKTtcbiAgfVxuICBpZiAodHJhbnNmb3Jtcy5sZW5ndGgpIHtcbiAgICB0ZXh0UHJvcHMudHJhbnNmb3JtID0gdHJhbnNmb3Jtcy5qb2luKCcgJyk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dFwiLCBfZXh0ZW5kcyh7fSwgZmlsdGVyUHJvcHModGV4dFByb3BzLCB0cnVlKSwge1xuICAgIHg6IHgsXG4gICAgeTogeSxcbiAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLXRleHQnLCBjbGFzc05hbWUpLFxuICAgIHRleHRBbmNob3I6IHRleHRBbmNob3IsXG4gICAgZmlsbDogZmlsbC5pbmNsdWRlcygndXJsJykgPyBERUZBVUxUX0ZJTEwgOiBmaWxsXG4gIH0pLCB3b3Jkc0J5TGluZXMubWFwKGZ1bmN0aW9uIChsaW5lLCBpbmRleCkge1xuICAgIHZhciB3b3JkcyA9IGxpbmUud29yZHMuam9pbihicmVha0FsbCA/ICcnIDogJyAnKTtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gZHVwbGljYXRlIHdvcmRzIHdpbGwgY2F1c2UgZHVwbGljYXRlIGtleXNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0c3BhblwiLCB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIGR5OiBpbmRleCA9PT0gMCA/IHN0YXJ0RHkgOiBsaW5lSGVpZ2h0LFxuICAgICAgICBrZXk6IFwiXCIuY29uY2F0KHdvcmRzLCBcIi1cIikuY29uY2F0KGluZGV4KVxuICAgICAgfSwgd29yZHMpXG4gICAgKTtcbiAgfSkpO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkgeyByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpOyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgdHJ5IHsgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyB9IGNhdGNoICh0KSB7fSByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyByZXR1cm4gISF0OyB9KSgpOyB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBUb29sdGlwXG4gKi9cbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRGVmYXVsdFRvb2x0aXBDb250ZW50IH0gZnJvbSAnLi9EZWZhdWx0VG9vbHRpcENvbnRlbnQnO1xuaW1wb3J0IHsgVG9vbHRpcEJvdW5kaW5nQm94IH0gZnJvbSAnLi9Ub29sdGlwQm91bmRpbmdCb3gnO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi4vdXRpbC9HbG9iYWwnO1xuaW1wb3J0IHsgZ2V0VW5pcVBheWxvYWQgfSBmcm9tICcuLi91dGlsL3BheWxvYWQvZ2V0VW5pcVBheWxvYWQnO1xuZnVuY3Rpb24gZGVmYXVsdFVuaXFCeShlbnRyeSkge1xuICByZXR1cm4gZW50cnkuZGF0YUtleTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoY29udGVudCwgcHJvcHMpIHtcbiAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY29udGVudCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjb250ZW50LCBwcm9wcyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRlbnQsIHByb3BzKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdFRvb2x0aXBDb250ZW50LCBwcm9wcyk7XG59XG5leHBvcnQgdmFyIFRvb2x0aXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFRvb2x0aXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvb2x0aXApO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIFRvb2x0aXAsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2luaGVyaXRzKFRvb2x0aXAsIF9QdXJlQ29tcG9uZW50KTtcbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhUb29sdGlwLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgYWxsb3dFc2NhcGVWaWV3Qm94ID0gX3RoaXMkcHJvcHMuYWxsb3dFc2NhcGVWaWV3Qm94LFxuICAgICAgICBhbmltYXRpb25EdXJhdGlvbiA9IF90aGlzJHByb3BzLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25FYXNpbmcgPSBfdGhpcyRwcm9wcy5hbmltYXRpb25FYXNpbmcsXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wcy5jb250ZW50LFxuICAgICAgICBjb29yZGluYXRlID0gX3RoaXMkcHJvcHMuY29vcmRpbmF0ZSxcbiAgICAgICAgZmlsdGVyTnVsbCA9IF90aGlzJHByb3BzLmZpbHRlck51bGwsXG4gICAgICAgIGlzQW5pbWF0aW9uQWN0aXZlID0gX3RoaXMkcHJvcHMuaXNBbmltYXRpb25BY3RpdmUsXG4gICAgICAgIG9mZnNldCA9IF90aGlzJHByb3BzLm9mZnNldCxcbiAgICAgICAgcGF5bG9hZCA9IF90aGlzJHByb3BzLnBheWxvYWQsXG4gICAgICAgIHBheWxvYWRVbmlxQnkgPSBfdGhpcyRwcm9wcy5wYXlsb2FkVW5pcUJ5LFxuICAgICAgICBwb3NpdGlvbiA9IF90aGlzJHByb3BzLnBvc2l0aW9uLFxuICAgICAgICByZXZlcnNlRGlyZWN0aW9uID0gX3RoaXMkcHJvcHMucmV2ZXJzZURpcmVjdGlvbixcbiAgICAgICAgdXNlVHJhbnNsYXRlM2QgPSBfdGhpcyRwcm9wcy51c2VUcmFuc2xhdGUzZCxcbiAgICAgICAgdmlld0JveCA9IF90aGlzJHByb3BzLnZpZXdCb3gsXG4gICAgICAgIHdyYXBwZXJTdHlsZSA9IF90aGlzJHByb3BzLndyYXBwZXJTdHlsZTtcbiAgICAgIHZhciBmaW5hbFBheWxvYWQgPSBwYXlsb2FkICE9PSBudWxsICYmIHBheWxvYWQgIT09IHZvaWQgMCA/IHBheWxvYWQgOiBbXTtcbiAgICAgIGlmIChmaWx0ZXJOdWxsICYmIGZpbmFsUGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgZmluYWxQYXlsb2FkID0gZ2V0VW5pcVBheWxvYWQocGF5bG9hZC5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlICE9IG51bGwgJiYgKGVudHJ5LmhpZGUgIT09IHRydWUgfHwgX3RoaXMucHJvcHMuaW5jbHVkZUhpZGRlbik7XG4gICAgICAgIH0pLCBwYXlsb2FkVW5pcUJ5LCBkZWZhdWx0VW5pcUJ5KTtcbiAgICAgIH1cbiAgICAgIHZhciBoYXNQYXlsb2FkID0gZmluYWxQYXlsb2FkLmxlbmd0aCA+IDA7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcEJvdW5kaW5nQm94LCB7XG4gICAgICAgIGFsbG93RXNjYXBlVmlld0JveDogYWxsb3dFc2NhcGVWaWV3Qm94LFxuICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgIGFuaW1hdGlvbkVhc2luZzogYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBpc0FuaW1hdGlvbkFjdGl2ZTogaXNBbmltYXRpb25BY3RpdmUsXG4gICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlLFxuICAgICAgICBoYXNQYXlsb2FkOiBoYXNQYXlsb2FkLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgICByZXZlcnNlRGlyZWN0aW9uOiByZXZlcnNlRGlyZWN0aW9uLFxuICAgICAgICB1c2VUcmFuc2xhdGUzZDogdXNlVHJhbnNsYXRlM2QsXG4gICAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICAgIHdyYXBwZXJTdHlsZTogd3JhcHBlclN0eWxlXG4gICAgICB9LCByZW5kZXJDb250ZW50KGNvbnRlbnQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIHBheWxvYWQ6IGZpbmFsUGF5bG9hZFxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcbn0oUHVyZUNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoVG9vbHRpcCwgXCJkaXNwbGF5TmFtZVwiLCAnVG9vbHRpcCcpO1xuX2RlZmluZVByb3BlcnR5KFRvb2x0aXAsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgYWNjZXNzaWJpbGl0eUxheWVyOiBmYWxzZSxcbiAgYWxsb3dFc2NhcGVWaWV3Qm94OiB7XG4gICAgeDogZmFsc2UsXG4gICAgeTogZmFsc2VcbiAgfSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDQwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZScsXG4gIGNvbnRlbnRTdHlsZToge30sXG4gIGNvb3JkaW5hdGU6IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfSxcbiAgY3Vyc29yOiB0cnVlLFxuICBjdXJzb3JTdHlsZToge30sXG4gIGZpbHRlck51bGw6IHRydWUsXG4gIGlzQW5pbWF0aW9uQWN0aXZlOiAhR2xvYmFsLmlzU3NyLFxuICBpdGVtU3R5bGU6IHt9LFxuICBsYWJlbFN0eWxlOiB7fSxcbiAgb2Zmc2V0OiAxMCxcbiAgcmV2ZXJzZURpcmVjdGlvbjoge1xuICAgIHg6IGZhbHNlLFxuICAgIHk6IGZhbHNlXG4gIH0sXG4gIHNlcGFyYXRvcjogJyA6ICcsXG4gIHRyaWdnZXI6ICdob3ZlcicsXG4gIHVzZVRyYW5zbGF0ZTNkOiBmYWxzZSxcbiAgdmlld0JveDoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgd2lkdGg6IDBcbiAgfSxcbiAgd3JhcHBlclN0eWxlOiB7fVxufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFRvb2x0aXBUcmFuc2xhdGUgfSBmcm9tICcuLi91dGlsL3Rvb2x0aXAvdHJhbnNsYXRlJztcbnZhciBFUFNJTE9OID0gMTtcbmV4cG9ydCB2YXIgVG9vbHRpcEJvdW5kaW5nQm94ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBmdW5jdGlvbiBUb29sdGlwQm91bmRpbmdCb3goKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb29sdGlwQm91bmRpbmdCb3gpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfY2FsbFN1cGVyKHRoaXMsIFRvb2x0aXBCb3VuZGluZ0JveCwgW10uY29uY2F0KGFyZ3MpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwic3RhdGVcIiwge1xuICAgICAgZGlzbWlzc2VkOiBmYWxzZSxcbiAgICAgIGRpc21pc3NlZEF0Q29vcmRpbmF0ZToge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9LFxuICAgICAgbGFzdEJvdW5kaW5nQm94OiB7XG4gICAgICAgIHdpZHRoOiAtMSxcbiAgICAgICAgaGVpZ2h0OiAtMVxuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJoYW5kbGVLZXlEb3duXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzJGNvb3JkaW5hdCwgX3RoaXMkcHJvcHMkY29vcmRpbmF0MiwgX3RoaXMkcHJvcHMkY29vcmRpbmF0MywgX3RoaXMkcHJvcHMkY29vcmRpbmF0NDtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRpc21pc3NlZDogdHJ1ZSxcbiAgICAgICAgICBkaXNtaXNzZWRBdENvb3JkaW5hdGU6IHtcbiAgICAgICAgICAgIHg6IChfdGhpcyRwcm9wcyRjb29yZGluYXQgPSAoX3RoaXMkcHJvcHMkY29vcmRpbmF0MiA9IF90aGlzLnByb3BzLmNvb3JkaW5hdGUpID09PSBudWxsIHx8IF90aGlzJHByb3BzJGNvb3JkaW5hdDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzJGNvb3JkaW5hdDIueCkgIT09IG51bGwgJiYgX3RoaXMkcHJvcHMkY29vcmRpbmF0ICE9PSB2b2lkIDAgPyBfdGhpcyRwcm9wcyRjb29yZGluYXQgOiAwLFxuICAgICAgICAgICAgeTogKF90aGlzJHByb3BzJGNvb3JkaW5hdDMgPSAoX3RoaXMkcHJvcHMkY29vcmRpbmF0NCA9IF90aGlzLnByb3BzLmNvb3JkaW5hdGUpID09PSBudWxsIHx8IF90aGlzJHByb3BzJGNvb3JkaW5hdDQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzJGNvb3JkaW5hdDQueSkgIT09IG51bGwgJiYgX3RoaXMkcHJvcHMkY29vcmRpbmF0MyAhPT0gdm9pZCAwID8gX3RoaXMkcHJvcHMkY29vcmRpbmF0MyA6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfaW5oZXJpdHMoVG9vbHRpcEJvdW5kaW5nQm94LCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoVG9vbHRpcEJvdW5kaW5nQm94LCBbe1xuICAgIGtleTogXCJ1cGRhdGVCQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUJCb3goKSB7XG4gICAgICBpZiAodGhpcy53cmFwcGVyTm9kZSAmJiB0aGlzLndyYXBwZXJOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgICB2YXIgYm94ID0gdGhpcy53cmFwcGVyTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJveC53aWR0aCAtIHRoaXMuc3RhdGUubGFzdEJvdW5kaW5nQm94LndpZHRoKSA+IEVQU0lMT04gfHwgTWF0aC5hYnMoYm94LmhlaWdodCAtIHRoaXMuc3RhdGUubGFzdEJvdW5kaW5nQm94LmhlaWdodCkgPiBFUFNJTE9OKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBsYXN0Qm91bmRpbmdCb3g6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBib3guaGVpZ2h0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5sYXN0Qm91bmRpbmdCb3gud2lkdGggIT09IC0xIHx8IHRoaXMuc3RhdGUubGFzdEJvdW5kaW5nQm94LmhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgbGFzdEJvdW5kaW5nQm94OiB7XG4gICAgICAgICAgICB3aWR0aDogLTEsXG4gICAgICAgICAgICBoZWlnaHQ6IC0xXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICAgIHRoaXMudXBkYXRlQkJveCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJGNvb3JkaW5hdDUsIF90aGlzJHByb3BzJGNvb3JkaW5hdDY7XG4gICAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94KCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuZGlzbWlzc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICgoKF90aGlzJHByb3BzJGNvb3JkaW5hdDUgPSB0aGlzLnByb3BzLmNvb3JkaW5hdGUpID09PSBudWxsIHx8IF90aGlzJHByb3BzJGNvb3JkaW5hdDUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzJGNvb3JkaW5hdDUueCkgIT09IHRoaXMuc3RhdGUuZGlzbWlzc2VkQXRDb29yZGluYXRlLnggfHwgKChfdGhpcyRwcm9wcyRjb29yZGluYXQ2ID0gdGhpcy5wcm9wcy5jb29yZGluYXRlKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyRjb29yZGluYXQ2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRjb29yZGluYXQ2LnkpICE9PSB0aGlzLnN0YXRlLmRpc21pc3NlZEF0Q29vcmRpbmF0ZS55KSB7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzbWlzc2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgYWxsb3dFc2NhcGVWaWV3Qm94ID0gX3RoaXMkcHJvcHMuYWxsb3dFc2NhcGVWaWV3Qm94LFxuICAgICAgICBhbmltYXRpb25EdXJhdGlvbiA9IF90aGlzJHByb3BzLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25FYXNpbmcgPSBfdGhpcyRwcm9wcy5hbmltYXRpb25FYXNpbmcsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNvb3JkaW5hdGUgPSBfdGhpcyRwcm9wcy5jb29yZGluYXRlLFxuICAgICAgICBoYXNQYXlsb2FkID0gX3RoaXMkcHJvcHMuaGFzUGF5bG9hZCxcbiAgICAgICAgaXNBbmltYXRpb25BY3RpdmUgPSBfdGhpcyRwcm9wcy5pc0FuaW1hdGlvbkFjdGl2ZSxcbiAgICAgICAgb2Zmc2V0ID0gX3RoaXMkcHJvcHMub2Zmc2V0LFxuICAgICAgICBwb3NpdGlvbiA9IF90aGlzJHByb3BzLnBvc2l0aW9uLFxuICAgICAgICByZXZlcnNlRGlyZWN0aW9uID0gX3RoaXMkcHJvcHMucmV2ZXJzZURpcmVjdGlvbixcbiAgICAgICAgdXNlVHJhbnNsYXRlM2QgPSBfdGhpcyRwcm9wcy51c2VUcmFuc2xhdGUzZCxcbiAgICAgICAgdmlld0JveCA9IF90aGlzJHByb3BzLnZpZXdCb3gsXG4gICAgICAgIHdyYXBwZXJTdHlsZSA9IF90aGlzJHByb3BzLndyYXBwZXJTdHlsZTtcbiAgICAgIHZhciBfZ2V0VG9vbHRpcFRyYW5zbGF0ZSA9IGdldFRvb2x0aXBUcmFuc2xhdGUoe1xuICAgICAgICAgIGFsbG93RXNjYXBlVmlld0JveDogYWxsb3dFc2NhcGVWaWV3Qm94LFxuICAgICAgICAgIGNvb3JkaW5hdGU6IGNvb3JkaW5hdGUsXG4gICAgICAgICAgb2Zmc2V0VG9wTGVmdDogb2Zmc2V0LFxuICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgICByZXZlcnNlRGlyZWN0aW9uOiByZXZlcnNlRGlyZWN0aW9uLFxuICAgICAgICAgIHRvb2x0aXBCb3g6IHRoaXMuc3RhdGUubGFzdEJvdW5kaW5nQm94LFxuICAgICAgICAgIHVzZVRyYW5zbGF0ZTNkOiB1c2VUcmFuc2xhdGUzZCxcbiAgICAgICAgICB2aWV3Qm94OiB2aWV3Qm94XG4gICAgICAgIH0pLFxuICAgICAgICBjc3NDbGFzc2VzID0gX2dldFRvb2x0aXBUcmFuc2xhdGUuY3NzQ2xhc3NlcyxcbiAgICAgICAgY3NzUHJvcGVydGllcyA9IF9nZXRUb29sdGlwVHJhbnNsYXRlLmNzc1Byb3BlcnRpZXM7XG4gICAgICB2YXIgb3V0ZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHRyYW5zaXRpb246IGlzQW5pbWF0aW9uQWN0aXZlICYmIGFjdGl2ZSA/IFwidHJhbnNmb3JtIFwiLmNvbmNhdChhbmltYXRpb25EdXJhdGlvbiwgXCJtcyBcIikuY29uY2F0KGFuaW1hdGlvbkVhc2luZykgOiB1bmRlZmluZWRcbiAgICAgIH0sIGNzc1Byb3BlcnRpZXMpLCB7fSwge1xuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIHZpc2liaWxpdHk6ICF0aGlzLnN0YXRlLmRpc21pc3NlZCAmJiBhY3RpdmUgJiYgaGFzUGF5bG9hZCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nLFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwXG4gICAgICB9LCB3cmFwcGVyU3R5bGUpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAvLyBUaGlzIGVsZW1lbnQgYWxsb3cgbGlzdGVuaW5nIHRvIHRoZSBgRXNjYXBlYCBrZXkuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVjaGFydHMvcmVjaGFydHMvcHVsbC8yOTI1XG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNzc0NsYXNzZXMsXG4gICAgICAgICAgc3R5bGU6IG91dGVyU3R5bGUsXG4gICAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYobm9kZSkge1xuICAgICAgICAgICAgX3RoaXMyLndyYXBwZXJOb2RlID0gbm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGNoaWxkcmVuKVxuICAgICAgKTtcbiAgICB9XG4gIH1dKTtcbn0oUHVyZUNvbXBvbmVudCk7IiwidmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuZXhwb3J0IHZhciBMYXllciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBsYXllckNsYXNzID0gY2xzeCgncmVjaGFydHMtbGF5ZXInLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGxheWVyQ2xhc3NcbiAgfSwgZmlsdGVyUHJvcHMob3RoZXJzLCB0cnVlKSwge1xuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbik7XG59KTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcInZpZXdCb3hcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcInRpdGxlXCIsIFwiZGVzY1wiXTtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBTdXJmYWNlXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBTdXJmYWNlKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIHZpZXdCb3ggPSBwcm9wcy52aWV3Qm94LFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgZGVzYyA9IHByb3BzLmRlc2MsXG4gICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgc3ZnVmlldyA9IHZpZXdCb3ggfHwge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbiAgdmFyIGxheWVyQ2xhc3MgPSBjbHN4KCdyZWNoYXJ0cy1zdXJmYWNlJywgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHt9LCBmaWx0ZXJQcm9wcyhvdGhlcnMsIHRydWUsICdzdmcnKSwge1xuICAgIGNsYXNzTmFtZTogbGF5ZXJDbGFzcyxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHZpZXdCb3g6IFwiXCIuY29uY2F0KHN2Z1ZpZXcueCwgXCIgXCIpLmNvbmNhdChzdmdWaWV3LnksIFwiIFwiKS5jb25jYXQoc3ZnVmlldy53aWR0aCwgXCIgXCIpLmNvbmNhdChzdmdWaWV3LmhlaWdodClcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgdGl0bGUpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlc2NcIiwgbnVsbCwgZGVzYyksIGNoaWxkcmVuKTtcbn0iLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IGZpbmQgZnJvbSAnbG9kYXNoL2ZpbmQnO1xuaW1wb3J0IGV2ZXJ5IGZyb20gJ2xvZGFzaC9ldmVyeSc7XG5pbXBvcnQgeyBjYWxjdWxhdGVWaWV3Qm94IH0gZnJvbSAnLi4vdXRpbC9jYWxjdWxhdGVWaWV3Qm94JztcbmltcG9ydCB7IGdldEFueUVsZW1lbnRPZk9iamVjdCB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmV4cG9ydCB2YXIgWEF4aXNDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCB2YXIgWUF4aXNDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCB2YXIgVmlld0JveENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IHZhciBPZmZzZXRDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IHZhciBDbGlwUGF0aElkQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5leHBvcnQgdmFyIENoYXJ0SGVpZ2h0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KDApO1xuZXhwb3J0IHZhciBDaGFydFdpZHRoQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KDApO1xuXG4vKipcbiAqIFdpbGwgYWRkIGFsbCB0aGUgcHJvcGVydGllcyByZXF1aXJlZCB0byByZW5kZXIgYWxsIGluZGl2aWR1YWwgUmVjaGFydHMgY29tcG9uZW50cyBpbnRvIGEgUmVhY3QgQ29udGV4dC5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byByZWFkIHRoZXNlIHByb3BlcnRpZXMsIHNlZSB0aGUgY29sbGVjdGlvbiBvZiBob29rcyBleHBvcnRlZCBmcm9tIHRoaXMgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgQ2F0ZWdvcmljYWxDaGFydFN0YXRlLCBwbHVzIGNoaWxkcmVuXG4gKiBAcmV0dXJucyB7UmVhY3RFbGVtZW50fSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyXG4gKi9cbmV4cG9ydCB2YXIgQ2hhcnRMYXlvdXRDb250ZXh0UHJvdmlkZXIgPSBmdW5jdGlvbiBDaGFydExheW91dENvbnRleHRQcm92aWRlcihwcm9wcykge1xuICB2YXIgX3Byb3BzJHN0YXRlID0gcHJvcHMuc3RhdGUsXG4gICAgeEF4aXNNYXAgPSBfcHJvcHMkc3RhdGUueEF4aXNNYXAsXG4gICAgeUF4aXNNYXAgPSBfcHJvcHMkc3RhdGUueUF4aXNNYXAsXG4gICAgb2Zmc2V0ID0gX3Byb3BzJHN0YXRlLm9mZnNldCxcbiAgICBjbGlwUGF0aElkID0gcHJvcHMuY2xpcFBhdGhJZCxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuXG4gIC8qKlxuICAgKiBQZXJoYXBzIHdlIHNob3VsZCBjb21wdXRlIHRoaXMgcHJvcGVydHkgd2hlbiByZWFkaW5nPyBMZXQncyBzZWUgd2hhdCBpcyBtb3JlIG9mdGVuIHVzZWRcbiAgICovXG4gIHZhciB2aWV3Qm94ID0gY2FsY3VsYXRlVmlld0JveChvZmZzZXQpO1xuXG4gIC8qXG4gICAqIFRoaXMgcHJldGVuZHMgdG8gYmUgYSBzaW5nbGUgY29udGV4dCBidXQgYWN0dWFsbHkgaXMgc3BsaXQgaW50byBtdWx0aXBsZSBzbWFsbGVyIG9uZXMuXG4gICAqIFdoeT9cbiAgICogQmVjYXVzZSBvbmUgUmVhY3QgQ29udGV4dCBvbmx5IGFsbG93cyB0byBzZXQgb25lIHZhbHVlLlxuICAgKiBCdXQgd2UgbmVlZCB0byBzZXQgbXVsdGlwbGUgdmFsdWVzLlxuICAgKiBJZiB3ZSBkbyB0aGF0IHdpdGggb25lIGNvbnRleHQsIHRoZW4gd2UgZm9yY2UgcmUtcmVuZGVyIG9uIGNvbXBvbmVudHMgdGhhdCBtaWdodCBub3QgZXZlbiBiZSBpbnRlcmVzdGVkXG4gICAqIGluIHRoZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0aGF0IGhhcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBCeSBzcGxpdHRpbmcgaW50byBzbWFsbGVyIGNvbnRleHRzLCB3ZSBhbGxvdyBlYWNoIGNvbXBvbmVudHMgdG8gYmUgb3B0aW1pemVkIGFuZCBvbmx5IHJlLXJlbmRlciB3aGVuIGl0cyBkZXBlbmRlbmNpZXMgY2hhbmdlLlxuICAgKlxuICAgKiBUbyBhY3R1YWxseSBhY2hpZXZlIHRoZSBvcHRpbWFsIHJlLXJlbmRlciwgaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZSBSZWFjdC5tZW1vKCkuXG4gICAqIFNlZSB0aGUgdGVzdCBmaWxlIGZvciBkZXRhaWxzLlxuICAgKi9cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFhBeGlzQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB4QXhpc01hcFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZQXhpc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogeUF4aXNNYXBcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT2Zmc2V0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBvZmZzZXRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld0JveENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmlld0JveFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbGlwUGF0aElkQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjbGlwUGF0aElkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0SGVpZ2h0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBoZWlnaHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRXaWR0aENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogd2lkdGhcbiAgfSwgY2hpbGRyZW4pKSkpKSkpO1xufTtcbmV4cG9ydCB2YXIgdXNlQ2xpcFBhdGhJZCA9IGZ1bmN0aW9uIHVzZUNsaXBQYXRoSWQoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KENsaXBQYXRoSWRDb250ZXh0KTtcbn07XG5mdW5jdGlvbiBnZXRLZXlzRm9yRGVidWcob2JqZWN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdUaGVyZSBhcmUgbm8gYXZhaWxhYmxlIGlkcy4nO1xuICB9XG4gIHJldHVybiBcIkF2YWlsYWJsZSBpZHMgYXJlOiBcIi5jb25jYXQoa2V5cywgXCIuXCIpO1xufVxuXG4vKipcbiAqIFRoaXMgZWl0aGVyIGZpbmRzIGFuZCByZXR1cm5zIEF4aXMgYnkgdGhlIHNwZWNpZmllZCBJRCwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBhbiBheGlzIHdpdGggdGhpcyBJRCBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBAcGFyYW0geEF4aXNJZCBpZGVudGlmaWVyIG9mIHRoZSBheGlzIC0gaXQncyBlaXRoZXIgYXV0b2dlbmVyYXRlZCAoJzAnKSwgb3IgcGFzc2VkIHZpYSBgaWRgIHByb3AgYXMgPFhBeGlzIGlkPSdmb28nIC8+XG4gKiBAcmV0dXJucyBheGlzIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIGF4aXMgd2l0aCB0aGlzIElEIGV4aXN0c1xuICovXG5leHBvcnQgdmFyIHVzZVhBeGlzT3JUaHJvdyA9IGZ1bmN0aW9uIHVzZVhBeGlzT3JUaHJvdyh4QXhpc0lkKSB7XG4gIHZhciB4QXhpc01hcCA9IHVzZUNvbnRleHQoWEF4aXNDb250ZXh0KTtcbiAgISh4QXhpc01hcCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NvdWxkIG5vdCBmaW5kIFJlY2hhcnRzIGNvbnRleHQ7IGFyZSB5b3Ugc3VyZSB0aGlzIGlzIHJlbmRlcmVkIGluc2lkZSBhIFJlY2hhcnRzIHdyYXBwZXIgY29tcG9uZW50PycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgdmFyIHhBeGlzID0geEF4aXNNYXBbeEF4aXNJZF07XG4gICEoeEF4aXMgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiQ291bGQgbm90IGZpbmQgeEF4aXMgYnkgaWQgXFxcIlwiLmNvbmNhdCh4QXhpc0lkLCBcIlxcXCIgW1wiKS5jb25jYXQoX3R5cGVvZih4QXhpc0lkKSwgXCJdLiBcIikuY29uY2F0KGdldEtleXNGb3JEZWJ1Zyh4QXhpc01hcCkpKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiB4QXhpcztcbn07XG5cbi8qKlxuICogVGhpcyB3aWxsIGZpbmQgYW4gYXJiaXRyYXJ5IGZpcnN0IFhBeGlzLiBJZiB0aGVyZSdzIGV4YWN0bHkgb25lIGl0IGFsd2F5cyByZXR1cm5zIHRoYXQgb25lXG4gKiAtIGJ1dCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgdGhlbiBpdCBjYW4gcmV0dXJuIGFueSBvZiB0aG9zZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCBzcGVjaWZpYyBYQXhpcyBvdXQgb2YgbXVsdGlwbGUgdGhlbiBwcmVmZXIgdXNpbmcgdXNlWEF4aXNPclRocm93XG4gKlxuICogQHJldHVybnMgWCBheGlzT3B0aW9ucywgb3IgdW5kZWZpbmVkIC0gaWYgdGhlcmUgYXJlIG5vIFggYXhlc1xuICovXG5leHBvcnQgdmFyIHVzZUFyYml0cmFyeVhBeGlzID0gZnVuY3Rpb24gdXNlQXJiaXRyYXJ5WEF4aXMoKSB7XG4gIHZhciB4QXhpc01hcCA9IHVzZUNvbnRleHQoWEF4aXNDb250ZXh0KTtcbiAgcmV0dXJuIGdldEFueUVsZW1lbnRPZk9iamVjdCh4QXhpc01hcCk7XG59O1xuXG4vKipcbiAqIFRoaXMgd2lsbCBmaW5kIGFuIGFyYml0cmFyeSBmaXJzdCBZQXhpcy4gSWYgdGhlcmUncyBleGFjdGx5IG9uZSBpdCBhbHdheXMgcmV0dXJucyB0aGF0IG9uZVxuICogLSBidXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRoZW4gaXQgY2FuIHJldHVybiBhbnkgb2YgdGhvc2UuXG4gKlxuICogSWYgeW91IHdhbnQgc3BlY2lmaWMgWUF4aXMgb3V0IG9mIG11bHRpcGxlIHRoZW4gcHJlZmVyIHVzaW5nIHVzZVhBeGlzT3JUaHJvd1xuICpcbiAqIEByZXR1cm5zIFkgYXhpc09wdGlvbnMsIG9yIHVuZGVmaW5lZCAtIGlmIHRoZXJlIGFyZSBubyBZIGF4ZXNcbiAqL1xuZXhwb3J0IHZhciB1c2VBcmJpdHJhcnlZQXhpcyA9IGZ1bmN0aW9uIHVzZUFyYml0cmFyeVlBeGlzKCkge1xuICB2YXIgeUF4aXNNYXAgPSB1c2VDb250ZXh0KFlBeGlzQ29udGV4dCk7XG4gIHJldHVybiBnZXRBbnlFbGVtZW50T2ZPYmplY3QoeUF4aXNNYXApO1xufTtcblxuLyoqXG4gKiBUaGlzIGhvb2tzIHdpbGw6XG4gKiAxc3QgYXR0ZW1wdCB0byBmaW5kIGFuIFlBeGlzIHRoYXQgaGFzIGFsbCBlbGVtZW50cyBpbiBpdHMgZG9tYWluIGZpbml0ZVxuICogSWYgbm8gc3VjaCBheGlzIGV4aXN0cywgaXQgd2lsbCByZXR1cm4gYW4gYXJiaXRyYXJ5IFlBeGlzXG4gKiBpZiB0aGVyZSBhcmUgbm8gWSBheGVzIHRoZW4gaXQgcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcmV0dXJucyBFaXRoZXIgWSBheGlzT3B0aW9ucywgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBZIGF4ZXNcbiAqL1xuZXhwb3J0IHZhciB1c2VZQXhpc1dpdGhGaW5pdGVEb21haW5PclJhbmRvbSA9IGZ1bmN0aW9uIHVzZVlBeGlzV2l0aEZpbml0ZURvbWFpbk9yUmFuZG9tKCkge1xuICB2YXIgeUF4aXNNYXAgPSB1c2VDb250ZXh0KFlBeGlzQ29udGV4dCk7XG4gIHZhciB5QXhpc1dpdGhGaW5pdGVEb21haW4gPSBmaW5kKHlBeGlzTWFwLCBmdW5jdGlvbiAoYXhpcykge1xuICAgIHJldHVybiBldmVyeShheGlzLmRvbWFpbiwgTnVtYmVyLmlzRmluaXRlKTtcbiAgfSk7XG4gIHJldHVybiB5QXhpc1dpdGhGaW5pdGVEb21haW4gfHwgZ2V0QW55RWxlbWVudE9mT2JqZWN0KHlBeGlzTWFwKTtcbn07XG5cbi8qKlxuICogVGhpcyBlaXRoZXIgZmluZHMgYW5kIHJldHVybnMgQXhpcyBieSB0aGUgc3BlY2lmaWVkIElELCBvciB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFuIGF4aXMgd2l0aCB0aGlzIElEIGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSB5QXhpc0lkIGlkZW50aWZpZXIgb2YgdGhlIGF4aXMgLSBpdCdzIGVpdGhlciBhdXRvZ2VuZXJhdGVkICgnMCcpLCBvciBwYXNzZWQgdmlhIGBpZGAgcHJvcCBhcyA8WUF4aXMgaWQ9J2ZvbycgLz5cbiAqIEByZXR1cm5zIGF4aXMgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gYXhpcyB3aXRoIHRoaXMgSUQgZXhpc3RzXG4gKi9cbmV4cG9ydCB2YXIgdXNlWUF4aXNPclRocm93ID0gZnVuY3Rpb24gdXNlWUF4aXNPclRocm93KHlBeGlzSWQpIHtcbiAgdmFyIHlBeGlzTWFwID0gdXNlQ29udGV4dChZQXhpc0NvbnRleHQpO1xuICAhKHlBeGlzTWFwICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQ291bGQgbm90IGZpbmQgUmVjaGFydHMgY29udGV4dDsgYXJlIHlvdSBzdXJlIHRoaXMgaXMgcmVuZGVyZWQgaW5zaWRlIGEgUmVjaGFydHMgd3JhcHBlciBjb21wb25lbnQ/JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB2YXIgeUF4aXMgPSB5QXhpc01hcFt5QXhpc0lkXTtcbiAgISh5QXhpcyAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJDb3VsZCBub3QgZmluZCB5QXhpcyBieSBpZCBcXFwiXCIuY29uY2F0KHlBeGlzSWQsIFwiXFxcIiBbXCIpLmNvbmNhdChfdHlwZW9mKHlBeGlzSWQpLCBcIl0uIFwiKS5jb25jYXQoZ2V0S2V5c0ZvckRlYnVnKHlBeGlzTWFwKSkpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHlBeGlzO1xufTtcbmV4cG9ydCB2YXIgdXNlVmlld0JveCA9IGZ1bmN0aW9uIHVzZVZpZXdCb3goKSB7XG4gIHZhciB2aWV3Qm94ID0gdXNlQ29udGV4dChWaWV3Qm94Q29udGV4dCk7XG4gIHJldHVybiB2aWV3Qm94O1xufTtcbmV4cG9ydCB2YXIgdXNlT2Zmc2V0ID0gZnVuY3Rpb24gdXNlT2Zmc2V0KCkge1xuICByZXR1cm4gdXNlQ29udGV4dChPZmZzZXRDb250ZXh0KTtcbn07XG5leHBvcnQgdmFyIHVzZUNoYXJ0V2lkdGggPSBmdW5jdGlvbiB1c2VDaGFydFdpZHRoKCkge1xuICByZXR1cm4gdXNlQ29udGV4dChDaGFydFdpZHRoQ29udGV4dCk7XG59O1xuZXhwb3J0IHZhciB1c2VDaGFydEhlaWdodCA9IGZ1bmN0aW9uIHVzZUNoYXJ0SGVpZ2h0KCkge1xuICByZXR1cm4gdXNlQ29udGV4dChDaGFydEhlaWdodENvbnRleHQpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=