kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
206 lines (205 loc) • 32.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _common = require("../../common");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6; // 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, auto);\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;
});
var ExampleUrlsContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: left;\n color: ", ";\n font-size: 11px;\n"])), function (props) {
return props.theme.AZURE200;
});
var ExampleTabs = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n gap: 6px;\n margin-top: 6px;\n margin-bottom: 6px;\n"])));
var ExampleTab = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 3px 8px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 11px;\n white-space: nowrap;\n background: ", ";\n color: ", ";\n border: 1px solid ", ";\n\n &:hover {\n background: ", ";\n }\n"])), function (props) {
return props.active ? props.theme.AZURE400 : 'transparent';
}, function (props) {
return props.active ? props.theme.WHITE : props.theme.AZURE200;
}, function (props) {
return props.active ? props.theme.AZURE400 : props.theme.AZURE400;
}, function (props) {
return props.active ? props.theme.AZURE400 : props.theme.AZURE500;
});
var ExampleUrl = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n word-break: break-all;\n cursor: pointer;\n color: ", ";\n font-size: 11px;\n\n &:hover {\n color: ", ";\n }\n"])), function (props) {
return props.theme.AZURE200;
}, function (props) {
return props.theme.AZURE100;
});
var WMS_EXAMPLES = [{
label: 'OSM',
name: 'OpenStreetMap WMS',
url: 'https://ows.terrestris.de/osm/service'
}, {
label: 'NOAA Radar',
name: 'NOAA CONUS Radar',
url: 'https://opengeo.ncep.noaa.gov/geoserver/conus/conus_cref_qcd/ows'
}, {
label: 'NASA GIBS',
name: 'NASA GIBS',
url: 'https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi'
}];
var TilesetWMSForm = function TilesetWMSForm(_ref) {
var setResponse = _ref.setResponse;
var _useState = (0, _react.useState)(''),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
layerName = _useState2[0],
setLayerName = _useState2[1];
var _useState3 = (0, _react.useState)(''),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
wmsUrl = _useState4[0],
setWmsUrl = _useState4[1];
var _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
loading = _useState6[0],
setLoading = _useState6[1];
var _useState7 = (0, _react.useState)(null),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
error = _useState8[0],
setError = _useState8[1];
var _useState9 = (0, _react.useState)(null),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
wmsData = _useState10[0],
setWMSData = _useState10[1];
var _useState11 = (0, _react.useState)(0),
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
exampleTab = _useState12[0],
setExampleTab = _useState12[1];
var onLayerNameChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
setLayerName(event.target.value);
}, [setLayerName]);
var onExampleClick = (0, _react.useCallback)(function (url, name) {
setWmsUrl(url);
setLayerName(name);
}, [setWmsUrl, setLayerName]);
var onWmsUrlChange = (0, _react.useCallback)( /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) {
var newWmsUrl, data, datasetMetadata, serviceTitle;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
event.preventDefault();
newWmsUrl = event.target.value;
setWmsUrl(newWmsUrl);
if ((0, _commonUtils.validateUrl)(newWmsUrl)) {
_context.next = 6;
break;
}
setWMSData(null);
return _context.abrupt("return");
case 6:
_context.prev = 6;
setLoading(true);
setError(null);
_context.next = 11;
return (0, _table.getWMSCapabilities)(newWmsUrl);
case 11:
data = _context.sent;
datasetMetadata = (0, _table.wmsCapabilitiesToDatasetMetadata)(data); // Extract name or title from GetCapabilities response
serviceTitle = (data === null || data === void 0 ? void 0 : data.title) || (data === null || data === void 0 ? void 0 : data.name);
if (serviceTitle && !layerName) {
setLayerName(serviceTitle);
}
setWMSData({
metadata: data,
layers: datasetMetadata.layers,
version: datasetMetadata.version
});
_context.next = 22;
break;
case 18:
_context.prev = 18;
_context.t0 = _context["catch"](6);
setError(_context.t0 instanceof Error ? _context.t0 : new Error('Unknown error'));
setWMSData(null);
case 22:
_context.prev = 22;
setLoading(false);
return _context.finish(22);
case 25:
case "end":
return _context.stop();
}
}, _callee, null, [[6, 18, 22, 25]]);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}(), [layerName]);
(0, _react.useEffect)(function () {
if (layerName && wmsUrl) {
var _wmsData$metadata;
var dataset = {
name: layerName,
type: _constants.DatasetType.WMS_TILE,
metadata: {
type: _constants.REMOTE_TILE,
remoteTileFormat: _constants.RemoteTileFormat.WMS,
tilesetDataUrl: wmsUrl,
tilesetMetadataUrl: "".concat(wmsUrl, "?service=WMS&request=GetCapabilities"),
layers: (wmsData === null || wmsData === void 0 ? void 0 : wmsData.layers) || [],
wmsVersion: (wmsData === null || wmsData === void 0 ? void 0 : wmsData.version) || '1.3.0'
}
};
setResponse({
metadata: (_wmsData$metadata = wmsData === null || wmsData === void 0 ? void 0 : wmsData.metadata) !== null && _wmsData$metadata !== void 0 ? _wmsData$metadata : null,
dataset: dataset,
loading: loading,
error: error
});
} else {
setResponse({
metadata: null,
dataset: null,
loading: loading,
error: error
});
}
}, [setResponse, layerName, wmsUrl, wmsData, loading, error]);
return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "layer-name"
}, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "layer-name",
placeholder: "Name your WMS layer",
value: layerName,
onChange: onLayerNameChange
})), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "wms-url"
}, "WMS URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "wms-url",
placeholder: "Enter WMS URL",
value: wmsUrl,
onChange: onWmsUrlChange
}), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Provide a valid WMS service URL.")), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "For example, try a public WMS URL:"), /*#__PURE__*/_react["default"].createElement(ExampleUrlsContainer, null, /*#__PURE__*/_react["default"].createElement(ExampleTabs, null, WMS_EXAMPLES.map(function (ex, i) {
return /*#__PURE__*/_react["default"].createElement(ExampleTab, {
key: ex.label,
active: exampleTab === i,
onClick: function onClick() {
setExampleTab(i);
onExampleClick(ex.url, ex.name);
}
}, ex.label);
})), /*#__PURE__*/_react["default"].createElement(ExampleUrl, {
onClick: function onClick() {
return onExampleClick(WMS_EXAMPLES[exampleTab].url, WMS_EXAMPLES[exampleTab].name);
}
}, WMS_EXAMPLES[exampleTab].url))));
};
var _default = exports["default"] = TilesetWMSForm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGlsZXNldElucHV0Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJUaWxlc2V0SW5wdXREZXNjcmlwdGlvbiIsInByb3BzIiwidGhlbWUiLCJBWlVSRTIwMCIsIkV4YW1wbGVVcmxzQ29udGFpbmVyIiwiRXhhbXBsZVRhYnMiLCJFeGFtcGxlVGFiIiwiYWN0aXZlIiwiQVpVUkU0MDAiLCJXSElURSIsIkFaVVJFNTAwIiwiRXhhbXBsZVVybCIsIkFaVVJFMTAwIiwiV01TX0VYQU1QTEVTIiwibGFiZWwiLCJuYW1lIiwidXJsIiwiVGlsZXNldFdNU0Zvcm0iLCJfcmVmIiwic2V0UmVzcG9uc2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJsYXllck5hbWUiLCJzZXRMYXllck5hbWUiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIndtc1VybCIsInNldFdtc1VybCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImVycm9yIiwic2V0RXJyb3IiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMTAiLCJ3bXNEYXRhIiwic2V0V01TRGF0YSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJleGFtcGxlVGFiIiwic2V0RXhhbXBsZVRhYiIsIm9uTGF5ZXJOYW1lQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwidmFsdWUiLCJvbkV4YW1wbGVDbGljayIsIm9uV21zVXJsQ2hhbmdlIiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIm5ld1dtc1VybCIsImRhdGEiLCJkYXRhc2V0TWV0YWRhdGEiLCJzZXJ2aWNlVGl0bGUiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwidmFsaWRhdGVVcmwiLCJhYnJ1cHQiLCJnZXRXTVNDYXBhYmlsaXRpZXMiLCJzZW50Iiwid21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGEiLCJ0aXRsZSIsIm1ldGFkYXRhIiwibGF5ZXJzIiwidmVyc2lvbiIsInQwIiwiRXJyb3IiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInVzZUVmZmVjdCIsIl93bXNEYXRhJG1ldGFkYXRhIiwiZGF0YXNldCIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIldNU19USUxFIiwiUkVNT1RFX1RJTEUiLCJyZW1vdGVUaWxlRm9ybWF0IiwiUmVtb3RlVGlsZUZvcm1hdCIsIldNUyIsInRpbGVzZXREYXRhVXJsIiwidGlsZXNldE1ldGFkYXRhVXJsIiwiY29uY2F0Iiwid21zVmVyc2lvbiIsImNyZWF0ZUVsZW1lbnQiLCJodG1sRm9yIiwiSW5wdXRMaWdodCIsImlkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsIm1hcCIsImV4Iiwia2V5Iiwib25DbGljayIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RhbHMvdGlsZXNldHMtbW9kYWxzL3RpbGVzZXQtd21zLWZvcm0udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7V01TQ2FwYWJpbGl0aWVzfSBmcm9tICdAbG9hZGVycy5nbC93bXMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlVXJsfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0RhdGFzZXRUeXBlLCBSRU1PVEVfVElMRSwgUmVtb3RlVGlsZUZvcm1hdCwgV01TRGF0YXNldE1ldGFkYXRhfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldFdNU0NhcGFiaWxpdGllcywgd21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge01ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dExpZ2h0fSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5jb25zdCBUaWxlc2V0SW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCBhdXRvKTtcbiAgcm93LWdhcDogMThweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuYDtcblxuY29uc3QgVGlsZXNldElucHV0RGVzY3JpcHRpb24gPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkFaVVJFMjAwfTtcbiAgZm9udC1zaXplOiAxMXB4O1xuYDtcblxuY29uc3QgRXhhbXBsZVVybHNDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcbmA7XG5cbmNvbnN0IEV4YW1wbGVUYWJzID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA2cHg7XG4gIG1hcmdpbi10b3A6IDZweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuYDtcblxuY29uc3QgRXhhbXBsZVRhYiA9IHN0eWxlZC5kaXY8e2FjdGl2ZTogYm9vbGVhbn0+YFxuICBwYWRkaW5nOiAzcHggOHB4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxMXB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBiYWNrZ3JvdW5kOiAke3Byb3BzID0+IChwcm9wcy5hY3RpdmUgPyBwcm9wcy50aGVtZS5BWlVSRTQwMCA6ICd0cmFuc3BhcmVudCcpfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gKHByb3BzLmFjdGl2ZSA/IHByb3BzLnRoZW1lLldISVRFIDogcHJvcHMudGhlbWUuQVpVUkUyMDApfTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUuQVpVUkU0MDAgOiBwcm9wcy50aGVtZS5BWlVSRTQwMCl9O1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICR7cHJvcHMgPT4gKHByb3BzLmFjdGl2ZSA/IHByb3BzLnRoZW1lLkFaVVJFNDAwIDogcHJvcHMudGhlbWUuQVpVUkU1MDApfTtcbiAgfVxuYDtcblxuY29uc3QgRXhhbXBsZVVybCA9IHN0eWxlZC5kaXZgXG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcblxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTEwMH07XG4gIH1cbmA7XG5cbmNvbnN0IFdNU19FWEFNUExFUyA9IFtcbiAge1xuICAgIGxhYmVsOiAnT1NNJyxcbiAgICBuYW1lOiAnT3BlblN0cmVldE1hcCBXTVMnLFxuICAgIHVybDogJ2h0dHBzOi8vb3dzLnRlcnJlc3RyaXMuZGUvb3NtL3NlcnZpY2UnXG4gIH0sXG4gIHtcbiAgICBsYWJlbDogJ05PQUEgUmFkYXInLFxuICAgIG5hbWU6ICdOT0FBIENPTlVTIFJhZGFyJyxcbiAgICB1cmw6ICdodHRwczovL29wZW5nZW8ubmNlcC5ub2FhLmdvdi9nZW9zZXJ2ZXIvY29udXMvY29udXNfY3JlZl9xY2Qvb3dzJ1xuICB9LFxuICB7XG4gICAgbGFiZWw6ICdOQVNBIEdJQlMnLFxuICAgIG5hbWU6ICdOQVNBIEdJQlMnLFxuICAgIHVybDogJ2h0dHBzOi8vZ2licy5lYXJ0aGRhdGEubmFzYS5nb3Yvd21zL2Vwc2c0MzI2L2Jlc3Qvd21zLmNnaSdcbiAgfVxuXTtcblxudHlwZSBXTVNUaWxlRm9ybVByb3BzID0ge1xuICBzZXRSZXNwb25zZTogKHJlc3BvbnNlOiBNZXRhUmVzcG9uc2UpID0+IHZvaWQ7XG59O1xuXG50eXBlIFdNU0RhdGEgPSB7XG4gIG1ldGFkYXRhOiBXTVNDYXBhYmlsaXRpZXMgfCBudWxsO1xuICBsYXllcnM6IFdNU0RhdGFzZXRNZXRhZGF0YVsnbGF5ZXJzJ107XG4gIHZlcnNpb246IHN0cmluZztcbn07XG5cbmNvbnN0IFRpbGVzZXRXTVNGb3JtOiBSZWFjdC5GQzxXTVNUaWxlRm9ybVByb3BzPiA9ICh7c2V0UmVzcG9uc2V9KSA9PiB7XG4gIGNvbnN0IFtsYXllck5hbWUsIHNldExheWVyTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3dtc1VybCwgc2V0V21zVXJsXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8RXJyb3IgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dtc0RhdGEsIHNldFdNU0RhdGFdID0gdXNlU3RhdGU8V01TRGF0YSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZXhhbXBsZVRhYiwgc2V0RXhhbXBsZVRhYl0gPSB1c2VTdGF0ZSgwKTtcblxuICBjb25zdCBvbkxheWVyTmFtZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRMYXllck5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRMYXllck5hbWVdXG4gICk7XG5cbiAgY29uc3Qgb25FeGFtcGxlQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc2V0V21zVXJsKHVybCk7XG4gICAgICBzZXRMYXllck5hbWUobmFtZSk7XG4gICAgfSxcbiAgICBbc2V0V21zVXJsLCBzZXRMYXllck5hbWVdXG4gICk7XG5cbiAgY29uc3Qgb25XbXNVcmxDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbmV3V21zVXJsID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgc2V0V21zVXJsKG5ld1dtc1VybCk7XG5cbiAgICAgIGlmICghdmFsaWRhdGVVcmwobmV3V21zVXJsKSkge1xuICAgICAgICBzZXRXTVNEYXRhKG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIFdNUyBHZXRDYXBhYmlsaXRpZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRXTVNDYXBhYmlsaXRpZXMobmV3V21zVXJsKTtcblxuICAgICAgICBjb25zdCBkYXRhc2V0TWV0YWRhdGEgPSB3bXNDYXBhYmlsaXRpZXNUb0RhdGFzZXRNZXRhZGF0YShkYXRhKTtcblxuICAgICAgICAvLyBFeHRyYWN0IG5hbWUgb3IgdGl0bGUgZnJvbSBHZXRDYXBhYmlsaXRpZXMgcmVzcG9uc2VcbiAgICAgICAgY29uc3Qgc2VydmljZVRpdGxlID0gZGF0YT8udGl0bGUgfHwgZGF0YT8ubmFtZTtcbiAgICAgICAgaWYgKHNlcnZpY2VUaXRsZSAmJiAhbGF5ZXJOYW1lKSB7XG4gICAgICAgICAgc2V0TGF5ZXJOYW1lKHNlcnZpY2VUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRXTVNEYXRhKHtcbiAgICAgICAgICBtZXRhZGF0YTogZGF0YSxcbiAgICAgICAgICBsYXllcnM6IGRhdGFzZXRNZXRhZGF0YS5sYXllcnMsXG4gICAgICAgICAgdmVyc2lvbjogZGF0YXNldE1ldGFkYXRhLnZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0RXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgIHNldFdNU0RhdGEobnVsbCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsYXllck5hbWVdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGF5ZXJOYW1lICYmIHdtc1VybCkge1xuICAgICAgY29uc3QgZGF0YXNldCA9IHtcbiAgICAgICAgbmFtZTogbGF5ZXJOYW1lLFxuICAgICAgICB0eXBlOiBEYXRhc2V0VHlwZS5XTVNfVElMRSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiBSRU1PVEVfVElMRSxcbiAgICAgICAgICByZW1vdGVUaWxlRm9ybWF0OiBSZW1vdGVUaWxlRm9ybWF0LldNUyxcbiAgICAgICAgICB0aWxlc2V0RGF0YVVybDogd21zVXJsLFxuICAgICAgICAgIHRpbGVzZXRNZXRhZGF0YVVybDogYCR7d21zVXJsfT9zZXJ2aWNlPVdNUyZyZXF1ZXN0PUdldENhcGFiaWxpdGllc2AsXG4gICAgICAgICAgbGF5ZXJzOiB3bXNEYXRhPy5sYXllcnMgfHwgW10sXG4gICAgICAgICAgd21zVmVyc2lvbjogd21zRGF0YT8udmVyc2lvbiB8fCAnMS4zLjAnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzZXRSZXNwb25zZSh7XG4gICAgICAgIG1ldGFkYXRhOiB3bXNEYXRhPy5tZXRhZGF0YSA/PyBudWxsLFxuICAgICAgICBkYXRhc2V0LFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBlcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGE6IG51bGwsXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtzZXRSZXNwb25zZSwgbGF5ZXJOYW1lLCB3bXNVcmwsIHdtc0RhdGEsIGxvYWRpbmcsIGVycm9yXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8VGlsZXNldElucHV0Q29udGFpbmVyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJsYXllci1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJsYXllci1uYW1lXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciBXTVMgbGF5ZXJcIlxuICAgICAgICAgIHZhbHVlPXtsYXllck5hbWV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uTGF5ZXJOYW1lQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cIndtcy11cmxcIj5XTVMgVVJMPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cIndtcy11cmxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgV01TIFVSTFwiXG4gICAgICAgICAgdmFsdWU9e3dtc1VybH1cbiAgICAgICAgICBvbkNoYW5nZT17b25XbXNVcmxDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5Qcm92aWRlIGEgdmFsaWQgV01TIHNlcnZpY2UgVVJMLjwvVGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5Gb3IgZXhhbXBsZSwgdHJ5IGEgcHVibGljIFdNUyBVUkw6PC9UaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgICAgPEV4YW1wbGVVcmxzQ29udGFpbmVyPlxuICAgICAgICAgIDxFeGFtcGxlVGFicz5cbiAgICAgICAgICAgIHtXTVNfRVhBTVBMRVMubWFwKChleCwgaSkgPT4gKFxuICAgICAgICAgICAgICA8RXhhbXBsZVRhYlxuICAgICAgICAgICAgICAgIGtleT17ZXgubGFiZWx9XG4gICAgICAgICAgICAgICAgYWN0aXZlPXtleGFtcGxlVGFiID09PSBpfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldEV4YW1wbGVUYWIoaSk7XG4gICAgICAgICAgICAgICAgICBvbkV4YW1wbGVDbGljayhleC51cmwsIGV4Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZXgubGFiZWx9XG4gICAgICAgICAgICAgIDwvRXhhbXBsZVRhYj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvRXhhbXBsZVRhYnM+XG4gICAgICAgICAgPEV4YW1wbGVVcmxcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgIG9uRXhhbXBsZUNsaWNrKFdNU19FWEFNUExFU1tleGFtcGxlVGFiXS51cmwsIFdNU19FWEFNUExFU1tleGFtcGxlVGFiXS5uYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtXTVNfRVhBTVBMRVNbZXhhbXBsZVRhYl0udXJsfVxuICAgICAgICAgIDwvRXhhbXBsZVVybD5cbiAgICAgICAgPC9FeGFtcGxlVXJsc0NvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvVGlsZXNldElucHV0Q29udGFpbmVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGlsZXNldFdNU0Zvcm07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxPQUFBLEdBQUFOLE9BQUE7QUFBd0MsSUFBQU8sZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQVp4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TyxFQUFDO0VBQVMsR0FBQyxTQUFjLENBQUMsZUFDeEMxSSxNQUFBLFlBQUF5SSxhQUFBLENBQUNqSSxPQUFBLENBQUFtSSxVQUFVO0lBQ1RDLEVBQUUsRUFBQyxTQUFTO0lBQ1pDLFdBQVcsRUFBQyxlQUFlO0lBQzNCbkQsS0FBSyxFQUFFdkIsTUFBTztJQUNkMkUsUUFBUSxFQUFFbEQ7RUFBZSxDQUMxQixDQUFDLGVBQ0Y1RixNQUFBLFlBQUF5SSxhQUFBLENBQUNsRyx1QkFBdUIsUUFBQyxrQ0FBeUQsQ0FDL0UsQ0FBQyxlQUNOdkMsTUFBQSxZQUFBeUksYUFBQSwyQkFDRXpJLE1BQUEsWUFBQXlJLGFBQUEsQ0FBQ2xHLHVCQUF1QixRQUFDLG9DQUEyRCxDQUFDLGVBQ3JGdkMsTUFBQSxZQUFBeUksYUFBQSxDQUFDOUYsb0JBQW9CLHFCQUNuQjNDLE1BQUEsWUFBQXlJLGFBQUEsQ0FBQzdGLFdBQVcsUUFDVFEsWUFBWSxDQUFDMkYsR0FBRyxDQUFDLFVBQUNDLEVBQUUsRUFBRS9HLENBQUM7SUFBQSxvQkFDdEJqQyxNQUFBLFlBQUF5SSxhQUFBLENBQUM1RixVQUFVO01BQ1RvRyxHQUFHLEVBQUVELEVBQUUsQ0FBQzNGLEtBQU07TUFDZFAsTUFBTSxFQUFFcUMsVUFBVSxLQUFLbEQsQ0FBRTtNQUN6QmlILE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7UUFDYjlELGFBQWEsQ0FBQ25ELENBQUMsQ0FBQztRQUNoQjBELGNBQWMsQ0FBQ3FELEVBQUUsQ0FBQ3pGLEdBQUcsRUFBRXlGLEVBQUUsQ0FBQzFGLElBQUksQ0FBQztNQUNqQztJQUFFLEdBRUQwRixFQUFFLENBQUMzRixLQUNNLENBQUM7RUFBQSxDQUNkLENBQ1UsQ0FBQyxlQUNkckQsTUFBQSxZQUFBeUksYUFBQSxDQUFDdkYsVUFBVTtJQUNUZ0csT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7TUFBQSxPQUNMdkQsY0FBYyxDQUFDdkMsWUFBWSxDQUFDK0IsVUFBVSxDQUFDLENBQUM1QixHQUFHLEVBQUVILFlBQVksQ0FBQytCLFVBQVUsQ0FBQyxDQUFDN0IsSUFBSSxDQUFDO0lBQUE7RUFDNUUsR0FFQUYsWUFBWSxDQUFDK0IsVUFBVSxDQUFDLENBQUM1QixHQUNoQixDQUNRLENBQ25CLENBQ2dCLENBQUM7QUFFNUIsQ0FBQztBQUFDLElBQUE0RixRQUFBLEdBQUFDLE9BQUEsY0FFYTVGLGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=