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