UNPKG

kepler.gl

Version:

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

201 lines (200 loc) 33.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"] = EditorFactory; 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("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _reactDom = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-dom"); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _window = _interopRequireDefault(require("global/window")); var _classnames = _interopRequireDefault(require("classnames")); var _get = _interopRequireDefault(require("lodash/get")); var _reselect = require("reselect"); var _featureActionPanel = _interopRequireDefault(require("./feature-action-panel")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/layers/src"); var _context = require("../context"); var _templateObject; // 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 _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 DECKGL_RENDER_LAYER = 'default-deckgl-overlay-wrapper'; var StyledWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n"]))); var editorLayerFilter = function editorLayerFilter(layer) { return _src.EDITOR_AVAILABLE_LAYERS.includes(layer.type || ''); }; EditorFactory.deps = [_featureActionPanel["default"]]; function EditorFactory(FeatureActionPanel) { var PortalEditor = function PortalEditor(_ref) { var visiblePanel = _ref.visiblePanel, className = _ref.className, style = _ref.style, selectedFeature = _ref.selectedFeature, datasets = _ref.datasets, layers = _ref.layers, currentFilter = _ref.currentFilter, onClose = _ref.onClose, onDeleteFeature = _ref.onDeleteFeature, onToggleLayer = _ref.onToggleLayer, position = _ref.position; return /*#__PURE__*/_react["default"].createElement(_context.RootContext.Consumer, null, function (context) { var _context$current; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, (0, _reactDom.createPortal)( /*#__PURE__*/_react["default"].createElement(StyledWrapper, { className: (0, _classnames["default"])('editor', className), style: style }, visiblePanel ? /*#__PURE__*/_react["default"].createElement(FeatureActionPanel, { selectedFeature: selectedFeature, datasets: datasets, layers: layers, currentFilter: currentFilter, onClose: onClose, onDeleteFeature: onDeleteFeature, onToggleLayer: onToggleLayer, position: position || null }) : null), (_context$current = context === null || context === void 0 ? void 0 : context.current) !== null && _context$current !== void 0 ? _context$current : document.body)); }); }; var EditorUnmemoized = /*#__PURE__*/function (_Component) { function EditorUnmemoized() { var _this; (0, _classCallCheck2["default"])(this, EditorUnmemoized); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, EditorUnmemoized, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", {}); (0, _defineProperty2["default"])(_this, "layerSelector", function (props) { return props.layers; }); (0, _defineProperty2["default"])(_this, "filterSelector", function (props) { return props.filters; }); (0, _defineProperty2["default"])(_this, "selectedFeatureIdSelector", function (props) { return (0, _get["default"])(props, ['editor', 'selectedFeature', 'id']); }); (0, _defineProperty2["default"])(_this, "editorFeatureSelector", function (props) { return (0, _get["default"])(props, ['editor', 'features']); }); (0, _defineProperty2["default"])(_this, "currentFilterSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.selectedFeatureIdSelector, function (filters, selectedFeatureId) { return filters.find(function (f) { return f.value && f.value.id === selectedFeatureId; }); })); (0, _defineProperty2["default"])(_this, "availableLayersSelector", (0, _reselect.createSelector)(_this.layerSelector, function (layers) { return layers.filter(editorLayerFilter).filter(function (layer) { var _layer$config; return ((_layer$config = layer.config) === null || _layer$config === void 0 ? void 0 : _layer$config.isVisible) && layer.id !== _src.GEOCODER_LAYER_ID; }); })); (0, _defineProperty2["default"])(_this, "allFeaturesSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.editorFeatureSelector, function (filters, editorFeatures) { return filters.filter(function (f) { return f.type === _src.FILTER_TYPES.polygon; }).map(function (f) { return f.value; }).concat(editorFeatures); })); (0, _defineProperty2["default"])(_this, "isInFocus", function () { var _document$activeEleme; return ((_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.id) === DECKGL_RENDER_LAYER; }); (0, _defineProperty2["default"])(_this, "_onKeyPressed", function (event) { if (_this.isInFocus()) { switch (event.keyCode) { case _src.KeyEvent.DOM_VK_DELETE: case _src.KeyEvent.DOM_VK_BACK_SPACE: _this._onDeleteSelectedFeature(); break; case _src.KeyEvent.DOM_VK_ESCAPE: // reset active drawing if (_src2.EditorLayerUtils.isDrawingActive(true, _this.props.editor.mode)) { _this.props.onSetEditorMode(_src.EDITOR_MODES.EDIT); } _this.props.onSelect(null); break; default: break; } } }); (0, _defineProperty2["default"])(_this, "_onDeleteSelectedFeature", function () { var editor = _this.props.editor; var selectedFeature = editor.selectedFeature; if (selectedFeature) { _this.props.onDeleteFeature(selectedFeature); } }); (0, _defineProperty2["default"])(_this, "_closeFeatureAction", function () { // reset selection context var selectedFeature = _this.props.editor.selectedFeature; _this.props.onSelect(selectedFeature); }); (0, _defineProperty2["default"])(_this, "_togglePolygonFilter", function (layer) { var selectedFeature = _this.props.editor.selectedFeature; if (selectedFeature) { _this.props.onTogglePolygonFilter(layer, selectedFeature); } }); return _this; } (0, _inherits2["default"])(EditorUnmemoized, _Component); return (0, _createClass2["default"])(EditorUnmemoized, [{ key: "componentDidMount", value: function componentDidMount() { _window["default"].addEventListener('keydown', this._onKeyPressed); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { _window["default"].removeEventListener('keydown', this._onKeyPressed); } }, { key: "render", value: function render() { var _this$props = this.props, className = _this$props.className, datasets = _this$props.datasets, editor = _this$props.editor, style = _this$props.style, index = _this$props.index; var selectedFeature = editor.selectedFeature, selectionContext = editor.selectionContext; var currentFilter = this.currentFilterSelector(this.props); var availableLayers = this.availableLayersSelector(this.props); var _ref2 = selectionContext || {}, rightClick = _ref2.rightClick, position = _ref2.position, mapIndex = _ref2.mapIndex; return /*#__PURE__*/_react["default"].createElement(PortalEditor, { selectedFeature: selectedFeature, visiblePanel: Boolean(rightClick) && selectedFeature && index === mapIndex, datasets: datasets, layers: availableLayers, currentFilter: currentFilter, onClose: this._closeFeatureAction, onDeleteFeature: this._onDeleteSelectedFeature, onToggleLayer: this._togglePolygonFilter, position: position || null, className: className, style: style }); } }]); }(_react.Component); (0, _defineProperty2["default"])(EditorUnmemoized, "defaultProps", {}); (0, _defineProperty2["default"])(EditorUnmemoized, "displayName", 'Editor'); var Editor = _react["default"].memo(EditorUnmemoized); Editor.displayName = 'Editor'; return Editor; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3REb20iLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfd2luZG93IiwiX2NsYXNzbmFtZXMiLCJfZ2V0IiwiX3Jlc2VsZWN0IiwiX2ZlYXR1cmVBY3Rpb25QYW5lbCIsIl9zcmMiLCJfc3JjMiIsIl9jb250ZXh0IiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJERUNLR0xfUkVOREVSX0xBWUVSIiwiU3R5bGVkV3JhcHBlciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiZWRpdG9yTGF5ZXJGaWx0ZXIiLCJsYXllciIsIkVESVRPUl9BVkFJTEFCTEVfTEFZRVJTIiwiaW5jbHVkZXMiLCJ0eXBlIiwiRWRpdG9yRmFjdG9yeSIsImRlcHMiLCJGZWF0dXJlQWN0aW9uUGFuZWxGYWN0b3J5IiwiRmVhdHVyZUFjdGlvblBhbmVsIiwiUG9ydGFsRWRpdG9yIiwiX3JlZiIsInZpc2libGVQYW5lbCIsImNsYXNzTmFtZSIsInN0eWxlIiwic2VsZWN0ZWRGZWF0dXJlIiwiZGF0YXNldHMiLCJsYXllcnMiLCJjdXJyZW50RmlsdGVyIiwib25DbG9zZSIsIm9uRGVsZXRlRmVhdHVyZSIsIm9uVG9nZ2xlTGF5ZXIiLCJwb3NpdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJSb290Q29udGV4dCIsIkNvbnN1bWVyIiwiY29udGV4dCIsIl9jb250ZXh0JGN1cnJlbnQiLCJGcmFnbWVudCIsImNyZWF0ZVBvcnRhbCIsImNsYXNzbmFtZXMiLCJjdXJyZW50IiwiZG9jdW1lbnQiLCJib2R5IiwiRWRpdG9yVW5tZW1vaXplZCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJwcm9wcyIsImZpbHRlcnMiLCJjcmVhdGVTZWxlY3RvciIsImZpbHRlclNlbGVjdG9yIiwic2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvciIsInNlbGVjdGVkRmVhdHVyZUlkIiwiZmluZCIsImYiLCJ2YWx1ZSIsImlkIiwibGF5ZXJTZWxlY3RvciIsImZpbHRlciIsIl9sYXllciRjb25maWciLCJjb25maWciLCJpc1Zpc2libGUiLCJHRU9DT0RFUl9MQVlFUl9JRCIsImVkaXRvckZlYXR1cmVTZWxlY3RvciIsImVkaXRvckZlYXR1cmVzIiwiRklMVEVSX1RZUEVTIiwicG9seWdvbiIsIm1hcCIsIl9kb2N1bWVudCRhY3RpdmVFbGVtZSIsImFjdGl2ZUVsZW1lbnQiLCJldmVudCIsImlzSW5Gb2N1cyIsImtleUNvZGUiLCJLZXlFdmVudCIsIkRPTV9WS19ERUxFVEUiLCJET01fVktfQkFDS19TUEFDRSIsIl9vbkRlbGV0ZVNlbGVjdGVkRmVhdHVyZSIsIkRPTV9WS19FU0NBUEUiLCJFZGl0b3JMYXllclV0aWxzIiwiaXNEcmF3aW5nQWN0aXZlIiwiZWRpdG9yIiwibW9kZSIsIm9uU2V0RWRpdG9yTW9kZSIsIkVESVRPUl9NT0RFUyIsIkVESVQiLCJvblNlbGVjdCIsIm9uVG9nZ2xlUG9seWdvbkZpbHRlciIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiY29tcG9uZW50RGlkTW91bnQiLCJXaW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwiX29uS2V5UHJlc3NlZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbmRlciIsIl90aGlzJHByb3BzIiwiaW5kZXgiLCJzZWxlY3Rpb25Db250ZXh0IiwiY3VycmVudEZpbHRlclNlbGVjdG9yIiwiYXZhaWxhYmxlTGF5ZXJzIiwiYXZhaWxhYmxlTGF5ZXJzU2VsZWN0b3IiLCJfcmVmMiIsInJpZ2h0Q2xpY2siLCJtYXBJbmRleCIsIl9jbG9zZUZlYXR1cmVBY3Rpb24iLCJfdG9nZ2xlUG9seWdvbkZpbHRlciIsIkNvbXBvbmVudCIsIkVkaXRvciIsIlJlYWN0IiwibWVtbyIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL2VkaXRvci9lZGl0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgQ1NTUHJvcGVydGllcywgS2V5Ym9hcmRFdmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjcmVhdGVQb3J0YWx9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQgRmVhdHVyZUFjdGlvblBhbmVsRmFjdG9yeSwge0ZlYXR1cmVBY3Rpb25QYW5lbFByb3BzfSBmcm9tICcuL2ZlYXR1cmUtYWN0aW9uLXBhbmVsJztcbmltcG9ydCB7XG4gIEVESVRPUl9BVkFJTEFCTEVfTEFZRVJTLFxuICBGSUxURVJfVFlQRVMsXG4gIEVESVRPUl9NT0RFUyxcbiAgR0VPQ09ERVJfTEFZRVJfSUQsXG4gIEtleUV2ZW50XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TGF5ZXIsIEVkaXRvckxheWVyVXRpbHN9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7RmlsdGVyLCBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dCwgRmVhdHVyZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0ZlYXR1cmVPZiwgUG9seWdvbn0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge1Jvb3RDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0JztcblxuY29uc3QgREVDS0dMX1JFTkRFUl9MQVlFUiA9ICdkZWZhdWx0LWRlY2tnbC1vdmVybGF5LXdyYXBwZXInO1xuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcblxuY29uc3QgZWRpdG9yTGF5ZXJGaWx0ZXIgPSAobGF5ZXI6IExheWVyKSA9PiBFRElUT1JfQVZBSUxBQkxFX0xBWUVSUy5pbmNsdWRlcyhsYXllci50eXBlIHx8ICcnKTtcblxuRWRpdG9yRmFjdG9yeS5kZXBzID0gW0ZlYXR1cmVBY3Rpb25QYW5lbEZhY3RvcnldO1xuXG5pbnRlcmZhY2UgRWRpdG9yUHJvcHMge1xuICBmaWx0ZXJzOiBGaWx0ZXJbXTtcbiAgbGF5ZXJzOiBMYXllcltdO1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGVkaXRvcjoge3NlbGVjdGVkRmVhdHVyZTogRmVhdHVyZTsgbW9kZTogc3RyaW5nOyBzZWxlY3Rpb25Db250ZXh0PzogRmVhdHVyZVNlbGVjdGlvbkNvbnRleHR9O1xuICBpbmRleDogbnVtYmVyO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHN0eWxlOiBDU1NQcm9wZXJ0aWVzO1xuICBvblNlbGVjdDogKGY6IEZlYXR1cmUgfCBudWxsKSA9PiBhbnk7XG4gIG9uU2V0RWRpdG9yTW9kZTogKG06IGFueSkgPT4gdm9pZDtcbiAgb25EZWxldGVGZWF0dXJlOiAoZjogRmVhdHVyZSkgPT4gYW55O1xuICBvblRvZ2dsZVBvbHlnb25GaWx0ZXI6IChsOiBMYXllciwgZjogRmVhdHVyZSkgPT4gYW55O1xufVxuXG5leHBvcnQgdHlwZSBQb3J0YWxFZGl0b3JQcm9wcyA9IEZlYXR1cmVBY3Rpb25QYW5lbFByb3BzICYge1xuICB2aXNpYmxlUGFuZWw6IGJvb2xlYW47XG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVkaXRvckZhY3RvcnkoXG4gIEZlYXR1cmVBY3Rpb25QYW5lbDogUmVhY3QuRkM8RmVhdHVyZUFjdGlvblBhbmVsUHJvcHM+XG4pOiBSZWFjdC5Db21wb25lbnRDbGFzczxFZGl0b3JQcm9wcz4ge1xuICBjb25zdCBQb3J0YWxFZGl0b3I6IFJlYWN0LkZDPFBvcnRhbEVkaXRvclByb3BzPiA9ICh7XG4gICAgdmlzaWJsZVBhbmVsLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBzZWxlY3RlZEZlYXR1cmUsXG4gICAgZGF0YXNldHMsXG4gICAgbGF5ZXJzLFxuICAgIGN1cnJlbnRGaWx0ZXIsXG4gICAgb25DbG9zZSxcbiAgICBvbkRlbGV0ZUZlYXR1cmUsXG4gICAgb25Ub2dnbGVMYXllcixcbiAgICBwb3NpdGlvblxuICB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxSb290Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge2NvbnRleHQgPT4gKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7Y3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgICA8U3R5bGVkV3JhcHBlciBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2VkaXRvcicsIGNsYXNzTmFtZSl9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICAgICAge3Zpc2libGVQYW5lbCA/IChcbiAgICAgICAgICAgICAgICAgIDxGZWF0dXJlQWN0aW9uUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlPXtzZWxlY3RlZEZlYXR1cmUgYXMgRmVhdHVyZU9mPFBvbHlnb24+fVxuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsdGVyPXtjdXJyZW50RmlsdGVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXtvbkNsb3NlfVxuICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZUZlYXR1cmU9e29uRGVsZXRlRmVhdHVyZX1cbiAgICAgICAgICAgICAgICAgICAgb25Ub2dnbGVMYXllcj17b25Ub2dnbGVMYXllcn1cbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249e3Bvc2l0aW9uIHx8IG51bGx9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8L1N0eWxlZFdyYXBwZXI+LFxuICAgICAgICAgICAgICBjb250ZXh0Py5jdXJyZW50ID8/IGRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L1Jvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG4gIH07XG4gIGNsYXNzIEVkaXRvclVubWVtb2l6ZWQgZXh0ZW5kcyBDb21wb25lbnQ8RWRpdG9yUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge307XG5cbiAgICBzdGF0aWMgZGlzcGxheU5hbWUgPSAnRWRpdG9yJztcblxuICAgIHN0YXRlID0ge307XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIFdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgICB9XG5cbiAgICBsYXllclNlbGVjdG9yID0gKHByb3BzOiBFZGl0b3JQcm9wcykgPT4gcHJvcHMubGF5ZXJzO1xuICAgIGZpbHRlclNlbGVjdG9yID0gKHByb3BzOiBFZGl0b3JQcm9wcykgPT4gcHJvcHMuZmlsdGVycztcbiAgICBzZWxlY3RlZEZlYXR1cmVJZFNlbGVjdG9yID0gKHByb3BzOiBFZGl0b3JQcm9wcykgPT5cbiAgICAgIGdldChwcm9wcywgWydlZGl0b3InLCAnc2VsZWN0ZWRGZWF0dXJlJywgJ2lkJ10pO1xuICAgIGVkaXRvckZlYXR1cmVTZWxlY3RvciA9IChwcm9wczogRWRpdG9yUHJvcHMpID0+IGdldChwcm9wcywgWydlZGl0b3InLCAnZmVhdHVyZXMnXSk7XG5cbiAgICBjdXJyZW50RmlsdGVyU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZmlsdGVyU2VsZWN0b3IsXG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZUlkU2VsZWN0b3IsXG4gICAgICAoZmlsdGVycywgc2VsZWN0ZWRGZWF0dXJlSWQpID0+IGZpbHRlcnMuZmluZChmID0+IGYudmFsdWUgJiYgZi52YWx1ZS5pZCA9PT0gc2VsZWN0ZWRGZWF0dXJlSWQpXG4gICAgKTtcblxuICAgIGF2YWlsYWJsZUxheWVyc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IodGhpcy5sYXllclNlbGVjdG9yLCBsYXllcnMgPT5cbiAgICAgIGxheWVyc1xuICAgICAgICAuZmlsdGVyKGVkaXRvckxheWVyRmlsdGVyKVxuICAgICAgICAuZmlsdGVyKGxheWVyID0+IGxheWVyLmNvbmZpZz8uaXNWaXNpYmxlICYmIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRClcbiAgICApO1xuXG4gICAgYWxsRmVhdHVyZXNTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3RvcixcbiAgICAgIHRoaXMuZWRpdG9yRmVhdHVyZVNlbGVjdG9yLFxuICAgICAgKGZpbHRlcnMsIGVkaXRvckZlYXR1cmVzKSA9PlxuICAgICAgICBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihmID0+IGYudHlwZSA9PT0gRklMVEVSX1RZUEVTLnBvbHlnb24pXG4gICAgICAgICAgLm1hcChmID0+IGYudmFsdWUpXG4gICAgICAgICAgLmNvbmNhdChlZGl0b3JGZWF0dXJlcylcbiAgICApO1xuXG4gICAgaXNJbkZvY3VzID0gKCkgPT4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQgPT09IERFQ0tHTF9SRU5ERVJfTEFZRVI7XG5cbiAgICBfb25LZXlQcmVzc2VkID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0luRm9jdXMoKSkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19ERUxFVEU6XG4gICAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfQkFDS19TUEFDRTpcbiAgICAgICAgICAgIHRoaXMuX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19FU0NBUEU6XG4gICAgICAgICAgICAvLyByZXNldCBhY3RpdmUgZHJhd2luZ1xuICAgICAgICAgICAgaWYgKEVkaXRvckxheWVyVXRpbHMuaXNEcmF3aW5nQWN0aXZlKHRydWUsIHRoaXMucHJvcHMuZWRpdG9yLm1vZGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvcHMub25TZXRFZGl0b3JNb2RlKEVESVRPUl9NT0RFUy5FRElUKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChudWxsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfb25EZWxldGVTZWxlY3RlZEZlYXR1cmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7ZWRpdG9yfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IGVkaXRvcjtcbiAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkRlbGV0ZUZlYXR1cmUoc2VsZWN0ZWRGZWF0dXJlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX2Nsb3NlRmVhdHVyZUFjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIHJlc2V0IHNlbGVjdGlvbiBjb250ZXh0XG4gICAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHRoaXMucHJvcHMuZWRpdG9yO1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChzZWxlY3RlZEZlYXR1cmUpO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlUG9seWdvbkZpbHRlciA9IChsYXllcjogTGF5ZXIpID0+IHtcbiAgICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmV9ID0gdGhpcy5wcm9wcy5lZGl0b3I7XG4gICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25Ub2dnbGVQb2x5Z29uRmlsdGVyKGxheWVyLCBzZWxlY3RlZEZlYXR1cmUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7Y2xhc3NOYW1lLCBkYXRhc2V0cywgZWRpdG9yLCBzdHlsZSwgaW5kZXh9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmUsIHNlbGVjdGlvbkNvbnRleHR9ID0gZWRpdG9yO1xuICAgICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMuY3VycmVudEZpbHRlclNlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgICAgY29uc3QgYXZhaWxhYmxlTGF5ZXJzID0gdGhpcy5hdmFpbGFibGVMYXllcnNTZWxlY3Rvcih0aGlzLnByb3BzKTtcblxuICAgICAgY29uc3Qge3JpZ2h0Q2xpY2ssIHBvc2l0aW9uLCBtYXBJbmRleH0gPSBzZWxlY3Rpb25Db250ZXh0IHx8IHt9O1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8UG9ydGFsRWRpdG9yXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlPXtzZWxlY3RlZEZlYXR1cmUgYXMgRmVhdHVyZU9mPFBvbHlnb24+fVxuICAgICAgICAgIHZpc2libGVQYW5lbD17Qm9vbGVhbihyaWdodENsaWNrKSAmJiBzZWxlY3RlZEZlYXR1cmUgJiYgaW5kZXggPT09IG1hcEluZGV4fVxuICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICBsYXllcnM9e2F2YWlsYWJsZUxheWVyc31cbiAgICAgICAgICBjdXJyZW50RmlsdGVyPXtjdXJyZW50RmlsdGVyfVxuICAgICAgICAgIG9uQ2xvc2U9e3RoaXMuX2Nsb3NlRmVhdHVyZUFjdGlvbn1cbiAgICAgICAgICBvbkRlbGV0ZUZlYXR1cmU9e3RoaXMuX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlfVxuICAgICAgICAgIG9uVG9nZ2xlTGF5ZXI9e3RoaXMuX3RvZ2dsZVBvbHlnb25GaWx0ZXJ9XG4gICAgICAgICAgcG9zaXRpb249e3Bvc2l0aW9uIHx8IG51bGx9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBFZGl0b3IgPSBSZWFjdC5tZW1vKEVkaXRvclVubWVtb2l6ZWQpIGFzIHVua25vd24gYXMgdHlwZW9mIEVkaXRvclVubWVtb2l6ZWQ7XG4gIEVkaXRvci5kaXNwbGF5TmFtZSA9ICdFZGl0b3InO1xuICByZXR1cm4gRWRpdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssV0FBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU0sSUFBQSxHQUFBSCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsbUJBQUEsR0FBQUwsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFTLElBQUEsR0FBQVQsT0FBQTtBQU9BLElBQUFVLEtBQUEsR0FBQVYsT0FBQTtBQUtBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUF1QyxJQUFBWSxlQUFBLEVBdkJ2QztBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFmLHdCQUFBZSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFK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