kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
159 lines (155 loc) • 19.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TableToolComponent = TableToolComponent;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _reactRedux = require("react-redux");
var _react = _interopRequireWildcard(require("react"));
var _duckdb = require("@openassistant/duckdb");
var _actions = require("@kepler.gl/actions");
var _processors = require("@kepler.gl/processors");
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; }
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// This component will create a new table using the SQL query which will
// 1. add a new column
// 2. delete a column
// 3. rename a column
// 4. change the variable type of a column
function TableToolComponent(_ref) {
var sql = _ref.sql,
dbTableName = _ref.dbTableName,
newDatasetName = _ref.queryDatasetName;
var datasets = (0, _reactRedux.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.datasets;
});
var queryInProgress = (0, _react.useRef)(null);
var dispatch = (0, _reactRedux.useDispatch)();
var _useState = (0, _react.useState)(null),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
error = _useState2[0],
setError = _useState2[1];
(0, _react.useEffect)(function () {
// check if the newDatasetName is already in the datasets
var newDatasetId = Object.keys(datasets).find(function (dataId) {
return datasets[dataId].label === newDatasetName;
});
// if the newDatasetName is already in the datasets, return
if (newDatasetId) return;
var addTable = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
if (!queryInProgress.current) {
_context2.next = 3;
break;
}
_context2.next = 3;
return queryInProgress.current;
case 3:
// Create a new promise for this query
queryInProgress.current = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var duckDB, conn, arrowResult, jsonResult, processedData;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return (0, _duckdb.getDuckDB)();
case 3:
duckDB = _context.sent;
if (duckDB) {
_context.next = 6;
break;
}
throw new Error('DuckDB instance is not initialized');
case 6:
if (!(dbTableName && sql)) {
_context.next = 22;
break;
}
_context.next = 9;
return duckDB.connect();
case 9:
conn = _context.sent;
_context.next = 12;
return conn.query(sql);
case 12:
arrowResult = _context.sent;
// convert arrowResult to a JSON object
jsonResult = arrowResult.toArray().map(function (row) {
return (0, _duckdb.convertArrowRowToObject)(row);
}); // use processFileData to process the rowObject
_context.next = 16;
return (0, _processors.processFileData)({
content: {
fileName: newDatasetName,
data: jsonResult
},
fileCache: []
});
case 16:
processedData = _context.sent;
// add the new dataset to the map
dispatch((0, _actions.addDataToMap)({
datasets: processedData,
options: {
autoCreateLayers: true,
centerMap: true
}
}));
// delete the table from the database
_context.next = 20;
return conn.query("DROP TABLE ".concat(dbTableName));
case 20:
_context.next = 22;
return conn.close();
case 22:
_context.next = 28;
break;
case 24:
_context.prev = 24;
_context.t0 = _context["catch"](0);
console.error(_context.t0);
setError(_context.t0 instanceof Error ? _context.t0.message : 'Unknown error occurred');
case 28:
_context.prev = 28;
queryInProgress.current = null;
return _context.finish(28);
case 31:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 24, 28, 31]]);
}))();
// Wait for the query to complete
_context2.next = 6;
return queryInProgress.current;
case 6:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function addTable() {
return _ref2.apply(this, arguments);
};
}();
addTable();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return error ? /*#__PURE__*/_react["default"].createElement("div", {
style: {
color: 'red',
fontSize: '8px'
}
}, error) : null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RSZWR1eCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9kdWNrZGIiLCJfYWN0aW9ucyIsIl9wcm9jZXNzb3JzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGFibGVUb29sQ29tcG9uZW50IiwiX3JlZiIsInNxbCIsImRiVGFibGVOYW1lIiwibmV3RGF0YXNldE5hbWUiLCJxdWVyeURhdGFzZXROYW1lIiwiZGF0YXNldHMiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwiZGVtbyIsImtlcGxlckdsIiwibWFwIiwidmlzU3RhdGUiLCJxdWVyeUluUHJvZ3Jlc3MiLCJ1c2VSZWYiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiZXJyb3IiLCJzZXRFcnJvciIsInVzZUVmZmVjdCIsIm5ld0RhdGFzZXRJZCIsImtleXMiLCJmaW5kIiwiZGF0YUlkIiwibGFiZWwiLCJhZGRUYWJsZSIsIl9yZWYyIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUyIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInByZXYiLCJuZXh0IiwiY3VycmVudCIsIl9jYWxsZWUiLCJkdWNrREIiLCJjb25uIiwiYXJyb3dSZXN1bHQiLCJqc29uUmVzdWx0IiwicHJvY2Vzc2VkRGF0YSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJnZXREdWNrREIiLCJzZW50IiwiRXJyb3IiLCJjb25uZWN0IiwicXVlcnkiLCJ0b0FycmF5Iiwicm93IiwiY29udmVydEFycm93Um93VG9PYmplY3QiLCJwcm9jZXNzRmlsZURhdGEiLCJjb250ZW50IiwiZmlsZU5hbWUiLCJkYXRhIiwiZmlsZUNhY2hlIiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJjb25jYXQiLCJjbG9zZSIsInQwIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJmaW5pc2giLCJzdG9wIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJjb2xvciIsImZvbnRTaXplIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL2tlcGxlci10b29scy90YWJsZS10b29sLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7Z2V0RHVja0RCLCBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEsIGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0fSBmcm9tICdAb3BlbmFzc2lzdGFudC9kdWNrZGInO1xuXG5pbXBvcnQge1N0YXRlfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1tYW5hZ2VyJztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5cbi8vIFRoaXMgY29tcG9uZW50IHdpbGwgY3JlYXRlIGEgbmV3IHRhYmxlIHVzaW5nIHRoZSBTUUwgcXVlcnkgd2hpY2ggd2lsbFxuLy8gMS4gYWRkIGEgbmV3IGNvbHVtblxuLy8gMi4gZGVsZXRlIGEgY29sdW1uXG4vLyAzLiByZW5hbWUgYSBjb2x1bW5cbi8vIDQuIGNoYW5nZSB0aGUgdmFyaWFibGUgdHlwZSBvZiBhIGNvbHVtblxuZXhwb3J0IGZ1bmN0aW9uIFRhYmxlVG9vbENvbXBvbmVudCh7XG4gIHNxbCxcbiAgZGJUYWJsZU5hbWUsXG4gIHF1ZXJ5RGF0YXNldE5hbWU6IG5ld0RhdGFzZXROYW1lXG59OiBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEpIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHF1ZXJ5SW5Qcm9ncmVzcyA9IHVzZVJlZjxQcm9taXNlPHZvaWQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIG5ld0RhdGFzZXROYW1lIGlzIGFscmVhZHkgaW4gdGhlIGRhdGFzZXRzXG4gICAgY29uc3QgbmV3RGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoXG4gICAgICBkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gbmV3RGF0YXNldE5hbWVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBuZXdEYXRhc2V0TmFtZSBpcyBhbHJlYWR5IGluIHRoZSBkYXRhc2V0cywgcmV0dXJuXG4gICAgaWYgKG5ld0RhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWRkVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJZiBhIHF1ZXJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlXG4gICAgICBpZiAocXVlcnlJblByb2dyZXNzLmN1cnJlbnQpIHtcbiAgICAgICAgYXdhaXQgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciB0aGlzIHF1ZXJ5XG4gICAgICBxdWVyeUluUHJvZ3Jlc3MuY3VycmVudCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZHVja0RCID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gICAgICAgICAgaWYgKCFkdWNrREIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHVja0RCIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGJUYWJsZU5hbWUgJiYgc3FsKSB7XG4gICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IGR1Y2tEQi5jb25uZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIFNRTCBxdWVyeVxuICAgICAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjb25uLnF1ZXJ5KHNxbCk7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgYXJyb3dSZXN1bHQgdG8gYSBKU09OIG9iamVjdFxuICAgICAgICAgICAgY29uc3QganNvblJlc3VsdCA9IGFycm93UmVzdWx0LnRvQXJyYXkoKS5tYXAocm93ID0+IGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0KHJvdykpO1xuXG4gICAgICAgICAgICAvLyB1c2UgcHJvY2Vzc0ZpbGVEYXRhIHRvIHByb2Nlc3MgdGhlIHJvd09iamVjdFxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IGF3YWl0IHByb2Nlc3NGaWxlRGF0YSh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHtmaWxlTmFtZTogbmV3RGF0YXNldE5hbWUsIGRhdGE6IGpzb25SZXN1bHR9LFxuICAgICAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgZGF0YXNldCB0byB0aGUgbWFwXG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgYWRkRGF0YVRvTWFwKHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0czogcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0YWJsZSBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgYXdhaXQgY29ubi5xdWVyeShgRFJPUCBUQUJMRSAke2RiVGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICAvLyBjbG9zZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgYXdhaXQgY29ubi5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICBzZXRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yIG9jY3VycmVkJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcXVlcnkgdG8gY29tcGxldGVcbiAgICAgIGF3YWl0IHF1ZXJ5SW5Qcm9ncmVzcy5jdXJyZW50O1xuICAgIH07XG5cbiAgICBhZGRUYWJsZSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIHJldHVybiBlcnJvciA/IDxkaXYgc3R5bGU9e3tjb2xvcjogJ3JlZCcsIGZvbnRTaXplOiAnOHB4J319PntlcnJvcn08L2Rpdj4gOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUdBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUFzRCxTQUFBTSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFWdEQ7QUFDQTs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1csa0JBQWtCQSxDQUFBQyxJQUFBLEVBSUw7RUFBQSxJQUgzQkMsR0FBRyxHQUFBRCxJQUFBLENBQUhDLEdBQUc7SUFDSEMsV0FBVyxHQUFBRixJQUFBLENBQVhFLFdBQVc7SUFDT0MsY0FBYyxHQUFBSCxJQUFBLENBQWhDSSxnQkFBZ0I7RUFFaEIsSUFBTUMsUUFBUSxHQUFHLElBQUFDLHVCQUFXLEVBQUMsVUFBQ0MsS0FBWTtJQUFBLE9BQUtBLEtBQUssQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDTixRQUFRO0VBQUEsRUFBQztFQUN6RixJQUFNTyxlQUFlLEdBQUcsSUFBQUMsYUFBTSxFQUF1QixJQUFJLENBQUM7RUFDMUQsSUFBTUMsUUFBUSxHQUFHLElBQUFDLHVCQUFXLEVBQUMsQ0FBQztFQUU5QixJQUFBQyxTQUFBLEdBQTBCLElBQUFDLGVBQVEsRUFBZ0IsSUFBSSxDQUFDO0lBQUFDLFVBQUEsT0FBQUMsZUFBQSxhQUFBSCxTQUFBO0lBQWhESSxLQUFLLEdBQUFGLFVBQUE7SUFBRUcsUUFBUSxHQUFBSCxVQUFBO0VBRXRCLElBQUFJLGdCQUFTLEVBQUMsWUFBTTtJQUNkO0lBQ0EsSUFBTUMsWUFBWSxHQUFHaEMsTUFBTSxDQUFDaUMsSUFBSSxDQUFDbkIsUUFBUSxDQUFDLENBQUNvQixJQUFJLENBQzdDLFVBQUFDLE1BQU07TUFBQSxPQUFJckIsUUFBUSxDQUFDcUIsTUFBTSxDQUFDLENBQUNDLEtBQUssS0FBS3hCLGNBQWM7SUFBQSxDQUNyRCxDQUFDO0lBQ0Q7SUFDQSxJQUFJb0IsWUFBWSxFQUFFO0lBRWxCLElBQU1LLFFBQVE7TUFBQSxJQUFBQyxLQUFBLE9BQUFDLGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRyxTQUFBQyxTQUFBO1FBQUEsT0FBQUYsWUFBQSxZQUFBRyxJQUFBLFVBQUFDLFVBQUFDLFNBQUE7VUFBQSxrQkFBQUEsU0FBQSxDQUFBQyxJQUFBLEdBQUFELFNBQUEsQ0FBQUUsSUFBQTtZQUFBO2NBQUEsS0FFWDFCLGVBQWUsQ0FBQzJCLE9BQU87Z0JBQUFILFNBQUEsQ0FBQUUsSUFBQTtnQkFBQTtjQUFBO2NBQUFGLFNBQUEsQ0FBQUUsSUFBQTtjQUFBLE9BQ25CMUIsZUFBZSxDQUFDMkIsT0FBTztZQUFBO2NBRy9CO2NBQ0EzQixlQUFlLENBQUMyQixPQUFPLEdBQUcsSUFBQVQsa0JBQUEsMkJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFDLFNBQUFRLFFBQUE7Z0JBQUEsSUFBQUMsTUFBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsRUFBQUMsVUFBQSxFQUFBQyxhQUFBO2dCQUFBLE9BQUFkLFlBQUEsWUFBQUcsSUFBQSxVQUFBWSxTQUFBQyxRQUFBO2tCQUFBLGtCQUFBQSxRQUFBLENBQUFWLElBQUEsR0FBQVUsUUFBQSxDQUFBVCxJQUFBO29CQUFBO3NCQUFBUyxRQUFBLENBQUFWLElBQUE7c0JBQUFVLFFBQUEsQ0FBQVQsSUFBQTtzQkFBQSxPQUVGLElBQUFVLGlCQUFTLEVBQUMsQ0FBQztvQkFBQTtzQkFBMUJQLE1BQU0sR0FBQU0sUUFBQSxDQUFBRSxJQUFBO3NCQUFBLElBQ1BSLE1BQU07d0JBQUFNLFFBQUEsQ0FBQVQsSUFBQTt3QkFBQTtzQkFBQTtzQkFBQSxNQUNILElBQUlZLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQztvQkFBQTtzQkFBQSxNQUVuRGhELFdBQVcsSUFBSUQsR0FBRzt3QkFBQThDLFFBQUEsQ0FBQVQsSUFBQTt3QkFBQTtzQkFBQTtzQkFBQVMsUUFBQSxDQUFBVCxJQUFBO3NCQUFBLE9BRURHLE1BQU0sQ0FBQ1UsT0FBTyxDQUFDLENBQUM7b0JBQUE7c0JBQTdCVCxJQUFJLEdBQUFLLFFBQUEsQ0FBQUUsSUFBQTtzQkFBQUYsUUFBQSxDQUFBVCxJQUFBO3NCQUFBLE9BR2dCSSxJQUFJLENBQUNVLEtBQUssQ0FBQ25ELEdBQUcsQ0FBQztvQkFBQTtzQkFBbkMwQyxXQUFXLEdBQUFJLFFBQUEsQ0FBQUUsSUFBQTtzQkFFakI7c0JBQ01MLFVBQVUsR0FBR0QsV0FBVyxDQUFDVSxPQUFPLENBQUMsQ0FBQyxDQUFDM0MsR0FBRyxDQUFDLFVBQUE0QyxHQUFHO3dCQUFBLE9BQUksSUFBQUMsK0JBQXVCLEVBQUNELEdBQUcsQ0FBQztzQkFBQSxFQUFDLEVBRWpGO3NCQUFBUCxRQUFBLENBQUFULElBQUE7c0JBQUEsT0FDNEIsSUFBQWtCLDJCQUFlLEVBQUM7d0JBQzFDQyxPQUFPLEVBQUU7MEJBQUNDLFFBQVEsRUFBRXZELGNBQWM7MEJBQUV3RCxJQUFJLEVBQUVmO3dCQUFVLENBQUM7d0JBQ3JEZ0IsU0FBUyxFQUFFO3NCQUNiLENBQUMsQ0FBQztvQkFBQTtzQkFISWYsYUFBYSxHQUFBRSxRQUFBLENBQUFFLElBQUE7c0JBS25CO3NCQUNBbkMsUUFBUSxDQUNOLElBQUErQyxxQkFBWSxFQUFDO3dCQUNYeEQsUUFBUSxFQUFFd0MsYUFBYTt3QkFDdkJpQixPQUFPLEVBQUU7MEJBQUNDLGdCQUFnQixFQUFFLElBQUk7MEJBQUVDLFNBQVMsRUFBRTt3QkFBSTtzQkFDbkQsQ0FBQyxDQUNILENBQUM7O3NCQUVEO3NCQUFBakIsUUFBQSxDQUFBVCxJQUFBO3NCQUFBLE9BQ01JLElBQUksQ0FBQ1UsS0FBSyxlQUFBYSxNQUFBLENBQWUvRCxXQUFXLENBQUUsQ0FBQztvQkFBQTtzQkFBQTZDLFFBQUEsQ0FBQVQsSUFBQTtzQkFBQSxPQUd2Q0ksSUFBSSxDQUFDd0IsS0FBSyxDQUFDLENBQUM7b0JBQUE7c0JBQUFuQixRQUFBLENBQUFULElBQUE7c0JBQUE7b0JBQUE7c0JBQUFTLFFBQUEsQ0FBQVYsSUFBQTtzQkFBQVUsUUFBQSxDQUFBb0IsRUFBQSxHQUFBcEIsUUFBQTtzQkFHcEJxQixPQUFPLENBQUNoRCxLQUFLLENBQUEyQixRQUFBLENBQUFvQixFQUFNLENBQUM7c0JBQ3BCOUMsUUFBUSxDQUFDMEIsUUFBQSxDQUFBb0IsRUFBQSxZQUFpQmpCLEtBQUssR0FBR0gsUUFBQSxDQUFBb0IsRUFBQSxDQUFNRSxPQUFPLEdBQUcsd0JBQXdCLENBQUM7b0JBQUM7c0JBQUF0QixRQUFBLENBQUFWLElBQUE7c0JBRTVFekIsZUFBZSxDQUFDMkIsT0FBTyxHQUFHLElBQUk7c0JBQUMsT0FBQVEsUUFBQSxDQUFBdUIsTUFBQTtvQkFBQTtvQkFBQTtzQkFBQSxPQUFBdkIsUUFBQSxDQUFBd0IsSUFBQTtrQkFBQTtnQkFBQSxHQUFBL0IsT0FBQTtjQUFBLENBRWxDLEdBQUUsQ0FBQzs7Y0FFSjtjQUFBSixTQUFBLENBQUFFLElBQUE7Y0FBQSxPQUNNMUIsZUFBZSxDQUFDMkIsT0FBTztZQUFBO1lBQUE7Y0FBQSxPQUFBSCxTQUFBLENBQUFtQyxJQUFBO1VBQUE7UUFBQSxHQUFBdEMsUUFBQTtNQUFBLENBQzlCO01BQUEsZ0JBckRLTCxRQUFRQSxDQUFBO1FBQUEsT0FBQUMsS0FBQSxDQUFBMkMsS0FBQSxPQUFBQyxTQUFBO01BQUE7SUFBQSxHQXFEYjtJQUVEN0MsUUFBUSxDQUFDLENBQUM7SUFDVjtFQUNGLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixPQUFPUixLQUFLLGdCQUFHOUMsTUFBQSxZQUFBb0csYUFBQTtJQUFLQyxLQUFLLEVBQUU7TUFBQ0MsS0FBSyxFQUFFLEtBQUs7TUFBRUMsUUFBUSxFQUFFO0lBQUs7RUFBRSxHQUFFekQsS0FBVyxDQUFDLEdBQUcsSUFBSTtBQUNsRiIsImlnbm9yZUxpc3QiOltdfQ==