UNPKG

kepler.gl

Version:

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

174 lines (172 loc) 30.2 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("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _commonUtils = require("@kepler.gl/common-utils"); var _constants = require("@kepler.gl/constants"); var _table = require("@kepler.gl/table"); var _utils = require("@kepler.gl/utils"); 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: _constants.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 === _constants.RasterTileType.PMTILES ? (0, _table.parseVectorMetadata)(metadata, { tileUrl: metadataUrl }) : (0, _table.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)(''), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), currentUrl = _useState4[0], setCurrentUrl = _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, _utils.getApplicationConfig)().rasterServerUrls || []).join(',')), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), rasterTileServerUrls = _useState8[0], setRasterTileServerUrls = _useState8[1]; var onTileNameChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setTileName(event.target.value); }, [setTileName]); var onMetadataUrlChange = (0, _react.useCallback)(function (event) { event.preventDefault(); var value = event.target.value; setMetadataUrl(value); setTileName(value.split('/').pop() || ''); setCurrentUrl(value); }, []); var onRasterTileServerUrlsChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setRasterTileServerUrls(event.target.value); }, [setRasterTileServerUrls]); var _useFetchJson = (0, _useFetchRasterTileMetadata["default"])({ url: currentUrl, rasterTileType: (0, _commonUtils.isPMTilesUrl)(currentUrl) ? _constants.RasterTileType.PMTILES : _constants.RasterTileType.STAC, process: parseMetadataAllowCollections }), metadata = _useFetchJson.data, loading = _useFetchJson.loading, metaError = _useFetchJson.error; (0, _react.useEffect)(function () { if (tileName && metadataUrl) { var pmtilesType = metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType; if (pmtilesType === _constants.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, _commonUtils.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: metadataUrl, rasterTileServerUrls: rasterTileServers }); setResponse({ metadata: metadata, dataset: dataset, loading: loading, error: error }); } else { setResponse({ metadata: metadata, dataset: null, loading: loading, error: metaError }); } }, [metadata, loading, metaError, currentUrl, tileName, metadataUrl, 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", 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX3V0aWxzIiwiX3VzZUZldGNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUaWxlc2V0SW5wdXRDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlRpbGVzZXRJbnB1dERlc2NyaXB0aW9uIiwicHJvcHMiLCJ0aGVtZSIsIkFaVVJFMjAwIiwiZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSIsIl9yZWYiLCJuYW1lIiwibWV0YWRhdGFVcmwiLCJyYXN0ZXJUaWxlU2VydmVyVXJscyIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIlJBU1RFUl9USUxFIiwibWV0YWRhdGEiLCJwYXJzZU1ldGFkYXRhQWxsb3dDb2xsZWN0aW9ucyIsIl9yZWYyIiwicmFzdGVyVGlsZVR5cGUiLCJSYXN0ZXJUaWxlVHlwZSIsIlBNVElMRVMiLCJwYXJzZVZlY3Rvck1ldGFkYXRhIiwidGlsZVVybCIsInBhcnNlUmFzdGVyTWV0YWRhdGEiLCJhbGxvd0NvbGxlY3Rpb25zIiwiUmFzdGVyVGlsZUZvcm0iLCJfcmVmMyIsInNldFJlc3BvbnNlIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwidGlsZU5hbWUiLCJzZXRUaWxlTmFtZSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiY3VycmVudFVybCIsInNldEN1cnJlbnRVcmwiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInNldE1ldGFkYXRhVXJsIiwiX3VzZVN0YXRlNyIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwicmFzdGVyU2VydmVyVXJscyIsImpvaW4iLCJfdXNlU3RhdGU4Iiwic2V0UmFzdGVyVGlsZVNlcnZlclVybHMiLCJvblRpbGVOYW1lQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwidmFsdWUiLCJvbk1ldGFkYXRhVXJsQ2hhbmdlIiwic3BsaXQiLCJwb3AiLCJvblJhc3RlclRpbGVTZXJ2ZXJVcmxzQ2hhbmdlIiwiX3VzZUZldGNoSnNvbiIsInVzZUZldGNoSnNvbiIsInVybCIsImlzUE1UaWxlc1VybCIsIlNUQUMiLCJwcm9jZXNzIiwiZGF0YSIsImxvYWRpbmciLCJtZXRhRXJyb3IiLCJlcnJvciIsInVzZUVmZmVjdCIsInBtdGlsZXNUeXBlIiwiUE1UaWxlc1R5cGUiLCJNVlQiLCJkYXRhc2V0IiwiRXJyb3IiLCJyYXN0ZXJUaWxlU2VydmVycyIsIm1hcCIsInNlcnZlciIsInRyaW0iLCJldmVyeSIsInZhbGlkYXRlVXJsIiwiY3JlYXRlRWxlbWVudCIsImh0bWxGb3IiLCJJbnB1dExpZ2h0IiwiaWQiLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwidW5kZWZpbmVkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGFscy90aWxlc2V0cy1tb2RhbHMvdGlsZXNldC1yYXN0ZXItZm9ybS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge1BNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5cbmltcG9ydCB7aXNQTVRpbGVzVXJsLCB2YWxpZGF0ZVVybH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtEYXRhc2V0VHlwZSwgUmFzdGVyVGlsZVR5cGUsIFBNVGlsZXNUeXBlfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0pzb25PYmplY3RPckFycmF5fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7cGFyc2VSYXN0ZXJNZXRhZGF0YSwgcGFyc2VWZWN0b3JNZXRhZGF0YX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge2dldEFwcGxpY2F0aW9uQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtkZWZhdWx0IGFzIHVzZUZldGNoSnNvbn0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLWZldGNoLXJhc3Rlci10aWxlLW1ldGFkYXRhJztcbmltcG9ydCB7RGF0YXNldENyZWF0aW9uQXR0cmlidXRlcywgTWV0YVJlc3BvbnNlfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge0lucHV0TGlnaHR9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbmNvbnN0IFRpbGVzZXRJbnB1dENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KDMsIDFmcik7XG4gIHJvdy1nYXA6IDE4cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbmA7XG5cbmNvbnN0IFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uID0gc3R5bGVkLmRpdmBcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcbmA7XG5cbmV4cG9ydCB0eXBlIFJhc3RlclRpbGVzZXRNZXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGFkYXRhVXJsOiBzdHJpbmc7XG4gIHJhc3RlclRpbGVTZXJ2ZXJVcmxzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSh7XG4gIG5hbWUsXG4gIG1ldGFkYXRhVXJsLFxuICByYXN0ZXJUaWxlU2VydmVyVXJsc1xufTogUmFzdGVyVGlsZXNldE1ldGEpOiBEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IERhdGFzZXRUeXBlLlJBU1RFUl9USUxFLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBtZXRhZGF0YVVybCxcbiAgICAgIC4uLihyYXN0ZXJUaWxlU2VydmVyVXJscyA/IHtyYXN0ZXJUaWxlU2VydmVyVXJsc30gOiB7fSlcbiAgICB9XG4gIH07XG59XG5cbnR5cGUgUmFzdGVyVGlsZUZvcm1Qcm9wcyA9IHtcbiAgc2V0UmVzcG9uc2U6IChyZXNwb25zZTogTWV0YVJlc3BvbnNlKSA9PiB2b2lkO1xufTtcblxuY29uc3QgcGFyc2VNZXRhZGF0YUFsbG93Q29sbGVjdGlvbnMgPSAoXG4gIG1ldGFkYXRhOiBKc29uT2JqZWN0T3JBcnJheSB8IFBNVGlsZXNNZXRhZGF0YSxcbiAge21ldGFkYXRhVXJsLCByYXN0ZXJUaWxlVHlwZX06IHttZXRhZGF0YVVybDogc3RyaW5nOyByYXN0ZXJUaWxlVHlwZTogUmFzdGVyVGlsZVR5cGV9XG4pID0+IHtcbiAgcmV0dXJuIHJhc3RlclRpbGVUeXBlID09PSBSYXN0ZXJUaWxlVHlwZS5QTVRJTEVTXG4gICAgPyBwYXJzZVZlY3Rvck1ldGFkYXRhKG1ldGFkYXRhIGFzIFBNVGlsZXNNZXRhZGF0YSwge1xuICAgICAgICB0aWxlVXJsOiBtZXRhZGF0YVVybFxuICAgICAgfSlcbiAgICA6IHBhcnNlUmFzdGVyTWV0YWRhdGEobWV0YWRhdGEgYXMgSnNvbk9iamVjdE9yQXJyYXksIHthbGxvd0NvbGxlY3Rpb25zOiB0cnVlfSk7XG59O1xuXG5jb25zdCBSYXN0ZXJUaWxlRm9ybTogUmVhY3QuRkM8UmFzdGVyVGlsZUZvcm1Qcm9wcz4gPSAoe3NldFJlc3BvbnNlfSkgPT4ge1xuICBjb25zdCBbdGlsZU5hbWUsIHNldFRpbGVOYW1lXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbY3VycmVudFVybCwgc2V0Q3VycmVudFVybF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW21ldGFkYXRhVXJsLCBzZXRNZXRhZGF0YVVybF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3Jhc3RlclRpbGVTZXJ2ZXJVcmxzLCBzZXRSYXN0ZXJUaWxlU2VydmVyVXJsc10gPSB1c2VTdGF0ZTxzdHJpbmc+KFxuICAgIChnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnJhc3RlclNlcnZlclVybHMgfHwgW10pLmpvaW4oJywnKVxuICApO1xuXG4gIGNvbnN0IG9uVGlsZU5hbWVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0VGlsZU5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRUaWxlTmFtZV1cbiAgKTtcblxuICBjb25zdCBvbk1ldGFkYXRhVXJsQ2hhbmdlID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qge3ZhbHVlfSA9IGV2ZW50LnRhcmdldDtcbiAgICBzZXRNZXRhZGF0YVVybCh2YWx1ZSk7XG4gICAgc2V0VGlsZU5hbWUodmFsdWUuc3BsaXQoJy8nKS5wb3AoKSB8fCAnJyk7XG4gICAgc2V0Q3VycmVudFVybCh2YWx1ZSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBvblJhc3RlclRpbGVTZXJ2ZXJVcmxzQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldFJhc3RlclRpbGVTZXJ2ZXJVcmxzKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBbc2V0UmFzdGVyVGlsZVNlcnZlclVybHNdXG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGRhdGE6IG1ldGFkYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgZXJyb3I6IG1ldGFFcnJvclxuICB9ID0gdXNlRmV0Y2hKc29uKHtcbiAgICB1cmw6IGN1cnJlbnRVcmwsXG4gICAgcmFzdGVyVGlsZVR5cGU6IGlzUE1UaWxlc1VybChjdXJyZW50VXJsKSA/IFJhc3RlclRpbGVUeXBlLlBNVElMRVMgOiBSYXN0ZXJUaWxlVHlwZS5TVEFDLFxuICAgIHByb2Nlc3M6IHBhcnNlTWV0YWRhdGFBbGxvd0NvbGxlY3Rpb25zXG4gIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRpbGVOYW1lICYmIG1ldGFkYXRhVXJsKSB7XG4gICAgICBjb25zdCBwbXRpbGVzVHlwZSA9IG1ldGFkYXRhPy5wbXRpbGVzVHlwZTtcblxuICAgICAgaWYgKHBtdGlsZXNUeXBlID09PSBQTVRpbGVzVHlwZS5NVlQpIHtcbiAgICAgICAgcmV0dXJuIHNldFJlc3BvbnNlKHtcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICAgIGxvYWRpbmcsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRm9yIC5wbXRpbGVzIGluIG12dCBmb3JtYXQsIHBsZWFzZSB1c2UgdGhlIFZlY3RvciBUaWxlIGZvcm0uJylcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlcnJvciA9IG1ldGFFcnJvcjtcblxuICAgICAgLy8gY2hlY2sgZm9yIHJhc3RlciB0aWxlIHNlcnZlcnMgZm9yIFNUQUMgaXRlbXMgYW5kIGNvbGxlY3Rpb25zXG4gICAgICBsZXQgcmFzdGVyVGlsZVNlcnZlcnM7XG4gICAgICBpZiAoXG4gICAgICAgICFlcnJvclxuICAgICAgICAvLyBXZSBzdGlsbCBuZWVkIHJhc3RlciB0aWxlIHNlcnZlcnMgZm9yIFBNVGlsZXMgd2hlbiB3ZSBwbGFuIHRvIHVzZSBlbGV2YXRpb25cbiAgICAgICkge1xuICAgICAgICByYXN0ZXJUaWxlU2VydmVycyA9IHJhc3RlclRpbGVTZXJ2ZXJVcmxzXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKHNlcnZlciA9PiBzZXJ2ZXIudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIoc2VydmVyID0+IHNlcnZlcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByYXN0ZXJUaWxlU2VydmVycy5sZW5ndGggPCAxIHx8XG4gICAgICAgICAgIXJhc3RlclRpbGVTZXJ2ZXJzLmV2ZXJ5KHNlcnZlciA9PiB2YWxpZGF0ZVVybChzZXJ2ZXIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocG10aWxlc1R5cGUpIHtcbiAgICAgICAgICAgIC8vIEZvciByYXN0ZXIgdGlsZXMgZWxldmF0aW9uIHN1cHBvcnQgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgIC8vIFRPRE8gZGlzcGxheSBhIHdhcm5pbmcsIGJ1dCBub3QgYSBibG9ja2luZyBlcnJvclxuICAgICAgICAgICAgcmFzdGVyVGlsZVNlcnZlcnMgPSBbXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdQcm92aWRlIHZhbGlkIHJhc3RlciB0aWxlIHNlcnZlciB1cmxzIHRvIHN1cHBvcnQgU1RBQyBhbmQgZWxldmF0aW9ucy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0ID0gZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSh7XG4gICAgICAgIG5hbWU6IHRpbGVOYW1lLFxuICAgICAgICBtZXRhZGF0YVVybCxcbiAgICAgICAgcmFzdGVyVGlsZVNlcnZlclVybHM6IHJhc3RlclRpbGVTZXJ2ZXJzXG4gICAgICB9KTtcblxuICAgICAgc2V0UmVzcG9uc2Uoe1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgZGF0YXNldCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRSZXNwb25zZSh7XG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBlcnJvcjogbWV0YUVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtcbiAgICBtZXRhZGF0YSxcbiAgICBsb2FkaW5nLFxuICAgIG1ldGFFcnJvcixcbiAgICBjdXJyZW50VXJsLFxuICAgIHRpbGVOYW1lLFxuICAgIG1ldGFkYXRhVXJsLFxuICAgIHJhc3RlclRpbGVTZXJ2ZXJVcmxzLFxuICAgIHNldFJlc3BvbnNlXG4gIF0pO1xuXG4gIHJldHVybiAoXG4gICAgPFRpbGVzZXRJbnB1dENvbnRhaW5lcj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZXNldC1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlc2V0LW5hbWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB5b3VyIHRpbGVzZXRcIlxuICAgICAgICAgIHZhbHVlPXt0aWxlTmFtZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlTmFtZUNoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJ0aWxlLW1ldGFkYXRhXCI+VGlsZXNldCBtZXRhZGF0YSBVUkw8L2xhYmVsPlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZS1tZXRhZGF0YVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUaWxlc2V0IG1ldGFkYXRhXCJcbiAgICAgICAgICB2YWx1ZT17bWV0YWRhdGFVcmwgPz8gdW5kZWZpbmVkfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbk1ldGFkYXRhVXJsQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICA8VGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICAgICAgU3VwcG9ydHMgcmFzdGVyIC5wbXRpbGVzLiBMaW1pdGVkIHN1cHBvcnQgZm9yIFNUQUMgSXRlbXMgYW5kIENvbGxlY3Rpb25zLlxuICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInRpbGVzZXQtcmFzdGVyLXNlcnZlcnNcIj5SYXN0ZXIgdGlsZSBzZXJ2ZXJzPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cInRpbGVzZXQtcmFzdGVyLXNlcnZlcnNcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmFzdGVyIHRpbGUgc2VydmVycyAoc2VwYXJhdGVkIGJ5IGNvbW1hcylcIlxuICAgICAgICAgIHZhbHVlPXtyYXN0ZXJUaWxlU2VydmVyVXJsc31cbiAgICAgICAgICBvbkNoYW5nZT17b25SYXN0ZXJUaWxlU2VydmVyVXJsc0NoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICAgPFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICAgIFJhc3RlciB0aWxlIHNlcnZlciBVUkxzIGZvciBDbG91ZCBPcHRpbWl6ZWQgR2VvVElGRiB0aWxlc2V0cyBhbmQgZWxldmF0aW9uLlxuICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9UaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJUaWxlRm9ybTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUlBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUVBLElBQUFPLDJCQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBUSxPQUFBLEdBQUFSLE9BQUE7QUFBd0MsSUFBQVMsZUFBQSxFQUFBQyxnQkFBQSxFQWhCeEM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFB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Q1Q3QixVQUFVLEVBQ1ZKLFFBQVEsRUFDUnRCLFdBQVcsRUFDWEMsb0JBQW9CLEVBQ3BCZ0IsV0FBVyxDQUNaLENBQUM7RUFFRixvQkFDRTVFLE1BQUEsWUFBQWdJLGFBQUEsQ0FBQ2hGLHFCQUFxQixxQkFDcEJoRCxNQUFBLFlBQUFnSSxhQUFBLDJCQUNFaEksTUFBQSxZQUFBZ0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBYyxHQUFDLE1BQVcsQ0FBQyxlQUMxQ2pJLE1BQUEsWUFBQWdJLGFBQUEsQ0FBQ3RILE9BQUEsQ0FBQXdILFVBQVU7SUFDVEMsRUFBRSxFQUFDLGNBQWM7SUFDakJDLFdBQVcsRUFBQyxtQkFBbUI7SUFDL0IvQixLQUFLLEVBQUVwQixRQUFTO0lBQ2hCb0QsUUFBUSxFQUFFckM7RUFBaUIsQ0FDNUIsQ0FDRSxDQUFDLGVBQ05oRyxNQUFBLFlBQUFnSSxhQUFBLDJCQUNFaEksTUFBQSxZQUFBZ0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBZSxHQUFDLHNCQUEyQixDQUFDLGVBQzNEakksTUFBQSxZQUFBZ0ksYUFBQSxDQUFDdEgsT0FBQSxDQUFBd0gsVUFBVTtJQUNUQyxFQUFFLEVBQUMsZUFBZTtJQUNsQkMsV0FBVyxFQUFDLGtCQUFrQjtJQUM5Qi9CLEtBQUssRUFBRTFDLFdBQVcsYUFBWEEsV0FBVyxjQUFYQSxXQUFXLEdBQUkyRSxTQUFVO0lBQ2hDRCxRQUFRLEVBQUUvQjtFQUFvQixDQUMvQixDQUFDLGVBQ0Z0RyxNQUFBLFlBQUFnSSxhQUFBLENBQUM1RSx1QkFBdUIsUUFBQywyRUFFQSxDQUN0QixDQUFDLGVBQ05wRCxNQUFBLFlBQUFnSSxhQUFBLDJCQUNFaEksTUFBQSxZQUFBZ0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBd0IsR0FBQyxxQkFBMEIsQ0FBQyxlQUNuRWpJLE1BQUEsWUFBQWdJLGFBQUEsQ0FBQ3RILE9BQUEsQ0FBQXdILFVBQVU7SUFDVEMsRUFBRSxFQUFDLHdCQUF3QjtJQUMzQkMsV0FBVyxFQUFDLDJDQUEyQztJQUN2RC9CLEtBQUssRUFBRXpDLG9CQUFxQjtJQUM1QnlFLFFBQVEsRUFBRTVCO0VBQTZCLENBQ3hDLENBQUMsZUFDRnpHLE1BQUEsWUFBQWdJLGFBQUEsQ0FBQzVFLHVCQUF1QixRQUFDLDZFQUVBLENBQ3RCLENBQ2dCLENBQUM7QUFFNUIsQ0FBQztBQUFDLElBQUFtRixRQUFBLEdBQUFDLE9BQUEsY0FFYTlELGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=