UNPKG

kepler.gl

Version:

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

295 lines (294 loc) 40.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.s2RequiredColumns = exports.defaultLineWidth = exports.defaultElevation = exports["default"] = exports.S2_TOKEN_FIELDS = exports.S2VisConfigs = exports.S2TokenAccessor = void 0; 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _geoLayers = require("@deck.gl/geo-layers"); var _constants = require("@kepler.gl/constants"); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _s2LayerIcon = _interopRequireDefault(require("./s2-layer-icon")); var _s2Utils = require("./s2-utils"); var _utils = require("@kepler.gl/utils"); 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 _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } 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 var zoomFactorValue = 8; var S2_TOKEN_FIELDS = exports.S2_TOKEN_FIELDS = { token: ['s2', 's2_token'] }; var s2RequiredColumns = exports.s2RequiredColumns = ['token']; var S2TokenAccessor = exports.S2TokenAccessor = function S2TokenAccessor(_ref) { var token = _ref.token; return function (dc) { return function (d) { return dc.valueAt(d.index, token.fieldIdx); }; }; }; var defaultElevation = exports.defaultElevation = 500; var defaultLineWidth = exports.defaultLineWidth = 1; var S2VisConfigs = exports.S2VisConfigs = { // Filled color opacity: 'opacity', colorRange: 'colorRange', filled: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.filled), {}, { type: 'boolean', label: 'Fill Color', defaultValue: true, property: 'filled' }), // stroke thickness: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.thickness), {}, { defaultValue: 0.5 }), strokeColor: 'strokeColor', strokeColorRange: 'strokeColorRange', sizeRange: 'strokeWidthRange', stroked: 'stroked', // height enable3d: 'enable3d', elevationScale: 'elevationScale', enableElevationZoomFactor: 'enableElevationZoomFactor', fixedHeight: 'fixedHeight', heightRange: 'elevationRange', // wireframe wireframe: 'wireframe' }; var S2GeometryLayer = exports["default"] = /*#__PURE__*/function (_Layer) { function S2GeometryLayer(props) { var _this; (0, _classCallCheck2["default"])(this, S2GeometryLayer); _this = _callSuper(this, S2GeometryLayer, [props]); (0, _defineProperty2["default"])(_this, "dataToFeature", void 0); _this.registerVisConfig(S2VisConfigs); _this.getPositionAccessor = function (dataContainer) { return S2TokenAccessor(_this.config.columns)(dataContainer); }; return _this; } (0, _inherits2["default"])(S2GeometryLayer, _Layer); return (0, _createClass2["default"])(S2GeometryLayer, [{ key: "type", get: function get() { return 's2'; } }, { key: "name", get: function get() { return 'S2'; } }, { key: "requiredLayerColumns", get: function get() { return s2RequiredColumns; } }, { key: "layerIcon", get: function get() { return _s2LayerIcon["default"]; } }, { key: "visualChannels", get: function get() { var visualChannels = _superPropGet(S2GeometryLayer, "visualChannels", this, 1); return { color: _objectSpread(_objectSpread({}, visualChannels.color), {}, { accessor: 'getFillColor' }), size: _objectSpread(_objectSpread({}, visualChannels.size), {}, { property: 'stroke', accessor: 'getLineWidth', condition: function condition(config) { return config.visConfig.stroked; }, defaultValue: defaultLineWidth }), strokeColor: { property: 'strokeColor', field: 'strokeColorField', scale: 'strokeColorScale', domain: 'strokeColorDomain', range: 'strokeColorRange', key: 'strokeColor', channelScaleType: _constants.CHANNEL_SCALES.color, accessor: 'getLineColor', condition: function condition(config) { return config.visConfig.stroked; }, nullValue: visualChannels.color.nullValue, defaultValue: function defaultValue(config) { return config.visConfig.strokeColor || config.color; } }, height: { property: 'height', field: 'heightField', scale: 'heightScale', domain: 'heightDomain', range: 'heightRange', key: 'height', channelScaleType: _constants.CHANNEL_SCALES.size, accessor: 'getElevation', condition: function condition(config) { return config.visConfig.enable3d; }, nullValue: 0, defaultValue: defaultElevation } }; } }, { key: "getDefaultLayerConfig", value: function getDefaultLayerConfig(props) { var defaultLayerConfig = _superPropGet(S2GeometryLayer, "getDefaultLayerConfig", this, 3)([props !== null && props !== void 0 ? props : {}]); return _objectSpread(_objectSpread({}, defaultLayerConfig), {}, { // add height visual channel heightField: null, heightDomain: [0, 1], heightScale: 'linear', // add stroke color visual channel strokeColorField: null, strokeColorDomain: [0, 1], strokeColorScale: 'quantile', colorUI: _objectSpread(_objectSpread({}, defaultLayerConfig.colorUI), {}, { strokeColorRange: _constants.DEFAULT_COLOR_UI }) }); } }, { key: "calculateDataAttribute", value: function calculateDataAttribute(_ref2, getS2Token) { var filteredIndex = _ref2.filteredIndex; var data = []; for (var i = 0; i < filteredIndex.length; i++) { var index = filteredIndex[i]; var token = getS2Token({ index: index }); if ((0, _s2Utils.validS2Token)(token)) { data.push({ index: index, token: token }); } } return data; } }, { key: "updateLayerMeta", value: function updateLayerMeta(dataset, getS2Token) { var dataContainer = dataset.dataContainer; // add safe row flag var centroids = dataContainer.reduce(function (acc, entry, index) { var s2Token = getS2Token({ index: index }); if ((0, _s2Utils.validS2Token)(s2Token)) { acc.push((0, _s2Utils.getS2Center)(s2Token)); } return acc; }, [], true); var centroidsDataContainer = (0, _utils.createDataContainer)(centroids); var bounds = this.getPointsBounds(centroidsDataContainer, function (d, dc) { return [dc.valueAt(d.index, 0), dc.valueAt(d.index, 1)]; }); this.dataToFeature = { centroids: centroids }; this.updateMeta({ bounds: bounds }); } }, { key: "formatLayerData", value: function formatLayerData(datasets, oldLayerData) { if (this.config.dataId === null) { return {}; } var _datasets$this$config = datasets[this.config.dataId], gpuFilter = _datasets$this$config.gpuFilter, dataContainer = _datasets$this$config.dataContainer; var getS2Token = this.getPositionAccessor(dataContainer); var _this$updateData = this.updateData(datasets, oldLayerData), data = _this$updateData.data; var accessors = this.getAttributeAccessors({ dataContainer: dataContainer }); return _objectSpread({ data: data, getS2Token: getS2Token, getFilterValue: gpuFilter.filterValueAccessor(dataContainer)() }, accessors); } }, { key: "renderLayer", value: function renderLayer(opts) { var data = opts.data, gpuFilter = opts.gpuFilter, interactionConfig = opts.interactionConfig, mapState = opts.mapState; var defaultLayerProps = this.getDefaultDeckLayerProps(opts); var eleZoomFactor = this.getElevationZoomFactor(mapState); var zoomFactor = this.getZoomFactor(mapState); var config = this.config; var visConfig = config.visConfig; var updateTriggers = _objectSpread(_objectSpread({}, this.getVisualChannelUpdateTriggers()), {}, { getFilterValue: gpuFilter.filterValueUpdateTriggers }); return [new _geoLayers.S2Layer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), interactionConfig), data), {}, { getS2Token: function getS2Token(d) { return d.token; }, autoHighlight: visConfig.enable3d, highlightColor: _constants.HIGHLIGH_COLOR_3D, // stroke lineWidthScale: visConfig.thickness * zoomFactor * zoomFactorValue, stroked: visConfig.stroked, lineMiterLimit: 2, // Filled color filled: visConfig.filled, opacity: visConfig.opacity, wrapLongitude: false, // Elevation elevationScale: visConfig.elevationScale * eleZoomFactor, extruded: visConfig.enable3d, wireframe: visConfig.wireframe, pickable: true, updateTriggers: updateTriggers }))]; } }], [{ key: "findDefaultLayerProps", value: function findDefaultLayerProps(_ref3) { var _ref3$fields = _ref3.fields, fields = _ref3$fields === void 0 ? [] : _ref3$fields; var foundColumns = this.findDefaultColumnField(S2_TOKEN_FIELDS, fields); if (!foundColumns || !foundColumns.length) { return { props: [] }; } return { props: foundColumns.map(function (columns) { return { isVisible: true, label: 'S2', columns: columns }; }) }; } }]); }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvTGF5ZXJzIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfYmFzZUxheWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zMkxheWVySWNvbiIsIl9zMlV0aWxzIiwiX3V0aWxzIiwiX2NhbGxTdXBlciIsInQiLCJvIiwiZSIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwiciIsInAiLCJfZ2V0MiIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5Iiwiem9vbUZhY3RvclZhbHVlIiwiUzJfVE9LRU5fRklFTERTIiwiZXhwb3J0cyIsInRva2VuIiwiczJSZXF1aXJlZENvbHVtbnMiLCJTMlRva2VuQWNjZXNzb3IiLCJfcmVmIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJkZWZhdWx0RWxldmF0aW9uIiwiZGVmYXVsdExpbmVXaWR0aCIsIlMyVmlzQ29uZmlncyIsIm9wYWNpdHkiLCJjb2xvclJhbmdlIiwiZmlsbGVkIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJwcm9wZXJ0eSIsInRoaWNrbmVzcyIsInN0cm9rZUNvbG9yIiwic3Ryb2tlQ29sb3JSYW5nZSIsInNpemVSYW5nZSIsInN0cm9rZWQiLCJlbmFibGUzZCIsImVsZXZhdGlvblNjYWxlIiwiZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvciIsImZpeGVkSGVpZ2h0IiwiaGVpZ2h0UmFuZ2UiLCJ3aXJlZnJhbWUiLCJTMkdlb21ldHJ5TGF5ZXIiLCJfTGF5ZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImRhdGFDb250YWluZXIiLCJjb25maWciLCJjb2x1bW5zIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJTMkxheWVySWNvbiIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJhY2Nlc3NvciIsInNpemUiLCJjb25kaXRpb24iLCJ2aXNDb25maWciLCJmaWVsZCIsInNjYWxlIiwiZG9tYWluIiwicmFuZ2UiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJudWxsVmFsdWUiLCJoZWlnaHQiLCJ2YWx1ZSIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImRlZmF1bHRMYXllckNvbmZpZyIsImhlaWdodEZpZWxkIiwiaGVpZ2h0RG9tYWluIiwiaGVpZ2h0U2NhbGUiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwiX3JlZjIiLCJnZXRTMlRva2VuIiwiZmlsdGVyZWRJbmRleCIsImRhdGEiLCJpIiwidmFsaWRTMlRva2VuIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YXNldCIsImNlbnRyb2lkcyIsInJlZHVjZSIsImFjYyIsImVudHJ5IiwiczJUb2tlbiIsImdldFMyQ2VudGVyIiwiY2VudHJvaWRzRGF0YUNvbnRhaW5lciIsImNyZWF0ZURhdGFDb250YWluZXIiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJkYXRhVG9GZWF0dXJlIiwidXBkYXRlTWV0YSIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwib2xkTGF5ZXJEYXRhIiwiZGF0YUlkIiwiX2RhdGFzZXRzJHRoaXMkY29uZmlnIiwiZ3B1RmlsdGVyIiwiX3RoaXMkdXBkYXRlRGF0YSIsInVwZGF0ZURhdGEiLCJhY2Nlc3NvcnMiLCJnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMiLCJnZXRGaWx0ZXJWYWx1ZSIsImZpbHRlclZhbHVlQWNjZXNzb3IiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIm1hcFN0YXRlIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJlbGVab29tRmFjdG9yIiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwidXBkYXRlVHJpZ2dlcnMiLCJnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMiLCJmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIiwiUzJMYXllciIsImF1dG9IaWdobGlnaHQiLCJoaWdobGlnaHRDb2xvciIsIkhJR0hMSUdIX0NPTE9SXzNEIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lTWl0ZXJMaW1pdCIsIndyYXBMb25naXR1ZGUiLCJleHRydWRlZCIsInBpY2thYmxlIiwiZmluZERlZmF1bHRMYXllclByb3BzIiwiX3JlZjMiLCJfcmVmMyRmaWVsZHMiLCJmaWVsZHMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwibWFwIiwiaXNWaXNpYmxlIiwiTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvczItZ2VvbWV0cnktbGF5ZXIvczItZ2VvbWV0cnktbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtTMkxheWVyfSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcbmltcG9ydCB7XG4gIEhJR0hMSUdIX0NPTE9SXzNELFxuICBDSEFOTkVMX1NDQUxFUyxcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfQ09MT1JfVUlcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBMYXllciwge1xuICBMYXllckJhc2VDb25maWcsXG4gIExheWVyQmFzZUNvbmZpZ1BhcnRpYWwsXG4gIExheWVyQ29sb3JDb25maWcsXG4gIExheWVyU2l6ZUNvbmZpZyxcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyxcbiAgTGF5ZXJIZWlnaHRDb25maWdcbn0gZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlLFxuICBNZXJnZSxcbiAgUkdCQ29sb3IsXG4gIFZpc0NvbmZpZ0Jvb2xlYW4sXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ0NvbG9yU2VsZWN0LFxuICBWaXNDb25maWdOdW1iZXIsXG4gIFZpc0NvbmZpZ1JhbmdlLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCBTMkxheWVySWNvbiBmcm9tICcuL3MyLWxheWVyLWljb24nO1xuaW1wb3J0IHtnZXRTMkNlbnRlciwgdmFsaWRTMlRva2VufSBmcm9tICcuL3MyLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgY3JlYXRlRGF0YUNvbnRhaW5lcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllclZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIGNvbG9yUmFuZ2U6IFZpc0NvbmZpZ0NvbG9yUmFuZ2U7XG4gIGZpbGxlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgdGhpY2tuZXNzOiBWaXNDb25maWdOdW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBWaXNDb25maWdDb2xvclNlbGVjdDtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogVmlzQ29uZmlnQ29sb3JSYW5nZTtcbiAgc2l6ZVJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgc3Ryb2tlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgZW5hYmxlM2Q6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGVsZXZhdGlvblNjYWxlOiBWaXNDb25maWdOdW1iZXI7XG4gIGVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3I6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGhlaWdodFJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgd2lyZWZyYW1lOiBWaXNDb25maWdCb29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyQ29sdW1uc0NvbmZpZyA9IHtcbiAgdG9rZW46IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyVmlzQ29uZmlnID0ge1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIGNvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIGZpbGxlZDogYm9vbGVhbjtcbiAgdGhpY2tuZXNzOiBudW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBSR0JDb2xvcjtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgc2l6ZVJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICBzdHJva2VkOiBib29sZWFuO1xuICBlbmFibGUzZDogYm9vbGVhbjtcbiAgZWxldmF0aW9uU2NhbGU6IG51bWJlcjtcbiAgZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvcjogYm9vbGVhbjtcbiAgaGVpZ2h0UmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIHdpcmVmcmFtZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllclZpc3VhbENoYW5uZWxDb25maWcgPSBMYXllckNvbG9yQ29uZmlnICZcbiAgTGF5ZXJTaXplQ29uZmlnICZcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyAmXG4gIExheWVySGVpZ2h0Q29uZmlnO1xuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IFMyR2VvbWV0cnlMYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogUzJHZW9tZXRyeUxheWVyVmlzQ29uZmlnfVxuPiAmXG4gIFMyR2VvbWV0cnlMYXllclZpc3VhbENoYW5uZWxDb25maWc7XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllckRhdGEgPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIHRva2VuOiBhbnk7XG59O1xuXG5jb25zdCB6b29tRmFjdG9yVmFsdWUgPSA4O1xuXG5leHBvcnQgY29uc3QgUzJfVE9LRU5fRklFTERTOiB7XG4gIHRva2VuOiBbJ3MyJywgJ3MyX3Rva2VuJ107XG59ID0ge1xuICB0b2tlbjogWydzMicsICdzMl90b2tlbiddXG59O1xuXG5leHBvcnQgY29uc3QgczJSZXF1aXJlZENvbHVtbnM6IFsndG9rZW4nXSA9IFsndG9rZW4nXTtcbmV4cG9ydCBjb25zdCBTMlRva2VuQWNjZXNzb3IgPVxuICAoe3Rva2VufTogUzJHZW9tZXRyeUxheWVyQ29sdW1uc0NvbmZpZykgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICBkID0+XG4gICAgZGMudmFsdWVBdChkLmluZGV4LCB0b2tlbi5maWVsZElkeCk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0RWxldmF0aW9uID0gNTAwO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMaW5lV2lkdGggPSAxO1xuXG5leHBvcnQgY29uc3QgUzJWaXNDb25maWdzOiB7XG4gIC8vIEZpbGxlZCBjb2xvclxuICBvcGFjaXR5OiAnb3BhY2l0eSc7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgZmlsbGVkOiBWaXNDb25maWdCb29sZWFuO1xuXG4gIC8vIHN0cm9rZVxuICB0aGlja25lc3M6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcic7XG4gIHN0cm9rZUNvbG9yUmFuZ2U6ICdzdHJva2VDb2xvclJhbmdlJztcbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZSc7XG4gIHN0cm9rZWQ6ICdzdHJva2VkJztcblxuICAvLyBoZWlnaHRcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCc7XG4gIGVsZXZhdGlvblNjYWxlOiAnZWxldmF0aW9uU2NhbGUnO1xuICBlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yOiAnZW5hYmxlRWxldmF0aW9uWm9vbUZhY3Rvcic7XG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnO1xuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJztcblxuICAvLyB3aXJlZnJhbWVcbiAgd2lyZWZyYW1lOiAnd2lyZWZyYW1lJztcbn0gPSB7XG4gIC8vIEZpbGxlZCBjb2xvclxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgZmlsbGVkOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MuZmlsbGVkLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBsYWJlbDogJ0ZpbGwgQ29sb3InLFxuICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICBwcm9wZXJ0eTogJ2ZpbGxlZCdcbiAgfSxcblxuICAvLyBzdHJva2VcbiAgdGhpY2tuZXNzOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MudGhpY2tuZXNzLFxuICAgIGRlZmF1bHRWYWx1ZTogMC41XG4gIH0sXG4gIHN0cm9rZUNvbG9yOiAnc3Ryb2tlQ29sb3InLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICBzdHJva2VkOiAnc3Ryb2tlZCcsXG5cbiAgLy8gaGVpZ2h0XG4gIGVuYWJsZTNkOiAnZW5hYmxlM2QnLFxuICBlbGV2YXRpb25TY2FsZTogJ2VsZXZhdGlvblNjYWxlJyxcbiAgZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvcjogJ2VuYWJsZUVsZXZhdGlvblpvb21GYWN0b3InLFxuICBmaXhlZEhlaWdodDogJ2ZpeGVkSGVpZ2h0JyxcbiAgaGVpZ2h0UmFuZ2U6ICdlbGV2YXRpb25SYW5nZScsXG5cbiAgLy8gd2lyZWZyYW1lXG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZSdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFMyR2VvbWV0cnlMYXllciBleHRlbmRzIExheWVyIHtcbiAgZGF0YVRvRmVhdHVyZTogYW55O1xuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBTMkdlb21ldHJ5TGF5ZXJWaXNDb25maWdTZXR0aW5ncztcbiAgZGVjbGFyZSBjb25maWc6IFMyR2VvbWV0cnlMYXllckNvbmZpZztcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhTMlZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICAgICAgUzJUb2tlbkFjY2Vzc29yKHRoaXMuY29uZmlnLmNvbHVtbnMpKGRhdGFDb250YWluZXIpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogJ3MyJyB7XG4gICAgcmV0dXJuICdzMic7XG4gIH1cblxuICBnZXQgbmFtZSgpOiAnUzInIHtcbiAgICByZXR1cm4gJ1MyJztcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gczJSZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBTMkxheWVySWNvbjtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVscyA9IHN1cGVyLnZpc3VhbENoYW5uZWxzO1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZScsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0TGluZVdpZHRoJyxcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5zdHJva2VkLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRMaW5lV2lkdGhcbiAgICAgIH0sXG4gICAgICBzdHJva2VDb2xvcjoge1xuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdzdHJva2VDb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzdHJva2VDb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc3Ryb2tlQ29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICAgICAgICBrZXk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmNvbG9yLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldExpbmVDb2xvcicsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlZCxcbiAgICAgICAgbnVsbFZhbHVlOiB2aXN1YWxDaGFubmVscy5jb2xvci5udWxsVmFsdWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3IgfHwgY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaGVpZ2h0JyxcbiAgICAgICAgZmllbGQ6ICdoZWlnaHRGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnaGVpZ2h0U2NhbGUnLFxuICAgICAgICBkb21haW46ICdoZWlnaHREb21haW4nLFxuICAgICAgICByYW5nZTogJ2hlaWdodFJhbmdlJyxcbiAgICAgICAga2V5OiAnaGVpZ2h0JyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuc2l6ZSxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmVuYWJsZTNkLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdEVsZXZhdGlvblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHM6IExheWVyQmFzZUNvbmZpZ1BhcnRpYWwpIHtcbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJDb25maWcgPSBzdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPz8ge30pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0TGF5ZXJDb25maWcsXG5cbiAgICAgIC8vIGFkZCBoZWlnaHQgdmlzdWFsIGNoYW5uZWxcbiAgICAgIGhlaWdodEZpZWxkOiBudWxsLFxuICAgICAgaGVpZ2h0RG9tYWluOiBbMCwgMV0sXG4gICAgICBoZWlnaHRTY2FsZTogJ2xpbmVhcicsXG5cbiAgICAgIC8vIGFkZCBzdHJva2UgY29sb3IgdmlzdWFsIGNoYW5uZWxcbiAgICAgIHN0cm9rZUNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBzdHJva2VDb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgc3Ryb2tlQ29sb3JTY2FsZTogJ3F1YW50aWxlJyxcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyQ29uZmlnLmNvbG9yVUksXG4gICAgICAgIHN0cm9rZUNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRzID0gW119OiBLZXBsZXJUYWJsZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1ucyA9IHRoaXMuZmluZERlZmF1bHRDb2x1bW5GaWVsZChTMl9UT0tFTl9GSUVMRFMsIGZpZWxkcyk7XG4gICAgaWYgKCFmb3VuZENvbHVtbnMgfHwgIWZvdW5kQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7cHJvcHM6IFtdfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvcHM6IGZvdW5kQ29sdW1ucy5tYXAoY29sdW1ucyA9PiAoe1xuICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnUzInLFxuICAgICAgICBjb2x1bW5zXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZSh7ZmlsdGVyZWRJbmRleH06IEtlcGxlclRhYmxlLCBnZXRTMlRva2VuKSB7XG4gICAgY29uc3QgZGF0YTogUzJHZW9tZXRyeUxheWVyRGF0YVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZEluZGV4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmVkSW5kZXhbaV07XG4gICAgICBjb25zdCB0b2tlbiA9IGdldFMyVG9rZW4oe2luZGV4fSk7XG4gICAgICBpZiAodmFsaWRTMlRva2VuKHRva2VuKSkge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHRva2VuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhc2V0OiBLZXBsZXJUYWJsZSwgZ2V0UzJUb2tlbikge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXQ7XG4gICAgLy8gYWRkIHNhZmUgcm93IGZsYWdcbiAgICBjb25zdCBjZW50cm9pZHMgPSBkYXRhQ29udGFpbmVyLnJlZHVjZShcbiAgICAgIChhY2MsIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzMlRva2VuID0gZ2V0UzJUb2tlbih7aW5kZXh9KTtcbiAgICAgICAgaWYgKHZhbGlkUzJUb2tlbihzMlRva2VuKSkge1xuICAgICAgICAgIGFjYy5wdXNoKGdldFMyQ2VudGVyKHMyVG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW10sXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGNvbnN0IGNlbnRyb2lkc0RhdGFDb250YWluZXIgPSBjcmVhdGVEYXRhQ29udGFpbmVyKGNlbnRyb2lkcyk7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRQb2ludHNCb3VuZHMoY2VudHJvaWRzRGF0YUNvbnRhaW5lciwgKGQsIGRjKSA9PiBbXG4gICAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIDApLFxuICAgICAgZGMudmFsdWVBdChkLmluZGV4LCAxKVxuICAgIF0pO1xuICAgIHRoaXMuZGF0YVRvRmVhdHVyZSA9IHtjZW50cm9pZHN9O1xuICAgIHRoaXMudXBkYXRlTWV0YSh7Ym91bmRzfSk7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5kYXRhSWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3Qge2dwdUZpbHRlciwgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdO1xuICAgIGNvbnN0IGdldFMyVG9rZW4gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3Qge2RhdGF9ID0gdGhpcy51cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gdGhpcy5nZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFDb250YWluZXJ9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UzJUb2tlbixcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVBY2Nlc3NvcihkYXRhQ29udGFpbmVyKSgpLFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKG9wdHMpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ3B1RmlsdGVyLCBpbnRlcmFjdGlvbkNvbmZpZywgbWFwU3RhdGV9ID0gb3B0cztcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG5cbiAgICBjb25zdCBlbGVab29tRmFjdG9yID0gdGhpcy5nZXRFbGV2YXRpb25ab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgICBjb25zdCB6b29tRmFjdG9yID0gdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXM7XG4gICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBjb25maWc7XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzKCksXG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTMkxheWVyKHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyUHJvcHMsXG4gICAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBnZXRTMlRva2VuOiAoZDogYW55KSA9PiBkLnRva2VuLFxuXG4gICAgICAgIGF1dG9IaWdobGlnaHQ6IHZpc0NvbmZpZy5lbmFibGUzZCxcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IEhJR0hMSUdIX0NPTE9SXzNELFxuXG4gICAgICAgIC8vIHN0cm9rZVxuICAgICAgICBsaW5lV2lkdGhTY2FsZTogdmlzQ29uZmlnLnRoaWNrbmVzcyAqIHpvb21GYWN0b3IgKiB6b29tRmFjdG9yVmFsdWUsXG4gICAgICAgIHN0cm9rZWQ6IHZpc0NvbmZpZy5zdHJva2VkLFxuICAgICAgICBsaW5lTWl0ZXJMaW1pdDogMixcblxuICAgICAgICAvLyBGaWxsZWQgY29sb3JcbiAgICAgICAgZmlsbGVkOiB2aXNDb25maWcuZmlsbGVkLFxuICAgICAgICBvcGFjaXR5OiB2aXNDb25maWcub3BhY2l0eSxcbiAgICAgICAgd3JhcExvbmdpdHVkZTogZmFsc2UsXG5cbiAgICAgICAgLy8gRWxldmF0aW9uXG4gICAgICAgIGVsZXZhdGlvblNjYWxlOiB2aXNDb25maWcuZWxldmF0aW9uU2NhbGUgKiBlbGVab29tRmFjdG9yLFxuICAgICAgICBleHRydWRlZDogdmlzQ29uZmlnLmVuYWJsZTNkLFxuXG4gICAgICAgIHdpcmVmcmFtZTogdmlzQ29uZmlnLndpcmVmcmFtZSxcblxuICAgICAgICBwaWNrYWJsZTogdHJ1ZSxcblxuICAgICAgICB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBT0EsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBbUJBLElBQUFJLFlBQUEsR0FBQUQsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUE2RSxT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