UNPKG

kepler.gl

Version:

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

129 lines (127 loc) 20 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.clusterVisConfigs = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 _aggregationLayer = _interopRequireDefault(require("../aggregation-layer")); var _layers = require("@deck.gl/layers"); var _deckglLayers = require("@kepler.gl/deckgl-layers"); var _clusterLayerIcon = _interopRequireDefault(require("./cluster-layer-icon")); var _constants = require("@kepler.gl/constants"); var _excluded = ["_filterData"]; 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; } 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; })(); } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var clusterVisConfigs = exports.clusterVisConfigs = { opacity: 'opacity', clusterRadius: 'clusterRadius', colorRange: 'colorRange', radiusRange: 'clusterRadiusRange', colorAggregation: 'colorAggregation' }; var ClusterLayer = exports["default"] = /*#__PURE__*/function (_AggregationLayer) { function ClusterLayer(props) { var _this; (0, _classCallCheck2["default"])(this, ClusterLayer); _this = _callSuper(this, ClusterLayer, [props]); _this.registerVisConfig(clusterVisConfigs); // Access data of a point from aggregated clusters, depends on how getClusterer works _this.getPointData = function (pt) { return pt; }; return _this; } (0, _inherits2["default"])(ClusterLayer, _AggregationLayer); return (0, _createClass2["default"])(ClusterLayer, [{ key: "type", get: function get() { return 'cluster'; } }, { key: "layerIcon", get: function get() { return _clusterLayerIcon["default"]; } }, { key: "visualChannels", get: function get() { return { color: { aggregation: 'colorAggregation', channelScaleType: _constants.CHANNEL_SCALES.colorAggr, defaultMeasure: 'property.pointCount', domain: 'colorDomain', field: 'colorField', key: 'color', property: 'color', range: 'colorRange', scale: 'colorScale' } }; } }, { key: "renderLayer", value: function renderLayer(opts) { var visConfig = this.config.visConfig; var data = opts.data, gpuFilter = opts.gpuFilter, objectHovered = opts.objectHovered, mapState = opts.mapState, layerCallbacks = opts.layerCallbacks; var updateTriggers = { getColorValue: { colorField: this.config.colorField, colorAggregation: this.config.visConfig.colorAggregation }, filterData: _objectSpread({ filterRange: gpuFilter.filterRange }, gpuFilter.filterValueUpdateTriggers) }; var defaultLayerProps = this.getDefaultDeckLayerProps(opts); var filterData = data._filterData, clusterData = (0, _objectWithoutProperties2["default"])(data, _excluded); var hoveredObject = this.hasHoveredObject(objectHovered); return [new _deckglLayers.DeckGLClusterLayer(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), clusterData), {}, { filterData: filterData, // radius radiusScale: 1, radiusRange: visConfig.radiusRange, clusterRadius: visConfig.clusterRadius, // color colorRange: this.getColorRange(visConfig.colorRange), colorMap: visConfig.colorRange.colorMap, colorScaleType: this.config.colorScale, colorAggregation: visConfig.colorAggregation, zoom: Math.round(mapState.zoom), width: mapState.width, height: mapState.height, // updateTriggers updateTriggers: updateTriggers, // call back from layer after calculate clusters onSetColorDomain: layerCallbacks.onSetLayerDomain }))].concat((0, _toConsumableArray2["default"])(hoveredObject ? [new _layers.ScatterplotLayer({ id: "".concat(this.id, "-hovered"), visible: defaultLayerProps.visible, data: [hoveredObject], getFillColor: this.config.highlightColor, getRadius: function getRadius(d) { return d.radius; }, radiusScale: 1, pickable: false })] : [])); } }]); }(_aggregationLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2xheWVycyIsIl9kZWNrZ2xMYXllcnMiLCJfY2x1c3RlckxheWVySWNvbiIsIl9jb25zdGFudHMiLCJfZXhjbHVkZWQiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsImNsdXN0ZXJWaXNDb25maWdzIiwiZXhwb3J0cyIsIm9wYWNpdHkiLCJjbHVzdGVyUmFkaXVzIiwiY29sb3JSYW5nZSIsInJhZGl1c1JhbmdlIiwiY29sb3JBZ2dyZWdhdGlvbiIsIkNsdXN0ZXJMYXllciIsIl9BZ2dyZWdhdGlvbkxheWVyIiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvaW50RGF0YSIsInB0IiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJDbHVzdGVyTGF5ZXJJY29uIiwiY29sb3IiLCJhZ2dyZWdhdGlvbiIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsImNvbG9yQWdnciIsImRlZmF1bHRNZWFzdXJlIiwiZG9tYWluIiwiZmllbGQiLCJwcm9wZXJ0eSIsInJhbmdlIiwic2NhbGUiLCJ2YWx1ZSIsInJlbmRlckxheWVyIiwib3B0cyIsInZpc0NvbmZpZyIsImNvbmZpZyIsImRhdGEiLCJncHVGaWx0ZXIiLCJvYmplY3RIb3ZlcmVkIiwibWFwU3RhdGUiLCJsYXllckNhbGxiYWNrcyIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0Q29sb3JWYWx1ZSIsImNvbG9yRmllbGQiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyUmFuZ2UiLCJmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJfZmlsdGVyRGF0YSIsImNsdXN0ZXJEYXRhIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwiRGVja0dMQ2x1c3RlckxheWVyIiwicmFkaXVzU2NhbGUiLCJnZXRDb2xvclJhbmdlIiwiY29sb3JNYXAiLCJjb2xvclNjYWxlVHlwZSIsImNvbG9yU2NhbGUiLCJ6b29tIiwiTWF0aCIsInJvdW5kIiwid2lkdGgiLCJoZWlnaHQiLCJvblNldENvbG9yRG9tYWluIiwib25TZXRMYXllckRvbWFpbiIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJTY2F0dGVycGxvdExheWVyIiwiaWQiLCJ2aXNpYmxlIiwiZ2V0RmlsbENvbG9yIiwiaGlnaGxpZ2h0Q29sb3IiLCJnZXRSYWRpdXMiLCJkIiwicmFkaXVzIiwicGlja2FibGUiLCJBZ2dyZWdhdGlvbkxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsdXN0ZXItbGF5ZXIvY2x1c3Rlci1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgQWdncmVnYXRpb25MYXllciwge0FnZ3JlZ2F0aW9uTGF5ZXJDb25maWd9IGZyb20gJy4uL2FnZ3JlZ2F0aW9uLWxheWVyJztcbmltcG9ydCB7U2NhdHRlcnBsb3RMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcblxuaW1wb3J0IHtEZWNrR0xDbHVzdGVyTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvZGVja2dsLWxheWVycyc7XG5pbXBvcnQgQ2x1c3RlckxheWVySWNvbiBmcm9tICcuL2NsdXN0ZXItbGF5ZXItaWNvbic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlLFxuICBNZXJnZSxcbiAgVmlzQ29uZmlnQ29sb3JSYW5nZSxcbiAgVmlzQ29uZmlnTnVtYmVyLFxuICBWaXNDb25maWdSYW5nZSxcbiAgVmlzQ29uZmlnU2VsZWN0aW9uXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtDSEFOTkVMX1NDQUxFUywgQWdncmVnYXRpb25UeXBlc30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtWaXN1YWxDaGFubmVsc30gZnJvbSAnLi4vYmFzZS1sYXllcic7XG5cbmV4cG9ydCB0eXBlIENsdXN0ZXJMYXllclZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIGNsdXN0ZXJSYWRpdXM6IFZpc0NvbmZpZ051bWJlcjtcbiAgY29sb3JSYW5nZTogVmlzQ29uZmlnQ29sb3JSYW5nZTtcbiAgcmFkaXVzUmFuZ2U6IFZpc0NvbmZpZ1JhbmdlO1xuICBjb2xvckFnZ3JlZ2F0aW9uOiBWaXNDb25maWdTZWxlY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBDbHVzdGVyTGF5ZXJWaXNDb25maWcgPSB7XG4gIG9wYWNpdHk6IG51bWJlcjtcbiAgY2x1c3RlclJhZGl1czogbnVtYmVyO1xuICBjb2xvclJhbmdlOiBDb2xvclJhbmdlO1xuICByYWRpdXNSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgY29sb3JBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlcztcbn07XG5cbmV4cG9ydCB0eXBlIENsdXN0ZXJMYXllckNvbmZpZyA9IE1lcmdlPEFnZ3JlZ2F0aW9uTGF5ZXJDb25maWcsIHt2aXNDb25maWc6IENsdXN0ZXJMYXllclZpc0NvbmZpZ30+O1xuXG5leHBvcnQgY29uc3QgY2x1c3RlclZpc0NvbmZpZ3M6IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknO1xuICBjbHVzdGVyUmFkaXVzOiAnY2x1c3RlclJhZGl1cyc7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgcmFkaXVzUmFuZ2U6ICdjbHVzdGVyUmFkaXVzUmFuZ2UnO1xuICBjb2xvckFnZ3JlZ2F0aW9uOiAnY29sb3JBZ2dyZWdhdGlvbic7XG59ID0ge1xuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNsdXN0ZXJSYWRpdXM6ICdjbHVzdGVyUmFkaXVzJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICByYWRpdXNSYW5nZTogJ2NsdXN0ZXJSYWRpdXNSYW5nZScsXG4gIGNvbG9yQWdncmVnYXRpb246ICdjb2xvckFnZ3JlZ2F0aW9uJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2x1c3RlckxheWVyIGV4dGVuZHMgQWdncmVnYXRpb25MYXllciB7XG4gIGRlY2xhcmUgdmlzQ29uZmlnU2V0dGluZ3M6IENsdXN0ZXJMYXllclZpc0NvbmZpZ1NldHRpbmdzO1xuICBkZWNsYXJlIGNvbmZpZzogQ2x1c3RlckxheWVyQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcoY2x1c3RlclZpc0NvbmZpZ3MpO1xuXG4gICAgLy8gQWNjZXNzIGRhdGEgb2YgYSBwb2ludCBmcm9tIGFnZ3JlZ2F0ZWQgY2x1c3RlcnMsIGRlcGVuZHMgb24gaG93IGdldENsdXN0ZXJlciB3b3Jrc1xuICAgIHRoaXMuZ2V0UG9pbnREYXRhID0gcHQgPT4gcHQ7XG4gIH1cblxuICBnZXQgdHlwZSgpOiAnY2x1c3Rlcicge1xuICAgIHJldHVybiAnY2x1c3Rlcic7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBDbHVzdGVyTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCk6IFZpc3VhbENoYW5uZWxzIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgYWdncmVnYXRpb246ICdjb2xvckFnZ3JlZ2F0aW9uJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3JBZ2dyLFxuICAgICAgICBkZWZhdWx0TWVhc3VyZTogJ3Byb3BlcnR5LnBvaW50Q291bnQnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIGZpZWxkOiAnY29sb3JGaWVsZCcsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgcHJvcGVydHk6ICdjb2xvcicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIHNjYWxlOiAnY29sb3JTY2FsZSdcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHt2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge2RhdGEsIGdwdUZpbHRlciwgb2JqZWN0SG92ZXJlZCwgbWFwU3RhdGUsIGxheWVyQ2FsbGJhY2tzfSA9IG9wdHM7XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldENvbG9yVmFsdWU6IHtcbiAgICAgICAgY29sb3JGaWVsZDogdGhpcy5jb25maWcuY29sb3JGaWVsZCxcbiAgICAgICAgY29sb3JBZ2dyZWdhdGlvbjogdGhpcy5jb25maWcudmlzQ29uZmlnLmNvbG9yQWdncmVnYXRpb25cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJEYXRhOiB7XG4gICAgICAgIGZpbHRlclJhbmdlOiBncHVGaWx0ZXIuZmlsdGVyUmFuZ2UsXG4gICAgICAgIC4uLmdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG5cbiAgICBjb25zdCB7X2ZpbHRlckRhdGE6IGZpbHRlckRhdGEsIC4uLmNsdXN0ZXJEYXRhfSA9IGRhdGE7XG4gICAgY29uc3QgaG92ZXJlZE9iamVjdCA9IHRoaXMuaGFzSG92ZXJlZE9iamVjdChvYmplY3RIb3ZlcmVkKTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgRGVja0dMQ2x1c3RlckxheWVyKHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyUHJvcHMsXG4gICAgICAgIC4uLmNsdXN0ZXJEYXRhLFxuICAgICAgICBmaWx0ZXJEYXRhLFxuXG4gICAgICAgIC8vIHJhZGl1c1xuICAgICAgICByYWRpdXNTY2FsZTogMSxcbiAgICAgICAgcmFkaXVzUmFuZ2U6IHZpc0NvbmZpZy5yYWRpdXNSYW5nZSxcbiAgICAgICAgY2x1c3RlclJhZGl1czogdmlzQ29uZmlnLmNsdXN0ZXJSYWRpdXMsXG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgY29sb3JSYW5nZTogdGhpcy5nZXRDb2xvclJhbmdlKHZpc0NvbmZpZy5jb2xvclJhbmdlKSxcbiAgICAgICAgY29sb3JNYXA6IHZpc0NvbmZpZy5jb2xvclJhbmdlLmNvbG9yTWFwLFxuICAgICAgICBjb2xvclNjYWxlVHlwZTogdGhpcy5jb25maWcuY29sb3JTY2FsZSxcbiAgICAgICAgY29sb3JBZ2dyZWdhdGlvbjogdmlzQ29uZmlnLmNvbG9yQWdncmVnYXRpb24sXG5cbiAgICAgICAgem9vbTogTWF0aC5yb3VuZChtYXBTdGF0ZS56b29tKSxcbiAgICAgICAgd2lkdGg6IG1hcFN0YXRlLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IG1hcFN0YXRlLmhlaWdodCxcblxuICAgICAgICAvLyB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgICB1cGRhdGVUcmlnZ2VycyxcblxuICAgICAgICAvLyBjYWxsIGJhY2sgZnJvbSBsYXllciBhZnRlciBjYWxjdWxhdGUgY2x1c3RlcnNcbiAgICAgICAgb25TZXRDb2xvckRvbWFpbjogbGF5ZXJDYWxsYmFja3Mub25TZXRMYXllckRvbWFpblxuICAgICAgfSksXG4gICAgICAvLyBob3ZlciBsYXllclxuICAgICAgLi4uKGhvdmVyZWRPYmplY3RcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBuZXcgU2NhdHRlcnBsb3RMYXllcjx7cmFkaXVzOiBudW1iZXJ9Pih7XG4gICAgICAgICAgICAgIGlkOiBgJHt0aGlzLmlkfS1ob3ZlcmVkYCxcbiAgICAgICAgICAgICAgdmlzaWJsZTogZGVmYXVsdExheWVyUHJvcHMudmlzaWJsZSxcbiAgICAgICAgICAgICAgZGF0YTogW2hvdmVyZWRPYmplY3RdLFxuICAgICAgICAgICAgICBnZXRGaWxsQ29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICAgICAgICBnZXRSYWRpdXM6IGQgPT4gZC5yYWRpdXMsXG4gICAgICAgICAgICAgIHJhZGl1c1NjYWxlOiAxLFxuICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKVxuICAgIF07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFTQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFBc0UsSUFBQUssU0FBQTtBQUFBLFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFB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