UNPKG

kepler.gl

Version:

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

223 lines (213 loc) 38.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.GeoArrowScatterplotLayer = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _core = require("@deck.gl/core"); var _layers = require("@deck.gl/layers"); var ga = _interopRequireWildcard(require("@geoarrow/geoarrow-js")); var _constants = require("@kepler.gl/constants"); var _utils = require("../utils/utils"); var _picking = require("../utils/picking"); var _validate = require("../utils/validate"); 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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // deck.gl-community // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors /** All properties supported by GeoArrowScatterplotLayer */ /** Properties added by GeoArrowScatterplotLayer */ // Remove data and getPosition from the upstream default props var _ScatterplotLayer$def = _layers.ScatterplotLayer.defaultProps, _data = _ScatterplotLayer$def.data, _getPosition = _ScatterplotLayer$def.getPosition, _upstreamDefaultProps = (0, _objectWithoutProperties2["default"])(_ScatterplotLayer$def, ["data", "getPosition"]); // Default props added by us var ourDefaultProps = { _validate: true }; // @ts-expect-error var defaultProps = _objectSpread(_objectSpread({}, _upstreamDefaultProps), ourDefaultProps); var GeoArrowScatterplotLayer = exports.GeoArrowScatterplotLayer = /*#__PURE__*/function (_CompositeLayer) { function GeoArrowScatterplotLayer() { (0, _classCallCheck2["default"])(this, GeoArrowScatterplotLayer); return _callSuper(this, GeoArrowScatterplotLayer, arguments); } (0, _inherits2["default"])(GeoArrowScatterplotLayer, _CompositeLayer); return (0, _createClass2["default"])(GeoArrowScatterplotLayer, [{ key: "getPickingInfo", value: function getPickingInfo(params) { return (0, _picking.getPickingInfo)(params, this.props.data); } }, { key: "renderLayers", value: function renderLayers() { var table = this.props.data; if (this.props.getPosition !== undefined) { var geometryColumn = this.props.getPosition; if (geometryColumn !== undefined && ga.vector.isPointVector(geometryColumn)) { return this._renderLayersPoint(geometryColumn); } if (geometryColumn !== undefined && ga.vector.isMultiPointVector(geometryColumn)) { return this._renderLayersMultiPoint(geometryColumn); } throw new Error('getPosition should pass in an arrow Vector of Point or MultiPoint type'); } else { var pointVector = (0, _utils.getGeometryVector)(table, _constants.GEOARROW_EXTENSIONS.POINT); if (pointVector !== null) { return this._renderLayersPoint(pointVector); } var multiPointVector = (0, _utils.getGeometryVector)(table, _constants.GEOARROW_EXTENSIONS.MULTIPOINT); if (multiPointVector !== null) { return this._renderLayersMultiPoint(multiPointVector); } } throw new Error('getPosition not GeoArrow point or multipoint'); } }, { key: "_renderLayersPoint", value: function _renderLayersPoint(geometryColumn) { var table = this.props.data; if (this.props._validate) { (0, _utils.assert)(ga.vector.isPointVector(geometryColumn)); (0, _validate.validateAccessors)(this.props, table); } // Exclude manually-set accessors var _extractAccessorsFrom = (0, _utils.extractAccessorsFromProps)(this.props, ['getPosition']), _extractAccessorsFrom2 = (0, _slicedToArray2["default"])(_extractAccessorsFrom, 2), accessors = _extractAccessorsFrom2[0], otherProps = _extractAccessorsFrom2[1]; var tableOffsets = (0, _picking.computeChunkOffsets)(table.data); var layers = []; for (var recordBatchIdx = 0; recordBatchIdx < table.batches.length; recordBatchIdx++) { var geometryData = geometryColumn.data[recordBatchIdx]; var flatCoordsData = ga.child.getPointChild(geometryData); var flatCoordinateArray = flatCoordsData.values; // @ts-expect-error how to properly retrieve batch offset? var batchOffset = geometryColumn._offsets[recordBatchIdx]; var props = _objectSpread(_objectSpread(_objectSpread({}, ourDefaultProps), otherProps), {}, { // used for picking purposes recordBatchIdx: recordBatchIdx, tableOffsets: tableOffsets, id: "".concat(this.props.id, "-geoarrow-scatterplot-").concat(recordBatchIdx), data: { // @ts-expect-error data: table.batches[recordBatchIdx], length: geometryData.length, attributes: { getPosition: { value: flatCoordinateArray, size: geometryData.type.listSize } } } }); for (var _i = 0, _Object$entries = Object.entries(accessors); _i < _Object$entries.length; _i++) { var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2), propName = _Object$entries$_i[0], propInput = _Object$entries$_i[1]; (0, _utils.assignAccessor)({ props: props, propName: propName, propInput: propInput, chunkIdx: recordBatchIdx, batchOffset: batchOffset }); } var layer = new _layers.ScatterplotLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps(props)), {}, { // preserve binded accessors, as they are overwriten back by pass-through accessors from extensions getFiltered: props.getFiltered, getFilterValue: props.getFilterValue })); layers.push(layer); } return layers; } }, { key: "_renderLayersMultiPoint", value: function _renderLayersMultiPoint(geometryColumn) { var table = this.props.data; // TODO: validate that if nested, accessor props have the same nesting // structure as the main geometry column. if (this.props._validate) { (0, _utils.assert)(ga.vector.isMultiPointVector(geometryColumn)); (0, _validate.validateAccessors)(this.props, table); } // Exclude manually-set accessors var _extractAccessorsFrom3 = (0, _utils.extractAccessorsFromProps)(this.props, ['getPosition']), _extractAccessorsFrom4 = (0, _slicedToArray2["default"])(_extractAccessorsFrom3, 2), accessors = _extractAccessorsFrom4[0], otherProps = _extractAccessorsFrom4[1]; var tableOffsets = (0, _picking.computeChunkOffsets)(table.data); var layers = []; for (var recordBatchIdx = 0; recordBatchIdx < table.batches.length; recordBatchIdx++) { var multiPointData = geometryColumn.data[recordBatchIdx]; var pointData = ga.child.getMultiPointChild(multiPointData); var geomOffsets = multiPointData.valueOffsets; var flatCoordsData = ga.child.getPointChild(pointData); var flatCoordinateArray = flatCoordsData.values; // @ts-expect-error how to properly retrieve batch offset? var batchOffset = geometryColumn._offsets[recordBatchIdx]; var props = _objectSpread(_objectSpread(_objectSpread({}, ourDefaultProps), otherProps), {}, { // used for picking purposes recordBatchIdx: recordBatchIdx, tableOffsets: tableOffsets, id: "".concat(this.props.id, "-geoarrow-scatterplot-").concat(recordBatchIdx), data: { // @ts-expect-error data: table.batches[recordBatchIdx], // Map from expanded multi-geometry index to original index // Used both in picking and for function callbacks invertedGeomOffsets: (0, _utils.invertOffsets)(geomOffsets), // Note: this needs to be the length one level down. length: pointData.length, attributes: { getPosition: { value: flatCoordinateArray, size: pointData.type.listSize } } } }); for (var _i2 = 0, _Object$entries2 = Object.entries(accessors); _i2 < _Object$entries2.length; _i2++) { var _Object$entries2$_i = (0, _slicedToArray2["default"])(_Object$entries2[_i2], 2), propName = _Object$entries2$_i[0], propInput = _Object$entries2$_i[1]; (0, _utils.assignAccessor)({ props: props, propName: propName, propInput: propInput, chunkIdx: recordBatchIdx, geomCoordOffsets: geomOffsets, batchOffset: batchOffset }); } var layer = new _layers.ScatterplotLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps(props)), {}, { // preserve binded accessors, as they are overwriten back by pass-through accessors from extensions getFiltered: props.getFiltered, getFilterValue: props.getFilterValue })); layers.push(layer); } return layers; } }]); }(_core.CompositeLayer); (0, _defineProperty2["default"])(GeoArrowScatterplotLayer, "defaultProps", defaultProps); (0, _defineProperty2["default"])(GeoArrowScatterplotLayer, "layerName", 'GeoArrowScatterplotLayer'); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiZ2EiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfcGlja2luZyIsIl92YWxpZGF0ZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX1NjYXR0ZXJwbG90TGF5ZXIkZGVmIiwiU2NhdHRlcnBsb3RMYXllciIsImRlZmF1bHRQcm9wcyIsIl9kYXRhIiwiZGF0YSIsIl9nZXRQb3NpdGlvbiIsImdldFBvc2l0aW9uIiwiX3Vwc3RyZWFtRGVmYXVsdFByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsIm91ckRlZmF1bHRQcm9wcyIsIkdlb0Fycm93U2NhdHRlcnBsb3RMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFBpY2tpbmdJbmZvIiwicGFyYW1zIiwicHJvcHMiLCJyZW5kZXJMYXllcnMiLCJ0YWJsZSIsInVuZGVmaW5lZCIsImdlb21ldHJ5Q29sdW1uIiwidmVjdG9yIiwiaXNQb2ludFZlY3RvciIsIl9yZW5kZXJMYXllcnNQb2ludCIsImlzTXVsdGlQb2ludFZlY3RvciIsIl9yZW5kZXJMYXllcnNNdWx0aVBvaW50IiwiRXJyb3IiLCJwb2ludFZlY3RvciIsImdldEdlb21ldHJ5VmVjdG9yIiwiR0VPQVJST1dfRVhURU5TSU9OUyIsIlBPSU5UIiwibXVsdGlQb2ludFZlY3RvciIsIk1VTFRJUE9JTlQiLCJhc3NlcnQiLCJ2YWxpZGF0ZUFjY2Vzc29ycyIsIl9leHRyYWN0QWNjZXNzb3JzRnJvbSIsImV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHMiLCJfZXh0cmFjdEFjY2Vzc29yc0Zyb20yIiwiX3NsaWNlZFRvQXJyYXkyIiwiYWNjZXNzb3JzIiwib3RoZXJQcm9wcyIsInRhYmxlT2Zmc2V0cyIsImNvbXB1dGVDaHVua09mZnNldHMiLCJsYXllcnMiLCJyZWNvcmRCYXRjaElkeCIsImJhdGNoZXMiLCJnZW9tZXRyeURhdGEiLCJmbGF0Q29vcmRzRGF0YSIsImNoaWxkIiwiZ2V0UG9pbnRDaGlsZCIsImZsYXRDb29yZGluYXRlQXJyYXkiLCJ2YWx1ZXMiLCJiYXRjaE9mZnNldCIsIl9vZmZzZXRzIiwiaWQiLCJjb25jYXQiLCJhdHRyaWJ1dGVzIiwic2l6ZSIsInR5cGUiLCJsaXN0U2l6ZSIsIl9pIiwiX09iamVjdCRlbnRyaWVzIiwiZW50cmllcyIsIl9PYmplY3QkZW50cmllcyRfaSIsInByb3BOYW1lIiwicHJvcElucHV0IiwiYXNzaWduQWNjZXNzb3IiLCJjaHVua0lkeCIsImxheWVyIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsImdldEZpbHRlcmVkIiwiZ2V0RmlsdGVyVmFsdWUiLCJfZXh0cmFjdEFjY2Vzc29yc0Zyb20zIiwiX2V4dHJhY3RBY2Nlc3NvcnNGcm9tNCIsIm11bHRpUG9pbnREYXRhIiwicG9pbnREYXRhIiwiZ2V0TXVsdGlQb2ludENoaWxkIiwiZ2VvbU9mZnNldHMiLCJ2YWx1ZU9mZnNldHMiLCJpbnZlcnRlZEdlb21PZmZzZXRzIiwiaW52ZXJ0T2Zmc2V0cyIsIl9pMiIsIl9PYmplY3QkZW50cmllczIiLCJfT2JqZWN0JGVudHJpZXMyJF9pIiwiZ2VvbUNvb3JkT2Zmc2V0cyIsIkNvbXBvc2l0ZUxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9nZW8tYXJyb3ctc2NhdHRlcnBsb3QtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gZGVjay5nbC1jb21tdW5pdHlcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCAoYykgdmlzLmdsIGNvbnRyaWJ1dG9yc1xuXG5pbXBvcnQge1xuICBDb21wb3NpdGVMYXllcixcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcyxcbiAgRGVmYXVsdFByb3BzLFxuICBHZXRQaWNraW5nSW5mb1BhcmFtcyxcbiAgTGF5ZXIsXG4gIExheWVyc0xpc3Rcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NjYXR0ZXJwbG90TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQgdHlwZSB7U2NhdHRlcnBsb3RMYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGdhIGZyb20gJ0BnZW9hcnJvdy9nZW9hcnJvdy1qcyc7XG5cbmltcG9ydCB7R0VPQVJST1dfRVhURU5TSU9OU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1xuICBhc3NpZ25BY2Nlc3NvcixcbiAgZXh0cmFjdEFjY2Vzc29yc0Zyb21Qcm9wcyxcbiAgZ2V0R2VvbWV0cnlWZWN0b3IsXG4gIGludmVydE9mZnNldHNcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtHZW9BcnJvd0V4dHJhUGlja2luZ1Byb3BzLCBjb21wdXRlQ2h1bmtPZmZzZXRzLCBnZXRQaWNraW5nSW5mb30gZnJvbSAnLi4vdXRpbHMvcGlja2luZyc7XG5pbXBvcnQge0NvbG9yQWNjZXNzb3IsIEZsb2F0QWNjZXNzb3IsIEdlb0Fycm93UGlja2luZ0luZm8sIEV4dGVuc2lvblByb3BzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHt2YWxpZGF0ZUFjY2Vzc29yc30gZnJvbSAnLi4vdXRpbHMvdmFsaWRhdGUnO1xuXG4vKiogQWxsIHByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IEdlb0Fycm93U2NhdHRlcnBsb3RMYXllciAqL1xuZXhwb3J0IHR5cGUgR2VvQXJyb3dTY2F0dGVycGxvdExheWVyUHJvcHMgPSBPbWl0PFxuICBTY2F0dGVycGxvdExheWVyUHJvcHM8YXJyb3cuVGFibGU+LFxuICAnZGF0YScgfCAnZ2V0UG9zaXRpb24nIHwgJ2dldFJhZGl1cycgfCAnZ2V0RmlsbENvbG9yJyB8ICdnZXRMaW5lQ29sb3InXG4+ICZcbiAgX0dlb0Fycm93U2NhdHRlcnBsb3RMYXllclByb3BzICZcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcztcblxuLyoqIFByb3BlcnRpZXMgYWRkZWQgYnkgR2VvQXJyb3dTY2F0dGVycGxvdExheWVyICovXG50eXBlIF9HZW9BcnJvd1NjYXR0ZXJwbG90TGF5ZXJQcm9wcyA9IHtcbiAgZGF0YTogYXJyb3cuVGFibGU7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdmFsaWRhdGUgdGhlIGFycmF5cyBwcm92aWRlZCAoZS5nLiBjaHVuayBsZW5ndGhzKVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBfdmFsaWRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2VudGVyIHBvc2l0aW9uIGFjY2Vzc29yLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHdpbGwgYmUgaW5mZXJyZWQgYnkgZmluZGluZyBhIGNvbHVtbiB3aXRoIGV4dGVuc2lvbiB0eXBlXG4gICAqIGBcImdlb2Fycm93LnBvaW50XCJgIG9yIGBcImdlb2Fycm93Lm11bHRpcG9pbnRcImAuXG4gICAqL1xuICBnZXRQb3NpdGlvbj86IGdhLnZlY3Rvci5Qb2ludFZlY3RvciB8IGdhLnZlY3Rvci5NdWx0aVBvaW50VmVjdG9yO1xuICAvKipcbiAgICogUmFkaXVzIGFjY2Vzc29yLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBnZXRSYWRpdXM/OiBGbG9hdEFjY2Vzc29yO1xuICAvKipcbiAgICogRmlsbCBjb2xvciBhY2Nlc3Nvci5cbiAgICogQGRlZmF1bHQgWzAsIDAsIDAsIDI1NV1cbiAgICovXG4gIGdldEZpbGxDb2xvcj86IENvbG9yQWNjZXNzb3I7XG4gIC8qKlxuICAgKiBTdHJva2UgY29sb3IgYWNjZXNzb3IuXG4gICAqIEBkZWZhdWx0IFswLCAwLCAwLCAyNTVdXG4gICAqL1xuICBnZXRMaW5lQ29sb3I/OiBDb2xvckFjY2Vzc29yO1xuICAvKipcbiAgICogU3Ryb2tlIHdpZHRoIGFjY2Vzc29yLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBnZXRMaW5lV2lkdGg/OiBGbG9hdEFjY2Vzc29yO1xufTtcblxuLy8gUmVtb3ZlIGRhdGEgYW5kIGdldFBvc2l0aW9uIGZyb20gdGhlIHVwc3RyZWFtIGRlZmF1bHQgcHJvcHNcbmNvbnN0IHtcbiAgZGF0YTogX2RhdGEsXG4gIGdldFBvc2l0aW9uOiBfZ2V0UG9zaXRpb24sXG4gIC4uLl91cHN0cmVhbURlZmF1bHRQcm9wc1xufSA9IFNjYXR0ZXJwbG90TGF5ZXIuZGVmYXVsdFByb3BzO1xuXG4vLyBEZWZhdWx0IHByb3BzIGFkZGVkIGJ5IHVzXG5jb25zdCBvdXJEZWZhdWx0UHJvcHMgPSB7XG4gIF92YWxpZGF0ZTogdHJ1ZVxufTtcblxuLy8gQHRzLWV4cGVjdC1lcnJvclxuY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHM8R2VvQXJyb3dTY2F0dGVycGxvdExheWVyUHJvcHM+ID0ge1xuICAuLi5fdXBzdHJlYW1EZWZhdWx0UHJvcHMsXG4gIC4uLm91ckRlZmF1bHRQcm9wc1xufTtcblxuZXhwb3J0IGNsYXNzIEdlb0Fycm93U2NhdHRlcnBsb3RMYXllcjxFeHRyYVByb3BzIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiBleHRlbmRzIENvbXBvc2l0ZUxheWVyPFxuICBHZW9BcnJvd1NjYXR0ZXJwbG90TGF5ZXJQcm9wcyAmIEV4dHJhUHJvcHNcbj4ge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0dlb0Fycm93U2NhdHRlcnBsb3RMYXllcic7XG5cbiAgZ2V0UGlja2luZ0luZm8oXG4gICAgcGFyYW1zOiBHZXRQaWNraW5nSW5mb1BhcmFtcyAmIHtcbiAgICAgIHNvdXJjZUxheWVyOiB7cHJvcHM6IEdlb0Fycm93RXh0cmFQaWNraW5nUHJvcHN9O1xuICAgIH1cbiAgKTogR2VvQXJyb3dQaWNraW5nSW5mbyB7XG4gICAgcmV0dXJuIGdldFBpY2tpbmdJbmZvKHBhcmFtcywgdGhpcy5wcm9wcy5kYXRhKTtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZ2V0UG9zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VvbWV0cnlDb2x1bW4gPSB0aGlzLnByb3BzLmdldFBvc2l0aW9uO1xuICAgICAgaWYgKGdlb21ldHJ5Q29sdW1uICE9PSB1bmRlZmluZWQgJiYgZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNQb2ludChnZW9tZXRyeUNvbHVtbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZW9tZXRyeUNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIGdhLnZlY3Rvci5pc011bHRpUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNNdWx0aVBvaW50KGdlb21ldHJ5Q29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRQb3NpdGlvbiBzaG91bGQgcGFzcyBpbiBhbiBhcnJvdyBWZWN0b3Igb2YgUG9pbnQgb3IgTXVsdGlQb2ludCB0eXBlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBvaW50VmVjdG9yID0gZ2V0R2VvbWV0cnlWZWN0b3IodGFibGUsIEdFT0FSUk9XX0VYVEVOU0lPTlMuUE9JTlQpO1xuICAgICAgaWYgKHBvaW50VmVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNQb2ludChwb2ludFZlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG11bHRpUG9pbnRWZWN0b3IgPSBnZXRHZW9tZXRyeVZlY3Rvcih0YWJsZSwgR0VPQVJST1dfRVhURU5TSU9OUy5NVUxUSVBPSU5UKTtcbiAgICAgIGlmIChtdWx0aVBvaW50VmVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNNdWx0aVBvaW50KG11bHRpUG9pbnRWZWN0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignZ2V0UG9zaXRpb24gbm90IEdlb0Fycm93IHBvaW50IG9yIG11bHRpcG9pbnQnKTtcbiAgfVxuXG4gIF9yZW5kZXJMYXllcnNQb2ludChnZW9tZXRyeUNvbHVtbjogZ2EudmVjdG9yLlBvaW50VmVjdG9yKTogTGF5ZXI8b2JqZWN0PiB8IExheWVyc0xpc3QgfCBudWxsIHtcbiAgICBjb25zdCB7ZGF0YTogdGFibGV9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh0aGlzLnByb3BzLl92YWxpZGF0ZSkge1xuICAgICAgYXNzZXJ0KGdhLnZlY3Rvci5pc1BvaW50VmVjdG9yKGdlb21ldHJ5Q29sdW1uKSk7XG4gICAgICB2YWxpZGF0ZUFjY2Vzc29ycyh0aGlzLnByb3BzLCB0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gRXhjbHVkZSBtYW51YWxseS1zZXQgYWNjZXNzb3JzXG4gICAgY29uc3QgW2FjY2Vzc29ycywgb3RoZXJQcm9wc10gPSBleHRyYWN0QWNjZXNzb3JzRnJvbVByb3BzKHRoaXMucHJvcHMsIFsnZ2V0UG9zaXRpb24nXSk7XG4gICAgY29uc3QgdGFibGVPZmZzZXRzID0gY29tcHV0ZUNodW5rT2Zmc2V0cyh0YWJsZS5kYXRhKTtcblxuICAgIGNvbnN0IGxheWVyczogU2NhdHRlcnBsb3RMYXllcjxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRCYXRjaElkeCA9IDA7IHJlY29yZEJhdGNoSWR4IDwgdGFibGUuYmF0Y2hlcy5sZW5ndGg7IHJlY29yZEJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IGdlb21ldHJ5RGF0YSA9IGdlb21ldHJ5Q29sdW1uLmRhdGFbcmVjb3JkQmF0Y2hJZHhdO1xuICAgICAgY29uc3QgZmxhdENvb3Jkc0RhdGEgPSBnYS5jaGlsZC5nZXRQb2ludENoaWxkKGdlb21ldHJ5RGF0YSk7XG4gICAgICBjb25zdCBmbGF0Q29vcmRpbmF0ZUFycmF5ID0gZmxhdENvb3Jkc0RhdGEudmFsdWVzO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGhvdyB0byBwcm9wZXJseSByZXRyaWV2ZSBiYXRjaCBvZmZzZXQ/XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGdlb21ldHJ5Q29sdW1uLl9vZmZzZXRzW3JlY29yZEJhdGNoSWR4XTtcblxuICAgICAgY29uc3QgcHJvcHM6IFNjYXR0ZXJwbG90TGF5ZXJQcm9wczxhbnk+ICYgRXh0ZW5zaW9uUHJvcHMgPSB7XG4gICAgICAgIC8vIE5vdGU6IGJlY2F1c2UgdGhpcyBpcyBhIGNvbXBvc2l0ZSBsYXllciBhbmQgbm90IGRvaW5nIHRoZSByZW5kZXJpbmdcbiAgICAgICAgLy8gaXRzZWxmLCB3ZSBzdGlsbCBoYXZlIHRvIHBhc3MgaW4gb3VyIGRlZmF1bHRQcm9wc1xuICAgICAgICAuLi5vdXJEZWZhdWx0UHJvcHMsXG4gICAgICAgIC4uLm90aGVyUHJvcHMsXG5cbiAgICAgICAgLy8gdXNlZCBmb3IgcGlja2luZyBwdXJwb3Nlc1xuICAgICAgICByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgdGFibGVPZmZzZXRzLFxuXG4gICAgICAgIGlkOiBgJHt0aGlzLnByb3BzLmlkfS1nZW9hcnJvdy1zY2F0dGVycGxvdC0ke3JlY29yZEJhdGNoSWR4fWAsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgZGF0YTogdGFibGUuYmF0Y2hlc1tyZWNvcmRCYXRjaElkeF0sXG4gICAgICAgICAgbGVuZ3RoOiBnZW9tZXRyeURhdGEubGVuZ3RoLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGdldFBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBmbGF0Q29vcmRpbmF0ZUFycmF5LFxuICAgICAgICAgICAgICBzaXplOiBnZW9tZXRyeURhdGEudHlwZS5saXN0U2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BJbnB1dF0gb2YgT2JqZWN0LmVudHJpZXMoYWNjZXNzb3JzKSkge1xuICAgICAgICBhc3NpZ25BY2Nlc3Nvcih7XG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgcHJvcElucHV0LFxuICAgICAgICAgIGNodW5rSWR4OiByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgICBiYXRjaE9mZnNldFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGF5ZXIgPSBuZXcgU2NhdHRlcnBsb3RMYXllcih7XG4gICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyhwcm9wcyksXG4gICAgICAgIC8vIHByZXNlcnZlIGJpbmRlZCBhY2Nlc3NvcnMsIGFzIHRoZXkgYXJlIG92ZXJ3cml0ZW4gYmFjayBieSBwYXNzLXRocm91Z2ggYWNjZXNzb3JzIGZyb20gZXh0ZW5zaW9uc1xuICAgICAgICBnZXRGaWx0ZXJlZDogcHJvcHMuZ2V0RmlsdGVyZWQsXG4gICAgICAgIGdldEZpbHRlclZhbHVlOiBwcm9wcy5nZXRGaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxuXG4gIF9yZW5kZXJMYXllcnNNdWx0aVBvaW50KFxuICAgIGdlb21ldHJ5Q29sdW1uOiBnYS52ZWN0b3IuTXVsdGlQb2ludFZlY3RvclxuICApOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCBpZiBuZXN0ZWQsIGFjY2Vzc29yIHByb3BzIGhhdmUgdGhlIHNhbWUgbmVzdGluZ1xuICAgIC8vIHN0cnVjdHVyZSBhcyB0aGUgbWFpbiBnZW9tZXRyeSBjb2x1bW4uXG4gICAgaWYgKHRoaXMucHJvcHMuX3ZhbGlkYXRlKSB7XG4gICAgICBhc3NlcnQoZ2EudmVjdG9yLmlzTXVsdGlQb2ludFZlY3RvcihnZW9tZXRyeUNvbHVtbikpO1xuICAgICAgdmFsaWRhdGVBY2Nlc3NvcnModGhpcy5wcm9wcywgdGFibGUpO1xuICAgIH1cblxuICAgIC8vIEV4Y2x1ZGUgbWFudWFsbHktc2V0IGFjY2Vzc29yc1xuICAgIGNvbnN0IFthY2Nlc3NvcnMsIG90aGVyUHJvcHNdID0gZXh0cmFjdEFjY2Vzc29yc0Zyb21Qcm9wcyh0aGlzLnByb3BzLCBbJ2dldFBvc2l0aW9uJ10pO1xuICAgIGNvbnN0IHRhYmxlT2Zmc2V0cyA9IGNvbXB1dGVDaHVua09mZnNldHModGFibGUuZGF0YSk7XG5cbiAgICBjb25zdCBsYXllcnM6IFNjYXR0ZXJwbG90TGF5ZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHJlY29yZEJhdGNoSWR4ID0gMDsgcmVjb3JkQmF0Y2hJZHggPCB0YWJsZS5iYXRjaGVzLmxlbmd0aDsgcmVjb3JkQmF0Y2hJZHgrKykge1xuICAgICAgY29uc3QgbXVsdGlQb2ludERhdGEgPSBnZW9tZXRyeUNvbHVtbi5kYXRhW3JlY29yZEJhdGNoSWR4XTtcbiAgICAgIGNvbnN0IHBvaW50RGF0YSA9IGdhLmNoaWxkLmdldE11bHRpUG9pbnRDaGlsZChtdWx0aVBvaW50RGF0YSk7XG4gICAgICBjb25zdCBnZW9tT2Zmc2V0cyA9IG11bHRpUG9pbnREYXRhLnZhbHVlT2Zmc2V0cztcbiAgICAgIGNvbnN0IGZsYXRDb29yZHNEYXRhID0gZ2EuY2hpbGQuZ2V0UG9pbnRDaGlsZChwb2ludERhdGEpO1xuICAgICAgY29uc3QgZmxhdENvb3JkaW5hdGVBcnJheSA9IGZsYXRDb29yZHNEYXRhLnZhbHVlcztcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBob3cgdG8gcHJvcGVybHkgcmV0cmlldmUgYmF0Y2ggb2Zmc2V0P1xuICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBnZW9tZXRyeUNvbHVtbi5fb2Zmc2V0c1tyZWNvcmRCYXRjaElkeF07XG5cbiAgICAgIGNvbnN0IHByb3BzOiBTY2F0dGVycGxvdExheWVyUHJvcHMgJiBFeHRlbnNpb25Qcm9wcyA9IHtcbiAgICAgICAgLy8gTm90ZTogYmVjYXVzZSB0aGlzIGlzIGEgY29tcG9zaXRlIGxheWVyIGFuZCBub3QgZG9pbmcgdGhlIHJlbmRlcmluZ1xuICAgICAgICAvLyBpdHNlbGYsIHdlIHN0aWxsIGhhdmUgdG8gcGFzcyBpbiBvdXIgZGVmYXVsdFByb3BzXG4gICAgICAgIC4uLm91ckRlZmF1bHRQcm9wcyxcbiAgICAgICAgLi4ub3RoZXJQcm9wcyxcblxuICAgICAgICAvLyB1c2VkIGZvciBwaWNraW5nIHB1cnBvc2VzXG4gICAgICAgIHJlY29yZEJhdGNoSWR4LFxuICAgICAgICB0YWJsZU9mZnNldHMsXG5cbiAgICAgICAgaWQ6IGAke3RoaXMucHJvcHMuaWR9LWdlb2Fycm93LXNjYXR0ZXJwbG90LSR7cmVjb3JkQmF0Y2hJZHh9YCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBkYXRhOiB0YWJsZS5iYXRjaGVzW3JlY29yZEJhdGNoSWR4XSxcbiAgICAgICAgICAvLyBNYXAgZnJvbSBleHBhbmRlZCBtdWx0aS1nZW9tZXRyeSBpbmRleCB0byBvcmlnaW5hbCBpbmRleFxuICAgICAgICAgIC8vIFVzZWQgYm90aCBpbiBwaWNraW5nIGFuZCBmb3IgZnVuY3Rpb24gY2FsbGJhY2tzXG4gICAgICAgICAgaW52ZXJ0ZWRHZW9tT2Zmc2V0czogaW52ZXJ0T2Zmc2V0cyhnZW9tT2Zmc2V0cyksXG4gICAgICAgICAgLy8gTm90ZTogdGhpcyBuZWVkcyB0byBiZSB0aGUgbGVuZ3RoIG9uZSBsZXZlbCBkb3duLlxuICAgICAgICAgIGxlbmd0aDogcG9pbnREYXRhLmxlbmd0aCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICBnZXRQb3NpdGlvbjoge1xuICAgICAgICAgICAgICB2YWx1ZTogZmxhdENvb3JkaW5hdGVBcnJheSxcbiAgICAgICAgICAgICAgc2l6ZTogcG9pbnREYXRhLnR5cGUubGlzdFNpemVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBwcm9wSW5wdXRdIG9mIE9iamVjdC5lbnRyaWVzKGFjY2Vzc29ycykpIHtcbiAgICAgICAgYXNzaWduQWNjZXNzb3Ioe1xuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgIHByb3BJbnB1dCxcbiAgICAgICAgICBjaHVua0lkeDogcmVjb3JkQmF0Y2hJZHgsXG4gICAgICAgICAgZ2VvbUNvb3JkT2Zmc2V0czogZ2VvbU9mZnNldHMsXG4gICAgICAgICAgYmF0Y2hPZmZzZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxheWVyID0gbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMocHJvcHMpLFxuICAgICAgICAvLyBwcmVzZXJ2ZSBiaW5kZWQgYWNjZXNzb3JzLCBhcyB0aGV5IGFyZSBvdmVyd3JpdGVuIGJhY2sgYnkgcGFzcy10aHJvdWdoIGFjY2Vzc29ycyBmcm9tIGV4dGVuc2lvbnNcbiAgICAgICAgZ2V0RmlsdGVyZWQ6IHByb3BzLmdldEZpbHRlcmVkLFxuICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogcHJvcHMuZ2V0RmlsdGVyVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQVFBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQU1BLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUdBLElBQUFPLFNBQUEsR0FBQVAsT0FBQTtBQUFvRCxTQUFBUSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMs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