UNPKG

kepler.gl

Version:

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

208 lines (206 loc) 30.5 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.getDatasetAttributesFromVectorTile = getDatasetAttributesFromVectorTile; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 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 _useFetchVectorTileMetadata = _interopRequireDefault(require("../../hooks/use-fetch-vector-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; } 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 getDatasetAttributesFromVectorTile(_ref) { var name = _ref.name, dataUrl = _ref.dataUrl, metadataUrl = _ref.metadataUrl; return { name: name, type: _constants.DatasetType.VECTOR_TILE, metadata: { type: _constants.REMOTE_TILE, remoteTileFormat: (0, _commonUtils.isPMTilesUrl)(dataUrl) ? _constants.RemoteTileFormat.PMTILES : _constants.RemoteTileFormat.MVT, tilesetDataUrl: dataUrl, tilesetMetadataUrl: metadataUrl } }; } var TilesetVectorForm = function TilesetVectorForm(_ref2) { var setResponse = _ref2.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), tileUrl = _useState4[0], setTileUrl = _useState4[1]; var _useState5 = (0, _react.useState)(''), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), metadataUrl = _useState6[0], setMetadataUrl = _useState6[1]; var _useState7 = (0, _react.useState)(null), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), initialFetchError = _useState8[0], setInitialFetchError = _useState8[1]; var onTileNameChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setTileName(event.target.value); }, [setTileName]); var onTileMetaUrlChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setMetadataUrl(event.target.value); }, [setMetadataUrl]); var onTileUrlChange = (0, _react.useCallback)( /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) { var newTileUrl, usePMTiles, potentialMetadataUrl, resp; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: event.preventDefault(); newTileUrl = event.target.value; setTileUrl(newTileUrl); usePMTiles = (0, _commonUtils.isPMTilesUrl)(newTileUrl); potentialMetadataUrl = usePMTiles ? newTileUrl : (0, _table.getMetaUrl)(newTileUrl); if (!(!metadataUrl && potentialMetadataUrl)) { _context.next = 17; break; } if (!usePMTiles) { _context.next = 10; break; } _context.t0 = { ok: true }; _context.next = 13; break; case 10: _context.next = 12; return fetch(potentialMetadataUrl); case 12: _context.t0 = _context.sent; case 13: resp = _context.t0; if (resp.ok) { setInitialFetchError(null); setMetadataUrl(potentialMetadataUrl); } else { setInitialFetchError(new Error("Metadata loading failed: ".concat(resp.status, " ").concat(resp.statusText))); } _context.next = 18; break; case 17: setInitialFetchError(null); case 18: if (!tileName) { setTileName(newTileUrl.split('/').pop() || newTileUrl); } case 19: case "end": return _context.stop(); } }, _callee); })); return function (_x) { return _ref3.apply(this, arguments); }; }(), [setTileUrl, tileName, setMetadataUrl, metadataUrl]); var process = (0, _react.useMemo)(function () { return function (value) { return (0, _table.parseVectorMetadata)(value, { tileUrl: metadataUrl }); }; }, [metadataUrl]); var _useFetchVectorTileMe = (0, _useFetchVectorTileMetadata["default"])({ metadataUrl: metadataUrl, tilesetUrl: tileUrl, remoteTileFormat: (0, _commonUtils.isPMTilesUrl)(metadataUrl) ? _constants.RemoteTileFormat.PMTILES : _constants.RemoteTileFormat.MVT, process: process }), metadata = _useFetchVectorTileMe.data, loading = _useFetchVectorTileMe.loading, metaError = _useFetchVectorTileMe.error; // reset initial fetch error if the metadata is available if (metadata && initialFetchError) { setInitialFetchError(null); } (0, _react.useEffect)(function () { if (tileName && tileUrl) { if ((metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType) === _constants.PMTilesType.RASTER) { return setResponse({ metadata: metadata, dataset: null, loading: loading, error: new Error('For .pmtiles in raster format, please use the Raster Tile form.') }); } var dataset = getDatasetAttributesFromVectorTile({ name: tileName, dataUrl: tileUrl, metadataUrl: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined }); setResponse({ metadata: metadata, dataset: dataset, loading: loading, error: metaError || initialFetchError }); } else { setResponse({ metadata: metadata, dataset: null, loading: loading, error: metaError || initialFetchError }); } }, [setResponse, metadata, loading, metaError, initialFetchError, tileUrl, tileName, metadataUrl]); (0, _react.useEffect)(function () { if (metadata) { var name = metadata.name; if (name) { setTileName(name); } } }, [metadata]); 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-url" }, "Tileset URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tile-url", placeholder: "Tileset URL", value: tileUrl, onChange: onTileUrlChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Requires {x}, {y}, {z} placeholders in URL or .pmtile extension.")), /*#__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: onTileMetaUrlChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Optional, but recommended. Supports json, txt"))); }; var _default = exports["default"] = TilesetVectorForm; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX3VzZUZldGNoVmVjdG9yVGlsZU1ldGFkYXRhIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJUaWxlc2V0SW5wdXRDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlRpbGVzZXRJbnB1dERlc2NyaXB0aW9uIiwicHJvcHMiLCJ0aGVtZSIsIkFaVVJFMjAwIiwiZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tVmVjdG9yVGlsZSIsIl9yZWYiLCJuYW1lIiwiZGF0YVVybCIsIm1ldGFkYXRhVXJsIiwidHlwZSIsIkRhdGFzZXRUeXBlIiwiVkVDVE9SX1RJTEUiLCJtZXRhZGF0YSIsIlJFTU9URV9USUxFIiwicmVtb3RlVGlsZUZvcm1hdCIsImlzUE1UaWxlc1VybCIsIlJlbW90ZVRpbGVGb3JtYXQiLCJQTVRJTEVTIiwiTVZUIiwidGlsZXNldERhdGFVcmwiLCJ0aWxlc2V0TWV0YWRhdGFVcmwiLCJUaWxlc2V0VmVjdG9yRm9ybSIsIl9yZWYyIiwic2V0UmVzcG9uc2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJ0aWxlTmFtZSIsInNldFRpbGVOYW1lIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJ0aWxlVXJsIiwic2V0VGlsZVVybCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2V0TWV0YWRhdGFVcmwiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImluaXRpYWxGZXRjaEVycm9yIiwic2V0SW5pdGlhbEZldGNoRXJyb3IiLCJvblRpbGVOYW1lQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwidmFsdWUiLCJvblRpbGVNZXRhVXJsQ2hhbmdlIiwib25UaWxlVXJsQ2hhbmdlIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIm5ld1RpbGVVcmwiLCJ1c2VQTVRpbGVzIiwicG90ZW50aWFsTWV0YWRhdGFVcmwiLCJyZXNwIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImdldE1ldGFVcmwiLCJ0MCIsIm9rIiwiZmV0Y2giLCJzZW50IiwiRXJyb3IiLCJjb25jYXQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0Iiwic3BsaXQiLCJwb3AiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInByb2Nlc3MiLCJ1c2VNZW1vIiwicGFyc2VWZWN0b3JNZXRhZGF0YSIsIl91c2VGZXRjaFZlY3RvclRpbGVNZSIsInVzZUZldGNoVmVjdG9yVGlsZU1ldGFkYXRhIiwidGlsZXNldFVybCIsImRhdGEiLCJsb2FkaW5nIiwibWV0YUVycm9yIiwiZXJyb3IiLCJ1c2VFZmZlY3QiLCJwbXRpbGVzVHlwZSIsIlBNVGlsZXNUeXBlIiwiUkFTVEVSIiwiZGF0YXNldCIsInVuZGVmaW5lZCIsImNyZWF0ZUVsZW1lbnQiLCJodG1sRm9yIiwiSW5wdXRMaWdodCIsImlkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RhbHMvdGlsZXNldHMtbW9kYWxzL3RpbGVzZXQtdmVjdG9yLWZvcm0udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtpc1BNVGlsZXNVcmx9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7XG4gIERhdGFzZXRUeXBlLFxuICBQTVRpbGVzVHlwZSxcbiAgUmVtb3RlVGlsZUZvcm1hdCxcbiAgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSxcbiAgUkVNT1RFX1RJTEVcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtUaWxlSlNPTn0gZnJvbSAnQGxvYWRlcnMuZ2wvbXZ0JztcbmltcG9ydCB7UE1UaWxlc01ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9wbXRpbGVzJztcbmltcG9ydCB7Z2V0TWV0YVVybCwgcGFyc2VWZWN0b3JNZXRhZGF0YSwgVmVjdG9yVGlsZU1ldGFkYXRhfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7TWVyZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2RlZmF1bHQgYXMgdXNlRmV0Y2hWZWN0b3JUaWxlTWV0YWRhdGF9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS1mZXRjaC12ZWN0b3ItdGlsZS1tZXRhZGF0YSc7XG5pbXBvcnQge0RhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMsIE1ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dExpZ2h0fSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5jb25zdCBUaWxlc2V0SW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCAxZnIpO1xuICByb3ctZ2FwOiAxOHB4O1xuICBmb250LXNpemU6IDEycHg7XG5gO1xuXG5jb25zdCBUaWxlc2V0SW5wdXREZXNjcmlwdGlvbiA9IHN0eWxlZC5kaXZgXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuQVpVUkUyMDB9O1xuICBmb250LXNpemU6IDExcHg7XG5gO1xuXG5leHBvcnQgdHlwZSBWZWN0b3JUaWxlc2V0Rm9ybURhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGF0YVVybDogc3RyaW5nO1xuICBtZXRhZGF0YVVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZlY3RvclRpbGVEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzID0gTWVyZ2U8XG4gIERhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMsXG4gIHtcbiAgICBtZXRhZGF0YTogVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YTtcbiAgfVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFzZXRBdHRyaWJ1dGVzRnJvbVZlY3RvclRpbGUoe1xuICBuYW1lLFxuICBkYXRhVXJsLFxuICBtZXRhZGF0YVVybFxufTogVmVjdG9yVGlsZXNldEZvcm1EYXRhKTogVmVjdG9yVGlsZURhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogRGF0YXNldFR5cGUuVkVDVE9SX1RJTEUsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIHR5cGU6IFJFTU9URV9USUxFLFxuICAgICAgcmVtb3RlVGlsZUZvcm1hdDogaXNQTVRpbGVzVXJsKGRhdGFVcmwpID8gUmVtb3RlVGlsZUZvcm1hdC5QTVRJTEVTIDogUmVtb3RlVGlsZUZvcm1hdC5NVlQsXG4gICAgICB0aWxlc2V0RGF0YVVybDogZGF0YVVybCxcbiAgICAgIHRpbGVzZXRNZXRhZGF0YVVybDogbWV0YWRhdGFVcmxcbiAgICB9XG4gIH07XG59XG5cbnR5cGUgVGlsZXNldFZlY3RvckZvcm1Qcm9wcyA9IHtcbiAgc2V0UmVzcG9uc2U6IChyZXNwb25zZTogTWV0YVJlc3BvbnNlKSA9PiB2b2lkO1xufTtcblxuY29uc3QgVGlsZXNldFZlY3RvckZvcm06IFJlYWN0LkZDPFRpbGVzZXRWZWN0b3JGb3JtUHJvcHM+ID0gKHtzZXRSZXNwb25zZX0pID0+IHtcbiAgY29uc3QgW3RpbGVOYW1lLCBzZXRUaWxlTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3RpbGVVcmwsIHNldFRpbGVVcmxdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG4gIGNvbnN0IFttZXRhZGF0YVVybCwgc2V0TWV0YWRhdGFVcmxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4oJycpO1xuICBjb25zdCBbaW5pdGlhbEZldGNoRXJyb3IsIHNldEluaXRpYWxGZXRjaEVycm9yXSA9IHVzZVN0YXRlPEVycm9yIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgb25UaWxlTmFtZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRUaWxlTmFtZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgW3NldFRpbGVOYW1lXVxuICApO1xuXG4gIGNvbnN0IG9uVGlsZU1ldGFVcmxDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0TWV0YWRhdGFVcmwoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRNZXRhZGF0YVVybF1cbiAgKTtcblxuICBjb25zdCBvblRpbGVVcmxDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbmV3VGlsZVVybCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIHNldFRpbGVVcmwobmV3VGlsZVVybCk7XG5cbiAgICAgIGNvbnN0IHVzZVBNVGlsZXMgPSBpc1BNVGlsZXNVcmwobmV3VGlsZVVybCk7XG4gICAgICBjb25zdCBwb3RlbnRpYWxNZXRhZGF0YVVybCA9IHVzZVBNVGlsZXMgPyBuZXdUaWxlVXJsIDogZ2V0TWV0YVVybChuZXdUaWxlVXJsKTtcbiAgICAgIGlmICghbWV0YWRhdGFVcmwgJiYgcG90ZW50aWFsTWV0YWRhdGFVcmwpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgVVJMIGV4aXN0cyBiZWZvcmUgc2V0dGluZyBpdCBhcyB0aGUgbWV0YWRhdGEgVVJMXG4gICAgICAgIC8vIE5vdGU6IFRoZSB7bWV0aG9kOiBIRUFEfSByZXF1ZXN0IG9mdGVuIGZhaWxzLCBsaWtlbHkgZHVlIHRvIGluZGl2aWR1YWwgc3RvcmFnZSBzZXR0aW5ncy5cbiAgICAgICAgY29uc3QgcmVzcCA9IHVzZVBNVGlsZXMgPyAoe29rOiB0cnVlfSBhcyBSZXNwb25zZSkgOiBhd2FpdCBmZXRjaChwb3RlbnRpYWxNZXRhZGF0YVVybCk7XG4gICAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgICAgc2V0SW5pdGlhbEZldGNoRXJyb3IobnVsbCk7XG4gICAgICAgICAgc2V0TWV0YWRhdGFVcmwocG90ZW50aWFsTWV0YWRhdGFVcmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEluaXRpYWxGZXRjaEVycm9yKFxuICAgICAgICAgICAgbmV3IEVycm9yKGBNZXRhZGF0YSBsb2FkaW5nIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gJHtyZXNwLnN0YXR1c1RleHR9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRJbml0aWFsRmV0Y2hFcnJvcihudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGlsZU5hbWUpIHtcbiAgICAgICAgc2V0VGlsZU5hbWUobmV3VGlsZVVybC5zcGxpdCgnLycpLnBvcCgpIHx8IG5ld1RpbGVVcmwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3NldFRpbGVVcmwsIHRpbGVOYW1lLCBzZXRNZXRhZGF0YVVybCwgbWV0YWRhdGFVcmxdXG4gICk7XG5cbiAgY29uc3QgcHJvY2VzcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiAodmFsdWU6IFBNVGlsZXNNZXRhZGF0YSB8IFRpbGVKU09OKSA9PlxuICAgICAgcGFyc2VWZWN0b3JNZXRhZGF0YSh2YWx1ZSwge3RpbGVVcmw6IG1ldGFkYXRhVXJsfSk7XG4gIH0sIFttZXRhZGF0YVVybF0pO1xuXG4gIGNvbnN0IHtcbiAgICBkYXRhOiBtZXRhZGF0YSxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yOiBtZXRhRXJyb3JcbiAgfSA9IHVzZUZldGNoVmVjdG9yVGlsZU1ldGFkYXRhKHtcbiAgICBtZXRhZGF0YVVybCxcbiAgICB0aWxlc2V0VXJsOiB0aWxlVXJsLFxuICAgIHJlbW90ZVRpbGVGb3JtYXQ6IGlzUE1UaWxlc1VybChtZXRhZGF0YVVybCkgPyBSZW1vdGVUaWxlRm9ybWF0LlBNVElMRVMgOiBSZW1vdGVUaWxlRm9ybWF0Lk1WVCxcbiAgICBwcm9jZXNzXG4gIH0pO1xuXG4gIC8vIHJlc2V0IGluaXRpYWwgZmV0Y2ggZXJyb3IgaWYgdGhlIG1ldGFkYXRhIGlzIGF2YWlsYWJsZVxuICBpZiAobWV0YWRhdGEgJiYgaW5pdGlhbEZldGNoRXJyb3IpIHtcbiAgICBzZXRJbml0aWFsRmV0Y2hFcnJvcihudWxsKTtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRpbGVOYW1lICYmIHRpbGVVcmwpIHtcbiAgICAgIGlmIChtZXRhZGF0YT8ucG10aWxlc1R5cGUgPT09IFBNVGlsZXNUeXBlLlJBU1RFUikge1xuICAgICAgICByZXR1cm4gc2V0UmVzcG9uc2Uoe1xuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgICAgbG9hZGluZyxcbiAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdGb3IgLnBtdGlsZXMgaW4gcmFzdGVyIGZvcm1hdCwgcGxlYXNlIHVzZSB0aGUgUmFzdGVyIFRpbGUgZm9ybS4nKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldCA9IGdldERhdGFzZXRBdHRyaWJ1dGVzRnJvbVZlY3RvclRpbGUoe1xuICAgICAgICBuYW1lOiB0aWxlTmFtZSxcbiAgICAgICAgZGF0YVVybDogdGlsZVVybCxcbiAgICAgICAgbWV0YWRhdGFVcmw6IG1ldGFkYXRhVXJsID8/IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBzZXRSZXNwb25zZSh7XG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBkYXRhc2V0LFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBlcnJvcjogbWV0YUVycm9yIHx8IGluaXRpYWxGZXRjaEVycm9yXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0UmVzcG9uc2Uoe1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgZGF0YXNldDogbnVsbCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgZXJyb3I6IG1ldGFFcnJvciB8fCBpbml0aWFsRmV0Y2hFcnJvclxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXG4gICAgc2V0UmVzcG9uc2UsXG4gICAgbWV0YWRhdGEsXG4gICAgbG9hZGluZyxcbiAgICBtZXRhRXJyb3IsXG4gICAgaW5pdGlhbEZldGNoRXJyb3IsXG4gICAgdGlsZVVybCxcbiAgICB0aWxlTmFtZSxcbiAgICBtZXRhZGF0YVVybFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmFtZSA9IChtZXRhZGF0YSBhcyBWZWN0b3JUaWxlTWV0YWRhdGEpLm5hbWU7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBzZXRUaWxlTmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttZXRhZGF0YV0pO1xuXG4gIHJldHVybiAoXG4gICAgPFRpbGVzZXRJbnB1dENvbnRhaW5lcj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZXNldC1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlc2V0LW5hbWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB5b3VyIHRpbGVzZXRcIlxuICAgICAgICAgIHZhbHVlPXt0aWxlTmFtZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlTmFtZUNoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJ0aWxlLXVybFwiPlRpbGVzZXQgVVJMPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cInRpbGUtdXJsXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRpbGVzZXQgVVJMXCJcbiAgICAgICAgICB2YWx1ZT17dGlsZVVybH1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlVXJsQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICA8VGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICAgICAgUmVxdWlyZXMgJiMxMjM7eCYjMTI1OywgJiMxMjM7eSYjMTI1OywgJiMxMjM7eiYjMTI1OyBwbGFjZWhvbGRlcnMgaW4gVVJMIG9yIC5wbXRpbGVcbiAgICAgICAgICBleHRlbnNpb24uXG4gICAgICAgIDwvVGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZS1tZXRhZGF0YVwiPlRpbGVzZXQgbWV0YWRhdGEgVVJMPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cInRpbGUtbWV0YWRhdGFcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVGlsZXNldCBtZXRhZGF0YVwiXG4gICAgICAgICAgdmFsdWU9e21ldGFkYXRhVXJsID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlTWV0YVVybENoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICAgPFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICAgIE9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQuIFN1cHBvcnRzIGpzb24sIHR4dFxuICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9UaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUaWxlc2V0VmVjdG9yRm9ybTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFTQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSwyQkFBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBQXdDLElBQUFRLGVBQUEsRUFBQUMsZ0JBQUEsRUFyQnhDO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFF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SUFBSSxFQUFFO1FBQ1J1QixXQUFXLENBQUN2QixJQUFJLENBQUM7TUFDbkI7SUFDRjtFQUNGLENBQUMsRUFBRSxDQUFDTSxRQUFRLENBQUMsQ0FBQztFQUVkLG9CQUNFaEQsTUFBQSxZQUFBa0ksYUFBQSxDQUFDbEcscUJBQXFCLHFCQUNwQmhDLE1BQUEsWUFBQWtJLGFBQUEsMkJBQ0VsSSxNQUFBLFlBQUFrSSxhQUFBO0lBQU9DLE9BQU8sRUFBQztFQUFjLEdBQUMsTUFBVyxDQUFDLGVBQzFDbkksTUFBQSxZQUFBa0ksYUFBQSxDQUFDekgsT0FBQSxDQUFBMkgsVUFBVTtJQUNUQyxFQUFFLEVBQUMsY0FBYztJQUNqQkMsV0FBVyxFQUFDLG1CQUFtQjtJQUMvQnBELEtBQUssRUFBRWxCLFFBQVM7SUFDaEJ1RSxRQUFRLEVBQUUxRDtFQUFpQixDQUM1QixDQUNFLENBQUMsZUFDTjdFLE1BQUEsWUFBQWtJLGFBQUEsMkJBQ0VsSSxNQUFBLFlBQUFrSSxhQUFBO0lBQU9DLE9BQU8sRUFBQztFQUFVLEdBQUMsYUFBa0IsQ0FBQyxlQUM3Q25JLE1BQUEsWUFBQWtJLGFBQUEsQ0FBQ3pILE9BQUEsQ0FBQTJILFVBQVU7SUFDVEMsRUFBRSxFQUFDLFVBQVU7SUFDYkMsV0FBVyxFQUFDLGFBQWE7SUFDekJwRCxLQUFLLEVBQUVkLE9BQVE7SUFDZm1FLFFBQVEsRUFBRW5EO0VBQWdCLENBQzNCLENBQUMsZUFDRnBGLE1BQUEsWUFBQWtJLGFBQUEsQ0FBQzlGLHVCQUF1QixRQUFDLGtFQUdBLENBQ3RCLENBQUMsZUFDTnBDLE1BQUEsWUFBQWtJLGFBQUEsMkJBQ0VsSSxNQUFBLFlBQUFrSSxhQUFBO0lBQU9DLE9BQU8sRUFBQztFQUFlLEdBQUMsc0JBQTJCLENBQUMsZUFDM0RuSSxNQUFBLFlBQUFrSSxhQUFBLENBQUN6SCxPQUFBLENBQUEySCxVQUFVO0lBQ1RDLEVBQUUsRUFBQyxlQUFlO0lBQ2xCQyxXQUFXLEVBQUMsa0JBQWtCO0lBQzlCcEQsS0FBSyxFQUFFdEMsV0FBVyxhQUFYQSxXQUFXLGNBQVhBLFdBQVcsR0FBSXFGLFNBQVU7SUFDaENNLFFBQVEsRUFBRXBEO0VBQW9CLENBQy9CLENBQUMsZUFDRm5GLE1BQUEsWUFBQWtJLGFBQUEsQ0FBQzlGLHVCQUF1QixRQUFDLCtDQUVBLENBQ3RCLENBQ2dCLENBQUM7QUFFNUIsQ0FBQztBQUFDLElBQUFvRyxRQUFBLEdBQUFDLE9BQUEsY0FFYWhGLGlCQUFpQiIsImlnbm9yZUxpc3QiOltdfQ==