UNPKG

kepler.gl

Version:

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

277 lines (276 loc) 54.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _classnames = _interopRequireDefault(require("classnames")); var _reactDom = require("react-dom"); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _core = require("@dnd-kit/core"); var _utilities = require("@dnd-kit/utilities"); var _react2 = require("@floating-ui/react"); var _styles = require("@kepler.gl/styles"); var _utils = require("@kepler.gl/utils"); var _icons = require("../common/icons"); var _styledComponents2 = require("../common/styled-components"); var _context = require("../context"); var _useLegendPosition3 = _interopRequireDefault(require("../hooks/use-legend-position")); var _mapControlPanel = _interopRequireDefault(require("./map-control-panel")); var _mapControlTooltip = _interopRequireDefault(require("./map-control-tooltip")); var _mapLegend = _interopRequireDefault(require("./map-legend")); var _modifiers = require("@dnd-kit/modifiers"); var _templateObject, _templateObject2, _templateObject3, _templateObject4; // 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 DRAG_RESIZE_ID = 'map-legend-resize'; var DRAG_MOVE_ID = 'map-legend-move'; var StyledDraggableLegendContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n outline: none;\n transition: border-color 0.2s ease-in-out;\n border: 1px solid transparent;\n .legend-input-block {\n display: none;\n }\n &.is-dragging .legend-input-block {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: transparent;\n }\n &:hover,\n &.is-dragging {\n .legend-move-handle {\n opacity: 1;\n pointer-events: auto;\n }\n .legend-resize-handle {\n opacity: 1;\n pointer-events: auto;\n }\n border-color: ", ";\n }\n .map-control__panel-content {\n max-height: ", ";\n ", ";\n }\n border-radius: 4px;\n z-index: 2;\n .map-control-panel {\n margin-bottom: 0 !important;\n }\n"])), function (props) { return props.theme.activeColor; }, function (props) { return props.maxContentHeight ? "".concat(props.maxContentHeight, "px") : 'calc(100vh - 100px)'; }, function (props) { return props.contentHeight ? "height: ".concat(props.contentHeight, "px;") : ''; }); var StyledMoveHandle = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n color: white;\n z-index: 2;\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 48px;\n height: 16px;\n border-radius: 4px;\n cursor: move;\n background-color: ", ";\n"])), function (props) { return props.theme.activeColor; }); var StyledResizeHandle = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n color: #f7f8fa;\n z-index: 2;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 48px;\n height: 16px;\n border-radius: 4px;\n cursor: ns-resize;\n"]))); var StyledFixedLegendContent = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n .map-control__panel-content {\n max-height: calc(100vh - 100px);\n ", ";\n }\n\n /* Hide scrollbars in export to avoid OS default styling differences */\n .styled-color-legend {\n -ms-overflow-style: none; /* IE and old Edge */\n scrollbar-width: none; /* Firefox */\n }\n .styled-color-legend::-webkit-scrollbar {\n width: 0 !important; /* Chrome, Safari, new Edge */\n height: 0 !important;\n }\n"])), function (props) { return props.contentHeight ? "height: ".concat(props.contentHeight, "px;") : ''; }); var DraggableLegendContent = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { var positionStyles = props.positionStyles, children = props.children, contentHeight = props.contentHeight, maxContentHeight = props.maxContentHeight; var draggableMove = (0, _core.useDraggable)({ id: DRAG_MOVE_ID }); var draggableResize = (0, _core.useDraggable)({ id: DRAG_RESIZE_ID }); var refs = (0, _react2.useMergeRefs)([draggableMove.setNodeRef, ref]); var isDragging = draggableMove.isDragging || draggableResize.isDragging; return /*#__PURE__*/_react["default"].createElement(StyledDraggableLegendContent, (0, _extends2["default"])({ ref: refs, className: (0, _classnames["default"])('draggable-legend', { 'is-dragging': isDragging }), style: _objectSpread(_objectSpread({}, positionStyles), {}, { transform: _utilities.CSS.Translate.toString(draggableMove.transform) }), contentHeight: contentHeight, maxContentHeight: maxContentHeight }, draggableMove.attributes), children, isDragging ? /*#__PURE__*/_react["default"].createElement("div", { className: "legend-input-block" }) : null, /*#__PURE__*/_react["default"].createElement(StyledMoveHandle, (0, _extends2["default"])({ className: "legend-move-handle" }, draggableMove.listeners), /*#__PURE__*/_react["default"].createElement(_icons.DraggableDots, { height: "16px" })), /*#__PURE__*/_react["default"].createElement(StyledResizeHandle, (0, _extends2["default"])({ className: "legend-resize-handle", ref: draggableResize.setNodeRef }, draggableResize.listeners), /*#__PURE__*/_react["default"].createElement(_icons.HorizontalResizeHandle, { height: "16px" }))); }); var DraggableLegend = (0, _styledComponents.withTheme)(function (_ref) { var _mapControls$mapLegen; var isSidePanelShown = _ref.isSidePanelShown, children = _ref.children, mapControls = _ref.mapControls, setMapControlSettings = _ref.setMapControlSettings, mapState = _ref.mapState, theme = _ref.theme; var settings = mapControls === null || mapControls === void 0 || (_mapControls$mapLegen = mapControls.mapLegend) === null || _mapControls$mapLegen === void 0 ? void 0 : _mapControls$mapLegen.settings; var legendContentRef = (0, _react.useRef)(null); var onChangeSettings = (0, _react.useCallback)(function (newSettings) { return setMapControlSettings('mapLegend', newSettings); }, [setMapControlSettings]); var _useLegendPosition = (0, _useLegendPosition3["default"])({ legendContentRef: legendContentRef, isSidePanelShown: isSidePanelShown, theme: theme, settings: settings, onChangeSettings: onChangeSettings, mapHeight: mapState === null || mapState === void 0 ? void 0 : mapState.height, mapWidth: mapState === null || mapState === void 0 ? void 0 : mapState.width }), positionStyles = _useLegendPosition.positionStyles, updatePosition = _useLegendPosition.updatePosition, startResize = _useLegendPosition.startResize, resize = _useLegendPosition.resize, contentHeight = _useLegendPosition.contentHeight, maxContentHeight = _useLegendPosition.maxContentHeight; var handleDragStart = (0, _react.useCallback)(function (event) { switch (event.active.id) { case DRAG_RESIZE_ID: startResize(); break; default: updatePosition(); } }, [updatePosition, startResize]); var handleDragEnd = (0, _react.useCallback)(updatePosition, [updatePosition]); var handleDragMove = (0, _react.useCallback)(function (event) { switch (event.active.id) { case DRAG_RESIZE_ID: resize(event.delta.y); break; } }, [resize]); return /*#__PURE__*/_react["default"].createElement(_core.DndContext, { onDragStart: handleDragStart, onDragMove: handleDragMove, onDragEnd: handleDragEnd, modifiers: [_modifiers.restrictToWindowEdges] }, /*#__PURE__*/_react["default"].createElement(DraggableLegendContent, { ref: legendContentRef, positionStyles: positionStyles, contentHeight: contentHeight, maxContentHeight: maxContentHeight }, children)); }); var ImageExportLegend = (0, _styledComponents.withTheme)(function (_ref2) { var _containerRef$current; var settings = _ref2.settings, isSidePanelShown = _ref2.isSidePanelShown, theme = _ref2.theme, children = _ref2.children; var containerRef = (0, _react.useRef)(null); var legendContentRef = (0, _react.useRef)(null); var _useLegendPosition2 = (0, _useLegendPosition3["default"])({ legendContentRef: legendContentRef, isSidePanelShown: isSidePanelShown, theme: theme, settings: settings, onChangeSettings: function onChangeSettings() { // do nothing by default } }), positionStyles = _useLegendPosition2.positionStyles, contentHeight = _useLegendPosition2.contentHeight; var portalRoot = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 || (_containerRef$current = _containerRef$current.closest('.export-map-instance')) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.querySelector('#default-deckgl-overlay-wrapper'); return /*#__PURE__*/_react["default"].createElement("div", { ref: containerRef }, portalRoot ? /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react["default"].createElement("div", { className: "fixed-legend", ref: legendContentRef, style: _objectSpread(_objectSpread({}, positionStyles), {}, { position: 'absolute' }) }, /*#__PURE__*/_react["default"].createElement(StyledFixedLegendContent, { contentHeight: contentHeight }, children)), portalRoot) : null); }); MapLegendPanelFactory.deps = [_mapControlTooltip["default"], _mapControlPanel["default"], _mapLegend["default"]]; var defaultActionIcons = { legend: function legend(props) { return /*#__PURE__*/_react["default"].createElement(_icons.Legend, (0, _extends2["default"])({}, props, { height: "18px" })); } }; var MapLegendPanelComponent = function MapLegendPanelComponent(_ref3) { var _mapControls$mapLegen2, _rootContext$current; var layers = _ref3.layers, mapControls = _ref3.mapControls, scale = _ref3.scale, onToggleMapControl = _ref3.onToggleMapControl, isExport = _ref3.isExport, logoComponent = _ref3.logoComponent, _ref3$actionIcons = _ref3.actionIcons, actionIcons = _ref3$actionIcons === void 0 ? defaultActionIcons : _ref3$actionIcons, mapState = _ref3.mapState, onLayerVisConfigChange = _ref3.onLayerVisConfigChange, onToggleLayerVisibility = _ref3.onToggleLayerVisibility, onToggleSplitMapViewport = _ref3.onToggleSplitMapViewport, onClickControlBtn = _ref3.onClickControlBtn, activeSidePanel = _ref3.activeSidePanel, setMapControlSettings = _ref3.setMapControlSettings, _ref3$isViewportUnsyn = _ref3.isViewportUnsyncAllowed, isViewportUnsyncAllowed = _ref3$isViewportUnsyn === void 0 ? true : _ref3$isViewportUnsyn, className = _ref3.className, MapControlTooltip = _ref3.MapControlTooltip, MapControlPanel = _ref3.MapControlPanel, MapLegend = _ref3.MapLegend; var isSidePanelShown = Boolean(activeSidePanel); var settings = mapControls === null || mapControls === void 0 || (_mapControls$mapLegen2 = mapControls.mapLegend) === null || _mapControls$mapLegen2 === void 0 ? void 0 : _mapControls$mapLegen2.settings; var mapLegend = (mapControls === null || mapControls === void 0 ? void 0 : mapControls.mapLegend) || {}; var _ref4 = mapLegend || {}, active = _ref4.active, disableEdit = _ref4.disableEdit; var rootContext = (0, _react.useContext)(_context.RootContext); var onClick = (0, _react.useCallback)(function () { var _mapControls$mapDraw; onClickControlBtn === null || onClickControlBtn === void 0 || onClickControlBtn(); if (mapControls !== null && mapControls !== void 0 && (_mapControls$mapDraw = mapControls.mapDraw) !== null && _mapControls$mapDraw !== void 0 && _mapControls$mapDraw.active) { onToggleMapControl('mapDraw'); } onToggleMapControl('mapLegend'); }, [onClickControlBtn, onToggleMapControl, mapControls]); var onCloseClick = (0, _react.useCallback)(function (e) { e.preventDefault(); onToggleMapControl('mapLegend'); }, [onToggleMapControl]); if (!mapLegend.show) { return null; } var legendPanel = active ? /*#__PURE__*/_react["default"].createElement(MapControlPanel, { scale: scale, header: "header.layerLegend", onClick: onCloseClick, pinnable: false, disableClose: false, isExport: isExport, logoComponent: logoComponent, mapState: mapState, onToggleSplitMapViewport: onToggleSplitMapViewport, isViewportUnsyncAllowed: isViewportUnsyncAllowed, className: className }, /*#__PURE__*/_react["default"].createElement(MapLegend, { layers: layers, mapState: mapState, disableEdit: disableEdit, isExport: isExport, onLayerVisConfigChange: onLayerVisConfigChange, onToggleLayerVisibility: onToggleLayerVisibility })) : null; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, active ? (0, _utils.hasPortableWidth)(_styles.breakPointValues) ? legendPanel : isExport ? /*#__PURE__*/_react["default"].createElement(ImageExportLegend, { isSidePanelShown: isSidePanelShown, settings: settings }, legendPanel) : ( /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react["default"].createElement(DraggableLegend, { isSidePanelShown: isSidePanelShown, mapControls: mapControls, setMapControlSettings: setMapControlSettings, mapState: mapState }, legendPanel), (_rootContext$current = rootContext === null || rootContext === void 0 ? void 0 : rootContext.current) !== null && _rootContext$current !== void 0 ? _rootContext$current : document.body)) : null, !isExport ? /*#__PURE__*/_react["default"].createElement(MapControlTooltip, { id: "show-legend", message: "tooltip.showLegend" }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.MapControlButton, { className: "map-control-button show-legend", onClick: onClick }, /*#__PURE__*/_react["default"].createElement(actionIcons.legend, { height: "22px" }))) : null); }; function MapLegendPanelFactory(MapControlTooltip, MapControlPanel, MapLegend) { return function (props) { return /*#__PURE__*/_react["default"].createElement(MapLegendPanelComponent, (0, _extends2["default"])({}, props, { MapControlTooltip: MapControlTooltip, MapControlPanel: MapControlPanel, MapLegend: MapLegend })); }; } var _default = exports["default"] = MapLegendPanelFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0RG9tIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb3JlIiwiX3V0aWxpdGllcyIsIl9yZWFjdDIiLCJfc3R5bGVzIiwiX3V0aWxzIiwiX2ljb25zIiwiX3N0eWxlZENvbXBvbmVudHMyIiwiX2NvbnRleHQiLCJfdXNlTGVnZW5kUG9zaXRpb24zIiwiX21hcENvbnRyb2xQYW5lbCIsIl9tYXBDb250cm9sVG9vbHRpcCIsIl9tYXBMZWdlbmQiLCJfbW9kaWZpZXJzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiRFJBR19SRVNJWkVfSUQiLCJEUkFHX01PVkVfSUQiLCJTdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50Iiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwiYWN0aXZlQ29sb3IiLCJtYXhDb250ZW50SGVpZ2h0IiwiY29uY2F0IiwiY29udGVudEhlaWdodCIsIlN0eWxlZE1vdmVIYW5kbGUiLCJTdHlsZWRSZXNpemVIYW5kbGUiLCJTdHlsZWRGaXhlZExlZ2VuZENvbnRlbnQiLCJEcmFnZ2FibGVMZWdlbmRDb250ZW50IiwiZm9yd2FyZFJlZiIsInJlZiIsInBvc2l0aW9uU3R5bGVzIiwiY2hpbGRyZW4iLCJkcmFnZ2FibGVNb3ZlIiwidXNlRHJhZ2dhYmxlIiwiaWQiLCJkcmFnZ2FibGVSZXNpemUiLCJyZWZzIiwidXNlTWVyZ2VSZWZzIiwic2V0Tm9kZVJlZiIsImlzRHJhZ2dpbmciLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsInN0eWxlIiwidHJhbnNmb3JtIiwiQ1NTIiwiVHJhbnNsYXRlIiwidG9TdHJpbmciLCJhdHRyaWJ1dGVzIiwibGlzdGVuZXJzIiwiRHJhZ2dhYmxlRG90cyIsImhlaWdodCIsIkhvcml6b250YWxSZXNpemVIYW5kbGUiLCJEcmFnZ2FibGVMZWdlbmQiLCJ3aXRoVGhlbWUiLCJfcmVmIiwiX21hcENvbnRyb2xzJG1hcExlZ2VuIiwiaXNTaWRlUGFuZWxTaG93biIsIm1hcENvbnRyb2xzIiwic2V0TWFwQ29udHJvbFNldHRpbmdzIiwibWFwU3RhdGUiLCJzZXR0aW5ncyIsIm1hcExlZ2VuZCIsImxlZ2VuZENvbnRlbnRSZWYiLCJ1c2VSZWYiLCJvbkNoYW5nZVNldHRpbmdzIiwidXNlQ2FsbGJhY2siLCJuZXdTZXR0aW5ncyIsIl91c2VMZWdlbmRQb3NpdGlvbiIsInVzZUxlZ2VuZFBvc2l0aW9uIiwibWFwSGVpZ2h0IiwibWFwV2lkdGgiLCJ3aWR0aCIsInVwZGF0ZVBvc2l0aW9uIiwic3RhcnRSZXNpemUiLCJyZXNpemUiLCJoYW5kbGVEcmFnU3RhcnQiLCJldmVudCIsImFjdGl2ZSIsImhhbmRsZURyYWdFbmQiLCJoYW5kbGVEcmFnTW92ZSIsImRlbHRhIiwieSIsIkRuZENvbnRleHQiLCJvbkRyYWdTdGFydCIsIm9uRHJhZ01vdmUiLCJvbkRyYWdFbmQiLCJtb2RpZmllcnMiLCJyZXN0cmljdFRvV2luZG93RWRnZXMiLCJJbWFnZUV4cG9ydExlZ2VuZCIsIl9yZWYyIiwiX2NvbnRhaW5lclJlZiRjdXJyZW50IiwiY29udGFpbmVyUmVmIiwiX3VzZUxlZ2VuZFBvc2l0aW9uMiIsInBvcnRhbFJvb3QiLCJjdXJyZW50IiwiY2xvc2VzdCIsInF1ZXJ5U2VsZWN0b3IiLCJjcmVhdGVQb3J0YWwiLCJwb3NpdGlvbiIsIk1hcExlZ2VuZFBhbmVsRmFjdG9yeSIsImRlcHMiLCJNYXBDb250cm9sVG9vbHRpcEZhY3RvcnkiLCJNYXBDb250cm9sUGFuZWxGYWN0b3J5IiwiTWFwTGVnZW5kRmFjdG9yeSIsImRlZmF1bHRBY3Rpb25JY29ucyIsImxlZ2VuZCIsIkxlZ2VuZCIsIk1hcExlZ2VuZFBhbmVsQ29tcG9uZW50IiwiX3JlZjMiLCJfbWFwQ29udHJvbHMkbWFwTGVnZW4yIiwiX3Jvb3RDb250ZXh0JGN1cnJlbnQiLCJsYXllcnMiLCJzY2FsZSIsIm9uVG9nZ2xlTWFwQ29udHJvbCIsImlzRXhwb3J0IiwibG9nb0NvbXBvbmVudCIsIl9yZWYzJGFjdGlvbkljb25zIiwiYWN0aW9uSWNvbnMiLCJvbkxheWVyVmlzQ29uZmlnQ2hhbmdlIiwib25Ub2dnbGVMYXllclZpc2liaWxpdHkiLCJvblRvZ2dsZVNwbGl0TWFwVmlld3BvcnQiLCJvbkNsaWNrQ29udHJvbEJ0biIsImFjdGl2ZVNpZGVQYW5lbCIsIl9yZWYzJGlzVmlld3BvcnRVbnN5biIsImlzVmlld3BvcnRVbnN5bmNBbGxvd2VkIiwiTWFwQ29udHJvbFRvb2x0aXAiLCJNYXBDb250cm9sUGFuZWwiLCJNYXBMZWdlbmQiLCJCb29sZWFuIiwiX3JlZjQiLCJkaXNhYmxlRWRpdCIsInJvb3RDb250ZXh0IiwidXNlQ29udGV4dCIsIlJvb3RDb250ZXh0Iiwib25DbGljayIsIl9tYXBDb250cm9scyRtYXBEcmF3IiwibWFwRHJhdyIsIm9uQ2xvc2VDbGljayIsInByZXZlbnREZWZhdWx0Iiwic2hvdyIsImxlZ2VuZFBhbmVsIiwiaGVhZGVyIiwicGlubmFibGUiLCJkaXNhYmxlQ2xvc2UiLCJGcmFnbWVudCIsImhhc1BvcnRhYmxlV2lkdGgiLCJicmVha1BvaW50VmFsdWVzIiwiZG9jdW1lbnQiLCJib2R5IiwibWVzc2FnZSIsIk1hcENvbnRyb2xCdXR0b24iLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwL21hcC1sZWdlbmQtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtjcmVhdGVQb3J0YWx9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgQ29tcG9uZW50VHlwZSxcbiAgRkMsXG4gIGZvcndhcmRSZWYsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VSZWYsXG4gIFByb3BzV2l0aENoaWxkcmVuXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHt3aXRoVGhlbWV9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtEbmRDb250ZXh0LCB1c2VEcmFnZ2FibGV9IGZyb20gJ0BkbmQta2l0L2NvcmUnO1xuaW1wb3J0IHtDU1N9IGZyb20gJ0BkbmQta2l0L3V0aWxpdGllcyc7XG5pbXBvcnQge3VzZU1lcmdlUmVmc30gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0JztcblxuaW1wb3J0IHtBY3Rpb25IYW5kbGVyLCBzZXRNYXBDb250cm9sU2V0dGluZ3MsIHRvZ2dsZVNwbGl0TWFwVmlld3BvcnR9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2JyZWFrUG9pbnRWYWx1ZXN9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcbmltcG9ydCB7TGF5ZXJWaXNDb25maWcsIE1hcENvbnRyb2xNYXBMZWdlbmQsIE1hcENvbnRyb2xzLCBNYXBTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge2hhc1BvcnRhYmxlV2lkdGh9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtNYXBMZWdlbmRDb250cm9sU2V0dGluZ3N9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge0xlZ2VuZCwgRHJhZ2dhYmxlRG90cywgSG9yaXpvbnRhbFJlc2l6ZUhhbmRsZX0gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCB7TWFwQ29udHJvbEJ1dHRvbn0gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHVzZUxlZ2VuZFBvc2l0aW9uIGZyb20gJy4uL2hvb2tzL3VzZS1sZWdlbmQtcG9zaXRpb24nO1xuaW1wb3J0IE1hcENvbnRyb2xQYW5lbEZhY3RvcnkgZnJvbSAnLi9tYXAtY29udHJvbC1wYW5lbCc7XG5pbXBvcnQgTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRyb2wtdG9vbHRpcCc7XG5pbXBvcnQgTWFwTGVnZW5kRmFjdG9yeSBmcm9tICcuL21hcC1sZWdlbmQnO1xuaW1wb3J0IHtyZXN0cmljdFRvV2luZG93RWRnZXN9IGZyb20gJ0BkbmQta2l0L21vZGlmaWVycyc7XG5cbmNvbnN0IERSQUdfUkVTSVpFX0lEID0gJ21hcC1sZWdlbmQtcmVzaXplJztcbmNvbnN0IERSQUdfTU9WRV9JRCA9ICdtYXAtbGVnZW5kLW1vdmUnO1xuXG5jb25zdCBTdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50ID0gc3R5bGVkLmRpdjx7XG4gIGNvbnRlbnRIZWlnaHQ/OiBudW1iZXI7XG4gIG1heENvbnRlbnRIZWlnaHQ/OiBudW1iZXI7XG59PmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBvdXRsaW5lOiBub25lO1xuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycyBlYXNlLWluLW91dDtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIC5sZWdlbmQtaW5wdXQtYmxvY2sge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgJi5pcy1kcmFnZ2luZyAubGVnZW5kLWlucHV0LWJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6aG92ZXIsXG4gICYuaXMtZHJhZ2dpbmcge1xuICAgIC5sZWdlbmQtbW92ZS1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIH1cbiAgICAubGVnZW5kLXJlc2l6ZS1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIH1cbiAgICBib3JkZXItY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuICB9XG4gIC5tYXAtY29udHJvbF9fcGFuZWwtY29udGVudCB7XG4gICAgbWF4LWhlaWdodDogJHtwcm9wcyA9PlxuICAgICAgcHJvcHMubWF4Q29udGVudEhlaWdodCA/IGAke3Byb3BzLm1heENvbnRlbnRIZWlnaHR9cHhgIDogJ2NhbGMoMTAwdmggLSAxMDBweCknfTtcbiAgICAke3Byb3BzID0+IChwcm9wcy5jb250ZW50SGVpZ2h0ID8gYGhlaWdodDogJHtwcm9wcy5jb250ZW50SGVpZ2h0fXB4O2AgOiAnJyl9O1xuICB9XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgei1pbmRleDogMjtcbiAgLm1hcC1jb250cm9sLXBhbmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1vdmVIYW5kbGUgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW4tb3V0O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICB3aWR0aDogNDhweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogbW92ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5hY3RpdmVDb2xvcn07XG5gO1xuXG5jb25zdCBTdHlsZWRSZXNpemVIYW5kbGUgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW4tb3V0O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjZjdmOGZhO1xuICB6LWluZGV4OiAyO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHdpZHRoOiA0OHB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiBucy1yZXNpemU7XG5gO1xuXG5jb25zdCBTdHlsZWRGaXhlZExlZ2VuZENvbnRlbnQgPSBzdHlsZWQuZGl2PHtjb250ZW50SGVpZ2h0PzogbnVtYmVyfT5gXG4gIC5tYXAtY29udHJvbF9fcGFuZWwtY29udGVudCB7XG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDEwMHB4KTtcbiAgICAke3Byb3BzID0+IChwcm9wcy5jb250ZW50SGVpZ2h0ID8gYGhlaWdodDogJHtwcm9wcy5jb250ZW50SGVpZ2h0fXB4O2AgOiAnJyl9O1xuICB9XG5cbiAgLyogSGlkZSBzY3JvbGxiYXJzIGluIGV4cG9ydCB0byBhdm9pZCBPUyBkZWZhdWx0IHN0eWxpbmcgZGlmZmVyZW5jZXMgKi9cbiAgLnN0eWxlZC1jb2xvci1sZWdlbmQge1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgLyogSUUgYW5kIG9sZCBFZGdlICovXG4gICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovXG4gIH1cbiAgLnN0eWxlZC1jb2xvci1sZWdlbmQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMCAhaW1wb3J0YW50OyAvKiBDaHJvbWUsIFNhZmFyaSwgbmV3IEVkZ2UgKi9cbiAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgfVxuYDtcblxuZXhwb3J0IHR5cGUgTWFwTGVnZW5kUGFuZWxGYWN0b3J5RGVwcyA9IFtcbiAgdHlwZW9mIE1hcENvbnRyb2xUb29sdGlwRmFjdG9yeSxcbiAgdHlwZW9mIE1hcENvbnRyb2xQYW5lbEZhY3RvcnksXG4gIHR5cGVvZiBNYXBMZWdlbmRGYWN0b3J5XG5dO1xuXG50eXBlIERyYWdnYWJsZUxlZ2VuZENvbnRlbnRQcm9wcyA9IHtcbiAgY29udGVudEhlaWdodD86IG51bWJlcjtcbiAgbWF4Q29udGVudEhlaWdodD86IG51bWJlcjtcbiAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuY29uc3QgRHJhZ2dhYmxlTGVnZW5kQ29udGVudCA9IGZvcndhcmRSZWYoKHByb3BzOiBEcmFnZ2FibGVMZWdlbmRDb250ZW50UHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7cG9zaXRpb25TdHlsZXMsIGNoaWxkcmVuLCBjb250ZW50SGVpZ2h0LCBtYXhDb250ZW50SGVpZ2h0fSA9IHByb3BzO1xuICBjb25zdCBkcmFnZ2FibGVNb3ZlID0gdXNlRHJhZ2dhYmxlKHtpZDogRFJBR19NT1ZFX0lEfSk7XG4gIGNvbnN0IGRyYWdnYWJsZVJlc2l6ZSA9IHVzZURyYWdnYWJsZSh7aWQ6IERSQUdfUkVTSVpFX0lEfSk7XG4gIGNvbnN0IHJlZnMgPSB1c2VNZXJnZVJlZnMoW2RyYWdnYWJsZU1vdmUuc2V0Tm9kZVJlZiwgcmVmXSk7XG4gIGNvbnN0IGlzRHJhZ2dpbmcgPSBkcmFnZ2FibGVNb3ZlLmlzRHJhZ2dpbmcgfHwgZHJhZ2dhYmxlUmVzaXplLmlzRHJhZ2dpbmc7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZERyYWdnYWJsZUxlZ2VuZENvbnRlbnRcbiAgICAgIHJlZj17cmVmc31cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZHJhZ2dhYmxlLWxlZ2VuZCcsIHsnaXMtZHJhZ2dpbmcnOiBpc0RyYWdnaW5nfSl9XG4gICAgICBzdHlsZT17ey4uLnBvc2l0aW9uU3R5bGVzLCB0cmFuc2Zvcm06IENTUy5UcmFuc2xhdGUudG9TdHJpbmcoZHJhZ2dhYmxlTW92ZS50cmFuc2Zvcm0pfX1cbiAgICAgIGNvbnRlbnRIZWlnaHQ9e2NvbnRlbnRIZWlnaHR9XG4gICAgICBtYXhDb250ZW50SGVpZ2h0PXttYXhDb250ZW50SGVpZ2h0fVxuICAgICAgey4uLmRyYWdnYWJsZU1vdmUuYXR0cmlidXRlc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7aXNEcmFnZ2luZyA/IDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLWlucHV0LWJsb2NrXCIgLz4gOiBudWxsfVxuICAgICAgPFN0eWxlZE1vdmVIYW5kbGUgY2xhc3NOYW1lPVwibGVnZW5kLW1vdmUtaGFuZGxlXCIgey4uLmRyYWdnYWJsZU1vdmUubGlzdGVuZXJzfT5cbiAgICAgICAgPERyYWdnYWJsZURvdHMgaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICA8L1N0eWxlZE1vdmVIYW5kbGU+XG4gICAgICA8U3R5bGVkUmVzaXplSGFuZGxlXG4gICAgICAgIGNsYXNzTmFtZT1cImxlZ2VuZC1yZXNpemUtaGFuZGxlXCJcbiAgICAgICAgcmVmPXtkcmFnZ2FibGVSZXNpemUuc2V0Tm9kZVJlZn1cbiAgICAgICAgey4uLmRyYWdnYWJsZVJlc2l6ZS5saXN0ZW5lcnN9XG4gICAgICA+XG4gICAgICAgIDxIb3Jpem9udGFsUmVzaXplSGFuZGxlIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgPC9TdHlsZWRSZXNpemVIYW5kbGU+XG4gICAgPC9TdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50PlxuICApO1xufSk7XG5cbnR5cGUgRHJhZ2dhYmxlTGVnZW5kUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIGlzU2lkZVBhbmVsU2hvd246IGJvb2xlYW47XG4gIG1hcENvbnRyb2xzOiBNYXBDb250cm9scztcbiAgc2V0TWFwQ29udHJvbFNldHRpbmdzOiB0eXBlb2Ygc2V0TWFwQ29udHJvbFNldHRpbmdzO1xuICBtYXBTdGF0ZT86IE1hcFN0YXRlO1xufT47XG5cbmNvbnN0IERyYWdnYWJsZUxlZ2VuZCA9IHdpdGhUaGVtZShcbiAgKHtcbiAgICBpc1NpZGVQYW5lbFNob3duLFxuICAgIGNoaWxkcmVuLFxuICAgIG1hcENvbnRyb2xzLFxuICAgIHNldE1hcENvbnRyb2xTZXR0aW5ncyxcbiAgICBtYXBTdGF0ZSxcbiAgICB0aGVtZVxuICB9OiBEcmFnZ2FibGVMZWdlbmRQcm9wcyAmIHt0aGVtZTogYW55fSkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gbWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uc2V0dGluZ3M7XG5cbiAgICBjb25zdCBsZWdlbmRDb250ZW50UmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKTtcbiAgICBjb25zdCBvbkNoYW5nZVNldHRpbmdzID0gdXNlQ2FsbGJhY2soXG4gICAgICBuZXdTZXR0aW5ncyA9PiBzZXRNYXBDb250cm9sU2V0dGluZ3MoJ21hcExlZ2VuZCcsIG5ld1NldHRpbmdzKSxcbiAgICAgIFtzZXRNYXBDb250cm9sU2V0dGluZ3NdXG4gICAgKTtcbiAgICBjb25zdCB7cG9zaXRpb25TdHlsZXMsIHVwZGF0ZVBvc2l0aW9uLCBzdGFydFJlc2l6ZSwgcmVzaXplLCBjb250ZW50SGVpZ2h0LCBtYXhDb250ZW50SGVpZ2h0fSA9XG4gICAgICB1c2VMZWdlbmRQb3NpdGlvbih7XG4gICAgICAgIGxlZ2VuZENvbnRlbnRSZWYsXG4gICAgICAgIGlzU2lkZVBhbmVsU2hvd24sXG4gICAgICAgIHRoZW1lLFxuICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgb25DaGFuZ2VTZXR0aW5ncyxcbiAgICAgICAgbWFwSGVpZ2h0OiBtYXBTdGF0ZT8uaGVpZ2h0LFxuICAgICAgICBtYXBXaWR0aDogbWFwU3RhdGU/LndpZHRoXG4gICAgICB9KTtcblxuICAgIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IHVzZUNhbGxiYWNrKFxuICAgICAgZXZlbnQgPT4ge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmFjdGl2ZS5pZCkge1xuICAgICAgICAgIGNhc2UgRFJBR19SRVNJWkVfSUQ6XG4gICAgICAgICAgICBzdGFydFJlc2l6ZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbdXBkYXRlUG9zaXRpb24sIHN0YXJ0UmVzaXplXVxuICAgICk7XG4gICAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IHVzZUNhbGxiYWNrKHVwZGF0ZVBvc2l0aW9uLCBbdXBkYXRlUG9zaXRpb25dKTtcbiAgICBjb25zdCBoYW5kbGVEcmFnTW92ZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgZXZlbnQgPT4ge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmFjdGl2ZS5pZCkge1xuICAgICAgICAgIGNhc2UgRFJBR19SRVNJWkVfSUQ6XG4gICAgICAgICAgICByZXNpemUoZXZlbnQuZGVsdGEueSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtyZXNpemVdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RG5kQ29udGV4dFxuICAgICAgICBvbkRyYWdTdGFydD17aGFuZGxlRHJhZ1N0YXJ0fVxuICAgICAgICBvbkRyYWdNb3ZlPXtoYW5kbGVEcmFnTW92ZX1cbiAgICAgICAgb25EcmFnRW5kPXtoYW5kbGVEcmFnRW5kfVxuICAgICAgICBtb2RpZmllcnM9e1tyZXN0cmljdFRvV2luZG93RWRnZXNdfVxuICAgICAgPlxuICAgICAgICA8RHJhZ2dhYmxlTGVnZW5kQ29udGVudFxuICAgICAgICAgIHJlZj17bGVnZW5kQ29udGVudFJlZn1cbiAgICAgICAgICBwb3NpdGlvblN0eWxlcz17cG9zaXRpb25TdHlsZXN9XG4gICAgICAgICAgY29udGVudEhlaWdodD17Y29udGVudEhlaWdodH1cbiAgICAgICAgICBtYXhDb250ZW50SGVpZ2h0PXttYXhDb250ZW50SGVpZ2h0fVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0RyYWdnYWJsZUxlZ2VuZENvbnRlbnQ+XG4gICAgICA8L0RuZENvbnRleHQ+XG4gICAgKTtcbiAgfVxuKSBhcyBGQzxEcmFnZ2FibGVMZWdlbmRQcm9wcz47XG5cbnR5cGUgSW1hZ2VFeHBvcnRMZWdlbmRQcm9wcyA9IHtcbiAgc2V0dGluZ3M/OiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3M7XG4gIGlzU2lkZVBhbmVsU2hvd246IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5jb25zdCBJbWFnZUV4cG9ydExlZ2VuZCA9IHdpdGhUaGVtZSgoe3NldHRpbmdzLCBpc1NpZGVQYW5lbFNob3duLCB0aGVtZSwgY2hpbGRyZW59KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZjogUmVhY3QuTXV0YWJsZVJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+ID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBsZWdlbmRDb250ZW50UmVmOiBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD4gPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3Qge3Bvc2l0aW9uU3R5bGVzLCBjb250ZW50SGVpZ2h0fSA9IHVzZUxlZ2VuZFBvc2l0aW9uKHtcbiAgICBsZWdlbmRDb250ZW50UmVmLFxuICAgIGlzU2lkZVBhbmVsU2hvd24sXG4gICAgdGhlbWUsXG4gICAgc2V0dGluZ3MsXG4gICAgb25DaGFuZ2VTZXR0aW5nczogKCkgPT4ge1xuICAgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBwb3J0YWxSb290ID0gY29udGFpbmVyUmVmLmN1cnJlbnRcbiAgICA/LmNsb3Nlc3QoJy5leHBvcnQtbWFwLWluc3RhbmNlJylcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoJyNkZWZhdWx0LWRlY2tnbC1vdmVybGF5LXdyYXBwZXInKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgcmVmPXtjb250YWluZXJSZWZ9PlxuICAgICAge3BvcnRhbFJvb3RcbiAgICAgICAgPyBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpeGVkLWxlZ2VuZFwiXG4gICAgICAgICAgICAgIHJlZj17bGVnZW5kQ29udGVudFJlZn1cbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5wb3NpdGlvblN0eWxlcywgcG9zaXRpb246ICdhYnNvbHV0ZSd9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8U3R5bGVkRml4ZWRMZWdlbmRDb250ZW50IGNvbnRlbnRIZWlnaHQ9e2NvbnRlbnRIZWlnaHR9PlxuICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPC9TdHlsZWRGaXhlZExlZ2VuZENvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICBwb3J0YWxSb290XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59KSBhcyBSZWFjdC5GQzxJbWFnZUV4cG9ydExlZ2VuZFByb3BzPjtcblxuTWFwTGVnZW5kUGFuZWxGYWN0b3J5LmRlcHMgPSBbTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5LCBNYXBDb250cm9sUGFuZWxGYWN0b3J5LCBNYXBMZWdlbmRGYWN0b3J5XTtcblxuaW50ZXJmYWNlIE1hcExlZ2VuZFBhbmVsSWNvbnMge1xuICBsZWdlbmQ6IENvbXBvbmVudFR5cGU8YW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgTWFwTGVnZW5kUGFuZWxQcm9wcyA9IHtcbiAgdGhlbWU6IGFueTtcbiAgbGF5ZXJzOiBSZWFkb25seUFycmF5PExheWVyPjtcbiAgc2NhbGU6IG51bWJlcjtcbiAgb25Ub2dnbGVNYXBDb250cm9sOiAoY29udHJvbDogc3RyaW5nKSA9PiB2b2lkO1xuICBpc0V4cG9ydDogYm9vbGVhbjtcbiAgbG9nb0NvbXBvbmVudDogRWxlbWVudDtcbiAgYWN0aW9uSWNvbnM6IE1hcExlZ2VuZFBhbmVsSWNvbnM7XG4gIG1hcENvbnRyb2xzOiBNYXBDb250cm9scztcbiAgbWFwU3RhdGU/OiBNYXBTdGF0ZTtcbiAgb25MYXllclZpc0NvbmZpZ0NoYW5nZT86IChvbGRMYXllcjogTGF5ZXIsIG5ld1Zpc0NvbmZpZzogUGFydGlhbDxMYXllclZpc0NvbmZpZz4pID0+IHZvaWQ7XG4gIG9uVG9nZ2xlTGF5ZXJWaXNpYmlsaXR5PzogKGxheWVyOiBMYXllcikgPT4gdm9pZDtcbiAgb25Ub2dnbGVTcGxpdE1hcFZpZXdwb3J0PzogQWN0aW9uSGFuZGxlcjx0eXBlb2YgdG9nZ2xlU3BsaXRNYXBWaWV3cG9ydD47XG4gIGlzVmlld3BvcnRVbnN5bmNBbGxvd2VkPzogYm9vbGVhbjtcbiAgb25DbGlja0NvbnRyb2xCdG4/OiAoZT86IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBzZXR0aW5nczogTWFwTGVnZW5kQ29udHJvbFNldHRpbmdzO1xuICBpc1NpZGVQYW5lbFNob3duOiBib29sZWFuO1xuICBhY3RpdmVTaWRlUGFuZWw6IHN0cmluZyB8IG51bGw7XG4gIHNldE1hcENvbnRyb2xTZXR0aW5nczogYW55O1xufTtcblxudHlwZSBNYXBMZWdlbmRQYW5lbENvbXBvbmVudHMgPSB7XG4gIE1hcENvbnRyb2xUb29sdGlwOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBDb250cm9sVG9vbHRpcEZhY3Rvcnk+O1xuICBNYXBDb250cm9sUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIE1hcENvbnRyb2xQYW5lbEZhY3Rvcnk+O1xuICBNYXBMZWdlbmQ6IFJldHVyblR5cGU8dHlwZW9mIE1hcExlZ2VuZEZhY3Rvcnk+O1xufTtcblxudHlwZSBNYXBMZWdlbmRQYW5lbENvbXBvbmVudFR5cGUgPSBSZWFjdC5GQzxNYXBMZWdlbmRQYW5lbFByb3BzPjtcblxuY29uc3QgZGVmYXVsdEFjdGlvbkljb25zID0ge1xuICBsZWdlbmQ6IHByb3BzID0+IDxMZWdlbmQgey4uLnByb3BzfSBoZWlnaHQ9XCIxOHB4XCIgLz5cbn07XG5cbmNvbnN0IE1hcExlZ2VuZFBhbmVsQ29tcG9uZW50ID0gKHtcbiAgbGF5ZXJzLFxuICBtYXBDb250cm9scyxcbiAgc2NhbGUsXG4gIG9uVG9nZ2xlTWFwQ29udHJvbCxcbiAgaXNFeHBvcnQsXG4gIGxvZ29Db21wb25lbnQsXG4gIGFjdGlvbkljb25zID0gZGVmYXVsdEFjdGlvbkljb25zLFxuICBtYXBTdGF0ZSxcbiAgb25MYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgb25Ub2dnbGVMYXllclZpc2liaWxpdHksXG4gIG9uVG9nZ2xlU3BsaXRNYXBWaWV3cG9ydCxcbiAgb25DbGlja0NvbnRyb2xCdG4sXG4gIGFjdGl2ZVNpZGVQYW5lbCxcbiAgc2V0TWFwQ29udHJvbFNldHRpbmdzLFxuICBpc1ZpZXdwb3J0VW5zeW5jQWxsb3dlZCA9IHRydWUsXG4gIGNsYXNzTmFtZSxcbiAgTWFwQ29udHJvbFRvb2x0aXAsXG4gIE1hcENvbnRyb2xQYW5lbCxcbiAgTWFwTGVnZW5kXG59OiBNYXBMZWdlbmRQYW5lbFByb3BzICYgTWFwTGVnZW5kUGFuZWxDb21wb25lbnRzKSA9PiB7XG4gIGNvbnN0IGlzU2lkZVBhbmVsU2hvd24gPSBCb29sZWFuKGFjdGl2ZVNpZGVQYW5lbCk7XG4gIGNvbnN0IHNldHRpbmdzID0gbWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uc2V0dGluZ3M7XG5cbiAgY29uc3QgbWFwTGVnZW5kID0gbWFwQ29udHJvbHM/Lm1hcExlZ2VuZCB8fCAoe30gYXMgTWFwQ29udHJvbE1hcExlZ2VuZCk7XG4gIGNvbnN0IHthY3RpdmUsIGRpc2FibGVFZGl0fSA9IG1hcExlZ2VuZCB8fCB7fTtcbiAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VDb250ZXh0KFJvb3RDb250ZXh0KTtcblxuICBjb25zdCBvbkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIG9uQ2xpY2tDb250cm9sQnRuPy4oKTtcbiAgICBpZiAobWFwQ29udHJvbHM/Lm1hcERyYXc/LmFjdGl2ZSkge1xuICAgICAgb25Ub2dnbGVNYXBDb250cm9sKCdtYXBEcmF3Jyk7XG4gICAgfVxuICAgIG9uVG9nZ2xlTWFwQ29udHJvbCgnbWFwTGVnZW5kJyk7XG4gIH0sIFtvbkNsaWNrQ29udHJvbEJ0biwgb25Ub2dnbGVNYXBDb250cm9sLCBtYXBDb250cm9sc10pO1xuICBjb25zdCBvbkNsb3NlQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG9uVG9nZ2xlTWFwQ29udHJvbCgnbWFwTGVnZW5kJyk7XG4gICAgfSxcbiAgICBbb25Ub2dnbGVNYXBDb250cm9sXVxuICApO1xuXG4gIGlmICghbWFwTGVnZW5kLnNob3cpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxlZ2VuZFBhbmVsID0gYWN0aXZlID8gKFxuICAgIDxNYXBDb250cm9sUGFuZWxcbiAgICAgIHNjYWxlPXtzY2FsZX1cbiAgICAgIGhlYWRlcj1cImhlYWRlci5sYXllckxlZ2VuZFwiXG4gICAgICB7Li4ue29uQ2xpY2s6IG9uQ2xvc2VDbGljaywgcGlubmFibGU6IGZhbHNlLCBkaXNhYmxlQ2xvc2U6IGZhbHNlfX1cbiAgICAgIGlzRXhwb3J0PXtpc0V4cG9ydH1cbiAgICAgIGxvZ29Db21wb25lbnQ9e2xvZ29Db21wb25lbnR9XG4gICAgICBtYXBTdGF0ZT17bWFwU3RhdGV9XG4gICAgICBvblRvZ2dsZVNwbGl0TWFwVmlld3BvcnQ9e29uVG9nZ2xlU3BsaXRNYXBWaWV3cG9ydH1cbiAgICAgIGlzVmlld3BvcnRVbnN5bmNBbGxvd2VkPXtpc1ZpZXdwb3J0VW5zeW5jQWxsb3dlZH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgID5cbiAgICAgIDxNYXBMZWdlbmRcbiAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgIG1hcFN0YXRlPXttYXBTdGF0ZX1cbiAgICAgICAgZGlzYWJsZUVkaXQ9e2Rpc2FibGVFZGl0fVxuICAgICAgICBpc0V4cG9ydD17aXNFeHBvcnR9XG4gICAgICAgIG9uTGF5ZXJWaXNDb25maWdDaGFuZ2U9e29uTGF5ZXJWaXNDb25maWdDaGFuZ2V9XG4gICAgICAgIG9uVG9nZ2xlTGF5ZXJWaXNpYmlsaXR5PXtvblRvZ2dsZUxheWVyVmlzaWJpbGl0eX1cbiAgICAgIC8+XG4gICAgPC9NYXBDb250cm9sUGFuZWw+XG4gICkgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHthY3RpdmUgPyAoXG4gICAgICAgIGhhc1BvcnRhYmxlV2lkdGgoYnJlYWtQb2ludFZhbHVlcykgPyAoXG4gICAgICAgICAgbGVnZW5kUGFuZWxcbiAgICAgICAgKSA6IGlzRXhwb3J0ID8gKFxuICAgICAgICAgIDxJbWFnZUV4cG9ydExlZ2VuZCBpc1NpZGVQYW5lbFNob3duPXtpc1NpZGVQYW5lbFNob3dufSBzZXR0aW5ncz17c2V0dGluZ3N9PlxuICAgICAgICAgICAge2xlZ2VuZFBhbmVsfVxuICAgICAgICAgIDwvSW1hZ2VFeHBvcnRMZWdlbmQ+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgY3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgPERyYWdnYWJsZUxlZ2VuZFxuICAgICAgICAgICAgICBpc1NpZGVQYW5lbFNob3duPXtpc1NpZGVQYW5lbFNob3dufVxuICAgICAgICAgICAgICBtYXBDb250cm9scz17bWFwQ29udHJvbHN9XG4gICAgICAgICAgICAgIHNldE1hcENvbnRyb2xTZXR0aW5ncz17c2V0TWFwQ29udHJvbFNldHRpbmdzfVxuICAgICAgICAgICAgICBtYXBTdGF0ZT17bWFwU3RhdGV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtsZWdlbmRQYW5lbH1cbiAgICAgICAgICAgIDwvRHJhZ2dhYmxlTGVnZW5kPixcbiAgICAgICAgICAgIHJvb3RDb250ZXh0Py5jdXJyZW50ID8/IGRvY3VtZW50LmJvZHlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkgOiBudWxsfVxuICAgICAgeyFpc0V4cG9ydCA/IChcbiAgICAgICAgPE1hcENvbnRyb2xUb29sdGlwIGlkPVwic2hvdy1sZWdlbmRcIiBtZXNzYWdlPVwidG9vbHRpcC5zaG93TGVnZW5kXCI+XG4gICAgICAgICAgPE1hcENvbnRyb2xCdXR0b24gY2xhc3NOYW1lPVwibWFwLWNvbnRyb2wtYnV0dG9uIHNob3ctbGVnZW5kXCIgb25DbGljaz17b25DbGlja30+XG4gICAgICAgICAgICA8YWN0aW9uSWNvbnMubGVnZW5kIGhlaWdodD1cIjIycHhcIiAvPlxuICAgICAgICAgIDwvTWFwQ29udHJvbEJ1dHRvbj5cbiAgICAgICAgPC9NYXBDb250cm9sVG9vbHRpcD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvPlxuICApO1xufTtcblxuZnVuY3Rpb24gTWFwTGVnZW5kUGFuZWxGYWN0b3J5KFxuICBNYXBDb250cm9sVG9vbHRpcDogUmV0dXJuVHlwZTx0eXBlb2YgTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5PixcbiAgTWFwQ29udHJvbFBhbmVsOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBDb250cm9sUGFuZWxGYWN0b3J5PixcbiAgTWFwTGVnZW5kOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBMZWdlbmRGYWN0b3J5PlxuKTogTWFwTGVnZW5kUGFuZWxDb21wb25lbnRUeXBlIHtcbiAgcmV0dXJuIChwcm9wczogTWFwTGVnZW5kUGFuZWxQcm9wcykgPT4gKFxuICAgIDxNYXBMZWdlbmRQYW5lbENvbXBvbmVudFxuICAgICAgey4uLnByb3BzfVxuICAgICAgTWFwQ29udHJvbFRvb2x0aXA9e01hcENvbnRyb2xUb29sdGlwfVxuICAgICAgTWFwQ29udHJvbFBhbmVsPXtNYXBDb250cm9sUGFuZWx9XG4gICAgICBNYXBMZWdlbmQ9e01hcExlZ2VuZH1cbiAgICAvPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBNYXBMZWdlbmRQYW5lbEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsV0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBU0EsSUFBQUksaUJBQUEsR0FBQUQsdUJBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtB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