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
JavaScript
"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);
}, 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+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHl9O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgei1pbmRleDogOTg7IC8qIHNob3VsZCBiZSBiZWxvdyA5OSB3aGljaCBpcyBzaWRlIHBhbmUgKi9cbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJveFNoYWRvd307XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBgJHtwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9YH07XG4gIH1cblxuICAucHJpbWFyeS1sYWJlbCB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubm90aWZpY2F0aW9uQ29sb3JzLnN1Y2Nlc3N9O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgfVxuXG4gIC5tYXAtcG9wb3Zlcl9fbGF5ZXItaW5mbyxcbiAgLmNvb3JkaW5nYXRlLWhvdmVyLWluZm8ge1xuICAgICYgPiAqICsgKiB7XG4gICAgICBtYXJnaW4tdG9wOiA3cHg7XG4gICAgfVxuICB9XG5cbiAgdGFibGUge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICByb3ctZ2FwOiA1cHg7XG4gICAgY29sdW1uLWdhcDogNXB4O1xuICB9XG5cbiAgLmNvb3JkaW5nYXRlLWhvdmVyLWluZm8gPiB0YWJsZSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gYXV0bztcbiAgfVxuICAubWFwLXBvcG92ZXJfX2xheWVyLWluZm8gPiB0YWJsZSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG87XG4gIH1cblxuICB0Ym9keSxcbiAgdHIge1xuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICB9XG5cbiAgdGQge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgfVxuXG4gIHRkLnJvd19fdmFsdWUge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICB9XG5gO1xuXG5jb25zdCBQaW5uZWRCdXR0b25zID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7XG4gICYgPiAqICsgKiB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIH1cbmA7XG5cbmNvbnN0IFBvcG92ZXJDb250ZW50ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgJiA+ICogKyAqIHtcbiAgICBtYXJnaW4tdG9wOiAxMnB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRJY29uID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5saW5rQnRuQ29sb3J9O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRTZWxlY3RHZW9tZXRyeSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgc3ZnIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDZweDtcbiAgfVxuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5saW5rQnRuQ29sb3J9O1xuICB9XG5gO1xuXG5NYXBQb3BvdmVyRmFjdG9yeS5kZXBzID0gW01hcFBvcG92ZXJDb250ZW50RmFjdG9yeV07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RlZEZlYXR1cmUobGF5ZXJIb3ZlclByb3A6IExheWVySG92ZXJQcm9wIHwgbnVsbCk6IEZlYXR1cmUgfCBudWxsIHtcbiAgY29uc3QgbGF5ZXIgPSBsYXllckhvdmVyUHJvcD8ubGF5ZXI7XG4gIGxldCBmaWVsZElkeDtcbiAgbGV0IHNlbGVjdGVkRmVhdHVyZTtcbiAgc3dpdGNoIChsYXllcj8udHlwZSkge1xuICAgIGNhc2UgTEFZRVJfVFlQRVMuaGV4YWdvbklkOlxuICAgICAgZmllbGRJZHggPSBsYXllci5jb25maWc/LmNvbHVtbnM/LmhleF9pZD8uZmllbGRJZHg7XG4gICAgICBzZWxlY3RlZEZlYXR1cmUgPSBpZFRvUG9seWdvbkdlbyhcbiAgICAgICAge2lkOiBnZXRMYXllckhvdmVyUHJvcFZhbHVlKGxheWVySG92ZXJQcm9wPy5kYXRhLCBmaWVsZElkeCl9LFxuICAgICAgICB7aXNDbG9zZWQ6IHRydWV9XG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5nZW9qc29uOlxuICAgICAgZmllbGRJZHggPSBsYXllci5jb25maWc/LmNvbHVtbnM/Lmdlb2pzb24/LmZpZWxkSWR4O1xuICAgICAgc2VsZWN0ZWRGZWF0dXJlID0gcGFyc2VHZW9Kc29uUmF3RmVhdHVyZShcbiAgICAgICAgZ2V0TGF5ZXJIb3ZlclByb3BWYWx1ZShsYXllckhvdmVyUHJvcD8uZGF0YSwgZmllbGRJZHgpXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zZWxlY3RlZEZlYXR1cmUsXG4gICAgICAvLyB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGZlYXR1cmVzIGluIHRoZSBlZGl0b3JcbiAgICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg4KVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTWFwUG9wb3ZlclByb3BzID0ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgZnJvemVuPzogYm9vbGVhbjtcbiAgY29vcmRpbmF0ZTogW251bWJlciwgbnVtYmVyXSB8IGJvb2xlYW47XG4gIGxheWVySG92ZXJQcm9wOiBMYXllckhvdmVyUHJvcCB8IG51bGw7XG4gIGlzQmFzZT86IGJvb2xlYW47XG4gIHpvb206IG51bWJlcjtcbiAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBvbkNsb3NlOiAoKSA9PiB2b2lkO1xuICBvblNldEZlYXR1cmVzOiAoZmVhdHVyZXM6IEZlYXR1cmVbXSkgPT4gYW55O1xuICBzZXRTZWxlY3RlZEZlYXR1cmU6IChmZWF0dXJlOiBGZWF0dXJlIHwgbnVsbCwgY2xpY2tDb250ZXh0PzogRmVhdHVyZVNlbGVjdGlvbkNvbnRleHQpID0+IGFueTtcbiAgZmVhdHVyZUNvbGxlY3Rpb24/OiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGZlYXR1cmVzOiBGZWF0dXJlW107XG4gIH07XG59O1xuXG50eXBlIEludGxQcm9wcyA9IHtcbiAgaW50bDogSW50bFNoYXBlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFwUG9wb3ZlckZhY3RvcnkoXG4gIE1hcFBvcG92ZXJDb250ZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBQb3BvdmVyQ29udGVudEZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgTWFwUG9wb3ZlcjogUmVhY3QuRkM8TWFwUG9wb3ZlclByb3BzICYgSW50bFByb3BzPiA9ICh7XG4gICAgeCxcbiAgICB5LFxuICAgIGZyb3plbixcbiAgICBjb29yZGluYXRlLFxuICAgIGxheWVySG92ZXJQcm9wLFxuICAgIGlzQmFzZSxcbiAgICB6b29tLFxuICAgIGNvbnRhaW5lcixcbiAgICBvbkNsb3NlLFxuICAgIG9uU2V0RmVhdHVyZXMsXG4gICAgc2V0U2VsZWN0ZWRGZWF0dXJlLFxuICAgIGZlYXR1cmVDb2xsZWN0aW9uXG4gIH0pID0+IHtcbiAgICBjb25zdCBbaG9yaXpvbnRhbFBsYWNlbWVudCwgc2V0SG9yaXpvbnRhbFBsYWNlbWVudF0gPSB1c2VTdGF0ZSgnc3RhcnQnKTtcbiAgICBjb25zdCBtb3ZlTGVmdCA9ICgpID0+IHNldEhvcml6b250YWxQbGFjZW1lbnQoJ2VuZCcpO1xuICAgIGNvbnN0IG1vdmVSaWdodCA9ICgpID0+IHNldEhvcml6b250YWxQbGFjZW1lbnQoJ3N0YXJ0Jyk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VDb250ZXh0KFJvb3RDb250ZXh0KTtcbiAgICBjb25zdCB7cmVmcywgY29udGV4dCwgZmxvYXRpbmdTdHlsZXN9ID0gdXNlRmxvYXRpbmcoe1xuICAgICAgcGxhY2VtZW50OiBgJHtob3Jpem9udGFsUGxhY2VtZW50ID09ICdlbmQnID8gJ2xlZnQnIDogJ3JpZ2h0J30tc3RhcnRgLFxuICAgICAgbWlkZGxld2FyZTogW29mZnNldCh7bWFpbkF4aXM6IDIwLCBhbGlnbm1lbnRBeGlzOiAyMH0pLCBmbGlwKCldXG4gICAgfSk7XG4gICAgY29uc3Qgb25TZXRTZWxlY3RlZEZlYXR1cmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBjbGlja0NvbnRleHQgPSB7XG4gICAgICAgIG1hcEluZGV4OiAwLFxuICAgICAgICByaWdodENsaWNrOiB0cnVlLFxuICAgICAgICBwb3NpdGlvbjoge3gsIHl9XG4gICAgICB9O1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gZ2V0U2VsZWN0ZWRGZWF0dXJlKGxheWVySG92ZXJQcm9wKTtcbiAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRGZWF0dXJlKHNlbGVjdGVkRmVhdHVyZSwgY2xpY2tDb250ZXh0KTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZlYXR1cmVzID0gZmVhdHVyZUNvbGxlY3Rpb25cbiAgICAgICAgICA/IFsuLi5mZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcywgc2VsZWN0ZWRGZWF0dXJlXVxuICAgICAgICAgIDogW3NlbGVjdGVkRmVhdHVyZV07XG4gICAgICAgIG9uU2V0RmVhdHVyZXModXBkYXRlZEZlYXR1cmVzKTtcbiAgICAgIH1cbiAgICAgIG9uQ2xvc2UoKTtcbiAgICB9LCBbb25DbG9zZSwgb25TZXRGZWF0dXJlcywgeCwgeSwgc2V0U2VsZWN0ZWRGZWF0dXJlLCBsYXllckhvdmVyUHJvcCwgZmVhdHVyZUNvbGxlY3Rpb25dKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckJvdW5kcyA9IGNvbnRhaW5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpZW50UG9pbnQgPSB1c2VDbGllbnRQb2ludChjb250ZXh0LCB7XG4gICAgICB4OiAoY29udGFpbmVyQm91bmRzPy5sZWZ0IHx8IDApICsgeCxcbiAgICAgIHk6IChjb250YWluZXJCb3VuZHM/LnRvcCB8fCAwKSArIHlcbiAgICB9KTtcbiAgICBjb25zdCB7Z2V0RmxvYXRpbmdQcm9wc30gPSB1c2VJbnRlcmFjdGlvbnMoW2NsaWVudFBvaW50XSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEZsb2F0aW5nUG9ydGFsIHJvb3Q9e3Jvb3RDb250ZXh0Py5jdXJyZW50fT5cbiAgICAgICAgPFN0eWxlZE1hcFBvcG92ZXJcbiAgICAgICAgICBjbGFzc05hbWU9XCJtYXAtcG9wb3ZlclwiXG4gICAgICAgICAgcmVmPXtyZWZzLnNldEZsb2F0aW5nfVxuICAgICAgICAgIHN0eWxlPXtmbG9hdGluZ1N0eWxlc31cbiAgICAgICAgICB7Li4uZ2V0RmxvYXRpbmdQcm9wcygpfVxuICAgICAgICA+XG4gICAgICAgICAge2Zyb3plbiA/IChcbiAgICAgICAgICAgIDxQaW5uZWRCdXR0b25zPlxuICAgICAgICAgICAgICB7aG9yaXpvbnRhbFBsYWNlbWVudCA9PT0gJ3N0YXJ0JyAmJiAoXG4gICAgICAgICAgICAgICAgPFN0eWxlZEljb24gY2xhc3NOYW1lPVwicG9wb3Zlci1hcnJvdy1sZWZ0XCIgb25DbGljaz17bW92ZUxlZnR9PlxuICAgICAgICAgICAgICAgICAgPEFycm93TGVmdCAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPFN0eWxlZEljb24gY2xhc3NOYW1lPVwicG9wb3Zlci1waW5cIiBvbkNsaWNrPXtvbkNsb3NlfT5cbiAgICAgICAgICAgICAgICA8UGluIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgICA8L1N0eWxlZEljb24+XG4gICAgICAgICAgICAgIHtob3Jpem9udGFsUGxhY2VtZW50ID09PSAnZW5kJyAmJiAoXG4gICAgICAgICAgICAgICAgPFN0eWxlZEljb24gY2xhc3NOYW1lPVwicG9wb3Zlci1hcnJvdy1yaWdodFwiIG9uQ2xpY2s9e21vdmVSaWdodH0+XG4gICAgICAgICAgICAgICAgICA8QXJyb3dSaWdodCAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2lzQmFzZSAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcmltYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD1cIm1hcFBvcG92ZXIucHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1Bpbm5lZEJ1dHRvbnM+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPFBvcG92ZXJDb250ZW50PlxuICAgICAgICAgICAgPE1hcFBvcG92ZXJDb250ZW50XG4gICAgICAgICAgICAgIGNvb3JkaW5hdGU9e2Nvb3JkaW5hdGV9XG4gICAgICAgICAgICAgIHpvb209e3pvb219XG4gICAgICAgICAgICAgIGxheWVySG92ZXJQcm9wPXtsYXllckhvdmVyUHJvcH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgICB7bGF5ZXJIb3ZlclByb3A/LmxheWVyPy50eXBlICYmXG4gICAgICAgICAgU0VMRUNUQUJMRV9MQVlFUlMuaW5jbHVkZXMobGF5ZXJIb3ZlclByb3A/LmxheWVyPy50eXBlKSAmJlxuICAgICAgICAgIGZyb3plbiA/IChcbiAgICAgICAgICAgIDxTdHlsZWRTZWxlY3RHZW9tZXRyeSBjbGFzc05hbWU9XCJzZWxlY3QtZ2VvbWV0cnlcIiBvbkNsaWNrPXtvblNldFNlbGVjdGVkRmVhdHVyZX0+XG4gICAgICAgICAgICAgIDxDdXJzb3JQb2ludCAvPlxuICAgICAgICAgICAgICBTZWxlY3QgR2VvbWV0cnlcbiAgICAgICAgICAgIDwvU3R5bGVkU2VsZWN0R2VvbWV0cnk+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvU3R5bGVkTWFwUG9wb3Zlcj5cbiAgICAgIDwvRmxvYXRpbmdQb3J0YWw+XG4gICAgKTtcbiAgfTtcbiAgcmV0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