UNPKG

kepler.gl

Version:

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

170 lines (169 loc) 28.1 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"] = GeocoderPanelFactory; exports.getUpdateVisDataPayload = getUpdateVisDataPayload; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _classnames = _interopRequireDefault(require("classnames")); var _processors = require("@kepler.gl/processors"); var _typed = require("@deck.gl/core/typed"); var _utils = require("@kepler.gl/utils"); var _constants = require("@kepler.gl/constants"); var _geocoder = _interopRequireDefault(require("./geocoder/geocoder")); var _templateObject; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function 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 ICON_LAYER = { id: _constants.GEOCODER_LAYER_ID, type: 'icon', config: { label: 'Geocoder Layer', color: _constants.GEOCODER_ICON_COLOR, dataId: _constants.GEOCODER_DATASET_NAME, columns: { lat: 'lt', lng: 'ln', icon: 'icon', label: 'text' }, isVisible: true, hidden: true, visConfig: { radius: _constants.GEOCODER_ICON_SIZE } } }; function generateConfig(layerOrder) { return { visState: { layers: [ICON_LAYER], layerOrder: [ICON_LAYER.id].concat((0, _toConsumableArray2["default"])(layerOrder)) } }; } var StyledGeocoderPanel = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: ", "px;\n right: ", ";\n width: ", "px;\n box-shadow: ", ";\n z-index: 100;\n"])), function (props) { return props.theme.geocoderTop; }, function (props) { return props.unsyncedViewports ? // 2 geocoders: split mode and unsynced viewports Number.isFinite(props.index) && props.index === 0 ? "calc(50% + ".concat(props.theme.geocoderRight, "px)") // unsynced left geocoder (index 0) : "".concat(props.theme.geocoderRight, "px") // unsynced right geocoder (index 1) : // 1 geocoder: single mode OR split mode and synced viewports "".concat(props.theme.geocoderRight, "px"); }, function (props) { return Number.isFinite(props.width) ? props.width : props.theme.geocoderWidth; }, function (props) { return props.theme.boxShadow; }); function generateGeocoderDataset(lat, lon, text) { var data = (0, _processors.processRowObject)([{ lt: lat, ln: lon, icon: 'place', text: text }]); if (!data) { return null; } return { data: data, info: { hidden: true, id: _constants.GEOCODER_DATASET_NAME, label: _constants.GEOCODER_DATASET_NAME } }; } function isValid(key) { return /pk\..*\..*/.test(key); } function getUpdateVisDataPayload(lat, lon, text) { var dataset = generateGeocoderDataset(lat, lon, text); if (!dataset) { return null; } return [[dataset], { keepExistingConfig: true }]; } function GeocoderPanelFactory() { var GeocoderPanel = function GeocoderPanel(_ref) { var isGeocoderEnabled = _ref.isGeocoderEnabled, mapState = _ref.mapState, mapboxApiAccessToken = _ref.mapboxApiAccessToken, updateVisData = _ref.updateVisData, removeDataset = _ref.removeDataset, updateMap = _ref.updateMap, layerOrder = _ref.layerOrder, _ref$transitionDurati = _ref.transitionDuration, transitionDuration = _ref$transitionDurati === void 0 ? 3000 : _ref$transitionDurati, width = _ref.width, className = _ref.className, index = _ref.index, unsyncedViewports = _ref.unsyncedViewports; var removeGeocoderDataset = (0, _react.useCallback)(function () { removeDataset(_constants.GEOCODER_DATASET_NAME); }, [removeDataset]); var onSelected = (0, _react.useCallback)(function () { var _viewport = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var geoItem = arguments.length > 1 ? arguments[1] : undefined; var _geoItem$center = (0, _slicedToArray2["default"])(geoItem.center, 2), lon = _geoItem$center[0], lat = _geoItem$center[1], text = geoItem.text, bbox = geoItem.bbox; var updateVisDataPayload = getUpdateVisDataPayload(lat, lon, text); if (updateVisDataPayload) { removeGeocoderDataset(); updateVisData.apply(void 0, (0, _toConsumableArray2["default"])(updateVisDataPayload).concat([generateConfig(layerOrder)])); } var bounds = bbox || [lon - _constants.GEOCODER_GEO_OFFSET, lat - _constants.GEOCODER_GEO_OFFSET, lon + _constants.GEOCODER_GEO_OFFSET, lat + _constants.GEOCODER_GEO_OFFSET]; var centerAndZoom = (0, _utils.getCenterAndZoomFromBounds)(bounds, { width: mapState.width, height: mapState.height }); if (!centerAndZoom) { // failed to fit bounds return; } updateMap(_objectSpread(_objectSpread({ latitude: centerAndZoom.center[1], longitude: centerAndZoom.center[0] }, Number.isFinite(centerAndZoom.zoom) ? { zoom: centerAndZoom.zoom } : {}), {}, { pitch: 0, bearing: 0, transitionDuration: transitionDuration, transitionInterpolator: new _typed.FlyToInterpolator() }), index); }, [index, layerOrder, mapState, removeGeocoderDataset, transitionDuration, updateMap, updateVisData]); return /*#__PURE__*/_react["default"].createElement(StyledGeocoderPanel, { className: (0, _classnames["default"])('geocoder-panel', className), width: width, index: index, unsyncedViewports: unsyncedViewports, style: { display: isGeocoderEnabled ? 'block' : 'none' } }, isValid(mapboxApiAccessToken) && /*#__PURE__*/_react["default"].createElement(_geocoder["default"], { mapboxApiAccessToken: mapboxApiAccessToken, onSelected: onSelected, onDeleteMarker: removeGeocoderDataset, width: width })); }; return GeocoderPanel; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9wcm9jZXNzb3JzIiwiX3R5cGVkIiwiX3V0aWxzIiwiX2NvbnN0YW50cyIsIl9nZW9jb2RlciIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIklDT05fTEFZRVIiLCJpZCIsIkdFT0NPREVSX0xBWUVSX0lEIiwidHlwZSIsImNvbmZpZyIsImxhYmVsIiwiY29sb3IiLCJHRU9DT0RFUl9JQ09OX0NPTE9SIiwiZGF0YUlkIiwiR0VPQ09ERVJfREFUQVNFVF9OQU1FIiwiY29sdW1ucyIsImxhdCIsImxuZyIsImljb24iLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJ2aXNDb25maWciLCJyYWRpdXMiLCJHRU9DT0RFUl9JQ09OX1NJWkUiLCJnZW5lcmF0ZUNvbmZpZyIsImxheWVyT3JkZXIiLCJ2aXNTdGF0ZSIsImxheWVycyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJTdHlsZWRHZW9jb2RlclBhbmVsIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwiZ2VvY29kZXJUb3AiLCJ1bnN5bmNlZFZpZXdwb3J0cyIsIk51bWJlciIsImlzRmluaXRlIiwiaW5kZXgiLCJnZW9jb2RlclJpZ2h0Iiwid2lkdGgiLCJnZW9jb2RlcldpZHRoIiwiYm94U2hhZG93IiwiZ2VuZXJhdGVHZW9jb2RlckRhdGFzZXQiLCJsb24iLCJ0ZXh0IiwiZGF0YSIsInByb2Nlc3NSb3dPYmplY3QiLCJsdCIsImxuIiwiaW5mbyIsImlzVmFsaWQiLCJrZXkiLCJ0ZXN0IiwiZ2V0VXBkYXRlVmlzRGF0YVBheWxvYWQiLCJkYXRhc2V0Iiwia2VlcEV4aXN0aW5nQ29uZmlnIiwiR2VvY29kZXJQYW5lbEZhY3RvcnkiLCJHZW9jb2RlclBhbmVsIiwiX3JlZiIsImlzR2VvY29kZXJFbmFibGVkIiwibWFwU3RhdGUiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsInVwZGF0ZVZpc0RhdGEiLCJyZW1vdmVEYXRhc2V0IiwidXBkYXRlTWFwIiwiX3JlZiR0cmFuc2l0aW9uRHVyYXRpIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwiY2xhc3NOYW1lIiwicmVtb3ZlR2VvY29kZXJEYXRhc2V0IiwidXNlQ2FsbGJhY2siLCJvblNlbGVjdGVkIiwiX3ZpZXdwb3J0IiwidW5kZWZpbmVkIiwiZ2VvSXRlbSIsIl9nZW9JdGVtJGNlbnRlciIsIl9zbGljZWRUb0FycmF5MiIsImNlbnRlciIsImJib3giLCJ1cGRhdGVWaXNEYXRhUGF5bG9hZCIsImJvdW5kcyIsIkdFT0NPREVSX0dFT19PRkZTRVQiLCJjZW50ZXJBbmRab29tIiwiZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMiLCJoZWlnaHQiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInpvb20iLCJwaXRjaCIsImJlYXJpbmciLCJ0cmFuc2l0aW9uSW50ZXJwb2xhdG9yIiwiRmx5VG9JbnRlcnBvbGF0b3IiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NuYW1lcyIsInN0eWxlIiwiZGlzcGxheSIsIm9uRGVsZXRlTWFya2VyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2dlb2NvZGVyLXBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFja30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCwge0lTdHlsZWRDb21wb25lbnR9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtwcm9jZXNzUm93T2JqZWN0fSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHtGbHlUb0ludGVycG9sYXRvcn0gZnJvbSAnQGRlY2suZ2wvY29yZS90eXBlZCc7XG5pbXBvcnQge2dldENlbnRlckFuZFpvb21Gcm9tQm91bmRzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7XG4gIEdFT0NPREVSX0RBVEFTRVRfTkFNRSxcbiAgR0VPQ09ERVJfTEFZRVJfSUQsXG4gIEdFT0NPREVSX0dFT19PRkZTRVQsXG4gIEdFT0NPREVSX0lDT05fQ09MT1IsXG4gIEdFT0NPREVSX0lDT05fU0laRVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0FkZERhdGFUb01hcE9wdGlvbnMsIE1hcFN0YXRlLCBQcm90b0RhdGFzZXQsIFVpU3RhdGUsIFZpZXdwb3J0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7QWN0aW9uSGFuZGxlciwgcmVtb3ZlRGF0YXNldCwgdXBkYXRlTWFwLCB1cGRhdGVWaXNEYXRhfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5pbXBvcnQgR2VvY29kZXIsIHtSZXN1bHR9IGZyb20gJy4vZ2VvY29kZXIvZ2VvY29kZXInO1xuaW1wb3J0IHtNYXBWaWV3U3RhdGV9IGZyb20gJ0BkZWNrLmdsL2NvcmUvdHlwZWQnO1xuXG5pbXBvcnQge0Jhc2VDb21wb25lbnRQcm9wc30gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IElDT05fTEFZRVIgPSB7XG4gIGlkOiBHRU9DT0RFUl9MQVlFUl9JRCxcbiAgdHlwZTogJ2ljb24nLFxuICBjb25maWc6IHtcbiAgICBsYWJlbDogJ0dlb2NvZGVyIExheWVyJyxcbiAgICBjb2xvcjogR0VPQ09ERVJfSUNPTl9DT0xPUixcbiAgICBkYXRhSWQ6IEdFT0NPREVSX0RBVEFTRVRfTkFNRSxcbiAgICBjb2x1bW5zOiB7XG4gICAgICBsYXQ6ICdsdCcsXG4gICAgICBsbmc6ICdsbicsXG4gICAgICBpY29uOiAnaWNvbicsXG4gICAgICBsYWJlbDogJ3RleHQnXG4gICAgfSxcbiAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIHZpc0NvbmZpZzoge1xuICAgICAgcmFkaXVzOiBHRU9DT0RFUl9JQ09OX1NJWkVcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnKGxheWVyT3JkZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB2aXNTdGF0ZToge1xuICAgICAgbGF5ZXJzOiBbSUNPTl9MQVlFUl0sXG4gICAgICBsYXllck9yZGVyOiBbSUNPTl9MQVlFUi5pZCwgLi4ubGF5ZXJPcmRlcl1cbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlZEdlb2NvZGVyUGFuZWxQcm9wcyA9IEJhc2VDb21wb25lbnRQcm9wcyAmIHtcbiAgdW5zeW5jZWRWaWV3cG9ydHM/OiBib29sZWFuO1xuICBpbmRleD86IG51bWJlcjtcbiAgd2lkdGg/OiBudW1iZXI7XG59O1xuXG5jb25zdCBTdHlsZWRHZW9jb2RlclBhbmVsOiBJU3R5bGVkQ29tcG9uZW50PFxuICAnd2ViJyxcbiAgU3R5bGVkR2VvY29kZXJQYW5lbFByb3BzXG4+ID0gc3R5bGVkLmRpdjxTdHlsZWRHZW9jb2RlclBhbmVsUHJvcHM+YFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlclRvcH1weDtcbiAgcmlnaHQ6ICR7cHJvcHMgPT5cbiAgICBwcm9wcy51bnN5bmNlZFZpZXdwb3J0c1xuICAgICAgPyAvLyAyIGdlb2NvZGVyczogc3BsaXQgbW9kZSBhbmQgdW5zeW5jZWQgdmlld3BvcnRzXG4gICAgICAgIE51bWJlci5pc0Zpbml0ZShwcm9wcy5pbmRleCkgJiYgcHJvcHMuaW5kZXggPT09IDBcbiAgICAgICAgPyBgY2FsYyg1MCUgKyAke3Byb3BzLnRoZW1lLmdlb2NvZGVyUmlnaHR9cHgpYCAvLyB1bnN5bmNlZCBsZWZ0IGdlb2NvZGVyIChpbmRleCAwKVxuICAgICAgICA6IGAke3Byb3BzLnRoZW1lLmdlb2NvZGVyUmlnaHR9cHhgIC8vIHVuc3luY2VkIHJpZ2h0IGdlb2NvZGVyIChpbmRleCAxKVxuICAgICAgOiAvLyAxIGdlb2NvZGVyOiBzaW5nbGUgbW9kZSBPUiBzcGxpdCBtb2RlIGFuZCBzeW5jZWQgdmlld3BvcnRzXG4gICAgICAgIGAke3Byb3BzLnRoZW1lLmdlb2NvZGVyUmlnaHR9cHhgfTtcbiAgd2lkdGg6ICR7cHJvcHMgPT4gKE51bWJlci5pc0Zpbml0ZShwcm9wcy53aWR0aCkgPyBwcm9wcy53aWR0aCA6IHByb3BzLnRoZW1lLmdlb2NvZGVyV2lkdGgpfXB4O1xuICBib3gtc2hhZG93OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmJveFNoYWRvd307XG4gIHotaW5kZXg6IDEwMDtcbmA7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlR2VvY29kZXJEYXRhc2V0KGxhdDogbnVtYmVyLCBsb246IG51bWJlciwgdGV4dD86IHN0cmluZyk6IFByb3RvRGF0YXNldCB8IG51bGwge1xuICBjb25zdCBkYXRhID0gcHJvY2Vzc1Jvd09iamVjdChbXG4gICAge1xuICAgICAgbHQ6IGxhdCxcbiAgICAgIGxuOiBsb24sXG4gICAgICBpY29uOiAncGxhY2UnLFxuICAgICAgdGV4dFxuICAgIH1cbiAgXSk7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhLFxuICAgIGluZm86IHtcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIGlkOiBHRU9DT0RFUl9EQVRBU0VUX05BTUUsXG4gICAgICBsYWJlbDogR0VPQ09ERVJfREFUQVNFVF9OQU1FXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkKGtleSkge1xuICByZXR1cm4gL3BrXFwuLipcXC4uKi8udGVzdChrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlVmlzRGF0YVBheWxvYWQoXG4gIGxhdDogbnVtYmVyLFxuICBsb246IG51bWJlcixcbiAgdGV4dD86IHN0cmluZ1xuKTogW1Byb3RvRGF0YXNldFtdLCBBZGREYXRhVG9NYXBPcHRpb25zXSB8IG51bGwge1xuICBjb25zdCBkYXRhc2V0ID0gZ2VuZXJhdGVHZW9jb2RlckRhdGFzZXQobGF0LCBsb24sIHRleHQpO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gW1xuICAgIFtkYXRhc2V0XSxcbiAgICB7XG4gICAgICBrZWVwRXhpc3RpbmdDb25maWc6IHRydWVcbiAgICB9XG4gIF07XG59XG5cbmludGVyZmFjZSBHZW9jb2RlclBhbmVsUHJvcHMge1xuICBpc0dlb2NvZGVyRW5hYmxlZDogYm9vbGVhbjtcbiAgbWFwU3RhdGU6IE1hcFN0YXRlO1xuICB1aVN0YXRlOiBVaVN0YXRlO1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICB1cGRhdGVWaXNEYXRhOiBBY3Rpb25IYW5kbGVyPHR5cGVvZiB1cGRhdGVWaXNEYXRhPjtcbiAgcmVtb3ZlRGF0YXNldDogQWN0aW9uSGFuZGxlcjx0eXBlb2YgcmVtb3ZlRGF0YXNldD47XG4gIHVwZGF0ZU1hcDogQWN0aW9uSGFuZGxlcjx0eXBlb2YgdXBkYXRlTWFwPjtcbiAgbGF5ZXJPcmRlcjogc3RyaW5nW107XG5cbiAgdHJhbnNpdGlvbkR1cmF0aW9uPzogTWFwVmlld1N0YXRlWyd0cmFuc2l0aW9uRHVyYXRpb24nXTtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgdW5zeW5jZWRWaWV3cG9ydHM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEdlb2NvZGVyUGFuZWxGYWN0b3J5KCk6IFJlYWN0LkZDPEdlb2NvZGVyUGFuZWxQcm9wcz4ge1xuICBjb25zdCBHZW9jb2RlclBhbmVsID0gKHtcbiAgICBpc0dlb2NvZGVyRW5hYmxlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICB1cGRhdGVWaXNEYXRhLFxuICAgIHJlbW92ZURhdGFzZXQsXG4gICAgdXBkYXRlTWFwLFxuICAgIGxheWVyT3JkZXIsXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMzAwMCxcbiAgICB3aWR0aCxcbiAgICBjbGFzc05hbWUsXG4gICAgaW5kZXgsXG4gICAgdW5zeW5jZWRWaWV3cG9ydHNcbiAgfTogR2VvY29kZXJQYW5lbFByb3BzKSA9PiB7XG4gICAgY29uc3QgcmVtb3ZlR2VvY29kZXJEYXRhc2V0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgcmVtb3ZlRGF0YXNldChHRU9DT0RFUl9EQVRBU0VUX05BTUUpO1xuICAgIH0sIFtyZW1vdmVEYXRhc2V0XSk7XG5cbiAgICBjb25zdCBvblNlbGVjdGVkID0gdXNlQ2FsbGJhY2soXG4gICAgICAoX3ZpZXdwb3J0OiBWaWV3cG9ydCB8IG51bGwgPSBudWxsLCBnZW9JdGVtOiBSZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNlbnRlcjogW2xvbiwgbGF0XSxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGJib3hcbiAgICAgICAgfSA9IGdlb0l0ZW07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlVmlzRGF0YVBheWxvYWQgPSBnZXRVcGRhdGVWaXNEYXRhUGF5bG9hZChsYXQsIGxvbiwgdGV4dCk7XG4gICAgICAgIGlmICh1cGRhdGVWaXNEYXRhUGF5bG9hZCkge1xuICAgICAgICAgIHJlbW92ZUdlb2NvZGVyRGF0YXNldCgpO1xuICAgICAgICAgIHVwZGF0ZVZpc0RhdGEoLi4udXBkYXRlVmlzRGF0YVBheWxvYWQsIGdlbmVyYXRlQ29uZmlnKGxheWVyT3JkZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IGJib3ggfHwgW1xuICAgICAgICAgIGxvbiAtIEdFT0NPREVSX0dFT19PRkZTRVQsXG4gICAgICAgICAgbGF0IC0gR0VPQ09ERVJfR0VPX09GRlNFVCxcbiAgICAgICAgICBsb24gKyBHRU9DT0RFUl9HRU9fT0ZGU0VULFxuICAgICAgICAgIGxhdCArIEdFT0NPREVSX0dFT19PRkZTRVRcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgY2VudGVyQW5kWm9vbSA9IGdldENlbnRlckFuZFpvb21Gcm9tQm91bmRzKGJvdW5kcywge1xuICAgICAgICAgIHdpZHRoOiBtYXBTdGF0ZS53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IG1hcFN0YXRlLmhlaWdodFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWNlbnRlckFuZFpvb20pIHtcbiAgICAgICAgICAvLyBmYWlsZWQgdG8gZml0IGJvdW5kc1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU1hcChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYXRpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMV0sXG4gICAgICAgICAgICBsb25naXR1ZGU6IGNlbnRlckFuZFpvb20uY2VudGVyWzBdLFxuICAgICAgICAgICAgLy8gRm9yIG1hcmdpbmFsIG9yIGludmFsaWQgYm91bmRzLCB6b29tIG1heSBiZSBOYU4uIE1ha2Ugc3VyZSB0byBwcm92aWRlIGEgdmFsaWQgdmFsdWUgaW4gb3JkZXJcbiAgICAgICAgICAgIC8vIHRvIGF2b2lkIGNvcnJ1cHQgc3RhdGUgYW5kIHBvdGVudGlhbCBjcmFzaGVzIGFzIHpvb20gaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXJcbiAgICAgICAgICAgIC4uLihOdW1iZXIuaXNGaW5pdGUoY2VudGVyQW5kWm9vbS56b29tKSA/IHt6b29tOiBjZW50ZXJBbmRab29tLnpvb219IDoge30pLFxuICAgICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogbmV3IEZseVRvSW50ZXJwb2xhdG9yKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGV4XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgW1xuICAgICAgICBpbmRleCxcbiAgICAgICAgbGF5ZXJPcmRlcixcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIHJlbW92ZUdlb2NvZGVyRGF0YXNldCxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICB1cGRhdGVNYXAsXG4gICAgICAgIHVwZGF0ZVZpc0RhdGFcbiAgICAgIF1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRHZW9jb2RlclBhbmVsXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZ2VvY29kZXItcGFuZWwnLCBjbGFzc05hbWUpfVxuICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgdW5zeW5jZWRWaWV3cG9ydHM9e3Vuc3luY2VkVmlld3BvcnRzfVxuICAgICAgICBzdHlsZT17e2Rpc3BsYXk6IGlzR2VvY29kZXJFbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJ319XG4gICAgICA+XG4gICAgICAgIHtpc1ZhbGlkKG1hcGJveEFwaUFjY2Vzc1Rva2VuKSAmJiAoXG4gICAgICAgICAgPEdlb2NvZGVyXG4gICAgICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbj17bWFwYm94QXBpQWNjZXNzVG9rZW59XG4gICAgICAgICAgICBvblNlbGVjdGVkPXtvblNlbGVjdGVkfVxuICAgICAgICAgICAgb25EZWxldGVNYXJrZXI9e3JlbW92ZUdlb2NvZGVyRGF0YXNldH1cbiAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9TdHlsZWRHZW9jb2RlclBhbmVsPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEdlb2NvZGVyUGFuZWw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBVUEsSUFBQVEsU0FBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQXFELElBQUFTLGVBQUEsRUFuQnJEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVosd0JBQUFZLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFB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