UNPKG

kepler.gl.geoiq

Version:

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

319 lines (272 loc) 38.3 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"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _propTypes = _interopRequireDefault(require("prop-types")); var _layerConfigurator = _interopRequireDefault(require("./layer-configurator")); var _layerPanelHeader = _interopRequireDefault(require("./layer-panel-header")); var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project")); var _lodash = _interopRequireDefault(require("lodash")); var _layer = _interopRequireDefault(require("react-map-gl/dist/es5/components/layer")); var _styles = require("../../../styles"); var _actions = require("../../../actions"); var _templateObject; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var PanelWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n border-radius: 1px;\n margin-bottom: 8px;\n z-index: 1000;\n\n &.dragging {\n cursor: move;\n }\n"]))); LayerPanelFactory.deps = [_layerConfigurator["default"]]; function LayerPanelFactory(LayerConfigurator) { var LayerPanel = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(LayerPanel, _Component); var _super = _createSuper(LayerPanel); function LayerPanel() { var _this; (0, _classCallCheck2["default"])(this, LayerPanel); for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) { _args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(_args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerConfig", function (newProp) { _this.props.layerConfigChange(_this.props.layer, newProp); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerType", function (newType) { _this.props.layerTypeChange(_this.props.layer, newType); // this.props.layerConfigChange(this.props.layer, {apiCallRequest: true}); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerVisConfig", function (newVisConfig) { _this.props.layerVisConfigChange(_this.props.layer, newVisConfig); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerColorUI", function () { var _this$props; for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } (_this$props = _this.props).layerColorUIChange.apply(_this$props, [_this.props.layer].concat(args)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerTextLabel", function () { var _this$props2; for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } (_this$props2 = _this.props).layerTextLabelChange.apply(_this$props2, [_this.props.layer].concat(args)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerVisualChannelConfig", function (newConfig, channel, scaleKey) { _this.props.layerVisualChannelConfigChange(_this.props.layer, newConfig, channel, scaleKey); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateLayerLabel", function (_ref) { var value = _ref.target.value; _this.updateLayerConfig({ label: value }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleVisibility", function (e) { e.stopPropagation(); var isVisible = !_this.props.layer.config.isVisible; _this.updateLayerConfig({ isVisible: isVisible }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleEnableConfig", function (e) { e.stopPropagation(); var isConfigActive = _this.props.layer.config.isConfigActive; _this.updateLayerConfig({ isConfigActive: !isConfigActive }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeLayer", function (e) { e.stopPropagation(); _this.props.removeLayer(_this.props.idx); }); // filterLayerOptions = ['grid', 'hexagon', 'boundary']; (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterLargeDataOptions", ['backendPoint', 'backendGeojson', 'geoHash', 'dynamic']); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSmallDataOptions", ['backendPoint', 'backendGeojson']); return _this; } (0, _createClass2["default"])(LayerPanel, [{ key: "componentWillReceiveProps", value: // inDebounce = 0; // componentWillReceiveProps(nextProps) { // const {config} = nextProps.layer; // const {columns, boundaryAggregation, apiCallRequest} = config; // if ( // nextProps.layer.type === 'dynamic' || // nextProps.layer.type === 'geoHash' || // nextProps.layer.type === 'point' // ) { // if ( // !_.isEqual(this.props.mapState, nextProps.mapState) // // && // // nextProps.layers // // nextProps.widget.config.bounds // ) { // nextProps.layerConfigChange(nextProps.layer, { // apiCallRequest: true // }); // } // } // if ( // nextProps.layer && // config && // apiCallRequest === true // // columns[Object.keys(columns)[0]].fieldIdx !== -1 // ) { // nextProps.layerConfigChange(nextProps.layer, { // apiCallRequest: false, // apiCallLoader: true // }); // clearTimeout(this.inDebounce); // this.inDebounce = setTimeout(() => { // const result = nextProps.layer.axiosApiCall( // nextProps.datasets, // this.getViewport(nextProps.mapState), // nextProps.mapState.zoom, // nextProps.filters // ); // result.then(function(result) { // nextProps.layerConfigChange(nextProps.layer, { // apiCallLoader: false // }); // nextProps.updateLayerData(nextProps.layer, result); // }); // clearTimeout(this.inDebounce); // this.inDebounce = 0; // }, 300); // } // } // getViewport(mapState) { // const { // longitude, // latitude, // height, // width, // zoom, // pitch, // bearing // } = mapState; // // let boundingBox = geoViewport.bounds([longitude, latitude], zoom, [ // // width, // // height // // ]); // const viewport = new WebMercatorViewport({ // width: width, // height: height, // longitude: longitude, // latitude: latitude, // zoom: zoom, // pitch: pitch, // bearing: bearing // }); // let cUL = viewport.unproject([0, 0]); // let cUR = viewport.unproject([width, 0]); // let cLR = viewport.unproject([width, height]); // let cLL = viewport.unproject([0, height]); // let latRange = [...new Set([cLL[1], cUR[1], cLR[1], cUL[1]])].sort( // (a, b) => a - b // ); // let lngRange = [...new Set([cLL[0], cUR[0], cLR[0], cUL[0]])].sort( // (a, b) => a - b // ); // return [lngRange[0], lngRange[1], latRange[0], latRange[1]]; // } function componentWillReceiveProps(nextProps) { if (this.props.layer.config.dataId && nextProps.layer.config.dataId && this.props.layer.config.dataId !== nextProps.layer.config.dataId) { if (_layer["default"].name !== 'boundary' && _layer["default"].name !== 'pincode') { this.props.layerConfigChange(nextProps.layer, { apiCallRequest: true }); } } } }, { key: "render", value: function render() { var _this2 = this; var _this$props3 = this.props, layer = _this$props3.layer, idx = _this$props3.idx, datasets = _this$props3.datasets, updateLayerData = _this$props3.updateLayerData; var layerTypeOptions = this.props.layerTypeOptions; var largeData = datasets[layer.config.dataId] && layer.config.dataId ? datasets[layer.config.dataId].isLargeCategory : undefined; layerTypeOptions = largeData && largeData === true ? layerTypeOptions.filter(function (lto) { return _this2.filterLargeDataOptions.indexOf(lto.id) >= 0; }) : layerTypeOptions.filter(function (lto) { return _this2.filterSmallDataOptions.indexOf(lto.id) === -1; }); var config = layer.config; var isConfigActive = config.isConfigActive, apiCallLoader = config.apiCallLoader; return (/*#__PURE__*/_react["default"].createElement(PanelWrapper, { active: isConfigActive, className: "layer-panel ".concat(this.props.className), style: this.props.style, onMouseDown: this.props.onMouseDown, onTouchStart: this.props.onTouchStart }, /*#__PURE__*/_react["default"].createElement(_layerPanelHeader["default"], { isConfigActive: isConfigActive, apiCallLoader: apiCallLoader, id: layer.id, showLoader: layer.showLoader, idx: idx, isVisible: config.isVisible, label: config.label, labelRCGColorValues: datasets[config.dataId].color, layerType: layer.name, onToggleEnableConfig: this._toggleEnableConfig, onToggleVisibility: this._toggleVisibility, onUpdateLayerLabel: this._updateLayerLabel, onRemoveLayer: this._removeLayer }), isConfigActive && /*#__PURE__*/_react["default"].createElement(LayerConfigurator, { layer: layer, datasets: datasets, updateLayerData: updateLayerData, layerTypeOptions: layerTypeOptions, openModal: this.props.openModal, updateLayerColorUI: this.updateLayerColorUI, updateLayerConfig: this.updateLayerConfig, updateLayerVisualChannelConfig: this.updateLayerVisualChannelConfig, updateLayerType: this.updateLayerType, updateLayerTextLabel: this.updateLayerTextLabel, updateLayerVisConfig: this.updateLayerVisConfig })) ); } }]); return LayerPanel; }(_react.Component); (0, _defineProperty2["default"])(LayerPanel, "propTypes", { layer: _propTypes["default"].object.isRequired, datasets: _propTypes["default"].object.isRequired, idx: _propTypes["default"].number.isRequired, layerConfigChange: _propTypes["default"].func.isRequired, layerTypeChange: _propTypes["default"].func.isRequired, openModal: _propTypes["default"].func.isRequired, removeLayer: _propTypes["default"].func.isRequired, updateLayerData: _propTypes["default"].func.isRequired, axiosAPICAll: _propTypes["default"].func.isRequired, onCloseConfig: _propTypes["default"].func, layerTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any), layerVisConfigChange: _propTypes["default"].func.isRequired, layerVisualChannelConfigChange: _propTypes["default"].func.isRequired, layerColorUIChange: _propTypes["default"].func.isRequired, updateAnimationTime: _propTypes["default"].func, updateLayerAnimationSpeed: _propTypes["default"].func }); return LayerPanel; } var _default = exports["default"] = LayerPanelFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvbGF5ZXItcGFuZWwuanMiXSwibmFtZXMiOlsiUGFuZWxXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJDb25maWd1cmF0b3JGYWN0b3J5IiwiTGF5ZXJDb25maWd1cmF0b3IiLCJMYXllclBhbmVsIiwibmV3UHJvcCIsInByb3BzIiwibGF5ZXJDb25maWdDaGFuZ2UiLCJsYXllciIsIm5ld1R5cGUiLCJsYXllclR5cGVDaGFuZ2UiLCJuZXdWaXNDb25maWciLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsImFyZ3MiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllclRleHRMYWJlbENoYW5nZSIsIm5ld0NvbmZpZyIsImNoYW5uZWwiLCJzY2FsZUtleSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsInZhbHVlIiwidGFyZ2V0IiwidXBkYXRlTGF5ZXJDb25maWciLCJsYWJlbCIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJpc1Zpc2libGUiLCJjb25maWciLCJpc0NvbmZpZ0FjdGl2ZSIsInJlbW92ZUxheWVyIiwiaWR4IiwibmV4dFByb3BzIiwiZGF0YUlkIiwibmFtZSIsImFwaUNhbGxSZXF1ZXN0IiwiZGF0YXNldHMiLCJ1cGRhdGVMYXllckRhdGEiLCJsYXllclR5cGVPcHRpb25zIiwibGFyZ2VEYXRhIiwiaXNMYXJnZUNhdGVnb3J5IiwidW5kZWZpbmVkIiwiZmlsdGVyIiwibHRvIiwiZmlsdGVyTGFyZ2VEYXRhT3B0aW9ucyIsImluZGV4T2YiLCJpZCIsImZpbHRlclNtYWxsRGF0YU9wdGlvbnMiLCJhcGlDYWxsTG9hZGVyIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJvbk1vdXNlRG93biIsIm9uVG91Y2hTdGFydCIsInNob3dMb2FkZXIiLCJjb2xvciIsIl90b2dnbGVFbmFibGVDb25maWciLCJfdG9nZ2xlVmlzaWJpbGl0eSIsIl91cGRhdGVMYXllckxhYmVsIiwiX3JlbW92ZUxheWVyIiwib3Blbk1vZGFsIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnIiwidXBkYXRlTGF5ZXJUeXBlIiwidXBkYXRlTGF5ZXJUZXh0TGFiZWwiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJmdW5jIiwiYXhpb3NBUElDQWxsIiwib25DbG9zZUNvbmZpZyIsImFycmF5T2YiLCJhbnkiLCJ1cGRhdGVBbmltYXRpb25UaW1lIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxZQUFZLEdBQUdDLDZCQUFPQyxHQUFWLHNOQUFsQjs7QUFXQUMsaUJBQWlCLENBQUNDLElBQWxCLEdBQXlCLENBQUNDLDZCQUFELENBQXpCOztBQUVBLFNBQVNGLGlCQUFULENBQTJCRyxpQkFBM0IsRUFBOEM7QUFBQSxNQUN0Q0MsVUFEc0M7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDRHQTZIdEIsVUFBQUMsT0FBTyxFQUFJO0FBQzdCLGNBQUtDLEtBQUwsQ0FBV0MsaUJBQVgsQ0FBNkIsTUFBS0QsS0FBTCxDQUFXRSxLQUF4QyxFQUErQ0gsT0FBL0M7QUFDRCxPQS9IeUM7QUFBQSwwR0FpSXhCLFVBQUFJLE9BQU8sRUFBSTtBQUMzQixjQUFLSCxLQUFMLENBQVdJLGVBQVgsQ0FBMkIsTUFBS0osS0FBTCxDQUFXRSxLQUF0QyxFQUE2Q0MsT0FBN0MsRUFEMkIsQ0FFM0I7O0FBQ0QsT0FwSXlDO0FBQUEsK0dBc0luQixVQUFBRSxZQUFZLEVBQUk7QUFDckMsY0FBS0wsS0FBTCxDQUFXTSxvQkFBWCxDQUFnQyxNQUFLTixLQUFMLENBQVdFLEtBQTNDLEVBQWtERyxZQUFsRDtBQUNELE9BeEl5QztBQUFBLDZHQTBJckIsWUFBYTtBQUFBOztBQUFBLDJDQUFURSxJQUFTO0FBQVRBLFVBQUFBLElBQVM7QUFBQTs7QUFDaEMsNkJBQUtQLEtBQUwsRUFBV1Esa0JBQVgscUJBQThCLE1BQUtSLEtBQUwsQ0FBV0UsS0FBekMsU0FBbURLLElBQW5EO0FBQ0QsT0E1SXlDO0FBQUEsK0dBOEluQixZQUFhO0FBQUE7O0FBQUEsMkNBQVRBLElBQVM7QUFBVEEsVUFBQUEsSUFBUztBQUFBOztBQUNsQyw4QkFBS1AsS0FBTCxFQUFXUyxvQkFBWCxzQkFBZ0MsTUFBS1QsS0FBTCxDQUFXRSxLQUEzQyxTQUFxREssSUFBckQ7QUFDRCxPQWhKeUM7QUFBQSx5SEFrSlQsVUFBQ0csU0FBRCxFQUFZQyxPQUFaLEVBQXFCQyxRQUFyQixFQUFrQztBQUNqRSxjQUFLWixLQUFMLENBQVdhLDhCQUFYLENBQ0UsTUFBS2IsS0FBTCxDQUFXRSxLQURiLEVBRUVRLFNBRkYsRUFHRUMsT0FIRixFQUlFQyxRQUpGO0FBTUQsT0F6SnlDO0FBQUEsNEdBMkp0QixnQkFBdUI7QUFBQSxZQUFaRSxLQUFZLFFBQXJCQyxNQUFxQixDQUFaRCxLQUFZOztBQUN6QyxjQUFLRSxpQkFBTCxDQUF1QjtBQUFDQyxVQUFBQSxLQUFLLEVBQUVIO0FBQVIsU0FBdkI7QUFDRCxPQTdKeUM7QUFBQSw0R0ErSnRCLFVBQUFJLENBQUMsRUFBSTtBQUN2QkEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBQ0EsWUFBTUMsU0FBUyxHQUFHLENBQUMsTUFBS3BCLEtBQUwsQ0FBV0UsS0FBWCxDQUFpQm1CLE1BQWpCLENBQXdCRCxTQUEzQzs7QUFDQSxjQUFLSixpQkFBTCxDQUF1QjtBQUFDSSxVQUFBQSxTQUFTLEVBQVRBO0FBQUQsU0FBdkI7QUFDRCxPQW5LeUM7QUFBQSw4R0FxS3BCLFVBQUFGLENBQUMsRUFBSTtBQUN6QkEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBQ0EsWUFFYUcsY0FGYixHQUlJLE1BQUt0QixLQUpULENBQ0VFLEtBREYsQ0FFSW1CLE1BRkosQ0FFYUMsY0FGYjs7QUFLQSxjQUFLTixpQkFBTCxDQUF1QjtBQUFDTSxVQUFBQSxjQUFjLEVBQUUsQ0FBQ0E7QUFBbEIsU0FBdkI7QUFDRCxPQTdLeUM7QUFBQSx1R0ErSzNCLFVBQUFKLENBQUMsRUFBSTtBQUNsQkEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGOztBQUNBLGNBQUtuQixLQUFMLENBQVd1QixXQUFYLENBQXVCLE1BQUt2QixLQUFMLENBQVd3QixHQUFsQztBQUNELE9BbEx5QztBQW9MMUM7QUFwTDBDLGlIQXFMakIsQ0FDdkIsY0FEdUIsRUFFdkIsZ0JBRnVCLEVBR3ZCLFNBSHVCLEVBSXZCLFNBSnVCLENBckxpQjtBQUFBLGlIQTJMakIsQ0FBQyxjQUFELEVBQWlCLGdCQUFqQixDQTNMaUI7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSxhQXFCMUM7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQTBCQyxTQUExQixFQUFxQztBQUNuQyxZQUNFLEtBQUt6QixLQUFMLENBQVdFLEtBQVgsQ0FBaUJtQixNQUFqQixDQUF3QkssTUFBeEIsSUFDQUQsU0FBUyxDQUFDdkIsS0FBVixDQUFnQm1CLE1BQWhCLENBQXVCSyxNQUR2QixJQUVBLEtBQUsxQixLQUFMLENBQVdFLEtBQVgsQ0FBaUJtQixNQUFqQixDQUF3QkssTUFBeEIsS0FBbUNELFNBQVMsQ0FBQ3ZCLEtBQVYsQ0FBZ0JtQixNQUFoQixDQUF1QkssTUFINUQsRUFJRTtBQUNBLGNBQUl4QixrQkFBTXlCLElBQU4sS0FBZSxVQUFmLElBQTZCekIsa0JBQU15QixJQUFOLEtBQWUsU0FBaEQsRUFBMkQ7QUFDekQsaUJBQUszQixLQUFMLENBQVdDLGlCQUFYLENBQTZCd0IsU0FBUyxDQUFDdkIsS0FBdkMsRUFBOEM7QUFDNUMwQixjQUFBQSxjQUFjLEVBQUU7QUFENEIsYUFBOUM7QUFHRDtBQUNGO0FBQ0Y7QUE1SHlDO0FBQUE7QUFBQSxhQTZMMUMsa0JBQVM7QUFBQTs7QUFDUCwyQkFBZ0QsS0FBSzVCLEtBQXJEO0FBQUEsWUFBT0UsS0FBUCxnQkFBT0EsS0FBUDtBQUFBLFlBQWNzQixHQUFkLGdCQUFjQSxHQUFkO0FBQUEsWUFBbUJLLFFBQW5CLGdCQUFtQkEsUUFBbkI7QUFBQSxZQUE2QkMsZUFBN0IsZ0JBQTZCQSxlQUE3QjtBQUNBLFlBQUtDLGdCQUFMLEdBQXlCLEtBQUsvQixLQUE5QixDQUFLK0IsZ0JBQUw7QUFDQSxZQUFNQyxTQUFTLEdBQ2JILFFBQVEsQ0FBQzNCLEtBQUssQ0FBQ21CLE1BQU4sQ0FBYUssTUFBZCxDQUFSLElBQWlDeEIsS0FBSyxDQUFDbUIsTUFBTixDQUFhSyxNQUE5QyxHQUNJRyxRQUFRLENBQUMzQixLQUFLLENBQUNtQixNQUFOLENBQWFLLE1BQWQsQ0FBUixDQUE4Qk8sZUFEbEMsR0FFSUMsU0FITjtBQUtBSCxRQUFBQSxnQkFBZ0IsR0FDZEMsU0FBUyxJQUFJQSxTQUFTLEtBQUssSUFBM0IsR0FDSUQsZ0JBQWdCLENBQUNJLE1BQWpCLENBQ0UsVUFBQUMsR0FBRztBQUFBLGlCQUFJLE1BQUksQ0FBQ0Msc0JBQUwsQ0FBNEJDLE9BQTVCLENBQW9DRixHQUFHLENBQUNHLEVBQXhDLEtBQStDLENBQW5EO0FBQUEsU0FETCxDQURKLEdBSUlSLGdCQUFnQixDQUFDSSxNQUFqQixDQUNFLFVBQUFDLEdBQUc7QUFBQSxpQkFBSSxNQUFJLENBQUNJLHNCQUFMLENBQTRCRixPQUE1QixDQUFvQ0YsR0FBRyxDQUFDRyxFQUF4QyxNQUFnRCxDQUFDLENBQXJEO0FBQUEsU0FETCxDQUxOO0FBUUEsWUFBT2xCLE1BQVAsR0FBaUJuQixLQUFqQixDQUFPbUIsTUFBUDtBQUNBLFlBQU9DLGNBQVAsR0FBd0NELE1BQXhDLENBQU9DLGNBQVA7QUFBQSxZQUF1Qm1CLGFBQXZCLEdBQXdDcEIsTUFBeEMsQ0FBdUJvQixhQUF2QjtBQUNBLDZCQUNFLGdDQUFDLFlBQUQ7QUFDRSxZQUFBLE1BQU0sRUFBRW5CLGNBRFY7QUFFRSxZQUFBLFNBQVMsd0JBQWlCLEtBQUt0QixLQUFMLENBQVcwQyxTQUE1QixDQUZYO0FBR0UsWUFBQSxLQUFLLEVBQUUsS0FBSzFDLEtBQUwsQ0FBVzJDLEtBSHBCO0FBSUUsWUFBQSxXQUFXLEVBQUUsS0FBSzNDLEtBQUwsQ0FBVzRDLFdBSjFCO0FBS0UsWUFBQSxZQUFZLEVBQUUsS0FBSzVDLEtBQUwsQ0FBVzZDO0FBTDNCLDBCQU9FLGdDQUFDLDRCQUFEO0FBQ0UsWUFBQSxjQUFjLEVBQUV2QixjQURsQjtBQUVFLFlBQUEsYUFBYSxFQUFFbUIsYUFGakI7QUFHRSxZQUFBLEVBQUUsRUFBRXZDLEtBQUssQ0FBQ3FDLEVBSFo7QUFJRSxZQUFBLFVBQVUsRUFBRXJDLEtBQUssQ0FBQzRDLFVBSnBCO0FBS0UsWUFBQSxHQUFHLEVBQUV0QixHQUxQO0FBTUUsWUFBQSxTQUFTLEVBQUVILE1BQU0sQ0FBQ0QsU0FOcEI7QUFPRSxZQUFBLEtBQUssRUFBRUMsTUFBTSxDQUFDSixLQVBoQjtBQVFFLFlBQUEsbUJBQW1CLEVBQUVZLFFBQVEsQ0FBQ1IsTUFBTSxDQUFDSyxNQUFSLENBQVIsQ0FBd0JxQixLQVIvQztBQVNFLFlBQUEsU0FBUyxFQUFFN0MsS0FBSyxDQUFDeUIsSUFUbkI7QUFVRSxZQUFBLG9CQUFvQixFQUFFLEtBQUtxQixtQkFWN0I7QUFXRSxZQUFBLGtCQUFrQixFQUFFLEtBQUtDLGlCQVgzQjtBQVlFLFlBQUEsa0JBQWtCLEVBQUUsS0FBS0MsaUJBWjNCO0FBYUUsWUFBQSxhQUFhLEVBQUUsS0FBS0M7QUFidEIsWUFQRixFQXNCRzdCLGNBQWMsaUJBQ2IsZ0NBQUMsaUJBQUQ7QUFDRSxZQUFBLEtBQUssRUFBRXBCLEtBRFQ7QUFFRSxZQUFBLFFBQVEsRUFBRTJCLFFBRlo7QUFHRSxZQUFBLGVBQWUsRUFBRUMsZUFIbkI7QUFJRSxZQUFBLGdCQUFnQixFQUFFQyxnQkFKcEI7QUFLRSxZQUFBLFNBQVMsRUFBRSxLQUFLL0IsS0FBTCxDQUFXb0QsU0FMeEI7QUFNRSxZQUFBLGtCQUFrQixFQUFFLEtBQUtDLGtCQU4zQjtBQU9FLFlBQUEsaUJBQWlCLEVBQUUsS0FBS3JDLGlCQVAxQjtBQVFFLFlBQUEsOEJBQThCLEVBQzVCLEtBQUtzQyw4QkFUVDtBQVdFLFlBQUEsZUFBZSxFQUFFLEtBQUtDLGVBWHhCO0FBWUUsWUFBQSxvQkFBb0IsRUFBRSxLQUFLQyxvQkFaN0I7QUFhRSxZQUFBLG9CQUFvQixFQUFFLEtBQUtDO0FBYjdCLFlBdkJKO0FBREY7QUEwQ0Q7QUF6UHlDO0FBQUE7QUFBQSxJQUNuQkMsZ0JBRG1COztBQUFBLG1DQUN0QzVELFVBRHNDLGVBRXZCO0FBQ2pCSSxJQUFBQSxLQUFLLEVBQUV5RCxzQkFBVUMsTUFBVixDQUFpQkMsVUFEUDtBQUVqQmhDLElBQUFBLFFBQVEsRUFBRThCLHNCQUFVQyxNQUFWLENBQWlCQyxVQUZWO0FBR2pCckMsSUFBQUEsR0FBRyxFQUFFbUMsc0JBQVVHLE1BQVYsQ0FBaUJELFVBSEw7QUFJakI1RCxJQUFBQSxpQkFBaUIsRUFBRTBELHNCQUFVSSxJQUFWLENBQWVGLFVBSmpCO0FBS2pCekQsSUFBQUEsZUFBZSxFQUFFdUQsc0JBQVVJLElBQVYsQ0FBZUYsVUFMZjtBQU1qQlQsSUFBQUEsU0FBUyxFQUFFTyxzQkFBVUksSUFBVixDQUFlRixVQU5UO0FBT2pCdEMsSUFBQUEsV0FBVyxFQUFFb0Msc0JBQVVJLElBQVYsQ0FBZUYsVUFQWDtBQVFqQi9CLElBQUFBLGVBQWUsRUFBRTZCLHNCQUFVSSxJQUFWLENBQWVGLFVBUmY7QUFTakJHLElBQUFBLFlBQVksRUFBRUwsc0JBQVVJLElBQVYsQ0FBZUYsVUFUWjtBQVVqQkksSUFBQUEsYUFBYSxFQUFFTixzQkFBVUksSUFWUjtBQVdqQmhDLElBQUFBLGdCQUFnQixFQUFFNEIsc0JBQVVPLE9BQVYsQ0FBa0JQLHNCQUFVUSxHQUE1QixDQVhEO0FBWWpCN0QsSUFBQUEsb0JBQW9CLEVBQUVxRCxzQkFBVUksSUFBVixDQUFlRixVQVpwQjtBQWFqQmhELElBQUFBLDhCQUE4QixFQUFFOEMsc0JBQVVJLElBQVYsQ0FBZUYsVUFiOUI7QUFjakJyRCxJQUFBQSxrQkFBa0IsRUFBRW1ELHNCQUFVSSxJQUFWLENBQWVGLFVBZGxCO0FBZWpCTyxJQUFBQSxtQkFBbUIsRUFBRVQsc0JBQVVJLElBZmQ7QUFnQmpCTSxJQUFBQSx5QkFBeUIsRUFBRVYsc0JBQVVJO0FBaEJwQixHQUZ1QjtBQTRQNUMsU0FBT2pFLFVBQVA7QUFDRDs7b0NBRWNKLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBMYXllckNvbmZpZ3VyYXRvckZhY3RvcnkgZnJvbSAnLi9sYXllci1jb25maWd1cmF0b3InO1xuaW1wb3J0IExheWVyUGFuZWxIZWFkZXIgZnJvbSAnLi9sYXllci1wYW5lbC1oZWFkZXInO1xuXG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbGF5ZXIgZnJvbSAncmVhY3QtbWFwLWdsL2Rpc3QvZXM1L2NvbXBvbmVudHMvbGF5ZXInO1xuaW1wb3J0IHtsYWJlbENvbG9yfSBmcm9tICdzdHlsZXMnO1xuaW1wb3J0IHthZGRMYXllcn0gZnJvbSAnYWN0aW9ucyc7XG5cbmNvbnN0IFBhbmVsV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgYm9yZGVyLXJhZGl1czogMXB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIHotaW5kZXg6IDEwMDA7XG5cbiAgJi5kcmFnZ2luZyB7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5gO1xuXG5MYXllclBhbmVsRmFjdG9yeS5kZXBzID0gW0xheWVyQ29uZmlndXJhdG9yRmFjdG9yeV07XG5cbmZ1bmN0aW9uIExheWVyUGFuZWxGYWN0b3J5KExheWVyQ29uZmlndXJhdG9yKSB7XG4gIGNsYXNzIExheWVyUGFuZWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclR5cGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICByZW1vdmVMYXllcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUxheWVyRGF0YTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGF4aW9zQVBJQ0FsbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9uQ2xvc2VDb25maWc6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgbGF5ZXJUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUFuaW1hdGlvblRpbWU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgdXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9O1xuXG4gICAgLy8gaW5EZWJvdW5jZSA9IDA7XG5cbiAgICAvLyBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIC8vICAgY29uc3Qge2NvbmZpZ30gPSBuZXh0UHJvcHMubGF5ZXI7XG4gICAgLy8gICBjb25zdCB7Y29sdW1ucywgYm91bmRhcnlBZ2dyZWdhdGlvbiwgYXBpQ2FsbFJlcXVlc3R9ID0gY29uZmlnO1xuXG4gICAgLy8gICBpZiAoXG4gICAgLy8gICAgIG5leHRQcm9wcy5sYXllci50eXBlID09PSAnZHluYW1pYycgfHxcbiAgICAvLyAgICAgbmV4dFByb3BzLmxheWVyLnR5cGUgPT09ICdnZW9IYXNoJyB8fFxuICAgIC8vICAgICBuZXh0UHJvcHMubGF5ZXIudHlwZSA9PT0gJ3BvaW50J1xuICAgIC8vICAgKSB7XG4gICAgLy8gICAgIGlmIChcbiAgICAvLyAgICAgICAhXy5pc0VxdWFsKHRoaXMucHJvcHMubWFwU3RhdGUsIG5leHRQcm9wcy5tYXBTdGF0ZSlcbiAgICAvLyAgICAgICAvLyAmJlxuICAgIC8vICAgICAgIC8vIG5leHRQcm9wcy5sYXllcnNcbiAgICAvLyAgICAgICAvLyBuZXh0UHJvcHMud2lkZ2V0LmNvbmZpZy5ib3VuZHNcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgICAgYXBpQ2FsbFJlcXVlc3Q6IHRydWVcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuXG4gICAgLy8gICBpZiAoXG4gICAgLy8gICAgIG5leHRQcm9wcy5sYXllciAmJlxuICAgIC8vICAgICBjb25maWcgJiZcbiAgICAvLyAgICAgYXBpQ2FsbFJlcXVlc3QgPT09IHRydWVcbiAgICAvLyAgICAgLy8gY29sdW1uc1tPYmplY3Qua2V5cyhjb2x1bW5zKVswXV0uZmllbGRJZHggIT09IC0xXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgIGFwaUNhbGxSZXF1ZXN0OiBmYWxzZSxcbiAgICAvLyAgICAgICBhcGlDYWxsTG9hZGVyOiB0cnVlXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAvLyAgICAgdGhpcy5pbkRlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dFByb3BzLmxheWVyLmF4aW9zQXBpQ2FsbChcbiAgICAvLyAgICAgICAgIG5leHRQcm9wcy5kYXRhc2V0cyxcbiAgICAvLyAgICAgICAgIHRoaXMuZ2V0Vmlld3BvcnQobmV4dFByb3BzLm1hcFN0YXRlKSxcbiAgICAvLyAgICAgICAgIG5leHRQcm9wcy5tYXBTdGF0ZS56b29tLFxuICAgIC8vICAgICAgICAgbmV4dFByb3BzLmZpbHRlcnNcbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICAgIHJlc3VsdC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIC8vICAgICAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgICAgICBhcGlDYWxsTG9hZGVyOiBmYWxzZVxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgICBuZXh0UHJvcHMudXBkYXRlTGF5ZXJEYXRhKG5leHRQcm9wcy5sYXllciwgcmVzdWx0KTtcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAvLyAgICAgICB0aGlzLmluRGVib3VuY2UgPSAwO1xuICAgIC8vICAgICB9LCAzMDApO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIGdldFZpZXdwb3J0KG1hcFN0YXRlKSB7XG4gICAgLy8gICBjb25zdCB7XG4gICAgLy8gICAgIGxvbmdpdHVkZSxcbiAgICAvLyAgICAgbGF0aXR1ZGUsXG4gICAgLy8gICAgIGhlaWdodCxcbiAgICAvLyAgICAgd2lkdGgsXG4gICAgLy8gICAgIHpvb20sXG4gICAgLy8gICAgIHBpdGNoLFxuICAgIC8vICAgICBiZWFyaW5nXG4gICAgLy8gICB9ID0gbWFwU3RhdGU7XG5cbiAgICAvLyAgIC8vIGxldCAgYm91bmRpbmdCb3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbXG4gICAgLy8gICAvLyAgICAgd2lkdGgsXG4gICAgLy8gICAvLyAgICAgaGVpZ2h0XG4gICAgLy8gICAvLyAgIF0pO1xuXG4gICAgLy8gICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAvLyAgICAgd2lkdGg6IHdpZHRoLFxuICAgIC8vICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAvLyAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgLy8gICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAvLyAgICAgem9vbTogem9vbSxcbiAgICAvLyAgICAgcGl0Y2g6IHBpdGNoLFxuICAgIC8vICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIGxldCBjVUwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIDBdKTtcbiAgICAvLyAgIGxldCBjVVIgPSB2aWV3cG9ydC51bnByb2plY3QoW3dpZHRoLCAwXSk7XG4gICAgLy8gICBsZXQgY0xSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgaGVpZ2h0XSk7XG4gICAgLy8gICBsZXQgY0xMID0gdmlld3BvcnQudW5wcm9qZWN0KFswLCBoZWlnaHRdKTtcblxuICAgIC8vICAgbGV0IGxhdFJhbmdlID0gWy4uLm5ldyBTZXQoW2NMTFsxXSwgY1VSWzFdLCBjTFJbMV0sIGNVTFsxXV0pXS5zb3J0KFxuICAgIC8vICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICAvLyAgICk7XG4gICAgLy8gICBsZXQgbG5nUmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzBdLCBjVVJbMF0sIGNMUlswXSwgY1VMWzBdXSldLnNvcnQoXG4gICAgLy8gICAgIChhLCBiKSA9PiBhIC0gYlxuICAgIC8vICAgKTtcbiAgICAvLyAgIHJldHVybiBbbG5nUmFuZ2VbMF0sIGxuZ1JhbmdlWzFdLCBsYXRSYW5nZVswXSwgbGF0UmFuZ2VbMV1dO1xuICAgIC8vIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnByb3BzLmxheWVyLmNvbmZpZy5kYXRhSWQgJiZcbiAgICAgICAgbmV4dFByb3BzLmxheWVyLmNvbmZpZy5kYXRhSWQgJiZcbiAgICAgICAgdGhpcy5wcm9wcy5sYXllci5jb25maWcuZGF0YUlkICE9PSBuZXh0UHJvcHMubGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgKSB7XG4gICAgICAgIGlmIChsYXllci5uYW1lICE9PSAnYm91bmRhcnknICYmIGxheWVyLm5hbWUgIT09ICdwaW5jb2RlJykge1xuICAgICAgICAgIHRoaXMucHJvcHMubGF5ZXJDb25maWdDaGFuZ2UobmV4dFByb3BzLmxheWVyLCB7XG4gICAgICAgICAgICBhcGlDYWxsUmVxdWVzdDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUxheWVyQ29uZmlnID0gbmV3UHJvcCA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKHRoaXMucHJvcHMubGF5ZXIsIG5ld1Byb3ApO1xuICAgIH07XG5cbiAgICB1cGRhdGVMYXllclR5cGUgPSBuZXdUeXBlID0+IHtcbiAgICAgIHRoaXMucHJvcHMubGF5ZXJUeXBlQ2hhbmdlKHRoaXMucHJvcHMubGF5ZXIsIG5ld1R5cGUpO1xuICAgICAgLy8gdGhpcy5wcm9wcy5sYXllckNvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLmxheWVyLCB7YXBpQ2FsbFJlcXVlc3Q6IHRydWV9KTtcbiAgICB9O1xuXG4gICAgdXBkYXRlTGF5ZXJWaXNDb25maWcgPSBuZXdWaXNDb25maWcgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5sYXllclZpc0NvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLmxheWVyLCBuZXdWaXNDb25maWcpO1xuICAgIH07XG5cbiAgICB1cGRhdGVMYXllckNvbG9yVUkgPSAoLi4uYXJncykgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5sYXllckNvbG9yVUlDaGFuZ2UodGhpcy5wcm9wcy5sYXllciwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHVwZGF0ZUxheWVyVGV4dExhYmVsID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHRoaXMucHJvcHMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UodGhpcy5wcm9wcy5sYXllciwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZyA9IChuZXdDb25maWcsIGNoYW5uZWwsIHNjYWxlS2V5KSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShcbiAgICAgICAgdGhpcy5wcm9wcy5sYXllcixcbiAgICAgICAgbmV3Q29uZmlnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBzY2FsZUtleVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgX3VwZGF0ZUxheWVyTGFiZWwgPSAoe3RhcmdldDoge3ZhbHVlfX0pID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2xhYmVsOiB2YWx1ZX0pO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlVmlzaWJpbGl0eSA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9ICF0aGlzLnByb3BzLmxheWVyLmNvbmZpZy5pc1Zpc2libGU7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtpc1Zpc2libGV9KTtcbiAgICB9O1xuXG4gICAgX3RvZ2dsZUVuYWJsZUNvbmZpZyA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGF5ZXI6IHtcbiAgICAgICAgICBjb25maWc6IHtpc0NvbmZpZ0FjdGl2ZX1cbiAgICAgICAgfVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtpc0NvbmZpZ0FjdGl2ZTogIWlzQ29uZmlnQWN0aXZlfSk7XG4gICAgfTtcblxuICAgIF9yZW1vdmVMYXllciA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMucHJvcHMucmVtb3ZlTGF5ZXIodGhpcy5wcm9wcy5pZHgpO1xuICAgIH07XG5cbiAgICAvLyBmaWx0ZXJMYXllck9wdGlvbnMgPSBbJ2dyaWQnLCAnaGV4YWdvbicsICdib3VuZGFyeSddO1xuICAgIGZpbHRlckxhcmdlRGF0YU9wdGlvbnMgPSBbXG4gICAgICAnYmFja2VuZFBvaW50JyxcbiAgICAgICdiYWNrZW5kR2VvanNvbicsXG4gICAgICAnZ2VvSGFzaCcsXG4gICAgICAnZHluYW1pYydcbiAgICBdO1xuICAgIGZpbHRlclNtYWxsRGF0YU9wdGlvbnMgPSBbJ2JhY2tlbmRQb2ludCcsICdiYWNrZW5kR2VvanNvbiddO1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2xheWVyLCBpZHgsIGRhdGFzZXRzLCB1cGRhdGVMYXllckRhdGF9ID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciB7bGF5ZXJUeXBlT3B0aW9uc30gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgbGFyZ2VEYXRhID1cbiAgICAgICAgZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0gJiYgbGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgICAgID8gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0uaXNMYXJnZUNhdGVnb3J5XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGxheWVyVHlwZU9wdGlvbnMgPVxuICAgICAgICBsYXJnZURhdGEgJiYgbGFyZ2VEYXRhID09PSB0cnVlXG4gICAgICAgICAgPyBsYXllclR5cGVPcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgbHRvID0+IHRoaXMuZmlsdGVyTGFyZ2VEYXRhT3B0aW9ucy5pbmRleE9mKGx0by5pZCkgPj0gMFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbGF5ZXJUeXBlT3B0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgIGx0byA9PiB0aGlzLmZpbHRlclNtYWxsRGF0YU9wdGlvbnMuaW5kZXhPZihsdG8uaWQpID09PSAtMVxuICAgICAgICAgICAgKTtcbiAgICAgIGNvbnN0IHtjb25maWd9ID0gbGF5ZXI7XG4gICAgICBjb25zdCB7aXNDb25maWdBY3RpdmUsIGFwaUNhbGxMb2FkZXJ9ID0gY29uZmlnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFBhbmVsV3JhcHBlclxuICAgICAgICAgIGFjdGl2ZT17aXNDb25maWdBY3RpdmV9XG4gICAgICAgICAgY2xhc3NOYW1lPXtgbGF5ZXItcGFuZWwgJHt0aGlzLnByb3BzLmNsYXNzTmFtZX1gfVxuICAgICAgICAgIHN0eWxlPXt0aGlzLnByb3BzLnN0eWxlfVxuICAgICAgICAgIG9uTW91c2VEb3duPXt0aGlzLnByb3BzLm9uTW91c2VEb3dufVxuICAgICAgICAgIG9uVG91Y2hTdGFydD17dGhpcy5wcm9wcy5vblRvdWNoU3RhcnR9XG4gICAgICAgID5cbiAgICAgICAgICA8TGF5ZXJQYW5lbEhlYWRlclxuICAgICAgICAgICAgaXNDb25maWdBY3RpdmU9e2lzQ29uZmlnQWN0aXZlfVxuICAgICAgICAgICAgYXBpQ2FsbExvYWRlcj17YXBpQ2FsbExvYWRlcn1cbiAgICAgICAgICAgIGlkPXtsYXllci5pZH1cbiAgICAgICAgICAgIHNob3dMb2FkZXI9e2xheWVyLnNob3dMb2FkZXJ9XG4gICAgICAgICAgICBpZHg9e2lkeH1cbiAgICAgICAgICAgIGlzVmlzaWJsZT17Y29uZmlnLmlzVmlzaWJsZX1cbiAgICAgICAgICAgIGxhYmVsPXtjb25maWcubGFiZWx9XG4gICAgICAgICAgICBsYWJlbFJDR0NvbG9yVmFsdWVzPXtkYXRhc2V0c1tjb25maWcuZGF0YUlkXS5jb2xvcn1cbiAgICAgICAgICAgIGxheWVyVHlwZT17bGF5ZXIubmFtZX1cbiAgICAgICAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnPXt0aGlzLl90b2dnbGVFbmFibGVDb25maWd9XG4gICAgICAgICAgICBvblRvZ2dsZVZpc2liaWxpdHk9e3RoaXMuX3RvZ2dsZVZpc2liaWxpdHl9XG4gICAgICAgICAgICBvblVwZGF0ZUxheWVyTGFiZWw9e3RoaXMuX3VwZGF0ZUxheWVyTGFiZWx9XG4gICAgICAgICAgICBvblJlbW92ZUxheWVyPXt0aGlzLl9yZW1vdmVMYXllcn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtpc0NvbmZpZ0FjdGl2ZSAmJiAoXG4gICAgICAgICAgICA8TGF5ZXJDb25maWd1cmF0b3JcbiAgICAgICAgICAgICAgbGF5ZXI9e2xheWVyfVxuICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyRGF0YT17dXBkYXRlTGF5ZXJEYXRhfVxuICAgICAgICAgICAgICBsYXllclR5cGVPcHRpb25zPXtsYXllclR5cGVPcHRpb25zfVxuICAgICAgICAgICAgICBvcGVuTW9kYWw9e3RoaXMucHJvcHMub3Blbk1vZGFsfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbG9yVUk9e3RoaXMudXBkYXRlTGF5ZXJDb2xvclVJfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZz17dGhpcy51cGRhdGVMYXllckNvbmZpZ31cbiAgICAgICAgICAgICAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnPXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVHlwZT17dGhpcy51cGRhdGVMYXllclR5cGV9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVGV4dExhYmVsPXt0aGlzLnVwZGF0ZUxheWVyVGV4dExhYmVsfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllclZpc0NvbmZpZz17dGhpcy51cGRhdGVMYXllclZpc0NvbmZpZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9QYW5lbFdyYXBwZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBMYXllclBhbmVsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllclBhbmVsRmFjdG9yeTtcbiJdfQ==