UNPKG

kepler.gl

Version:

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

190 lines (189 loc) 39 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"] = MapPopoverFactory; exports.getSelectedFeature = getSelectedFeature; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 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 _mapPopoverContent = _interopRequireDefault(require("./map-popover-content")); var _icons = require("../common/icons"); var _reactIntl = require("react-intl"); var _localization = require("@kepler.gl/localization"); var _context = require("../context"); var _layers = require("@kepler.gl/layers"); var _commonUtils = require("@kepler.gl/common-utils"); var _constants = require("@kepler.gl/constants"); var _reducers = require("@kepler.gl/reducers"); var _react2 = require("@floating-ui/react"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // 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; } var SELECTABLE_LAYERS = [_constants.LAYER_TYPES.hexagonId, _constants.LAYER_TYPES.geojson]; var MAX_WIDTH = 500; var MAX_HEIGHT = 600; var StyledMapPopover = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n\n max-width: ", "px;\n max-height: ", "px;\n padding: 14px;\n & > * + * {\n margin-top: 6px;\n }\n ", ";\n font-family: ", ";\n font-size: 11px;\n font-weight: 500;\n background-color: ", ";\n color: ", ";\n z-index: 98; /* should be below 99 which is side pane */\n overflow-x: auto;\n box-shadow: ", ";\n\n &:hover {\n background-color: ", ";\n }\n\n .primary-label {\n color: ", ";\n font-size: 10px;\n }\n\n .map-popover__layer-info,\n .coordingate-hover-info {\n & > * + * {\n margin-top: 7px;\n }\n }\n\n table {\n width: auto;\n display: grid;\n border-collapse: collapse;\n row-gap: 5px;\n column-gap: 5px;\n }\n\n .coordingate-hover-info > table {\n grid-template-columns: auto auto auto;\n }\n .map-popover__layer-info > table {\n grid-template-columns: auto auto;\n }\n\n tbody,\n tr {\n display: contents;\n }\n\n td {\n border-color: transparent;\n color: ", ";\n }\n\n td.row__value {\n text-align: right;\n font-weight: 500;\n color: ", ";\n }\n"])), MAX_WIDTH, MAX_HEIGHT, function (props) { return props.theme.scrollBar; }, function (props) { return props.theme.fontFamily; }, function (props) { return props.theme.panelBackground; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.panelBoxShadow; }, function (props) { return "".concat(props.theme.panelBackground, "dd"); }, function (props) { return props.theme.notificationColors.success; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.textColorHl; }); var PinnedButtons = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-self: center;\n align-items: center;\n justify-items: center;\n & > * + * {\n margin-left: 10px;\n }\n"]))); var PopoverContent = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n & > * + * {\n margin-top: 12px;\n }\n"]))); var StyledIcon = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) { return props.theme.activeColor; }, function (props) { return props.theme.linkBtnColor; }); var StyledSelectGeometry = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n color: ", ";\n svg {\n margin-right: 6px;\n }\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) { return props.theme.textColorHl; }, function (props) { return props.theme.linkBtnColor; }); MapPopoverFactory.deps = [_mapPopoverContent["default"]]; function getSelectedFeature(layerHoverProp) { var _layer$config, _layer$config2; var layer = layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.layer; var fieldIdx; var selectedFeature; switch (layer === null || layer === void 0 ? void 0 : layer.type) { case _constants.LAYER_TYPES.hexagonId: fieldIdx = (_layer$config = layer.config) === null || _layer$config === void 0 || (_layer$config = _layer$config.columns) === null || _layer$config === void 0 || (_layer$config = _layer$config.hex_id) === null || _layer$config === void 0 ? void 0 : _layer$config.fieldIdx; selectedFeature = (0, _commonUtils.idToPolygonGeo)({ id: (0, _reducers.getLayerHoverPropValue)(layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.data, fieldIdx) }, { isClosed: true }); break; case _constants.LAYER_TYPES.geojson: fieldIdx = (_layer$config2 = layer.config) === null || _layer$config2 === void 0 || (_layer$config2 = _layer$config2.columns) === null || _layer$config2 === void 0 || (_layer$config2 = _layer$config2.geojson) === null || _layer$config2 === void 0 ? void 0 : _layer$config2.fieldIdx; selectedFeature = (0, _layers.parseGeoJsonRawFeature)((0, _reducers.getLayerHoverPropValue)(layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.data, fieldIdx)); break; default: break; } if (selectedFeature) { return _objectSpread(_objectSpread({}, selectedFeature), {}, { // unique id should be assigned to features in the editor id: (0, _commonUtils.generateHashId)(8) }); } else { return null; } } function MapPopoverFactory(MapPopoverContent) { var MapPopover = function MapPopover(_ref) { var _layerHoverProp$layer, _layerHoverProp$layer2; var x = _ref.x, y = _ref.y, frozen = _ref.frozen, coordinate = _ref.coordinate, layerHoverProp = _ref.layerHoverProp, isBase = _ref.isBase, zoom = _ref.zoom, container = _ref.container, onClose = _ref.onClose, onSetFeatures = _ref.onSetFeatures, setSelectedFeature = _ref.setSelectedFeature, featureCollection = _ref.featureCollection; var _useState = (0, _react.useState)('start'), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), horizontalPlacement = _useState2[0], setHorizontalPlacement = _useState2[1]; var moveLeft = function moveLeft() { return setHorizontalPlacement('end'); }; var moveRight = function moveRight() { return setHorizontalPlacement('start'); }; var rootContext = (0, _react.useContext)(_context.RootContext); var _useFloating = (0, _react2.useFloating)({ placement: "".concat(horizontalPlacement == 'end' ? 'left' : 'right', "-start"), middleware: [(0, _react2.offset)({ mainAxis: 20, alignmentAxis: 20 }), (0, _react2.flip)()] }), refs = _useFloating.refs, context = _useFloating.context, floatingStyles = _useFloating.floatingStyles; var onSetSelectedFeature = (0, _react.useCallback)(function () { var clickContext = { mapIndex: 0, rightClick: true, position: { x: x, y: y } }; var selectedFeature = getSelectedFeature(layerHoverProp); if (selectedFeature) { setSelectedFeature(selectedFeature, clickContext); var updatedFeatures = featureCollection ? [].concat((0, _toConsumableArray2["default"])(featureCollection.features), [selectedFeature]) : [selectedFeature]; onSetFeatures(updatedFeatures); } onClose(); }, [onClose, onSetFeatures, x, y, setSelectedFeature, layerHoverProp, featureCollection]); var containerBounds = container === null || container === void 0 ? void 0 : container.getBoundingClientRect(); var clientPoint = (0, _react2.useClientPoint)(context, { x: ((containerBounds === null || containerBounds === void 0 ? void 0 : containerBounds.left) || 0) + x, y: ((containerBounds === null || containerBounds === void 0 ? void 0 : containerBounds.top) || 0) + y }); var _useInteractions = (0, _react2.useInteractions)([clientPoint]), getFloatingProps = _useInteractions.getFloatingProps; return /*#__PURE__*/_react["default"].createElement(_react2.FloatingPortal, { root: rootContext === null || rootContext === void 0 ? void 0 : rootContext.current }, /*#__PURE__*/_react["default"].createElement(StyledMapPopover, (0, _extends2["default"])({ className: "map-popover", ref: refs.setFloating, style: floatingStyles }, getFloatingProps()), frozen ? /*#__PURE__*/_react["default"].createElement(PinnedButtons, null, horizontalPlacement === 'start' && /*#__PURE__*/_react["default"].createElement(StyledIcon, { className: "popover-arrow-left", onClick: moveLeft }, /*#__PURE__*/_react["default"].createElement(_icons.ArrowLeft, null)), /*#__PURE__*/_react["default"].createElement(StyledIcon, { className: "popover-pin", onClick: onClose }, /*#__PURE__*/_react["default"].createElement(_icons.Pin, { height: "16px" })), horizontalPlacement === 'end' && /*#__PURE__*/_react["default"].createElement(StyledIcon, { className: "popover-arrow-right", onClick: moveRight }, /*#__PURE__*/_react["default"].createElement(_icons.ArrowRight, null)), isBase && /*#__PURE__*/_react["default"].createElement("div", { className: "primary-label" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: "mapPopover.primary" }))) : null, /*#__PURE__*/_react["default"].createElement(PopoverContent, null, /*#__PURE__*/_react["default"].createElement(MapPopoverContent, { coordinate: coordinate, zoom: zoom, layerHoverProp: layerHoverProp })), layerHoverProp !== null && layerHoverProp !== void 0 && (_layerHoverProp$layer = layerHoverProp.layer) !== null && _layerHoverProp$layer !== void 0 && _layerHoverProp$layer.type && SELECTABLE_LAYERS.includes(layerHoverProp === null || layerHoverProp === void 0 || (_layerHoverProp$layer2 = layerHoverProp.layer) === null || _layerHoverProp$layer2 === void 0 ? void 0 : _layerHoverProp$layer2.type) && frozen ? /*#__PURE__*/_react["default"].createElement(StyledSelectGeometry, { className: "select-geometry", onClick: onSetSelectedFeature }, /*#__PURE__*/_react["default"].createElement(_icons.CursorPoint, null), "Select Geometry") : null)); }; return (0, _reactIntl.injectIntl)(MapPopover); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFwUG9wb3ZlckNvbnRlbnQiLCJfaWNvbnMiLCJfcmVhY3RJbnRsIiwiX2xvY2FsaXphdGlvbiIsIl9jb250ZXh0IiwiX2xheWVycyIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfcmVkdWNlcnMiLCJfcmVhY3QyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlNFTEVDVEFCTEVfTEFZRVJTIiwiTEFZRVJfVFlQRVMiLCJoZXhhZ29uSWQiLCJnZW9qc29uIiwiTUFYX1dJRFRIIiwiTUFYX0hFSUdIVCIsIlN0eWxlZE1hcFBvcG92ZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJzY3JvbGxCYXIiLCJmb250RmFtaWx5IiwicGFuZWxCYWNrZ3JvdW5kIiwidGV4dENvbG9yIiwicGFuZWxCb3hTaGFkb3ciLCJjb25jYXQiLCJub3RpZmljYXRpb25Db2xvcnMiLCJzdWNjZXNzIiwidGV4dENvbG9ySGwiLCJQaW5uZWRCdXR0b25zIiwiUG9wb3ZlckNvbnRlbnQiLCJTdHlsZWRJY29uIiwiYWN0aXZlQ29sb3IiLCJsaW5rQnRuQ29sb3IiLCJTdHlsZWRTZWxlY3RHZW9tZXRyeSIsIk1hcFBvcG92ZXJGYWN0b3J5IiwiZGVwcyIsIk1hcFBvcG92ZXJDb250ZW50RmFjdG9yeSIsImdldFNlbGVjdGVkRmVhdHVyZSIsImxheWVySG92ZXJQcm9wIiwiX2xheWVyJGNvbmZpZyIsIl9sYXllciRjb25maWcyIiwibGF5ZXIiLCJmaWVsZElkeCIsInNlbGVjdGVkRmVhdHVyZSIsInR5cGUiLCJjb25maWciLCJjb2x1bW5zIiwiaGV4X2lkIiwiaWRUb1BvbHlnb25HZW8iLCJpZCIsImdldExheWVySG92ZXJQcm9wVmFsdWUiLCJkYXRhIiwiaXNDbG9zZWQiLCJwYXJzZUdlb0pzb25SYXdGZWF0dXJlIiwiZ2VuZXJhdGVIYXNoSWQiLCJNYXBQb3BvdmVyQ29udGVudCIsIk1hcFBvcG92ZXIiLCJfcmVmIiwiX2xheWVySG92ZXJQcm9wJGxheWVyIiwiX2xheWVySG92ZXJQcm9wJGxheWVyMiIsIngiLCJ5IiwiZnJvemVuIiwiY29vcmRpbmF0ZSIsImlzQmFzZSIsInpvb20iLCJjb250YWluZXIiLCJvbkNsb3NlIiwib25TZXRGZWF0dXJlcyIsInNldFNlbGVjdGVkRmVhdHVyZSIsImZlYXR1cmVDb2xsZWN0aW9uIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiaG9yaXpvbnRhbFBsYWNlbWVudCIsInNldEhvcml6b250YWxQbGFjZW1lbnQiLCJtb3ZlTGVmdCIsIm1vdmVSaWdodCIsInJvb3RDb250ZXh0IiwidXNlQ29udGV4dCIsIlJvb3RDb250ZXh0IiwiX3VzZUZsb2F0aW5nIiwidXNlRmxvYXRpbmciLCJwbGFjZW1lbnQiLCJtaWRkbGV3YXJlIiwib2Zmc2V0IiwibWFpbkF4aXMiLCJhbGlnbm1lbnRBeGlzIiwiZmxpcCIsInJlZnMiLCJjb250ZXh0IiwiZmxvYXRpbmdTdHlsZXMiLCJvblNldFNlbGVjdGVkRmVhdHVyZSIsInVzZUNhbGxiYWNrIiwiY2xpY2tDb250ZXh0IiwibWFwSW5kZXgiLCJyaWdodENsaWNrIiwicG9zaXRpb24iLCJ1cGRhdGVkRmVhdHVyZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZmVhdHVyZXMiLCJjb250YWluZXJCb3VuZHMiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRQb2ludCIsInVzZUNsaWVudFBvaW50IiwibGVmdCIsInRvcCIsIl91c2VJbnRlcmFjdGlvbnMiLCJ1c2VJbnRlcmFjdGlvbnMiLCJnZXRGbG9hdGluZ1Byb3BzIiwiY3JlYXRlRWxlbWVudCIsIkZsb2F0aW5nUG9ydGFsIiwicm9vdCIsImN1cnJlbnQiLCJfZXh0ZW5kczIiLCJjbGFzc05hbWUiLCJyZWYiLCJzZXRGbG9hdGluZyIsInN0eWxlIiwib25DbGljayIsIkFycm93TGVmdCIsIlBpbiIsImhlaWdodCIsIkFycm93UmlnaHQiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaW5jbHVkZXMiLCJDdXJzb3JQb2ludCIsImluamVjdEludGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwL21hcC1wb3BvdmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IE1hcFBvcG92ZXJDb250ZW50RmFjdG9yeSBmcm9tICcuL21hcC1wb3BvdmVyLWNvbnRlbnQnO1xuaW1wb3J0IHtQaW4sIEFycm93TGVmdCwgQXJyb3dSaWdodCwgQ3Vyc29yUG9pbnR9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHtwYXJzZUdlb0pzb25SYXdGZWF0dXJlfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkLCBpZFRvUG9seWdvbkdlb30gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtMQVlFUl9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMYXllckhvdmVyUHJvcCwgZ2V0TGF5ZXJIb3ZlclByb3BWYWx1ZX0gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG5pbXBvcnQge0ZlYXR1cmUsIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIEZsb2F0aW5nUG9ydGFsLFxuICBmbGlwLFxuICBvZmZzZXQsXG4gIHVzZUNsaWVudFBvaW50LFxuICB1c2VGbG9hdGluZyxcbiAgdXNlSW50ZXJhY3Rpb25zXG59IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdCc7XG5cbmNvbnN0IFNFTEVDVEFCTEVfTEFZRVJTOiBzdHJpbmdbXSA9IFtMQVlFUl9UWVBFUy5oZXhhZ29uSWQsIExBWUVSX1RZUEVTLmdlb2pzb25dO1xuY29uc3QgTUFYX1dJRFRIID0gNTAwO1xuY29uc3QgTUFYX0hFSUdIVCA9IDYwMDtcblxuY29uc3QgU3R5bGVkTWFwUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgbWF4LXdpZHRoOiAke01BWF9XSURUSH1weDtcbiAgbWF4LWhlaWdodDogJHtNQVhfSEVJR0hUfXB4O1xuICBwYWRkaW5nOiAxNHB4O1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDZweDtcbiAgfVxuICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNjcm9sbEJhcn07XG4gIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHl9O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgei1pbmRleDogOTg7IC8qIHNob3VsZCBiZSBiZWxvdyA5OSB3aGljaCBpcyBzaWRlIHBhbmUgKi9cbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJveFNoYWRvd307XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBgJHtwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9ZGRgfTtcbiAgfVxuXG4gIC5wcmltYXJ5LWxhYmVsIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ub3RpZmljYXRpb25Db2xvcnMuc3VjY2Vzc307XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICB9XG5cbiAgLm1hcC1wb3BvdmVyX19sYXllci1pbmZvLFxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyB7XG4gICAgJiA+ICogKyAqIHtcbiAgICAgIG1hcmdpbi10b3A6IDdweDtcbiAgICB9XG4gIH1cblxuICB0YWJsZSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIHJvdy1nYXA6IDVweDtcbiAgICBjb2x1bW4tZ2FwOiA1cHg7XG4gIH1cblxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byBhdXRvO1xuICB9XG4gIC5tYXAtcG9wb3Zlcl9fbGF5ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0bztcbiAgfVxuXG4gIHRib2R5LFxuICB0ciB7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gIH1cblxuICB0ZCB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICB9XG5cbiAgdGQucm93X192YWx1ZSB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIH1cbmA7XG5cbmNvbnN0IFBpbm5lZEJ1dHRvbnMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgJiA+ICogKyAqIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgUG9wb3ZlckNvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDEycHg7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5hY3RpdmVDb2xvcn07XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFNlbGVjdEdlb21ldHJ5ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICBzdmcge1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICB9XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gIH1cbmA7XG5cbk1hcFBvcG92ZXJGYWN0b3J5LmRlcHMgPSBbTWFwUG9wb3ZlckNvbnRlbnRGYWN0b3J5XTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGVkRmVhdHVyZShsYXllckhvdmVyUHJvcDogTGF5ZXJIb3ZlclByb3AgfCBudWxsKTogRmVhdHVyZSB8IG51bGwge1xuICBjb25zdCBsYXllciA9IGxheWVySG92ZXJQcm9wPy5sYXllcjtcbiAgbGV0IGZpZWxkSWR4O1xuICBsZXQgc2VsZWN0ZWRGZWF0dXJlO1xuICBzd2l0Y2ggKGxheWVyPy50eXBlKSB7XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5oZXhhZ29uSWQ6XG4gICAgICBmaWVsZElkeCA9IGxheWVyLmNvbmZpZz8uY29sdW1ucz8uaGV4X2lkPy5maWVsZElkeDtcbiAgICAgIHNlbGVjdGVkRmVhdHVyZSA9IGlkVG9Qb2x5Z29uR2VvKFxuICAgICAgICB7aWQ6IGdldExheWVySG92ZXJQcm9wVmFsdWUobGF5ZXJIb3ZlclByb3A/LmRhdGEsIGZpZWxkSWR4KX0sXG4gICAgICAgIHtpc0Nsb3NlZDogdHJ1ZX1cbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIExBWUVSX1RZUEVTLmdlb2pzb246XG4gICAgICBmaWVsZElkeCA9IGxheWVyLmNvbmZpZz8uY29sdW1ucz8uZ2VvanNvbj8uZmllbGRJZHg7XG4gICAgICBzZWxlY3RlZEZlYXR1cmUgPSBwYXJzZUdlb0pzb25SYXdGZWF0dXJlKFxuICAgICAgICBnZXRMYXllckhvdmVyUHJvcFZhbHVlKGxheWVySG92ZXJQcm9wPy5kYXRhLCBmaWVsZElkeClcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNlbGVjdGVkRmVhdHVyZSxcbiAgICAgIC8vIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gZmVhdHVyZXMgaW4gdGhlIGVkaXRvclxuICAgICAgaWQ6IGdlbmVyYXRlSGFzaElkKDgpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNYXBQb3BvdmVyUHJvcHMgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBmcm96ZW4/OiBib29sZWFuO1xuICBjb29yZGluYXRlOiBbbnVtYmVyLCBudW1iZXJdIHwgYm9vbGVhbjtcbiAgbGF5ZXJIb3ZlclByb3A6IExheWVySG92ZXJQcm9wIHwgbnVsbDtcbiAgaXNCYXNlPzogYm9vbGVhbjtcbiAgem9vbTogbnVtYmVyO1xuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIG9uU2V0RmVhdHVyZXM6IChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiBhbnk7XG4gIHNldFNlbGVjdGVkRmVhdHVyZTogKGZlYXR1cmU6IEZlYXR1cmUgfCBudWxsLCBjbGlja0NvbnRleHQ/OiBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dCkgPT4gYW55O1xuICBmZWF0dXJlQ29sbGVjdGlvbj86IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZmVhdHVyZXM6IEZlYXR1cmVbXTtcbiAgfTtcbn07XG5cbnR5cGUgSW50bFByb3BzID0ge1xuICBpbnRsOiBJbnRsU2hhcGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXBQb3BvdmVyRmFjdG9yeShcbiAgTWFwUG9wb3ZlckNvbnRlbnQ6IFJldHVyblR5cGU8dHlwZW9mIE1hcFBvcG92ZXJDb250ZW50RmFjdG9yeT5cbikge1xuICBjb25zdCBNYXBQb3BvdmVyOiBSZWFjdC5GQzxNYXBQb3BvdmVyUHJvcHMgJiBJbnRsUHJvcHM+ID0gKHtcbiAgICB4LFxuICAgIHksXG4gICAgZnJvemVuLFxuICAgIGNvb3JkaW5hdGUsXG4gICAgbGF5ZXJIb3ZlclByb3AsXG4gICAgaXNCYXNlLFxuICAgIHpvb20sXG4gICAgY29udGFpbmVyLFxuICAgIG9uQ2xvc2UsXG4gICAgb25TZXRGZWF0dXJlcyxcbiAgICBzZXRTZWxlY3RlZEZlYXR1cmUsXG4gICAgZmVhdHVyZUNvbGxlY3Rpb25cbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtob3Jpem9udGFsUGxhY2VtZW50LCBzZXRIb3Jpem9udGFsUGxhY2VtZW50XSA9IHVzZVN0YXRlKCdzdGFydCcpO1xuICAgIGNvbnN0IG1vdmVMZWZ0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnZW5kJyk7XG4gICAgY29uc3QgbW92ZVJpZ2h0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnc3RhcnQnKTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZUNvbnRleHQoUm9vdENvbnRleHQpO1xuICAgIGNvbnN0IHtyZWZzLCBjb250ZXh0LCBmbG9hdGluZ1N0eWxlc30gPSB1c2VGbG9hdGluZyh7XG4gICAgICBwbGFjZW1lbnQ6IGAke2hvcml6b250YWxQbGFjZW1lbnQgPT0gJ2VuZCcgPyAnbGVmdCcgOiAncmlnaHQnfS1zdGFydGAsXG4gICAgICBtaWRkbGV3YXJlOiBbb2Zmc2V0KHttYWluQXhpczogMjAsIGFsaWdubWVudEF4aXM6IDIwfSksIGZsaXAoKV1cbiAgICB9KTtcbiAgICBjb25zdCBvblNldFNlbGVjdGVkRmVhdHVyZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWNrQ29udGV4dCA9IHtcbiAgICAgICAgbWFwSW5kZXg6IDAsXG4gICAgICAgIHJpZ2h0Q2xpY2s6IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiB7eCwgeX1cbiAgICAgIH07XG4gICAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSBnZXRTZWxlY3RlZEZlYXR1cmUobGF5ZXJIb3ZlclByb3ApO1xuICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgICBzZXRTZWxlY3RlZEZlYXR1cmUoc2VsZWN0ZWRGZWF0dXJlLCBjbGlja0NvbnRleHQpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmVhdHVyZXMgPSBmZWF0dXJlQ29sbGVjdGlvblxuICAgICAgICAgID8gWy4uLmZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLCBzZWxlY3RlZEZlYXR1cmVdXG4gICAgICAgICAgOiBbc2VsZWN0ZWRGZWF0dXJlXTtcbiAgICAgICAgb25TZXRGZWF0dXJlcyh1cGRhdGVkRmVhdHVyZXMpO1xuICAgICAgfVxuICAgICAgb25DbG9zZSgpO1xuICAgIH0sIFtvbkNsb3NlLCBvblNldEZlYXR1cmVzLCB4LCB5LCBzZXRTZWxlY3RlZEZlYXR1cmUsIGxheWVySG92ZXJQcm9wLCBmZWF0dXJlQ29sbGVjdGlvbl0pO1xuXG4gICAgY29uc3QgY29udGFpbmVyQm91bmRzID0gY29udGFpbmVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjbGllbnRQb2ludCA9IHVzZUNsaWVudFBvaW50KGNvbnRleHQsIHtcbiAgICAgIHg6IChjb250YWluZXJCb3VuZHM/LmxlZnQgfHwgMCkgKyB4LFxuICAgICAgeTogKGNvbnRhaW5lckJvdW5kcz8udG9wIHx8IDApICsgeVxuICAgIH0pO1xuICAgIGNvbnN0IHtnZXRGbG9hdGluZ1Byb3BzfSA9IHVzZUludGVyYWN0aW9ucyhbY2xpZW50UG9pbnRdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RmxvYXRpbmdQb3J0YWwgcm9vdD17cm9vdENvbnRleHQ/LmN1cnJlbnR9PlxuICAgICAgICA8U3R5bGVkTWFwUG9wb3ZlclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyXCJcbiAgICAgICAgICByZWY9e3JlZnMuc2V0RmxvYXRpbmd9XG4gICAgICAgICAgc3R5bGU9e2Zsb2F0aW5nU3R5bGVzfVxuICAgICAgICAgIHsuLi5nZXRGbG9hdGluZ1Byb3BzKCl9XG4gICAgICAgID5cbiAgICAgICAgICB7ZnJvemVuID8gKFxuICAgICAgICAgICAgPFBpbm5lZEJ1dHRvbnM+XG4gICAgICAgICAgICAgIHtob3Jpem9udGFsUGxhY2VtZW50ID09PSAnc3RhcnQnICYmIChcbiAgICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLWFycm93LWxlZnRcIiBvbkNsaWNrPXttb3ZlTGVmdH0+XG4gICAgICAgICAgICAgICAgICA8QXJyb3dMZWZ0IC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRJY29uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLXBpblwiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgICAgICAgIDxQaW4gaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAge2hvcml6b250YWxQbGFjZW1lbnQgPT09ICdlbmQnICYmIChcbiAgICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLWFycm93LXJpZ2h0XCIgb25DbGljaz17bW92ZVJpZ2h0fT5cbiAgICAgICAgICAgICAgICAgIDxBcnJvd1JpZ2h0IC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRJY29uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXNCYXNlICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInByaW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwibWFwUG9wb3Zlci5wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvUGlubmVkQnV0dG9ucz5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQ+XG4gICAgICAgICAgICA8TWFwUG9wb3ZlckNvbnRlbnRcbiAgICAgICAgICAgICAgY29vcmRpbmF0ZT17Y29vcmRpbmF0ZX1cbiAgICAgICAgICAgICAgem9vbT17em9vbX1cbiAgICAgICAgICAgICAgbGF5ZXJIb3ZlclByb3A9e2xheWVySG92ZXJQcm9wfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICAgIHtsYXllckhvdmVyUHJvcD8ubGF5ZXI/LnR5cGUgJiZcbiAgICAgICAgICBTRUxFQ1RBQkxFX0xBWUVSUy5pbmNsdWRlcyhsYXllckhvdmVyUHJvcD8ubGF5ZXI/LnR5cGUpICYmXG4gICAgICAgICAgZnJvemVuID8gKFxuICAgICAgICAgICAgPFN0eWxlZFNlbGVjdEdlb21ldHJ5IGNsYXNzTmFtZT1cInNlbGVjdC1nZW9tZXRyeVwiIG9uQ2xpY2s9e29uU2V0U2VsZWN0ZWRGZWF0dXJlfT5cbiAgICAgICAgICAgICAgPEN1cnNvclBvaW50IC8+XG4gICAgICAgICAgICAgIFNlbGVjdCBHZW9tZXRyeVxuICAgICAgICAgICAgPC9TdHlsZWRTZWxlY3RHZW9tZXRyeT5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9TdHlsZWRNYXBQb3BvdmVyPlxuICAgICAgPC9GbG9hdGluZ1BvcnRhbD5cbiAgICApO1xuICB9O1xuICBy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