UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

309 lines (307 loc) 50.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = RangeSliderFactory; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reactLifecyclesCompat = require("react-lifecycles-compat"); var _reselect = require("reselect"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _rangePlot = _interopRequireDefault(require("./range-plot")); var _slider = _interopRequireDefault(require("./slider/slider")); var _styledComponents2 = require("./styled-components"); var _rangeSliderTimelinePanel = _interopRequireDefault(require("../common/range-slider-timeline-panel")); var _utils = require("@kepler.gl/utils"); var _templateObject, _templateObject2, _templateObject3; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } 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) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var noop = function noop() { return; }; var SliderInput = (0, _styledComponents["default"])(_styledComponents2.Input)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n margin-left: ", "px;\n font-size: ", "; // 10px // 12px;\n padding: ", "; // 4px 6px; // 6px 12px;\n"])), function (props) { return props.theme.sliderInputWidth; }, function (props) { return props.$flush ? 0 : props.$inputSize === 'tiny' ? 12 : 18; }, function (props) { return props.theme.sliderInputFontSize; }, function (props) { return props.theme.sliderInputPadding; }); var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n align-items: ", ";\n"])), function (props) { return !props.$isRanged && props.$showInput ? 'center' : 'flex-start'; }); var RangeInputWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n display: flex;\n justify-content: space-between;\n"]))); var RANGE_SLIDER_TIMELINE_PANEL_STYLE = { marginLeft: '-32px' }; RangeSliderFactory.deps = [_rangePlot["default"], _rangeSliderTimelinePanel["default"]]; function RangeSliderFactory(RangePlot, RangeSliderSubAnimationPanel) { var RangeSlider = /*#__PURE__*/function (_Component) { function RangeSlider() { var _this; (0, _classCallCheck2["default"])(this, RangeSlider); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, RangeSlider, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { value0: 0, value1: 1, prevValue0: 0, prevValue1: 1, width: 288 }); (0, _defineProperty2["default"])(_this, "sliderContainer", null); (0, _defineProperty2["default"])(_this, "setSliderContainer", function (element) { _this.sliderContainer = element; _this._resize(); }); (0, _defineProperty2["default"])(_this, "inputValue0", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "inputValue1", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "value0Selector", function (props) { return props.value0; }); (0, _defineProperty2["default"])(_this, "value1Selector", function (props) { return props.value1; }); (0, _defineProperty2["default"])(_this, "filterValueSelector", (0, _reselect.createSelector)(_this.value0Selector, _this.value1Selector, function (value0, value1) { return [value0, value1]; })); (0, _defineProperty2["default"])(_this, "_roundValToStep", function (val) { var _this$props = _this.props, range = _this$props.range, step = _this$props.step; if (!range || !step) return; return (0, _utils.roundValToStep)(range[0], step, val); }); (0, _defineProperty2["default"])(_this, "_setRangeVal1", function (val) { var _this$props2 = _this.props, value0 = _this$props2.value0, range = _this$props2.range, _this$props2$onChange = _this$props2.onChange, onChange = _this$props2$onChange === void 0 ? noop : _this$props2$onChange; if (!range) return; var val1 = Number(val); onChange([value0, (0, _utils.clamp)([value0, range[1]], _this._roundValToStep(val1))]); return true; }); (0, _defineProperty2["default"])(_this, "_setRangeVal0", function (val) { var _this$props3 = _this.props, value1 = _this$props3.value1, range = _this$props3.range, _this$props3$onChange = _this$props3.onChange, onChange = _this$props3$onChange === void 0 ? noop : _this$props3$onChange; if (!range) return; var val0 = Number(val); onChange([(0, _utils.clamp)([range[0], value1], _this._roundValToStep(val0)), value1]); return true; }); (0, _defineProperty2["default"])(_this, "_resize", function () { if (_this.sliderContainer) { var width = _this.sliderContainer.offsetWidth; if (width !== _this.state.width) { _this.setState({ width: width }); } } }); (0, _defineProperty2["default"])(_this, "_onChangeInput", function (key, e) { _this.setState((0, _defineProperty2["default"])({}, key, e.target.value)); }); return _this; } (0, _inherits2["default"])(RangeSlider, _Component); return (0, _createClass2["default"])(RangeSlider, [{ key: "componentDidMount", value: function componentDidMount() { if (this.sliderContainer instanceof Element) { (0, _utils.observeDimensions)(this.sliderContainer, this._resize, 100); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.sliderContainer instanceof Element) { (0, _utils.unobserveDimensions)(this.sliderContainer); } } }, { key: "_renderInput", value: function _renderInput(key) { var _this2 = this; var setRange = key === 'value0' ? this._setRangeVal0 : this._setRangeVal1; var ref = key === 'value0' ? this.inputValue0 : this.inputValue1; var update = function update(e) { if (!setRange(e.target.value)) { _this2.setState((0, _defineProperty2["default"])({}, key, _this2.state[key])); } }; var onChange = this._onChangeInput.bind(this, key); return /*#__PURE__*/_react["default"].createElement(SliderInput, { className: "kg-range-slider__input", type: "number", ref: ref, id: "slider-input-".concat(key), key: key, value: this.state[key], onChange: onChange, onKeyPress: function onKeyPress(e) { if (e.key === 'Enter') { update(e); ref.current.blur(); } }, onBlur: update, $flush: key === 'value0', $inputSize: this.props.inputSize, secondary: this.props.inputTheme === 'secondary' }); } // eslint-disable-next-line complexity }, { key: "render", value: function render() { var _this$props4 = this.props, isRanged = _this$props4.isRanged, showInput = _this$props4.showInput, bins = _this$props4.bins, lineChart = _this$props4.lineChart, plotType = _this$props4.plotType, invertTrendColor = _this$props4.invertTrendColor, range = _this$props4.range, _this$props4$onChange = _this$props4.onChange, onChange = _this$props4$onChange === void 0 ? noop : _this$props4$onChange, sliderHandleWidth = _this$props4.sliderHandleWidth, step = _this$props4.step, timezone = _this$props4.timezone, timeFormat = _this$props4.timeFormat, playbackControlWidth = _this$props4.playbackControlWidth, setFilterPlot = _this$props4.setFilterPlot, animationWindow = _this$props4.animationWindow, subAnimations = _this$props4.subAnimations, filter = _this$props4.filter, datasets = _this$props4.datasets; var width = this.state.width; var plotWidth = Math.max(width - Number(sliderHandleWidth), 0); var hasPlot = plotType === null || plotType === void 0 ? void 0 : plotType.type; var value = this.props.plotValue || this.filterValueSelector(this.props); var scaledValue = subAnimations !== null && subAnimations !== void 0 && subAnimations.length && range ? (0, _utils.scaleSourceDomainToDestination)(value, range) : [0, 0]; var commonPadding = "".concat(Number(sliderHandleWidth) / 2, "px"); return /*#__PURE__*/_react["default"].createElement("div", { className: "kg-range-slider", style: { width: '100%', padding: "0 ".concat(commonPadding) }, ref: this.setSliderContainer }, Array.isArray(range) && range.every(Number.isFinite) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, hasPlot ? /*#__PURE__*/_react["default"].createElement(RangePlot, { bins: bins, lineChart: lineChart, plotType: plotType, invertTrendColor: invertTrendColor, isEnlarged: this.props.isEnlarged, onBrush: function onBrush(val0, val1) { return onChange([val0, val1]); }, marks: this.props.marks, animationWindow: animationWindow, filter: filter, datasets: datasets, range: range, value: value, width: plotWidth, isRanged: isRanged, step: step, timezone: timezone, timeFormat: timeFormat, playbackControlWidth: playbackControlWidth, setFilterPlot: setFilterPlot, style: { paddingLeft: commonPadding } }) : null, subAnimations !== null && subAnimations !== void 0 && subAnimations.length ? /*#__PURE__*/_react["default"].createElement(RangeSliderSubAnimationPanel, { subAnimations: subAnimations, scaledValue: scaledValue, style: RANGE_SLIDER_TIMELINE_PANEL_STYLE }) : null, /*#__PURE__*/_react["default"].createElement(SliderWrapper, { className: "kg-range-slider__slider", $isRanged: isRanged, $showInput: showInput }, this.props.xAxis ? /*#__PURE__*/_react["default"].createElement("div", { style: { height: '30px' } }, /*#__PURE__*/_react["default"].createElement(this.props.xAxis, { width: plotWidth, timezone: timezone, domain: range, isEnlarged: this.props.isEnlarged })) : null, /*#__PURE__*/_react["default"].createElement(_slider["default"], { marks: this.props.marks, isRanged: isRanged, minValue: range[0], maxValue: range[1], value0: this.props.value0, value1: this.props.value1, step: step, sliderHandleWidth: sliderHandleWidth, onSlider0Change: this._setRangeVal0, onSlider1Change: this._setRangeVal1, onSliderBarChange: function onSliderBarChange(val0, val1) { onChange([val0, val1]); }, enableBarDrag: true }), !isRanged && showInput ? this._renderInput('value1') : null), isRanged && showInput ? /*#__PURE__*/_react["default"].createElement(RangeInputWrapper, { className: "range-slider__input-group" }, this._renderInput('value0'), this._renderInput('value1')) : null)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { var update = null; var value0 = props.value0, value1 = props.value1; if (props.value0 !== state.prevValue0 && !isNaN(value0)) { update = _objectSpread(_objectSpread({}, update || {}), {}, { value0: value0, prevValue0: value0 }); } if (props.value1 !== state.prevValue1 && !isNaN(value1)) { update = _objectSpread(_objectSpread({}, update || {}), {}, { value1: value1, prevValue1: value1 }); } return update; } }]); }(_react.Component); (0, _defineProperty2["default"])(RangeSlider, "defaultProps", { isEnlarged: false, isRanged: true, showInput: true, sliderHandleWidth: 12, inputTheme: '', inputSize: 'small', onChange: noop }); (0, _reactLifecyclesCompat.polyfill)(RangeSlider); return RangeSlider; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RMaWZlY3ljbGVzQ29tcGF0IiwiX3Jlc2VsZWN0IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JhbmdlUGxvdCIsIl9zbGlkZXIiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfcmFuZ2VTbGlkZXJUaW1lbGluZVBhbmVsIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm5vb3AiLCJTbGlkZXJJbnB1dCIsInN0eWxlZCIsIklucHV0IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwic2xpZGVySW5wdXRXaWR0aCIsIiRmbHVzaCIsIiRpbnB1dFNpemUiLCJzbGlkZXJJbnB1dEZvbnRTaXplIiwic2xpZGVySW5wdXRQYWRkaW5nIiwiU2xpZGVyV3JhcHBlciIsImRpdiIsIiRpc1JhbmdlZCIsIiRzaG93SW5wdXQiLCJSYW5nZUlucHV0V3JhcHBlciIsIlJBTkdFX1NMSURFUl9USU1FTElORV9QQU5FTF9TVFlMRSIsIm1hcmdpbkxlZnQiLCJSYW5nZVNsaWRlckZhY3RvcnkiLCJkZXBzIiwiUmFuZ2VQbG90RmFjdG9yeSIsIlJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWxGYWN0b3J5IiwiUmFuZ2VQbG90IiwiUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbCIsIlJhbmdlU2xpZGVyIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwidmFsdWUwIiwidmFsdWUxIiwicHJldlZhbHVlMCIsInByZXZWYWx1ZTEiLCJ3aWR0aCIsImVsZW1lbnQiLCJzbGlkZXJDb250YWluZXIiLCJfcmVzaXplIiwiY3JlYXRlUmVmIiwiY3JlYXRlU2VsZWN0b3IiLCJ2YWx1ZTBTZWxlY3RvciIsInZhbHVlMVNlbGVjdG9yIiwidmFsIiwiX3RoaXMkcHJvcHMiLCJyYW5nZSIsInN0ZXAiLCJyb3VuZFZhbFRvU3RlcCIsIl90aGlzJHByb3BzMiIsIl90aGlzJHByb3BzMiRvbkNoYW5nZSIsIm9uQ2hhbmdlIiwidmFsMSIsIk51bWJlciIsImNsYW1wIiwiX3JvdW5kVmFsVG9TdGVwIiwiX3RoaXMkcHJvcHMzIiwiX3RoaXMkcHJvcHMzJG9uQ2hhbmdlIiwidmFsMCIsIm9mZnNldFdpZHRoIiwic3RhdGUiLCJzZXRTdGF0ZSIsImtleSIsInRhcmdldCIsInZhbHVlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJjb21wb25lbnREaWRNb3VudCIsIkVsZW1lbnQiLCJvYnNlcnZlRGltZW5zaW9ucyIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5vYnNlcnZlRGltZW5zaW9ucyIsIl9yZW5kZXJJbnB1dCIsIl90aGlzMiIsInNldFJhbmdlIiwiX3NldFJhbmdlVmFsMCIsIl9zZXRSYW5nZVZhbDEiLCJyZWYiLCJpbnB1dFZhbHVlMCIsImlucHV0VmFsdWUxIiwidXBkYXRlIiwiX29uQ2hhbmdlSW5wdXQiLCJiaW5kIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInR5cGUiLCJpZCIsIm9uS2V5UHJlc3MiLCJjdXJyZW50IiwiYmx1ciIsIm9uQmx1ciIsImlucHV0U2l6ZSIsInNlY29uZGFyeSIsImlucHV0VGhlbWUiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczQiLCJpc1JhbmdlZCIsInNob3dJbnB1dCIsImJpbnMiLCJsaW5lQ2hhcnQiLCJwbG90VHlwZSIsImludmVydFRyZW5kQ29sb3IiLCJfdGhpcyRwcm9wczQkb25DaGFuZ2UiLCJzbGlkZXJIYW5kbGVXaWR0aCIsInRpbWV6b25lIiwidGltZUZvcm1hdCIsInBsYXliYWNrQ29udHJvbFdpZHRoIiwic2V0RmlsdGVyUGxvdCIsImFuaW1hdGlvbldpbmRvdyIsInN1YkFuaW1hdGlvbnMiLCJkYXRhc2V0cyIsInBsb3RXaWR0aCIsIk1hdGgiLCJtYXgiLCJoYXNQbG90IiwicGxvdFZhbHVlIiwiZmlsdGVyVmFsdWVTZWxlY3RvciIsInNjYWxlZFZhbHVlIiwic2NhbGVTb3VyY2VEb21haW5Ub0Rlc3RpbmF0aW9uIiwiY29tbW9uUGFkZGluZyIsInN0eWxlIiwicGFkZGluZyIsInNldFNsaWRlckNvbnRhaW5lciIsImlzQXJyYXkiLCJldmVyeSIsImlzRmluaXRlIiwiRnJhZ21lbnQiLCJpc0VubGFyZ2VkIiwib25CcnVzaCIsIm1hcmtzIiwicGFkZGluZ0xlZnQiLCJ4QXhpcyIsImhlaWdodCIsImRvbWFpbiIsIm1pblZhbHVlIiwibWF4VmFsdWUiLCJvblNsaWRlcjBDaGFuZ2UiLCJvblNsaWRlcjFDaGFuZ2UiLCJvblNsaWRlckJhckNoYW5nZSIsImVuYWJsZUJhckRyYWciLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJpc05hTiIsIkNvbXBvbmVudCIsInBvbHlmaWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9yYW5nZS1zbGlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgQ29tcG9uZW50VHlwZSwgY3JlYXRlUmVmLCBFbGVtZW50VHlwZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtwb2x5ZmlsbH0gZnJvbSAncmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUmFuZ2VQbG90RmFjdG9yeSBmcm9tICcuL3JhbmdlLXBsb3QnO1xuaW1wb3J0IFNsaWRlciBmcm9tICcuL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHtJbnB1dH0gZnJvbSAnLi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3RvcnkgZnJvbSAnLi4vY29tbW9uL3JhbmdlLXNsaWRlci10aW1lbGluZS1wYW5lbCc7XG5pbXBvcnQge1xuICBvYnNlcnZlRGltZW5zaW9ucyxcbiAgdW5vYnNlcnZlRGltZW5zaW9ucyxcbiAgcm91bmRWYWxUb1N0ZXAsXG4gIGNsYW1wLFxuICBzY2FsZVNvdXJjZURvbWFpblRvRGVzdGluYXRpb25cbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge0xpbmVDaGFydCwgRmlsdGVyLCBCaW5zfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25IYW5kbGVyLCBzZXRGaWx0ZXJQbG90fSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5pbnRlcmZhY2UgU2xpZGVySW5wdXRQcm9wcyB7XG4gICRmbHVzaD86IGJvb2xlYW47XG4gICRpbnB1dFNpemU/OiBzdHJpbmc7XG59XG5jb25zdCBub29wID0gKCkgPT4ge1xuICByZXR1cm47XG59O1xuY29uc3QgU2xpZGVySW5wdXQgPSBzdHlsZWQoSW5wdXQpPFNsaWRlcklucHV0UHJvcHM+YFxuICB3aWR0aDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJJbnB1dFdpZHRofXB4O1xuICBtYXJnaW4tbGVmdDogJHtwcm9wcyA9PiAocHJvcHMuJGZsdXNoID8gMCA6IHByb3BzLiRpbnB1dFNpemUgPT09ICd0aW55JyA/IDEyIDogMTgpfXB4O1xuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRGb250U2l6ZX07IC8vIDEwcHggLy8gMTJweDtcbiAgcGFkZGluZzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJJbnB1dFBhZGRpbmd9OyAvLyA0cHggNnB4OyAvLyA2cHggMTJweDtcbmA7XG5cbmludGVyZmFjZSBTbGlkZXJXcmFwcGVyUHJvcHMge1xuICAkaXNSYW5nZWQ/OiBib29sZWFuO1xuICAkc2hvd0lucHV0PzogYm9vbGVhbjtcbn1cblxuY29uc3QgU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXY8U2xpZGVyV3JhcHBlclByb3BzPmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbGlnbi1pdGVtczogJHtwcm9wcyA9PiAoIXByb3BzLiRpc1JhbmdlZCAmJiBwcm9wcy4kc2hvd0lucHV0ID8gJ2NlbnRlcicgOiAnZmxleC1zdGFydCcpfTtcbmA7XG5cbmNvbnN0IFJhbmdlSW5wdXRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLXRvcDogMTJweDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuYDtcblxuaW50ZXJmYWNlIFJhbmdlU2xpZGVyUHJvcHMge1xuICByYW5nZT86IG51bWJlcltdO1xuICB2YWx1ZTA6IG51bWJlcjtcbiAgdmFsdWUxOiBudW1iZXI7XG4gIG9uQ2hhbmdlPzogKHZhbDogbnVtYmVyW10sIGU/OiBFdmVudCB8IG51bGwpID0+IHZvaWQ7IC8vIFRPRE9cbiAgc2V0RmlsdGVyUGxvdD86IEFjdGlvbkhhbmRsZXI8dHlwZW9mIHNldEZpbHRlclBsb3Q+O1xuICBiaW5zPzogQmlucztcbiAgaXNSYW5nZWQ/OiBib29sZWFuO1xuICBpc0VubGFyZ2VkPzogYm9vbGVhbjtcbiAgc2hvd0lucHV0PzogYm9vbGVhbjtcbiAgaW5wdXRUaGVtZT86IHN0cmluZztcbiAgaW5wdXRTaXplPzogc3RyaW5nO1xuICBzdGVwPzogbnVtYmVyO1xuICBzbGlkZXJIYW5kbGVXaWR0aD86IG51bWJlcjtcbiAgeEF4aXM/OiBFbGVtZW50VHlwZTtcbiAgc3ViQW5pbWF0aW9ucz86IGFueVtdO1xuICB0aW1lbGluZUxhYmVsPzogc3RyaW5nO1xuXG4gIHRpbWV6b25lPzogc3RyaW5nIHwgbnVsbDtcbiAgdGltZUZvcm1hdD86IHN0cmluZztcbiAgcGxheWJhY2tDb250cm9sV2lkdGg/OiBudW1iZXI7XG4gIGxpbmVDaGFydD86IExpbmVDaGFydDtcbiAgbWFya3M/OiBudW1iZXJbXTtcbiAgcGxvdFR5cGU/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xuICBwbG90VmFsdWU/OiBudW1iZXJbXTtcblxuICBhbmltYXRpb25XaW5kb3c/OiBzdHJpbmc7XG4gIGZpbHRlcj86IEZpbHRlcjtcbiAgZGF0YXNldHM/OiBEYXRhc2V0cztcblxuICBpbnZlcnRUcmVuZENvbG9yPzogYm9vbGVhbjtcbn1cblxuY29uc3QgUkFOR0VfU0xJREVSX1RJTUVMSU5FX1BBTkVMX1NUWUxFID0ge21hcmdpbkxlZnQ6ICctMzJweCd9O1xuXG5SYW5nZVNsaWRlckZhY3RvcnkuZGVwcyA9IFtSYW5nZVBsb3RGYWN0b3J5LCBSYW5nZVNsaWRlclN1YkFuaW1hdGlvblBhbmVsRmFjdG9yeV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFJhbmdlU2xpZGVyRmFjdG9yeShcbiAgUmFuZ2VQbG90OiBSZXR1cm5UeXBlPHR5cGVvZiBSYW5nZVBsb3RGYWN0b3J5PixcbiAgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbDogUmV0dXJuVHlwZTx0eXBlb2YgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3Rvcnk+XG4pOiBDb21wb25lbnRUeXBlPFJhbmdlU2xpZGVyUHJvcHM+IHtcbiAgY2xhc3MgUmFuZ2VTbGlkZXIgZXh0ZW5kcyBDb21wb25lbnQ8UmFuZ2VTbGlkZXJQcm9wcz4ge1xuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICBpc0VubGFyZ2VkOiBmYWxzZSxcbiAgICAgIGlzUmFuZ2VkOiB0cnVlLFxuICAgICAgc2hvd0lucHV0OiB0cnVlLFxuICAgICAgc2xpZGVySGFuZGxlV2lkdGg6IDEyLFxuICAgICAgaW5wdXRUaGVtZTogJycsXG4gICAgICBpbnB1dFNpemU6ICdzbWFsbCcsXG4gICAgICBvbkNoYW5nZTogbm9vcFxuICAgIH07XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgICAgbGV0IHVwZGF0ZToge3ZhbHVlMT86IGFueTsgcHJldlZhbHVlMT86IGFueTsgdmFsdWUwPzogYW55OyBwcmV2VmFsdWUwPzogYW55fSB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3Qge3ZhbHVlMCwgdmFsdWUxfSA9IHByb3BzO1xuICAgICAgaWYgKHByb3BzLnZhbHVlMCAhPT0gc3RhdGUucHJldlZhbHVlMCAmJiAhaXNOYU4odmFsdWUwKSkge1xuICAgICAgICB1cGRhdGUgPSB7Li4uKHVwZGF0ZSB8fCB7fSksIHZhbHVlMCwgcHJldlZhbHVlMDogdmFsdWUwfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy52YWx1ZTEgIT09IHN0YXRlLnByZXZWYWx1ZTEgJiYgIWlzTmFOKHZhbHVlMSkpIHtcbiAgICAgICAgdXBkYXRlID0gey4uLih1cGRhdGUgfHwge30pLCB2YWx1ZTEsIHByZXZWYWx1ZTE6IHZhbHVlMX07XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlO1xuICAgIH1cblxuICAgIHN0YXRlID0ge1xuICAgICAgdmFsdWUwOiAwLFxuICAgICAgdmFsdWUxOiAxLFxuICAgICAgcHJldlZhbHVlMDogMCxcbiAgICAgIHByZXZWYWx1ZTE6IDEsXG4gICAgICB3aWR0aDogMjg4XG4gICAgfTtcblxuICAgIHNsaWRlckNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuc2xpZGVyQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlRGltZW5zaW9ucyh0aGlzLnNsaWRlckNvbnRhaW5lciwgdGhpcy5fcmVzaXplLCAxMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuc2xpZGVyQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICB1bm9ic2VydmVEaW1lbnNpb25zKHRoaXMuc2xpZGVyQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTbGlkZXJDb250YWluZXI6IFJlYWN0LkxlZ2FjeVJlZjxIVE1MRGl2RWxlbWVudD4gPSBlbGVtZW50ID0+IHtcbiAgICAgIHRoaXMuc2xpZGVyQ29udGFpbmVyID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX3Jlc2l6ZSgpO1xuICAgIH07XG4gICAgaW5wdXRWYWx1ZTAgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICBpbnB1dFZhbHVlMSA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuICAgIHZhbHVlMFNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMudmFsdWUwO1xuICAgIHZhbHVlMVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMudmFsdWUxO1xuICAgIGZpbHRlclZhbHVlU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMudmFsdWUwU2VsZWN0b3IsXG4gICAgICB0aGlzLnZhbHVlMVNlbGVjdG9yLFxuICAgICAgKHZhbHVlMCwgdmFsdWUxKSA9PiBbdmFsdWUwLCB2YWx1ZTFdXG4gICAgKTtcblxuICAgIF9yb3VuZFZhbFRvU3RlcCA9IHZhbCA9PiB7XG4gICAgICBjb25zdCB7cmFuZ2UsIHN0ZXB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghcmFuZ2UgfHwgIXN0ZXApIHJldHVybjtcbiAgICAgIHJldHVybiByb3VuZFZhbFRvU3RlcChyYW5nZVswXSwgc3RlcCwgdmFsKTtcbiAgICB9O1xuXG4gICAgX3NldFJhbmdlVmFsMSA9IHZhbCA9PiB7XG4gICAgICBjb25zdCB7dmFsdWUwLCByYW5nZSwgb25DaGFuZ2UgPSBub29wfSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAoIXJhbmdlKSByZXR1cm47XG4gICAgICBjb25zdCB2YWwxID0gTnVtYmVyKHZhbCk7XG4gICAgICBvbkNoYW5nZShbdmFsdWUwLCBjbGFtcChbdmFsdWUwLCByYW5nZVsxXV0sIHRoaXMuX3JvdW5kVmFsVG9TdGVwKHZhbDEpKV0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIF9zZXRSYW5nZVZhbDAgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlMSwgcmFuZ2UsIG9uQ2hhbmdlID0gbm9vcH0gPSB0aGlzLnByb3BzO1xuICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsMCA9IE51bWJlcih2YWwpO1xuICAgICAgb25DaGFuZ2UoW2NsYW1wKFtyYW5nZVswXSwgdmFsdWUxXSwgdGhpcy5fcm91bmRWYWxUb1N0ZXAodmFsMCkpLCB2YWx1ZTFdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfcmVzaXplID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2xpZGVyQ29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5zbGlkZXJDb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy5zdGF0ZS53aWR0aCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3dpZHRofSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX29uQ2hhbmdlSW5wdXQgPSAoa2V5LCBlKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtba2V5XTogZS50YXJnZXQudmFsdWV9KTtcbiAgICB9O1xuXG4gICAgX3JlbmRlcklucHV0KGtleSkge1xuICAgICAgY29uc3Qgc2V0UmFuZ2UgPSBrZXkgPT09ICd2YWx1ZTAnID8gdGhpcy5fc2V0UmFuZ2VWYWwwIDogdGhpcy5fc2V0UmFuZ2VWYWwxO1xuICAgICAgY29uc3QgcmVmID0ga2V5ID09PSAndmFsdWUwJyA/IHRoaXMuaW5wdXRWYWx1ZTAgOiB0aGlzLmlucHV0VmFsdWUxO1xuICAgICAgY29uc3QgdXBkYXRlID0gZSA9PiB7XG4gICAgICAgIGlmICghc2V0UmFuZ2UoZS50YXJnZXQudmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7W2tleV06IHRoaXMuc3RhdGVba2V5XX0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlSW5wdXQuYmluZCh0aGlzLCBrZXkpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U2xpZGVySW5wdXRcbiAgICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2lucHV0XCJcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICBpZD17YHNsaWRlci1pbnB1dC0ke2tleX1gfVxuICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlW2tleV19XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgIG9uS2V5UHJlc3M9e2UgPT4ge1xuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZShlKTtcbiAgICAgICAgICAgICAgKHJlZi5jdXJyZW50IGFzIGFueSkuYmx1cigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25CbHVyPXt1cGRhdGV9XG4gICAgICAgICAgJGZsdXNoPXtrZXkgPT09ICd2YWx1ZTAnfVxuICAgICAgICAgICRpbnB1dFNpemU9e3RoaXMucHJvcHMuaW5wdXRTaXplfVxuICAgICAgICAgIHNlY29uZGFyeT17dGhpcy5wcm9wcy5pbnB1dFRoZW1lID09PSAnc2Vjb25kYXJ5J31cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzUmFuZ2VkLFxuICAgICAgICBzaG93SW5wdXQsXG4gICAgICAgIGJpbnMsXG4gICAgICAgIGxpbmVDaGFydCxcbiAgICAgICAgcGxvdFR5cGUsXG4gICAgICAgIGludmVydFRyZW5kQ29sb3IsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBvbkNoYW5nZSA9IG5vb3AsXG4gICAgICAgIHNsaWRlckhhbmRsZVdpZHRoLFxuICAgICAgICBzdGVwLFxuICAgICAgICB0aW1lem9uZSxcbiAgICAgICAgdGltZUZvcm1hdCxcbiAgICAgICAgcGxheWJhY2tDb250cm9sV2lkdGgsXG4gICAgICAgIHNldEZpbHRlclBsb3QsXG4gICAgICAgIGFuaW1hdGlvbldpbmRvdyxcbiAgICAgICAgc3ViQW5pbWF0aW9uczogc3ViQW5pbWF0aW9ucyxcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICBkYXRhc2V0c1xuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGNvbnN0IHt3aWR0aH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3QgcGxvdFdpZHRoID0gTWF0aC5tYXgod2lkdGggLSBOdW1iZXIoc2xpZGVySGFuZGxlV2lkdGgpLCAwKTtcbiAgICAgIGNvbnN0IGhhc1Bsb3QgPSBwbG90VHlwZT8udHlwZTtcblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnByb3BzLnBsb3RWYWx1ZSB8fCB0aGlzLmZpbHRlclZhbHVlU2VsZWN0b3IodGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBzY2FsZWRWYWx1ZSA9XG4gICAgICAgIHN1YkFuaW1hdGlvbnM/Lmxlbmd0aCAmJiByYW5nZVxuICAgICAgICAgID8gc2NhbGVTb3VyY2VEb21haW5Ub0Rlc3RpbmF0aW9uKHZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl0sIHJhbmdlIGFzIFtudW1iZXIsIG51bWJlcl0pXG4gICAgICAgICAgOiBbMCwgMF07XG4gICAgICBjb25zdCBjb21tb25QYWRkaW5nID0gYCR7TnVtYmVyKHNsaWRlckhhbmRsZVdpZHRoKSAvIDJ9cHhgO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlclwiXG4gICAgICAgICAgc3R5bGU9e3t3aWR0aDogJzEwMCUnLCBwYWRkaW5nOiBgMCAke2NvbW1vblBhZGRpbmd9YH19XG4gICAgICAgICAgcmVmPXt0aGlzLnNldFNsaWRlckNvbnRhaW5lcn1cbiAgICAgICAgPlxuICAgICAgICAgIHtBcnJheS5pc0FycmF5KHJhbmdlKSAmJiByYW5nZS5ldmVyeShOdW1iZXIuaXNGaW5pdGUpICYmIChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHtoYXNQbG90ID8gKFxuICAgICAgICAgICAgICAgIDxSYW5nZVBsb3RcbiAgICAgICAgICAgICAgICAgIGJpbnM9e2JpbnN9XG4gICAgICAgICAgICAgICAgICBsaW5lQ2hhcnQ9e2xpbmVDaGFydH1cbiAgICAgICAgICAgICAgICAgIHBsb3RUeXBlPXtwbG90VHlwZX1cbiAgICAgICAgICAgICAgICAgIGludmVydFRyZW5kQ29sb3I9e2ludmVydFRyZW5kQ29sb3J9XG4gICAgICAgICAgICAgICAgICBpc0VubGFyZ2VkPXt0aGlzLnByb3BzLmlzRW5sYXJnZWR9XG4gICAgICAgICAgICAgICAgICBvbkJydXNoPXsodmFsMCwgdmFsMSkgPT4gb25DaGFuZ2UoW3ZhbDAsIHZhbDFdKX1cbiAgICAgICAgICAgICAgICAgIG1hcmtzPXt0aGlzLnByb3BzLm1hcmtzfVxuICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uV2luZG93PXthbmltYXRpb25XaW5kb3d9XG4gICAgICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgIHJhbmdlPXtyYW5nZX1cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgIHdpZHRoPXtwbG90V2lkdGh9XG4gICAgICAgICAgICAgICAgICBpc1JhbmdlZD17aXNSYW5nZWR9XG4gICAgICAgICAgICAgICAgICBzdGVwPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgdGltZXpvbmU9e3RpbWV6b25lfVxuICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdD17dGltZUZvcm1hdH1cbiAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbFdpZHRoPXtwbGF5YmFja0NvbnRyb2xXaWR0aH1cbiAgICAgICAgICAgICAgICAgIHNldEZpbHRlclBsb3Q9e3NldEZpbHRlclBsb3R9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e3BhZGRpbmdMZWZ0OiBjb21tb25QYWRkaW5nfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAge3N1YkFuaW1hdGlvbnM/Lmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbFxuICAgICAgICAgICAgICAgICAgc3ViQW5pbWF0aW9ucz17c3ViQW5pbWF0aW9uc31cbiAgICAgICAgICAgICAgICAgIHNjYWxlZFZhbHVlPXtzY2FsZWRWYWx1ZX1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXtSQU5HRV9TTElERVJfVElNRUxJTkVfUEFORUxfU1RZTEV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDxTbGlkZXJXcmFwcGVyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19zbGlkZXJcIlxuICAgICAgICAgICAgICAgICRpc1JhbmdlZD17aXNSYW5nZWR9XG4gICAgICAgICAgICAgICAgJHNob3dJbnB1dD17c2hvd0lucHV0fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMueEF4aXMgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7aGVpZ2h0OiAnMzBweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPHRoaXMucHJvcHMueEF4aXNcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD17cGxvdFdpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXt0aW1lem9uZX1cbiAgICAgICAgICAgICAgICAgICAgICBkb21haW49e3JhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIGlzRW5sYXJnZWQ9e3RoaXMucHJvcHMuaXNFbmxhcmdlZH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDxTbGlkZXJcbiAgICAgICAgICAgICAgICAgIG1hcmtzPXt0aGlzLnByb3BzLm1hcmtzfVxuICAgICAgICAgICAgICAgICAgaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICAgICAgICAgICAgbWluVmFsdWU9e3JhbmdlWzBdfVxuICAgICAgICAgICAgICAgICAgbWF4VmFsdWU9e3JhbmdlWzFdfVxuICAgICAgICAgICAgICAgICAgdmFsdWUwPXt0aGlzLnByb3BzLnZhbHVlMH1cbiAgICAgICAgICAgICAgICAgIHZhbHVlMT17dGhpcy5wcm9wcy52YWx1ZTF9XG4gICAgICAgICAgICAgICAgICBzdGVwPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgc2xpZGVySGFuZGxlV2lkdGg9e3NsaWRlckhhbmRsZVdpZHRofVxuICAgICAgICAgICAgICAgICAgb25TbGlkZXIwQ2hhbmdlPXt0aGlzLl9zZXRSYW5nZVZhbDB9XG4gICAgICAgICAgICAgICAgICBvblNsaWRlcjFDaGFuZ2U9e3RoaXMuX3NldFJhbmdlVmFsMX1cbiAgICAgICAgICAgICAgICAgIG9uU2xpZGVyQmFyQ2hhbmdlPXsodmFsMCwgdmFsMSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShbdmFsMCwgdmFsMV0pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGVuYWJsZUJhckRyYWdcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHshaXNSYW5nZWQgJiYgc2hvd0lucHV0ID8gdGhpcy5fcmVuZGVySW5wdXQoJ3ZhbHVlMScpIDogbnVsbH1cbiAgICAgICAgICAgICAgPC9TbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgICB7aXNSYW5nZWQgJiYgc2hvd0lucHV0ID8gKFxuICAgICAgICAgICAgICAgIDxSYW5nZUlucHV0V3JhcHBlciBjbGFzc05hbWU9XCJyYW5nZS1zbGlkZXJfX2lucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICB7dGhpcy5fcmVuZGVySW5wdXQoJ3ZhbHVlMCcpfVxuICAgICAgICAgICAgICAgICAge3RoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTEnKX1cbiAgICAgICAgICAgICAgICA8L1JhbmdlSW5wdXRXcmFwcGVyPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwb2x5ZmlsbChSYW5nZVNsaWRlcik7XG5cbiAgcmV0dXJuIFJhbmdlU2xpZGVyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxzQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSx5QkFBQSxHQUFBSixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBTTBCLElBQUFVLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFqQjFCO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWYsd0JBQUFlLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEs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