@nebula.gl/layers
Version:
A suite of 3D-enabled data editing layers, suitable for deck.gl
196 lines (157 loc) • 20.2 kB
JavaScript
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=
;