UNPKG

@nebula.gl/layers

Version:

A suite of 3D-enabled data editing layers, suitable for deck.gl

196 lines (157 loc) 20.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _layers = require("@deck.gl/layers"); var _constants = _interopRequireDefault(require("@luma.gl/constants")); var _core = require("@luma.gl/core"); var _outline = _interopRequireDefault(require("../../shaderlib/outline/outline")); var _constants2 = require("../../constants"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // TODO - this should be built into assembleShaders function injectShaderCode(_ref) { var source = _ref.source, _ref$code = _ref.code, code = _ref$code === void 0 ? '' : _ref$code; var INJECT_CODE = /}[^{}]*$/; return source.replace(INJECT_CODE, code.concat('\n}\n')); } var VS_CODE = " outline_setUV(gl_Position);\n outline_setZLevel(instanceZLevel);\n"; var FS_CODE = " gl_FragColor = outline_filterColor(gl_FragColor);\n"; var defaultProps = { getZLevel: function getZLevel() { return 0; } }; var PathOutlineLayer = /*#__PURE__*/function (_PathLayer) { _inherits(PathOutlineLayer, _PathLayer); var _super = _createSuper(PathOutlineLayer); function PathOutlineLayer() { _classCallCheck(this, PathOutlineLayer); return _super.apply(this, arguments); } _createClass(PathOutlineLayer, [{ key: "getShaders", // Override getShaders to inject the outline module value: function getShaders() { var shaders = _get(_getPrototypeOf(PathOutlineLayer.prototype), "getShaders", this).call(this); return Object.assign({}, shaders, { modules: shaders.modules.concat([_outline["default"]]), vs: injectShaderCode({ source: shaders.vs, code: VS_CODE }), fs: injectShaderCode({ source: shaders.fs, code: FS_CODE }) }); } }, { key: "initializeState", value: function initializeState(context) { _get(_getPrototypeOf(PathOutlineLayer.prototype), "initializeState", this).call(this, context); // Create an outline "shadow" map // TODO - we should create a single outlineMap for all layers this.setState({ outlineFramebuffer: new _core.Framebuffer(context.gl), dummyTexture: new _core.Texture2D(context.gl) }); // Create an attribute manager this.state.attributeManager.addInstanced({ instanceZLevel: { size: 1, type: _constants["default"].UNSIGNED_BYTE, accessor: 'getZLevel' } }); } // Override draw to add render module }, { key: "draw", value: function draw(_ref2) { var _ref2$moduleParameter = _ref2.moduleParameters, moduleParameters = _ref2$moduleParameter === void 0 ? {} : _ref2$moduleParameter, parameters = _ref2.parameters, uniforms = _ref2.uniforms, context = _ref2.context; // Need to calculate same uniforms as base layer var _this$props = this.props, jointRounded = _this$props.jointRounded, capRounded = _this$props.capRounded, billboard = _this$props.billboard, miterLimit = _this$props.miterLimit, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels; uniforms = Object.assign({}, uniforms, { jointType: Number(jointRounded), capType: Number(capRounded), billboard: billboard, widthUnits: _constants2.UNIT[widthUnits], widthScale: widthScale, miterLimit: miterLimit, widthMinPixels: widthMinPixels, widthMaxPixels: widthMaxPixels }); // Render the outline shadowmap (based on segment z orders) var _this$state = this.state, outlineFramebuffer = _this$state.outlineFramebuffer, dummyTexture = _this$state.dummyTexture; outlineFramebuffer.resize(); outlineFramebuffer.clear({ color: true, depth: true }); this.state.model.updateModuleSettings({ outlineEnabled: true, outlineRenderShadowmap: true, outlineShadowmap: dummyTexture }); this.state.model.draw({ uniforms: Object.assign({}, uniforms, { jointType: 0, widthScale: this.props.widthScale * 1.3 }), parameters: { depthTest: false, // Biggest value needs to go into buffer blendEquation: _constants["default"].MAX }, framebuffer: outlineFramebuffer }); // Now use the outline shadowmap to render the lines (with outlines) this.state.model.updateModuleSettings({ outlineEnabled: true, outlineRenderShadowmap: false, outlineShadowmap: outlineFramebuffer }); this.state.model.draw({ uniforms: Object.assign({}, uniforms, { jointType: Number(jointRounded), capType: Number(capRounded), widthScale: this.props.widthScale }), parameters: { depthTest: false } }); } }]); return PathOutlineLayer; }(_layers.PathLayer); exports["default"] = PathOutlineLayer; _defineProperty(PathOutlineLayer, "layerName", 'PathOutlineLayer'); _defineProperty(PathOutlineLayer, "defaultProps", defaultProps); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcGF0aC1vdXRsaW5lLWxheWVyL3BhdGgtb3V0bGluZS1sYXllci50cyJdLCJuYW1lcyI6WyJpbmplY3RTaGFkZXJDb2RlIiwic291cmNlIiwiY29kZSIsIklOSkVDVF9DT0RFIiwicmVwbGFjZSIsImNvbmNhdCIsIlZTX0NPREUiLCJGU19DT0RFIiwiZGVmYXVsdFByb3BzIiwiZ2V0WkxldmVsIiwiUGF0aE91dGxpbmVMYXllciIsInNoYWRlcnMiLCJPYmplY3QiLCJhc3NpZ24iLCJtb2R1bGVzIiwib3V0bGluZSIsInZzIiwiZnMiLCJjb250ZXh0Iiwic2V0U3RhdGUiLCJvdXRsaW5lRnJhbWVidWZmZXIiLCJGcmFtZWJ1ZmZlciIsImdsIiwiZHVtbXlUZXh0dXJlIiwiVGV4dHVyZTJEIiwic3RhdGUiLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYWRkSW5zdGFuY2VkIiwiaW5zdGFuY2VaTGV2ZWwiLCJzaXplIiwidHlwZSIsIkdMIiwiVU5TSUdORURfQllURSIsImFjY2Vzc29yIiwibW9kdWxlUGFyYW1ldGVycyIsInBhcmFtZXRlcnMiLCJ1bmlmb3JtcyIsInByb3BzIiwiam9pbnRSb3VuZGVkIiwiY2FwUm91bmRlZCIsImJpbGxib2FyZCIsIm1pdGVyTGltaXQiLCJ3aWR0aFVuaXRzIiwid2lkdGhTY2FsZSIsIndpZHRoTWluUGl4ZWxzIiwid2lkdGhNYXhQaXhlbHMiLCJqb2ludFR5cGUiLCJOdW1iZXIiLCJjYXBUeXBlIiwiVU5JVCIsInJlc2l6ZSIsImNsZWFyIiwiY29sb3IiLCJkZXB0aCIsIm1vZGVsIiwidXBkYXRlTW9kdWxlU2V0dGluZ3MiLCJvdXRsaW5lRW5hYmxlZCIsIm91dGxpbmVSZW5kZXJTaGFkb3dtYXAiLCJvdXRsaW5lU2hhZG93bWFwIiwiZHJhdyIsImRlcHRoVGVzdCIsImJsZW5kRXF1YXRpb24iLCJNQVgiLCJmcmFtZWJ1ZmZlciIsIlBhdGhMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFB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S0FERDtBQUVWO0FBQ0FDLFVBQUFBLGFBQWEsRUFBRTlCLHNCQUFHK0I7QUFIUixTQUxRO0FBVXBCQyxRQUFBQSxXQUFXLEVBQUUzQztBQVZPLE9BQXRCLEVBbkM2RCxDQWdEN0Q7O0FBQ0EsV0FBS0ssS0FBTCxDQUFXNkIsS0FBWCxDQUFpQkMsb0JBQWpCLENBQXNDO0FBQ3BDQyxRQUFBQSxjQUFjLEVBQUUsSUFEb0I7QUFFcENDLFFBQUFBLHNCQUFzQixFQUFFLEtBRlk7QUFHcENDLFFBQUFBLGdCQUFnQixFQUFFdEM7QUFIa0IsT0FBdEM7QUFLQSxXQUFLSyxLQUFMLENBQVc2QixLQUFYLENBQWlCSyxJQUFqQixDQUFzQjtBQUNwQnZCLFFBQUFBLFFBQVEsRUFBRXhCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0J1QixRQUFsQixFQUE0QjtBQUNwQ1UsVUFBQUEsU0FBUyxFQUFFQyxNQUFNLENBQUNULFlBQUQsQ0FEbUI7QUFFcENVLFVBQUFBLE9BQU8sRUFBRUQsTUFBTSxDQUFDUixVQUFELENBRnFCO0FBR3BDSSxVQUFBQSxVQUFVLEVBQUUsS0FBS04sS0FBTCxDQUFXTTtBQUhhLFNBQTVCLENBRFU7QUFNcEJSLFFBQUFBLFVBQVUsRUFBRTtBQUNWeUIsVUFBQUEsU0FBUyxFQUFFO0FBREQ7QUFOUSxPQUF0QjtBQVVEOzs7O0VBbkdPSSxpQjs7OztnQkFIV3RELGdCLGVBSUEsa0I7O2dCQUpBQSxnQixrQkFLR0YsWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGhMYXllciB9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQgeyBQYXRoTGF5ZXJQcm9wcyB9IGZyb20gJ0BkZWNrLmdsL2xheWVycy9wYXRoLWxheWVyL3BhdGgtbGF5ZXInO1xuaW1wb3J0IEdMIGZyb20gJ0BsdW1hLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGcmFtZWJ1ZmZlciwgVGV4dHVyZTJEIH0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5pbXBvcnQgb3V0bGluZSBmcm9tICcuLi8uLi9zaGFkZXJsaWIvb3V0bGluZS9vdXRsaW5lJztcbmltcG9ydCB7IFVOSVQgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG4vLyBUT0RPIC0gdGhpcyBzaG91bGQgYmUgYnVpbHQgaW50byBhc3NlbWJsZVNoYWRlcnNcbmZ1bmN0aW9uIGluamVjdFNoYWRlckNvZGUoeyBzb3VyY2UsIGNvZGUgPSAnJyB9KSB7XG4gIGNvbnN0IElOSkVDVF9DT0RFID0gL31bXnt9XSokLztcbiAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKElOSkVDVF9DT0RFLCBjb2RlLmNvbmNhdCgnXFxufVxcbicpKTtcbn1cblxuY29uc3QgVlNfQ09ERSA9IGBcXFxuICBvdXRsaW5lX3NldFVWKGdsX1Bvc2l0aW9uKTtcbiAgb3V0bGluZV9zZXRaTGV2ZWwoaW5zdGFuY2VaTGV2ZWwpO1xuYDtcblxuY29uc3QgRlNfQ09ERSA9IGBcXFxuICBnbF9GcmFnQ29sb3IgPSBvdXRsaW5lX2ZpbHRlckNvbG9yKGdsX0ZyYWdDb2xvcik7XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGhPdXRsaW5lTGF5ZXJQcm9wczxEPiBleHRlbmRzIFBhdGhMYXllclByb3BzPEQ+IHtcbiAgZGFzaEp1c3RpZmllZD86IGJvb2xlYW47XG4gIGdldERhc2hBcnJheT86IFtudW1iZXIsIG51bWJlcl0gfCAoKGQ6IEQpID0+IFtudW1iZXIsIG51bWJlcl0gfCBudWxsKTtcbiAgZ2V0WkxldmVsPzogKGQ6IEQsIGluZGV4OiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdFByb3BzOiBQYXRoT3V0bGluZUxheWVyUHJvcHM8YW55PiA9IHtcbiAgZ2V0WkxldmVsOiAoKSA9PiAwLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGF0aE91dGxpbmVMYXllcjxcbiAgRCxcbiAgUCBleHRlbmRzIFBhdGhPdXRsaW5lTGF5ZXJQcm9wczxEPiA9IFBhdGhPdXRsaW5lTGF5ZXJQcm9wczxEPlxuPiBleHRlbmRzIFBhdGhMYXllcjxELCBQPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnUGF0aE91dGxpbmVMYXllcic7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgLy8gT3ZlcnJpZGUgZ2V0U2hhZGVycyB0byBpbmplY3QgdGhlIG91dGxpbmUgbW9kdWxlXG4gIGdldFNoYWRlcnMoKSB7XG4gICAgY29uc3Qgc2hhZGVycyA9IHN1cGVyLmdldFNoYWRlcnMoKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2hhZGVycywge1xuICAgICAgbW9kdWxlczogc2hhZGVycy5tb2R1bGVzLmNvbmNhdChbb3V0bGluZV0pLFxuICAgICAgdnM6IGluamVjdFNoYWRlckNvZGUoeyBzb3VyY2U6IHNoYWRlcnMudnMsIGNvZGU6IFZTX0NPREUgfSksXG4gICAgICBmczogaW5qZWN0U2hhZGVyQ29kZSh7IHNvdXJjZTogc2hhZGVycy5mcywgY29kZTogRlNfQ09ERSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZShjb250ZXh0OiBhbnkpIHtcbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoY29udGV4dCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gb3V0bGluZSBcInNoYWRvd1wiIG1hcFxuICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgY3JlYXRlIGEgc2luZ2xlIG91dGxpbmVNYXAgZm9yIGFsbCBsYXllcnNcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG91dGxpbmVGcmFtZWJ1ZmZlcjogbmV3IEZyYW1lYnVmZmVyKGNvbnRleHQuZ2wpLFxuICAgICAgZHVtbXlUZXh0dXJlOiBuZXcgVGV4dHVyZTJEKGNvbnRleHQuZ2wpLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGF0dHJpYnV0ZSBtYW5hZ2VyXG4gICAgdGhpcy5zdGF0ZS5hdHRyaWJ1dGVNYW5hZ2VyLmFkZEluc3RhbmNlZCh7XG4gICAgICBpbnN0YW5jZVpMZXZlbDoge1xuICAgICAgICBzaXplOiAxLFxuICAgICAgICB0eXBlOiBHTC5VTlNJR05FRF9CWVRFLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldFpMZXZlbCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgZHJhdyB0byBhZGQgcmVuZGVyIG1vZHVsZVxuICBkcmF3KHsgbW9kdWxlUGFyYW1ldGVycyA9IHt9LCBwYXJhbWV0ZXJzLCB1bmlmb3JtcywgY29udGV4dCB9KSB7XG4gICAgLy8gTmVlZCB0byBjYWxjdWxhdGUgc2FtZSB1bmlmb3JtcyBhcyBiYXNlIGxheWVyXG4gICAgY29uc3Qge1xuICAgICAgam9pbnRSb3VuZGVkLFxuICAgICAgY2FwUm91bmRlZCxcbiAgICAgIGJpbGxib2FyZCxcbiAgICAgIG1pdGVyTGltaXQsXG4gICAgICB3aWR0aFVuaXRzLFxuICAgICAgd2lkdGhTY2FsZSxcbiAgICAgIHdpZHRoTWluUGl4ZWxzLFxuICAgICAgd2lkdGhNYXhQaXhlbHMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHVuaWZvcm1zLCB7XG4gICAgICBqb2ludFR5cGU6IE51bWJlcihqb2ludFJvdW5kZWQpLFxuICAgICAgY2FwVHlwZTogTnVtYmVyKGNhcFJvdW5kZWQpLFxuICAgICAgYmlsbGJvYXJkLFxuICAgICAgd2lkdGhVbml0czogVU5JVFt3aWR0aFVuaXRzXSxcbiAgICAgIHdpZHRoU2NhbGUsXG4gICAgICBtaXRlckxpbWl0LFxuICAgICAgd2lkdGhNaW5QaXhlbHMsXG4gICAgICB3aWR0aE1heFBpeGVscyxcbiAgICB9KTtcblxuICAgIC8vIFJlbmRlciB0aGUgb3V0bGluZSBzaGFkb3dtYXAgKGJhc2VkIG9uIHNlZ21lbnQgeiBvcmRlcnMpXG4gICAgY29uc3QgeyBvdXRsaW5lRnJhbWVidWZmZXIsIGR1bW15VGV4dHVyZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBvdXRsaW5lRnJhbWVidWZmZXIucmVzaXplKCk7XG4gICAgb3V0bGluZUZyYW1lYnVmZmVyLmNsZWFyKHsgY29sb3I6IHRydWUsIGRlcHRoOiB0cnVlIH0pO1xuXG4gICAgdGhpcy5zdGF0ZS5tb2RlbC51cGRhdGVNb2R1bGVTZXR0aW5ncyh7XG4gICAgICBvdXRsaW5lRW5hYmxlZDogdHJ1ZSxcbiAgICAgIG91dGxpbmVSZW5kZXJTaGFkb3dtYXA6IHRydWUsXG4gICAgICBvdXRsaW5lU2hhZG93bWFwOiBkdW1teVRleHR1cmUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXRlLm1vZGVsLmRyYXcoe1xuICAgICAgdW5pZm9ybXM6IE9iamVjdC5hc3NpZ24oe30sIHVuaWZvcm1zLCB7XG4gICAgICAgIGpvaW50VHlwZTogMCxcbiAgICAgICAgd2lkdGhTY2FsZTogdGhpcy5wcm9wcy53aWR0aFNjYWxlICogMS4zLFxuICAgICAgfSksXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgIC8vIEJpZ2dlc3QgdmFsdWUgbmVlZHMgdG8gZ28gaW50byBidWZmZXJcbiAgICAgICAgYmxlbmRFcXVhdGlvbjogR0wuTUFYLFxuICAgICAgfSxcbiAgICAgIGZyYW1lYnVmZmVyOiBvdXRsaW5lRnJhbWVidWZmZXIsXG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdXNlIHRoZSBvdXRsaW5lIHNoYWRvd21hcCB0byByZW5kZXIgdGhlIGxpbmVzICh3aXRoIG91dGxpbmVzKVxuICAgIHRoaXMuc3RhdGUubW9kZWwudXBkYXRlTW9kdWxlU2V0dGluZ3Moe1xuICAgICAgb3V0bGluZUVuYWJsZWQ6IHRydWUsXG4gICAgICBvdXRsaW5lUmVuZGVyU2hhZG93bWFwOiBmYWxzZSxcbiAgICAgIG91dGxpbmVTaGFkb3dtYXA6IG91dGxpbmVGcmFtZWJ1ZmZlcixcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlLm1vZGVsLmRyYXcoe1xuICAgICAgdW5pZm9ybXM6IE9iamVjdC5hc3NpZ24oe30sIHVuaWZvcm1zLCB7XG4gICAgICAgIGpvaW50VHlwZTogTnVtYmVyKGpvaW50Um91bmRlZCksXG4gICAgICAgIGNhcFR5cGU6IE51bWJlcihjYXBSb3VuZGVkKSxcbiAgICAgICAgd2lkdGhTY2FsZTogdGhpcy5wcm9wcy53aWR0aFNjYWxlLFxuICAgICAgfSksXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=