kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
201 lines (200 loc) • 33.7 kB
JavaScript
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("react"));
var _reactDom = require("react-dom");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _window = _interopRequireDefault(require("global/window"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = _interopRequireDefault(require("lodash.get"));
var _reselect = require("reselect");
var _featureActionPanel = _interopRequireDefault(require("./feature-action-panel"));
var _constants = require("@kepler.gl/constants");
var _layers = require("@kepler.gl/layers");
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 _constants.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, /*#__PURE__*/(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, _lodash["default"])(props, ['editor', 'selectedFeature', 'id']);
});
(0, _defineProperty2["default"])(_this, "editorFeatureSelector", function (props) {
return (0, _lodash["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 !== _constants.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 === _constants.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 _constants.KeyEvent.DOM_VK_DELETE:
case _constants.KeyEvent.DOM_VK_BACK_SPACE:
_this._onDeleteSelectedFeature();
break;
case _constants.KeyEvent.DOM_VK_ESCAPE:
// reset active drawing
if (_layers.EditorLayerUtils.isDrawingActive(true, _this.props.editor.mode)) {
_this.props.onSetEditorMode(_constants.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 = /*#__PURE__*/_react["default"].memo(EditorUnmemoized);
Editor.displayName = 'Editor';
return Editor;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3REb20iLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfd2luZG93IiwiX2NsYXNzbmFtZXMiLCJfbG9kYXNoIiwiX3Jlc2VsZWN0IiwiX2ZlYXR1cmVBY3Rpb25QYW5lbCIsIl9jb25zdGFudHMiLCJfbGF5ZXJzIiwiX2NvbnRleHQiLCJfdGVtcGxhdGVPYmplY3QiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIkRFQ0tHTF9SRU5ERVJfTEFZRVIiLCJTdHlsZWRXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJlZGl0b3JMYXllckZpbHRlciIsImxheWVyIiwiRURJVE9SX0FWQUlMQUJMRV9MQVlFUlMiLCJpbmNsdWRlcyIsInR5cGUiLCJFZGl0b3JGYWN0b3J5IiwiZGVwcyIsIkZlYXR1cmVBY3Rpb25QYW5lbEZhY3RvcnkiLCJGZWF0dXJlQWN0aW9uUGFuZWwiLCJQb3J0YWxFZGl0b3IiLCJfcmVmIiwidmlzaWJsZVBhbmVsIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJzZWxlY3RlZEZlYXR1cmUiLCJkYXRhc2V0cyIsImxheWVycyIsImN1cnJlbnRGaWx0ZXIiLCJvbkNsb3NlIiwib25EZWxldGVGZWF0dXJlIiwib25Ub2dnbGVMYXllciIsInBvc2l0aW9uIiwiY3JlYXRlRWxlbWVudCIsIlJvb3RDb250ZXh0IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwiX2NvbnRleHQkY3VycmVudCIsIkZyYWdtZW50IiwiY3JlYXRlUG9ydGFsIiwiY2xhc3NuYW1lcyIsImN1cnJlbnQiLCJkb2N1bWVudCIsImJvZHkiLCJFZGl0b3JVbm1lbW9pemVkIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwiX2RlZmluZVByb3BlcnR5MiIsInByb3BzIiwiZmlsdGVycyIsImNyZWF0ZVNlbGVjdG9yIiwiZmlsdGVyU2VsZWN0b3IiLCJzZWxlY3RlZEZlYXR1cmVJZFNlbGVjdG9yIiwic2VsZWN0ZWRGZWF0dXJlSWQiLCJmaW5kIiwiZiIsInZhbHVlIiwiaWQiLCJsYXllclNlbGVjdG9yIiwiZmlsdGVyIiwiX2xheWVyJGNvbmZpZyIsImNvbmZpZyIsImlzVmlzaWJsZSIsIkdFT0NPREVSX0xBWUVSX0lEIiwiZWRpdG9yRmVhdHVyZVNlbGVjdG9yIiwiZWRpdG9yRmVhdHVyZXMiLCJGSUxURVJfVFlQRVMiLCJwb2x5Z29uIiwibWFwIiwiX2RvY3VtZW50JGFjdGl2ZUVsZW1lIiwiYWN0aXZlRWxlbWVudCIsImV2ZW50IiwiaXNJbkZvY3VzIiwia2V5Q29kZSIsIktleUV2ZW50IiwiRE9NX1ZLX0RFTEVURSIsIkRPTV9WS19CQUNLX1NQQUNFIiwiX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlIiwiRE9NX1ZLX0VTQ0FQRSIsIkVkaXRvckxheWVyVXRpbHMiLCJpc0RyYXdpbmdBY3RpdmUiLCJlZGl0b3IiLCJtb2RlIiwib25TZXRFZGl0b3JNb2RlIiwiRURJVE9SX01PREVTIiwiRURJVCIsIm9uU2VsZWN0Iiwib25Ub2dnbGVQb2x5Z29uRmlsdGVyIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJjb21wb25lbnREaWRNb3VudCIsIldpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfb25LZXlQcmVzc2VkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMiLCJpbmRleCIsInNlbGVjdGlvbkNvbnRleHQiLCJjdXJyZW50RmlsdGVyU2VsZWN0b3IiLCJhdmFpbGFibGVMYXllcnMiLCJhdmFpbGFibGVMYXllcnNTZWxlY3RvciIsIl9yZWYyIiwicmlnaHRDbGljayIsIm1hcEluZGV4IiwiX2Nsb3NlRmVhdHVyZUFjdGlvbiIsIl90b2dnbGVQb2x5Z29uRmlsdGVyIiwiQ29tcG9uZW50IiwiRWRpdG9yIiwiUmVhY3QiLCJtZW1vIiwiZGlzcGxheU5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRpdG9yL2VkaXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBDU1NQcm9wZXJ0aWVzLCBLZXlib2FyZEV2ZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2NyZWF0ZVBvcnRhbH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBGZWF0dXJlQWN0aW9uUGFuZWxGYWN0b3J5LCB7RmVhdHVyZUFjdGlvblBhbmVsUHJvcHN9IGZyb20gJy4vZmVhdHVyZS1hY3Rpb24tcGFuZWwnO1xuaW1wb3J0IHtcbiAgRURJVE9SX0FWQUlMQUJMRV9MQVlFUlMsXG4gIEZJTFRFUl9UWVBFUyxcbiAgRURJVE9SX01PREVTLFxuICBHRU9DT0RFUl9MQVlFUl9JRCxcbiAgS2V5RXZlbnRcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMYXllciwgRWRpdG9yTGF5ZXJVdGlsc30gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtGaWx0ZXIsIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0LCBGZWF0dXJlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7RmVhdHVyZU9mLCBQb2x5Z29ufSBmcm9tICdAbmVidWxhLmdsL2VkaXQtbW9kZXMnO1xuaW1wb3J0IHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuXG5jb25zdCBERUNLR0xfUkVOREVSX0xBWUVSID0gJ2RlZmF1bHQtZGVja2dsLW92ZXJsYXktd3JhcHBlcic7XG5cbmNvbnN0IFN0eWxlZFdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xuXG5jb25zdCBlZGl0b3JMYXllckZpbHRlciA9IChsYXllcjogTGF5ZXIpID0+IEVESVRPUl9BVkFJTEFCTEVfTEFZRVJTLmluY2x1ZGVzKGxheWVyLnR5cGUgfHwgJycpO1xuXG5FZGl0b3JGYWN0b3J5LmRlcHMgPSBbRmVhdHVyZUFjdGlvblBhbmVsRmFjdG9yeV07XG5cbmludGVyZmFjZSBFZGl0b3JQcm9wcyB7XG4gIGZpbHRlcnM6IEZpbHRlcltdO1xuICBsYXllcnM6IExheWVyW107XG4gIGRhdGFzZXRzOiBEYXRhc2V0cztcbiAgZWRpdG9yOiB7c2VsZWN0ZWRGZWF0dXJlOiBGZWF0dXJlOyBtb2RlOiBzdHJpbmc7IHNlbGVjdGlvbkNvbnRleHQ/OiBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dH07XG4gIGluZGV4OiBudW1iZXI7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc3R5bGU6IENTU1Byb3BlcnRpZXM7XG4gIG9uU2VsZWN0OiAoZjogRmVhdHVyZSB8IG51bGwpID0+IGFueTtcbiAgb25TZXRFZGl0b3JNb2RlOiAobTogYW55KSA9PiB2b2lkO1xuICBvbkRlbGV0ZUZlYXR1cmU6IChmOiBGZWF0dXJlKSA9PiBhbnk7XG4gIG9uVG9nZ2xlUG9seWdvbkZpbHRlcjogKGw6IExheWVyLCBmOiBGZWF0dXJlKSA9PiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIFBvcnRhbEVkaXRvclByb3BzID0gRmVhdHVyZUFjdGlvblBhbmVsUHJvcHMgJiB7XG4gIHZpc2libGVQYW5lbDogYm9vbGVhbjtcbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRWRpdG9yRmFjdG9yeShcbiAgRmVhdHVyZUFjdGlvblBhbmVsOiBSZWFjdC5GQzxGZWF0dXJlQWN0aW9uUGFuZWxQcm9wcz5cbik6IFJlYWN0LkNvbXBvbmVudENsYXNzPEVkaXRvclByb3BzPiB7XG4gIGNvbnN0IFBvcnRhbEVkaXRvcjogUmVhY3QuRkM8UG9ydGFsRWRpdG9yUHJvcHM+ID0gKHtcbiAgICB2aXNpYmxlUGFuZWwsXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIHNlbGVjdGVkRmVhdHVyZSxcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgY3VycmVudEZpbHRlcixcbiAgICBvbkNsb3NlLFxuICAgIG9uRGVsZXRlRmVhdHVyZSxcbiAgICBvblRvZ2dsZUxheWVyLFxuICAgIHBvc2l0aW9uXG4gIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFJvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7Y29udGV4dCA9PiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHtjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICAgIDxTdHlsZWRXcmFwcGVyIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZWRpdG9yJywgY2xhc3NOYW1lKX0gc3R5bGU9e3N0eWxlfT5cbiAgICAgICAgICAgICAgICB7dmlzaWJsZVBhbmVsID8gKFxuICAgICAgICAgICAgICAgICAgPEZlYXR1cmVBY3Rpb25QYW5lbFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU9e3NlbGVjdGVkRmVhdHVyZSBhcyBGZWF0dXJlT2Y8UG9seWdvbj59XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWx0ZXI9e2N1cnJlbnRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlRmVhdHVyZT17b25EZWxldGVGZWF0dXJlfVxuICAgICAgICAgICAgICAgICAgICBvblRvZ2dsZUxheWVyPXtvblRvZ2dsZUxheWVyfVxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj17cG9zaXRpb24gfHwgbnVsbH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvU3R5bGVkV3JhcHBlcj4sXG4gICAgICAgICAgICAgIGNvbnRleHQ/LmN1cnJlbnQgPz8gZG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvUm9vdENvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfTtcbiAgY2xhc3MgRWRpdG9yVW5tZW1vaXplZCBleHRlbmRzIENvbXBvbmVudDxFZGl0b3JQcm9wcz4ge1xuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7fTtcblxuICAgIHN0YXRpYyBkaXNwbGF5TmFtZSA9ICdFZGl0b3InO1xuXG4gICAgc3RhdGUgPSB7fTtcblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleVByZXNzZWQpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleVByZXNzZWQpO1xuICAgIH1cblxuICAgIGxheWVyU2VsZWN0b3IgPSAocHJvcHM6IEVkaXRvclByb3BzKSA9PiBwcm9wcy5sYXllcnM7XG4gICAgZmlsdGVyU2VsZWN0b3IgPSAocHJvcHM6IEVkaXRvclByb3BzKSA9PiBwcm9wcy5maWx0ZXJzO1xuICAgIHNlbGVjdGVkRmVhdHVyZUlkU2VsZWN0b3IgPSAocHJvcHM6IEVkaXRvclByb3BzKSA9PlxuICAgICAgZ2V0KHByb3BzLCBbJ2VkaXRvcicsICdzZWxlY3RlZEZlYXR1cmUnLCAnaWQnXSk7XG4gICAgZWRpdG9yRmVhdHVyZVNlbGVjdG9yID0gKHByb3BzOiBFZGl0b3JQcm9wcykgPT4gZ2V0KHByb3BzLCBbJ2VkaXRvcicsICdmZWF0dXJlcyddKTtcblxuICAgIGN1cnJlbnRGaWx0ZXJTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3RvcixcbiAgICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvcixcbiAgICAgIChmaWx0ZXJzLCBzZWxlY3RlZEZlYXR1cmVJZCkgPT4gZmlsdGVycy5maW5kKGYgPT4gZi52YWx1ZSAmJiBmLnZhbHVlLmlkID09PSBzZWxlY3RlZEZlYXR1cmVJZClcbiAgICApO1xuXG4gICAgYXZhaWxhYmxlTGF5ZXJzU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmxheWVyU2VsZWN0b3IsIGxheWVycyA9PlxuICAgICAgbGF5ZXJzXG4gICAgICAgIC5maWx0ZXIoZWRpdG9yTGF5ZXJGaWx0ZXIpXG4gICAgICAgIC5maWx0ZXIobGF5ZXIgPT4gbGF5ZXIuY29uZmlnPy5pc1Zpc2libGUgJiYgbGF5ZXIuaWQgIT09IEdFT0NPREVSX0xBWUVSX0lEKVxuICAgICk7XG5cbiAgICBhbGxGZWF0dXJlc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdG9yLFxuICAgICAgdGhpcy5lZGl0b3JGZWF0dXJlU2VsZWN0b3IsXG4gICAgICAoZmlsdGVycywgZWRpdG9yRmVhdHVyZXMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAuZmlsdGVyKGYgPT4gZi50eXBlID09PSBGSUxURVJfVFlQRVMucG9seWdvbilcbiAgICAgICAgICAubWFwKGYgPT4gZi52YWx1ZSlcbiAgICAgICAgICAuY29uY2F0KGVkaXRvckZlYXR1cmVzKVxuICAgICk7XG5cbiAgICBpc0luRm9jdXMgPSAoKSA9PiBkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5pZCA9PT0gREVDS0dMX1JFTkRFUl9MQVlFUjtcblxuICAgIF9vbktleVByZXNzZWQgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzSW5Gb2N1cygpKSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICAgIGNhc2UgS2V5RXZlbnQuRE9NX1ZLX0RFTEVURTpcbiAgICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19CQUNLX1NQQUNFOlxuICAgICAgICAgICAgdGhpcy5fb25EZWxldGVTZWxlY3RlZEZlYXR1cmUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgS2V5RXZlbnQuRE9NX1ZLX0VTQ0FQRTpcbiAgICAgICAgICAgIC8vIHJlc2V0IGFjdGl2ZSBkcmF3aW5nXG4gICAgICAgICAgICBpZiAoRWRpdG9yTGF5ZXJVdGlscy5pc0RyYXdpbmdBY3RpdmUodHJ1ZSwgdGhpcy5wcm9wcy5lZGl0b3IubW9kZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vblNldEVkaXRvck1vZGUoRURJVE9SX01PREVTLkVESVQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9vbkRlbGV0ZVNlbGVjdGVkRmVhdHVyZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtlZGl0b3J9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmV9ID0gZWRpdG9yO1xuICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgICB0aGlzLnByb3BzLm9uRGVsZXRlRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfY2xvc2VGZWF0dXJlQWN0aW9uID0gKCkgPT4ge1xuICAgICAgLy8gcmVzZXQgc2VsZWN0aW9uIGNvbnRleHRcbiAgICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmV9ID0gdGhpcy5wcm9wcy5lZGl0b3I7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHNlbGVjdGVkRmVhdHVyZSk7XG4gICAgfTtcblxuICAgIF90b2dnbGVQb2x5Z29uRmlsdGVyID0gKGxheWVyOiBMYXllcikgPT4ge1xuICAgICAgY29uc3Qge3NlbGVjdGVkRmVhdHVyZX0gPSB0aGlzLnByb3BzLmVkaXRvcjtcbiAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vblRvZ2dsZVBvbHlnb25GaWx0ZXIobGF5ZXIsIHNlbGVjdGVkRmVhdHVyZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtjbGFzc05hbWUsIGRhdGFzZXRzLCBlZGl0b3IsIHN0eWxlLCBpbmRleH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge3NlbGVjdGVkRmVhdHVyZSwgc2VsZWN0aW9uQ29udGV4dH0gPSBlZGl0b3I7XG4gICAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gdGhpcy5jdXJyZW50RmlsdGVyU2VsZWN0b3IodGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBhdmFpbGFibGVMYXllcnMgPSB0aGlzLmF2YWlsYWJsZUxheWVyc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gICAgICBjb25zdCB7cmlnaHRDbGljaywgcG9zaXRpb24sIG1hcEluZGV4fSA9IHNlbGVjdGlvbkNvbnRleHQgfHwge307XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxQb3J0YWxFZGl0b3JcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU9e3NlbGVjdGVkRmVhdHVyZSBhcyBGZWF0dXJlT2Y8UG9seWdvbj59XG4gICAgICAgICAgdmlzaWJsZVBhbmVsPXtCb29sZWFuKHJpZ2h0Q2xpY2spICYmIHNlbGVjdGVkRmVhdHVyZSAmJiBpbmRleCA9PT0gbWFwSW5kZXh9XG4gICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgIGxheWVycz17YXZhaWxhYmxlTGF5ZXJzfVxuICAgICAgICAgIGN1cnJlbnRGaWx0ZXI9e2N1cnJlbnRGaWx0ZXJ9XG4gICAgICAgICAgb25DbG9zZT17dGhpcy5fY2xvc2VGZWF0dXJlQWN0aW9ufVxuICAgICAgICAgIG9uRGVsZXRlRmVhdHVyZT17dGhpcy5fb25EZWxldGVTZWxlY3RlZEZlYXR1cmV9XG4gICAgICAgICAgb25Ub2dnbGVMYXllcj17dGhpcy5fdG9nZ2xlUG9seWdvbkZpbHRlcn1cbiAgICAgICAgICBwb3NpdGlvbj17cG9zaXRpb24gfHwgbnVsbH1cbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IEVkaXRvciA9IFJlYWN0Lm1lbW8oRWRpdG9yVW5tZW1vaXplZCkgYXMgdW5rbm93biBhcyB0eXBlb2YgRWRpdG9yVW5tZW1vaXplZDtcbiAgRWRpdG9yLmRpc3BsYXlOYW1lID0gJ0VkaXRvcic7XG4gIHJldHVybiBFZGl0b3I7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFILHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTyxTQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxtQkFBQSxHQUFBTCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVMsVUFBQSxHQUFBVCxPQUFBO0FBT0EsSUFBQVUsT0FBQSxHQUFBVixPQUFBO0FBS0EsSUFBQVcsUUFBQSxHQUFBWCxPQUFBO0FBQXVDLElBQUFZLGVBQUEsRUF2QnZDO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWYsd0JBQUFlLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEs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
;