UNPKG

kepler.gl

Version:

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

181 lines (149 loc) 22.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.findDefaultLayer = findDefaultLayer; exports.calculateLayerData = calculateLayerData; exports.getLayerHoverProp = getLayerHoverProp; exports.renderDeckGlLayer = renderDeckGlLayer; exports.isLayerRenderable = isLayerRenderable; exports.isLayerVisible = isLayerVisible; exports.prepareLayersForDeck = prepareLayersForDeck; exports.prepareLayersToRender = prepareLayersToRender; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _baseLayer = require("../layers/base-layer"); var _defaultSettings = require("../constants/default-settings"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } /** * Find default layers from fields * @type {typeof import('./layer-utils').findDefaultLayer} */ function findDefaultLayer(dataset, layerClasses) { if (!dataset) { return []; } var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) { var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : { props: [] }; var props = Array.isArray(result) ? result : result.props || []; var foundLayers = result.foundLayers || previous; return foundLayers.concat(props.map(function (p) { return _objectSpread(_objectSpread({}, p), {}, { type: lc, dataId: dataset.id }); })); }, []); // go through all layerProps to create layer return layerProps.map(function (props) { var layer = new layerClasses[props.type](props); return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer; }); } /** * calculate layer data based on layer type, col Config, * return updated layer if colorDomain, dataMap has changed * @type {typeof import('./layer-utils').calculateLayerData} */ function calculateLayerData(layer, state, oldLayerData) { var type = layer.type; if (!type || !layer.hasAllColumns() || !layer.config.dataId) { return { layer: layer, layerData: {} }; } var layerData = layer.formatLayerData(state.datasets, oldLayerData); return { layerData: layerData, layer: layer }; } /** * Calculate props passed to LayerHoverInfo * @type {typeof import('./layer-utils').getLayerHoverProp} */ function getLayerHoverProp(_ref) { var interactionConfig = _ref.interactionConfig, hoverInfo = _ref.hoverInfo, layers = _ref.layers, layersToRender = _ref.layersToRender, datasets = _ref.datasets; if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) { // if anything hovered var object = hoverInfo.object, overlay = hoverInfo.layer; // deckgl layer to kepler-gl layer var layer = layers[overlay.props.idx]; if (object && layer && layer.getHoverData && layersToRender[layer.id]) { // if layer is visible and have hovered data var dataId = layer.config.dataId; if (!dataId) { return null; } var _datasets$dataId = datasets[dataId], dataContainer = _datasets$dataId.dataContainer, fields = _datasets$dataId.fields; var data = layer.getHoverData(object, dataContainer, fields); var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId]; return { data: data, fields: fields, fieldsToShow: fieldsToShow, layer: layer }; } } return null; } function renderDeckGlLayer(props, layerCallbacks, idx) { var datasets = props.datasets, layers = props.layers, layerData = props.layerData, hoverInfo = props.hoverInfo, clicked = props.clicked, mapState = props.mapState, interactionConfig = props.interactionConfig, animationConfig = props.animationConfig, mapLayers = props.mapLayers; var layer = layers[idx]; var data = layerData[idx]; var _ref2 = datasets[layer.config.dataId] || {}, gpuFilter = _ref2.gpuFilter; var objectHovered = clicked || hoverInfo; var visible = !mapLayers || mapLayers && mapLayers[layer.id]; // Layer is Layer class return layer.renderLayer({ data: data, gpuFilter: gpuFilter, idx: idx, interactionConfig: interactionConfig, layerCallbacks: layerCallbacks, mapState: mapState, animationConfig: animationConfig, objectHovered: objectHovered, visible: visible }); } function isLayerRenderable(layer, layerData) { return layer.id !== _defaultSettings.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData); } function isLayerVisible(layer, mapLayers) { return layer.config.isVisible && ( // if layer.id is not in mapLayers, don't render it !mapLayers || mapLayers && mapLayers[layer.id]); } // Prepare a dict of layers rendered by the deck.gl // Note, isVisible: false layer is passed to deck.gl here // return {[id]: true \ false} function prepareLayersForDeck(layers, layerData) { return layers.reduce(function (accu, layer, idx) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === _baseLayer.OVERLAY_TYPE.deckgl)); }, {}); } // Prepare a dict of rendered layers rendered in the map // This includes only the visibile layers for single map view and split map view // return {[id]: true \ false} function prepareLayersToRender(layers, layerData, mapLayers) { return layers.reduce(function (accu, layer, idx) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers))); }, {}); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sYXllci11dGlscy5qcyJdLCJuYW1lcyI6WyJmaW5kRGVmYXVsdExheWVyIiwiZGF0YXNldCIsImxheWVyQ2xhc3NlcyIsImxheWVyUHJvcHMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwicHJldmlvdXMiLCJsYyIsInJlc3VsdCIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsInByb3BzIiwiQXJyYXkiLCJpc0FycmF5IiwiZm91bmRMYXllcnMiLCJjb25jYXQiLCJtYXAiLCJwIiwidHlwZSIsImRhdGFJZCIsImlkIiwibGF5ZXIiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJkYXRhQ29udGFpbmVyIiwiY2FsY3VsYXRlTGF5ZXJEYXRhIiwic3RhdGUiLCJvbGRMYXllckRhdGEiLCJoYXNBbGxDb2x1bW5zIiwiY29uZmlnIiwibGF5ZXJEYXRhIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZGF0YXNldHMiLCJnZXRMYXllckhvdmVyUHJvcCIsImludGVyYWN0aW9uQ29uZmlnIiwiaG92ZXJJbmZvIiwibGF5ZXJzIiwibGF5ZXJzVG9SZW5kZXIiLCJ0b29sdGlwIiwiZW5hYmxlZCIsInBpY2tlZCIsIm9iamVjdCIsIm92ZXJsYXkiLCJpZHgiLCJnZXRIb3ZlckRhdGEiLCJmaWVsZHMiLCJkYXRhIiwiZmllbGRzVG9TaG93IiwicmVuZGVyRGVja0dsTGF5ZXIiLCJsYXllckNhbGxiYWNrcyIsImNsaWNrZWQiLCJtYXBTdGF0ZSIsImFuaW1hdGlvbkNvbmZpZyIsIm1hcExheWVycyIsImdwdUZpbHRlciIsIm9iamVjdEhvdmVyZWQiLCJ2aXNpYmxlIiwicmVuZGVyTGF5ZXIiLCJpc0xheWVyUmVuZGVyYWJsZSIsIkdFT0NPREVSX0xBWUVSX0lEIiwic2hvdWxkUmVuZGVyTGF5ZXIiLCJpc0xheWVyVmlzaWJsZSIsImlzVmlzaWJsZSIsInByZXBhcmVMYXllcnNGb3JEZWNrIiwiYWNjdSIsIm92ZXJsYXlUeXBlIiwiT1ZFUkxBWV9UWVBF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QUF1Q04sU0FBdkMsRUFBa0R1QixTQUFsRCxFQUE2RDtBQUNsRSxTQUFPakIsTUFBTSxDQUFDN0IsTUFBUCxDQUNMLFVBQUN5RCxJQUFELEVBQU8xQyxLQUFQLEVBQWNxQixHQUFkO0FBQUEsMkNBQ0txQixJQURMLDRDQUVHMUMsS0FBSyxDQUFDRCxFQUZULEVBRWNxQyxpQkFBaUIsQ0FBQ3BDLEtBQUQsRUFBUVEsU0FBUyxDQUFDYSxHQUFELENBQWpCLENBQWpCLElBQTRDa0IsY0FBYyxDQUFDdkMsS0FBRCxFQUFRK0IsU0FBUixDQUZ4RTtBQUFBLEdBREssRUFLTCxFQUxLLENBQVA7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7T1ZFUkxBWV9UWVBFfSBmcm9tICdsYXllcnMvYmFzZS1sYXllcic7XG5pbXBvcnQge0dFT0NPREVSX0xBWUVSX0lEfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbi8qKlxuICogRmluZCBkZWZhdWx0IGxheWVycyBmcm9tIGZpZWxkc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vbGF5ZXItdXRpbHMnKS5maW5kRGVmYXVsdExheWVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERlZmF1bHRMYXllcihkYXRhc2V0LCBsYXllckNsYXNzZXMpIHtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGxheWVyUHJvcHMgPSBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLnJlZHVjZSgocHJldmlvdXMsIGxjKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIHR5cGVvZiBsYXllckNsYXNzZXNbbGNdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGxheWVyQ2xhc3Nlc1tsY10uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIHByZXZpb3VzKVxuICAgICAgICA6IHtwcm9wczogW119O1xuXG4gICAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG4gICAgY29uc3QgZm91bmRMYXllcnMgPSByZXN1bHQuZm91bmRMYXllcnMgfHwgcHJldmlvdXM7XG5cbiAgICByZXR1cm4gZm91bmRMYXllcnMuY29uY2F0KFxuICAgICAgcHJvcHMubWFwKHAgPT4gKHtcbiAgICAgICAgLi4ucCxcbiAgICAgICAgdHlwZTogbGMsXG4gICAgICAgIGRhdGFJZDogZGF0YXNldC5pZFxuICAgICAgfSkpXG4gICAgKTtcbiAgfSwgW10pO1xuXG4gIC8vIGdvIHRocm91Z2ggYWxsIGxheWVyUHJvcHMgdG8gY3JlYXRlIGxheWVyXG4gIHJldHVybiBsYXllclByb3BzLm1hcChwcm9wcyA9PiB7XG4gICAgY29uc3QgbGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW3Byb3BzLnR5cGVdKHByb3BzKTtcbiAgICByZXR1cm4gdHlwZW9mIGxheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJyAmJiBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAgID8gbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnKGRhdGFzZXQpXG4gICAgICA6IGxheWVyO1xuICB9KTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgbGF5ZXIgZGF0YSBiYXNlZCBvbiBsYXllciB0eXBlLCBjb2wgQ29uZmlnLFxuICogcmV0dXJuIHVwZGF0ZWQgbGF5ZXIgaWYgY29sb3JEb21haW4sIGRhdGFNYXAgaGFzIGNoYW5nZWRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL2xheWVyLXV0aWxzJykuY2FsY3VsYXRlTGF5ZXJEYXRhfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTGF5ZXJEYXRhKGxheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKSB7XG4gIGNvbnN0IHt0eXBlfSA9IGxheWVyO1xuXG4gIGlmICghdHlwZSB8fCAhbGF5ZXIuaGFzQWxsQ29sdW1ucygpIHx8ICFsYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHtsYXllciwgbGF5ZXJEYXRhOiB7fX07XG4gIH1cblxuICBjb25zdCBsYXllckRhdGEgPSBsYXllci5mb3JtYXRMYXllckRhdGEoc3RhdGUuZGF0YXNldHMsIG9sZExheWVyRGF0YSk7XG4gIHJldHVybiB7bGF5ZXJEYXRhLCBsYXllcn07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHByb3BzIHBhc3NlZCB0byBMYXllckhvdmVySW5mb1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vbGF5ZXItdXRpbHMnKS5nZXRMYXllckhvdmVyUHJvcH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVySG92ZXJQcm9wKHtcbiAgaW50ZXJhY3Rpb25Db25maWcsXG4gIGhvdmVySW5mbyxcbiAgbGF5ZXJzLFxuICBsYXllcnNUb1JlbmRlcixcbiAgZGF0YXNldHNcbn0pIHtcbiAgaWYgKGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuZW5hYmxlZCAmJiBob3ZlckluZm8gJiYgaG92ZXJJbmZvLnBpY2tlZCkge1xuICAgIC8vIGlmIGFueXRoaW5nIGhvdmVyZWRcbiAgICBjb25zdCB7b2JqZWN0LCBsYXllcjogb3ZlcmxheX0gPSBob3ZlckluZm87XG5cbiAgICAvLyBkZWNrZ2wgbGF5ZXIgdG8ga2VwbGVyLWdsIGxheWVyXG4gICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbb3ZlcmxheS5wcm9wcy5pZHhdO1xuXG4gICAgaWYgKG9iamVjdCAmJiBsYXllciAmJiBsYXllci5nZXRIb3ZlckRhdGEgJiYgbGF5ZXJzVG9SZW5kZXJbbGF5ZXIuaWRdKSB7XG4gICAgICAvLyBpZiBsYXllciBpcyB2aXNpYmxlIGFuZCBoYXZlIGhvdmVyZWQgZGF0YVxuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IHtkYXRhSWR9XG4gICAgICB9ID0gbGF5ZXI7XG4gICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHN9ID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICAgIGNvbnN0IGRhdGEgPSBsYXllci5nZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyLCBmaWVsZHMpO1xuICAgICAgY29uc3QgZmllbGRzVG9TaG93ID0gaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgZmllbGRzVG9TaG93LFxuICAgICAgICBsYXllclxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckRlY2tHbExheWVyKHByb3BzLCBsYXllckNhbGxiYWNrcywgaWR4KSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgbGF5ZXJEYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBtYXBMYXllcnNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBsYXllciA9IGxheWVyc1tpZHhdO1xuICBjb25zdCBkYXRhID0gbGF5ZXJEYXRhW2lkeF07XG4gIGNvbnN0IHtncHVGaWx0ZXJ9ID0gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0gfHwge307XG4gIGNvbnN0IG9iamVjdEhvdmVyZWQgPSBjbGlja2VkIHx8IGhvdmVySW5mbztcbiAgY29uc3QgdmlzaWJsZSA9ICFtYXBMYXllcnMgfHwgKG1hcExheWVycyAmJiBtYXBMYXllcnNbbGF5ZXIuaWRdKTtcbiAgLy8gTGF5ZXIgaXMgTGF5ZXIgY2xhc3NcbiAgcmV0dXJuIGxheWVyLnJlbmRlckxheWVyKHtcbiAgICBkYXRhLFxuICAgIGdwdUZpbHRlcixcbiAgICBpZHgsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgbGF5ZXJDYWxsYmFja3MsXG4gICAgbWFwU3RhdGUsXG4gICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgdmlzaWJsZVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGEpIHtcbiAgcmV0dXJuIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRCAmJiBsYXllci5zaG91bGRSZW5kZXJMYXllcihsYXllckRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycykge1xuICByZXR1cm4gKFxuICAgIGxheWVyLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBkb24ndCByZW5kZXIgaXRcbiAgICAoIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pKVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiBsYXllcnMgcmVuZGVyZWQgYnkgdGhlIGRlY2suZ2xcbi8vIE5vdGUsIGlzVmlzaWJsZTogZmFsc2UgbGF5ZXIgaXMgcGFzc2VkIHRvIGRlY2suZ2wgaGVyZVxuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNGb3JEZWNrKGxheWVycywgbGF5ZXJEYXRhKSB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06XG4gICAgICAgIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgbGF5ZXIub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRS5kZWNrZ2xcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiByZW5kZXJlZCBsYXllcnMgcmVuZGVyZWQgaW4gdGhlIG1hcFxuLy8gVGhpcyBpbmNsdWRlcyBvbmx5IHRoZSB2aXNpYmlsZSBsYXllcnMgZm9yIHNpbmdsZSBtYXAgdmlldyBhbmQgc3BsaXQgbWFwIHZpZXdcbi8vIHJldHVybiB7W2lkXTogdHJ1ZSBcXCBmYWxzZX1cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGF5ZXJzVG9SZW5kZXIobGF5ZXJzLCBsYXllckRhdGEsIG1hcExheWVycykge1xuICByZXR1cm4gbGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIsIGlkeCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuaWRdOiBpc0xheWVyUmVuZGVyYWJsZShsYXllciwgbGF5ZXJEYXRhW2lkeF0pICYmIGlzTGF5ZXJWaXNpYmxlKGxheWVyLCBtYXBMYXllcnMpXG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cbiJdfQ==