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
JavaScript
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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
;