UNPKG

kepler.gl.geoiq

Version:

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

214 lines (178 loc) 24.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.editTopMapStyle = exports.editBottomMapStyle = void 0; exports.getDefaultLayerGroupVisibility = getDefaultLayerGroupVisibility; exports.getStyleDownloadUrl = getStyleDownloadUrl; exports.getStyleImageIcon = getStyleImageIcon; exports.isValidStyleUrl = isValidStyleUrl; exports.mergeLayerGroupVisibility = mergeLayerGroupVisibility; exports.scaleMapStyleByResolution = scaleMapStyleByResolution; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _lodash2 = _interopRequireDefault(require("lodash.clonedeep")); var _defaultSettings = require("../../constants/default-settings"); 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 mapUrlRg = /^mapbox:\/\/styles\/[-a-z0-9]{2,256}\/[-a-z0-9]{2,256}/; var httpRg = /^(?=(http:|https:))/; function getDefaultLayerGroupVisibility(_ref) { var _ref$layerGroups = _ref.layerGroups, layerGroups = _ref$layerGroups === void 0 ? [] : _ref$layerGroups; return layerGroups.reduce(function (accu, layer) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.slug, layer.defaultVisibility)); }, {}); } var resolver = function resolver(_ref2) { var id = _ref2.id, mapStyle = _ref2.mapStyle, _ref2$visibleLayerGro = _ref2.visibleLayerGroups, visibleLayerGroups = _ref2$visibleLayerGro === void 0 ? {} : _ref2$visibleLayerGro; return "".concat(id, ":").concat(Object.keys(visibleLayerGroups).filter(function (d) { return visibleLayerGroups[d]; }).sort().join('-')); }; /** * Edit preset map style to keep only visible layers * * @param {Object} mapStyle - preset map style * @param {Object} visibleLayerGroups - visible layers of top map * @returns {Object} top map style */ var editTopMapStyle = exports.editTopMapStyle = (0, _lodash["default"])(function (_ref3) { var id = _ref3.id, mapStyle = _ref3.mapStyle, visibleLayerGroups = _ref3.visibleLayerGroups; var visibleFilters = (mapStyle.layerGroups || []).filter(function (lg) { return visibleLayerGroups[lg.slug]; }).map(function (lg) { return lg.filter; }); // if top map // keep only visible layers var filteredLayers = mapStyle.style.layers.filter(function (layer) { return visibleFilters.some(function (match) { return match(layer); }); }); return _objectSpread(_objectSpread({}, mapStyle.style), {}, { layers: filteredLayers }); }, resolver); /** * Edit preset map style to filter out invisible layers * * @param {Object} mapStyle - preset map style * @param {Object} visibleLayerGroups - visible layers of bottom map * @returns {Object} bottom map style */ var editBottomMapStyle = exports.editBottomMapStyle = (0, _lodash["default"])(function (_ref4) { var id = _ref4.id, mapStyle = _ref4.mapStyle, visibleLayerGroups = _ref4.visibleLayerGroups; var invisibleFilters = (mapStyle.layerGroups || []).filter(function (lg) { return !visibleLayerGroups[lg.slug]; }).map(function (lg) { return lg.filter; }); // if bottom map // filter out invisible layers var filteredLayers = mapStyle.style.layers.filter(function (layer) { return invisibleFilters.every(function (match) { return !match(layer); }); }); return _objectSpread(_objectSpread({}, mapStyle.style), {}, { layers: filteredLayers }); }, resolver); // valid style url // mapbox://styles/uberdata/cjfyl03kp1tul2smf5v2tbdd4 // lowercase letters, numbers and dashes only. function isValidStyleUrl(url) { return typeof url === 'string' && Boolean(url.match(mapUrlRg) || url.match(httpRg)); } function getStyleDownloadUrl(styleUrl, accessToken, mapboxApiUrl) { if (styleUrl.startsWith('http')) { return styleUrl; } // mapbox://styles/jckr/cjhcl0lxv13di2rpfoytdbdyj if (styleUrl.startsWith('mapbox://styles')) { var styleId = styleUrl.replace('mapbox://styles/', ''); // https://api.mapbox.com/styles/v1/heshan0131/cjg1bfumo1cwm2rlrjxkinfgw?pluginName=Keplergl&access_token=<token> return "".concat(mapboxApiUrl || _defaultSettings.DEFAULT_MAPBOX_API_URL, "/styles/v1/").concat(styleId, "?pluginName=Keplergl&access_token=").concat(accessToken); } // style url not recognized return null; } /** * Generate static map image from style Url to be used as icon * @param {Object} param * @param {string} param.styleUrl * @param {string} param.mapboxApiAccessToken * @param {string} param.mapboxApiUrl * @param {Object} param.mapState * @param {numbers} param.mapW * @param {numbers} param.mapH */ function getStyleImageIcon(_ref5) { var styleUrl = _ref5.styleUrl, mapboxApiAccessToken = _ref5.mapboxApiAccessToken, _ref5$mapboxApiUrl = _ref5.mapboxApiUrl, mapboxApiUrl = _ref5$mapboxApiUrl === void 0 ? _defaultSettings.DEFAULT_MAPBOX_API_URL : _ref5$mapboxApiUrl, _ref5$mapState = _ref5.mapState, mapState = _ref5$mapState === void 0 ? { longitude: -122.3391, latitude: 37.7922, zoom: 9 } : _ref5$mapState, _ref5$mapW = _ref5.mapW, mapW = _ref5$mapW === void 0 ? 400 : _ref5$mapW, _ref5$mapH = _ref5.mapH, mapH = _ref5$mapH === void 0 ? 300 : _ref5$mapH; var styleId = styleUrl.replace('mapbox://styles/', ''); return "".concat(mapboxApiUrl, "/styles/v1/").concat(styleId, "/static/") + "".concat(mapState.longitude, ",").concat(mapState.latitude, ",").concat(mapState.zoom, ",0,0/") + "".concat(mapW, "x").concat(mapH) + "?access_token=".concat(mapboxApiAccessToken, "&logo=false&attribution=false"); } function scaleMapStyleByResolution(mapboxStyle, resolution) { var labelLayerGroup = _defaultSettings.DEFAULT_LAYER_GROUPS.find(function (lg) { return lg.slug === 'label'; }); var labelLayerFilter = labelLayerGroup.filter; if (resolution !== _defaultSettings.RESOLUTIONS.ONE_X && mapboxStyle) { var _RESOLUTION_OPTIONS$f2 = _defaultSettings.RESOLUTION_OPTIONS.find(function (r) { return r.id === resolution; }), scale = _RESOLUTION_OPTIONS$f2.scale, zoomOffset = _RESOLUTION_OPTIONS$f2.zoomOffset; var copyStyle = (0, _lodash2["default"])(mapboxStyle); (copyStyle.layers || []).forEach(function (d) { // edit minzoom and maxzoom if (d.maxzoom) { d.maxzoom += zoomOffset; } if (d.minzoom) { d.minzoom += zoomOffset; } // edit text size if (labelLayerFilter(d)) { if (d.layout && d.layout['text-size'] && Array.isArray(d.layout['text-size'].stops)) { d.layout['text-size'].stops.forEach(function (stop) { // zoom stop[0] += Math.log2(scale); // size stop[1] *= scale; }); } } }); return copyStyle; } return mapboxStyle; } /** * When switch to a new style, try to keep current layer group visibility * by merging default and current * @param {Object} defaultLayerGroup * @param {Object} currentLayerGroup * @return {Object} mergedLayerGroups */ function mergeLayerGroupVisibility(defaultLayerGroup, currentLayerGroup) { return Object.keys(currentLayerGroup).reduce(function (accu, key) { return _objectSpread(_objectSpread({}, accu), defaultLayerGroup.hasOwnProperty(key) ? (0, _defineProperty2["default"])({}, key, currentLayerGroup[key]) : {}); }, defaultLayerGroup); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvci5qcyJdLCJuYW1lcyI6WyJtYXBVcmxSZyIsImh0dHBSZyIsImdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSIsImxheWVyR3JvdXBzIiwicmVkdWNlIiwiYWNjdSIsImxheWVyIiwic2x1ZyIsImRlZmF1bHRWaXNpYmlsaXR5IiwicmVzb2x2ZXIiLCJpZCIsIm1hcFN0eWxlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImQiLCJzb3J0Iiwiam9pbiIsImVkaXRUb3BNYXBTdHlsZSIsInZpc2libGVGaWx0ZXJzIiwibGciLCJtYXAiLCJmaWx0ZXJlZExheWVycyIsInN0eWxlIiwibGF5ZXJzIiwic29tZSIsIm1hdGNoIiwiZWRpdEJvdHRvbU1hcFN0eWxlIiwiaW52aXNpYmxlRmlsdGVycyIsImV2ZXJ5IiwiaXNWYWxpZFN0eWxlVXJsIiwidXJsIiwiQm9vbGVhbiIsImdldFN0eWxlRG93bmxvYWRVcmwiLCJzdHlsZVVybCIsImFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwic3RhcnRzV2l0aCIsInN0eWxlSWQiLCJyZXBsYWNlIiwiREVGQVVMVF9NQVBCT1hfQVBJX1VSTCIsImdldFN0eWxlSW1hZ2VJY29uIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBTdGF0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiem9vbSIsIm1hcFciLCJtYXBIIiwic2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbiIsIm1hcGJveFN0eWxlIiwicmVzb2x1dGlvbiIsImxhYmVsTGF5ZXJHcm91cCIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmluZCIsImxhYmVsTGF5ZXJGaWx0ZXIiLCJSRVNPTFVUSU9OUyIsIk9ORV9YIiwiUkVTT0xVVElPTl9PUFRJT05TIiwiciIsInNjYWxlIiwiem9vbU9mZnNldCIsImNvcHlTdHlsZSIsImZvckVhY2giLCJtYXh6b29tIiwibWluem9vbSIsImxheW91dCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwic3RvcCIsIk1hdGgiLCJsb2cyIiwibWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eSIsImRlZmF1bHRMYXllckdyb3VwIiwiY3VycmVudExheWVyR3JvdXAiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7Ozs7OztBQU9BLElBQU1BLFFBQVEsR0FBRyx3REFBakI7QUFDQSxJQUFNQyxNQUFNLEdBQUcscUJBQWY7O0FBRU8sU0FBU0MsOEJBQVQsT0FBNEQ7QUFBQSw4QkFBbkJDLFdBQW1CO0FBQUEsTUFBbkJBLFdBQW1CLGlDQUFMLEVBQUs7QUFDakUsU0FBT0EsV0FBVyxDQUFDQyxNQUFaLENBQ0wsVUFBQ0MsSUFBRCxFQUFPQyxLQUFQO0FBQUEsMkNBQ0tELElBREwsNENBRUdDLEtBQUssQ0FBQ0MsSUFGVCxFQUVnQkQsS0FBSyxDQUFDRSxpQkFGdEI7QUFBQSxHQURLLEVBS0wsRUFMSyxDQUFQO0FBT0Q7O0FBRUQsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVc7QUFBQSxNQUFFQyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxNQUFNQyxRQUFOLFNBQU1BLFFBQU47QUFBQSxvQ0FBZ0JDLGtCQUFoQjtBQUFBLE1BQWdCQSxrQkFBaEIsc0NBQXFDLEVBQXJDO0FBQUEsbUJBQ1pGLEVBRFksY0FDTkcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLGtCQUFaLEVBQ05HLE1BRE0sQ0FDQyxVQUFBQyxDQUFDO0FBQUEsV0FBSUosa0JBQWtCLENBQUNJLENBQUQsQ0FBdEI7QUFBQSxHQURGLEVBRU5DLElBRk0sR0FHTkMsSUFITSxDQUdELEdBSEMsQ0FETTtBQUFBLENBQWpCO0FBTUE7Ozs7Ozs7OztBQU9PLElBQU1DLGVBQWUsNkJBQUcsd0JBQVEsaUJBQXdDO0FBQUEsTUFBdENULEVBQXNDLFNBQXRDQSxFQUFzQztB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RUQ7Ozs7Ozs7OztBQU9PLFNBQVN1Qix5QkFBVCxDQUFtQ0MsaUJBQW5DLEVBQXNEQyxpQkFBdEQsRUFBeUU7QUFDOUUsU0FBTy9ELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZOEQsaUJBQVosRUFDSnhFLE1BREksQ0FDRyxVQUFDQyxJQUFELEVBQU93RSxHQUFQO0FBQUEsMkNBQ0h4RSxJQURHLEdBRUZzRSxpQkFBaUIsQ0FBQ0csY0FBbEIsQ0FBaUNELEdBQWpDLHlDQUEwQ0EsR0FBMUMsRUFBZ0RELGlCQUFpQixDQUFDQyxHQUFELENBQWpFLElBQTBFLEVBRnhFO0FBQUEsR0FESCxFQUlERixpQkFKQyxDQUFQO0FBS0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdsb2Rhc2gubWVtb2l6ZSc7XG5pbXBvcnQgY2xvbmREZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9MQVlFUl9HUk9VUFMsXG4gIFJFU09MVVRJT05TLFxuICBSRVNPTFVUSU9OX09QVElPTlMsXG4gIERFRkFVTFRfTUFQQk9YX0FQSV9VUkxcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5jb25zdCBtYXBVcmxSZyA9IC9ebWFwYm94OlxcL1xcL3N0eWxlc1xcL1stYS16MC05XXsyLDI1Nn1cXC9bLWEtejAtOV17MiwyNTZ9LztcbmNvbnN0IGh0dHBSZyA9IC9eKD89KGh0dHA6fGh0dHBzOikpLztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSh7bGF5ZXJHcm91cHMgPSBbXX0pIHtcbiAgcmV0dXJuIGxheWVyR3JvdXBzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2xheWVyLnNsdWddOiBsYXllci5kZWZhdWx0VmlzaWJpbGl0eVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbmNvbnN0IHJlc29sdmVyID0gKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3VwcyA9IHt9fSkgPT5cbiAgYCR7aWR9OiR7T2JqZWN0LmtleXModmlzaWJsZUxheWVyR3JvdXBzKVxuICAgIC5maWx0ZXIoZCA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbZF0pXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCctJyl9YDtcblxuLyoqXG4gKiBFZGl0IHByZXNldCBtYXAgc3R5bGUgdG8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hcFN0eWxlIC0gcHJlc2V0IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIHRvcCBtYXBcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRvcCBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUb3BNYXBTdHlsZSA9IG1lbW9pemUoKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgY29uc3QgdmlzaWJsZUZpbHRlcnMgPSAobWFwU3R5bGUubGF5ZXJHcm91cHMgfHwgW10pXG4gICAgLmZpbHRlcihsZyA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbbGcuc2x1Z10pXG4gICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gIC8vIGlmIHRvcCBtYXBcbiAgLy8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgIHZpc2libGVGaWx0ZXJzLnNvbWUobWF0Y2ggPT4gbWF0Y2gobGF5ZXIpKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4ubWFwU3R5bGUuc3R5bGUsXG4gICAgbGF5ZXJzOiBmaWx0ZXJlZExheWVyc1xuICB9O1xufSwgcmVzb2x2ZXIpO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBmaWx0ZXIgb3V0IGludmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0ge09iamVjdH0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgYm90dG9tIG1hcFxuICogQHJldHVybnMge09iamVjdH0gYm90dG9tIG1hcCBzdHlsZVxuICovXG5leHBvcnQgY29uc3QgZWRpdEJvdHRvbU1hcFN0eWxlID0gbWVtb2l6ZShcbiAgKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgICBjb25zdCBpbnZpc2libGVGaWx0ZXJzID0gKG1hcFN0eWxlLmxheWVyR3JvdXBzIHx8IFtdKVxuICAgICAgLmZpbHRlcihsZyA9PiAhdmlzaWJsZUxheWVyR3JvdXBzW2xnLnNsdWddKVxuICAgICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gICAgLy8gaWYgYm90dG9tIG1hcFxuICAgIC8vIGZpbHRlciBvdXQgaW52aXNpYmxlIGxheWVyc1xuICAgIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgICAgaW52aXNpYmxlRmlsdGVycy5ldmVyeShtYXRjaCA9PiAhbWF0Y2gobGF5ZXIpKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFwU3R5bGUuc3R5bGUsXG4gICAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gICAgfTtcbiAgfSxcbiAgcmVzb2x2ZXJcbik7XG5cbi8vIHZhbGlkIHN0eWxlIHVybFxuLy8gbWFwYm94Oi8vc3R5bGVzL3ViZXJkYXRhL2NqZnlsMDNrcDF0dWwyc21mNXYydGJkZDRcbi8vIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMgb25seS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3R5bGVVcmwodXJsKSB7XG4gIHJldHVybiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBCb29sZWFuKHVybC5tYXRjaChtYXBVcmxSZykgfHwgdXJsLm1hdGNoKGh0dHBSZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVEb3dubG9hZFVybChzdHlsZVVybCwgYWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCkge1xuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgcmV0dXJuIHN0eWxlVXJsO1xuICB9XG5cbiAgLy8gbWFwYm94Oi8vc3R5bGVzL2pja3IvY2poY2wwbHh2MTNkaTJycGZveXRkYmR5alxuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnbWFwYm94Oi8vc3R5bGVzJykpIHtcbiAgICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICAgIC8vIGh0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxL2hlc2hhbjAxMzEvY2pnMWJmdW1vMWN3bTJybHJqeGtpbmZndz9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj08dG9rZW4+XG4gICAgcmV0dXJuIGAke21hcGJveEFwaVVybCB8fCBERUZBVUxUX01BUEJPWF9BUElfVVJMfS9zdHlsZXMvdjEvJHtzdHlsZUlkfT9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWBcbiAgfVxuXG4gIC8vIHN0eWxlIHVybCBub3QgcmVjb2duaXplZFxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBzdGF0aWMgbWFwIGltYWdlIGZyb20gc3R5bGUgVXJsIHRvIGJlIHVzZWQgYXMgaWNvblxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW0uc3R5bGVVcmxcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbS5tYXBib3hBcGlBY2Nlc3NUb2tlblxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtLm1hcGJveEFwaVVybFxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtLm1hcFN0YXRlXG4gKiBAcGFyYW0ge251bWJlcnN9IHBhcmFtLm1hcFdcbiAqIEBwYXJhbSB7bnVtYmVyc30gcGFyYW0ubWFwSFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVJbWFnZUljb24oe1xuICBzdHlsZVVybCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gIG1hcGJveEFwaVVybCA9IERFRkFVTFRfTUFQQk9YX0FQSV9VUkwsXG4gIG1hcFN0YXRlID0ge1xuICAgIGxvbmdpdHVkZTogLTEyMi4zMzkxLFxuICAgIGxhdGl0dWRlOiAzNy43OTIyLFxuICAgIHpvb206IDlcbiAgfSxcbiAgbWFwVyA9IDQwMCxcbiAgbWFwSCA9IDMwMFxufSkge1xuICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICByZXR1cm4gYCR7bWFwYm94QXBpVXJsfS9zdHlsZXMvdjEvJHtzdHlsZUlkfS9zdGF0aWMvYCArXG4gIGAke21hcFN0YXRlLmxvbmdpdHVkZX0sJHttYXBTdGF0ZS5sYXRpdHVkZX0sJHttYXBTdGF0ZS56b29tfSwwLDAvYCArXG4gIGAke21hcFd9eCR7bWFwSH1gICtcbiAgYD9hY2Nlc3NfdG9rZW49JHttYXBib3hBcGlBY2Nlc3NUb2tlbn0mbG9nbz1mYWxzZSZhdHRyaWJ1dGlvbj1mYWxzZWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcGJveFN0eWxlLCByZXNvbHV0aW9uKSB7XG4gIGNvbnN0IGxhYmVsTGF5ZXJHcm91cCA9IERFRkFVTFRfTEFZRVJfR1JPVVBTLmZpbmQobGcgPT4gbGcuc2x1ZyA9PT0gJ2xhYmVsJyk7XG4gIGNvbnN0IHtmaWx0ZXI6IGxhYmVsTGF5ZXJGaWx0ZXJ9ID0gbGFiZWxMYXllckdyb3VwO1xuXG4gIGlmIChyZXNvbHV0aW9uICE9PSBSRVNPTFVUSU9OUy5PTkVfWCAmJiBtYXBib3hTdHlsZSkge1xuICAgIGNvbnN0IHtzY2FsZSwgem9vbU9mZnNldH0gPSBSRVNPTFVUSU9OX09QVElPTlMuZmluZChcbiAgICAgIHIgPT4gci5pZCA9PT0gcmVzb2x1dGlvblxuICAgICk7XG4gICAgY29uc3QgY29weVN0eWxlID0gY2xvbmREZWVwKG1hcGJveFN0eWxlKTtcbiAgICAoY29weVN0eWxlLmxheWVycyB8fCBbXSkuZm9yRWFjaChkID0+IHtcbiAgICAgIC8vIGVkaXQgbWluem9vbSBhbmQgbWF4em9vbVxuICAgICAgaWYgKGQubWF4em9vbSkge1xuICAgICAgICBkLm1heHpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGQubWluem9vbSkge1xuICAgICAgICBkLm1pbnpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgLy8gZWRpdCB0ZXh0IHNpemVcbiAgICAgIGlmIChsYWJlbExheWVyRmlsdGVyKGQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkLmxheW91dCAmJlxuICAgICAgICAgIGQubGF5b3V0Wyd0ZXh0LXNpemUnXSAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzKVxuICAgICAgICApIHtcbiAgICAgICAgICBkLmxheW91dFsndGV4dC1zaXplJ10uc3RvcHMuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgICAgICAgIC8vIHpvb21cbiAgICAgICAgICAgIHN0b3BbMF0gKz0gTWF0aC5sb2cyKHNjYWxlKTtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIHN0b3BbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3B5U3R5bGU7XG4gIH1cblxuICByZXR1cm4gbWFwYm94U3R5bGU7XG59XG5cbi8qKlxuICogV2hlbiBzd2l0Y2ggdG8gYSBuZXcgc3R5bGUsIHRyeSB0byBrZWVwIGN1cnJlbnQgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogYnkgbWVyZ2luZyBkZWZhdWx0IGFuZCBjdXJyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdExheWVyR3JvdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50TGF5ZXJHcm91cFxuICogQHJldHVybiB7T2JqZWN0fSBtZXJnZWRMYXllckdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShkZWZhdWx0TGF5ZXJHcm91cCwgY3VycmVudExheWVyR3JvdXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRMYXllckdyb3VwKVxuICAgIC5yZWR1Y2UoKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oZGVmYXVsdExheWVyR3JvdXAuaGFzT3duUHJvcGVydHkoa2V5KSA/IHtba2V5XTogY3VycmVudExheWVyR3JvdXBba2V5XX0gOiB7fSlcbiAgICB9KSwgZGVmYXVsdExheWVyR3JvdXApO1xufVxuXG4iXX0=