UNPKG

kepler.gl

Version:

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

221 lines (218 loc) 30.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; exports.fetchGltf = fetchGltf; exports.scenegraphVisConfigs = exports.scenegraphRequiredColumns = exports.scenegraphPosAccessor = exports.scenegraphOptionalColumns = 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 _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _meshLayers = require("@deck.gl/mesh-layers"); var _core = require("@loaders.gl/core"); var _gltf = require("@loaders.gl/gltf"); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _scenegraphLayerIcon = _interopRequireDefault(require("./scenegraph-layer-icon")); var _scenegraphInfoModal = _interopRequireDefault(require("./scenegraph-info-modal")); var _constants = require("@kepler.gl/constants"); 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 var scenegraphRequiredColumns = exports.scenegraphRequiredColumns = ['lat', 'lng']; var scenegraphOptionalColumns = exports.scenegraphOptionalColumns = ['altitude']; function fetchGltf(url) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, propName = _ref.propName, layer = _ref.layer; if (propName === 'scenegraph') { return (0, _core.load)(url, _gltf.GLTFLoader, layer.getLoadOptions()).then(function (gltfWithBuffers) { return (0, _gltf.postProcessGLTF)(gltfWithBuffers); }); } return fetchGltf(url).then(function (response) { return response.json(); }); } var scenegraphPosAccessor = exports.scenegraphPosAccessor = function scenegraphPosAccessor(_ref2) { var lat = _ref2.lat, lng = _ref2.lng, altitude = _ref2.altitude; return function (dc) { return function (d) { return [dc.valueAt(d.index, lng.fieldIdx), dc.valueAt(d.index, lat.fieldIdx), altitude && altitude.fieldIdx > -1 ? dc.valueAt(d.index, altitude.fieldIdx) : 0]; }; }; }; var scenegraphVisConfigs = exports.scenegraphVisConfigs = { opacity: 'opacity', colorRange: 'colorRange', // sizeScale: 'sizeScale', angleX: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.angle), {}, { property: 'angleX', label: 'angle X' }), angleY: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.angle), {}, { property: 'angleY', label: 'angle Y' }), angleZ: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.angle), {}, { property: 'angleZ', defaultValue: 90, label: 'angle Z' }) }; var DEFAULT_MODEL = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Binary/Duck.glb'; var DEFAULT_TRANSITION = [0, 0, 0]; var DEFAULT_SCALE = [1, 1, 1]; var DEFAULT_COLOR = [255, 255, 255, 255]; var ScenegraphLayer = exports["default"] = /*#__PURE__*/function (_Layer) { function ScenegraphLayer(props) { var _this; (0, _classCallCheck2["default"])(this, ScenegraphLayer); _this = _callSuper(this, ScenegraphLayer, [props]); (0, _defineProperty2["default"])(_this, "_layerInfoModal", void 0); _this.registerVisConfig(scenegraphVisConfigs); _this.getPositionAccessor = function (dataContainer) { return scenegraphPosAccessor(_this.config.columns)(dataContainer); }; // prepare layer info modal _this._layerInfoModal = (0, _scenegraphInfoModal["default"])(); return _this; } (0, _inherits2["default"])(ScenegraphLayer, _Layer); return (0, _createClass2["default"])(ScenegraphLayer, [{ key: "type", get: function get() { return '3D'; } }, { key: "requiredLayerColumns", get: function get() { return scenegraphRequiredColumns; } }, { key: "optionalColumns", get: function get() { return scenegraphOptionalColumns; } }, { key: "columnPairs", get: function get() { return this.defaultPointColumnPairs; } }, { key: "layerIcon", get: function get() { return _scenegraphLayerIcon["default"]; } }, { key: "layerInfoModal", get: function get() { return { id: 'scenegraphInfo', template: this._layerInfoModal, modalProps: { title: 'How to use Scenegraph' } }; } }, { key: "calculateDataAttribute", value: function calculateDataAttribute(_ref3, getPosition) { var filteredIndex = _ref3.filteredIndex; var data = []; for (var i = 0; i < filteredIndex.length; i++) { var index = filteredIndex[i]; var pos = getPosition({ index: index }); // if doesn't have point lat or lng, do not add the point // deck.gl can't handle position = null if (pos.every(Number.isFinite)) { data.push({ position: pos, index: index }); } } return data; } }, { 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 _this$updateData = this.updateData(datasets, oldLayerData), data = _this$updateData.data; var getPosition = this.getPositionAccessor(dataContainer); return { data: data, getPosition: getPosition, getFilterValue: gpuFilter.filterValueAccessor(dataContainer)() }; } }, { key: "updateLayerMeta", value: function updateLayerMeta(dataset, getPosition) { var dataContainer = dataset.dataContainer; var bounds = this.getPointsBounds(dataContainer, getPosition); this.updateMeta({ bounds: bounds }); } }, { key: "renderLayer", value: function renderLayer(opts) { var data = opts.data, gpuFilter = opts.gpuFilter; var _this$config$visConfi = this.config.visConfig, _this$config$visConfi2 = _this$config$visConfi.sizeScale, sizeScale = _this$config$visConfi2 === void 0 ? 1 : _this$config$visConfi2, _this$config$visConfi3 = _this$config$visConfi.angleX, angleX = _this$config$visConfi3 === void 0 ? 0 : _this$config$visConfi3, _this$config$visConfi4 = _this$config$visConfi.angleY, angleY = _this$config$visConfi4 === void 0 ? 0 : _this$config$visConfi4, _this$config$visConfi5 = _this$config$visConfi.angleZ, angleZ = _this$config$visConfi5 === void 0 ? 90 : _this$config$visConfi5; return [new _meshLayers.ScenegraphLayer(_objectSpread(_objectSpread(_objectSpread({}, this.getDefaultDeckLayerProps(opts)), {}, { // gpu data filtering is not supported at the moment in scenegraphLayer https://github.com/visgl/deck.gl/issues/8099 extensions: [] }, data), {}, { fetch: fetchGltf, scenegraph: this.config.visConfig.scenegraph || DEFAULT_MODEL, sizeScale: sizeScale, getTranslation: DEFAULT_TRANSITION, getScale: DEFAULT_SCALE, getOrientation: [angleX, angleY, angleZ], getColor: DEFAULT_COLOR, // parameters parameters: { depthTest: true, blend: false }, // update triggers updateTriggers: { getOrientation: { angleX: angleX, angleY: angleY, angleZ: angleZ }, getPosition: this.config.columns, getFilterValue: gpuFilter.filterValueUpdateTriggers } }))]; } }]); }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVzaExheWVycyIsInJlcXVpcmUiLCJfY29yZSIsIl9nbHRmIiwiX2Jhc2VMYXllciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc2NlbmVncmFwaExheWVySWNvbiIsIl9zY2VuZWdyYXBoSW5mb01vZGFsIiwiX2NvbnN0YW50cyIsIl9jYWxsU3VwZXIiLCJ0IiwibyIsImUiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwib3duS2V5cyIsInIiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5Iiwic2NlbmVncmFwaFJlcXVpcmVkQ29sdW1ucyIsImV4cG9ydHMiLCJzY2VuZWdyYXBoT3B0aW9uYWxDb2x1bW5zIiwiZmV0Y2hHbHRmIiwidXJsIiwiX3JlZiIsInVuZGVmaW5lZCIsInByb3BOYW1lIiwibGF5ZXIiLCJsb2FkIiwiR0xURkxvYWRlciIsImdldExvYWRPcHRpb25zIiwidGhlbiIsImdsdGZXaXRoQnVmZmVycyIsInBvc3RQcm9jZXNzR0xURiIsInJlc3BvbnNlIiwianNvbiIsInNjZW5lZ3JhcGhQb3NBY2Nlc3NvciIsIl9yZWYyIiwibGF0IiwibG5nIiwiYWx0aXR1ZGUiLCJkYyIsImQiLCJ2YWx1ZUF0IiwiaW5kZXgiLCJmaWVsZElkeCIsInNjZW5lZ3JhcGhWaXNDb25maWdzIiwib3BhY2l0eSIsImNvbG9yUmFuZ2UiLCJzaXplU2NhbGUiLCJhbmdsZVgiLCJMQVlFUl9WSVNfQ09ORklHUyIsImFuZ2xlIiwicHJvcGVydHkiLCJsYWJlbCIsImFuZ2xlWSIsImFuZ2xlWiIsImRlZmF1bHRWYWx1ZSIsIkRFRkFVTFRfTU9ERUwiLCJERUZBVUxUX1RSQU5TSVRJT04iLCJERUZBVUxUX1NDQUxFIiwiREVGQVVMVF9DT0xPUiIsIlNjZW5lZ3JhcGhMYXllciIsIl9MYXllciIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiZGF0YUNvbnRhaW5lciIsImNvbmZpZyIsImNvbHVtbnMiLCJfbGF5ZXJJbmZvTW9kYWwiLCJTY2VuZWdyYXBoSW5mb01vZGFsRmFjdG9yeSIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0IiwiZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMiLCJTY2VuZWdyYXBoTGF5ZXJJY29uIiwiaWQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJ0aXRsZSIsInZhbHVlIiwiY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZSIsIl9yZWYzIiwiZ2V0UG9zaXRpb24iLCJmaWx0ZXJlZEluZGV4IiwiZGF0YSIsImkiLCJwb3MiLCJldmVyeSIsIk51bWJlciIsImlzRmluaXRlIiwicG9zaXRpb24iLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsIm9sZExheWVyRGF0YSIsImRhdGFJZCIsIl9kYXRhc2V0cyR0aGlzJGNvbmZpZyIsImdwdUZpbHRlciIsIl90aGlzJHVwZGF0ZURhdGEiLCJ1cGRhdGVEYXRhIiwiZ2V0RmlsdGVyVmFsdWUiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YXNldCIsImJvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInVwZGF0ZU1ldGEiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJfdGhpcyRjb25maWckdmlzQ29uZmkiLCJ2aXNDb25maWciLCJfdGhpcyRjb25maWckdmlzQ29uZmkyIiwiX3RoaXMkY29uZmlnJHZpc0NvbmZpMyIsIl90aGlzJGNvbmZpZyR2aXNDb25maTQiLCJfdGhpcyRjb25maWckdmlzQ29uZmk1IiwiRGVja1NjZW5lZ3JhcGhMYXllciIsImdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyIsImV4dGVuc2lvbnMiLCJmZXRjaCIsInNjZW5lZ3JhcGgiLCJnZXRUcmFuc2xhdGlvbiIsImdldFNjYWxlIiwiZ2V0T3JpZW50YXRpb24iLCJnZXRDb2xvciIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJibGVuZCIsInVwZGF0ZVRyaWdnZXJzIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsIkxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjZW5lZ3JhcGgtbGF5ZXIvc2NlbmVncmFwaC1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1NjZW5lZ3JhcGhMYXllciBhcyBEZWNrU2NlbmVncmFwaExheWVyfSBmcm9tICdAZGVjay5nbC9tZXNoLWxheWVycyc7XG5pbXBvcnQge2xvYWR9IGZyb20gJ0Bsb2FkZXJzLmdsL2NvcmUnO1xuaW1wb3J0IHtHTFRGTG9hZGVyLCBwb3N0UHJvY2Vzc0dMVEZ9IGZyb20gJ0Bsb2FkZXJzLmdsL2dsdGYnO1xuXG5pbXBvcnQgTGF5ZXIsIHtMYXllckJhc2VDb25maWd9IGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IFNjZW5lZ3JhcGhMYXllckljb24gZnJvbSAnLi9zY2VuZWdyYXBoLWxheWVyLWljb24nO1xuaW1wb3J0IFNjZW5lZ3JhcGhJbmZvTW9kYWxGYWN0b3J5IGZyb20gJy4vc2NlbmVncmFwaC1pbmZvLW1vZGFsJztcbmltcG9ydCB7TEFZRVJfVklTX0NPTkZJR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIE1lcmdlLFxuICBWaXNDb25maWdDb2xvclJhbmdlLFxuICBWaXNDb25maWdOdW1iZXIsXG4gIExheWVyQ29sdW1uXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNjZW5lZ3JhcGhMYXllclZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIGNvbG9yUmFuZ2U6IFZpc0NvbmZpZ0NvbG9yUmFuZ2U7XG4gIHNpemVTY2FsZTogVmlzQ29uZmlnTnVtYmVyO1xuICBhbmdsZVg6IFZpc0NvbmZpZ051bWJlcjtcbiAgYW5nbGVZOiBWaXNDb25maWdOdW1iZXI7XG4gIGFuZ2xlWjogVmlzQ29uZmlnTnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgU2NlbmVncmFwaExheWVyQ29sdW1uc0NvbmZpZyA9IHtcbiAgbGF0OiBMYXllckNvbHVtbjtcbiAgbG5nOiBMYXllckNvbHVtbjtcbiAgYWx0aXR1ZGU/OiBMYXllckNvbHVtbjtcbn07XG5cbmV4cG9ydCB0eXBlIFNjZW5lZ3JhcGhMYXllclZpc0NvbmZpZyA9IHtcbiAgb3BhY2l0eTogbnVtYmVyO1xuICBjb2xvclJhbmdlOiBDb2xvclJhbmdlO1xuICBzaXplU2NhbGU6IG51bWJlcjtcbiAgYW5nbGVYOiBudW1iZXI7XG4gIGFuZ2xlWTogbnVtYmVyO1xuICBhbmdsZVo6IG51bWJlcjtcbiAgc2NlbmVncmFwaDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2NlbmVncmFwaExheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IFNjZW5lZ3JhcGhMYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogU2NlbmVncmFwaExheWVyVmlzQ29uZmlnfVxuPjtcblxuZXhwb3J0IHR5cGUgU2NlbmVncmFwaExheWVyRGF0YSA9IHtwb3NpdGlvbjogbnVtYmVyW107IGluZGV4OiBudW1iZXJ9O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaFJlcXVpcmVkQ29sdW1uczogWydsYXQnLCAnbG5nJ10gPSBbJ2xhdCcsICdsbmcnXTtcbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoT3B0aW9uYWxDb2x1bW5zOiBbJ2FsdGl0dWRlJ10gPSBbJ2FsdGl0dWRlJ107XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaEdsdGYodXJsLCB7cHJvcE5hbWUsIGxheWVyfToge3Byb3BOYW1lPzogc3RyaW5nOyBsYXllcj86IGFueX0gPSB7fSkge1xuICBpZiAocHJvcE5hbWUgPT09ICdzY2VuZWdyYXBoJykge1xuICAgIHJldHVybiBsb2FkKHVybCwgR0xURkxvYWRlciwgbGF5ZXIuZ2V0TG9hZE9wdGlvbnMoKSkudGhlbihnbHRmV2l0aEJ1ZmZlcnMgPT5cbiAgICAgIHBvc3RQcm9jZXNzR0xURihnbHRmV2l0aEJ1ZmZlcnMpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmZXRjaEdsdGYodXJsKS50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSk7XG59XG5cbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoUG9zQWNjZXNzb3IgPVxuICAoe2xhdCwgbG5nLCBhbHRpdHVkZX06IFNjZW5lZ3JhcGhMYXllckNvbHVtbnNDb25maWcpID0+XG4gIChkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgZCA9PlxuICAgIFtcbiAgICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgbG5nLmZpZWxkSWR4KSxcbiAgICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgbGF0LmZpZWxkSWR4KSxcbiAgICAgIGFsdGl0dWRlICYmIGFsdGl0dWRlLmZpZWxkSWR4ID4gLTEgPyBkYy52YWx1ZUF0KGQuaW5kZXgsIGFsdGl0dWRlLmZpZWxkSWR4KSA6IDBcbiAgICBdO1xuXG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaFZpc0NvbmZpZ3M6IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknO1xuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZSc7XG4gIC8vXG4gIHNpemVTY2FsZTogJ3NpemVTY2FsZSc7XG4gIGFuZ2xlWDogVmlzQ29uZmlnTnVtYmVyO1xuICBhbmdsZVk6IFZpc0NvbmZpZ051bWJlcjtcbiAgYW5nbGVaOiBWaXNDb25maWdOdW1iZXI7XG59ID0ge1xuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgLy9cbiAgc2l6ZVNjYWxlOiAnc2l6ZVNjYWxlJyxcbiAgYW5nbGVYOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MuYW5nbGUsXG4gICAgcHJvcGVydHk6ICdhbmdsZVgnLFxuICAgIGxhYmVsOiAnYW5nbGUgWCdcbiAgfSxcbiAgYW5nbGVZOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MuYW5nbGUsXG4gICAgcHJvcGVydHk6ICdhbmdsZVknLFxuICAgIGxhYmVsOiAnYW5nbGUgWSdcbiAgfSxcbiAgYW5nbGVaOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MuYW5nbGUsXG4gICAgcHJvcGVydHk6ICdhbmdsZVonLFxuICAgIGRlZmF1bHRWYWx1ZTogOTAsXG4gICAgbGFiZWw6ICdhbmdsZSBaJ1xuICB9XG59O1xuXG5jb25zdCBERUZBVUxUX01PREVMID1cbiAgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtTW9kZWxzL21hc3Rlci8yLjAvRHVjay9nbFRGLUJpbmFyeS9EdWNrLmdsYic7XG5jb25zdCBERUZBVUxUX1RSQU5TSVRJT046IFswLCAwLCAwXSA9IFswLCAwLCAwXTtcbmNvbnN0IERFRkFVTFRfU0NBTEU6IFsxLCAxLCAxXSA9IFsxLCAxLCAxXTtcbmNvbnN0IERFRkFVTFRfQ09MT1I6IFsyNTUsIDI1NSwgMjU1LCAyNTVdID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lZ3JhcGhMYXllciBleHRlbmRzIExheWVyIHtcbiAgZGVjbGFyZSB2aXNDb25maWdTZXR0aW5nczogU2NlbmVncmFwaExheWVyVmlzQ29uZmlnU2V0dGluZ3M7XG4gIGRlY2xhcmUgY29uZmlnOiBTY2VuZWdyYXBoTGF5ZXJDb25maWc7XG5cbiAgX2xheWVySW5mb01vZGFsOiAoKSA9PiBKU1guRWxlbWVudDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcoc2NlbmVncmFwaFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICAgICAgc2NlbmVncmFwaFBvc0FjY2Vzc29yKHRoaXMuY29uZmlnLmNvbHVtbnMpKGRhdGFDb250YWluZXIpO1xuXG4gICAgLy8gcHJlcGFyZSBsYXllciBpbmZvIG1vZGFsXG4gICAgdGhpcy5fbGF5ZXJJbmZvTW9kYWwgPSBTY2VuZWdyYXBoSW5mb01vZGFsRmFjdG9yeSgpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogJzNEJyB7XG4gICAgcmV0dXJuICczRCc7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHNjZW5lZ3JhcGhSZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgb3B0aW9uYWxDb2x1bW5zKCkge1xuICAgIHJldHVybiBzY2VuZWdyYXBoT3B0aW9uYWxDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gU2NlbmVncmFwaExheWVySWNvbjtcbiAgfVxuXG4gIGdldCBsYXllckluZm9Nb2RhbCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdzY2VuZWdyYXBoSW5mbycsXG4gICAgICB0ZW1wbGF0ZTogdGhpcy5fbGF5ZXJJbmZvTW9kYWwsXG4gICAgICBtb2RhbFByb3BzOiB7XG4gICAgICAgIHRpdGxlOiAnSG93IHRvIHVzZSBTY2VuZWdyYXBoJ1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKHtmaWx0ZXJlZEluZGV4fTogS2VwbGVyVGFibGUsIGdldFBvc2l0aW9uKSB7XG4gICAgY29uc3QgZGF0YTogU2NlbmVncmFwaExheWVyRGF0YVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyZWRJbmRleFtpXTtcbiAgICAgIGNvbnN0IHBvczogbnVtYmVyW10gPSBnZXRQb3NpdGlvbih7aW5kZXh9KTtcblxuICAgICAgLy8gaWYgZG9lc24ndCBoYXZlIHBvaW50IGxhdCBvciBsbmcsIGRvIG5vdCBhZGQgdGhlIHBvaW50XG4gICAgICAvLyBkZWNrLmdsIGNhbid0IGhhbmRsZSBwb3NpdGlvbiA9IG51bGxcbiAgICAgIGlmIChwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSkge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGF0YUlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtncHVGaWx0ZXIsIGRhdGFDb250YWluZXJ9ID0gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXTtcbiAgICBjb25zdCB7ZGF0YX0gPSB0aGlzLnVwZGF0ZURhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSk7XG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVBY2Nlc3NvcihkYXRhQ29udGFpbmVyKSgpXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhc2V0OiBLZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHtkYXRhLCBncHVGaWx0ZXJ9ID0gb3B0cztcblxuICAgIGNvbnN0IHtcbiAgICAgIHZpc0NvbmZpZzoge3NpemVTY2FsZSA9IDEsIGFuZ2xlWCA9IDAsIGFuZ2xlWSA9IDAsIGFuZ2xlWiA9IDkwfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgRGVja1NjZW5lZ3JhcGhMYXllcih7XG4gICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKG9wdHMpLFxuICAgICAgICAvLyBncHUgZGF0YSBmaWx0ZXJpbmcgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50IGluIHNjZW5lZ3JhcGhMYXllciBodHRwczovL2dpdGh1Yi5jb20vdmlzZ2wvZGVjay5nbC9pc3N1ZXMvODA5OVxuICAgICAgICBleHRlbnNpb25zOiBbXSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgZmV0Y2g6IGZldGNoR2x0ZixcbiAgICAgICAgc2NlbmVncmFwaDogdGhpcy5jb25maWcudmlzQ29uZmlnLnNjZW5lZ3JhcGggfHwgREVGQVVMVF9NT0RFTCxcbiAgICAgICAgc2l6ZVNjYWxlLFxuICAgICAgICBnZXRUcmFuc2xhdGlvbjogREVGQVVMVF9UUkFOU0lUSU9OLFxuICAgICAgICBnZXRTY2FsZTogREVGQVVMVF9TQ0FMRSxcbiAgICAgICAgZ2V0T3JpZW50YXRpb246IFthbmdsZVgsIGFuZ2xlWSwgYW5nbGVaXSxcbiAgICAgICAgZ2V0Q29sb3I6IERFRkFVTFRfQ09MT1IsXG4gICAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogdHJ1ZSwgYmxlbmQ6IGZhbHNlfSxcbiAgICAgICAgLy8gdXBkYXRlIHRyaWdnZXJzXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0T3JpZW50YXRpb246IHthbmdsZVgsIGFuZ2xlWSwgYW5nbGVafSxcbiAgICAgICAgICBnZXRQb3NpdGlvbjogdGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnNcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLG9CQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxvQkFBQSxHQUFBRixzQkFB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