UNPKG

kepler.gl

Version:

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

257 lines (248 loc) 37.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _typed = require("@deck.gl/core/typed"); var _typed2 = require("@deck.gl/mesh-layers/typed"); var _constants = _interopRequireDefault(require("@luma.gl/constants")); var _core = require("@luma.gl/core"); var _engine = require("@luma.gl/engine"); var _rasterMeshLayerWebgl = _interopRequireDefault(require("./raster-mesh-layer-webgl1.fs")); var _rasterMeshLayerWebgl2 = _interopRequireDefault(require("./raster-mesh-layer-webgl1.vs")); var _rasterMeshLayerWebgl3 = _interopRequireDefault(require("./raster-mesh-layer-webgl2.fs")); var _rasterMeshLayerWebgl4 = _interopRequireDefault(require("./raster-mesh-layer-webgl2.vs")); var _images = require("../images"); var _util = require("../util"); function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return 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 _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 function validateGeometryAttributes(attributes) { _typed.log.assert(attributes.positions || attributes.POSITION, 'RasterMeshLayer requires "postions" or "POSITION" attribute in mesh property.'); } /* * Convert mesh data into geometry * @returns geometry */ function getGeometry(data) { if (data.attributes) { validateGeometryAttributes(data.attributes); if (data instanceof _core.Geometry) { return data; } return new _core.Geometry(data); } else if (data.positions || data.POSITION) { validateGeometryAttributes(data); return new _core.Geometry({ attributes: data }); } throw Error('Invalid mesh'); } var defaultProps = _objectSpread(_objectSpread({}, _typed2.SimpleMeshLayer.defaultProps), {}, { modules: { type: 'array', value: [], compare: true }, images: { type: 'object', value: {}, compare: true }, moduleProps: { type: 'object', value: {}, compare: true } }); var RasterMeshLayer = exports["default"] = /*#__PURE__*/function (_SimpleMeshLayer) { function RasterMeshLayer() { (0, _classCallCheck2["default"])(this, RasterMeshLayer); return _callSuper(this, RasterMeshLayer, arguments); } (0, _inherits2["default"])(RasterMeshLayer, _SimpleMeshLayer); return (0, _createClass2["default"])(RasterMeshLayer, [{ key: "initializeState", value: function initializeState() { var gl = this.context.gl; var programManager = _engine.ProgramManager.getDefaultProgramManager(gl); var fsStr1 = 'fs:DECKGL_MUTATE_COLOR(inout vec4 image, in vec2 coord)'; var fsStr2 = 'fs:DECKGL_CREATE_COLOR(inout vec4 image, in vec2 coord)'; // Only initialize shader hook functions _once globally_ // Since the program manager is shared across all layers, but many layers // might be created, this solves the performance issue of always adding new // hook functions. if (!programManager._hookFunctions.includes(fsStr1)) { programManager.addShaderHook(fsStr1); } if (!programManager._hookFunctions.includes(fsStr2)) { programManager.addShaderHook(fsStr2); } // images is a mapping from keys to Texture2D objects. The keys should match // names of uniforms in shader modules this.setState({ images: {} }); _superPropGet(RasterMeshLayer, "initializeState", this, 3)([]); } }, { key: "getShaders", value: function getShaders() { var gl = this.context.gl; var _this$props$modules = this.props.modules, modules = _this$props$modules === void 0 ? [] : _this$props$modules; var webgl2 = (0, _core.isWebGL2)(gl); // Choose webgl version for module // If fs2 or fs1 keys exist, prefer them, but fall back to fs, so that // version-independent modules don't need to care var _iterator = _createForOfIteratorHelper(modules), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var module = _step.value; module.fs = webgl2 ? module.fs2 || module.fs : module.fs1 || module.fs; // Sampler type is always float for WebGL1 if (!webgl2 && module.defines) { module.defines.SAMPLER_TYPE = 'sampler2D'; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return _objectSpread(_objectSpread({}, _superPropGet(RasterMeshLayer, "getShaders", this, 3)([])), {}, { vs: webgl2 ? _rasterMeshLayerWebgl4["default"] : _rasterMeshLayerWebgl2["default"], fs: webgl2 ? _rasterMeshLayerWebgl3["default"] : _rasterMeshLayerWebgl["default"], modules: [_typed.project32, _typed.phongLighting].concat((0, _toConsumableArray2["default"])(modules)) }); } // eslint-disable-next-line complexity }, { key: "updateState", value: function updateState(params) { var props = params.props, oldProps = params.oldProps, changeFlags = params.changeFlags, context = params.context; _superPropGet(RasterMeshLayer, "updateState", this, 3)([{ props: props, oldProps: oldProps, changeFlags: changeFlags, context: context }]); var modules = props && props.modules; var oldModules = oldProps && oldProps.modules; // If the list of modules changed, need to recompile the shaders if (props.mesh !== oldProps.mesh || changeFlags.extensionsChanged || !(0, _util.modulesEqual)(modules, oldModules)) { var _this$getAttributeMan; if (this.state.model) { this.state.model["delete"](); } if (props.mesh) { this.state.model = this.getModel(props.mesh); var attributes = props.mesh.attributes || props.mesh; this.setState({ hasNormals: Boolean(attributes.NORMAL || attributes.normals) }); } (_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 || _this$getAttributeMan.invalidateAll(); } if (props && props.images) { this.updateImages({ props: props, oldProps: oldProps }); } if (this.state.model) { this.state.model.setDrawMode(this.props.wireframe ? _constants["default"].LINE_STRIP : _constants["default"].TRIANGLES); } } }, { key: "updateImages", value: function updateImages(_ref) { var props = _ref.props, oldProps = _ref.oldProps; var images = this.state.images; var gl = this.context.gl; var newImages = (0, _images.loadImages)({ gl: gl, images: images, imagesData: props.images, oldImagesData: oldProps.images }); if (newImages) { this.setState({ images: newImages }); } } }, { key: "draw", value: function draw(_ref2) { var uniforms = _ref2.uniforms; var _this$state = this.state, model = _this$state.model, images = _this$state.images; var moduleProps = this.props.moduleProps; // Render the image if (!model || !images || Object.keys(images).length === 0 || !Object.values(images).every(function (item) { return item; })) { return; } var sizeScale = this.props.sizeScale; model.setUniforms(Object.assign({}, uniforms, { sizeScale: sizeScale, flatShading: !this.state.hasNormals })).updateModuleSettings(_objectSpread(_objectSpread({}, moduleProps), images)).draw(); } }, { key: "finalizeState", value: function finalizeState() { _superPropGet(RasterMeshLayer, "finalizeState", this, 3)([this.context]); if (this.state.images) { for (var _i = 0, _Object$values = Object.values(this.state.images); _i < _Object$values.length; _i++) { var image = _Object$values[_i]; if (Array.isArray(image)) { image.map(function (x) { return x && x["delete"](); }); } else if (image) { image["delete"](); } } } } }, { key: "getModel", value: function getModel(mesh) { var gl = this.context.gl; var model = new _core.Model(gl, Object.assign({}, this.getShaders(), { id: this.props.id, geometry: getGeometry(mesh), isInstanced: false })); return model; } }]); }(_typed2.SimpleMeshLayer); RasterMeshLayer.layerName = 'RasterMeshLayer'; RasterMeshLayer.defaultProps = defaultProps; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZWQiLCJyZXF1aXJlIiwiX3R5cGVkMiIsIl9jb25zdGFudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvcmUiLCJfZW5naW5lIiwiX3Jhc3Rlck1lc2hMYXllcldlYmdsIiwiX3Jhc3Rlck1lc2hMYXllcldlYmdsMiIsIl9yYXN0ZXJNZXNoTGF5ZXJXZWJnbDMiLCJfcmFzdGVyTWVzaExheWVyV2ViZ2w0IiwiX2ltYWdlcyIsIl91dGlsIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbGlkYXRlR2VvbWV0cnlBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsImxvZyIsImFzc2VydCIsInBvc2l0aW9ucyIsIlBPU0lUSU9OIiwiZ2V0R2VvbWV0cnkiLCJkYXRhIiwiR2VvbWV0cnkiLCJFcnJvciIsImRlZmF1bHRQcm9wcyIsIlNpbXBsZU1lc2hMYXllciIsIm1vZHVsZXMiLCJ0eXBlIiwiY29tcGFyZSIsImltYWdlcyIsIm1vZHVsZVByb3BzIiwiUmFzdGVyTWVzaExheWVyIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJpbml0aWFsaXplU3RhdGUiLCJnbCIsImNvbnRleHQiLCJwcm9ncmFtTWFuYWdlciIsIlByb2dyYW1NYW5hZ2VyIiwiZ2V0RGVmYXVsdFByb2dyYW1NYW5hZ2VyIiwiZnNTdHIxIiwiZnNTdHIyIiwiX2hvb2tGdW5jdGlvbnMiLCJpbmNsdWRlcyIsImFkZFNoYWRlckhvb2siLCJzZXRTdGF0ZSIsImdldFNoYWRlcnMiLCJfdGhpcyRwcm9wcyRtb2R1bGVzIiwicHJvcHMiLCJ3ZWJnbDIiLCJpc1dlYkdMMiIsIl9pdGVyYXRvciIsIl9zdGVwIiwibW9kdWxlIiwiZnMiLCJmczIiLCJmczEiLCJkZWZpbmVzIiwiU0FNUExFUl9UWVBFIiwiZXJyIiwidnMiLCJ2c1dlYkdMMiIsInZzV2ViR0wxIiwiZnNXZWJHTDIiLCJmc1dlYkdMMSIsInByb2plY3QzMiIsInBob25nTGlnaHRpbmciLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwidXBkYXRlU3RhdGUiLCJwYXJhbXMiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwib2xkTW9kdWxlcyIsIm1lc2giLCJleHRlbnNpb25zQ2hhbmdlZCIsIm1vZHVsZXNFcXVhbCIsIl90aGlzJGdldEF0dHJpYnV0ZU1hbiIsInN0YXRlIiwibW9kZWwiLCJnZXRNb2RlbCIsImhhc05vcm1hbHMiLCJOT1JNQUwiLCJub3JtYWxzIiwiZ2V0QXR0cmlidXRlTWFuYWdlciIsImludmFsaWRhdGVBbGwiLCJ1cGRhdGVJbWFnZXMiLCJzZXREcmF3TW9kZSIsIndpcmVmcmFtZSIsIkdMIiwiTElORV9TVFJJUCIsIlRSSUFOR0xFUyIsIl9yZWYiLCJuZXdJbWFnZXMiLCJsb2FkSW1hZ2VzIiwiaW1hZ2VzRGF0YSIsIm9sZEltYWdlc0RhdGEiLCJkcmF3IiwiX3JlZjIiLCJ1bmlmb3JtcyIsIl90aGlzJHN0YXRlIiwidmFsdWVzIiwiZXZlcnkiLCJpdGVtIiwic2l6ZVNjYWxlIiwic2V0VW5pZm9ybXMiLCJhc3NpZ24iLCJmbGF0U2hhZGluZyIsInVwZGF0ZU1vZHVsZVNldHRpbmdzIiwiZmluYWxpemVTdGF0ZSIsIl9pIiwiX09iamVjdCR2YWx1ZXMiLCJpbWFnZSIsIm1hcCIsIngiLCJNb2RlbCIsImlkIiwiZ2VvbWV0cnkiLCJpc0luc3RhbmNlZCIsImxheWVyTmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLW1lc2gtbGF5ZXIvcmFzdGVyLW1lc2gtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtwcm9qZWN0MzIsIHBob25nTGlnaHRpbmcsIGxvZywgVXBkYXRlUGFyYW1ldGVyc30gZnJvbSAnQGRlY2suZ2wvY29yZS90eXBlZCc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllciwgU2ltcGxlTWVzaExheWVyUHJvcHN9IGZyb20gJ0BkZWNrLmdsL21lc2gtbGF5ZXJzL3R5cGVkJztcbmltcG9ydCBHTCBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtNb2RlbCwgR2VvbWV0cnksIGlzV2ViR0wyfSBmcm9tICdAbHVtYS5nbC9jb3JlJztcbmltcG9ydCB7UHJvZ3JhbU1hbmFnZXJ9IGZyb20gJ0BsdW1hLmdsL2VuZ2luZSc7XG5pbXBvcnQge1VuaWZvcm1zT3B0aW9uc30gZnJvbSAnQGx1bWEuZ2wvd2ViZ2wvc3JjL2NsYXNzZXMvdW5pZm9ybXMnO1xuXG5pbXBvcnQgZnNXZWJHTDEgZnJvbSAnLi9yYXN0ZXItbWVzaC1sYXllci13ZWJnbDEuZnMnO1xuaW1wb3J0IHZzV2ViR0wxIGZyb20gJy4vcmFzdGVyLW1lc2gtbGF5ZXItd2ViZ2wxLnZzJztcbmltcG9ydCBmc1dlYkdMMiBmcm9tICcuL3Jhc3Rlci1tZXNoLWxheWVyLXdlYmdsMi5mcyc7XG5pbXBvcnQgdnNXZWJHTDIgZnJvbSAnLi9yYXN0ZXItbWVzaC1sYXllci13ZWJnbDIudnMnO1xuaW1wb3J0IHtsb2FkSW1hZ2VzfSBmcm9tICcuLi9pbWFnZXMnO1xuaW1wb3J0IHR5cGUge1Jhc3RlckxheWVyQWRkZWRQcm9wcywgSW1hZ2VTdGF0ZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHttb2R1bGVzRXF1YWx9IGZyb20gJy4uL3V0aWwnO1xuXG50eXBlIE1lc2ggPSBTaW1wbGVNZXNoTGF5ZXJQcm9wc1snbWVzaCddO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUdlb21ldHJ5QXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gIGxvZy5hc3NlcnQoXG4gICAgYXR0cmlidXRlcy5wb3NpdGlvbnMgfHwgYXR0cmlidXRlcy5QT1NJVElPTixcbiAgICAnUmFzdGVyTWVzaExheWVyIHJlcXVpcmVzIFwicG9zdGlvbnNcIiBvciBcIlBPU0lUSU9OXCIgYXR0cmlidXRlIGluIG1lc2ggcHJvcGVydHkuJ1xuICApO1xufVxuXG4vKlxuICogQ29udmVydCBtZXNoIGRhdGEgaW50byBnZW9tZXRyeVxuICogQHJldHVybnMgZ2VvbWV0cnlcbiAqL1xuZnVuY3Rpb24gZ2V0R2VvbWV0cnkoZGF0YSk6IEdlb21ldHJ5IHtcbiAgaWYgKGRhdGEuYXR0cmlidXRlcykge1xuICAgIHZhbGlkYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcyk7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBHZW9tZXRyeSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgR2VvbWV0cnkoZGF0YSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5wb3NpdGlvbnMgfHwgZGF0YS5QT1NJVElPTikge1xuICAgIHZhbGlkYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKGRhdGEpO1xuICAgIHJldHVybiBuZXcgR2VvbWV0cnkoe1xuICAgICAgYXR0cmlidXRlczogZGF0YVxuICAgIH0pO1xuICB9XG4gIHRocm93IEVycm9yKCdJbnZhbGlkIG1lc2gnKTtcbn1cblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAuLi5TaW1wbGVNZXNoTGF5ZXIuZGVmYXVsdFByb3BzLFxuICBtb2R1bGVzOiB7dHlwZTogJ2FycmF5JywgdmFsdWU6IFtdLCBjb21wYXJlOiB0cnVlfSxcbiAgaW1hZ2VzOiB7dHlwZTogJ29iamVjdCcsIHZhbHVlOiB7fSwgY29tcGFyZTogdHJ1ZX0sXG4gIG1vZHVsZVByb3BzOiB7dHlwZTogJ29iamVjdCcsIHZhbHVlOiB7fSwgY29tcGFyZTogdHJ1ZX1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhc3Rlck1lc2hMYXllciBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIFJhc3RlckxheWVyQWRkZWRQcm9wcz4ge1xuICBkZWNsYXJlIHN0YXRlOiBTaW1wbGVNZXNoTGF5ZXI8UmFzdGVyTGF5ZXJBZGRlZFByb3BzPlsnc3RhdGUnXSAmIHtcbiAgICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHtnbH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgcHJvZ3JhbU1hbmFnZXIgPSBQcm9ncmFtTWFuYWdlci5nZXREZWZhdWx0UHJvZ3JhbU1hbmFnZXIoZ2wpO1xuXG4gICAgY29uc3QgZnNTdHIxID0gJ2ZzOkRFQ0tHTF9NVVRBVEVfQ09MT1IoaW5vdXQgdmVjNCBpbWFnZSwgaW4gdmVjMiBjb29yZCknO1xuICAgIGNvbnN0IGZzU3RyMiA9ICdmczpERUNLR0xfQ1JFQVRFX0NPTE9SKGlub3V0IHZlYzQgaW1hZ2UsIGluIHZlYzIgY29vcmQpJztcblxuICAgIC8vIE9ubHkgaW5pdGlhbGl6ZSBzaGFkZXIgaG9vayBmdW5jdGlvbnMgX29uY2UgZ2xvYmFsbHlfXG4gICAgLy8gU2luY2UgdGhlIHByb2dyYW0gbWFuYWdlciBpcyBzaGFyZWQgYWNyb3NzIGFsbCBsYXllcnMsIGJ1dCBtYW55IGxheWVyc1xuICAgIC8vIG1pZ2h0IGJlIGNyZWF0ZWQsIHRoaXMgc29sdmVzIHRoZSBwZXJmb3JtYW5jZSBpc3N1ZSBvZiBhbHdheXMgYWRkaW5nIG5ld1xuICAgIC8vIGhvb2sgZnVuY3Rpb25zLlxuICAgIGlmICghcHJvZ3JhbU1hbmFnZXIuX2hvb2tGdW5jdGlvbnMuaW5jbHVkZXMoZnNTdHIxKSkge1xuICAgICAgcHJvZ3JhbU1hbmFnZXIuYWRkU2hhZGVySG9vayhmc1N0cjEpO1xuICAgIH1cbiAgICBpZiAoIXByb2dyYW1NYW5hZ2VyLl9ob29rRnVuY3Rpb25zLmluY2x1ZGVzKGZzU3RyMikpIHtcbiAgICAgIHByb2dyYW1NYW5hZ2VyLmFkZFNoYWRlckhvb2soZnNTdHIyKTtcbiAgICB9XG5cbiAgICAvLyBpbWFnZXMgaXMgYSBtYXBwaW5nIGZyb20ga2V5cyB0byBUZXh0dXJlMkQgb2JqZWN0cy4gVGhlIGtleXMgc2hvdWxkIG1hdGNoXG4gICAgLy8gbmFtZXMgb2YgdW5pZm9ybXMgaW4gc2hhZGVyIG1vZHVsZXNcbiAgICB0aGlzLnNldFN0YXRlKHtpbWFnZXM6IHt9fSk7XG5cbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoKTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICBjb25zdCB7Z2x9ID0gdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IHttb2R1bGVzID0gW119ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB3ZWJnbDIgPSBpc1dlYkdMMihnbCk7XG5cbiAgICAvLyBDaG9vc2Ugd2ViZ2wgdmVyc2lvbiBmb3IgbW9kdWxlXG4gICAgLy8gSWYgZnMyIG9yIGZzMSBrZXlzIGV4aXN0LCBwcmVmZXIgdGhlbSwgYnV0IGZhbGwgYmFjayB0byBmcywgc28gdGhhdFxuICAgIC8vIHZlcnNpb24taW5kZXBlbmRlbnQgbW9kdWxlcyBkb24ndCBuZWVkIHRvIGNhcmVcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICBtb2R1bGUuZnMgPSB3ZWJnbDIgPyBtb2R1bGUuZnMyIHx8IG1vZHVsZS5mcyA6IG1vZHVsZS5mczEgfHwgbW9kdWxlLmZzO1xuXG4gICAgICAvLyBTYW1wbGVyIHR5cGUgaXMgYWx3YXlzIGZsb2F0IGZvciBXZWJHTDFcbiAgICAgIGlmICghd2ViZ2wyICYmIG1vZHVsZS5kZWZpbmVzKSB7XG4gICAgICAgIG1vZHVsZS5kZWZpbmVzLlNBTVBMRVJfVFlQRSA9ICdzYW1wbGVyMkQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICB2czogd2ViZ2wyID8gdnNXZWJHTDIgOiB2c1dlYkdMMSxcbiAgICAgIGZzOiB3ZWJnbDIgPyBmc1dlYkdMMiA6IGZzV2ViR0wxLFxuICAgICAgbW9kdWxlczogW3Byb2plY3QzMiwgcGhvbmdMaWdodGluZywgLi4ubW9kdWxlc11cbiAgICB9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgdXBkYXRlU3RhdGUocGFyYW1zOiBVcGRhdGVQYXJhbWV0ZXJzPFNpbXBsZU1lc2hMYXllcjxhbnksIFJhc3RlckxheWVyQWRkZWRQcm9wcz4+KTogdm9pZCB7XG4gICAgY29uc3Qge3Byb3BzLCBvbGRQcm9wcywgY2hhbmdlRmxhZ3MsIGNvbnRleHR9ID0gcGFyYW1zO1xuICAgIHN1cGVyLnVwZGF0ZVN0YXRlKHtwcm9wcywgb2xkUHJvcHMsIGNoYW5nZUZsYWdzLCBjb250ZXh0fSk7XG5cbiAgICBjb25zdCBtb2R1bGVzID0gcHJvcHMgJiYgcHJvcHMubW9kdWxlcztcbiAgICBjb25zdCBvbGRNb2R1bGVzID0gb2xkUHJvcHMgJiYgb2xkUHJvcHMubW9kdWxlcztcblxuICAgIC8vIElmIHRoZSBsaXN0IG9mIG1vZHVsZXMgY2hhbmdlZCwgbmVlZCB0byByZWNvbXBpbGUgdGhlIHNoYWRlcnNcbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZXNoICE9PSBvbGRQcm9wcy5tZXNoIHx8XG4gICAgICBjaGFuZ2VGbGFncy5leHRlbnNpb25zQ2hhbmdlZCB8fFxuICAgICAgIW1vZHVsZXNFcXVhbChtb2R1bGVzLCBvbGRNb2R1bGVzKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUubW9kZWwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb2RlbC5kZWxldGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5tZXNoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUubW9kZWwgPSB0aGlzLmdldE1vZGVsKHByb3BzLm1lc2ggYXMgTWVzaCk7XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IChwcm9wcy5tZXNoIGFzIGFueSkuYXR0cmlidXRlcyB8fCBwcm9wcy5tZXNoO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBoYXNOb3JtYWxzOiBCb29sZWFuKGF0dHJpYnV0ZXMuTk9STUFMIHx8IGF0dHJpYnV0ZXMubm9ybWFscylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZU1hbmFnZXIoKT8uaW52YWxpZGF0ZUFsbCgpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAmJiBwcm9wcy5pbWFnZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlSW1hZ2VzKHtwcm9wcywgb2xkUHJvcHN9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5tb2RlbCkge1xuICAgICAgdGhpcy5zdGF0ZS5tb2RlbC5zZXREcmF3TW9kZSh0aGlzLnByb3BzLndpcmVmcmFtZSA/IEdMLkxJTkVfU1RSSVAgOiBHTC5UUklBTkdMRVMpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUltYWdlcyh7XG4gICAgcHJvcHMsXG4gICAgb2xkUHJvcHNcbiAgfToge1xuICAgIHByb3BzOiBSYXN0ZXJMYXllckFkZGVkUHJvcHM7XG4gICAgb2xkUHJvcHM6IFJhc3RlckxheWVyQWRkZWRQcm9wcztcbiAgfSk6IHZvaWQge1xuICAgIGNvbnN0IHtpbWFnZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7Z2x9ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgY29uc3QgbmV3SW1hZ2VzID0gbG9hZEltYWdlcyh7XG4gICAgICBnbCxcbiAgICAgIGltYWdlcyxcbiAgICAgIGltYWdlc0RhdGE6IHByb3BzLmltYWdlcyxcbiAgICAgIG9sZEltYWdlc0RhdGE6IG9sZFByb3BzLmltYWdlc1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0ltYWdlcykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VzOiBuZXdJbWFnZXN9KTtcbiAgICB9XG4gIH1cblxuICBkcmF3KHt1bmlmb3Jtc306IFVuaWZvcm1zT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHttb2RlbCwgaW1hZ2VzfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qge21vZHVsZVByb3BzfSA9IHRoaXMucHJvcHM7XG5cbiAgICAvLyBSZW5kZXIgdGhlIGltYWdlXG4gICAgaWYgKFxuICAgICAgIW1vZGVsIHx8XG4gICAgICAhaW1hZ2VzIHx8XG4gICAgICBPYmplY3Qua2V5cyhpbWFnZXMpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIU9iamVjdC52YWx1ZXMoaW1hZ2VzKS5ldmVyeShpdGVtID0+IGl0ZW0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge3NpemVTY2FsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgbW9kZWxcbiAgICAgIC5zZXRVbmlmb3JtcyhcbiAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgdW5pZm9ybXMsIHtcbiAgICAgICAgICBzaXplU2NhbGUsXG4gICAgICAgICAgZmxhdFNoYWRpbmc6ICF0aGlzLnN0YXRlLmhhc05vcm1hbHNcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC51cGRhdGVNb2R1bGVTZXR0aW5ncyh7XG4gICAgICAgIC4uLm1vZHVsZVByb3BzLFxuICAgICAgICAuLi5pbWFnZXNcbiAgICAgIH0pXG4gICAgICAuZHJhdygpO1xuICB9XG5cbiAgZmluYWxpemVTdGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5maW5hbGl6ZVN0YXRlKHRoaXMuY29udGV4dCk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5pbWFnZXMpIHtcbiAgICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnN0YXRlLmltYWdlcykpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW1hZ2UpKSB7XG4gICAgICAgICAgaW1hZ2UubWFwKHggPT4geCAmJiB4LmRlbGV0ZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgIGltYWdlLmRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1vZGVsKG1lc2g6IE1lc2gpOiBNb2RlbCB7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcblxuICAgIGNvbnN0IG1vZGVsID0gbmV3IE1vZGVsKFxuICAgICAgZ2wsXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldFNoYWRlcnMoKSwge1xuICAgICAgICBpZDogdGhpcy5wcm9wcy5pZCxcbiAgICAgICAgZ2VvbWV0cnk6IGdldEdlb21ldHJ5KG1lc2gpLFxuICAgICAgICBpc0luc3RhbmNlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxufVxuXG5SYXN0ZXJNZXNoTGF5ZXIubGF5ZXJOYW1lID0gJ1Jhc3Rlck1lc2hMYXllcic7XG5SYXN0ZXJNZXNoTGF5ZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxxQkFBQSxHQUFBSCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU8sc0JBQUEsR0FBQUosc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFRLHNCQUFBLEdBQUFMLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUyxzQkFBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsT0FBQSxHQUFBVixPQUFBO0FBRUEsSUFBQVcsS0FBQSxHQUFBWCxPQUFBO0FBQXFDLFNBQUFZLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFBLFdBQUFBLEVBQUFELENB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