kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
186 lines (153 loc) • 23.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = MapPopoverFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _layerHoverInfo = _interopRequireDefault(require("./layer-hover-info"));
var _coordinateInfo = _interopRequireDefault(require("./coordinate-info"));
var _icons = require("../common/icons");
var _reactIntl = require("react-intl");
var _localization = require("../../localization");
var _headless = _interopRequireDefault(require("@tippyjs/react/headless"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
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 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: 1000;\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 &.popover-pin {\n transform: rotate(30deg);\n }\n\n :hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) {
return props.theme.activeColor;
}, function (props) {
return props.theme.linkBtnColor;
});
MapPopoverFactory.deps = [_layerHoverInfo["default"], _coordinateInfo["default"]];
function createVirtualReference(container, x, y) {
var size = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
var bounds = container && container.getBoundingClientRect ? container.getBoundingClientRect() : {};
var left = (bounds.left || 0) + x - size / 2;
var top = (bounds.top || 0) + y - size / 2;
return {
left: left,
top: top,
right: left + size,
bottom: top + size,
width: size,
height: size
};
}
function getOffsetForPlacement(_ref) {
var placement = _ref.placement,
reference = _ref.reference,
popper = _ref.popper;
var gap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 20;
switch (placement) {
case 'top-start':
case 'bottom-start':
return [gap, gap];
case 'top-end':
case 'bottom-end':
return [-gap, gap];
default:
return [0, 0];
}
}
function getPopperOptions(container) {
return {
modifiers: [{
name: 'preventOverflow',
options: {
boundary: container
}
}]
};
}
function MapPopoverFactory(LayerHoverInfo, CoordinateInfo) {
/** @type {typeof import('./map-popover').MapPopover} */
var MapPopover = function MapPopover(_ref2) {
var x = _ref2.x,
y = _ref2.y,
frozen = _ref2.frozen,
coordinate = _ref2.coordinate,
layerHoverProp = _ref2.layerHoverProp,
isBase = _ref2.isBase,
zoom = _ref2.zoom,
container = _ref2.container,
onClose = _ref2.onClose;
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');
};
return /*#__PURE__*/_react["default"].createElement(_headless["default"], {
popperOptions: getPopperOptions(container),
zIndex: 999
/* should be below Modal which has zIndex=1000 */
,
visible: true,
interactive: true,
getReferenceClientRect: function getReferenceClientRect() {
return createVirtualReference(container, x, y);
} // @ts-ignore
,
placement: "bottom-".concat(horizontalPlacement) // @ts-ignore
,
offset: getOffsetForPlacement,
appendTo: document.body,
render: function render(attrs) {
return /*#__PURE__*/_react["default"].createElement(StyledMapPopover, (0, _extends2["default"])({}, attrs, {
className: "map-popover"
}), 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, Array.isArray(coordinate) && /*#__PURE__*/_react["default"].createElement(CoordinateInfo, {
coordinate: coordinate,
zoom: zoom
}), layerHoverProp && /*#__PURE__*/_react["default"].createElement(LayerHoverInfo, layerHoverProp)));
}
});
};
return (0, _reactIntl.injectIntl)(MapPopover);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtcG9wb3Zlci5qcyJdLCJuYW1lcyI6WyJNQVhfV0lEVEgiLCJNQVhfSEVJR0hUIiwiU3R5bGVkTWFwUG9wb3ZlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzY3JvbGxCYXIiLCJmb250RmFtaWx5IiwicGFuZWxCYWNrZ3JvdW5kIiwidGV4dENvbG9yIiwicGFuZWxCb3hTaGFkb3ciLCJub3RpZmljYXRpb25Db2xvcnMiLCJzdWNjZXNzIiwidGV4dENvbG9ySGwiLCJQaW5uZWRCdXR0b25zIiwiUG9wb3ZlckNvbnRlbnQiLCJTdHlsZWRJY29uIiwiYWN0aXZlQ29sb3IiLCJsaW5rQnRuQ29sb3IiLCJNYXBQb3BvdmVyRmFjdG9yeSIsImRlcHMiLCJMYXllckhvdmVySW5mb0ZhY3RvcnkiLCJDb29yZGluYXRlSW5mb0ZhY3RvcnkiLCJjcmVhdGVWaXJ0dWFsUmVmZXJlbmNlIiwiY29udGFpbmVyIiwieCIsInkiLCJzaXplIiwiYm91bmRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwid2lkdGgiLCJoZWlnaHQiLCJnZXRPZmZzZXRGb3JQbGFjZW1lbnQiLCJwbGFjZW1lbnQiLCJyZWZlcmVuY2UiLCJwb3BwZXIiLCJnYXAiLCJnZXRQb3BwZXJPcHRpb25zIiwibW9kaWZpZXJzIiwibmFtZSIsIm9wdGlvbnMiLCJib3VuZGFyeSIsIkxheWVySG92ZXJJbmZvIiwiQ29vcmRpbmF0ZUluZm8iLCJNYXBQb3BvdmVyIiwiZnJvemVuIiwiY29vcmRpbmF0ZSIsImxheWVySG92ZXJQcm9wIiwiaXNCYXNlIiwiem9vbSIsIm9uQ2xvc2UiLCJob3Jpem9udGFsUGxhY2VtZW50Iiwic2V0SG9yaXpvbnRhbFBsYWNlbWVudCIsIm1vdmVMZWZ0IiwibW92ZVJpZ2h0IiwiZG9jdW1lbnQiLCJib2R5IiwiYXR0cnMiLCJBcnJheSIsImlzQXJyYXki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LHFCQUF0QjtBQUE0QyxVQUFBLE9BQU8sRUFBRUc7QUFBckQsd0JBQ0UsZ0NBQUMsaUJBQUQsT0FERixDQVZKLEVBY0dOLE1BQU0saUJBQ0w7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLHdCQUNFLGdDQUFDLDhCQUFEO0FBQWtCLFVBQUEsRUFBRSxFQUFDO0FBQXJCLFVBREYsQ0FmSixDQURLLEdBcUJILElBdEJOLGVBdUJFLGdDQUFDLGNBQUQsUUFDR1UsS0FBSyxDQUFDQyxPQUFOLENBQWNiLFVBQWQsa0JBQTZCLGdDQUFDLGNBQUQ7QUFBZ0IsVUFBQSxVQUFVLEVBQUVBLFVBQTVCO0FBQXdDLFVBQUEsSUFBSSxFQUFFRztBQUE5QyxVQURoQyxFQUVHRixjQUFjLGlCQUFJLGdDQUFDLGNBQUQsRUFBb0JBLGNBQXBCLENBRnJCLENBdkJGLENBRFc7QUFBQTtBQVhmLE1BREY7QUE0Q0QsR0ExREQ7O0FBMkRBLFNBQU8sMkJBQVdILFVBQVgsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7dXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IExheWVySG92ZXJJbmZvRmFjdG9yeSBmcm9tICcuL2xheWVyLWhvdmVyLWluZm8nO1xuaW1wb3J0IENvb3JkaW5hdGVJbmZvRmFjdG9yeSBmcm9tICcuL2Nvb3JkaW5hdGUtaW5mbyc7XG5pbXBvcnQge0Fycm93TGVmdCwgQXJyb3dSaWdodCwgUGlufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge2luamVjdEludGx9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdsb2NhbGl6YXRpb24nO1xuaW1wb3J0IFRpcHB5IGZyb20gJ0B0aXBweWpzL3JlYWN0L2hlYWRsZXNzJztcblxuY29uc3QgTUFYX1dJRFRIID0gNTAwO1xuY29uc3QgTUFYX0hFSUdIVCA9IDYwMDtcblxuY29uc3QgU3R5bGVkTWFwUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIG1heC13aWR0aDogJHtNQVhfV0lEVEh9cHg7XG4gIG1heC1oZWlnaHQ6ICR7TUFYX0hFSUdIVH1weDtcbiAgcGFkZGluZzogMTRweDtcbiAgJiA+ICogKyAqIHtcbiAgICBtYXJnaW4tdG9wOiA2cHg7XG4gIH1cbiAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zY3JvbGxCYXJ9O1xuICBmb250LWZhbWlseTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250RmFtaWx5fTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZH07XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIHotaW5kZXg6IDEwMDA7XG4gIG92ZXJmbG93LXg6IGF1dG87XG4gIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCb3hTaGFkb3d9O1xuXG4gIDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBgJHtwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9ZGRgfTtcbiAgfVxuXG4gIC5wcmltYXJ5LWxhYmVsIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ub3RpZmljYXRpb25Db2xvcnMuc3VjY2Vzc307XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICB9XG5cbiAgLm1hcC1wb3BvdmVyX19sYXllci1pbmZvLFxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyB7XG4gICAgJiA+ICogKyAqIHtcbiAgICAgIG1hcmdpbi10b3A6IDdweDtcbiAgICB9XG4gIH1cblxuICB0YWJsZSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIHJvdy1nYXA6IDVweDtcbiAgICBjb2x1bW4tZ2FwOiA1cHg7XG4gIH1cblxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byBhdXRvO1xuICB9XG4gIC5tYXAtcG9wb3Zlcl9fbGF5ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0bztcbiAgfVxuXG4gIHRib2R5LFxuICB0ciB7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gIH1cblxuICB0ZCB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICB9XG5cbiAgdGQucm93X192YWx1ZSB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIH1cbmA7XG5cbmNvbnN0IFBpbm5lZEJ1dHRvbnMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgJiA+ICogKyAqIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgUG9wb3ZlckNvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDEycHg7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5hY3RpdmVDb2xvcn07XG5cbiAgJi5wb3BvdmVyLXBpbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzBkZWcpO1xuICB9XG5cbiAgOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgfVxuYDtcblxuTWFwUG9wb3ZlckZhY3RvcnkuZGVwcyA9IFtMYXllckhvdmVySW5mb0ZhY3RvcnksIENvb3JkaW5hdGVJbmZvRmFjdG9yeV07XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UoY29udGFpbmVyLCB4LCB5LCBzaXplID0gMCkge1xuICBjb25zdCBib3VuZHMgPVxuICAgIGNvbnRhaW5lciAmJiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDoge307XG4gIGNvbnN0IGxlZnQgPSAoYm91bmRzLmxlZnQgfHwgMCkgKyB4IC0gc2l6ZSAvIDI7XG4gIGNvbnN0IHRvcCA9IChib3VuZHMudG9wIHx8IDApICsgeSAtIHNpemUgLyAyO1xuICByZXR1cm4ge1xuICAgIGxlZnQsXG4gICAgdG9wLFxuICAgIHJpZ2h0OiBsZWZ0ICsgc2l6ZSxcbiAgICBib3R0b206IHRvcCArIHNpemUsXG4gICAgd2lkdGg6IHNpemUsXG4gICAgaGVpZ2h0OiBzaXplXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldEZvclBsYWNlbWVudCh7cGxhY2VtZW50LCByZWZlcmVuY2UsIHBvcHBlcn0sIGdhcCA9IDIwKSB7XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wLXN0YXJ0JzpcbiAgICBjYXNlICdib3R0b20tc3RhcnQnOlxuICAgICAgcmV0dXJuIFtnYXAsIGdhcF07XG4gICAgY2FzZSAndG9wLWVuZCc6XG4gICAgY2FzZSAnYm90dG9tLWVuZCc6XG4gICAgICByZXR1cm4gWy1nYXAsIGdhcF07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbMCwgMF07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9wcGVyT3B0aW9ucyhjb250YWluZXIpIHtcbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllcnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogY29udGFpbmVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hcFBvcG92ZXJGYWN0b3J5KExheWVySG92ZXJJbmZvLCBDb29yZGluYXRlSW5mbykge1xuICAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vbWFwLXBvcG92ZXInKS5NYXBQb3BvdmVyfSAqL1xuICBjb25zdCBNYXBQb3BvdmVyID0gKHtcbiAgICB4LFxuICAgIHksXG4gICAgZnJvemVuLFxuICAgIGNvb3JkaW5hdGUsXG4gICAgbGF5ZXJIb3ZlclByb3AsXG4gICAgaXNCYXNlLFxuICAgIHpvb20sXG4gICAgY29udGFpbmVyLFxuICAgIG9uQ2xvc2VcbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtob3Jpem9udGFsUGxhY2VtZW50LCBzZXRIb3Jpem9udGFsUGxhY2VtZW50XSA9IHVzZVN0YXRlKCdzdGFydCcpO1xuICAgIGNvbnN0IG1vdmVMZWZ0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnZW5kJyk7XG4gICAgY29uc3QgbW92ZVJpZ2h0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnc3RhcnQnKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFRpcHB5XG4gICAgICAgIHBvcHBlck9wdGlvbnM9e2dldFBvcHBlck9wdGlvbnMoY29udGFpbmVyKX1cbiAgICAgICAgekluZGV4PXs5OTl9IC8qIHNob3VsZCBiZSBiZWxvdyBNb2RhbCB3aGljaCBoYXMgekluZGV4PTEwMDAgKi9cbiAgICAgICAgdmlzaWJsZT17dHJ1ZX1cbiAgICAgICAgaW50ZXJhY3RpdmU9e3RydWV9XG4gICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q9eygpID0+IGNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UoY29udGFpbmVyLCB4LCB5KX1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBwbGFjZW1lbnQ9e2Bib3R0b20tJHtob3Jpem9udGFsUGxhY2VtZW50fWB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb2Zmc2V0PXtnZXRPZmZzZXRGb3JQbGFjZW1lbnR9XG4gICAgICAgIGFwcGVuZFRvPXtkb2N1bWVudC5ib2R5fVxuICAgICAgICByZW5kZXI9e2F0dHJzID0+IChcbiAgICAgICAgICA8U3R5bGVkTWFwUG9wb3ZlciB7Li4uYXR0cnN9IGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyXCI+XG4gICAgICAgICAgICB7ZnJvemVuID8gKFxuICAgICAgICAgICAgICA8UGlubmVkQnV0dG9ucz5cbiAgICAgICAgICAgICAgICB7aG9yaXpvbnRhbFBsYWNlbWVudCA9PT0gJ3N0YXJ0JyAmJiAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLWFycm93LWxlZnRcIiBvbkNsaWNrPXttb3ZlTGVmdH0+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvd0xlZnQgLz5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxTdHlsZWRJY29uIGNsYXNzTmFtZT1cInBvcG92ZXItcGluXCIgb25DbGljaz17b25DbG9zZX0+XG4gICAgICAgICAgICAgICAgICA8UGluIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAgICB7aG9yaXpvbnRhbFBsYWNlbWVudCA9PT0gJ2VuZCcgJiYgKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZEljb24gY2xhc3NOYW1lPVwicG9wb3Zlci1hcnJvdy1yaWdodFwiIG9uQ2xpY2s9e21vdmVSaWdodH0+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvd1JpZ2h0IC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEljb24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7aXNCYXNlICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJpbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD1cIm1hcFBvcG92ZXIucHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1Bpbm5lZEJ1dHRvbnM+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxQb3BvdmVyQ29udGVudD5cbiAgICAgICAgICAgICAge0FycmF5LmlzQXJyYXkoY29vcmRpbmF0ZSkgJiYgPENvb3JkaW5hdGVJbmZvIGNvb3JkaW5hdGU9e2Nvb3JkaW5hdGV9IHpvb209e3pvb219IC8+fVxuICAgICAgICAgICAgICB7bGF5ZXJIb3ZlclByb3AgJiYgPExheWVySG92ZXJJbmZvIHsuLi5sYXllckhvdmVyUHJvcH0gLz59XG4gICAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICAgIDwvU3R5bGVkTWFwUG9wb3Zlcj5cbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGluamVjdEludGwoTWFwUG9wb3Zlcik7XG59XG4iXX0=