UNPKG

kepler.gl

Version:

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

179 lines (176 loc) 31.6 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; exports.getDatasetAttributesFromRasterTile = getDatasetAttributesFromRasterTile; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/common-utils/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/table/src"); var _src4 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _useFetchRasterTileMetadata = _interopRequireDefault(require("../../hooks/use-fetch-raster-tile-metadata")); var _common = require("../../common"); var _templateObject, _templateObject2; // 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 TilesetInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-rows: repeat(3, 1fr);\n row-gap: 18px;\n font-size: 12px;\n"]))); var TilesetInputDescription = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: center;\n color: ", ";\n font-size: 11px;\n"])), function (props) { return props.theme.AZURE200; }); function getDatasetAttributesFromRasterTile(_ref) { var name = _ref.name, metadataUrl = _ref.metadataUrl, rasterTileServerUrls = _ref.rasterTileServerUrls; return { name: name, type: _src2.DatasetType.RASTER_TILE, metadata: _objectSpread({ metadataUrl: metadataUrl }, rasterTileServerUrls ? { rasterTileServerUrls: rasterTileServerUrls } : {}) }; } var parseMetadataAllowCollections = function parseMetadataAllowCollections(metadata, _ref2) { var metadataUrl = _ref2.metadataUrl, rasterTileType = _ref2.rasterTileType; return rasterTileType === _src2.RasterTileType.PMTILES ? (0, _src3.parseVectorMetadata)(metadata, { tileUrl: metadataUrl }) : (0, _src3.parseRasterMetadata)(metadata, { allowCollections: true }); }; var RasterTileForm = function RasterTileForm(_ref3) { var setResponse = _ref3.setResponse; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), tileName = _useState2[0], setTileName = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), tileNameWasModified = _useState4[0], setTileNameWasModified = _useState4[1]; var _useState5 = (0, _react.useState)(''), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), metadataUrl = _useState6[0], setMetadataUrl = _useState6[1]; var _useState7 = (0, _react.useState)(((0, _src4.getApplicationConfig)().rasterServerUrls || []).join(',')), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), rasterTileServerUrls = _useState8[0], setRasterTileServerUrls = _useState8[1]; // Remove trailing slash to prevent issues with raster tile servers var clearedMetadataUrl = metadataUrl.endsWith('/') ? metadataUrl.slice(0, -1) : metadataUrl; var onTileNameChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setTileNameWasModified(true); setTileName(event.target.value); }, [setTileName]); var onMetadataUrlChange = (0, _react.useCallback)(function (event) { event.preventDefault(); var value = event.target.value; setMetadataUrl(value); if (!tileNameWasModified) { setTileName(value.split('/').filter(Boolean).pop() || ''); } }, [tileNameWasModified]); var onRasterTileServerUrlsChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setRasterTileServerUrls(event.target.value); }, [setRasterTileServerUrls]); var _useFetchJson = (0, _useFetchRasterTileMetadata["default"])({ url: clearedMetadataUrl, rasterTileType: (0, _src.isPMTilesUrl)(clearedMetadataUrl) ? _src2.RasterTileType.PMTILES : _src2.RasterTileType.STAC, process: parseMetadataAllowCollections }), metadata = _useFetchJson.data, loading = _useFetchJson.loading, metaError = _useFetchJson.error; (0, _react.useEffect)(function () { if (tileName && clearedMetadataUrl) { var pmtilesType = metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType; if (pmtilesType === _src2.PMTilesType.MVT) { return setResponse({ metadata: metadata, dataset: null, loading: loading, error: new Error('For .pmtiles in mvt format, please use the Vector Tile form.') }); } var error = metaError; // check for raster tile servers for STAC items and collections var rasterTileServers; if (!error // We still need raster tile servers for PMTiles when we plan to use elevation ) { rasterTileServers = rasterTileServerUrls.split(',').map(function (server) { return server.trim(); }).filter(function (server) { return server; }); if (rasterTileServers.length < 1 || !rasterTileServers.every(function (server) { return (0, _src.validateUrl)(server); })) { if (pmtilesType) { // For raster tiles elevation support is optional // TODO display a warning, but not a blocking error rasterTileServers = []; } else { error = new Error('Provide valid raster tile server urls to support STAC and elevations.'); } } } var dataset = getDatasetAttributesFromRasterTile({ name: tileName, metadataUrl: clearedMetadataUrl, rasterTileServerUrls: rasterTileServers }); setResponse({ metadata: metadata, dataset: dataset, loading: loading, error: error }); } else { setResponse({ metadata: metadata, dataset: null, loading: loading, error: metaError }); } }, [metadata, loading, metaError, tileName, clearedMetadataUrl, rasterTileServerUrls, setResponse]); return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tileset-name" }, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tileset-name", placeholder: "Name your tileset", value: tileName, onChange: onTileNameChange })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tile-metadata" }, "Tileset metadata URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tile-metadata", placeholder: "Tileset metadata URL", value: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined, onChange: onMetadataUrlChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Supports raster .pmtiles. Limited support for STAC Items and Collections.")), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tileset-raster-servers" }, "Raster tile servers"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tileset-raster-servers", placeholder: "Raster tile servers (separated by commas)", value: rasterTileServerUrls, onChange: onRasterTileServerUrlsChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Raster tile server URLs for Cloud Optimized GeoTIFF tilesets and elevation."))); }; var _default = exports["default"] = RasterTileForm; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3JjIiwiX3NyYzIiLCJfc3JjMyIsIl9zcmM0IiwiX3VzZUZldGNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUaWxlc2V0SW5wdXRDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlRpbGVzZXRJbnB1dERlc2NyaXB0aW9uIiwicHJvcHMiLCJ0aGVtZSIsIkFaVVJFMjAwIiwiZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSIsIl9yZWYiLCJuYW1lIiwibWV0YWRhdGFVcmwiLCJyYXN0ZXJUaWxlU2VydmVyVXJscyIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIlJBU1RFUl9USUxFIiwibWV0YWRhdGEiLCJwYXJzZU1ldGFkYXRhQWxsb3dDb2xsZWN0aW9ucyIsIl9yZWYyIiwicmFzdGVyVGlsZVR5cGUiLCJSYXN0ZXJUaWxlVHlwZSIsIlBNVElMRVMiLCJwYXJzZVZlY3Rvck1ldGFkYXRhIiwidGlsZVVybCIsInBhcnNlUmFzdGVyTWV0YWRhdGEiLCJhbGxvd0NvbGxlY3Rpb25zIiwiUmFzdGVyVGlsZUZvcm0iLCJfcmVmMyIsInNldFJlc3BvbnNlIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwidGlsZU5hbWUiLCJzZXRUaWxlTmFtZSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwidGlsZU5hbWVXYXNNb2RpZmllZCIsInNldFRpbGVOYW1lV2FzTW9kaWZpZWQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInNldE1ldGFkYXRhVXJsIiwiX3VzZVN0YXRlNyIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwicmFzdGVyU2VydmVyVXJscyIsImpvaW4iLCJfdXNlU3RhdGU4Iiwic2V0UmFzdGVyVGlsZVNlcnZlclVybHMiLCJjbGVhcmVkTWV0YWRhdGFVcmwiLCJlbmRzV2l0aCIsInNsaWNlIiwib25UaWxlTmFtZUNoYW5nZSIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsInZhbHVlIiwib25NZXRhZGF0YVVybENoYW5nZSIsInNwbGl0IiwiQm9vbGVhbiIsInBvcCIsIm9uUmFzdGVyVGlsZVNlcnZlclVybHNDaGFuZ2UiLCJfdXNlRmV0Y2hKc29uIiwidXNlRmV0Y2hKc29uIiwidXJsIiwiaXNQTVRpbGVzVXJsIiwiU1RBQyIsInByb2Nlc3MiLCJkYXRhIiwibG9hZGluZyIsIm1ldGFFcnJvciIsImVycm9yIiwidXNlRWZmZWN0IiwicG10aWxlc1R5cGUiLCJQTVRpbGVzVHlwZSIsIk1WVCIsImRhdGFzZXQiLCJFcnJvciIsInJhc3RlclRpbGVTZXJ2ZXJzIiwibWFwIiwic2VydmVyIiwidHJpbSIsImV2ZXJ5IiwidmFsaWRhdGVVcmwiLCJjcmVhdGVFbGVtZW50IiwiaHRtbEZvciIsIklucHV0TGlnaHQiLCJpZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJ1bmRlZmluZWQiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvbW9kYWxzL3RpbGVzZXRzLW1vZGFscy90aWxlc2V0LXJhc3Rlci1mb3JtLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7UE1UaWxlc01ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9wbXRpbGVzJztcblxuaW1wb3J0IHtpc1BNVGlsZXNVcmwsIHZhbGlkYXRlVXJsfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0RhdGFzZXRUeXBlLCBSYXN0ZXJUaWxlVHlwZSwgUE1UaWxlc1R5cGV9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7SnNvbk9iamVjdE9yQXJyYXl9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtwYXJzZVJhc3Rlck1ldGFkYXRhLCBwYXJzZVZlY3Rvck1ldGFkYXRhfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7Z2V0QXBwbGljYXRpb25Db25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge2RlZmF1bHQgYXMgdXNlRmV0Y2hKc29ufSBmcm9tICcuLi8uLi9ob29rcy91c2UtZmV0Y2gtcmFzdGVyLXRpbGUtbWV0YWRhdGEnO1xuaW1wb3J0IHtEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzLCBNZXRhUmVzcG9uc2V9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7SW5wdXRMaWdodH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuY29uc3QgVGlsZXNldElucHV0Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoMywgMWZyKTtcbiAgcm93LWdhcDogMThweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuYDtcblxuY29uc3QgVGlsZXNldElucHV0RGVzY3JpcHRpb24gPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkFaVVJFMjAwfTtcbiAgZm9udC1zaXplOiAxMXB4O1xuYDtcblxuZXhwb3J0IHR5cGUgUmFzdGVyVGlsZXNldE1ldGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGFVcmw6IHN0cmluZztcbiAgcmFzdGVyVGlsZVNlcnZlclVybHM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhc2V0QXR0cmlidXRlc0Zyb21SYXN0ZXJUaWxlKHtcbiAgbmFtZSxcbiAgbWV0YWRhdGFVcmwsXG4gIHJhc3RlclRpbGVTZXJ2ZXJVcmxzXG59OiBSYXN0ZXJUaWxlc2V0TWV0YSk6IERhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogRGF0YXNldFR5cGUuUkFTVEVSX1RJTEUsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIG1ldGFkYXRhVXJsLFxuICAgICAgLi4uKHJhc3RlclRpbGVTZXJ2ZXJVcmxzID8ge3Jhc3RlclRpbGVTZXJ2ZXJVcmxzfSA6IHt9KVxuICAgIH1cbiAgfTtcbn1cblxudHlwZSBSYXN0ZXJUaWxlRm9ybVByb3BzID0ge1xuICBzZXRSZXNwb25zZTogKHJlc3BvbnNlOiBNZXRhUmVzcG9uc2UpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBwYXJzZU1ldGFkYXRhQWxsb3dDb2xsZWN0aW9ucyA9IChcbiAgbWV0YWRhdGE6IEpzb25PYmplY3RPckFycmF5IHwgUE1UaWxlc01ldGFkYXRhLFxuICB7bWV0YWRhdGFVcmwsIHJhc3RlclRpbGVUeXBlfToge21ldGFkYXRhVXJsOiBzdHJpbmc7IHJhc3RlclRpbGVUeXBlOiBSYXN0ZXJUaWxlVHlwZX1cbikgPT4ge1xuICByZXR1cm4gcmFzdGVyVGlsZVR5cGUgPT09IFJhc3RlclRpbGVUeXBlLlBNVElMRVNcbiAgICA/IHBhcnNlVmVjdG9yTWV0YWRhdGEobWV0YWRhdGEgYXMgUE1UaWxlc01ldGFkYXRhLCB7XG4gICAgICAgIHRpbGVVcmw6IG1ldGFkYXRhVXJsXG4gICAgICB9KVxuICAgIDogcGFyc2VSYXN0ZXJNZXRhZGF0YShtZXRhZGF0YSBhcyBKc29uT2JqZWN0T3JBcnJheSwge2FsbG93Q29sbGVjdGlvbnM6IHRydWV9KTtcbn07XG5cbmNvbnN0IFJhc3RlclRpbGVGb3JtOiBSZWFjdC5GQzxSYXN0ZXJUaWxlRm9ybVByb3BzPiA9ICh7c2V0UmVzcG9uc2V9KSA9PiB7XG4gIGNvbnN0IFt0aWxlTmFtZSwgc2V0VGlsZU5hbWVdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG4gIGNvbnN0IFt0aWxlTmFtZVdhc01vZGlmaWVkLCBzZXRUaWxlTmFtZVdhc01vZGlmaWVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW21ldGFkYXRhVXJsLCBzZXRNZXRhZGF0YVVybF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3Jhc3RlclRpbGVTZXJ2ZXJVcmxzLCBzZXRSYXN0ZXJUaWxlU2VydmVyVXJsc10gPSB1c2VTdGF0ZTxzdHJpbmc+KFxuICAgIChnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnJhc3RlclNlcnZlclVybHMgfHwgW10pLmpvaW4oJywnKVxuICApO1xuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaCB0byBwcmV2ZW50IGlzc3VlcyB3aXRoIHJhc3RlciB0aWxlIHNlcnZlcnNcbiAgY29uc3QgY2xlYXJlZE1ldGFkYXRhVXJsID0gbWV0YWRhdGFVcmwuZW5kc1dpdGgoJy8nKSA/IG1ldGFkYXRhVXJsLnNsaWNlKDAsIC0xKSA6IG1ldGFkYXRhVXJsO1xuXG4gIGNvbnN0IG9uVGlsZU5hbWVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0VGlsZU5hbWVXYXNNb2RpZmllZCh0cnVlKTtcbiAgICAgIHNldFRpbGVOYW1lKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBbc2V0VGlsZU5hbWVdXG4gICk7XG5cbiAgY29uc3Qgb25NZXRhZGF0YVVybENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgc2V0TWV0YWRhdGFVcmwodmFsdWUpO1xuXG4gICAgICBpZiAoIXRpbGVOYW1lV2FzTW9kaWZpZWQpIHtcbiAgICAgICAgc2V0VGlsZU5hbWUodmFsdWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgfHwgJycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3RpbGVOYW1lV2FzTW9kaWZpZWRdXG4gICk7XG5cbiAgY29uc3Qgb25SYXN0ZXJUaWxlU2VydmVyVXJsc0NoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRSYXN0ZXJUaWxlU2VydmVyVXJscyhldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgW3NldFJhc3RlclRpbGVTZXJ2ZXJVcmxzXVxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBkYXRhOiBtZXRhZGF0YSxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yOiBtZXRhRXJyb3JcbiAgfSA9IHVzZUZldGNoSnNvbih7XG4gICAgdXJsOiBjbGVhcmVkTWV0YWRhdGFVcmwsXG4gICAgcmFzdGVyVGlsZVR5cGU6IGlzUE1UaWxlc1VybChjbGVhcmVkTWV0YWRhdGFVcmwpID8gUmFzdGVyVGlsZVR5cGUuUE1USUxFUyA6IFJhc3RlclRpbGVUeXBlLlNUQUMsXG4gICAgcHJvY2VzczogcGFyc2VNZXRhZGF0YUFsbG93Q29sbGVjdGlvbnNcbiAgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodGlsZU5hbWUgJiYgY2xlYXJlZE1ldGFkYXRhVXJsKSB7XG4gICAgICBjb25zdCBwbXRpbGVzVHlwZSA9IG1ldGFkYXRhPy5wbXRpbGVzVHlwZTtcblxuICAgICAgaWYgKHBtdGlsZXNUeXBlID09PSBQTVRpbGVzVHlwZS5NVlQpIHtcbiAgICAgICAgcmV0dXJuIHNldFJlc3BvbnNlKHtcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICAgIGxvYWRpbmcsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRm9yIC5wbXRpbGVzIGluIG12dCBmb3JtYXQsIHBsZWFzZSB1c2UgdGhlIFZlY3RvciBUaWxlIGZvcm0uJylcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlcnJvciA9IG1ldGFFcnJvcjtcblxuICAgICAgLy8gY2hlY2sgZm9yIHJhc3RlciB0aWxlIHNlcnZlcnMgZm9yIFNUQUMgaXRlbXMgYW5kIGNvbGxlY3Rpb25zXG4gICAgICBsZXQgcmFzdGVyVGlsZVNlcnZlcnM7XG4gICAgICBpZiAoXG4gICAgICAgICFlcnJvclxuICAgICAgICAvLyBXZSBzdGlsbCBuZWVkIHJhc3RlciB0aWxlIHNlcnZlcnMgZm9yIFBNVGlsZXMgd2hlbiB3ZSBwbGFuIHRvIHVzZSBlbGV2YXRpb25cbiAgICAgICkge1xuICAgICAgICByYXN0ZXJUaWxlU2VydmVycyA9IHJhc3RlclRpbGVTZXJ2ZXJVcmxzXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKHNlcnZlciA9PiBzZXJ2ZXIudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIoc2VydmVyID0+IHNlcnZlcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByYXN0ZXJUaWxlU2VydmVycy5sZW5ndGggPCAxIHx8XG4gICAgICAgICAgIXJhc3RlclRpbGVTZXJ2ZXJzLmV2ZXJ5KHNlcnZlciA9PiB2YWxpZGF0ZVVybChzZXJ2ZXIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocG10aWxlc1R5cGUpIHtcbiAgICAgICAgICAgIC8vIEZvciByYXN0ZXIgdGlsZXMgZWxldmF0aW9uIHN1cHBvcnQgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgIC8vIFRPRE8gZGlzcGxheSBhIHdhcm5pbmcsIGJ1dCBub3QgYSBibG9ja2luZyBlcnJvclxuICAgICAgICAgICAgcmFzdGVyVGlsZVNlcnZlcnMgPSBbXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdQcm92aWRlIHZhbGlkIHJhc3RlciB0aWxlIHNlcnZlciB1cmxzIHRvIHN1cHBvcnQgU1RBQyBhbmQgZWxldmF0aW9ucy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0ID0gZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSh7XG4gICAgICAgIG5hbWU6IHRpbGVOYW1lLFxuICAgICAgICBtZXRhZGF0YVVybDogY2xlYXJlZE1ldGFkYXRhVXJsLFxuICAgICAgICByYXN0ZXJUaWxlU2VydmVyVXJsczogcmFzdGVyVGlsZVNlcnZlcnNcbiAgICAgIH0pO1xuXG4gICAgICBzZXRSZXNwb25zZSh7XG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBkYXRhc2V0LFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBlcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yOiBtZXRhRXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW1xuICAgIG1ldGFkYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgbWV0YUVycm9yLFxuICAgIHRpbGVOYW1lLFxuICAgIGNsZWFyZWRNZXRhZGF0YVVybCxcbiAgICByYXN0ZXJUaWxlU2VydmVyVXJscyxcbiAgICBzZXRSZXNwb25zZVxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxUaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInRpbGVzZXQtbmFtZVwiPk5hbWU8L2xhYmVsPlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZXNldC1uYW1lXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciB0aWxlc2V0XCJcbiAgICAgICAgICB2YWx1ZT17dGlsZU5hbWV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uVGlsZU5hbWVDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZS1tZXRhZGF0YVwiPlRpbGVzZXQgbWV0YWRhdGEgVVJMPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cInRpbGUtbWV0YWRhdGFcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVGlsZXNldCBtZXRhZGF0YSBVUkxcIlxuICAgICAgICAgIHZhbHVlPXttZXRhZGF0YVVybCA/PyB1bmRlZmluZWR9XG4gICAgICAgICAgb25DaGFuZ2U9e29uTWV0YWRhdGFVcmxDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgICAgICBTdXBwb3J0cyByYXN0ZXIgLnBtdGlsZXMuIExpbWl0ZWQgc3VwcG9ydCBmb3IgU1RBQyBJdGVtcyBhbmQgQ29sbGVjdGlvbnMuXG4gICAgICAgIDwvVGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZXNldC1yYXN0ZXItc2VydmVyc1wiPlJhc3RlciB0aWxlIHNlcnZlcnM8L2xhYmVsPlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZXNldC1yYXN0ZXItc2VydmVyc1wiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSYXN0ZXIgdGlsZSBzZXJ2ZXJzIChzZXBhcmF0ZWQgYnkgY29tbWFzKVwiXG4gICAgICAgICAgdmFsdWU9e3Jhc3RlclRpbGVTZXJ2ZXJVcmxzfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvblJhc3RlclRpbGVTZXJ2ZXJVcmxzQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICA8VGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICAgICAgUmFzdGVyIHRpbGUgc2VydmVyIFVSTHMgZm9yIENsb3VkIE9wdGltaXplZCBHZW9USUZGIHRpbGVzZXRzIGFuZCBlbGV2YXRpb24uXG4gICAgICAgIDwvVGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L1RpbGVzZXRJbnB1dENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclRpbGVGb3JtO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7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