UNPKG

kepler.gl

Version:

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

152 lines (149 loc) 26.9 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; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _reactJsonPretty = _interopRequireDefault(require("react-json-pretty")); var _reactVirtualized = require("react-virtualized"); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/layers/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _loadDataFooter = _interopRequireDefault(require("./load-data-footer")); var _tilesetIcon = _interopRequireDefault(require("./tileset-icon")); var _tilesetVectorForm = _interopRequireDefault(require("./tileset-vector-form")); var _tilesetRasterForm = _interopRequireDefault(require("./tileset-raster-form")); var _tilesetWmsForm = _interopRequireDefault(require("./tileset-wms-form")); 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 WIDTH_ICON = '70px'; var LoadTilesetTabContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n"])), function (props) { return props.theme.AZURE; }); var Container = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n grid-gap: 20px;\n background-color: ", ";\n"])), function (props) { return props.theme.WHITE; }); var TilesetTypeContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-columns: repeat(4, ", ");\n column-gap: 10px;\n margin-bottom: 20px;\n"])), WIDTH_ICON); var MetaContainer = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n max-height: 400px;\n background-color: ", ";\n"])), function (_ref) { var theme = _ref.theme; return theme.editorBackground; }); var MetaInnerContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n border: 1px solid ", ";\n background-color: white;\n border-radius: 2px;\n display: inline-block;\n font: inherit;\n line-height: 1.5em;\n padding: 0.5em 3.5em 0.5em 1em;\n box-sizing: border-box;\n overflow-y: scroll;\n overflow-x: auto;\n white-space: pre-wrap;\n word-wrap: break-word;\n height: ", "px;\n width: ", "px;\n color: ", ";\n font-size: 11px;\n font-family: ", ";\n max-width: 600px;\n"])), function (props) { return props.theme.selectBorderColorLT; }, function (props) { return props.height; }, function (props) { return props.width; }, function (props) { return props.theme.textColorLT; }, function (props) { return props.theme.fontFamily; }); var StyledHeaderMessage = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n"])), function (props) { return props.theme.textColorLT; }); var TILE_TYPES = [{ id: 'vectorTile', label: 'Vector Tile', Icon: _src.VectorTileIcon, Component: _tilesetVectorForm["default"] }, { id: 'rasterTile', label: 'Raster Tile', Icon: _src.RasterTileIcon, Component: _tilesetRasterForm["default"] }, { id: 'wms', label: 'WMS', Icon: _src.WMSLayerIcon, Component: _tilesetWmsForm["default"] }]; function isReady(response) { return response.dataset && !response.loading && !response.error; } function LoadTilesetTabFactory() { var LoadTilesetTab = function LoadTilesetTab(_ref2) { var onTilesetAdded = _ref2.onTilesetAdded, isAddingDatasets = _ref2.isAddingDatasets; var _useState = (0, _react.useState)(0), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), typeIndex = _useState2[0], setTypeIndex = _useState2[1]; var _useState3 = (0, _react.useState)({}), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), response = _useState4[0], setResponse = _useState4[1]; var error = response.error; var loading = response.loading; var data = response.metadata; var jsonDataText = (0, _react.useMemo)(function () { return JSON.stringify(data, null, 2); }, [data]); var createTileDataset = (0, _react.useCallback)(function () { var dataset = response.dataset, metadata = response.metadata; if (dataset) { onTilesetAdded(dataset, metadata); } }, [onTilesetAdded, response]); // temp patch to hide raster tile layer while in development var enableRasterTileLayer = (0, _src2.getApplicationConfig)().enableRasterTileLayer; var enableWMSLayer = (0, _src2.getApplicationConfig)().enableWMSLayer; // Filter tile types based on application config var tileTypes = (0, _react.useMemo)(function () { var types = TILE_TYPES.filter(function (tileType) { if (tileType.id === 'rasterTile') { return enableRasterTileLayer; } if (tileType.id === 'wms') { return enableWMSLayer; } return true; // Include all other types by default }); return types; }, [enableRasterTileLayer, enableWMSLayer]); var CurrentForm = tileTypes[typeIndex].Component; return /*#__PURE__*/_react["default"].createElement(LoadTilesetTabContainer, null, /*#__PURE__*/_react["default"].createElement(Container, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledHeaderMessage, null, "Tileset Type"), /*#__PURE__*/_react["default"].createElement(TilesetTypeContainer, { className: "tileset-type" }, tileTypes.map(function (tileType, index) { return /*#__PURE__*/_react["default"].createElement(_tilesetIcon["default"], { key: tileType.label, name: tileType.label, Icon: /*#__PURE__*/_react["default"].createElement(tileType.Icon, { height: WIDTH_ICON }), onClick: function onClick() { return setTypeIndex(index); }, selected: typeIndex === index }); })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(CurrentForm, { setResponse: setResponse }))), /*#__PURE__*/_react["default"].createElement(MetaContainer, null, data && /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref3) { var height = _ref3.height, width = _ref3.width; return /*#__PURE__*/_react["default"].createElement(MetaInnerContainer, { height: height, width: width }, /*#__PURE__*/_react["default"].createElement(_reactJsonPretty["default"], { id: "json-pretty", json: jsonDataText })); }))), /*#__PURE__*/_react["default"].createElement(_loadDataFooter["default"], { disabled: Boolean(error) || !isReady(response), isLoading: loading || isAddingDatasets, onConfirm: createTileDataset, confirmText: "tilesetSetup.addTilesetText", errorText: error && (0, _src2.getError)(error) })); }; return LoadTilesetTab; } var _default = exports["default"] = LoadTilesetTabFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RKc29uUHJldHR5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZWFjdFZpcnR1YWxpemVkIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc3JjIiwiX3NyYzIiLCJfbG9hZERhdGFGb290ZXIiLCJfdGlsZXNldEljb24iLCJfdGlsZXNldFZlY3RvckZvcm0iLCJfdGlsZXNldFJhc3RlckZvcm0iLCJfdGlsZXNldFdtc0Zvcm0iLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIldJRFRIX0lDT04iLCJMb2FkVGlsZXNldFRhYkNvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsIkFaVVJFIiwiQ29udGFpbmVyIiwiV0hJVEUiLCJUaWxlc2V0VHlwZUNvbnRhaW5lciIsIk1ldGFDb250YWluZXIiLCJfcmVmIiwiZWRpdG9yQmFja2dyb3VuZCIsIk1ldGFJbm5lckNvbnRhaW5lciIsInNlbGVjdEJvcmRlckNvbG9yTFQiLCJoZWlnaHQiLCJ3aWR0aCIsInRleHRDb2xvckxUIiwiZm9udEZhbWlseSIsIlN0eWxlZEhlYWRlck1lc3NhZ2UiLCJUSUxFX1RZUEVTIiwiaWQiLCJsYWJlbCIsIkljb24iLCJWZWN0b3JUaWxlSWNvbiIsIkNvbXBvbmVudCIsIlRpbGVzZXRWZWN0b3JGb3JtIiwiUmFzdGVyVGlsZUljb24iLCJUaWxlc2V0UmFzdGVyRm9ybSIsIldNU0xheWVySWNvbiIsIlRpbGVzZXRXTVNGb3JtIiwiaXNSZWFkeSIsInJlc3BvbnNlIiwiZGF0YXNldCIsImxvYWRpbmciLCJlcnJvciIsIkxvYWRUaWxlc2V0VGFiRmFjdG9yeSIsIkxvYWRUaWxlc2V0VGFiIiwiX3JlZjIiLCJvblRpbGVzZXRBZGRlZCIsImlzQWRkaW5nRGF0YXNldHMiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJ0eXBlSW5kZXgiLCJzZXRUeXBlSW5kZXgiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNldFJlc3BvbnNlIiwiZGF0YSIsIm1ldGFkYXRhIiwianNvbkRhdGFUZXh0IiwidXNlTWVtbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVhdGVUaWxlRGF0YXNldCIsInVzZUNhbGxiYWNrIiwiZW5hYmxlUmFzdGVyVGlsZUxheWVyIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJlbmFibGVXTVNMYXllciIsInRpbGVUeXBlcyIsInR5cGVzIiwiZmlsdGVyIiwidGlsZVR5cGUiLCJDdXJyZW50Rm9ybSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJtYXAiLCJpbmRleCIsImtleSIsIm5hbWUiLCJvbkNsaWNrIiwic2VsZWN0ZWQiLCJBdXRvU2l6ZXIiLCJfcmVmMyIsImpzb24iLCJkaXNhYmxlZCIsIkJvb2xlYW4iLCJpc0xvYWRpbmciLCJvbkNvbmZpcm0iLCJjb25maXJtVGV4dCIsImVycm9yVGV4dCIsImdldEVycm9yIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL21vZGFscy90aWxlc2V0cy1tb2RhbHMvbG9hZC10aWxlc2V0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7SW50bFNoYXBlfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCBKU09OUHJldHR5IGZyb20gJ3JlYWN0LWpzb24tcHJldHR5JztcbmltcG9ydCB7QXV0b1NpemVyfSBmcm9tICdyZWFjdC12aXJ0dWFsaXplZCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtWZWN0b3JUaWxlSWNvbiwgUmFzdGVyVGlsZUljb24sIFdNU0xheWVySWNvbn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtnZXRFcnJvciwgZ2V0QXBwbGljYXRpb25Db25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge01ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IExvYWREYXRhRm9vdGVyIGZyb20gJy4vbG9hZC1kYXRhLWZvb3Rlcic7XG5pbXBvcnQgVGlsZXNldEljb24gZnJvbSAnLi90aWxlc2V0LWljb24nO1xuaW1wb3J0IFRpbGVzZXRWZWN0b3JGb3JtIGZyb20gJy4vdGlsZXNldC12ZWN0b3ItZm9ybSc7XG5pbXBvcnQgVGlsZXNldFJhc3RlckZvcm0gZnJvbSAnLi90aWxlc2V0LXJhc3Rlci1mb3JtJztcblxuaW1wb3J0IFRpbGVzZXRXTVNGb3JtIGZyb20gJy4vdGlsZXNldC13bXMtZm9ybSc7XG5cbmNvbnN0IFdJRFRIX0lDT04gPSAnNzBweCc7XG5cbmNvbnN0IExvYWRUaWxlc2V0VGFiQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuQVpVUkV9O1xuYDtcblxuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xuICBncmlkLWdhcDogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5XSElURX07XG5gO1xuXG5jb25zdCBUaWxlc2V0VHlwZUNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsICR7V0lEVEhfSUNPTn0pO1xuICBjb2x1bW4tZ2FwOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuYDtcblxuY29uc3QgTWV0YUNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1heC1oZWlnaHQ6IDQwMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyh7dGhlbWV9KSA9PiB0aGVtZS5lZGl0b3JCYWNrZ3JvdW5kfTtcbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YUlubmVyQ29udGFpbmVyUHJvcHMge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuY29uc3QgTWV0YUlubmVyQ29udGFpbmVyID0gc3R5bGVkLmRpdjxNZXRhSW5uZXJDb250YWluZXJQcm9wcz5gXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zZWxlY3RCb3JkZXJDb2xvckxUfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogMS41ZW07XG4gIHBhZGRpbmc6IDAuNWVtIDMuNWVtIDAuNWVtIDFlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLmhlaWdodH1weDtcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMud2lkdGh9cHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LWZhbWlseTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250RmFtaWx5fTtcbiAgbWF4LXdpZHRoOiA2MDBweDtcbmA7XG5cbmNvbnN0IFN0eWxlZEhlYWRlck1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVH07XG4gIGZvbnQtc2l6ZTogMTRweDtcbmA7XG5cbnR5cGUgTG9hZFRpbGVzZXRUYWJQcm9wcyA9IHtcbiAgbWV0YToge1trZXk6IHN0cmluZ106IGFueX07XG4gIGlzQWRkaW5nRGF0YXNldHM6IGJvb2xlYW47XG4gIG9uVGlsZXNldEFkZGVkOiAodGlsZXNldEluZm86IGFueSwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIGludGw6IEludGxTaGFwZTtcbn07XG5cbmNvbnN0IFRJTEVfVFlQRVMgPSBbXG4gIHtcbiAgICBpZDogJ3ZlY3RvclRpbGUnLFxuICAgIGxhYmVsOiAnVmVjdG9yIFRpbGUnLFxuICAgIEljb246IFZlY3RvclRpbGVJY29uLFxuICAgIENvbXBvbmVudDogVGlsZXNldFZlY3RvckZvcm1cbiAgfSxcbiAge1xuICAgIGlkOiAncmFzdGVyVGlsZScsXG4gICAgbGFiZWw6ICdSYXN0ZXIgVGlsZScsXG4gICAgSWNvbjogUmFzdGVyVGlsZUljb24sXG4gICAgQ29tcG9uZW50OiBUaWxlc2V0UmFzdGVyRm9ybVxuICB9LFxuICB7XG4gICAgaWQ6ICd3bXMnLFxuICAgIGxhYmVsOiAnV01TJyxcbiAgICBJY29uOiBXTVNMYXllckljb24sXG4gICAgQ29tcG9uZW50OiBUaWxlc2V0V01TRm9ybVxuICB9XG5dO1xuXG5mdW5jdGlvbiBpc1JlYWR5KHJlc3BvbnNlKSB7XG4gIHJldHVybiByZXNwb25zZS5kYXRhc2V0ICYmICFyZXNwb25zZS5sb2FkaW5nICYmICFyZXNwb25zZS5lcnJvcjtcbn1cblxuZnVuY3Rpb24gTG9hZFRpbGVzZXRUYWJGYWN0b3J5KCkge1xuICBjb25zdCBMb2FkVGlsZXNldFRhYjogUmVhY3QuRkM8TG9hZFRpbGVzZXRUYWJQcm9wcz4gPSAoe29uVGlsZXNldEFkZGVkLCBpc0FkZGluZ0RhdGFzZXRzfSkgPT4ge1xuICAgIGNvbnN0IFt0eXBlSW5kZXgsIHNldFR5cGVJbmRleF0gPSB1c2VTdGF0ZTxudW1iZXI+KDApO1xuICAgIGNvbnN0IFtyZXNwb25zZSwgc2V0UmVzcG9uc2VdID0gdXNlU3RhdGU8TWV0YVJlc3BvbnNlPih7fSk7XG5cbiAgICBjb25zdCBlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuICAgIGNvbnN0IGxvYWRpbmcgPSByZXNwb25zZS5sb2FkaW5nO1xuICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5tZXRhZGF0YTtcbiAgICBjb25zdCBqc29uRGF0YVRleHQgPSB1c2VNZW1vKCgpID0+IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLCBbZGF0YV0pO1xuXG4gICAgY29uc3QgY3JlYXRlVGlsZURhdGFzZXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YXNldCwgbWV0YWRhdGF9ID0gcmVzcG9uc2U7XG4gICAgICBpZiAoZGF0YXNldCkge1xuICAgICAgICBvblRpbGVzZXRBZGRlZChkYXRhc2V0LCBtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfSwgW29uVGlsZXNldEFkZGVkLCByZXNwb25zZV0pO1xuXG4gICAgLy8gdGVtcCBwYXRjaCB0byBoaWRlIHJhc3RlciB0aWxlIGxheWVyIHdoaWxlIGluIGRldmVsb3BtZW50XG4gICAgY29uc3QgZW5hYmxlUmFzdGVyVGlsZUxheWVyID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS5lbmFibGVSYXN0ZXJUaWxlTGF5ZXI7XG4gICAgY29uc3QgZW5hYmxlV01TTGF5ZXIgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmVuYWJsZVdNU0xheWVyO1xuXG4gICAgLy8gRmlsdGVyIHRpbGUgdHlwZXMgYmFzZWQgb24gYXBwbGljYXRpb24gY29uZmlnXG4gICAgY29uc3QgdGlsZVR5cGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBjb25zdCB0eXBlcyA9IFRJTEVfVFlQRVMuZmlsdGVyKHRpbGVUeXBlID0+IHtcbiAgICAgICAgaWYgKHRpbGVUeXBlLmlkID09PSAncmFzdGVyVGlsZScpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlUmFzdGVyVGlsZUxheWVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlVHlwZS5pZCA9PT0gJ3dtcycpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlV01TTGF5ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEluY2x1ZGUgYWxsIG90aGVyIHR5cGVzIGJ5IGRlZmF1bHRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH0sIFtlbmFibGVSYXN0ZXJUaWxlTGF5ZXIsIGVuYWJsZVdNU0xheWVyXSk7XG5cbiAgICBjb25zdCBDdXJyZW50Rm9ybSA9IHRpbGVUeXBlc1t0eXBlSW5kZXhdLkNvbXBvbmVudDtcblxuICAgIHJldHVybiAoXG4gICAgICA8TG9hZFRpbGVzZXRUYWJDb250YWluZXI+XG4gICAgICAgIDxDb250YWluZXI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxTdHlsZWRIZWFkZXJNZXNzYWdlPlRpbGVzZXQgVHlwZTwvU3R5bGVkSGVhZGVyTWVzc2FnZT5cblxuICAgICAgICAgICAgPFRpbGVzZXRUeXBlQ29udGFpbmVyIGNsYXNzTmFtZT1cInRpbGVzZXQtdHlwZVwiPlxuICAgICAgICAgICAgICB7dGlsZVR5cGVzLm1hcCgodGlsZVR5cGUsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPFRpbGVzZXRJY29uXG4gICAgICAgICAgICAgICAgICBrZXk9e3RpbGVUeXBlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgbmFtZT17dGlsZVR5cGUubGFiZWx9XG4gICAgICAgICAgICAgICAgICBJY29uPXs8dGlsZVR5cGUuSWNvbiBoZWlnaHQ9e1dJRFRIX0lDT059IC8+fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0VHlwZUluZGV4KGluZGV4KX1cbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXt0eXBlSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9UaWxlc2V0VHlwZUNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxDdXJyZW50Rm9ybSBzZXRSZXNwb25zZT17c2V0UmVzcG9uc2V9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8TWV0YUNvbnRhaW5lcj5cbiAgICAgICAgICAgIHtkYXRhICYmIChcbiAgICAgICAgICAgICAgPEF1dG9TaXplcj5cbiAgICAgICAgICAgICAgICB7KHtoZWlnaHQsIHdpZHRofSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPE1ldGFJbm5lckNvbnRhaW5lciBoZWlnaHQ9e2hlaWdodH0gd2lkdGg9e3dpZHRofT5cbiAgICAgICAgICAgICAgICAgICAgPEpTT05QcmV0dHkgaWQ9XCJqc29uLXByZXR0eVwiIGpzb249e2pzb25EYXRhVGV4dH0gLz5cbiAgICAgICAgICAgICAgICAgIDwvTWV0YUlubmVyQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvQXV0b1NpemVyPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L01ldGFDb250YWluZXI+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgICA8TG9hZERhdGFGb290ZXJcbiAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihlcnJvcikgfHwgIWlzUmVhZHkocmVzcG9uc2UpfVxuICAgICAgICAgIGlzTG9hZGluZz17bG9hZGluZyB8fCBpc0FkZGluZ0RhdGFzZXRzfVxuICAgICAgICAgIG9uQ29uZmlybT17Y3JlYXRlVGlsZURhdGFzZXR9XG4gICAgICAgICAgY29uZmlybVRleHQ9XCJ0aWxlc2V0U2V0dXAuYWRkVGlsZXNldFRleHRcIlxuICAgICAgICAgIGVycm9yVGV4dD17ZXJyb3IgJiYgZ2V0RXJyb3IoZXJyb3IpfVxuICAgICAgICAvPlxuICAgICAgPC9Mb2FkVGlsZXNldFRhYkNvbnRhaW5lcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBMb2FkVGlsZXNldFRhYjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9hZFRpbGVzZXRUYWJGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsZ0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxpQkFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUssSUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sS0FBQSxHQUFBTixPQUFBO0FBR0EsSUFBQU8sZUFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsWUFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsa0JBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLGtCQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBVyxlQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFBZ0QsSUFBQVksZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWxCaEQ7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBcEIsd0JBQUFvQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBYyxDQUFBLFVBQUFHLENBQUEsS0FBQUEsQ0FBQSxDQUFBVixHQUFBLElBQUFVLENBQUEsQ0FBQUMsR0FBQSxJQUFBUCxNQUFBLENBQUFDLGNBQUEsQ0FBQUosQ0FBQSxFQUFBTSxDQUFBLEVBQUFHLENBQUEsSUFBQVQsQ0FBQSxDQUFBTSxDQUFBLElBQUFkLENBQUEsQ0FBQWMsQ0FBQSxZQUFBTixDQUFBLGNBQUFSLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBbUJBLElBQU1XLFVBQVUsR0FBRyxNQUFNO0FBRXpCLElBQU1DLHVCQUF1QixHQUFHQyw0QkFBTSxDQUFDQyxHQUFHLENBQUE3QixlQUFBLEtBQUFBLGVBQUEsT0FBQThCLHVCQUFBLHVDQUMvQixVQUFBQyxLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDQyxLQUFLLENBQUNDLEtBQUs7QUFBQSxFQUNwQztBQUVELElBQU1DLFNBQVMsR0FBR04sNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBNUIsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQTZCLHVCQUFBLDRJQUlOLFVBQUFDLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNDLEtBQUssQ0FBQ0csS0FBSztBQUFBLEVBQy9DO0FBRUQsSUFBTUMsb0JBQW9CLEdBQUdSLDRCQUFNLENBQUNDLEdBQUcsQ0FBQTNCLGdCQUFBLEtBQUFBLGdCQUFBLE9BQUE0Qix1QkFBQSxpSUFFRkosVUFBVSxDQUc5QztBQUVELElBQU1XLGFBQWEsR0FBR1QsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBMUIsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQTJCLHVCQUFBLDBGQUdWLFVBQUFRLElBQUE7RUFBQSxJQUFFTixLQUFLLEdBQUFNLElBQUEsQ0FBTE4sS0FBSztFQUFBLE9BQU1BLEtBQUssQ0FBQ08sZ0JBQWdCO0FBQUEsRUFDeEQ7QUFPRCxJQUFNQyxrQkFBa0IsR0FBR1osNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBekIsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQTBCLHVCQUFBLGlkQUVmLFVBQUFDLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNDLEtBQUssQ0FBQ1MsbUJBQW1CO0FBQUEsR0FZbEQsVUFBQVYsS0FBSztFQUFBLE9BQUlBLEtBQUssQ0FBQ1csTUFBTTtBQUFBLEdBQ3RCLFVBQUFYLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNZLEtBQUs7QUFBQSxHQUNwQixVQUFBWixLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDQyxLQUFLLENBQUNZLFdBQVc7QUFBQSxHQUUxQixVQUFBYixLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDQyxLQUFLLENBQUNhLFVBQVU7QUFBQSxFQUUvQztBQUVELElBQU1DLG1CQUFtQixHQUFHbEIsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBeEIsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXlCLHVCQUFBLDJEQUMzQixVQUFBQyxLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDQyxLQUFLLENBQUNZLFdBQVc7QUFBQSxFQUUxQztBQVNELElBQU1HLFVBQVUsR0FBRyxDQUNqQjtFQUNFQyxFQUFFLEVBQUUsWUFBWTtFQUNoQkMsS0FBSyxFQUFFLGFBQWE7RUFDcEJDLElBQUksRUFBRUMsbUJBQWM7RUFDcEJDLFNBQVMsRUFBRUM7QUFDYixDQUFDLEVBQ0Q7RUFDRUwsRUFBRSxFQUFFLFlBQVk7RUFDaEJDLEtBQUssRUFBRSxhQUFhO0VBQ3BCQyxJQUFJLEVBQUVJLG1CQUFjO0VBQ3BCRixTQUFTLEVBQUVHO0FBQ2IsQ0FBQyxFQUNEO0VBQ0VQLEVBQUUsRUFBRSxLQUFLO0VBQ1RDLEtBQUssRUFBRSxLQUFLO0VBQ1pDLElBQUksRUFBRU0saUJBQVk7RUFDbEJKLFNBQVMsRUFBRUs7QUFDYixDQUFDLENBQ0Y7QUFFRCxTQUFTQyxPQUFPQSxDQUFDQyxRQUFRLEVBQUU7RUFDekIsT0FBT0EsUUFBUSxDQUFDQyxPQUFPLElBQUksQ0FBQ0QsUUFBUSxDQUFDRSxPQUFPLElBQUksQ0FBQ0YsUUFBUSxDQUFDRyxLQUFLO0FBQ2pFO0FBRUEsU0FBU0MscUJBQXFCQSxDQUFBLEVBQUc7RUFDL0IsSUFBTUMsY0FBNkMsR0FBRyxTQUFoREEsY0FBNkNBLENBQUFDLEtBQUEsRUFBMkM7SUFBQSxJQUF0Q0MsY0FBYyxHQUFBRCxLQUFBLENBQWRDLGNBQWM7TUFBRUMsZ0JBQWdCLEdBQUFGLEtBQUEsQ0FBaEJFLGdCQUFnQjtJQUN0RixJQUFBQyxTQUFBLEdBQWtDLElBQUFDLGVBQVEsRUFBUyxDQUFDLENBQUM7TUFBQUMsVUFBQSxPQUFBQyxlQUFBLGFBQUFILFNBQUE7TUFBOUNJLFNBQVMsR0FBQUYsVUFBQTtNQUFFRyxZQUFZLEdBQUFILFVBQUE7SUFDOUIsSUFBQUksVUFBQSxHQUFnQyxJQUFBTCxlQUFRLEVBQWUsQ0FBQyxDQUFDLENBQUM7TUFBQU0sVUFBQSxPQUFBSixlQUFBLGFBQUFHLFVBQUE7TUFBbkRmLFFBQVEsR0FBQWdCLFVBQUE7TUFBRUMsV0FBVyxHQUFBRCxVQUFBO0lBRTVCLElBQU1iLEtBQUssR0FBR0gsUUFBUSxDQUFDRyxLQUFLO0lBQzVCLElBQU1ELE9BQU8sR0FBR0YsUUFBUSxDQUFDRSxPQUFPO0lBQ2hDLElBQU1nQixJQUFJLEdBQUdsQixRQUFRLENBQUNtQixRQUFRO0lBQzlCLElBQU1DLFlBQVksR0FBRyxJQUFBQyxjQUFPLEVBQUM7TUFBQSxPQUFNQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0wsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFBQSxHQUFFLENBQUNBLElBQUksQ0FBQyxDQUFDO0lBRXpFLElBQU1NLGlCQUFpQixHQUFHLElBQUFDLGtCQUFXLEVBQUMsWUFBTTtNQUMxQyxJQUFPeEIsT0FBTyxHQUFjRCxRQUFRLENBQTdCQyxPQUFPO1FBQUVrQixRQUFRLEdBQUluQixRQUFRLENBQXBCbUIsUUFBUTtNQUN4QixJQUFJbEIsT0FBTyxFQUFFO1FBQ1hNLGNBQWMsQ0FBQ04sT0FBTyxFQUFFa0IsUUFBUSxDQUFDO01BQ25DO0lBQ0YsQ0FBQyxFQUFFLENBQUNaLGNBQWMsRUFBRVAsUUFBUSxDQUFDLENBQUM7O0lBRTlCO0lBQ0EsSUFBTTBCLHFCQUFxQixHQUFHLElBQUFDLDBCQUFvQixFQUFDLENBQUMsQ0FBQ0QscUJBQXFCO0lBQzFFLElBQU1FLGNBQWMsR0FBRyxJQUFBRCwwQkFBb0IsRUFBQyxDQUFDLENBQUNDLGNBQWM7O0lBRTVEO0lBQ0EsSUFBTUMsU0FBUyxHQUFHLElBQUFSLGNBQU8sRUFBQyxZQUFNO01BQzlCLElBQU1TLEtBQUssR0FBRzFDLFVBQVUsQ0FBQzJDLE1BQU0sQ0FBQyxVQUFBQyxRQUFRLEVBQUk7UUFDMUMsSUFBSUEsUUFBUSxDQUFDM0MsRUFBRSxLQUFLLFlBQVksRUFBRTtVQUNoQyxPQUFPcUMscUJBQXFCO1FBQzlCO1FBQ0EsSUFBSU0sUUFBUSxDQUFDM0MsRUFBRSxLQUFLLEtBQUssRUFBRTtVQUN6QixPQUFPdUMsY0FBYztRQUN2QjtRQUNBLE9BQU8sSUFBSSxDQUFDLENBQUM7TUFDZixDQUFDLENBQUM7TUFDRixPQUFPRSxLQUFLO0lBQ2QsQ0FBQyxFQUFFLENBQUNKLHFCQUFxQixFQUFFRSxjQUFjLENBQUMsQ0FBQztJQUUzQyxJQUFNSyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ2hCLFNBQVMsQ0FBQyxDQUFDcEIsU0FBUztJQUVsRCxvQkFDRWxFLE1BQUEsWUFBQTJHLGFBQUEsQ0FBQ2xFLHVCQUF1QixxQkFDdEJ6QyxNQUFBLFlBQUEyRyxhQUFBLENBQUMzRCxTQUFTLHFCQUNSaEQsTUFBQSxZQUFBMkcsYUFBQSwyQkFDRTNHLE1BQUEsWUFBQTJHLGFBQUEsQ0FBQy9DLG1CQUFtQixRQUFDLGNBQWlDLENBQUMsZUFFdkQ1RCxNQUFBLFlBQUEyRyxhQUFBLENBQUN6RCxvQkFBb0I7TUFBQzBELFNBQVMsRUFBQztJQUFjLEdBQzNDTixTQUFTLENBQUNPLEdBQUcsQ0FBQyxVQUFDSixRQUFRLEVBQUVLLEtBQUs7TUFBQSxvQkFDN0I5RyxNQUFBLFlBQUEyRyxhQUFBLENBQUNqRyxZQUFBLFdBQVc7UUFDVnFHLEdBQUcsRUFBRU4sUUFBUSxDQUFDMUMsS0FBTTtRQUNwQmlELElBQUksRUFBRVAsUUFBUSxDQUFDMUMsS0FBTTtRQUNyQkMsSUFBSSxlQUFFaEUsTUFBQSxZQUFBMkcsYUFBQSxDQUFDRixRQUFRLENBQUN6QyxJQUFJO1VBQUNSLE1BQU0sRUFBRWhCO1FBQVcsQ0FBRSxDQUFFO1FBQzVDeUUsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7VUFBQSxPQUFRMUIsWUFBWSxDQUFDdUIsS0FBSyxDQUFDO1FBQUEsQ0FBQztRQUNuQ0ksUUFBUSxFQUFFNUIsU0FBUyxLQUFLd0I7TUFBTSxDQUMvQixDQUFDO0lBQUEsQ0FDSCxDQUNtQixDQUFDLGVBQ3ZCOUcsTUFBQSxZQUFBMkcsYUFBQSwyQkFDRTNHLE1BQUEsWUFBQTJHLGFBQUEsQ0FBQ0QsV0FBVztNQUFDaEIsV0FBVyxFQUFFQTtJQUFZLENBQUUsQ0FDckMsQ0FDRixDQUFDLGVBQ04xRixNQUFBLFlBQUEyRyxhQUFBLENBQUN4RCxhQUFhLFFBQ1h3QyxJQUFJLGlCQUNIM0YsTUFBQSxZQUFBMkcsYUFBQSxDQUFDdEcsaUJBQUEsQ0FBQThHLFNBQVMsUUFDUCxVQUFBQyxLQUFBO01BQUEsSUFBRTVELE1BQU0sR0FBQTRELEtBQUEsQ0FBTjVELE1BQU07UUFBRUMsS0FBSyxHQUFBMkQsS0FBQSxDQUFMM0QsS0FBSztNQUFBLG9CQUNkekQsTUFBQSxZQUFBMkcsYUFBQSxDQUFDckQsa0JBQWtCO1FBQUNFLE1BQU0sRUFBRUEsTUFBTztRQUFDQyxLQUFLLEVBQUVBO01BQU0sZ0JBQy9DekQsTUFBQSxZQUFBMkcsYUFBQSxDQUFDeEcsZ0JBQUEsV0FBVTtRQUFDMkQsRUFBRSxFQUFDLGFBQWE7UUFBQ3VELElBQUksRUFBRXhCO01BQWEsQ0FBRSxDQUNoQyxDQUFDO0lBQUEsQ0FFZCxDQUVBLENBQ04sQ0FBQyxlQUNaN0YsTUFBQSxZQUFBMkcsYUFBQSxDQUFDbEcsZUFBQSxXQUFjO01BQ2I2RyxRQUFRLEVBQUVDLE9BQU8sQ0FBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUNKLE9BQU8sQ0FBQ0MsUUFBUSxDQUFFO01BQy9DK0MsU0FBUyxFQUFFN0MsT0FBTyxJQUFJTSxnQkFBaUI7TUFDdkN3QyxTQUFTLEVBQUV4QixpQkFBa0I7TUFDN0J5QixXQUFXLEVBQUMsNkJBQTZCO01BQ3pDQyxTQUFTLEVBQUUvQyxLQUFLLElBQUksSUFBQWdELGNBQVEsRUFBQ2hELEtBQUs7SUFBRSxDQUNyQyxDQUNzQixDQUFDO0VBRTlCLENBQUM7RUFFRCxPQUFPRSxjQUFjO0FBQ3ZCO0FBQUMsSUFBQStDLFFBQUEsR0FBQUMsT0FBQSxjQUVjakQscUJBQXFCIiwiaWdub3JlTGlzdCI6W119