"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_recharts_es6_polar_Pie_js-node_modules_recharts_es6_polar_PolarAngleAxis-559055"],{ /***/ "../../../node_modules/recharts/es6/polar/Pie.js": /*!*******************************************************!*\ !*** ../../../node_modules/recharts/es6/polar/Pie.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Pie: () => (/* binding */ Pie) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_smooth__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react-smooth */ "../../../node_modules/react-smooth/es6/index.js"); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/get */ "../../../node_modules/lodash/get.js"); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isEqual */ "../../../node_modules/lodash/isEqual.js"); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isEqual__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _shape_Curve__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../shape/Curve */ "../../../node_modules/recharts/es6/shape/Curve.js"); /* harmony import */ var _component_Text__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../component/Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _component_LabelList__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../component/LabelList */ "../../../node_modules/recharts/es6/component/LabelList.js"); /* harmony import */ var _component_Cell__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../component/Cell */ "../../../node_modules/recharts/es6/component/Cell.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_Global__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ActiveShapeUtils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/ActiveShapeUtils */ "../../../node_modules/recharts/es6/util/ActiveShapeUtils.js"); var _Pie; 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 Render sectors of a pie */ var Pie = /*#__PURE__*/function (_PureComponent) { function Pie(props) { var _this; _classCallCheck(this, Pie); _this = _callSuper(this, Pie, [props]); _defineProperty(_this, "pieRef", null); _defineProperty(_this, "sectorRefs", []); _defineProperty(_this, "id", (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.uniqueId)('recharts-pie-')); _defineProperty(_this, "handleAnimationEnd", function () { var onAnimationEnd = _this.props.onAnimationEnd; _this.setState({ isAnimationFinished: true }); if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default()(onAnimationEnd)) { onAnimationEnd(); } }); _defineProperty(_this, "handleAnimationStart", function () { var onAnimationStart = _this.props.onAnimationStart; _this.setState({ isAnimationFinished: false }); if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default()(onAnimationStart)) { onAnimationStart(); } }); _this.state = { isAnimationFinished: !props.isAnimationActive, prevIsAnimationActive: props.isAnimationActive, prevAnimationId: props.animationId, sectorToFocus: 0 }; return _this; } _inherits(Pie, _PureComponent); return _createClass(Pie, [{ key: "isActiveIndex", value: function isActiveIndex(i) { var activeIndex = this.props.activeIndex; if (Array.isArray(activeIndex)) { return activeIndex.indexOf(i) !== -1; } return i === activeIndex; } }, { key: "hasActiveIndex", value: function hasActiveIndex() { var activeIndex = this.props.activeIndex; return Array.isArray(activeIndex) ? activeIndex.length !== 0 : activeIndex || activeIndex === 0; } }, { key: "renderLabels", value: function renderLabels(sectors) { var isAnimationActive = this.props.isAnimationActive; if (isAnimationActive && !this.state.isAnimationFinished) { return null; } var _this$props = this.props, label = _this$props.label, labelLine = _this$props.labelLine, dataKey = _this$props.dataKey, valueKey = _this$props.valueKey; var pieProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(this.props, false); var customLabelProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(label, false); var customLabelLineProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(labelLine, false); var offsetRadius = label && label.offsetRadius || 20; var labels = sectors.map(function (entry, i) { var midAngle = (entry.startAngle + entry.endAngle) / 2; var endPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_8__.polarToCartesian)(entry.cx, entry.cy, entry.outerRadius + offsetRadius, midAngle); var labelProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, pieProps), entry), {}, { stroke: 'none' }, customLabelProps), {}, { index: i, textAnchor: Pie.getTextAnchor(endPoint.x, entry.cx) }, endPoint); var lineProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, pieProps), entry), {}, { fill: 'none', stroke: entry.fill }, customLabelLineProps), {}, { index: i, points: [(0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_8__.polarToCartesian)(entry.cx, entry.cy, entry.outerRadius, midAngle), endPoint] }); var realDataKey = dataKey; // TODO: compatible to lower versions if (lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(dataKey) && lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(valueKey)) { realDataKey = 'value'; } else if (lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(dataKey)) { realDataKey = valueKey; } return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, { key: "label-".concat(entry.startAngle, "-").concat(entry.endAngle, "-").concat(entry.midAngle, "-").concat(i) }, labelLine && Pie.renderLabelLineItem(labelLine, lineProps, 'line'), Pie.renderLabelItem(label, labelProps, (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, realDataKey))) ); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, { className: "recharts-pie-labels" }, labels); } }, { key: "renderSectorsStatically", value: function renderSectorsStatically(sectors) { var _this2 = this; var _this$props2 = this.props, activeShape = _this$props2.activeShape, blendStroke = _this$props2.blendStroke, inactiveShapeProp = _this$props2.inactiveShape; return sectors.map(function (entry, i) { if ((entry === null || entry === void 0 ? void 0 : entry.startAngle) === 0 && (entry === null || entry === void 0 ? void 0 : entry.endAngle) === 0 && sectors.length !== 1) return null; var isActive = _this2.isActiveIndex(i); var inactiveShape = inactiveShapeProp && _this2.hasActiveIndex() ? inactiveShapeProp : null; var sectorOptions = isActive ? activeShape : inactiveShape; var sectorProps = _objectSpread(_objectSpread({}, entry), {}, { stroke: blendStroke ? entry.fill : entry.stroke, tabIndex: -1 }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, _extends({ ref: function ref(_ref) { if (_ref && !_this2.sectorRefs.includes(_ref)) { _this2.sectorRefs.push(_ref); } }, tabIndex: -1, className: "recharts-pie-sector" }, (0,_util_types__WEBPACK_IMPORTED_MODULE_11__.adaptEventsOfChild)(_this2.props, entry, i), { // eslint-disable-next-line react/no-array-index-key key: "sector-".concat(entry === null || entry === void 0 ? void 0 : entry.startAngle, "-").concat(entry === null || entry === void 0 ? void 0 : entry.endAngle, "-").concat(entry.midAngle, "-").concat(i) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_util_ActiveShapeUtils__WEBPACK_IMPORTED_MODULE_12__.Shape, _extends({ option: sectorOptions, isActive: isActive, shapeType: "sector" }, sectorProps))); }); } }, { key: "renderSectorsWithAnimation", value: function renderSectorsWithAnimation() { var _this3 = this; var _this$props3 = this.props, sectors = _this$props3.sectors, isAnimationActive = _this$props3.isAnimationActive, animationBegin = _this$props3.animationBegin, animationDuration = _this$props3.animationDuration, animationEasing = _this$props3.animationEasing, animationId = _this$props3.animationId; var _this$state = this.state, prevSectors = _this$state.prevSectors, prevIsAnimationActive = _this$state.prevIsAnimationActive; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_13__["default"], { begin: animationBegin, duration: animationDuration, isActive: isAnimationActive, easing: animationEasing, from: { t: 0 }, to: { t: 1 }, key: "pie-".concat(animationId, "-").concat(prevIsAnimationActive), onAnimationStart: this.handleAnimationStart, onAnimationEnd: this.handleAnimationEnd }, function (_ref2) { var t = _ref2.t; var stepData = []; var first = sectors && sectors[0]; var curAngle = first.startAngle; sectors.forEach(function (entry, index) { var prev = prevSectors && prevSectors[index]; var paddingAngle = index > 0 ? lodash_get__WEBPACK_IMPORTED_MODULE_1___default()(entry, 'paddingAngle', 0) : 0; if (prev) { var angleIp = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.interpolateNumber)(prev.endAngle - prev.startAngle, entry.endAngle - entry.startAngle); var latest = _objectSpread(_objectSpread({}, entry), {}, { startAngle: curAngle + paddingAngle, endAngle: curAngle + angleIp(t) + paddingAngle }); stepData.push(latest); curAngle = latest.endAngle; } else { var endAngle = entry.endAngle, startAngle = entry.startAngle; var interpolatorAngle = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.interpolateNumber)(0, endAngle - startAngle); var deltaAngle = interpolatorAngle(t); var _latest = _objectSpread(_objectSpread({}, entry), {}, { startAngle: curAngle + paddingAngle, endAngle: curAngle + deltaAngle + paddingAngle }); stepData.push(_latest); curAngle = _latest.endAngle; } }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, null, _this3.renderSectorsStatically(stepData)); }); } }, { key: "attachKeyboardHandlers", value: function attachKeyboardHandlers(pieRef) { var _this4 = this; // eslint-disable-next-line no-param-reassign pieRef.onkeydown = function (e) { if (!e.altKey) { switch (e.key) { case 'ArrowLeft': { var next = ++_this4.state.sectorToFocus % _this4.sectorRefs.length; _this4.sectorRefs[next].focus(); _this4.setState({ sectorToFocus: next }); break; } case 'ArrowRight': { var _next = --_this4.state.sectorToFocus < 0 ? _this4.sectorRefs.length - 1 : _this4.state.sectorToFocus % _this4.sectorRefs.length; _this4.sectorRefs[_next].focus(); _this4.setState({ sectorToFocus: _next }); break; } case 'Escape': { _this4.sectorRefs[_this4.state.sectorToFocus].blur(); _this4.setState({ sectorToFocus: 0 }); break; } default: { // There is nothing to do here } } } }; } }, { key: "renderSectors", value: function renderSectors() { var _this$props4 = this.props, sectors = _this$props4.sectors, isAnimationActive = _this$props4.isAnimationActive; var prevSectors = this.state.prevSectors; if (isAnimationActive && sectors && sectors.length && (!prevSectors || !lodash_isEqual__WEBPACK_IMPORTED_MODULE_2___default()(prevSectors, sectors))) { return this.renderSectorsWithAnimation(); } return this.renderSectorsStatically(sectors); } }, { key: "componentDidMount", value: function componentDidMount() { if (this.pieRef) { this.attachKeyboardHandlers(this.pieRef); } } }, { key: "render", value: function render() { var _this5 = this; var _this$props5 = this.props, hide = _this$props5.hide, sectors = _this$props5.sectors, className = _this$props5.className, label = _this$props5.label, cx = _this$props5.cx, cy = _this$props5.cy, innerRadius = _this$props5.innerRadius, outerRadius = _this$props5.outerRadius, isAnimationActive = _this$props5.isAnimationActive; var isAnimationFinished = this.state.isAnimationFinished; if (hide || !sectors || !sectors.length || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(cx) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(cy) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(innerRadius) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(outerRadius)) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('recharts-pie', className); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, { tabIndex: this.props.rootTabIndex, className: layerClass, ref: function ref(_ref3) { _this5.pieRef = _ref3; } }, this.renderSectors(), label && this.renderLabels(sectors), _component_Label__WEBPACK_IMPORTED_MODULE_14__.Label.renderCallByParent(this.props, null, false), (!isAnimationActive || isAnimationFinished) && _component_LabelList__WEBPACK_IMPORTED_MODULE_15__.LabelList.renderCallByParent(this.props, sectors, false)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { if (prevState.prevIsAnimationActive !== nextProps.isAnimationActive) { return { prevIsAnimationActive: nextProps.isAnimationActive, prevAnimationId: nextProps.animationId, curSectors: nextProps.sectors, prevSectors: [], isAnimationFinished: true }; } if (nextProps.isAnimationActive && nextProps.animationId !== prevState.prevAnimationId) { return { prevAnimationId: nextProps.animationId, curSectors: nextProps.sectors, prevSectors: prevState.curSectors, isAnimationFinished: true }; } if (nextProps.sectors !== prevState.curSectors) { return { curSectors: nextProps.sectors, isAnimationFinished: true }; } return null; } }, { key: "getTextAnchor", value: function getTextAnchor(x, cx) { if (x > cx) { return 'start'; } if (x < cx) { return 'end'; } return 'middle'; } }, { key: "renderLabelLineItem", value: function renderLabelLineItem(option, props, key) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default()(option)) { return option(props); } var className = (0,clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('recharts-pie-label-line', typeof option !== 'boolean' ? option.className : ''); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Curve__WEBPACK_IMPORTED_MODULE_16__.Curve, _extends({}, props, { key: key, type: "linear", className: className })); } }, { key: "renderLabelItem", value: function renderLabelItem(option, props, value) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } var label = value; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default()(option)) { label = option(props); if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(label)) { return label; } } var className = (0,clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('recharts-pie-label-text', typeof option !== 'boolean' && !lodash_isFunction__WEBPACK_IMPORTED_MODULE_4___default()(option) ? option.className : ''); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_17__.Text, _extends({}, props, { alignmentBaseline: "middle", className: className }), label); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _Pie = Pie; _defineProperty(Pie, "displayName", 'Pie'); _defineProperty(Pie, "defaultProps", { stroke: '#fff', fill: '#808080', legendType: 'rect', cx: '50%', cy: '50%', startAngle: 0, endAngle: 360, innerRadius: 0, outerRadius: '80%', paddingAngle: 0, labelLine: true, hide: false, minAngle: 0, isAnimationActive: !_util_Global__WEBPACK_IMPORTED_MODULE_18__.Global.isSsr, animationBegin: 400, animationDuration: 1500, animationEasing: 'ease', nameKey: 'name', blendStroke: false, rootTabIndex: 0 }); _defineProperty(Pie, "parseDeltaAngle", function (startAngle, endAngle) { var sign = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.mathSign)(endAngle - startAngle); var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 360); return sign * deltaAngle; }); _defineProperty(Pie, "getRealPieData", function (itemProps) { var data = itemProps.data, children = itemProps.children; var presentationProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(itemProps, false); var cells = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.findAllByType)(children, _component_Cell__WEBPACK_IMPORTED_MODULE_19__.Cell); if (data && data.length) { return data.map(function (entry, index) { return _objectSpread(_objectSpread(_objectSpread({ payload: entry }, presentationProps), entry), cells && cells[index] && cells[index].props); }); } if (cells && cells.length) { return cells.map(function (cell) { return _objectSpread(_objectSpread({}, presentationProps), cell.props); }); } return []; }); _defineProperty(Pie, "parseCoordinateOfPie", function (itemProps, offset) { var top = offset.top, left = offset.left, width = offset.width, height = offset.height; var maxPieRadius = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_8__.getMaxRadius)(width, height); var cx = left + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.getPercentValue)(itemProps.cx, width, width / 2); var cy = top + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.getPercentValue)(itemProps.cy, height, height / 2); var innerRadius = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.getPercentValue)(itemProps.innerRadius, maxPieRadius, 0); var outerRadius = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.getPercentValue)(itemProps.outerRadius, maxPieRadius, maxPieRadius * 0.8); var maxRadius = itemProps.maxRadius || Math.sqrt(width * width + height * height) / 2; return { cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, maxRadius: maxRadius }; }); _defineProperty(Pie, "getComposedData", function (_ref4) { var item = _ref4.item, offset = _ref4.offset; var itemProps = item.type.defaultProps !== undefined ? _objectSpread(_objectSpread({}, item.type.defaultProps), item.props) : item.props; var pieData = _Pie.getRealPieData(itemProps); if (!pieData || !pieData.length) { return null; } var cornerRadius = itemProps.cornerRadius, startAngle = itemProps.startAngle, endAngle = itemProps.endAngle, paddingAngle = itemProps.paddingAngle, dataKey = itemProps.dataKey, nameKey = itemProps.nameKey, valueKey = itemProps.valueKey, tooltipType = itemProps.tooltipType; var minAngle = Math.abs(itemProps.minAngle); var coordinate = _Pie.parseCoordinateOfPie(itemProps, offset); var deltaAngle = _Pie.parseDeltaAngle(startAngle, endAngle); var absDeltaAngle = Math.abs(deltaAngle); var realDataKey = dataKey; if (lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(dataKey) && lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(valueKey)) { (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_20__.warn)(false, "Use \"dataKey\" to specify the value of pie,\n the props \"valueKey\" will be deprecated in 1.1.0"); realDataKey = 'value'; } else if (lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(dataKey)) { (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_20__.warn)(false, "Use \"dataKey\" to specify the value of pie,\n the props \"valueKey\" will be deprecated in 1.1.0"); realDataKey = valueKey; } var notZeroItemCount = pieData.filter(function (entry) { return (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, realDataKey, 0) !== 0; }).length; var totalPadingAngle = (absDeltaAngle >= 360 ? notZeroItemCount : notZeroItemCount - 1) * paddingAngle; var realTotalAngle = absDeltaAngle - notZeroItemCount * minAngle - totalPadingAngle; var sum = pieData.reduce(function (result, entry) { var val = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, realDataKey, 0); return result + ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(val) ? val : 0); }, 0); var sectors; if (sum > 0) { var prev; sectors = pieData.map(function (entry, i) { var val = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, realDataKey, 0); var name = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, nameKey, i); var percent = ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumber)(val) ? val : 0) / sum; var tempStartAngle; if (i) { tempStartAngle = prev.endAngle + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.mathSign)(deltaAngle) * paddingAngle * (val !== 0 ? 1 : 0); } else { tempStartAngle = startAngle; } var tempEndAngle = tempStartAngle + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.mathSign)(deltaAngle) * ((val !== 0 ? minAngle : 0) + percent * realTotalAngle); var midAngle = (tempStartAngle + tempEndAngle) / 2; var middleRadius = (coordinate.innerRadius + coordinate.outerRadius) / 2; var tooltipPayload = [{ name: name, value: val, payload: entry, dataKey: realDataKey, type: tooltipType }]; var tooltipPosition = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_8__.polarToCartesian)(coordinate.cx, coordinate.cy, middleRadius, midAngle); prev = _objectSpread(_objectSpread(_objectSpread({ percent: percent, cornerRadius: cornerRadius, name: name, tooltipPayload: tooltipPayload, midAngle: midAngle, middleRadius: middleRadius, tooltipPosition: tooltipPosition }, entry), coordinate), {}, { value: (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_10__.getValueByDataKey)(entry, realDataKey), startAngle: tempStartAngle, endAngle: tempEndAngle, payload: entry, paddingAngle: (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.mathSign)(deltaAngle) * paddingAngle }); return prev; }); } return _objectSpread(_objectSpread({}, coordinate), {}, { sectors: sectors, data: pieData }); }); /***/ }), /***/ "../../../node_modules/recharts/es6/polar/PolarAngleAxis.js": /*!******************************************************************!*\ !*** ../../../node_modules/recharts/es6/polar/PolarAngleAxis.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PolarAngleAxis: () => (/* binding */ PolarAngleAxis) /* 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 _container_Layer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _shape_Dot__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shape/Dot */ "../../../node_modules/recharts/es6/shape/Dot.js"); /* harmony import */ var _shape_Polygon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shape/Polygon */ "../../../node_modules/recharts/es6/shape/Polygon.js"); /* harmony import */ var _component_Text__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../component/Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__ = __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); } 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 Axis of radial direction */ var RADIAN = Math.PI / 180; var eps = 1e-5; var PolarAngleAxis = /*#__PURE__*/function (_PureComponent) { function PolarAngleAxis() { _classCallCheck(this, PolarAngleAxis); return _callSuper(this, PolarAngleAxis, arguments); } _inherits(PolarAngleAxis, _PureComponent); return _createClass(PolarAngleAxis, [{ key: "getTickLineCoord", value: /** * Calculate the coordinate of line endpoint * @param {Object} data The Data if ticks * @return {Object} (x0, y0): The start point of text, * (x1, y1): The end point close to text, * (x2, y2): The end point close to axis */ function getTickLineCoord(data) { var _this$props = this.props, cx = _this$props.cx, cy = _this$props.cy, radius = _this$props.radius, orientation = _this$props.orientation, tickSize = _this$props.tickSize; var tickLineSize = tickSize || 8; var p1 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, radius, data.coordinate); var p2 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, radius + (orientation === 'inner' ? -1 : 1) * tickLineSize, data.coordinate); return { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y }; } /** * Get the text-anchor of each tick * @param {Object} data Data of ticks * @return {String} text-anchor */ }, { key: "getTickTextAnchor", value: function getTickTextAnchor(data) { var orientation = this.props.orientation; var cos = Math.cos(-data.coordinate * RADIAN); var textAnchor; if (cos > eps) { textAnchor = orientation === 'outer' ? 'start' : 'end'; } else if (cos < -eps) { textAnchor = orientation === 'outer' ? 'end' : 'start'; } else { textAnchor = 'middle'; } return textAnchor; } }, { key: "renderAxisLine", value: function renderAxisLine() { var _this$props2 = this.props, cx = _this$props2.cx, cy = _this$props2.cy, radius = _this$props2.radius, axisLine = _this$props2.axisLine, axisLineType = _this$props2.axisLineType; var props = _objectSpread(_objectSpread({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(this.props, false)), {}, { fill: 'none' }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(axisLine, false)); if (axisLineType === 'circle') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Dot__WEBPACK_IMPORTED_MODULE_5__.Dot, _extends({ className: "recharts-polar-angle-axis-line" }, props, { cx: cx, cy: cy, r: radius })); } var ticks = this.props.ticks; var points = ticks.map(function (entry) { return (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, radius, entry.coordinate); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Polygon__WEBPACK_IMPORTED_MODULE_6__.Polygon, _extends({ className: "recharts-polar-angle-axis-line" }, props, { points: points })); } }, { key: "renderTicks", value: function renderTicks() { var _this = this; var _this$props3 = this.props, ticks = _this$props3.ticks, tick = _this$props3.tick, tickLine = _this$props3.tickLine, tickFormatter = _this$props3.tickFormatter, stroke = _this$props3.stroke; var axisProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(this.props, false); var customTickProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(tick, false); var tickLineProps = _objectSpread(_objectSpread({}, axisProps), {}, { fill: 'none' }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(tickLine, false)); var items = ticks.map(function (entry, i) { var lineCoord = _this.getTickLineCoord(entry); var textAnchor = _this.getTickTextAnchor(entry); var tickProps = _objectSpread(_objectSpread(_objectSpread({ textAnchor: textAnchor }, axisProps), {}, { stroke: 'none', fill: stroke }, customTickProps), {}, { index: i, payload: entry, x: lineCoord.x2, y: lineCoord.y2 }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, _extends({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-polar-angle-axis-tick', (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.getTickClassName)(tick)), key: "tick-".concat(entry.coordinate) }, (0,_util_types__WEBPACK_IMPORTED_MODULE_8__.adaptEventsOfChild)(_this.props, entry, i)), tickLine && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({ className: "recharts-polar-angle-axis-tick-line" }, tickLineProps, lineCoord)), tick && PolarAngleAxis.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value, i) : entry.value)); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: "recharts-polar-angle-axis-ticks" }, items); } }, { key: "render", value: function render() { var _this$props4 = this.props, ticks = _this$props4.ticks, radius = _this$props4.radius, axisLine = _this$props4.axisLine; if (radius <= 0 || !ticks || !ticks.length) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-polar-angle-axis', this.props.className) }, axisLine && this.renderAxisLine(), this.renderTicks()); } }], [{ key: "renderTickItem", value: function renderTickItem(option, props, value) { var tickItem; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { tickItem = option(props); } else { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_9__.Text, _extends({}, props, { className: "recharts-polar-angle-axis-tick-value" }), value); } return tickItem; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(PolarAngleAxis, "displayName", 'PolarAngleAxis'); _defineProperty(PolarAngleAxis, "axisType", 'angleAxis'); _defineProperty(PolarAngleAxis, "defaultProps", { type: 'category', angleAxisId: 0, scale: 'auto', cx: 0, cy: 0, orientation: 'outer', axisLine: true, tickLine: true, tickSize: 8, tick: true, hide: false, allowDuplicatedCategory: true }); /***/ }), /***/ "../../../node_modules/recharts/es6/polar/PolarRadiusAxis.js": /*!*******************************************************************!*\ !*** ../../../node_modules/recharts/es6/polar/PolarRadiusAxis.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PolarRadiusAxis: () => (/* binding */ PolarRadiusAxis) /* 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_maxBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/maxBy */ "../../../node_modules/lodash/maxBy.js"); /* harmony import */ var lodash_maxBy__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_maxBy__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_minBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/minBy */ "../../../node_modules/lodash/minBy.js"); /* harmony import */ var lodash_minBy__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_minBy__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 clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _component_Text__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../component/Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["cx", "cy", "angle", "ticks", "axisLine"], _excluded2 = ["ticks", "tick", "angle", "tickFormatter", "stroke"]; 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 _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 _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 The axis of polar coordinate system */ var PolarRadiusAxis = /*#__PURE__*/function (_PureComponent) { function PolarRadiusAxis() { _classCallCheck(this, PolarRadiusAxis); return _callSuper(this, PolarRadiusAxis, arguments); } _inherits(PolarRadiusAxis, _PureComponent); return _createClass(PolarRadiusAxis, [{ key: "getTickValueCoord", value: /** * Calculate the coordinate of tick * @param {Number} coordinate The radius of tick * @return {Object} (x, y) */ function getTickValueCoord(_ref) { var coordinate = _ref.coordinate; var _this$props = this.props, angle = _this$props.angle, cx = _this$props.cx, cy = _this$props.cy; return (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_5__.polarToCartesian)(cx, cy, coordinate, angle); } }, { key: "getTickTextAnchor", value: function getTickTextAnchor() { var orientation = this.props.orientation; var textAnchor; switch (orientation) { case 'left': textAnchor = 'end'; break; case 'right': textAnchor = 'start'; break; default: textAnchor = 'middle'; break; } return textAnchor; } }, { key: "getViewBox", value: function getViewBox() { var _this$props2 = this.props, cx = _this$props2.cx, cy = _this$props2.cy, angle = _this$props2.angle, ticks = _this$props2.ticks; var maxRadiusTick = lodash_maxBy__WEBPACK_IMPORTED_MODULE_1___default()(ticks, function (entry) { return entry.coordinate || 0; }); var minRadiusTick = lodash_minBy__WEBPACK_IMPORTED_MODULE_2___default()(ticks, function (entry) { return entry.coordinate || 0; }); return { cx: cx, cy: cy, startAngle: angle, endAngle: angle, innerRadius: minRadiusTick.coordinate || 0, outerRadius: maxRadiusTick.coordinate || 0 }; } }, { key: "renderAxisLine", value: function renderAxisLine() { var _this$props3 = this.props, cx = _this$props3.cx, cy = _this$props3.cy, angle = _this$props3.angle, ticks = _this$props3.ticks, axisLine = _this$props3.axisLine, others = _objectWithoutProperties(_this$props3, _excluded); var extent = ticks.reduce(function (result, entry) { return [Math.min(result[0], entry.coordinate), Math.max(result[1], entry.coordinate)]; }, [Infinity, -Infinity]); var point0 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_5__.polarToCartesian)(cx, cy, extent[0], angle); var point1 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_5__.polarToCartesian)(cx, cy, extent[1], angle); var props = _objectSpread(_objectSpread(_objectSpread({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(others, false)), {}, { fill: 'none' }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(axisLine, false)), {}, { x1: point0.x, y1: point0.y, x2: point1.x, y2: point1.y }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({ className: "recharts-polar-radius-axis-line" }, props)); } }, { key: "renderTicks", value: function renderTicks() { var _this = this; var _this$props4 = this.props, ticks = _this$props4.ticks, tick = _this$props4.tick, angle = _this$props4.angle, tickFormatter = _this$props4.tickFormatter, stroke = _this$props4.stroke, others = _objectWithoutProperties(_this$props4, _excluded2); var textAnchor = this.getTickTextAnchor(); var axisProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(others, false); var customTickProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(tick, false); var items = ticks.map(function (entry, i) { var coord = _this.getTickValueCoord(entry); var tickProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({ textAnchor: textAnchor, transform: "rotate(".concat(90 - angle, ", ").concat(coord.x, ", ").concat(coord.y, ")") }, axisProps), {}, { stroke: 'none', fill: stroke }, customTickProps), {}, { index: i }, coord), {}, { payload: entry }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, _extends({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-polar-radius-axis-tick', (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_5__.getTickClassName)(tick)), key: "tick-".concat(entry.coordinate) }, (0,_util_types__WEBPACK_IMPORTED_MODULE_8__.adaptEventsOfChild)(_this.props, entry, i)), PolarRadiusAxis.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value, i) : entry.value)); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: "recharts-polar-radius-axis-ticks" }, items); } }, { key: "render", value: function render() { var _this$props5 = this.props, ticks = _this$props5.ticks, axisLine = _this$props5.axisLine, tick = _this$props5.tick; if (!ticks || !ticks.length) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-polar-radius-axis', this.props.className) }, axisLine && this.renderAxisLine(), tick && this.renderTicks(), _component_Label__WEBPACK_IMPORTED_MODULE_9__.Label.renderCallByParent(this.props, this.getViewBox())); } }], [{ key: "renderTickItem", value: function renderTickItem(option, props, value) { var tickItem; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(option)) { tickItem = option(props); } else { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_10__.Text, _extends({}, props, { className: "recharts-polar-radius-axis-tick-value" }), value); } return tickItem; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(PolarRadiusAxis, "displayName", 'PolarRadiusAxis'); _defineProperty(PolarRadiusAxis, "axisType", 'radiusAxis'); _defineProperty(PolarRadiusAxis, "defaultProps", { type: 'number', radiusAxisId: 0, cx: 0, cy: 0, angle: 0, orientation: 'right', stroke: '#ccc', axisLine: true, tick: true, tickCount: 5, allowDataOverflow: false, scale: 'auto', allowDuplicatedCategory: true }); /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Cross.js": /*!*********************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Cross.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cross: () => (/* binding */ Cross) /* 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_DataUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_3__ = __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); } var _excluded = ["x", "y", "top", "left", "width", "height", "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 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; } /** * @fileOverview Cross */ var getPath = function getPath(x, y, width, height, top, left) { return "M".concat(x, ",").concat(top, "v").concat(height, "M").concat(left, ",").concat(y, "h").concat(width); }; var Cross = function Cross(_ref) { var _ref$x = _ref.x, x = _ref$x === void 0 ? 0 : _ref$x, _ref$y = _ref.y, y = _ref$y === void 0 ? 0 : _ref$y, _ref$top = _ref.top, top = _ref$top === void 0 ? 0 : _ref$top, _ref$left = _ref.left, left = _ref$left === void 0 ? 0 : _ref$left, _ref$width = _ref.width, width = _ref$width === void 0 ? 0 : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? 0 : _ref$height, className = _ref.className, rest = _objectWithoutProperties(_ref, _excluded); var props = _objectSpread({ x: x, y: y, top: top, left: left, width: width, height: height }, rest); if (!(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(x) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(y) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(width) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(height) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(top) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(left)) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_3__.filterProps)(props, true), { className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-cross', className), d: getPath(x, y, width, height, top, left) })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Curve.js": /*!*********************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Curve.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Curve: () => (/* binding */ Curve), /* harmony export */ getPath: () => (/* binding */ getPath) /* 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 victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! victory-vendor/d3-shape */ "../../../node_modules/victory-vendor/es/d3-shape.js"); /* harmony import */ var lodash_upperFirst__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/upperFirst */ "../../../node_modules/lodash/upperFirst.js"); /* harmony import */ var lodash_upperFirst__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_upperFirst__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 clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__ = __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"); 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 _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 Curve */ var CURVE_FACTORIES = { curveBasisClosed: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveBasisClosed, curveBasisOpen: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveBasisOpen, curveBasis: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveBasis, curveBumpX: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveBumpX, curveBumpY: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveBumpY, curveLinearClosed: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveLinearClosed, curveLinear: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveLinear, curveMonotoneX: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveMonotoneX, curveMonotoneY: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveMonotoneY, curveNatural: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveNatural, curveStep: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveStep, curveStepAfter: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveStepAfter, curveStepBefore: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveStepBefore }; var defined = function defined(p) { return p.x === +p.x && p.y === +p.y; }; var getX = function getX(p) { return p.x; }; var getY = function getY(p) { return p.y; }; var getCurveFactory = function getCurveFactory(type, layout) { if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(type)) { return type; } var name = "curve".concat(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_2___default()(type)); if ((name === 'curveMonotone' || name === 'curveBump') && layout) { return CURVE_FACTORIES["".concat(name).concat(layout === 'vertical' ? 'Y' : 'X')]; } return CURVE_FACTORIES[name] || victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.curveLinear; }; /** * Calculate the path of curve. Returns null if points is an empty array. * @return path or null */ var getPath = function getPath(_ref) { var _ref$type = _ref.type, type = _ref$type === void 0 ? 'linear' : _ref$type, _ref$points = _ref.points, points = _ref$points === void 0 ? [] : _ref$points, baseLine = _ref.baseLine, layout = _ref.layout, _ref$connectNulls = _ref.connectNulls, connectNulls = _ref$connectNulls === void 0 ? false : _ref$connectNulls; var curveFactory = getCurveFactory(type, layout); var formatPoints = connectNulls ? points.filter(function (entry) { return defined(entry); }) : points; var lineFunction; if (Array.isArray(baseLine)) { var formatBaseLine = connectNulls ? baseLine.filter(function (base) { return defined(base); }) : baseLine; var areaPoints = formatPoints.map(function (entry, index) { return _objectSpread(_objectSpread({}, entry), {}, { base: formatBaseLine[index] }); }); if (layout === 'vertical') { lineFunction = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.area)().y(getY).x1(getX).x0(function (d) { return d.base.x; }); } else { lineFunction = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.area)().x(getX).y1(getY).y0(function (d) { return d.base.y; }); } lineFunction.defined(defined).curve(curveFactory); return lineFunction(areaPoints); } if (layout === 'vertical' && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(baseLine)) { lineFunction = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.area)().y(getY).x1(getX).x0(baseLine); } else if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(baseLine)) { lineFunction = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.area)().x(getX).y1(getY).y0(baseLine); } else { lineFunction = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.line)().x(getX).y(getY); } lineFunction.defined(defined).curve(curveFactory); return lineFunction(formatPoints); }; var Curve = function Curve(props) { var className = props.className, points = props.points, path = props.path, pathRef = props.pathRef; if ((!points || !points.length) && !path) { return null; } var realPath = points && points.length ? getPath(props) : path; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(props, false), (0,_util_types__WEBPACK_IMPORTED_MODULE_7__.adaptEventHandlers)(props), { className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-curve', className), d: realPath, ref: pathRef })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Dot.js": /*!*******************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Dot.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Dot: () => (/* binding */ Dot) /* 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_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); 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); } /** * @fileOverview Dot */ var Dot = function Dot(props) { var cx = props.cx, cy = props.cy, r = props.r, className = props.className; var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-dot', className); if (cx === +cx && cy === +cy && r === +r) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("circle", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(props, false), (0,_util_types__WEBPACK_IMPORTED_MODULE_3__.adaptEventHandlers)(props), { className: layerClass, cx: cx, cy: cy, r: r })); } return null; }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Polygon.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Polygon.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Polygon: () => (/* binding */ Polygon) /* 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 = ["points", "className", "baseLinePoints", "connectNulls"]; 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 _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; } /** * @fileOverview Polygon */ var isValidatePoint = function isValidatePoint(point) { return point && point.x === +point.x && point.y === +point.y; }; var getParsedPoints = function getParsedPoints() { var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var segmentPoints = [[]]; points.forEach(function (entry) { if (isValidatePoint(entry)) { segmentPoints[segmentPoints.length - 1].push(entry); } else if (segmentPoints[segmentPoints.length - 1].length > 0) { // add another path segmentPoints.push([]); } }); if (isValidatePoint(points[0])) { segmentPoints[segmentPoints.length - 1].push(points[0]); } if (segmentPoints[segmentPoints.length - 1].length <= 0) { segmentPoints = segmentPoints.slice(0, -1); } return segmentPoints; }; var getSinglePolygonPath = function getSinglePolygonPath(points, connectNulls) { var segmentPoints = getParsedPoints(points); if (connectNulls) { segmentPoints = [segmentPoints.reduce(function (res, segPoints) { return [].concat(_toConsumableArray(res), _toConsumableArray(segPoints)); }, [])]; } var polygonPath = segmentPoints.map(function (segPoints) { return segPoints.reduce(function (path, point, index) { return "".concat(path).concat(index === 0 ? 'M' : 'L').concat(point.x, ",").concat(point.y); }, ''); }).join(''); return segmentPoints.length === 1 ? "".concat(polygonPath, "Z") : polygonPath; }; var getRanglePath = function getRanglePath(points, baseLinePoints, connectNulls) { var outerPath = getSinglePolygonPath(points, connectNulls); return "".concat(outerPath.slice(-1) === 'Z' ? outerPath.slice(0, -1) : outerPath, "L").concat(getSinglePolygonPath(baseLinePoints.reverse(), connectNulls).slice(1)); }; var Polygon = function Polygon(props) { var points = props.points, className = props.className, baseLinePoints = props.baseLinePoints, connectNulls = props.connectNulls, others = _objectWithoutProperties(props, _excluded); if (!points || !points.length) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-polygon', className); if (baseLinePoints && baseLinePoints.length) { var hasStroke = others.stroke && others.stroke !== 'none'; var rangePath = getRanglePath(points, baseLinePoints, connectNulls); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", { className: layerClass }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { fill: rangePath.slice(-1) === 'Z' ? others.fill : 'none', stroke: "none", d: rangePath })), hasStroke ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { fill: "none", d: getSinglePolygonPath(points, connectNulls) })) : null, hasStroke ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { fill: "none", d: getSinglePolygonPath(baseLinePoints, connectNulls) })) : null); } var singlePath = getSinglePolygonPath(points, connectNulls); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { fill: singlePath.slice(-1) === 'Z' ? others.fill : 'none', className: layerClass, d: singlePath })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Rectangle.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Rectangle.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Rectangle: () => (/* binding */ Rectangle), /* harmony export */ isInRectangle: () => (/* binding */ isInRectangle) /* 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 react_smooth__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-smooth */ "../../../node_modules/react-smooth/es6/index.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __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 _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 Rectangle */ var getRectanglePath = function getRectanglePath(x, y, width, height, radius) { var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2); var ySign = height >= 0 ? 1 : -1; var xSign = width >= 0 ? 1 : -1; var clockWise = height >= 0 && width >= 0 || height < 0 && width < 0 ? 1 : 0; var path; if (maxRadius > 0 && radius instanceof Array) { var newRadius = [0, 0, 0, 0]; for (var i = 0, len = 4; i < len; i++) { newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i]; } path = "M".concat(x, ",").concat(y + ySign * newRadius[0]); if (newRadius[0] > 0) { path += "A ".concat(newRadius[0], ",").concat(newRadius[0], ",0,0,").concat(clockWise, ",").concat(x + xSign * newRadius[0], ",").concat(y); } path += "L ".concat(x + width - xSign * newRadius[1], ",").concat(y); if (newRadius[1] > 0) { path += "A ".concat(newRadius[1], ",").concat(newRadius[1], ",0,0,").concat(clockWise, ",\n ").concat(x + width, ",").concat(y + ySign * newRadius[1]); } path += "L ".concat(x + width, ",").concat(y + height - ySign * newRadius[2]); if (newRadius[2] > 0) { path += "A ".concat(newRadius[2], ",").concat(newRadius[2], ",0,0,").concat(clockWise, ",\n ").concat(x + width - xSign * newRadius[2], ",").concat(y + height); } path += "L ".concat(x + xSign * newRadius[3], ",").concat(y + height); if (newRadius[3] > 0) { path += "A ".concat(newRadius[3], ",").concat(newRadius[3], ",0,0,").concat(clockWise, ",\n ").concat(x, ",").concat(y + height - ySign * newRadius[3]); } path += 'Z'; } else if (maxRadius > 0 && radius === +radius && radius > 0) { var _newRadius = Math.min(maxRadius, radius); path = "M ".concat(x, ",").concat(y + ySign * _newRadius, "\n A ").concat(_newRadius, ",").concat(_newRadius, ",0,0,").concat(clockWise, ",").concat(x + xSign * _newRadius, ",").concat(y, "\n L ").concat(x + width - xSign * _newRadius, ",").concat(y, "\n A ").concat(_newRadius, ",").concat(_newRadius, ",0,0,").concat(clockWise, ",").concat(x + width, ",").concat(y + ySign * _newRadius, "\n L ").concat(x + width, ",").concat(y + height - ySign * _newRadius, "\n A ").concat(_newRadius, ",").concat(_newRadius, ",0,0,").concat(clockWise, ",").concat(x + width - xSign * _newRadius, ",").concat(y + height, "\n L ").concat(x + xSign * _newRadius, ",").concat(y + height, "\n A ").concat(_newRadius, ",").concat(_newRadius, ",0,0,").concat(clockWise, ",").concat(x, ",").concat(y + height - ySign * _newRadius, " Z"); } else { path = "M ".concat(x, ",").concat(y, " h ").concat(width, " v ").concat(height, " h ").concat(-width, " Z"); } return path; }; var isInRectangle = function isInRectangle(point, rect) { if (!point || !rect) { return false; } var px = point.x, py = point.y; var x = rect.x, y = rect.y, width = rect.width, height = rect.height; if (Math.abs(width) > 0 && Math.abs(height) > 0) { var minX = Math.min(x, x + width); var maxX = Math.max(x, x + width); var minY = Math.min(y, y + height); var maxY = Math.max(y, y + height); return px >= minX && px <= maxX && py >= minY && py <= maxY; } return false; }; var defaultProps = { x: 0, y: 0, width: 0, height: 0, // The radius of border // The radius of four corners when radius is a number // The radius of left-top, right-top, right-bottom, left-bottom when radius is an array radius: 0, isAnimationActive: false, isUpdateAnimationActive: false, animationBegin: 0, animationDuration: 1500, animationEasing: 'ease' }; var Rectangle = function Rectangle(rectangleProps) { var props = _objectSpread(_objectSpread({}, defaultProps), rectangleProps); var pathRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(-1), _useState2 = _slicedToArray(_useState, 2), totalLength = _useState2[0], setTotalLength = _useState2[1]; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (pathRef.current && pathRef.current.getTotalLength) { try { var pathTotalLength = pathRef.current.getTotalLength(); if (pathTotalLength) { setTotalLength(pathTotalLength); } } catch (err) { // calculate total length error } } }, []); var x = props.x, y = props.y, width = props.width, height = props.height, radius = props.radius, className = props.className; var animationEasing = props.animationEasing, animationDuration = props.animationDuration, animationBegin = props.animationBegin, isAnimationActive = props.isAnimationActive, isUpdateAnimationActive = props.isUpdateAnimationActive; if (x !== +x || y !== +y || width !== +width || height !== +height || width === 0 || height === 0) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-rectangle', className); if (!isUpdateAnimationActive) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(props, true), { className: layerClass, d: getRectanglePath(x, y, width, height, radius) })); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_3__["default"], { canBegin: totalLength > 0, from: { width: width, height: height, x: x, y: y }, to: { width: width, height: height, x: x, y: y }, duration: animationDuration, animationEasing: animationEasing, isActive: isUpdateAnimationActive }, function (_ref) { var currWidth = _ref.width, currHeight = _ref.height, currX = _ref.x, currY = _ref.y; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_3__["default"], { canBegin: totalLength > 0, from: "0px ".concat(totalLength === -1 ? 1 : totalLength, "px"), to: "".concat(totalLength, "px 0px"), attributeName: "strokeDasharray", begin: animationBegin, duration: animationDuration, isActive: isAnimationActive, easing: animationEasing }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(props, true), { className: layerClass, d: getRectanglePath(currX, currY, currWidth, currHeight, radius), ref: pathRef }))); }); }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Sector.js": /*!**********************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Sector.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Sector: () => (/* binding */ Sector) /* 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_4__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_2__ = __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 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 Sector */ var getDeltaAngle = function getDeltaAngle(startAngle, endAngle) { var sign = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.mathSign)(endAngle - startAngle); var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 359.999); return sign * deltaAngle; }; var getTangentCircle = function getTangentCircle(_ref) { var cx = _ref.cx, cy = _ref.cy, radius = _ref.radius, angle = _ref.angle, sign = _ref.sign, isExternal = _ref.isExternal, cornerRadius = _ref.cornerRadius, cornerIsExternal = _ref.cornerIsExternal; var centerRadius = cornerRadius * (isExternal ? 1 : -1) + radius; var theta = Math.asin(cornerRadius / centerRadius) / _util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.RADIAN; var centerAngle = cornerIsExternal ? angle : angle + sign * theta; var center = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, centerRadius, centerAngle); // The coordinate of point which is tangent to the circle var circleTangency = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, radius, centerAngle); // The coordinate of point which is tangent to the radius line var lineTangencyAngle = cornerIsExternal ? angle - sign * theta : angle; var lineTangency = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, centerRadius * Math.cos(theta * _util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.RADIAN), lineTangencyAngle); return { center: center, circleTangency: circleTangency, lineTangency: lineTangency, theta: theta }; }; var getSectorPath = function getSectorPath(_ref2) { var cx = _ref2.cx, cy = _ref2.cy, innerRadius = _ref2.innerRadius, outerRadius = _ref2.outerRadius, startAngle = _ref2.startAngle, endAngle = _ref2.endAngle; var angle = getDeltaAngle(startAngle, endAngle); // When the angle of sector equals to 360, star point and end point coincide var tempEndAngle = startAngle + angle; var outerStartPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, outerRadius, startAngle); var outerEndPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, outerRadius, tempEndAngle); var path = "M ".concat(outerStartPoint.x, ",").concat(outerStartPoint.y, "\n A ").concat(outerRadius, ",").concat(outerRadius, ",0,\n ").concat(+(Math.abs(angle) > 180), ",").concat(+(startAngle > tempEndAngle), ",\n ").concat(outerEndPoint.x, ",").concat(outerEndPoint.y, "\n "); if (innerRadius > 0) { var innerStartPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, innerRadius, startAngle); var innerEndPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_3__.polarToCartesian)(cx, cy, innerRadius, tempEndAngle); path += "L ".concat(innerEndPoint.x, ",").concat(innerEndPoint.y, "\n A ").concat(innerRadius, ",").concat(innerRadius, ",0,\n ").concat(+(Math.abs(angle) > 180), ",").concat(+(startAngle <= tempEndAngle), ",\n ").concat(innerStartPoint.x, ",").concat(innerStartPoint.y, " Z"); } else { path += "L ".concat(cx, ",").concat(cy, " Z"); } return path; }; var getSectorWithCorner = function getSectorWithCorner(_ref3) { var cx = _ref3.cx, cy = _ref3.cy, innerRadius = _ref3.innerRadius, outerRadius = _ref3.outerRadius, cornerRadius = _ref3.cornerRadius, forceCornerRadius = _ref3.forceCornerRadius, cornerIsExternal = _ref3.cornerIsExternal, startAngle = _ref3.startAngle, endAngle = _ref3.endAngle; var sign = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.mathSign)(endAngle - startAngle); var _getTangentCircle = getTangentCircle({ cx: cx, cy: cy, radius: outerRadius, angle: startAngle, sign: sign, cornerRadius: cornerRadius, cornerIsExternal: cornerIsExternal }), soct = _getTangentCircle.circleTangency, solt = _getTangentCircle.lineTangency, sot = _getTangentCircle.theta; var _getTangentCircle2 = getTangentCircle({ cx: cx, cy: cy, radius: outerRadius, angle: endAngle, sign: -sign, cornerRadius: cornerRadius, cornerIsExternal: cornerIsExternal }), eoct = _getTangentCircle2.circleTangency, eolt = _getTangentCircle2.lineTangency, eot = _getTangentCircle2.theta; var outerArcAngle = cornerIsExternal ? Math.abs(startAngle - endAngle) : Math.abs(startAngle - endAngle) - sot - eot; if (outerArcAngle < 0) { if (forceCornerRadius) { return "M ".concat(solt.x, ",").concat(solt.y, "\n a").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,1,").concat(cornerRadius * 2, ",0\n a").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,1,").concat(-cornerRadius * 2, ",0\n "); } return getSectorPath({ cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, startAngle: startAngle, endAngle: endAngle }); } var path = "M ".concat(solt.x, ",").concat(solt.y, "\n A").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,").concat(+(sign < 0), ",").concat(soct.x, ",").concat(soct.y, "\n A").concat(outerRadius, ",").concat(outerRadius, ",0,").concat(+(outerArcAngle > 180), ",").concat(+(sign < 0), ",").concat(eoct.x, ",").concat(eoct.y, "\n A").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,").concat(+(sign < 0), ",").concat(eolt.x, ",").concat(eolt.y, "\n "); if (innerRadius > 0) { var _getTangentCircle3 = getTangentCircle({ cx: cx, cy: cy, radius: innerRadius, angle: startAngle, sign: sign, isExternal: true, cornerRadius: cornerRadius, cornerIsExternal: cornerIsExternal }), sict = _getTangentCircle3.circleTangency, silt = _getTangentCircle3.lineTangency, sit = _getTangentCircle3.theta; var _getTangentCircle4 = getTangentCircle({ cx: cx, cy: cy, radius: innerRadius, angle: endAngle, sign: -sign, isExternal: true, cornerRadius: cornerRadius, cornerIsExternal: cornerIsExternal }), eict = _getTangentCircle4.circleTangency, eilt = _getTangentCircle4.lineTangency, eit = _getTangentCircle4.theta; var innerArcAngle = cornerIsExternal ? Math.abs(startAngle - endAngle) : Math.abs(startAngle - endAngle) - sit - eit; if (innerArcAngle < 0 && cornerRadius === 0) { return "".concat(path, "L").concat(cx, ",").concat(cy, "Z"); } path += "L".concat(eilt.x, ",").concat(eilt.y, "\n A").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,").concat(+(sign < 0), ",").concat(eict.x, ",").concat(eict.y, "\n A").concat(innerRadius, ",").concat(innerRadius, ",0,").concat(+(innerArcAngle > 180), ",").concat(+(sign > 0), ",").concat(sict.x, ",").concat(sict.y, "\n A").concat(cornerRadius, ",").concat(cornerRadius, ",0,0,").concat(+(sign < 0), ",").concat(silt.x, ",").concat(silt.y, "Z"); } else { path += "L".concat(cx, ",").concat(cy, "Z"); } return path; }; var defaultProps = { cx: 0, cy: 0, innerRadius: 0, outerRadius: 0, startAngle: 0, endAngle: 0, cornerRadius: 0, forceCornerRadius: false, cornerIsExternal: false }; var Sector = function Sector(sectorProps) { var props = _objectSpread(_objectSpread({}, defaultProps), sectorProps); var cx = props.cx, cy = props.cy, innerRadius = props.innerRadius, outerRadius = props.outerRadius, cornerRadius = props.cornerRadius, forceCornerRadius = props.forceCornerRadius, cornerIsExternal = props.cornerIsExternal, startAngle = props.startAngle, endAngle = props.endAngle, className = props.className; if (outerRadius < innerRadius || startAngle === endAngle) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-sector', className); var deltaRadius = outerRadius - innerRadius; var cr = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.getPercentValue)(cornerRadius, deltaRadius, 0, true); var path; if (cr > 0 && Math.abs(startAngle - endAngle) < 360) { path = getSectorWithCorner({ cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, cornerRadius: Math.min(cr, deltaRadius / 2), forceCornerRadius: forceCornerRadius, cornerIsExternal: cornerIsExternal, startAngle: startAngle, endAngle: endAngle }); } else { path = getSectorPath({ cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, startAngle: startAngle, endAngle: endAngle }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(props, true), { className: layerClass, d: path, role: "img" })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Symbols.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Symbols.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Symbols: () => (/* binding */ Symbols) /* 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_upperFirst__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/upperFirst */ "../../../node_modules/lodash/upperFirst.js"); /* harmony import */ var lodash_upperFirst__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! victory-vendor/d3-shape */ "../../../node_modules/victory-vendor/es/d3-shape.js"); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__ = __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); } var _excluded = ["type", "size", "sizeType"]; 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; } /** * @fileOverview Curve */ var symbolFactories = { symbolCircle: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolCircle, symbolCross: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolCross, symbolDiamond: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolDiamond, symbolSquare: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolSquare, symbolStar: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolStar, symbolTriangle: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolTriangle, symbolWye: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolWye }; var RADIAN = Math.PI / 180; var getSymbolFactory = function getSymbolFactory(type) { var name = "symbol".concat(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_1___default()(type)); return symbolFactories[name] || victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbolCircle; }; var calculateAreaSize = function calculateAreaSize(size, sizeType, type) { if (sizeType === 'area') { return size; } switch (type) { case 'cross': return 5 * size * size / 9; case 'diamond': return 0.5 * size * size / Math.sqrt(3); case 'square': return size * size; case 'star': { var angle = 18 * RADIAN; return 1.25 * size * size * (Math.tan(angle) - Math.tan(angle * 2) * Math.pow(Math.tan(angle), 2)); } case 'triangle': return Math.sqrt(3) * size * size / 4; case 'wye': return (21 - 10 * Math.sqrt(3)) * size * size / 8; default: return Math.PI * size * size / 4; } }; var registerSymbol = function registerSymbol(key, factory) { symbolFactories["symbol".concat(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_1___default()(key))] = factory; }; var Symbols = function Symbols(_ref) { var _ref$type = _ref.type, type = _ref$type === void 0 ? 'circle' : _ref$type, _ref$size = _ref.size, size = _ref$size === void 0 ? 64 : _ref$size, _ref$sizeType = _ref.sizeType, sizeType = _ref$sizeType === void 0 ? 'area' : _ref$sizeType, rest = _objectWithoutProperties(_ref, _excluded); var props = _objectSpread(_objectSpread({}, rest), {}, { type: type, size: size, sizeType: sizeType }); /** * Calculate the path of curve * @return {String} path */ var getPath = function getPath() { var symbolFactory = getSymbolFactory(type); var symbol = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_2__.symbol)().type(symbolFactory).size(calculateAreaSize(size, sizeType, type)); return symbol(); }; var className = props.className, cx = props.cx, cy = props.cy; var filteredProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_4__.filterProps)(props, true); if (cx === +cx && cy === +cy && size === +size) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, filteredProps, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-symbols', className), transform: "translate(".concat(cx, ", ").concat(cy, ")"), d: getPath() })); } return null; }; Symbols.registerSymbol = registerSymbol; /***/ }), /***/ "../../../node_modules/recharts/es6/shape/Trapezoid.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/shape/Trapezoid.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Trapezoid: () => (/* binding */ Trapezoid) /* 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 react_smooth__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-smooth */ "../../../node_modules/react-smooth/es6/index.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __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 _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 Rectangle */ var getTrapezoidPath = function getTrapezoidPath(x, y, upperWidth, lowerWidth, height) { var widthGap = upperWidth - lowerWidth; var path; path = "M ".concat(x, ",").concat(y); path += "L ".concat(x + upperWidth, ",").concat(y); path += "L ".concat(x + upperWidth - widthGap / 2, ",").concat(y + height); path += "L ".concat(x + upperWidth - widthGap / 2 - lowerWidth, ",").concat(y + height); path += "L ".concat(x, ",").concat(y, " Z"); return path; }; var defaultProps = { x: 0, y: 0, upperWidth: 0, lowerWidth: 0, height: 0, isUpdateAnimationActive: false, animationBegin: 0, animationDuration: 1500, animationEasing: 'ease' }; var Trapezoid = function Trapezoid(props) { var trapezoidProps = _objectSpread(_objectSpread({}, defaultProps), props); var pathRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(-1), _useState2 = _slicedToArray(_useState, 2), totalLength = _useState2[0], setTotalLength = _useState2[1]; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (pathRef.current && pathRef.current.getTotalLength) { try { var pathTotalLength = pathRef.current.getTotalLength(); if (pathTotalLength) { setTotalLength(pathTotalLength); } } catch (err) { // calculate total length error } } }, []); var x = trapezoidProps.x, y = trapezoidProps.y, upperWidth = trapezoidProps.upperWidth, lowerWidth = trapezoidProps.lowerWidth, height = trapezoidProps.height, className = trapezoidProps.className; var animationEasing = trapezoidProps.animationEasing, animationDuration = trapezoidProps.animationDuration, animationBegin = trapezoidProps.animationBegin, isUpdateAnimationActive = trapezoidProps.isUpdateAnimationActive; if (x !== +x || y !== +y || upperWidth !== +upperWidth || lowerWidth !== +lowerWidth || height !== +height || upperWidth === 0 && lowerWidth === 0 || height === 0) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-trapezoid', className); if (!isUpdateAnimationActive) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(trapezoidProps, true), { className: layerClass, d: getTrapezoidPath(x, y, upperWidth, lowerWidth, height) }))); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_3__["default"], { canBegin: totalLength > 0, from: { upperWidth: 0, lowerWidth: 0, height: height, x: x, y: y }, to: { upperWidth: upperWidth, lowerWidth: lowerWidth, height: height, x: x, y: y }, duration: animationDuration, animationEasing: animationEasing, isActive: isUpdateAnimationActive }, function (_ref) { var currUpperWidth = _ref.upperWidth, currLowerWidth = _ref.lowerWidth, currHeight = _ref.height, currX = _ref.x, currY = _ref.y; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_3__["default"], { canBegin: totalLength > 0, from: "0px ".concat(totalLength === -1 ? 1 : totalLength, "px"), to: "".concat(totalLength, "px 0px"), attributeName: "strokeDasharray", begin: animationBegin, duration: animationDuration, easing: animationEasing }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(trapezoidProps, true), { className: layerClass, d: getTrapezoidPath(currX, currY, currUpperWidth, currLowerWidth, currHeight), ref: pathRef }))); }); }; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVjaGFydHNfZXM2X3BvbGFyX1BpZV9qcy1ub2RlX21vZHVsZXNfcmVjaGFydHNfZXM2X3BvbGFyX1BvbGFyQW5nbGVBeGlzLTU1OTA1NS52b2x1bnRlZXJhcGkuZGY4ZDUyNDBmNGFhYmNkNDc0OGQuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0Esc0JBQXNCLDJCQUEyQixvR0FBb0csbUJBQW1CLGlCQUFpQixzSEFBc0g7QUFDL1Msc0JBQXNCLHNFQUFzRSxnQkFBZ0Isc0JBQXNCLE9BQU8sMkJBQTJCLDBCQUEwQix5REFBeUQsaUNBQWlDLGtCQUFrQjtBQUMxUyx5QkFBeUIsd0JBQXdCLG9DQUFvQyx5Q0FBeUMsa0NBQWtDLDBEQUEwRCwwQkFBMEI7QUFDcFAsNEJBQTRCLGdCQUFnQixzQkFBc0IsT0FBTyxrREFBa0Qsc0RBQXNELDhCQUE4QixtSkFBbUoscUVBQXFFLEtBQUs7QUFDNWEsa0RBQWtELDBDQUEwQztBQUM1Riw0Q0FBNEMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RDtBQUMvUCw4REFBOEQsc0VBQXNFLDhEQUE4RCxrREFBa0QsaUJBQWlCLEdBQUc7QUFDeFEsK0JBQStCO0FBQy9CLGtEQUFrRCwwRUFBMEUsZUFBZSw0QkFBNEIsbUZBQW1GO0FBQzFQLHdDQUF3Qyx1QkFBdUIseUZBQXlGO0FBQ3hKLHVDQUF1QyxNQUFNLHFGQUFxRixNQUFNLGFBQWEsMkVBQTJFLGFBQWE7QUFDN08sOEJBQThCLHVHQUF1RyxtREFBbUQ7QUFDeEwsMkNBQTJDLCtEQUErRCw2RUFBNkUseUVBQXlFLGVBQWUsdURBQXVELEdBQUcsK0NBQStDLGlCQUFpQixHQUFHO0FBQzVZLGlDQUFpQywwR0FBMEcsaUJBQWlCLGFBQWE7QUFDekssNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFL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QUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AscURBQXFEO0FBQ3JELGdCQUFnQiw2Q0FBTTtBQUN0QixrQkFBa0IsK0NBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsRUFBRSxnREFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0RBQUk7QUFDdkI7QUFDQSx3QkFBd0IsMERBQW1CLHlCQUF5QiwwREFBbUIsb0JBQW9CLEVBQUUsNkRBQVc7QUFDeEg7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHNCQUFzQiwwREFBbUIsQ0FBQyxvREFBTztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMERBQW1CLENBQUMsb0RBQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLGVBQWUsMERBQW1CLG9CQUFvQixFQUFFLDZEQUFXO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvcG9sYXIvUGllLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9wb2xhci9Qb2xhckFuZ2xlQXhpcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvcG9sYXIvUG9sYXJSYWRpdXNBeGlzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9zaGFwZS9Dcm9zcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvc2hhcGUvQ3VydmUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3NoYXBlL0RvdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvc2hhcGUvUG9seWdvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvc2hhcGUvUmVjdGFuZ2xlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9zaGFwZS9TZWN0b3IuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3NoYXBlL1N5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3NoYXBlL1RyYXBlem9pZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX1BpZTtcbmZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgUmVuZGVyIHNlY3RvcnMgb2YgYSBwaWVcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQW5pbWF0ZSBmcm9tICdyZWFjdC1zbW9vdGgnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnbG9kYXNoL2lzRnVuY3Rpb24nO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvbnRhaW5lci9MYXllcic7XG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL3NoYXBlL0N1cnZlJztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi9jb21wb25lbnQvVGV4dCc7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4uL2NvbXBvbmVudC9MYWJlbCc7XG5pbXBvcnQgeyBMYWJlbExpc3QgfSBmcm9tICcuLi9jb21wb25lbnQvTGFiZWxMaXN0JztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi9jb21wb25lbnQvQ2VsbCc7XG5pbXBvcnQgeyBmaW5kQWxsQnlUeXBlLCBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tICcuLi91dGlsL0dsb2JhbCc7XG5pbXBvcnQgeyBwb2xhclRvQ2FydGVzaWFuLCBnZXRNYXhSYWRpdXMgfSBmcm9tICcuLi91dGlsL1BvbGFyVXRpbHMnO1xuaW1wb3J0IHsgaXNOdW1iZXIsIGdldFBlcmNlbnRWYWx1ZSwgbWF0aFNpZ24sIGludGVycG9sYXRlTnVtYmVyLCB1bmlxdWVJZCB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGdldFZhbHVlQnlEYXRhS2V5IH0gZnJvbSAnLi4vdXRpbC9DaGFydFV0aWxzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi91dGlsL0xvZ1V0aWxzJztcbmltcG9ydCB7IGFkYXB0RXZlbnRzT2ZDaGlsZCB9IGZyb20gJy4uL3V0aWwvdHlwZXMnO1xuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi91dGlsL0FjdGl2ZVNoYXBlVXRpbHMnO1xuZXhwb3J0IHZhciBQaWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFBpZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGllKTtcbiAgICBfdGhpcyA9IF9jYWxsU3VwZXIodGhpcywgUGllLCBbcHJvcHNdKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwicGllUmVmXCIsIG51bGwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzZWN0b3JSZWZzXCIsIFtdKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiaWRcIiwgdW5pcXVlSWQoJ3JlY2hhcnRzLXBpZS0nKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImhhbmRsZUFuaW1hdGlvbkVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25BbmltYXRpb25FbmQgPSBfdGhpcy5wcm9wcy5vbkFuaW1hdGlvbkVuZDtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNBbmltYXRpb25GaW5pc2hlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBpZiAoaXNGdW5jdGlvbihvbkFuaW1hdGlvbkVuZCkpIHtcbiAgICAgICAgb25BbmltYXRpb25FbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiaGFuZGxlQW5pbWF0aW9uU3RhcnRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQW5pbWF0aW9uU3RhcnQgPSBfdGhpcy5wcm9wcy5vbkFuaW1hdGlvblN0YXJ0O1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0FuaW1hdGlvbkZpbmlzaGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBpZiAoaXNGdW5jdGlvbihvbkFuaW1hdGlvblN0YXJ0KSkge1xuICAgICAgICBvbkFuaW1hdGlvblN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBpc0FuaW1hdGlvbkZpbmlzaGVkOiAhcHJvcHMuaXNBbmltYXRpb25BY3RpdmUsXG4gICAgICBwcmV2SXNBbmltYXRpb25BY3RpdmU6IHByb3BzLmlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgcHJldkFuaW1hdGlvbklkOiBwcm9wcy5hbmltYXRpb25JZCxcbiAgICAgIHNlY3RvclRvRm9jdXM6IDBcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfaW5oZXJpdHMoUGllLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoUGllLCBbe1xuICAgIGtleTogXCJpc0FjdGl2ZUluZGV4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzQWN0aXZlSW5kZXgoaSkge1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5wcm9wcy5hY3RpdmVJbmRleDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdGl2ZUluZGV4KSkge1xuICAgICAgICByZXR1cm4gYWN0aXZlSW5kZXguaW5kZXhPZihpKSAhPT0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gaSA9PT0gYWN0aXZlSW5kZXg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0FjdGl2ZUluZGV4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0FjdGl2ZUluZGV4KCkge1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5wcm9wcy5hY3RpdmVJbmRleDtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFjdGl2ZUluZGV4KSA/IGFjdGl2ZUluZGV4Lmxlbmd0aCAhPT0gMCA6IGFjdGl2ZUluZGV4IHx8IGFjdGl2ZUluZGV4ID09PSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJMYWJlbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTGFiZWxzKHNlY3RvcnMpIHtcbiAgICAgIHZhciBpc0FuaW1hdGlvbkFjdGl2ZSA9IHRoaXMucHJvcHMuaXNBbmltYXRpb25BY3RpdmU7XG4gICAgICBpZiAoaXNBbmltYXRpb25BY3RpdmUgJiYgIXRoaXMuc3RhdGUuaXNBbmltYXRpb25GaW5pc2hlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGxhYmVsID0gX3RoaXMkcHJvcHMubGFiZWwsXG4gICAgICAgIGxhYmVsTGluZSA9IF90aGlzJHByb3BzLmxhYmVsTGluZSxcbiAgICAgICAgZGF0YUtleSA9IF90aGlzJHByb3BzLmRhdGFLZXksXG4gICAgICAgIHZhbHVlS2V5ID0gX3RoaXMkcHJvcHMudmFsdWVLZXk7XG4gICAgICB2YXIgcGllUHJvcHMgPSBmaWx0ZXJQcm9wcyh0aGlzLnByb3BzLCBmYWxzZSk7XG4gICAgICB2YXIgY3VzdG9tTGFiZWxQcm9wcyA9IGZpbHRlclByb3BzKGxhYmVsLCBmYWxzZSk7XG4gICAgICB2YXIgY3VzdG9tTGFiZWxMaW5lUHJvcHMgPSBmaWx0ZXJQcm9wcyhsYWJlbExpbmUsIGZhbHNlKTtcbiAgICAgIHZhciBvZmZzZXRSYWRpdXMgPSBsYWJlbCAmJiBsYWJlbC5vZmZzZXRSYWRpdXMgfHwgMjA7XG4gICAgICB2YXIgbGFiZWxzID0gc2VjdG9ycy5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIHZhciBtaWRBbmdsZSA9IChlbnRyeS5zdGFydEFuZ2xlICsgZW50cnkuZW5kQW5nbGUpIC8gMjtcbiAgICAgICAgdmFyIGVuZFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihlbnRyeS5jeCwgZW50cnkuY3ksIGVudHJ5Lm91dGVyUmFkaXVzICsgb2Zmc2V0UmFkaXVzLCBtaWRBbmdsZSk7XG4gICAgICAgIHZhciBsYWJlbFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcGllUHJvcHMpLCBlbnRyeSksIHt9LCB7XG4gICAgICAgICAgc3Ryb2tlOiAnbm9uZSdcbiAgICAgICAgfSwgY3VzdG9tTGFiZWxQcm9wcyksIHt9LCB7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdGV4dEFuY2hvcjogUGllLmdldFRleHRBbmNob3IoZW5kUG9pbnQueCwgZW50cnkuY3gpXG4gICAgICAgIH0sIGVuZFBvaW50KTtcbiAgICAgICAgdmFyIGxpbmVQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBpZVByb3BzKSwgZW50cnkpLCB7fSwge1xuICAgICAgICAgIGZpbGw6ICdub25lJyxcbiAgICAgICAgICBzdHJva2U6IGVudHJ5LmZpbGxcbiAgICAgICAgfSwgY3VzdG9tTGFiZWxMaW5lUHJvcHMpLCB7fSwge1xuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIHBvaW50czogW3BvbGFyVG9DYXJ0ZXNpYW4oZW50cnkuY3gsIGVudHJ5LmN5LCBlbnRyeS5vdXRlclJhZGl1cywgbWlkQW5nbGUpLCBlbmRQb2ludF1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWFsRGF0YUtleSA9IGRhdGFLZXk7XG4gICAgICAgIC8vIFRPRE86IGNvbXBhdGlibGUgdG8gbG93ZXIgdmVyc2lvbnNcbiAgICAgICAgaWYgKGlzTmlsKGRhdGFLZXkpICYmIGlzTmlsKHZhbHVlS2V5KSkge1xuICAgICAgICAgIHJlYWxEYXRhS2V5ID0gJ3ZhbHVlJztcbiAgICAgICAgfSBlbHNlIGlmIChpc05pbChkYXRhS2V5KSkge1xuICAgICAgICAgIHJlYWxEYXRhS2V5ID0gdmFsdWVLZXk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgICAgIGtleTogXCJsYWJlbC1cIi5jb25jYXQoZW50cnkuc3RhcnRBbmdsZSwgXCItXCIpLmNvbmNhdChlbnRyeS5lbmRBbmdsZSwgXCItXCIpLmNvbmNhdChlbnRyeS5taWRBbmdsZSwgXCItXCIpLmNvbmNhdChpKVxuICAgICAgICAgIH0sIGxhYmVsTGluZSAmJiBQaWUucmVuZGVyTGFiZWxMaW5lSXRlbShsYWJlbExpbmUsIGxpbmVQcm9wcywgJ2xpbmUnKSwgUGllLnJlbmRlckxhYmVsSXRlbShsYWJlbCwgbGFiZWxQcm9wcywgZ2V0VmFsdWVCeURhdGFLZXkoZW50cnksIHJlYWxEYXRhS2V5KSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge1xuICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtcGllLWxhYmVsc1wiXG4gICAgICB9LCBsYWJlbHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJTZWN0b3JzU3RhdGljYWxseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJTZWN0b3JzU3RhdGljYWxseShzZWN0b3JzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmVTaGFwZSA9IF90aGlzJHByb3BzMi5hY3RpdmVTaGFwZSxcbiAgICAgICAgYmxlbmRTdHJva2UgPSBfdGhpcyRwcm9wczIuYmxlbmRTdHJva2UsXG4gICAgICAgIGluYWN0aXZlU2hhcGVQcm9wID0gX3RoaXMkcHJvcHMyLmluYWN0aXZlU2hhcGU7XG4gICAgICByZXR1cm4gc2VjdG9ycy5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIGlmICgoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LnN0YXJ0QW5nbGUpID09PSAwICYmIChlbnRyeSA9PT0gbnVsbCB8fCBlbnRyeSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW50cnkuZW5kQW5nbGUpID09PSAwICYmIHNlY3RvcnMubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGlzQWN0aXZlID0gX3RoaXMyLmlzQWN0aXZlSW5kZXgoaSk7XG4gICAgICAgIHZhciBpbmFjdGl2ZVNoYXBlID0gaW5hY3RpdmVTaGFwZVByb3AgJiYgX3RoaXMyLmhhc0FjdGl2ZUluZGV4KCkgPyBpbmFjdGl2ZVNoYXBlUHJvcCA6IG51bGw7XG4gICAgICAgIHZhciBzZWN0b3JPcHRpb25zID0gaXNBY3RpdmUgPyBhY3RpdmVTaGFwZSA6IGluYWN0aXZlU2hhcGU7XG4gICAgICAgIHZhciBzZWN0b3JQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50cnkpLCB7fSwge1xuICAgICAgICAgIHN0cm9rZTogYmxlbmRTdHJva2UgPyBlbnRyeS5maWxsIDogZW50cnkuc3Ryb2tlLFxuICAgICAgICAgIHRhYkluZGV4OiAtMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoX3JlZikge1xuICAgICAgICAgICAgaWYgKF9yZWYgJiYgIV90aGlzMi5zZWN0b3JSZWZzLmluY2x1ZGVzKF9yZWYpKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5zZWN0b3JSZWZzLnB1c2goX3JlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXBpZS1zZWN0b3JcIlxuICAgICAgICB9LCBhZGFwdEV2ZW50c09mQ2hpbGQoX3RoaXMyLnByb3BzLCBlbnRyeSwgaSksIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgICAga2V5OiBcInNlY3Rvci1cIi5jb25jYXQoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LnN0YXJ0QW5nbGUsIFwiLVwiKS5jb25jYXQoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LmVuZEFuZ2xlLCBcIi1cIikuY29uY2F0KGVudHJ5Lm1pZEFuZ2xlLCBcIi1cIikuY29uY2F0KGkpXG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaGFwZSwgX2V4dGVuZHMoe1xuICAgICAgICAgIG9wdGlvbjogc2VjdG9yT3B0aW9ucyxcbiAgICAgICAgICBpc0FjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgICAgc2hhcGVUeXBlOiBcInNlY3RvclwiXG4gICAgICAgIH0sIHNlY3RvclByb3BzKSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclNlY3RvcnNXaXRoQW5pbWF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclNlY3RvcnNXaXRoQW5pbWF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2VjdG9ycyA9IF90aGlzJHByb3BzMy5zZWN0b3JzLFxuICAgICAgICBpc0FuaW1hdGlvbkFjdGl2ZSA9IF90aGlzJHByb3BzMy5pc0FuaW1hdGlvbkFjdGl2ZSxcbiAgICAgICAgYW5pbWF0aW9uQmVnaW4gPSBfdGhpcyRwcm9wczMuYW5pbWF0aW9uQmVnaW4sXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uID0gX3RoaXMkcHJvcHMzLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25FYXNpbmcgPSBfdGhpcyRwcm9wczMuYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBhbmltYXRpb25JZCA9IF90aGlzJHByb3BzMy5hbmltYXRpb25JZDtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIHByZXZTZWN0b3JzID0gX3RoaXMkc3RhdGUucHJldlNlY3RvcnMsXG4gICAgICAgIHByZXZJc0FuaW1hdGlvbkFjdGl2ZSA9IF90aGlzJHN0YXRlLnByZXZJc0FuaW1hdGlvbkFjdGl2ZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbmltYXRlLCB7XG4gICAgICAgIGJlZ2luOiBhbmltYXRpb25CZWdpbixcbiAgICAgICAgZHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBpc0FjdGl2ZTogaXNBbmltYXRpb25BY3RpdmUsXG4gICAgICAgIGVhc2luZzogYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdDogMFxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHQ6IDFcbiAgICAgICAgfSxcbiAgICAgICAga2V5OiBcInBpZS1cIi5jb25jYXQoYW5pbWF0aW9uSWQsIFwiLVwiKS5jb25jYXQocHJldklzQW5pbWF0aW9uQWN0aXZlKSxcbiAgICAgICAgb25BbmltYXRpb25TdGFydDogdGhpcy5oYW5kbGVBbmltYXRpb25TdGFydCxcbiAgICAgICAgb25BbmltYXRpb25FbmQ6IHRoaXMuaGFuZGxlQW5pbWF0aW9uRW5kXG4gICAgICB9LCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIHQgPSBfcmVmMi50O1xuICAgICAgICB2YXIgc3RlcERhdGEgPSBbXTtcbiAgICAgICAgdmFyIGZpcnN0ID0gc2VjdG9ycyAmJiBzZWN0b3JzWzBdO1xuICAgICAgICB2YXIgY3VyQW5nbGUgPSBmaXJzdC5zdGFydEFuZ2xlO1xuICAgICAgICBzZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgICAgICAgIHZhciBwcmV2ID0gcHJldlNlY3RvcnMgJiYgcHJldlNlY3RvcnNbaW5kZXhdO1xuICAgICAgICAgIHZhciBwYWRkaW5nQW5nbGUgPSBpbmRleCA+IDAgPyBnZXQoZW50cnksICdwYWRkaW5nQW5nbGUnLCAwKSA6IDA7XG4gICAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIHZhciBhbmdsZUlwID0gaW50ZXJwb2xhdGVOdW1iZXIocHJldi5lbmRBbmdsZSAtIHByZXYuc3RhcnRBbmdsZSwgZW50cnkuZW5kQW5nbGUgLSBlbnRyeS5zdGFydEFuZ2xlKTtcbiAgICAgICAgICAgIHZhciBsYXRlc3QgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVudHJ5KSwge30sIHtcbiAgICAgICAgICAgICAgc3RhcnRBbmdsZTogY3VyQW5nbGUgKyBwYWRkaW5nQW5nbGUsXG4gICAgICAgICAgICAgIGVuZEFuZ2xlOiBjdXJBbmdsZSArIGFuZ2xlSXAodCkgKyBwYWRkaW5nQW5nbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RlcERhdGEucHVzaChsYXRlc3QpO1xuICAgICAgICAgICAgY3VyQW5nbGUgPSBsYXRlc3QuZW5kQW5nbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBlbmRBbmdsZSA9IGVudHJ5LmVuZEFuZ2xlLFxuICAgICAgICAgICAgICBzdGFydEFuZ2xlID0gZW50cnkuc3RhcnRBbmdsZTtcbiAgICAgICAgICAgIHZhciBpbnRlcnBvbGF0b3JBbmdsZSA9IGludGVycG9sYXRlTnVtYmVyKDAsIGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSk7XG4gICAgICAgICAgICB2YXIgZGVsdGFBbmdsZSA9IGludGVycG9sYXRvckFuZ2xlKHQpO1xuICAgICAgICAgICAgdmFyIF9sYXRlc3QgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVudHJ5KSwge30sIHtcbiAgICAgICAgICAgICAgc3RhcnRBbmdsZTogY3VyQW5nbGUgKyBwYWRkaW5nQW5nbGUsXG4gICAgICAgICAgICAgIGVuZEFuZ2xlOiBjdXJBbmdsZSArIGRlbHRhQW5nbGUgKyBwYWRkaW5nQW5nbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RlcERhdGEucHVzaChfbGF0ZXN0KTtcbiAgICAgICAgICAgIGN1ckFuZ2xlID0gX2xhdGVzdC5lbmRBbmdsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIG51bGwsIF90aGlzMy5yZW5kZXJTZWN0b3JzU3RhdGljYWxseShzdGVwRGF0YSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0dGFjaEtleWJvYXJkSGFuZGxlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoS2V5Ym9hcmRIYW5kbGVycyhwaWVSZWYpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBwaWVSZWYub25rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFlLmFsdEtleSkge1xuICAgICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9ICsrX3RoaXM0LnN0YXRlLnNlY3RvclRvRm9jdXMgJSBfdGhpczQuc2VjdG9yUmVmcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgX3RoaXM0LnNlY3RvclJlZnNbbmV4dF0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBfdGhpczQuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgc2VjdG9yVG9Gb2N1czogbmV4dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfbmV4dCA9IC0tX3RoaXM0LnN0YXRlLnNlY3RvclRvRm9jdXMgPCAwID8gX3RoaXM0LnNlY3RvclJlZnMubGVuZ3RoIC0gMSA6IF90aGlzNC5zdGF0ZS5zZWN0b3JUb0ZvY3VzICUgX3RoaXM0LnNlY3RvclJlZnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIF90aGlzNC5zZWN0b3JSZWZzW19uZXh0XS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIF90aGlzNC5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICBzZWN0b3JUb0ZvY3VzOiBfbmV4dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3RoaXM0LnNlY3RvclJlZnNbX3RoaXM0LnN0YXRlLnNlY3RvclRvRm9jdXNdLmJsdXIoKTtcbiAgICAgICAgICAgICAgICBfdGhpczQuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgc2VjdG9yVG9Gb2N1czogMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclNlY3RvcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyU2VjdG9ycygpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICBzZWN0b3JzID0gX3RoaXMkcHJvcHM0LnNlY3RvcnMsXG4gICAgICAgIGlzQW5pbWF0aW9uQWN0aXZlID0gX3RoaXMkcHJvcHM0LmlzQW5pbWF0aW9uQWN0aXZlO1xuICAgICAgdmFyIHByZXZTZWN0b3JzID0gdGhpcy5zdGF0ZS5wcmV2U2VjdG9ycztcbiAgICAgIGlmIChpc0FuaW1hdGlvbkFjdGl2ZSAmJiBzZWN0b3JzICYmIHNlY3RvcnMubGVuZ3RoICYmICghcHJldlNlY3RvcnMgfHwgIWlzRXF1YWwocHJldlNlY3RvcnMsIHNlY3RvcnMpKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJTZWN0b3JzV2l0aEFuaW1hdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyU2VjdG9yc1N0YXRpY2FsbHkoc2VjdG9ycyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgaWYgKHRoaXMucGllUmVmKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoS2V5Ym9hcmRIYW5kbGVycyh0aGlzLnBpZVJlZik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICBoaWRlID0gX3RoaXMkcHJvcHM1LmhpZGUsXG4gICAgICAgIHNlY3RvcnMgPSBfdGhpcyRwcm9wczUuc2VjdG9ycyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM1LmNsYXNzTmFtZSxcbiAgICAgICAgbGFiZWwgPSBfdGhpcyRwcm9wczUubGFiZWwsXG4gICAgICAgIGN4ID0gX3RoaXMkcHJvcHM1LmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzNS5jeSxcbiAgICAgICAgaW5uZXJSYWRpdXMgPSBfdGhpcyRwcm9wczUuaW5uZXJSYWRpdXMsXG4gICAgICAgIG91dGVyUmFkaXVzID0gX3RoaXMkcHJvcHM1Lm91dGVyUmFkaXVzLFxuICAgICAgICBpc0FuaW1hdGlvbkFjdGl2ZSA9IF90aGlzJHByb3BzNS5pc0FuaW1hdGlvbkFjdGl2ZTtcbiAgICAgIHZhciBpc0FuaW1hdGlvbkZpbmlzaGVkID0gdGhpcy5zdGF0ZS5pc0FuaW1hdGlvbkZpbmlzaGVkO1xuICAgICAgaWYgKGhpZGUgfHwgIXNlY3RvcnMgfHwgIXNlY3RvcnMubGVuZ3RoIHx8ICFpc051bWJlcihjeCkgfHwgIWlzTnVtYmVyKGN5KSB8fCAhaXNOdW1iZXIoaW5uZXJSYWRpdXMpIHx8ICFpc051bWJlcihvdXRlclJhZGl1cykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgbGF5ZXJDbGFzcyA9IGNsc3goJ3JlY2hhcnRzLXBpZScsIGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgdGFiSW5kZXg6IHRoaXMucHJvcHMucm9vdFRhYkluZGV4LFxuICAgICAgICBjbGFzc05hbWU6IGxheWVyQ2xhc3MsXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKF9yZWYzKSB7XG4gICAgICAgICAgX3RoaXM1LnBpZVJlZiA9IF9yZWYzO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLnJlbmRlclNlY3RvcnMoKSwgbGFiZWwgJiYgdGhpcy5yZW5kZXJMYWJlbHMoc2VjdG9ycyksIExhYmVsLnJlbmRlckNhbGxCeVBhcmVudCh0aGlzLnByb3BzLCBudWxsLCBmYWxzZSksICghaXNBbmltYXRpb25BY3RpdmUgfHwgaXNBbmltYXRpb25GaW5pc2hlZCkgJiYgTGFiZWxMaXN0LnJlbmRlckNhbGxCeVBhcmVudCh0aGlzLnByb3BzLCBzZWN0b3JzLCBmYWxzZSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgIGlmIChwcmV2U3RhdGUucHJldklzQW5pbWF0aW9uQWN0aXZlICE9PSBuZXh0UHJvcHMuaXNBbmltYXRpb25BY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmV2SXNBbmltYXRpb25BY3RpdmU6IG5leHRQcm9wcy5pc0FuaW1hdGlvbkFjdGl2ZSxcbiAgICAgICAgICBwcmV2QW5pbWF0aW9uSWQ6IG5leHRQcm9wcy5hbmltYXRpb25JZCxcbiAgICAgICAgICBjdXJTZWN0b3JzOiBuZXh0UHJvcHMuc2VjdG9ycyxcbiAgICAgICAgICBwcmV2U2VjdG9yczogW10sXG4gICAgICAgICAgaXNBbmltYXRpb25GaW5pc2hlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG5leHRQcm9wcy5pc0FuaW1hdGlvbkFjdGl2ZSAmJiBuZXh0UHJvcHMuYW5pbWF0aW9uSWQgIT09IHByZXZTdGF0ZS5wcmV2QW5pbWF0aW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmV2QW5pbWF0aW9uSWQ6IG5leHRQcm9wcy5hbmltYXRpb25JZCxcbiAgICAgICAgICBjdXJTZWN0b3JzOiBuZXh0UHJvcHMuc2VjdG9ycyxcbiAgICAgICAgICBwcmV2U2VjdG9yczogcHJldlN0YXRlLmN1clNlY3RvcnMsXG4gICAgICAgICAgaXNBbmltYXRpb25GaW5pc2hlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG5leHRQcm9wcy5zZWN0b3JzICE9PSBwcmV2U3RhdGUuY3VyU2VjdG9ycykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1clNlY3RvcnM6IG5leHRQcm9wcy5zZWN0b3JzLFxuICAgICAgICAgIGlzQW5pbWF0aW9uRmluaXNoZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRUZXh0QW5jaG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRleHRBbmNob3IoeCwgY3gpIHtcbiAgICAgIGlmICh4ID4gY3gpIHtcbiAgICAgICAgcmV0dXJuICdzdGFydCc7XG4gICAgICB9XG4gICAgICBpZiAoeCA8IGN4KSB7XG4gICAgICAgIHJldHVybiAnZW5kJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbWlkZGxlJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyTGFiZWxMaW5lSXRlbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJMYWJlbExpbmVJdGVtKG9wdGlvbiwgcHJvcHMsIGtleSkge1xuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQob3B0aW9uKSkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChvcHRpb24sIHByb3BzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbihwcm9wcyk7XG4gICAgICB9XG4gICAgICB2YXIgY2xhc3NOYW1lID0gY2xzeCgncmVjaGFydHMtcGllLWxhYmVsLWxpbmUnLCB0eXBlb2Ygb3B0aW9uICE9PSAnYm9vbGVhbicgPyBvcHRpb24uY2xhc3NOYW1lIDogJycpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEN1cnZlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHR5cGU6IFwibGluZWFyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgICB9KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckxhYmVsSXRlbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJMYWJlbEl0ZW0ob3B0aW9uLCBwcm9wcywgdmFsdWUpIHtcbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQob3B0aW9uLCBwcm9wcyk7XG4gICAgICB9XG4gICAgICB2YXIgbGFiZWwgPSB2YWx1ZTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgbGFiZWwgPSBvcHRpb24ocHJvcHMpO1xuICAgICAgICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChsYWJlbCkpIHtcbiAgICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjbGFzc05hbWUgPSBjbHN4KCdyZWNoYXJ0cy1waWUtbGFiZWwtdGV4dCcsIHR5cGVvZiBvcHRpb24gIT09ICdib29sZWFuJyAmJiAhaXNGdW5jdGlvbihvcHRpb24pID8gb3B0aW9uLmNsYXNzTmFtZSA6ICcnKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgYWxpZ25tZW50QmFzZWxpbmU6IFwibWlkZGxlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgICB9KSwgbGFiZWwpO1xuICAgIH1cbiAgfV0pO1xufShQdXJlQ29tcG9uZW50KTtcbl9QaWUgPSBQaWU7XG5fZGVmaW5lUHJvcGVydHkoUGllLCBcImRpc3BsYXlOYW1lXCIsICdQaWUnKTtcbl9kZWZpbmVQcm9wZXJ0eShQaWUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgc3Ryb2tlOiAnI2ZmZicsXG4gIGZpbGw6ICcjODA4MDgwJyxcbiAgbGVnZW5kVHlwZTogJ3JlY3QnLFxuICBjeDogJzUwJScsXG4gIGN5OiAnNTAlJyxcbiAgc3RhcnRBbmdsZTogMCxcbiAgZW5kQW5nbGU6IDM2MCxcbiAgaW5uZXJSYWRpdXM6IDAsXG4gIG91dGVyUmFkaXVzOiAnODAlJyxcbiAgcGFkZGluZ0FuZ2xlOiAwLFxuICBsYWJlbExpbmU6IHRydWUsXG4gIGhpZGU6IGZhbHNlLFxuICBtaW5BbmdsZTogMCxcbiAgaXNBbmltYXRpb25BY3RpdmU6ICFHbG9iYWwuaXNTc3IsXG4gIGFuaW1hdGlvbkJlZ2luOiA0MDAsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxNTAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdlYXNlJyxcbiAgbmFtZUtleTogJ25hbWUnLFxuICBibGVuZFN0cm9rZTogZmFsc2UsXG4gIHJvb3RUYWJJbmRleDogMFxufSk7XG5fZGVmaW5lUHJvcGVydHkoUGllLCBcInBhcnNlRGVsdGFBbmdsZVwiLCBmdW5jdGlvbiAoc3RhcnRBbmdsZSwgZW5kQW5nbGUpIHtcbiAgdmFyIHNpZ24gPSBtYXRoU2lnbihlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuICB2YXIgZGVsdGFBbmdsZSA9IE1hdGgubWluKE1hdGguYWJzKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSksIDM2MCk7XG4gIHJldHVybiBzaWduICogZGVsdGFBbmdsZTtcbn0pO1xuX2RlZmluZVByb3BlcnR5KFBpZSwgXCJnZXRSZWFsUGllRGF0YVwiLCBmdW5jdGlvbiAoaXRlbVByb3BzKSB7XG4gIHZhciBkYXRhID0gaXRlbVByb3BzLmRhdGEsXG4gICAgY2hpbGRyZW4gPSBpdGVtUHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmVzZW50YXRpb25Qcm9wcyA9IGZpbHRlclByb3BzKGl0ZW1Qcm9wcywgZmFsc2UpO1xuICB2YXIgY2VsbHMgPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBDZWxsKTtcbiAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgcGF5bG9hZDogZW50cnlcbiAgICAgIH0sIHByZXNlbnRhdGlvblByb3BzKSwgZW50cnkpLCBjZWxscyAmJiBjZWxsc1tpbmRleF0gJiYgY2VsbHNbaW5kZXhdLnByb3BzKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoY2VsbHMgJiYgY2VsbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJlc2VudGF0aW9uUHJvcHMpLCBjZWxsLnByb3BzKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW107XG59KTtcbl9kZWZpbmVQcm9wZXJ0eShQaWUsIFwicGFyc2VDb29yZGluYXRlT2ZQaWVcIiwgZnVuY3Rpb24gKGl0ZW1Qcm9wcywgb2Zmc2V0KSB7XG4gIHZhciB0b3AgPSBvZmZzZXQudG9wLFxuICAgIGxlZnQgPSBvZmZzZXQubGVmdCxcbiAgICB3aWR0aCA9IG9mZnNldC53aWR0aCxcbiAgICBoZWlnaHQgPSBvZmZzZXQuaGVpZ2h0O1xuICB2YXIgbWF4UGllUmFkaXVzID0gZ2V0TWF4UmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgY3ggPSBsZWZ0ICsgZ2V0UGVyY2VudFZhbHVlKGl0ZW1Qcm9wcy5jeCwgd2lkdGgsIHdpZHRoIC8gMik7XG4gIHZhciBjeSA9IHRvcCArIGdldFBlcmNlbnRWYWx1ZShpdGVtUHJvcHMuY3ksIGhlaWdodCwgaGVpZ2h0IC8gMik7XG4gIHZhciBpbm5lclJhZGl1cyA9IGdldFBlcmNlbnRWYWx1ZShpdGVtUHJvcHMuaW5uZXJSYWRpdXMsIG1heFBpZVJhZGl1cywgMCk7XG4gIHZhciBvdXRlclJhZGl1cyA9IGdldFBlcmNlbnRWYWx1ZShpdGVtUHJvcHMub3V0ZXJSYWRpdXMsIG1heFBpZVJhZGl1cywgbWF4UGllUmFkaXVzICogMC44KTtcbiAgdmFyIG1heFJhZGl1cyA9IGl0ZW1Qcm9wcy5tYXhSYWRpdXMgfHwgTWF0aC5zcXJ0KHdpZHRoICogd2lkdGggKyBoZWlnaHQgKiBoZWlnaHQpIC8gMjtcbiAgcmV0dXJuIHtcbiAgICBjeDogY3gsXG4gICAgY3k6IGN5LFxuICAgIGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG4gICAgbWF4UmFkaXVzOiBtYXhSYWRpdXNcbiAgfTtcbn0pO1xuX2RlZmluZVByb3BlcnR5KFBpZSwgXCJnZXRDb21wb3NlZERhdGFcIiwgZnVuY3Rpb24gKF9yZWY0KSB7XG4gIHZhciBpdGVtID0gX3JlZjQuaXRlbSxcbiAgICBvZmZzZXQgPSBfcmVmNC5vZmZzZXQ7XG4gIHZhciBpdGVtUHJvcHMgPSBpdGVtLnR5cGUuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0udHlwZS5kZWZhdWx0UHJvcHMpLCBpdGVtLnByb3BzKSA6IGl0ZW0ucHJvcHM7XG4gIHZhciBwaWVEYXRhID0gX1BpZS5nZXRSZWFsUGllRGF0YShpdGVtUHJvcHMpO1xuICBpZiAoIXBpZURhdGEgfHwgIXBpZURhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGNvcm5lclJhZGl1cyA9IGl0ZW1Qcm9wcy5jb3JuZXJSYWRpdXMsXG4gICAgc3RhcnRBbmdsZSA9IGl0ZW1Qcm9wcy5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gaXRlbVByb3BzLmVuZEFuZ2xlLFxuICAgIHBhZGRpbmdBbmdsZSA9IGl0ZW1Qcm9wcy5wYWRkaW5nQW5nbGUsXG4gICAgZGF0YUtleSA9IGl0ZW1Qcm9wcy5kYXRhS2V5LFxuICAgIG5hbWVLZXkgPSBpdGVtUHJvcHMubmFtZUtleSxcbiAgICB2YWx1ZUtleSA9IGl0ZW1Qcm9wcy52YWx1ZUtleSxcbiAgICB0b29sdGlwVHlwZSA9IGl0ZW1Qcm9wcy50b29sdGlwVHlwZTtcbiAgdmFyIG1pbkFuZ2xlID0gTWF0aC5hYnMoaXRlbVByb3BzLm1pbkFuZ2xlKTtcbiAgdmFyIGNvb3JkaW5hdGUgPSBfUGllLnBhcnNlQ29vcmRpbmF0ZU9mUGllKGl0ZW1Qcm9wcywgb2Zmc2V0KTtcbiAgdmFyIGRlbHRhQW5nbGUgPSBfUGllLnBhcnNlRGVsdGFBbmdsZShzdGFydEFuZ2xlLCBlbmRBbmdsZSk7XG4gIHZhciBhYnNEZWx0YUFuZ2xlID0gTWF0aC5hYnMoZGVsdGFBbmdsZSk7XG4gIHZhciByZWFsRGF0YUtleSA9IGRhdGFLZXk7XG4gIGlmIChpc05pbChkYXRhS2V5KSAmJiBpc05pbCh2YWx1ZUtleSkpIHtcbiAgICB3YXJuKGZhbHNlLCBcIlVzZSBcXFwiZGF0YUtleVxcXCIgdG8gc3BlY2lmeSB0aGUgdmFsdWUgb2YgcGllLFxcbiAgICAgIHRoZSBwcm9wcyBcXFwidmFsdWVLZXlcXFwiIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiAxLjEuMFwiKTtcbiAgICByZWFsRGF0YUtleSA9ICd2YWx1ZSc7XG4gIH0gZWxzZSBpZiAoaXNOaWwoZGF0YUtleSkpIHtcbiAgICB3YXJuKGZhbHNlLCBcIlVzZSBcXFwiZGF0YUtleVxcXCIgdG8gc3BlY2lmeSB0aGUgdmFsdWUgb2YgcGllLFxcbiAgICAgIHRoZSBwcm9wcyBcXFwidmFsdWVLZXlcXFwiIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiAxLjEuMFwiKTtcbiAgICByZWFsRGF0YUtleSA9IHZhbHVlS2V5O1xuICB9XG4gIHZhciBub3RaZXJvSXRlbUNvdW50ID0gcGllRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgcmV0dXJuIGdldFZhbHVlQnlEYXRhS2V5KGVudHJ5LCByZWFsRGF0YUtleSwgMCkgIT09IDA7XG4gIH0pLmxlbmd0aDtcbiAgdmFyIHRvdGFsUGFkaW5nQW5nbGUgPSAoYWJzRGVsdGFBbmdsZSA+PSAzNjAgPyBub3RaZXJvSXRlbUNvdW50IDogbm90WmVyb0l0ZW1Db3VudCAtIDEpICogcGFkZGluZ0FuZ2xlO1xuICB2YXIgcmVhbFRvdGFsQW5nbGUgPSBhYnNEZWx0YUFuZ2xlIC0gbm90WmVyb0l0ZW1Db3VudCAqIG1pbkFuZ2xlIC0gdG90YWxQYWRpbmdBbmdsZTtcbiAgdmFyIHN1bSA9IHBpZURhdGEucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGVudHJ5KSB7XG4gICAgdmFyIHZhbCA9IGdldFZhbHVlQnlEYXRhS2V5KGVudHJ5LCByZWFsRGF0YUtleSwgMCk7XG4gICAgcmV0dXJuIHJlc3VsdCArIChpc051bWJlcih2YWwpID8gdmFsIDogMCk7XG4gIH0sIDApO1xuICB2YXIgc2VjdG9ycztcbiAgaWYgKHN1bSA+IDApIHtcbiAgICB2YXIgcHJldjtcbiAgICBzZWN0b3JzID0gcGllRGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICB2YXIgdmFsID0gZ2V0VmFsdWVCeURhdGFLZXkoZW50cnksIHJlYWxEYXRhS2V5LCAwKTtcbiAgICAgIHZhciBuYW1lID0gZ2V0VmFsdWVCeURhdGFLZXkoZW50cnksIG5hbWVLZXksIGkpO1xuICAgICAgdmFyIHBlcmNlbnQgPSAoaXNOdW1iZXIodmFsKSA/IHZhbCA6IDApIC8gc3VtO1xuICAgICAgdmFyIHRlbXBTdGFydEFuZ2xlO1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgdGVtcFN0YXJ0QW5nbGUgPSBwcmV2LmVuZEFuZ2xlICsgbWF0aFNpZ24oZGVsdGFBbmdsZSkgKiBwYWRkaW5nQW5nbGUgKiAodmFsICE9PSAwID8gMSA6IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVtcFN0YXJ0QW5nbGUgPSBzdGFydEFuZ2xlO1xuICAgICAgfVxuICAgICAgdmFyIHRlbXBFbmRBbmdsZSA9IHRlbXBTdGFydEFuZ2xlICsgbWF0aFNpZ24oZGVsdGFBbmdsZSkgKiAoKHZhbCAhPT0gMCA/IG1pbkFuZ2xlIDogMCkgKyBwZXJjZW50ICogcmVhbFRvdGFsQW5nbGUpO1xuICAgICAgdmFyIG1pZEFuZ2xlID0gKHRlbXBTdGFydEFuZ2xlICsgdGVtcEVuZEFuZ2xlKSAvIDI7XG4gICAgICB2YXIgbWlkZGxlUmFkaXVzID0gKGNvb3JkaW5hdGUuaW5uZXJSYWRpdXMgKyBjb29yZGluYXRlLm91dGVyUmFkaXVzKSAvIDI7XG4gICAgICB2YXIgdG9vbHRpcFBheWxvYWQgPSBbe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICBwYXlsb2FkOiBlbnRyeSxcbiAgICAgICAgZGF0YUtleTogcmVhbERhdGFLZXksXG4gICAgICAgIHR5cGU6IHRvb2x0aXBUeXBlXG4gICAgICB9XTtcbiAgICAgIHZhciB0b29sdGlwUG9zaXRpb24gPSBwb2xhclRvQ2FydGVzaWFuKGNvb3JkaW5hdGUuY3gsIGNvb3JkaW5hdGUuY3ksIG1pZGRsZVJhZGl1cywgbWlkQW5nbGUpO1xuICAgICAgcHJldiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgcGVyY2VudDogcGVyY2VudCxcbiAgICAgICAgY29ybmVyUmFkaXVzOiBjb3JuZXJSYWRpdXMsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHRvb2x0aXBQYXlsb2FkOiB0b29sdGlwUGF5bG9hZCxcbiAgICAgICAgbWlkQW5nbGU6IG1pZEFuZ2xlLFxuICAgICAgICBtaWRkbGVSYWRpdXM6IG1pZGRsZVJhZGl1cyxcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uOiB0b29sdGlwUG9zaXRpb25cbiAgICAgIH0sIGVudHJ5KSwgY29vcmRpbmF0ZSksIHt9LCB7XG4gICAgICAgIHZhbHVlOiBnZXRWYWx1ZUJ5RGF0YUtleShlbnRyeSwgcmVhbERhdGFLZXkpLFxuICAgICAgICBzdGFydEFuZ2xlOiB0ZW1wU3RhcnRBbmdsZSxcbiAgICAgICAgZW5kQW5nbGU6IHRlbXBFbmRBbmdsZSxcbiAgICAgICAgcGF5bG9hZDogZW50cnksXG4gICAgICAgIHBhZGRpbmdBbmdsZTogbWF0aFNpZ24oZGVsdGFBbmdsZSkgKiBwYWRkaW5nQW5nbGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29vcmRpbmF0ZSksIHt9LCB7XG4gICAgc2VjdG9yczogc2VjdG9ycyxcbiAgICBkYXRhOiBwaWVEYXRhXG4gIH0pO1xufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkgeyByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpOyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgdHJ5IHsgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyB9IGNhdGNoICh0KSB7fSByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyByZXR1cm4gISF0OyB9KSgpOyB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBBeGlzIG9mIHJhZGlhbCBkaXJlY3Rpb25cbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IERvdCB9IGZyb20gJy4uL3NoYXBlL0RvdCc7XG5pbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnLi4vc2hhcGUvUG9seWdvbic7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50L1RleHQnO1xuaW1wb3J0IHsgYWRhcHRFdmVudHNPZkNoaWxkIH0gZnJvbSAnLi4vdXRpbC90eXBlcyc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5pbXBvcnQgeyBnZXRUaWNrQ2xhc3NOYW1lLCBwb2xhclRvQ2FydGVzaWFuIH0gZnJvbSAnLi4vdXRpbC9Qb2xhclV0aWxzJztcbnZhciBSQURJQU4gPSBNYXRoLlBJIC8gMTgwO1xudmFyIGVwcyA9IDFlLTU7XG5leHBvcnQgdmFyIFBvbGFyQW5nbGVBeGlzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBmdW5jdGlvbiBQb2xhckFuZ2xlQXhpcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9sYXJBbmdsZUF4aXMpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIFBvbGFyQW5nbGVBeGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhQb2xhckFuZ2xlQXhpcywgX1B1cmVDb21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFBvbGFyQW5nbGVBeGlzLCBbe1xuICAgIGtleTogXCJnZXRUaWNrTGluZUNvb3JkXCIsXG4gICAgdmFsdWU6XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjb29yZGluYXRlIG9mIGxpbmUgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgVGhlIERhdGEgaWYgdGlja3NcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICh4MCwgeTApOiBUaGUgc3RhcnQgcG9pbnQgb2YgdGV4dCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICh4MSwgeTEpOiBUaGUgZW5kIHBvaW50IGNsb3NlIHRvIHRleHQsXG4gICAgICogICAgICAgICAgICAgICAgICAoeDIsIHkyKTogVGhlIGVuZCBwb2ludCBjbG9zZSB0byBheGlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VGlja0xpbmVDb29yZChkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjeCA9IF90aGlzJHByb3BzLmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzLmN5LFxuICAgICAgICByYWRpdXMgPSBfdGhpcyRwcm9wcy5yYWRpdXMsXG4gICAgICAgIG9yaWVudGF0aW9uID0gX3RoaXMkcHJvcHMub3JpZW50YXRpb24sXG4gICAgICAgIHRpY2tTaXplID0gX3RoaXMkcHJvcHMudGlja1NpemU7XG4gICAgICB2YXIgdGlja0xpbmVTaXplID0gdGlja1NpemUgfHwgODtcbiAgICAgIHZhciBwMSA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCByYWRpdXMsIGRhdGEuY29vcmRpbmF0ZSk7XG4gICAgICB2YXIgcDIgPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgcmFkaXVzICsgKG9yaWVudGF0aW9uID09PSAnaW5uZXInID8gLTEgOiAxKSAqIHRpY2tMaW5lU2l6ZSwgZGF0YS5jb29yZGluYXRlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBwMS54LFxuICAgICAgICB5MTogcDEueSxcbiAgICAgICAgeDI6IHAyLngsXG4gICAgICAgIHkyOiBwMi55XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dC1hbmNob3Igb2YgZWFjaCB0aWNrXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIERhdGEgb2YgdGlja3NcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRleHQtYW5jaG9yXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGlja1RleHRBbmNob3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGlja1RleHRBbmNob3IoZGF0YSkge1xuICAgICAgdmFyIG9yaWVudGF0aW9uID0gdGhpcy5wcm9wcy5vcmllbnRhdGlvbjtcbiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcygtZGF0YS5jb29yZGluYXRlICogUkFESUFOKTtcbiAgICAgIHZhciB0ZXh0QW5jaG9yO1xuICAgICAgaWYgKGNvcyA+IGVwcykge1xuICAgICAgICB0ZXh0QW5jaG9yID0gb3JpZW50YXRpb24gPT09ICdvdXRlcicgPyAnc3RhcnQnIDogJ2VuZCc7XG4gICAgICB9IGVsc2UgaWYgKGNvcyA8IC1lcHMpIHtcbiAgICAgICAgdGV4dEFuY2hvciA9IG9yaWVudGF0aW9uID09PSAnb3V0ZXInID8gJ2VuZCcgOiAnc3RhcnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dEFuY2hvciA9ICdtaWRkbGUnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHRBbmNob3I7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckF4aXNMaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckF4aXNMaW5lKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGN4ID0gX3RoaXMkcHJvcHMyLmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzMi5jeSxcbiAgICAgICAgcmFkaXVzID0gX3RoaXMkcHJvcHMyLnJhZGl1cyxcbiAgICAgICAgYXhpc0xpbmUgPSBfdGhpcyRwcm9wczIuYXhpc0xpbmUsXG4gICAgICAgIGF4aXNMaW5lVHlwZSA9IF90aGlzJHByb3BzMi5heGlzTGluZVR5cGU7XG4gICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZpbHRlclByb3BzKHRoaXMucHJvcHMsIGZhbHNlKSksIHt9LCB7XG4gICAgICAgIGZpbGw6ICdub25lJ1xuICAgICAgfSwgZmlsdGVyUHJvcHMoYXhpc0xpbmUsIGZhbHNlKSk7XG4gICAgICBpZiAoYXhpc0xpbmVUeXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG90LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXBvbGFyLWFuZ2xlLWF4aXMtbGluZVwiXG4gICAgICAgIH0sIHByb3BzLCB7XG4gICAgICAgICAgY3g6IGN4LFxuICAgICAgICAgIGN5OiBjeSxcbiAgICAgICAgICByOiByYWRpdXNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgdmFyIHRpY2tzID0gdGhpcy5wcm9wcy50aWNrcztcbiAgICAgIHZhciBwb2ludHMgPSB0aWNrcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgcmFkaXVzLCBlbnRyeS5jb29yZGluYXRlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvbHlnb24sIF9leHRlbmRzKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXBvbGFyLWFuZ2xlLWF4aXMtbGluZVwiXG4gICAgICB9LCBwcm9wcywge1xuICAgICAgICBwb2ludHM6IHBvaW50c1xuICAgICAgfSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJUaWNrc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJUaWNrcygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdGlja3MgPSBfdGhpcyRwcm9wczMudGlja3MsXG4gICAgICAgIHRpY2sgPSBfdGhpcyRwcm9wczMudGljayxcbiAgICAgICAgdGlja0xpbmUgPSBfdGhpcyRwcm9wczMudGlja0xpbmUsXG4gICAgICAgIHRpY2tGb3JtYXR0ZXIgPSBfdGhpcyRwcm9wczMudGlja0Zvcm1hdHRlcixcbiAgICAgICAgc3Ryb2tlID0gX3RoaXMkcHJvcHMzLnN0cm9rZTtcbiAgICAgIHZhciBheGlzUHJvcHMgPSBmaWx0ZXJQcm9wcyh0aGlzLnByb3BzLCBmYWxzZSk7XG4gICAgICB2YXIgY3VzdG9tVGlja1Byb3BzID0gZmlsdGVyUHJvcHModGljaywgZmFsc2UpO1xuICAgICAgdmFyIHRpY2tMaW5lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGF4aXNQcm9wcyksIHt9LCB7XG4gICAgICAgIGZpbGw6ICdub25lJ1xuICAgICAgfSwgZmlsdGVyUHJvcHModGlja0xpbmUsIGZhbHNlKSk7XG4gICAgICB2YXIgaXRlbXMgPSB0aWNrcy5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIHZhciBsaW5lQ29vcmQgPSBfdGhpcy5nZXRUaWNrTGluZUNvb3JkKGVudHJ5KTtcbiAgICAgICAgdmFyIHRleHRBbmNob3IgPSBfdGhpcy5nZXRUaWNrVGV4dEFuY2hvcihlbnRyeSk7XG4gICAgICAgIHZhciB0aWNrUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgdGV4dEFuY2hvcjogdGV4dEFuY2hvclxuICAgICAgICB9LCBheGlzUHJvcHMpLCB7fSwge1xuICAgICAgICAgIHN0cm9rZTogJ25vbmUnLFxuICAgICAgICAgIGZpbGw6IHN0cm9rZVxuICAgICAgICB9LCBjdXN0b21UaWNrUHJvcHMpLCB7fSwge1xuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIHBheWxvYWQ6IGVudHJ5LFxuICAgICAgICAgIHg6IGxpbmVDb29yZC54MixcbiAgICAgICAgICB5OiBsaW5lQ29vcmQueTJcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwgX2V4dGVuZHMoe1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtcG9sYXItYW5nbGUtYXhpcy10aWNrJywgZ2V0VGlja0NsYXNzTmFtZSh0aWNrKSksXG4gICAgICAgICAga2V5OiBcInRpY2stXCIuY29uY2F0KGVudHJ5LmNvb3JkaW5hdGUpXG4gICAgICAgIH0sIGFkYXB0RXZlbnRzT2ZDaGlsZChfdGhpcy5wcm9wcywgZW50cnksIGkpKSwgdGlja0xpbmUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtcG9sYXItYW5nbGUtYXhpcy10aWNrLWxpbmVcIlxuICAgICAgICB9LCB0aWNrTGluZVByb3BzLCBsaW5lQ29vcmQpKSwgdGljayAmJiBQb2xhckFuZ2xlQXhpcy5yZW5kZXJUaWNrSXRlbSh0aWNrLCB0aWNrUHJvcHMsIHRpY2tGb3JtYXR0ZXIgPyB0aWNrRm9ybWF0dGVyKGVudHJ5LnZhbHVlLCBpKSA6IGVudHJ5LnZhbHVlKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge1xuICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtcG9sYXItYW5nbGUtYXhpcy10aWNrc1wiXG4gICAgICB9LCBpdGVtcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdGlja3MgPSBfdGhpcyRwcm9wczQudGlja3MsXG4gICAgICAgIHJhZGl1cyA9IF90aGlzJHByb3BzNC5yYWRpdXMsXG4gICAgICAgIGF4aXNMaW5lID0gX3RoaXMkcHJvcHM0LmF4aXNMaW5lO1xuICAgICAgaWYgKHJhZGl1cyA8PSAwIHx8ICF0aWNrcyB8fCAhdGlja3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtcG9sYXItYW5nbGUtYXhpcycsIHRoaXMucHJvcHMuY2xhc3NOYW1lKVxuICAgICAgfSwgYXhpc0xpbmUgJiYgdGhpcy5yZW5kZXJBeGlzTGluZSgpLCB0aGlzLnJlbmRlclRpY2tzKCkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcInJlbmRlclRpY2tJdGVtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRpY2tJdGVtKG9wdGlvbiwgcHJvcHMsIHZhbHVlKSB7XG4gICAgICB2YXIgdGlja0l0ZW07XG4gICAgICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChvcHRpb24pKSB7XG4gICAgICAgIHRpY2tJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChvcHRpb24sIHByb3BzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihvcHRpb24pKSB7XG4gICAgICAgIHRpY2tJdGVtID0gb3B0aW9uKHByb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpY2tJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXBvbGFyLWFuZ2xlLWF4aXMtdGljay12YWx1ZVwiXG4gICAgICAgIH0pLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGlja0l0ZW07XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KFBvbGFyQW5nbGVBeGlzLCBcImRpc3BsYXlOYW1lXCIsICdQb2xhckFuZ2xlQXhpcycpO1xuX2RlZmluZVByb3BlcnR5KFBvbGFyQW5nbGVBeGlzLCBcImF4aXNUeXBlXCIsICdhbmdsZUF4aXMnKTtcbl9kZWZpbmVQcm9wZXJ0eShQb2xhckFuZ2xlQXhpcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICB0eXBlOiAnY2F0ZWdvcnknLFxuICBhbmdsZUF4aXNJZDogMCxcbiAgc2NhbGU6ICdhdXRvJyxcbiAgY3g6IDAsXG4gIGN5OiAwLFxuICBvcmllbnRhdGlvbjogJ291dGVyJyxcbiAgYXhpc0xpbmU6IHRydWUsXG4gIHRpY2tMaW5lOiB0cnVlLFxuICB0aWNrU2l6ZTogOCxcbiAgdGljazogdHJ1ZSxcbiAgaGlkZTogZmFsc2UsXG4gIGFsbG93RHVwbGljYXRlZENhdGVnb3J5OiB0cnVlXG59KTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1wiY3hcIiwgXCJjeVwiLCBcImFuZ2xlXCIsIFwidGlja3NcIiwgXCJheGlzTGluZVwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcInRpY2tzXCIsIFwidGlja1wiLCBcImFuZ2xlXCIsIFwidGlja0Zvcm1hdHRlclwiLCBcInN0cm9rZVwiXTtcbmZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFRoZSBheGlzIG9mIHBvbGFyIGNvb3JkaW5hdGUgc3lzdGVtXG4gKi9cbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1heEJ5IGZyb20gJ2xvZGFzaC9tYXhCeSc7XG5pbXBvcnQgbWluQnkgZnJvbSAnbG9kYXNoL21pbkJ5JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudC9UZXh0JztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi4vY29tcG9uZW50L0xhYmVsJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IGdldFRpY2tDbGFzc05hbWUsIHBvbGFyVG9DYXJ0ZXNpYW4gfSBmcm9tICcuLi91dGlsL1BvbGFyVXRpbHMnO1xuaW1wb3J0IHsgYWRhcHRFdmVudHNPZkNoaWxkIH0gZnJvbSAnLi4vdXRpbC90eXBlcyc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5leHBvcnQgdmFyIFBvbGFyUmFkaXVzQXhpcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gUG9sYXJSYWRpdXNBeGlzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb2xhclJhZGl1c0F4aXMpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIFBvbGFyUmFkaXVzQXhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfaW5oZXJpdHMoUG9sYXJSYWRpdXNBeGlzLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoUG9sYXJSYWRpdXNBeGlzLCBbe1xuICAgIGtleTogXCJnZXRUaWNrVmFsdWVDb29yZFwiLFxuICAgIHZhbHVlOlxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgY29vcmRpbmF0ZSBvZiB0aWNrXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBjb29yZGluYXRlIFRoZSByYWRpdXMgb2YgdGlja1xuICAgICAqIEByZXR1cm4ge09iamVjdH0gKHgsIHkpXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VGlja1ZhbHVlQ29vcmQoX3JlZikge1xuICAgICAgdmFyIGNvb3JkaW5hdGUgPSBfcmVmLmNvb3JkaW5hdGU7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhbmdsZSA9IF90aGlzJHByb3BzLmFuZ2xlLFxuICAgICAgICBjeCA9IF90aGlzJHByb3BzLmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzLmN5O1xuICAgICAgcmV0dXJuIHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCBjb29yZGluYXRlLCBhbmdsZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRpY2tUZXh0QW5jaG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRpY2tUZXh0QW5jaG9yKCkge1xuICAgICAgdmFyIG9yaWVudGF0aW9uID0gdGhpcy5wcm9wcy5vcmllbnRhdGlvbjtcbiAgICAgIHZhciB0ZXh0QW5jaG9yO1xuICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICB0ZXh0QW5jaG9yID0gJ2VuZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICB0ZXh0QW5jaG9yID0gJ3N0YXJ0JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0ZXh0QW5jaG9yID0gJ21pZGRsZSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGV4dEFuY2hvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Vmlld0JveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWV3Qm94KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGN4ID0gX3RoaXMkcHJvcHMyLmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzMi5jeSxcbiAgICAgICAgYW5nbGUgPSBfdGhpcyRwcm9wczIuYW5nbGUsXG4gICAgICAgIHRpY2tzID0gX3RoaXMkcHJvcHMyLnRpY2tzO1xuICAgICAgdmFyIG1heFJhZGl1c1RpY2sgPSBtYXhCeSh0aWNrcywgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBlbnRyeS5jb29yZGluYXRlIHx8IDA7XG4gICAgICB9KTtcbiAgICAgIHZhciBtaW5SYWRpdXNUaWNrID0gbWluQnkodGlja3MsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gZW50cnkuY29vcmRpbmF0ZSB8fCAwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeDogY3gsXG4gICAgICAgIGN5OiBjeSxcbiAgICAgICAgc3RhcnRBbmdsZTogYW5nbGUsXG4gICAgICAgIGVuZEFuZ2xlOiBhbmdsZSxcbiAgICAgICAgaW5uZXJSYWRpdXM6IG1pblJhZGl1c1RpY2suY29vcmRpbmF0ZSB8fCAwLFxuICAgICAgICBvdXRlclJhZGl1czogbWF4UmFkaXVzVGljay5jb29yZGluYXRlIHx8IDBcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckF4aXNMaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckF4aXNMaW5lKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGN4ID0gX3RoaXMkcHJvcHMzLmN4LFxuICAgICAgICBjeSA9IF90aGlzJHByb3BzMy5jeSxcbiAgICAgICAgYW5nbGUgPSBfdGhpcyRwcm9wczMuYW5nbGUsXG4gICAgICAgIHRpY2tzID0gX3RoaXMkcHJvcHMzLnRpY2tzLFxuICAgICAgICBheGlzTGluZSA9IF90aGlzJHByb3BzMy5heGlzTGluZSxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzMywgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBleHRlbnQgPSB0aWNrcy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbihyZXN1bHRbMF0sIGVudHJ5LmNvb3JkaW5hdGUpLCBNYXRoLm1heChyZXN1bHRbMV0sIGVudHJ5LmNvb3JkaW5hdGUpXTtcbiAgICAgIH0sIFtJbmZpbml0eSwgLUluZmluaXR5XSk7XG4gICAgICB2YXIgcG9pbnQwID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIGV4dGVudFswXSwgYW5nbGUpO1xuICAgICAgdmFyIHBvaW50MSA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCBleHRlbnRbMV0sIGFuZ2xlKTtcbiAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaWx0ZXJQcm9wcyhvdGhlcnMsIGZhbHNlKSksIHt9LCB7XG4gICAgICAgIGZpbGw6ICdub25lJ1xuICAgICAgfSwgZmlsdGVyUHJvcHMoYXhpc0xpbmUsIGZhbHNlKSksIHt9LCB7XG4gICAgICAgIHgxOiBwb2ludDAueCxcbiAgICAgICAgeTE6IHBvaW50MC55LFxuICAgICAgICB4MjogcG9pbnQxLngsXG4gICAgICAgIHkyOiBwb2ludDEueVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXBvbGFyLXJhZGl1cy1heGlzLWxpbmVcIlxuICAgICAgfSwgcHJvcHMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyVGlja3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVGlja3MoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHRpY2tzID0gX3RoaXMkcHJvcHM0LnRpY2tzLFxuICAgICAgICB0aWNrID0gX3RoaXMkcHJvcHM0LnRpY2ssXG4gICAgICAgIGFuZ2xlID0gX3RoaXMkcHJvcHM0LmFuZ2xlLFxuICAgICAgICB0aWNrRm9ybWF0dGVyID0gX3RoaXMkcHJvcHM0LnRpY2tGb3JtYXR0ZXIsXG4gICAgICAgIHN0cm9rZSA9IF90aGlzJHByb3BzNC5zdHJva2UsXG4gICAgICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wczQsIF9leGNsdWRlZDIpO1xuICAgICAgdmFyIHRleHRBbmNob3IgPSB0aGlzLmdldFRpY2tUZXh0QW5jaG9yKCk7XG4gICAgICB2YXIgYXhpc1Byb3BzID0gZmlsdGVyUHJvcHMob3RoZXJzLCBmYWxzZSk7XG4gICAgICB2YXIgY3VzdG9tVGlja1Byb3BzID0gZmlsdGVyUHJvcHModGljaywgZmFsc2UpO1xuICAgICAgdmFyIGl0ZW1zID0gdGlja3MubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgICAgICB2YXIgY29vcmQgPSBfdGhpcy5nZXRUaWNrVmFsdWVDb29yZChlbnRyeSk7XG4gICAgICAgIHZhciB0aWNrUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgICAgICAgIHRyYW5zZm9ybTogXCJyb3RhdGUoXCIuY29uY2F0KDkwIC0gYW5nbGUsIFwiLCBcIikuY29uY2F0KGNvb3JkLngsIFwiLCBcIikuY29uY2F0KGNvb3JkLnksIFwiKVwiKVxuICAgICAgICB9LCBheGlzUHJvcHMpLCB7fSwge1xuICAgICAgICAgIHN0cm9rZTogJ25vbmUnLFxuICAgICAgICAgIGZpbGw6IHN0cm9rZVxuICAgICAgICB9LCBjdXN0b21UaWNrUHJvcHMpLCB7fSwge1xuICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgIH0sIGNvb3JkKSwge30sIHtcbiAgICAgICAgICBwYXlsb2FkOiBlbnRyeVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1wb2xhci1yYWRpdXMtYXhpcy10aWNrJywgZ2V0VGlja0NsYXNzTmFtZSh0aWNrKSksXG4gICAgICAgICAga2V5OiBcInRpY2stXCIuY29uY2F0KGVudHJ5LmNvb3JkaW5hdGUpXG4gICAgICAgIH0sIGFkYXB0RXZlbnRzT2ZDaGlsZChfdGhpcy5wcm9wcywgZW50cnksIGkpKSwgUG9sYXJSYWRpdXNBeGlzLnJlbmRlclRpY2tJdGVtKHRpY2ssIHRpY2tQcm9wcywgdGlja0Zvcm1hdHRlciA/IHRpY2tGb3JtYXR0ZXIoZW50cnkudmFsdWUsIGkpIDogZW50cnkudmFsdWUpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1wb2xhci1yYWRpdXMtYXhpcy10aWNrc1wiXG4gICAgICB9LCBpdGVtcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdGlja3MgPSBfdGhpcyRwcm9wczUudGlja3MsXG4gICAgICAgIGF4aXNMaW5lID0gX3RoaXMkcHJvcHM1LmF4aXNMaW5lLFxuICAgICAgICB0aWNrID0gX3RoaXMkcHJvcHM1LnRpY2s7XG4gICAgICBpZiAoIXRpY2tzIHx8ICF0aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1wb2xhci1yYWRpdXMtYXhpcycsIHRoaXMucHJvcHMuY2xhc3NOYW1lKVxuICAgICAgfSwgYXhpc0xpbmUgJiYgdGhpcy5yZW5kZXJBeGlzTGluZSgpLCB0aWNrICYmIHRoaXMucmVuZGVyVGlja3MoKSwgTGFiZWwucmVuZGVyQ2FsbEJ5UGFyZW50KHRoaXMucHJvcHMsIHRoaXMuZ2V0Vmlld0JveCgpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmVuZGVyVGlja0l0ZW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVGlja0l0ZW0ob3B0aW9uLCBwcm9wcywgdmFsdWUpIHtcbiAgICAgIHZhciB0aWNrSXRlbTtcbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbikpIHtcbiAgICAgICAgdGlja0l0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KG9wdGlvbiwgcHJvcHMpO1xuICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgdGlja0l0ZW0gPSBvcHRpb24ocHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGlja0l0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtcG9sYXItcmFkaXVzLWF4aXMtdGljay12YWx1ZVwiXG4gICAgICAgIH0pLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGlja0l0ZW07XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KFBvbGFyUmFkaXVzQXhpcywgXCJkaXNwbGF5TmFtZVwiLCAnUG9sYXJSYWRpdXNBeGlzJyk7XG5fZGVmaW5lUHJvcGVydHkoUG9sYXJSYWRpdXNBeGlzLCBcImF4aXNUeXBlXCIsICdyYWRpdXNBeGlzJyk7XG5fZGVmaW5lUHJvcGVydHkoUG9sYXJSYWRpdXNBeGlzLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHR5cGU6ICdudW1iZXInLFxuICByYWRpdXNBeGlzSWQ6IDAsXG4gIGN4OiAwLFxuICBjeTogMCxcbiAgYW5nbGU6IDAsXG4gIG9yaWVudGF0aW9uOiAncmlnaHQnLFxuICBzdHJva2U6ICcjY2NjJyxcbiAgYXhpc0xpbmU6IHRydWUsXG4gIHRpY2s6IHRydWUsXG4gIHRpY2tDb3VudDogNSxcbiAgYWxsb3dEYXRhT3ZlcmZsb3c6IGZhbHNlLFxuICBzY2FsZTogJ2F1dG8nLFxuICBhbGxvd0R1cGxpY2F0ZWRDYXRlZ29yeTogdHJ1ZVxufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxudmFyIF9leGNsdWRlZCA9IFtcInhcIiwgXCJ5XCIsIFwidG9wXCIsIFwibGVmdFwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwiY2xhc3NOYW1lXCJdO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBDcm9zc1xuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbnZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQpIHtcbiAgcmV0dXJuIFwiTVwiLmNvbmNhdCh4LCBcIixcIikuY29uY2F0KHRvcCwgXCJ2XCIpLmNvbmNhdChoZWlnaHQsIFwiTVwiKS5jb25jYXQobGVmdCwgXCIsXCIpLmNvbmNhdCh5LCBcImhcIikuY29uY2F0KHdpZHRoKTtcbn07XG5leHBvcnQgdmFyIENyb3NzID0gZnVuY3Rpb24gQ3Jvc3MoX3JlZikge1xuICB2YXIgX3JlZiR4ID0gX3JlZi54LFxuICAgIHggPSBfcmVmJHggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHgsXG4gICAgX3JlZiR5ID0gX3JlZi55LFxuICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksXG4gICAgX3JlZiR0b3AgPSBfcmVmLnRvcCxcbiAgICB0b3AgPSBfcmVmJHRvcCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkdG9wLFxuICAgIF9yZWYkbGVmdCA9IF9yZWYubGVmdCxcbiAgICBsZWZ0ID0gX3JlZiRsZWZ0ID09PSB2b2lkIDAgPyAwIDogX3JlZiRsZWZ0LFxuICAgIF9yZWYkd2lkdGggPSBfcmVmLndpZHRoLFxuICAgIHdpZHRoID0gX3JlZiR3aWR0aCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkd2lkdGgsXG4gICAgX3JlZiRoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICBoZWlnaHQgPSBfcmVmJGhlaWdodCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkaGVpZ2h0LFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZCh7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIHRvcDogdG9wLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0sIHJlc3QpO1xuICBpZiAoIWlzTnVtYmVyKHgpIHx8ICFpc051bWJlcih5KSB8fCAhaXNOdW1iZXIod2lkdGgpIHx8ICFpc051bWJlcihoZWlnaHQpIHx8ICFpc051bWJlcih0b3ApIHx8ICFpc051bWJlcihsZWZ0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHByb3BzLCB0cnVlKSwge1xuICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtY3Jvc3MnLCBjbGFzc05hbWUpLFxuICAgIGQ6IGdldFBhdGgoeCwgeSwgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0KVxuICB9KSk7XG59OyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBDdXJ2ZVxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbGluZSBhcyBzaGFwZUxpbmUsIGFyZWEgYXMgc2hhcGVBcmVhLCBjdXJ2ZUJhc2lzQ2xvc2VkLCBjdXJ2ZUJhc2lzT3BlbiwgY3VydmVCYXNpcywgY3VydmVCdW1wWCwgY3VydmVCdW1wWSwgY3VydmVMaW5lYXJDbG9zZWQsIGN1cnZlTGluZWFyLCBjdXJ2ZU1vbm90b25lWCwgY3VydmVNb25vdG9uZVksIGN1cnZlTmF0dXJhbCwgY3VydmVTdGVwLCBjdXJ2ZVN0ZXBBZnRlciwgY3VydmVTdGVwQmVmb3JlIH0gZnJvbSAndmljdG9yeS12ZW5kb3IvZDMtc2hhcGUnO1xuaW1wb3J0IHVwcGVyRmlyc3QgZnJvbSAnbG9kYXNoL3VwcGVyRmlyc3QnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnbG9kYXNoL2lzRnVuY3Rpb24nO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBhZGFwdEV2ZW50SGFuZGxlcnMgfSBmcm9tICcuLi91dGlsL3R5cGVzJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xudmFyIENVUlZFX0ZBQ1RPUklFUyA9IHtcbiAgY3VydmVCYXNpc0Nsb3NlZDogY3VydmVCYXNpc0Nsb3NlZCxcbiAgY3VydmVCYXNpc09wZW46IGN1cnZlQmFzaXNPcGVuLFxuICBjdXJ2ZUJhc2lzOiBjdXJ2ZUJhc2lzLFxuICBjdXJ2ZUJ1bXBYOiBjdXJ2ZUJ1bXBYLFxuICBjdXJ2ZUJ1bXBZOiBjdXJ2ZUJ1bXBZLFxuICBjdXJ2ZUxpbmVhckNsb3NlZDogY3VydmVMaW5lYXJDbG9zZWQsXG4gIGN1cnZlTGluZWFyOiBjdXJ2ZUxpbmVhcixcbiAgY3VydmVNb25vdG9uZVg6IGN1cnZlTW9ub3RvbmVYLFxuICBjdXJ2ZU1vbm90b25lWTogY3VydmVNb25vdG9uZVksXG4gIGN1cnZlTmF0dXJhbDogY3VydmVOYXR1cmFsLFxuICBjdXJ2ZVN0ZXA6IGN1cnZlU3RlcCxcbiAgY3VydmVTdGVwQWZ0ZXI6IGN1cnZlU3RlcEFmdGVyLFxuICBjdXJ2ZVN0ZXBCZWZvcmU6IGN1cnZlU3RlcEJlZm9yZVxufTtcbnZhciBkZWZpbmVkID0gZnVuY3Rpb24gZGVmaW5lZChwKSB7XG4gIHJldHVybiBwLnggPT09ICtwLnggJiYgcC55ID09PSArcC55O1xufTtcbnZhciBnZXRYID0gZnVuY3Rpb24gZ2V0WChwKSB7XG4gIHJldHVybiBwLng7XG59O1xudmFyIGdldFkgPSBmdW5jdGlvbiBnZXRZKHApIHtcbiAgcmV0dXJuIHAueTtcbn07XG52YXIgZ2V0Q3VydmVGYWN0b3J5ID0gZnVuY3Rpb24gZ2V0Q3VydmVGYWN0b3J5KHR5cGUsIGxheW91dCkge1xuICBpZiAoaXNGdW5jdGlvbih0eXBlKSkge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gIHZhciBuYW1lID0gXCJjdXJ2ZVwiLmNvbmNhdCh1cHBlckZpcnN0KHR5cGUpKTtcbiAgaWYgKChuYW1lID09PSAnY3VydmVNb25vdG9uZScgfHwgbmFtZSA9PT0gJ2N1cnZlQnVtcCcpICYmIGxheW91dCkge1xuICAgIHJldHVybiBDVVJWRV9GQUNUT1JJRVNbXCJcIi5jb25jYXQobmFtZSkuY29uY2F0KGxheW91dCA9PT0gJ3ZlcnRpY2FsJyA/ICdZJyA6ICdYJyldO1xuICB9XG4gIHJldHVybiBDVVJWRV9GQUNUT1JJRVNbbmFtZV0gfHwgY3VydmVMaW5lYXI7XG59O1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHBhdGggb2YgY3VydmUuIFJldHVybnMgbnVsbCBpZiBwb2ludHMgaXMgYW4gZW1wdHkgYXJyYXkuXG4gKiBAcmV0dXJuIHBhdGggb3IgbnVsbFxuICovXG5leHBvcnQgdmFyIGdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKF9yZWYpIHtcbiAgdmFyIF9yZWYkdHlwZSA9IF9yZWYudHlwZSxcbiAgICB0eXBlID0gX3JlZiR0eXBlID09PSB2b2lkIDAgPyAnbGluZWFyJyA6IF9yZWYkdHlwZSxcbiAgICBfcmVmJHBvaW50cyA9IF9yZWYucG9pbnRzLFxuICAgIHBvaW50cyA9IF9yZWYkcG9pbnRzID09PSB2b2lkIDAgPyBbXSA6IF9yZWYkcG9pbnRzLFxuICAgIGJhc2VMaW5lID0gX3JlZi5iYXNlTGluZSxcbiAgICBsYXlvdXQgPSBfcmVmLmxheW91dCxcbiAgICBfcmVmJGNvbm5lY3ROdWxscyA9IF9yZWYuY29ubmVjdE51bGxzLFxuICAgIGNvbm5lY3ROdWxscyA9IF9yZWYkY29ubmVjdE51bGxzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkY29ubmVjdE51bGxzO1xuICB2YXIgY3VydmVGYWN0b3J5ID0gZ2V0Q3VydmVGYWN0b3J5KHR5cGUsIGxheW91dCk7XG4gIHZhciBmb3JtYXRQb2ludHMgPSBjb25uZWN0TnVsbHMgPyBwb2ludHMuZmlsdGVyKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHJldHVybiBkZWZpbmVkKGVudHJ5KTtcbiAgfSkgOiBwb2ludHM7XG4gIHZhciBsaW5lRnVuY3Rpb247XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VMaW5lKSkge1xuICAgIHZhciBmb3JtYXRCYXNlTGluZSA9IGNvbm5lY3ROdWxscyA/IGJhc2VMaW5lLmZpbHRlcihmdW5jdGlvbiAoYmFzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZWQoYmFzZSk7XG4gICAgfSkgOiBiYXNlTGluZTtcbiAgICB2YXIgYXJlYVBvaW50cyA9IGZvcm1hdFBvaW50cy5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50cnkpLCB7fSwge1xuICAgICAgICBiYXNlOiBmb3JtYXRCYXNlTGluZVtpbmRleF1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChsYXlvdXQgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGxpbmVGdW5jdGlvbiA9IHNoYXBlQXJlYSgpLnkoZ2V0WSkueDEoZ2V0WCkueDAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuYmFzZS54O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVGdW5jdGlvbiA9IHNoYXBlQXJlYSgpLngoZ2V0WCkueTEoZ2V0WSkueTAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuYmFzZS55O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxpbmVGdW5jdGlvbi5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlRmFjdG9yeSk7XG4gICAgcmV0dXJuIGxpbmVGdW5jdGlvbihhcmVhUG9pbnRzKTtcbiAgfVxuICBpZiAobGF5b3V0ID09PSAndmVydGljYWwnICYmIGlzTnVtYmVyKGJhc2VMaW5lKSkge1xuICAgIGxpbmVGdW5jdGlvbiA9IHNoYXBlQXJlYSgpLnkoZ2V0WSkueDEoZ2V0WCkueDAoYmFzZUxpbmUpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGJhc2VMaW5lKSkge1xuICAgIGxpbmVGdW5jdGlvbiA9IHNoYXBlQXJlYSgpLngoZ2V0WCkueTEoZ2V0WSkueTAoYmFzZUxpbmUpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVGdW5jdGlvbiA9IHNoYXBlTGluZSgpLngoZ2V0WCkueShnZXRZKTtcbiAgfVxuICBsaW5lRnVuY3Rpb24uZGVmaW5lZChkZWZpbmVkKS5jdXJ2ZShjdXJ2ZUZhY3RvcnkpO1xuICByZXR1cm4gbGluZUZ1bmN0aW9uKGZvcm1hdFBvaW50cyk7XG59O1xuZXhwb3J0IHZhciBDdXJ2ZSA9IGZ1bmN0aW9uIEN1cnZlKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcG9pbnRzID0gcHJvcHMucG9pbnRzLFxuICAgIHBhdGggPSBwcm9wcy5wYXRoLFxuICAgIHBhdGhSZWYgPSBwcm9wcy5wYXRoUmVmO1xuICBpZiAoKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpICYmICFwYXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHJlYWxQYXRoID0gcG9pbnRzICYmIHBvaW50cy5sZW5ndGggPyBnZXRQYXRoKHByb3BzKSA6IHBhdGg7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHByb3BzLCBmYWxzZSksIGFkYXB0RXZlbnRIYW5kbGVycyhwcm9wcyksIHtcbiAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLWN1cnZlJywgY2xhc3NOYW1lKSxcbiAgICBkOiByZWFsUGF0aCxcbiAgICByZWY6IHBhdGhSZWZcbiAgfSkpO1xufTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBEb3RcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgYWRhcHRFdmVudEhhbmRsZXJzIH0gZnJvbSAnLi4vdXRpbC90eXBlcyc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5leHBvcnQgdmFyIERvdCA9IGZ1bmN0aW9uIERvdChwcm9wcykge1xuICB2YXIgY3ggPSBwcm9wcy5jeCxcbiAgICBjeSA9IHByb3BzLmN5LFxuICAgIHIgPSBwcm9wcy5yLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGxheWVyQ2xhc3MgPSBjbHN4KCdyZWNoYXJ0cy1kb3QnLCBjbGFzc05hbWUpO1xuICBpZiAoY3ggPT09ICtjeCAmJiBjeSA9PT0gK2N5ICYmIHIgPT09ICtyKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIF9leHRlbmRzKHt9LCBmaWx0ZXJQcm9wcyhwcm9wcywgZmFsc2UpLCBhZGFwdEV2ZW50SGFuZGxlcnMocHJvcHMpLCB7XG4gICAgICBjbGFzc05hbWU6IGxheWVyQ2xhc3MsXG4gICAgICBjeDogY3gsXG4gICAgICBjeTogY3ksXG4gICAgICByOiByXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1wicG9pbnRzXCIsIFwiY2xhc3NOYW1lXCIsIFwiYmFzZUxpbmVQb2ludHNcIiwgXCJjb25uZWN0TnVsbHNcIl07XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFBvbHlnb25cbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xudmFyIGlzVmFsaWRhdGVQb2ludCA9IGZ1bmN0aW9uIGlzVmFsaWRhdGVQb2ludChwb2ludCkge1xuICByZXR1cm4gcG9pbnQgJiYgcG9pbnQueCA9PT0gK3BvaW50LnggJiYgcG9pbnQueSA9PT0gK3BvaW50Lnk7XG59O1xudmFyIGdldFBhcnNlZFBvaW50cyA9IGZ1bmN0aW9uIGdldFBhcnNlZFBvaW50cygpIHtcbiAgdmFyIHBvaW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gIHZhciBzZWdtZW50UG9pbnRzID0gW1tdXTtcbiAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKGlzVmFsaWRhdGVQb2ludChlbnRyeSkpIHtcbiAgICAgIHNlZ21lbnRQb2ludHNbc2VnbWVudFBvaW50cy5sZW5ndGggLSAxXS5wdXNoKGVudHJ5KTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnRQb2ludHNbc2VnbWVudFBvaW50cy5sZW5ndGggLSAxXS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBhZGQgYW5vdGhlciBwYXRoXG4gICAgICBzZWdtZW50UG9pbnRzLnB1c2goW10pO1xuICAgIH1cbiAgfSk7XG4gIGlmIChpc1ZhbGlkYXRlUG9pbnQocG9pbnRzWzBdKSkge1xuICAgIHNlZ21lbnRQb2ludHNbc2VnbWVudFBvaW50cy5sZW5ndGggLSAxXS5wdXNoKHBvaW50c1swXSk7XG4gIH1cbiAgaWYgKHNlZ21lbnRQb2ludHNbc2VnbWVudFBvaW50cy5sZW5ndGggLSAxXS5sZW5ndGggPD0gMCkge1xuICAgIHNlZ21lbnRQb2ludHMgPSBzZWdtZW50UG9pbnRzLnNsaWNlKDAsIC0xKTtcbiAgfVxuICByZXR1cm4gc2VnbWVudFBvaW50cztcbn07XG52YXIgZ2V0U2luZ2xlUG9seWdvblBhdGggPSBmdW5jdGlvbiBnZXRTaW5nbGVQb2x5Z29uUGF0aChwb2ludHMsIGNvbm5lY3ROdWxscykge1xuICB2YXIgc2VnbWVudFBvaW50cyA9IGdldFBhcnNlZFBvaW50cyhwb2ludHMpO1xuICBpZiAoY29ubmVjdE51bGxzKSB7XG4gICAgc2VnbWVudFBvaW50cyA9IFtzZWdtZW50UG9pbnRzLnJlZHVjZShmdW5jdGlvbiAocmVzLCBzZWdQb2ludHMpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlcyksIF90b0NvbnN1bWFibGVBcnJheShzZWdQb2ludHMpKTtcbiAgICB9LCBbXSldO1xuICB9XG4gIHZhciBwb2x5Z29uUGF0aCA9IHNlZ21lbnRQb2ludHMubWFwKGZ1bmN0aW9uIChzZWdQb2ludHMpIHtcbiAgICByZXR1cm4gc2VnUG9pbnRzLnJlZHVjZShmdW5jdGlvbiAocGF0aCwgcG9pbnQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQocGF0aCkuY29uY2F0KGluZGV4ID09PSAwID8gJ00nIDogJ0wnKS5jb25jYXQocG9pbnQueCwgXCIsXCIpLmNvbmNhdChwb2ludC55KTtcbiAgICB9LCAnJyk7XG4gIH0pLmpvaW4oJycpO1xuICByZXR1cm4gc2VnbWVudFBvaW50cy5sZW5ndGggPT09IDEgPyBcIlwiLmNvbmNhdChwb2x5Z29uUGF0aCwgXCJaXCIpIDogcG9seWdvblBhdGg7XG59O1xudmFyIGdldFJhbmdsZVBhdGggPSBmdW5jdGlvbiBnZXRSYW5nbGVQYXRoKHBvaW50cywgYmFzZUxpbmVQb2ludHMsIGNvbm5lY3ROdWxscykge1xuICB2YXIgb3V0ZXJQYXRoID0gZ2V0U2luZ2xlUG9seWdvblBhdGgocG9pbnRzLCBjb25uZWN0TnVsbHMpO1xuICByZXR1cm4gXCJcIi5jb25jYXQob3V0ZXJQYXRoLnNsaWNlKC0xKSA9PT0gJ1onID8gb3V0ZXJQYXRoLnNsaWNlKDAsIC0xKSA6IG91dGVyUGF0aCwgXCJMXCIpLmNvbmNhdChnZXRTaW5nbGVQb2x5Z29uUGF0aChiYXNlTGluZVBvaW50cy5yZXZlcnNlKCksIGNvbm5lY3ROdWxscykuc2xpY2UoMSkpO1xufTtcbmV4cG9ydCB2YXIgUG9seWdvbiA9IGZ1bmN0aW9uIFBvbHlnb24ocHJvcHMpIHtcbiAgdmFyIHBvaW50cyA9IHByb3BzLnBvaW50cyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgYmFzZUxpbmVQb2ludHMgPSBwcm9wcy5iYXNlTGluZVBvaW50cyxcbiAgICBjb25uZWN0TnVsbHMgPSBwcm9wcy5jb25uZWN0TnVsbHMsXG4gICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICBpZiAoIXBvaW50cyB8fCAhcG9pbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsYXllckNsYXNzID0gY2xzeCgncmVjaGFydHMtcG9seWdvbicsIGNsYXNzTmFtZSk7XG4gIGlmIChiYXNlTGluZVBvaW50cyAmJiBiYXNlTGluZVBvaW50cy5sZW5ndGgpIHtcbiAgICB2YXIgaGFzU3Ryb2tlID0gb3RoZXJzLnN0cm9rZSAmJiBvdGhlcnMuc3Ryb2tlICE9PSAnbm9uZSc7XG4gICAgdmFyIHJhbmdlUGF0aCA9IGdldFJhbmdsZVBhdGgocG9pbnRzLCBiYXNlTGluZVBvaW50cywgY29ubmVjdE51bGxzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogbGF5ZXJDbGFzc1xuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCBfZXh0ZW5kcyh7fSwgZmlsdGVyUHJvcHMob3RoZXJzLCB0cnVlKSwge1xuICAgICAgZmlsbDogcmFuZ2VQYXRoLnNsaWNlKC0xKSA9PT0gJ1onID8gb3RoZXJzLmZpbGwgOiAnbm9uZScsXG4gICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgZDogcmFuZ2VQYXRoXG4gICAgfSkpLCBoYXNTdHJva2UgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKG90aGVycywgdHJ1ZSksIHtcbiAgICAgIGZpbGw6IFwibm9uZVwiLFxuICAgICAgZDogZ2V0U2luZ2xlUG9seWdvblBhdGgocG9pbnRzLCBjb25uZWN0TnVsbHMpXG4gICAgfSkpIDogbnVsbCwgaGFzU3Ryb2tlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIF9leHRlbmRzKHt9LCBmaWx0ZXJQcm9wcyhvdGhlcnMsIHRydWUpLCB7XG4gICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgIGQ6IGdldFNpbmdsZVBvbHlnb25QYXRoKGJhc2VMaW5lUG9pbnRzLCBjb25uZWN0TnVsbHMpXG4gICAgfSkpIDogbnVsbCk7XG4gIH1cbiAgdmFyIHNpbmdsZVBhdGggPSBnZXRTaW5nbGVQb2x5Z29uUGF0aChwb2ludHMsIGNvbm5lY3ROdWxscyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKG90aGVycywgdHJ1ZSksIHtcbiAgICBmaWxsOiBzaW5nbGVQYXRoLnNsaWNlKC0xKSA9PT0gJ1onID8gb3RoZXJzLmZpbGwgOiAnbm9uZScsXG4gICAgY2xhc3NOYW1lOiBsYXllckNsYXNzLFxuICAgIGQ6IHNpbmdsZVBhdGhcbiAgfSkpO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBSZWN0YW5nbGVcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IEFuaW1hdGUgZnJvbSAncmVhY3Qtc21vb3RoJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbnZhciBnZXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gZ2V0UmVjdGFuZ2xlUGF0aCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIG1heFJhZGl1cyA9IE1hdGgubWluKE1hdGguYWJzKHdpZHRoKSAvIDIsIE1hdGguYWJzKGhlaWdodCkgLyAyKTtcbiAgdmFyIHlTaWduID0gaGVpZ2h0ID49IDAgPyAxIDogLTE7XG4gIHZhciB4U2lnbiA9IHdpZHRoID49IDAgPyAxIDogLTE7XG4gIHZhciBjbG9ja1dpc2UgPSBoZWlnaHQgPj0gMCAmJiB3aWR0aCA+PSAwIHx8IGhlaWdodCA8IDAgJiYgd2lkdGggPCAwID8gMSA6IDA7XG4gIHZhciBwYXRoO1xuICBpZiAobWF4UmFkaXVzID4gMCAmJiByYWRpdXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhciBuZXdSYWRpdXMgPSBbMCwgMCwgMCwgMF07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IDQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgbmV3UmFkaXVzW2ldID0gcmFkaXVzW2ldID4gbWF4UmFkaXVzID8gbWF4UmFkaXVzIDogcmFkaXVzW2ldO1xuICAgIH1cbiAgICBwYXRoID0gXCJNXCIuY29uY2F0KHgsIFwiLFwiKS5jb25jYXQoeSArIHlTaWduICogbmV3UmFkaXVzWzBdKTtcbiAgICBpZiAobmV3UmFkaXVzWzBdID4gMCkge1xuICAgICAgcGF0aCArPSBcIkEgXCIuY29uY2F0KG5ld1JhZGl1c1swXSwgXCIsXCIpLmNvbmNhdChuZXdSYWRpdXNbMF0sIFwiLDAsMCxcIikuY29uY2F0KGNsb2NrV2lzZSwgXCIsXCIpLmNvbmNhdCh4ICsgeFNpZ24gKiBuZXdSYWRpdXNbMF0sIFwiLFwiKS5jb25jYXQoeSk7XG4gICAgfVxuICAgIHBhdGggKz0gXCJMIFwiLmNvbmNhdCh4ICsgd2lkdGggLSB4U2lnbiAqIG5ld1JhZGl1c1sxXSwgXCIsXCIpLmNvbmNhdCh5KTtcbiAgICBpZiAobmV3UmFkaXVzWzFdID4gMCkge1xuICAgICAgcGF0aCArPSBcIkEgXCIuY29uY2F0KG5ld1JhZGl1c1sxXSwgXCIsXCIpLmNvbmNhdChuZXdSYWRpdXNbMV0sIFwiLDAsMCxcIikuY29uY2F0KGNsb2NrV2lzZSwgXCIsXFxuICAgICAgICBcIikuY29uY2F0KHggKyB3aWR0aCwgXCIsXCIpLmNvbmNhdCh5ICsgeVNpZ24gKiBuZXdSYWRpdXNbMV0pO1xuICAgIH1cbiAgICBwYXRoICs9IFwiTCBcIi5jb25jYXQoeCArIHdpZHRoLCBcIixcIikuY29uY2F0KHkgKyBoZWlnaHQgLSB5U2lnbiAqIG5ld1JhZGl1c1syXSk7XG4gICAgaWYgKG5ld1JhZGl1c1syXSA+IDApIHtcbiAgICAgIHBhdGggKz0gXCJBIFwiLmNvbmNhdChuZXdSYWRpdXNbMl0sIFwiLFwiKS5jb25jYXQobmV3UmFkaXVzWzJdLCBcIiwwLDAsXCIpLmNvbmNhdChjbG9ja1dpc2UsIFwiLFxcbiAgICAgICAgXCIpLmNvbmNhdCh4ICsgd2lkdGggLSB4U2lnbiAqIG5ld1JhZGl1c1syXSwgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0KTtcbiAgICB9XG4gICAgcGF0aCArPSBcIkwgXCIuY29uY2F0KHggKyB4U2lnbiAqIG5ld1JhZGl1c1szXSwgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0KTtcbiAgICBpZiAobmV3UmFkaXVzWzNdID4gMCkge1xuICAgICAgcGF0aCArPSBcIkEgXCIuY29uY2F0KG5ld1JhZGl1c1szXSwgXCIsXCIpLmNvbmNhdChuZXdSYWRpdXNbM10sIFwiLDAsMCxcIikuY29uY2F0KGNsb2NrV2lzZSwgXCIsXFxuICAgICAgICBcIikuY29uY2F0KHgsIFwiLFwiKS5jb25jYXQoeSArIGhlaWdodCAtIHlTaWduICogbmV3UmFkaXVzWzNdKTtcbiAgICB9XG4gICAgcGF0aCArPSAnWic7XG4gIH0gZWxzZSBpZiAobWF4UmFkaXVzID4gMCAmJiByYWRpdXMgPT09ICtyYWRpdXMgJiYgcmFkaXVzID4gMCkge1xuICAgIHZhciBfbmV3UmFkaXVzID0gTWF0aC5taW4obWF4UmFkaXVzLCByYWRpdXMpO1xuICAgIHBhdGggPSBcIk0gXCIuY29uY2F0KHgsIFwiLFwiKS5jb25jYXQoeSArIHlTaWduICogX25ld1JhZGl1cywgXCJcXG4gICAgICAgICAgICBBIFwiKS5jb25jYXQoX25ld1JhZGl1cywgXCIsXCIpLmNvbmNhdChfbmV3UmFkaXVzLCBcIiwwLDAsXCIpLmNvbmNhdChjbG9ja1dpc2UsIFwiLFwiKS5jb25jYXQoeCArIHhTaWduICogX25ld1JhZGl1cywgXCIsXCIpLmNvbmNhdCh5LCBcIlxcbiAgICAgICAgICAgIEwgXCIpLmNvbmNhdCh4ICsgd2lkdGggLSB4U2lnbiAqIF9uZXdSYWRpdXMsIFwiLFwiKS5jb25jYXQoeSwgXCJcXG4gICAgICAgICAgICBBIFwiKS5jb25jYXQoX25ld1JhZGl1cywgXCIsXCIpLmNvbmNhdChfbmV3UmFkaXVzLCBcIiwwLDAsXCIpLmNvbmNhdChjbG9ja1dpc2UsIFwiLFwiKS5jb25jYXQoeCArIHdpZHRoLCBcIixcIikuY29uY2F0KHkgKyB5U2lnbiAqIF9uZXdSYWRpdXMsIFwiXFxuICAgICAgICAgICAgTCBcIikuY29uY2F0KHggKyB3aWR0aCwgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0IC0geVNpZ24gKiBfbmV3UmFkaXVzLCBcIlxcbiAgICAgICAgICAgIEEgXCIpLmNvbmNhdChfbmV3UmFkaXVzLCBcIixcIikuY29uY2F0KF9uZXdSYWRpdXMsIFwiLDAsMCxcIikuY29uY2F0KGNsb2NrV2lzZSwgXCIsXCIpLmNvbmNhdCh4ICsgd2lkdGggLSB4U2lnbiAqIF9uZXdSYWRpdXMsIFwiLFwiKS5jb25jYXQoeSArIGhlaWdodCwgXCJcXG4gICAgICAgICAgICBMIFwiKS5jb25jYXQoeCArIHhTaWduICogX25ld1JhZGl1cywgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0LCBcIlxcbiAgICAgICAgICAgIEEgXCIpLmNvbmNhdChfbmV3UmFkaXVzLCBcIixcIikuY29uY2F0KF9uZXdSYWRpdXMsIFwiLDAsMCxcIikuY29uY2F0KGNsb2NrV2lzZSwgXCIsXCIpLmNvbmNhdCh4LCBcIixcIikuY29uY2F0KHkgKyBoZWlnaHQgLSB5U2lnbiAqIF9uZXdSYWRpdXMsIFwiIFpcIik7XG4gIH0gZWxzZSB7XG4gICAgcGF0aCA9IFwiTSBcIi5jb25jYXQoeCwgXCIsXCIpLmNvbmNhdCh5LCBcIiBoIFwiKS5jb25jYXQod2lkdGgsIFwiIHYgXCIpLmNvbmNhdChoZWlnaHQsIFwiIGggXCIpLmNvbmNhdCgtd2lkdGgsIFwiIFpcIik7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59O1xuZXhwb3J0IHZhciBpc0luUmVjdGFuZ2xlID0gZnVuY3Rpb24gaXNJblJlY3RhbmdsZShwb2ludCwgcmVjdCkge1xuICBpZiAoIXBvaW50IHx8ICFyZWN0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBweCA9IHBvaW50LngsXG4gICAgcHkgPSBwb2ludC55O1xuICB2YXIgeCA9IHJlY3QueCxcbiAgICB5ID0gcmVjdC55LFxuICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICBoZWlnaHQgPSByZWN0LmhlaWdodDtcbiAgaWYgKE1hdGguYWJzKHdpZHRoKSA+IDAgJiYgTWF0aC5hYnMoaGVpZ2h0KSA+IDApIHtcbiAgICB2YXIgbWluWCA9IE1hdGgubWluKHgsIHggKyB3aWR0aCk7XG4gICAgdmFyIG1heFggPSBNYXRoLm1heCh4LCB4ICsgd2lkdGgpO1xuICAgIHZhciBtaW5ZID0gTWF0aC5taW4oeSwgeSArIGhlaWdodCk7XG4gICAgdmFyIG1heFkgPSBNYXRoLm1heCh5LCB5ICsgaGVpZ2h0KTtcbiAgICByZXR1cm4gcHggPj0gbWluWCAmJiBweCA8PSBtYXhYICYmIHB5ID49IG1pblkgJiYgcHkgPD0gbWF4WTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgeDogMCxcbiAgeTogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgLy8gVGhlIHJhZGl1cyBvZiBib3JkZXJcbiAgLy8gVGhlIHJhZGl1cyBvZiBmb3VyIGNvcm5lcnMgd2hlbiByYWRpdXMgaXMgYSBudW1iZXJcbiAgLy8gVGhlIHJhZGl1cyBvZiBsZWZ0LXRvcCwgcmlnaHQtdG9wLCByaWdodC1ib3R0b20sIGxlZnQtYm90dG9tIHdoZW4gcmFkaXVzIGlzIGFuIGFycmF5XG4gIHJhZGl1czogMCxcbiAgaXNBbmltYXRpb25BY3RpdmU6IGZhbHNlLFxuICBpc1VwZGF0ZUFuaW1hdGlvbkFjdGl2ZTogZmFsc2UsXG4gIGFuaW1hdGlvbkJlZ2luOiAwLFxuICBhbmltYXRpb25EdXJhdGlvbjogMTUwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZSdcbn07XG5leHBvcnQgdmFyIFJlY3RhbmdsZSA9IGZ1bmN0aW9uIFJlY3RhbmdsZShyZWN0YW5nbGVQcm9wcykge1xuICB2YXIgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRQcm9wcyksIHJlY3RhbmdsZVByb3BzKTtcbiAgdmFyIHBhdGhSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKC0xKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0b3RhbExlbmd0aCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0VG90YWxMZW5ndGggPSBfdXNlU3RhdGUyWzFdO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXRoUmVmLmN1cnJlbnQgJiYgcGF0aFJlZi5jdXJyZW50LmdldFRvdGFsTGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcGF0aFRvdGFsTGVuZ3RoID0gcGF0aFJlZi5jdXJyZW50LmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgICAgIGlmIChwYXRoVG90YWxMZW5ndGgpIHtcbiAgICAgICAgICBzZXRUb3RhbExlbmd0aChwYXRoVG90YWxMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgeCA9IHByb3BzLngsXG4gICAgeSA9IHByb3BzLnksXG4gICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgcmFkaXVzID0gcHJvcHMucmFkaXVzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGFuaW1hdGlvbkVhc2luZyA9IHByb3BzLmFuaW1hdGlvbkVhc2luZyxcbiAgICBhbmltYXRpb25EdXJhdGlvbiA9IHByb3BzLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgIGFuaW1hdGlvbkJlZ2luID0gcHJvcHMuYW5pbWF0aW9uQmVnaW4sXG4gICAgaXNBbmltYXRpb25BY3RpdmUgPSBwcm9wcy5pc0FuaW1hdGlvbkFjdGl2ZSxcbiAgICBpc1VwZGF0ZUFuaW1hdGlvbkFjdGl2ZSA9IHByb3BzLmlzVXBkYXRlQW5pbWF0aW9uQWN0aXZlO1xuICBpZiAoeCAhPT0gK3ggfHwgeSAhPT0gK3kgfHwgd2lkdGggIT09ICt3aWR0aCB8fCBoZWlnaHQgIT09ICtoZWlnaHQgfHwgd2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxheWVyQ2xhc3MgPSBjbHN4KCdyZWNoYXJ0cy1yZWN0YW5nbGUnLCBjbGFzc05hbWUpO1xuICBpZiAoIWlzVXBkYXRlQW5pbWF0aW9uQWN0aXZlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCBfZXh0ZW5kcyh7fSwgZmlsdGVyUHJvcHMocHJvcHMsIHRydWUpLCB7XG4gICAgICBjbGFzc05hbWU6IGxheWVyQ2xhc3MsXG4gICAgICBkOiBnZXRSZWN0YW5nbGVQYXRoKHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cylcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFuaW1hdGUsIHtcbiAgICBjYW5CZWdpbjogdG90YWxMZW5ndGggPiAwLFxuICAgIGZyb206IHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9LFxuICAgIHRvOiB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSxcbiAgICBkdXJhdGlvbjogYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgYW5pbWF0aW9uRWFzaW5nOiBhbmltYXRpb25FYXNpbmcsXG4gICAgaXNBY3RpdmU6IGlzVXBkYXRlQW5pbWF0aW9uQWN0aXZlXG4gIH0sIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGN1cnJXaWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBjdXJySGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBjdXJyWCA9IF9yZWYueCxcbiAgICAgIGN1cnJZID0gX3JlZi55O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbmltYXRlLCB7XG4gICAgICBjYW5CZWdpbjogdG90YWxMZW5ndGggPiAwLFxuICAgICAgZnJvbTogXCIwcHggXCIuY29uY2F0KHRvdGFsTGVuZ3RoID09PSAtMSA/IDEgOiB0b3RhbExlbmd0aCwgXCJweFwiKSxcbiAgICAgIHRvOiBcIlwiLmNvbmNhdCh0b3RhbExlbmd0aCwgXCJweCAwcHhcIiksXG4gICAgICBhdHRyaWJ1dGVOYW1lOiBcInN0cm9rZURhc2hhcnJheVwiLFxuICAgICAgYmVnaW46IGFuaW1hdGlvbkJlZ2luLFxuICAgICAgZHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgaXNBY3RpdmU6IGlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgZWFzaW5nOiBhbmltYXRpb25FYXNpbmdcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHByb3BzLCB0cnVlKSwge1xuICAgICAgY2xhc3NOYW1lOiBsYXllckNsYXNzLFxuICAgICAgZDogZ2V0UmVjdGFuZ2xlUGF0aChjdXJyWCwgY3VyclksIGN1cnJXaWR0aCwgY3VyckhlaWdodCwgcmFkaXVzKSxcbiAgICAgIHJlZjogcGF0aFJlZlxuICAgIH0pKSk7XG4gIH0pO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgU2VjdG9yXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IHBvbGFyVG9DYXJ0ZXNpYW4sIFJBRElBTiB9IGZyb20gJy4uL3V0aWwvUG9sYXJVdGlscyc7XG5pbXBvcnQgeyBnZXRQZXJjZW50VmFsdWUsIG1hdGhTaWduIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xudmFyIGdldERlbHRhQW5nbGUgPSBmdW5jdGlvbiBnZXREZWx0YUFuZ2xlKHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSB7XG4gIHZhciBzaWduID0gbWF0aFNpZ24oZW5kQW5nbGUgLSBzdGFydEFuZ2xlKTtcbiAgdmFyIGRlbHRhQW5nbGUgPSBNYXRoLm1pbihNYXRoLmFicyhlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpLCAzNTkuOTk5KTtcbiAgcmV0dXJuIHNpZ24gKiBkZWx0YUFuZ2xlO1xufTtcbnZhciBnZXRUYW5nZW50Q2lyY2xlID0gZnVuY3Rpb24gZ2V0VGFuZ2VudENpcmNsZShfcmVmKSB7XG4gIHZhciBjeCA9IF9yZWYuY3gsXG4gICAgY3kgPSBfcmVmLmN5LFxuICAgIHJhZGl1cyA9IF9yZWYucmFkaXVzLFxuICAgIGFuZ2xlID0gX3JlZi5hbmdsZSxcbiAgICBzaWduID0gX3JlZi5zaWduLFxuICAgIGlzRXh0ZXJuYWwgPSBfcmVmLmlzRXh0ZXJuYWwsXG4gICAgY29ybmVyUmFkaXVzID0gX3JlZi5jb3JuZXJSYWRpdXMsXG4gICAgY29ybmVySXNFeHRlcm5hbCA9IF9yZWYuY29ybmVySXNFeHRlcm5hbDtcbiAgdmFyIGNlbnRlclJhZGl1cyA9IGNvcm5lclJhZGl1cyAqIChpc0V4dGVybmFsID8gMSA6IC0xKSArIHJhZGl1cztcbiAgdmFyIHRoZXRhID0gTWF0aC5hc2luKGNvcm5lclJhZGl1cyAvIGNlbnRlclJhZGl1cykgLyBSQURJQU47XG4gIHZhciBjZW50ZXJBbmdsZSA9IGNvcm5lcklzRXh0ZXJuYWwgPyBhbmdsZSA6IGFuZ2xlICsgc2lnbiAqIHRoZXRhO1xuICB2YXIgY2VudGVyID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIGNlbnRlclJhZGl1cywgY2VudGVyQW5nbGUpO1xuICAvLyBUaGUgY29vcmRpbmF0ZSBvZiBwb2ludCB3aGljaCBpcyB0YW5nZW50IHRvIHRoZSBjaXJjbGVcbiAgdmFyIGNpcmNsZVRhbmdlbmN5ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIHJhZGl1cywgY2VudGVyQW5nbGUpO1xuICAvLyBUaGUgY29vcmRpbmF0ZSBvZiBwb2ludCB3aGljaCBpcyB0YW5nZW50IHRvIHRoZSByYWRpdXMgbGluZVxuICB2YXIgbGluZVRhbmdlbmN5QW5nbGUgPSBjb3JuZXJJc0V4dGVybmFsID8gYW5nbGUgLSBzaWduICogdGhldGEgOiBhbmdsZTtcbiAgdmFyIGxpbmVUYW5nZW5jeSA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCBjZW50ZXJSYWRpdXMgKiBNYXRoLmNvcyh0aGV0YSAqIFJBRElBTiksIGxpbmVUYW5nZW5jeUFuZ2xlKTtcbiAgcmV0dXJuIHtcbiAgICBjZW50ZXI6IGNlbnRlcixcbiAgICBjaXJjbGVUYW5nZW5jeTogY2lyY2xlVGFuZ2VuY3ksXG4gICAgbGluZVRhbmdlbmN5OiBsaW5lVGFuZ2VuY3ksXG4gICAgdGhldGE6IHRoZXRhXG4gIH07XG59O1xudmFyIGdldFNlY3RvclBhdGggPSBmdW5jdGlvbiBnZXRTZWN0b3JQYXRoKF9yZWYyKSB7XG4gIHZhciBjeCA9IF9yZWYyLmN4LFxuICAgIGN5ID0gX3JlZjIuY3ksXG4gICAgaW5uZXJSYWRpdXMgPSBfcmVmMi5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IF9yZWYyLm91dGVyUmFkaXVzLFxuICAgIHN0YXJ0QW5nbGUgPSBfcmVmMi5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gX3JlZjIuZW5kQW5nbGU7XG4gIHZhciBhbmdsZSA9IGdldERlbHRhQW5nbGUoc3RhcnRBbmdsZSwgZW5kQW5nbGUpO1xuXG4gIC8vIFdoZW4gdGhlIGFuZ2xlIG9mIHNlY3RvciBlcXVhbHMgdG8gMzYwLCBzdGFyIHBvaW50IGFuZCBlbmQgcG9pbnQgY29pbmNpZGVcbiAgdmFyIHRlbXBFbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyBhbmdsZTtcbiAgdmFyIG91dGVyU3RhcnRQb2ludCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCBvdXRlclJhZGl1cywgc3RhcnRBbmdsZSk7XG4gIHZhciBvdXRlckVuZFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIG91dGVyUmFkaXVzLCB0ZW1wRW5kQW5nbGUpO1xuICB2YXIgcGF0aCA9IFwiTSBcIi5jb25jYXQob3V0ZXJTdGFydFBvaW50LngsIFwiLFwiKS5jb25jYXQob3V0ZXJTdGFydFBvaW50LnksIFwiXFxuICAgIEEgXCIpLmNvbmNhdChvdXRlclJhZGl1cywgXCIsXCIpLmNvbmNhdChvdXRlclJhZGl1cywgXCIsMCxcXG4gICAgXCIpLmNvbmNhdCgrKE1hdGguYWJzKGFuZ2xlKSA+IDE4MCksIFwiLFwiKS5jb25jYXQoKyhzdGFydEFuZ2xlID4gdGVtcEVuZEFuZ2xlKSwgXCIsXFxuICAgIFwiKS5jb25jYXQob3V0ZXJFbmRQb2ludC54LCBcIixcIikuY29uY2F0KG91dGVyRW5kUG9pbnQueSwgXCJcXG4gIFwiKTtcbiAgaWYgKGlubmVyUmFkaXVzID4gMCkge1xuICAgIHZhciBpbm5lclN0YXJ0UG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgaW5uZXJSYWRpdXMsIHN0YXJ0QW5nbGUpO1xuICAgIHZhciBpbm5lckVuZFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIGlubmVyUmFkaXVzLCB0ZW1wRW5kQW5nbGUpO1xuICAgIHBhdGggKz0gXCJMIFwiLmNvbmNhdChpbm5lckVuZFBvaW50LngsIFwiLFwiKS5jb25jYXQoaW5uZXJFbmRQb2ludC55LCBcIlxcbiAgICAgICAgICAgIEEgXCIpLmNvbmNhdChpbm5lclJhZGl1cywgXCIsXCIpLmNvbmNhdChpbm5lclJhZGl1cywgXCIsMCxcXG4gICAgICAgICAgICBcIikuY29uY2F0KCsoTWF0aC5hYnMoYW5nbGUpID4gMTgwKSwgXCIsXCIpLmNvbmNhdCgrKHN0YXJ0QW5nbGUgPD0gdGVtcEVuZEFuZ2xlKSwgXCIsXFxuICAgICAgICAgICAgXCIpLmNvbmNhdChpbm5lclN0YXJ0UG9pbnQueCwgXCIsXCIpLmNvbmNhdChpbm5lclN0YXJ0UG9pbnQueSwgXCIgWlwiKTtcbiAgfSBlbHNlIHtcbiAgICBwYXRoICs9IFwiTCBcIi5jb25jYXQoY3gsIFwiLFwiKS5jb25jYXQoY3ksIFwiIFpcIik7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59O1xudmFyIGdldFNlY3RvcldpdGhDb3JuZXIgPSBmdW5jdGlvbiBnZXRTZWN0b3JXaXRoQ29ybmVyKF9yZWYzKSB7XG4gIHZhciBjeCA9IF9yZWYzLmN4LFxuICAgIGN5ID0gX3JlZjMuY3ksXG4gICAgaW5uZXJSYWRpdXMgPSBfcmVmMy5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IF9yZWYzLm91dGVyUmFkaXVzLFxuICAgIGNvcm5lclJhZGl1cyA9IF9yZWYzLmNvcm5lclJhZGl1cyxcbiAgICBmb3JjZUNvcm5lclJhZGl1cyA9IF9yZWYzLmZvcmNlQ29ybmVyUmFkaXVzLFxuICAgIGNvcm5lcklzRXh0ZXJuYWwgPSBfcmVmMy5jb3JuZXJJc0V4dGVybmFsLFxuICAgIHN0YXJ0QW5nbGUgPSBfcmVmMy5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gX3JlZjMuZW5kQW5nbGU7XG4gIHZhciBzaWduID0gbWF0aFNpZ24oZW5kQW5nbGUgLSBzdGFydEFuZ2xlKTtcbiAgdmFyIF9nZXRUYW5nZW50Q2lyY2xlID0gZ2V0VGFuZ2VudENpcmNsZSh7XG4gICAgICBjeDogY3gsXG4gICAgICBjeTogY3ksXG4gICAgICByYWRpdXM6IG91dGVyUmFkaXVzLFxuICAgICAgYW5nbGU6IHN0YXJ0QW5nbGUsXG4gICAgICBzaWduOiBzaWduLFxuICAgICAgY29ybmVyUmFkaXVzOiBjb3JuZXJSYWRpdXMsXG4gICAgICBjb3JuZXJJc0V4dGVybmFsOiBjb3JuZXJJc0V4dGVybmFsXG4gICAgfSksXG4gICAgc29jdCA9IF9nZXRUYW5nZW50Q2lyY2xlLmNpcmNsZVRhbmdlbmN5LFxuICAgIHNvbHQgPSBfZ2V0VGFuZ2VudENpcmNsZS5saW5lVGFuZ2VuY3ksXG4gICAgc290ID0gX2dldFRhbmdlbnRDaXJjbGUudGhldGE7XG4gIHZhciBfZ2V0VGFuZ2VudENpcmNsZTIgPSBnZXRUYW5nZW50Q2lyY2xlKHtcbiAgICAgIGN4OiBjeCxcbiAgICAgIGN5OiBjeSxcbiAgICAgIHJhZGl1czogb3V0ZXJSYWRpdXMsXG4gICAgICBhbmdsZTogZW5kQW5nbGUsXG4gICAgICBzaWduOiAtc2lnbixcbiAgICAgIGNvcm5lclJhZGl1czogY29ybmVyUmFkaXVzLFxuICAgICAgY29ybmVySXNFeHRlcm5hbDogY29ybmVySXNFeHRlcm5hbFxuICAgIH0pLFxuICAgIGVvY3QgPSBfZ2V0VGFuZ2VudENpcmNsZTIuY2lyY2xlVGFuZ2VuY3ksXG4gICAgZW9sdCA9IF9nZXRUYW5nZW50Q2lyY2xlMi5saW5lVGFuZ2VuY3ksXG4gICAgZW90ID0gX2dldFRhbmdlbnRDaXJjbGUyLnRoZXRhO1xuICB2YXIgb3V0ZXJBcmNBbmdsZSA9IGNvcm5lcklzRXh0ZXJuYWwgPyBNYXRoLmFicyhzdGFydEFuZ2xlIC0gZW5kQW5nbGUpIDogTWF0aC5hYnMoc3RhcnRBbmdsZSAtIGVuZEFuZ2xlKSAtIHNvdCAtIGVvdDtcbiAgaWYgKG91dGVyQXJjQW5nbGUgPCAwKSB7XG4gICAgaWYgKGZvcmNlQ29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gXCJNIFwiLmNvbmNhdChzb2x0LngsIFwiLFwiKS5jb25jYXQoc29sdC55LCBcIlxcbiAgICAgICAgYVwiKS5jb25jYXQoY29ybmVyUmFkaXVzLCBcIixcIikuY29uY2F0KGNvcm5lclJhZGl1cywgXCIsMCwwLDEsXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMgKiAyLCBcIiwwXFxuICAgICAgICBhXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiLFwiKS5jb25jYXQoY29ybmVyUmFkaXVzLCBcIiwwLDAsMSxcIikuY29uY2F0KC1jb3JuZXJSYWRpdXMgKiAyLCBcIiwwXFxuICAgICAgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0U2VjdG9yUGF0aCh7XG4gICAgICBjeDogY3gsXG4gICAgICBjeTogY3ksXG4gICAgICBpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG4gICAgICBvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG4gICAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGU6IGVuZEFuZ2xlXG4gICAgfSk7XG4gIH1cbiAgdmFyIHBhdGggPSBcIk0gXCIuY29uY2F0KHNvbHQueCwgXCIsXCIpLmNvbmNhdChzb2x0LnksIFwiXFxuICAgIEFcIikuY29uY2F0KGNvcm5lclJhZGl1cywgXCIsXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiLDAsMCxcIikuY29uY2F0KCsoc2lnbiA8IDApLCBcIixcIikuY29uY2F0KHNvY3QueCwgXCIsXCIpLmNvbmNhdChzb2N0LnksIFwiXFxuICAgIEFcIikuY29uY2F0KG91dGVyUmFkaXVzLCBcIixcIikuY29uY2F0KG91dGVyUmFkaXVzLCBcIiwwLFwiKS5jb25jYXQoKyhvdXRlckFyY0FuZ2xlID4gMTgwKSwgXCIsXCIpLmNvbmNhdCgrKHNpZ24gPCAwKSwgXCIsXCIpLmNvbmNhdChlb2N0LngsIFwiLFwiKS5jb25jYXQoZW9jdC55LCBcIlxcbiAgICBBXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiLFwiKS5jb25jYXQoY29ybmVyUmFkaXVzLCBcIiwwLDAsXCIpLmNvbmNhdCgrKHNpZ24gPCAwKSwgXCIsXCIpLmNvbmNhdChlb2x0LngsIFwiLFwiKS5jb25jYXQoZW9sdC55LCBcIlxcbiAgXCIpO1xuICBpZiAoaW5uZXJSYWRpdXMgPiAwKSB7XG4gICAgdmFyIF9nZXRUYW5nZW50Q2lyY2xlMyA9IGdldFRhbmdlbnRDaXJjbGUoe1xuICAgICAgICBjeDogY3gsXG4gICAgICAgIGN5OiBjeSxcbiAgICAgICAgcmFkaXVzOiBpbm5lclJhZGl1cyxcbiAgICAgICAgYW5nbGU6IHN0YXJ0QW5nbGUsXG4gICAgICAgIHNpZ246IHNpZ24sXG4gICAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICAgIGNvcm5lclJhZGl1czogY29ybmVyUmFkaXVzLFxuICAgICAgICBjb3JuZXJJc0V4dGVybmFsOiBjb3JuZXJJc0V4dGVybmFsXG4gICAgICB9KSxcbiAgICAgIHNpY3QgPSBfZ2V0VGFuZ2VudENpcmNsZTMuY2lyY2xlVGFuZ2VuY3ksXG4gICAgICBzaWx0ID0gX2dldFRhbmdlbnRDaXJjbGUzLmxpbmVUYW5nZW5jeSxcbiAgICAgIHNpdCA9IF9nZXRUYW5nZW50Q2lyY2xlMy50aGV0YTtcbiAgICB2YXIgX2dldFRhbmdlbnRDaXJjbGU0ID0gZ2V0VGFuZ2VudENpcmNsZSh7XG4gICAgICAgIGN4OiBjeCxcbiAgICAgICAgY3k6IGN5LFxuICAgICAgICByYWRpdXM6IGlubmVyUmFkaXVzLFxuICAgICAgICBhbmdsZTogZW5kQW5nbGUsXG4gICAgICAgIHNpZ246IC1zaWduLFxuICAgICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgICBjb3JuZXJSYWRpdXM6IGNvcm5lclJhZGl1cyxcbiAgICAgICAgY29ybmVySXNFeHRlcm5hbDogY29ybmVySXNFeHRlcm5hbFxuICAgICAgfSksXG4gICAgICBlaWN0ID0gX2dldFRhbmdlbnRDaXJjbGU0LmNpcmNsZVRhbmdlbmN5LFxuICAgICAgZWlsdCA9IF9nZXRUYW5nZW50Q2lyY2xlNC5saW5lVGFuZ2VuY3ksXG4gICAgICBlaXQgPSBfZ2V0VGFuZ2VudENpcmNsZTQudGhldGE7XG4gICAgdmFyIGlubmVyQXJjQW5nbGUgPSBjb3JuZXJJc0V4dGVybmFsID8gTWF0aC5hYnMoc3RhcnRBbmdsZSAtIGVuZEFuZ2xlKSA6IE1hdGguYWJzKHN0YXJ0QW5nbGUgLSBlbmRBbmdsZSkgLSBzaXQgLSBlaXQ7XG4gICAgaWYgKGlubmVyQXJjQW5nbGUgPCAwICYmIGNvcm5lclJhZGl1cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHBhdGgsIFwiTFwiKS5jb25jYXQoY3gsIFwiLFwiKS5jb25jYXQoY3ksIFwiWlwiKTtcbiAgICB9XG4gICAgcGF0aCArPSBcIkxcIi5jb25jYXQoZWlsdC54LCBcIixcIikuY29uY2F0KGVpbHQueSwgXCJcXG4gICAgICBBXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiLFwiKS5jb25jYXQoY29ybmVyUmFkaXVzLCBcIiwwLDAsXCIpLmNvbmNhdCgrKHNpZ24gPCAwKSwgXCIsXCIpLmNvbmNhdChlaWN0LngsIFwiLFwiKS5jb25jYXQoZWljdC55LCBcIlxcbiAgICAgIEFcIikuY29uY2F0KGlubmVyUmFkaXVzLCBcIixcIikuY29uY2F0KGlubmVyUmFkaXVzLCBcIiwwLFwiKS5jb25jYXQoKyhpbm5lckFyY0FuZ2xlID4gMTgwKSwgXCIsXCIpLmNvbmNhdCgrKHNpZ24gPiAwKSwgXCIsXCIpLmNvbmNhdChzaWN0LngsIFwiLFwiKS5jb25jYXQoc2ljdC55LCBcIlxcbiAgICAgIEFcIikuY29uY2F0KGNvcm5lclJhZGl1cywgXCIsXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiLDAsMCxcIikuY29uY2F0KCsoc2lnbiA8IDApLCBcIixcIikuY29uY2F0KHNpbHQueCwgXCIsXCIpLmNvbmNhdChzaWx0LnksIFwiWlwiKTtcbiAgfSBlbHNlIHtcbiAgICBwYXRoICs9IFwiTFwiLmNvbmNhdChjeCwgXCIsXCIpLmNvbmNhdChjeSwgXCJaXCIpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGN4OiAwLFxuICBjeTogMCxcbiAgaW5uZXJSYWRpdXM6IDAsXG4gIG91dGVyUmFkaXVzOiAwLFxuICBzdGFydEFuZ2xlOiAwLFxuICBlbmRBbmdsZTogMCxcbiAgY29ybmVyUmFkaXVzOiAwLFxuICBmb3JjZUNvcm5lclJhZGl1czogZmFsc2UsXG4gIGNvcm5lcklzRXh0ZXJuYWw6IGZhbHNlXG59O1xuZXhwb3J0IHZhciBTZWN0b3IgPSBmdW5jdGlvbiBTZWN0b3Ioc2VjdG9yUHJvcHMpIHtcbiAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0UHJvcHMpLCBzZWN0b3JQcm9wcyk7XG4gIHZhciBjeCA9IHByb3BzLmN4LFxuICAgIGN5ID0gcHJvcHMuY3ksXG4gICAgaW5uZXJSYWRpdXMgPSBwcm9wcy5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IHByb3BzLm91dGVyUmFkaXVzLFxuICAgIGNvcm5lclJhZGl1cyA9IHByb3BzLmNvcm5lclJhZGl1cyxcbiAgICBmb3JjZUNvcm5lclJhZGl1cyA9IHByb3BzLmZvcmNlQ29ybmVyUmFkaXVzLFxuICAgIGNvcm5lcklzRXh0ZXJuYWwgPSBwcm9wcy5jb3JuZXJJc0V4dGVybmFsLFxuICAgIHN0YXJ0QW5nbGUgPSBwcm9wcy5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gcHJvcHMuZW5kQW5nbGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lO1xuICBpZiAob3V0ZXJSYWRpdXMgPCBpbm5lclJhZGl1cyB8fCBzdGFydEFuZ2xlID09PSBlbmRBbmdsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsYXllckNsYXNzID0gY2xzeCgncmVjaGFydHMtc2VjdG9yJywgY2xhc3NOYW1lKTtcbiAgdmFyIGRlbHRhUmFkaXVzID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcbiAgdmFyIGNyID0gZ2V0UGVyY2VudFZhbHVlKGNvcm5lclJhZGl1cywgZGVsdGFSYWRpdXMsIDAsIHRydWUpO1xuICB2YXIgcGF0aDtcbiAgaWYgKGNyID4gMCAmJiBNYXRoLmFicyhzdGFydEFuZ2xlIC0gZW5kQW5nbGUpIDwgMzYwKSB7XG4gICAgcGF0aCA9IGdldFNlY3RvcldpdGhDb3JuZXIoe1xuICAgICAgY3g6IGN4LFxuICAgICAgY3k6IGN5LFxuICAgICAgaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuICAgICAgY29ybmVyUmFkaXVzOiBNYXRoLm1pbihjciwgZGVsdGFSYWRpdXMgLyAyKSxcbiAgICAgIGZvcmNlQ29ybmVyUmFkaXVzOiBmb3JjZUNvcm5lclJhZGl1cyxcbiAgICAgIGNvcm5lcklzRXh0ZXJuYWw6IGNvcm5lcklzRXh0ZXJuYWwsXG4gICAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGU6IGVuZEFuZ2xlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcGF0aCA9IGdldFNlY3RvclBhdGgoe1xuICAgICAgY3g6IGN4LFxuICAgICAgY3k6IGN5LFxuICAgICAgaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuICAgICAgc3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlOiBlbmRBbmdsZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHByb3BzLCB0cnVlKSwge1xuICAgIGNsYXNzTmFtZTogbGF5ZXJDbGFzcyxcbiAgICBkOiBwYXRoLFxuICAgIHJvbGU6IFwiaW1nXCJcbiAgfSkpO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1widHlwZVwiLCBcInNpemVcIiwgXCJzaXplVHlwZVwiXTtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgQ3VydmVcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1cHBlckZpcnN0IGZyb20gJ2xvZGFzaC91cHBlckZpcnN0JztcbmltcG9ydCB7IHN5bWJvbCBhcyBzaGFwZVN5bWJvbCwgc3ltYm9sQ2lyY2xlLCBzeW1ib2xDcm9zcywgc3ltYm9sRGlhbW9uZCwgc3ltYm9sU3F1YXJlLCBzeW1ib2xTdGFyLCBzeW1ib2xUcmlhbmdsZSwgc3ltYm9sV3llIH0gZnJvbSAndmljdG9yeS12ZW5kb3IvZDMtc2hhcGUnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG52YXIgc3ltYm9sRmFjdG9yaWVzID0ge1xuICBzeW1ib2xDaXJjbGU6IHN5bWJvbENpcmNsZSxcbiAgc3ltYm9sQ3Jvc3M6IHN5bWJvbENyb3NzLFxuICBzeW1ib2xEaWFtb25kOiBzeW1ib2xEaWFtb25kLFxuICBzeW1ib2xTcXVhcmU6IHN5bWJvbFNxdWFyZSxcbiAgc3ltYm9sU3Rhcjogc3ltYm9sU3RhcixcbiAgc3ltYm9sVHJpYW5nbGU6IHN5bWJvbFRyaWFuZ2xlLFxuICBzeW1ib2xXeWU6IHN5bWJvbFd5ZVxufTtcbnZhciBSQURJQU4gPSBNYXRoLlBJIC8gMTgwO1xudmFyIGdldFN5bWJvbEZhY3RvcnkgPSBmdW5jdGlvbiBnZXRTeW1ib2xGYWN0b3J5KHR5cGUpIHtcbiAgdmFyIG5hbWUgPSBcInN5bWJvbFwiLmNvbmNhdCh1cHBlckZpcnN0KHR5cGUpKTtcbiAgcmV0dXJuIHN5bWJvbEZhY3Rvcmllc1tuYW1lXSB8fCBzeW1ib2xDaXJjbGU7XG59O1xudmFyIGNhbGN1bGF0ZUFyZWFTaXplID0gZnVuY3Rpb24gY2FsY3VsYXRlQXJlYVNpemUoc2l6ZSwgc2l6ZVR5cGUsIHR5cGUpIHtcbiAgaWYgKHNpemVUeXBlID09PSAnYXJlYScpIHtcbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdjcm9zcyc6XG4gICAgICByZXR1cm4gNSAqIHNpemUgKiBzaXplIC8gOTtcbiAgICBjYXNlICdkaWFtb25kJzpcbiAgICAgIHJldHVybiAwLjUgKiBzaXplICogc2l6ZSAvIE1hdGguc3FydCgzKTtcbiAgICBjYXNlICdzcXVhcmUnOlxuICAgICAgcmV0dXJuIHNpemUgKiBzaXplO1xuICAgIGNhc2UgJ3N0YXInOlxuICAgICAge1xuICAgICAgICB2YXIgYW5nbGUgPSAxOCAqIFJBRElBTjtcbiAgICAgICAgcmV0dXJuIDEuMjUgKiBzaXplICogc2l6ZSAqIChNYXRoLnRhbihhbmdsZSkgLSBNYXRoLnRhbihhbmdsZSAqIDIpICogTWF0aC5wb3coTWF0aC50YW4oYW5nbGUpLCAyKSk7XG4gICAgICB9XG4gICAgY2FzZSAndHJpYW5nbGUnOlxuICAgICAgcmV0dXJuIE1hdGguc3FydCgzKSAqIHNpemUgKiBzaXplIC8gNDtcbiAgICBjYXNlICd3eWUnOlxuICAgICAgcmV0dXJuICgyMSAtIDEwICogTWF0aC5zcXJ0KDMpKSAqIHNpemUgKiBzaXplIC8gODtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIE1hdGguUEkgKiBzaXplICogc2l6ZSAvIDQ7XG4gIH1cbn07XG52YXIgcmVnaXN0ZXJTeW1ib2wgPSBmdW5jdGlvbiByZWdpc3RlclN5bWJvbChrZXksIGZhY3RvcnkpIHtcbiAgc3ltYm9sRmFjdG9yaWVzW1wic3ltYm9sXCIuY29uY2F0KHVwcGVyRmlyc3Qoa2V5KSldID0gZmFjdG9yeTtcbn07XG5leHBvcnQgdmFyIFN5bWJvbHMgPSBmdW5jdGlvbiBTeW1ib2xzKF9yZWYpIHtcbiAgdmFyIF9yZWYkdHlwZSA9IF9yZWYudHlwZSxcbiAgICB0eXBlID0gX3JlZiR0eXBlID09PSB2b2lkIDAgPyAnY2lyY2xlJyA6IF9yZWYkdHlwZSxcbiAgICBfcmVmJHNpemUgPSBfcmVmLnNpemUsXG4gICAgc2l6ZSA9IF9yZWYkc2l6ZSA9PT0gdm9pZCAwID8gNjQgOiBfcmVmJHNpemUsXG4gICAgX3JlZiRzaXplVHlwZSA9IF9yZWYuc2l6ZVR5cGUsXG4gICAgc2l6ZVR5cGUgPSBfcmVmJHNpemVUeXBlID09PSB2b2lkIDAgPyAnYXJlYScgOiBfcmVmJHNpemVUeXBlLFxuICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXN0KSwge30sIHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIHNpemU6IHNpemUsXG4gICAgc2l6ZVR5cGU6IHNpemVUeXBlXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHBhdGggb2YgY3VydmVcbiAgICogQHJldHVybiB7U3RyaW5nfSBwYXRoXG4gICAqL1xuICB2YXIgZ2V0UGF0aCA9IGZ1bmN0aW9uIGdldFBhdGgoKSB7XG4gICAgdmFyIHN5bWJvbEZhY3RvcnkgPSBnZXRTeW1ib2xGYWN0b3J5KHR5cGUpO1xuICAgIHZhciBzeW1ib2wgPSBzaGFwZVN5bWJvbCgpLnR5cGUoc3ltYm9sRmFjdG9yeSkuc2l6ZShjYWxjdWxhdGVBcmVhU2l6ZShzaXplLCBzaXplVHlwZSwgdHlwZSkpO1xuICAgIHJldHVybiBzeW1ib2woKTtcbiAgfTtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjeCA9IHByb3BzLmN4LFxuICAgIGN5ID0gcHJvcHMuY3k7XG4gIHZhciBmaWx0ZXJlZFByb3BzID0gZmlsdGVyUHJvcHMocHJvcHMsIHRydWUpO1xuICBpZiAoY3ggPT09ICtjeCAmJiBjeSA9PT0gK2N5ICYmIHNpemUgPT09ICtzaXplKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCBfZXh0ZW5kcyh7fSwgZmlsdGVyZWRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1zeW1ib2xzJywgY2xhc3NOYW1lKSxcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGN4LCBcIiwgXCIpLmNvbmNhdChjeSwgXCIpXCIpLFxuICAgICAgZDogZ2V0UGF0aCgpXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblN5bWJvbHMucmVnaXN0ZXJTeW1ib2wgPSByZWdpc3RlclN5bWJvbDsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBSZWN0YW5nbGVcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IEFuaW1hdGUgZnJvbSAncmVhY3Qtc21vb3RoJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbnZhciBnZXRUcmFwZXpvaWRQYXRoID0gZnVuY3Rpb24gZ2V0VHJhcGV6b2lkUGF0aCh4LCB5LCB1cHBlcldpZHRoLCBsb3dlcldpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIHdpZHRoR2FwID0gdXBwZXJXaWR0aCAtIGxvd2VyV2lkdGg7XG4gIHZhciBwYXRoO1xuICBwYXRoID0gXCJNIFwiLmNvbmNhdCh4LCBcIixcIikuY29uY2F0KHkpO1xuICBwYXRoICs9IFwiTCBcIi5jb25jYXQoeCArIHVwcGVyV2lkdGgsIFwiLFwiKS5jb25jYXQoeSk7XG4gIHBhdGggKz0gXCJMIFwiLmNvbmNhdCh4ICsgdXBwZXJXaWR0aCAtIHdpZHRoR2FwIC8gMiwgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0KTtcbiAgcGF0aCArPSBcIkwgXCIuY29uY2F0KHggKyB1cHBlcldpZHRoIC0gd2lkdGhHYXAgLyAyIC0gbG93ZXJXaWR0aCwgXCIsXCIpLmNvbmNhdCh5ICsgaGVpZ2h0KTtcbiAgcGF0aCArPSBcIkwgXCIuY29uY2F0KHgsIFwiLFwiKS5jb25jYXQoeSwgXCIgWlwiKTtcbiAgcmV0dXJuIHBhdGg7XG59O1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgeDogMCxcbiAgeTogMCxcbiAgdXBwZXJXaWR0aDogMCxcbiAgbG93ZXJXaWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBpc1VwZGF0ZUFuaW1hdGlvbkFjdGl2ZTogZmFsc2UsXG4gIGFuaW1hdGlvbkJlZ2luOiAwLFxuICBhbmltYXRpb25EdXJhdGlvbjogMTUwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZSdcbn07XG5leHBvcnQgdmFyIFRyYXBlem9pZCA9IGZ1bmN0aW9uIFRyYXBlem9pZChwcm9wcykge1xuICB2YXIgdHJhcGV6b2lkUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRQcm9wcyksIHByb3BzKTtcbiAgdmFyIHBhdGhSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKC0xKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0b3RhbExlbmd0aCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0VG90YWxMZW5ndGggPSBfdXNlU3RhdGUyWzFdO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXRoUmVmLmN1cnJlbnQgJiYgcGF0aFJlZi5jdXJyZW50LmdldFRvdGFsTGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcGF0aFRvdGFsTGVuZ3RoID0gcGF0aFJlZi5jdXJyZW50LmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgICAgIGlmIChwYXRoVG90YWxMZW5ndGgpIHtcbiAgICAgICAgICBzZXRUb3RhbExlbmd0aChwYXRoVG90YWxMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgeCA9IHRyYXBlem9pZFByb3BzLngsXG4gICAgeSA9IHRyYXBlem9pZFByb3BzLnksXG4gICAgdXBwZXJXaWR0aCA9IHRyYXBlem9pZFByb3BzLnVwcGVyV2lkdGgsXG4gICAgbG93ZXJXaWR0aCA9IHRyYXBlem9pZFByb3BzLmxvd2VyV2lkdGgsXG4gICAgaGVpZ2h0ID0gdHJhcGV6b2lkUHJvcHMuaGVpZ2h0LFxuICAgIGNsYXNzTmFtZSA9IHRyYXBlem9pZFByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGFuaW1hdGlvbkVhc2luZyA9IHRyYXBlem9pZFByb3BzLmFuaW1hdGlvbkVhc2luZyxcbiAgICBhbmltYXRpb25EdXJhdGlvbiA9IHRyYXBlem9pZFByb3BzLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgIGFuaW1hdGlvbkJlZ2luID0gdHJhcGV6b2lkUHJvcHMuYW5pbWF0aW9uQmVnaW4sXG4gICAgaXNVcGRhdGVBbmltYXRpb25BY3RpdmUgPSB0cmFwZXpvaWRQcm9wcy5pc1VwZGF0ZUFuaW1hdGlvbkFjdGl2ZTtcbiAgaWYgKHggIT09ICt4IHx8IHkgIT09ICt5IHx8IHVwcGVyV2lkdGggIT09ICt1cHBlcldpZHRoIHx8IGxvd2VyV2lkdGggIT09ICtsb3dlcldpZHRoIHx8IGhlaWdodCAhPT0gK2hlaWdodCB8fCB1cHBlcldpZHRoID09PSAwICYmIGxvd2VyV2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxheWVyQ2xhc3MgPSBjbHN4KCdyZWNoYXJ0cy10cmFwZXpvaWQnLCBjbGFzc05hbWUpO1xuICBpZiAoIWlzVXBkYXRlQW5pbWF0aW9uQWN0aXZlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHRyYXBlem9pZFByb3BzLCB0cnVlKSwge1xuICAgICAgY2xhc3NOYW1lOiBsYXllckNsYXNzLFxuICAgICAgZDogZ2V0VHJhcGV6b2lkUGF0aCh4LCB5LCB1cHBlcldpZHRoLCBsb3dlcldpZHRoLCBoZWlnaHQpXG4gICAgfSkpKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW5pbWF0ZSwge1xuICAgIGNhbkJlZ2luOiB0b3RhbExlbmd0aCA+IDAsXG4gICAgZnJvbToge1xuICAgICAgdXBwZXJXaWR0aDogMCxcbiAgICAgIGxvd2VyV2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSxcbiAgICB0bzoge1xuICAgICAgdXBwZXJXaWR0aDogdXBwZXJXaWR0aCxcbiAgICAgIGxvd2VyV2lkdGg6IGxvd2VyV2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSxcbiAgICBkdXJhdGlvbjogYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgYW5pbWF0aW9uRWFzaW5nOiBhbmltYXRpb25FYXNpbmcsXG4gICAgaXNBY3RpdmU6IGlzVXBkYXRlQW5pbWF0aW9uQWN0aXZlXG4gIH0sIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGN1cnJVcHBlcldpZHRoID0gX3JlZi51cHBlcldpZHRoLFxuICAgICAgY3Vyckxvd2VyV2lkdGggPSBfcmVmLmxvd2VyV2lkdGgsXG4gICAgICBjdXJySGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBjdXJyWCA9IF9yZWYueCxcbiAgICAgIGN1cnJZID0gX3JlZi55O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbmltYXRlLCB7XG4gICAgICBjYW5CZWdpbjogdG90YWxMZW5ndGggPiAwLFxuICAgICAgZnJvbTogXCIwcHggXCIuY29uY2F0KHRvdGFsTGVuZ3RoID09PSAtMSA/IDEgOiB0b3RhbExlbmd0aCwgXCJweFwiKSxcbiAgICAgIHRvOiBcIlwiLmNvbmNhdCh0b3RhbExlbmd0aCwgXCJweCAwcHhcIiksXG4gICAgICBhdHRyaWJ1dGVOYW1lOiBcInN0cm9rZURhc2hhcnJheVwiLFxuICAgICAgYmVnaW46IGFuaW1hdGlvbkJlZ2luLFxuICAgICAgZHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgZWFzaW5nOiBhbmltYXRpb25FYXNpbmdcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHRyYXBlem9pZFByb3BzLCB0cnVlKSwge1xuICAgICAgY2xhc3NOYW1lOiBsYXllckNsYXNzLFxuICAgICAgZDogZ2V0VHJhcGV6b2lkUGF0aChjdXJyWCwgY3VyclksIGN1cnJVcHBlcldpZHRoLCBjdXJyTG93ZXJXaWR0aCwgY3VyckhlaWdodCksXG4gICAgICByZWY6IHBhdGhSZWZcbiAgICB9KSkpO1xuICB9KTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9