UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

407 lines (326 loc) 33.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.State = exports.Catalog = exports.CatalogElement = exports.Scene = exports.DefaultLayers = exports.Layer = exports.Item = exports.Area = exports.Hole = exports.Line = exports.Vertex = exports.ElementsSet = exports.DefaultGuides = exports.Guide = undefined; var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _immutable = require('immutable'); var _constants = require('./constants'); var _snap = require('./utils/snap'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var safeLoadMapList = function safeLoadMapList(mapList, Model, defaultMap) { return mapList ? new _immutable.Map(mapList).map(function (m) { return new Model(m); }).toMap() : defaultMap || new _immutable.Map(); }; var Guide = exports.Guide = function (_Record) { _inherits(Guide, _Record); function Guide() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Guide); return _possibleConstructorReturn(this, (Guide.__proto__ || Object.getPrototypeOf(Guide)).call(this, _extends({}, json, { properties: (0, _immutable.fromJS)(json.properties || {}) }))); } return Guide; }((0, _immutable.Record)({ id: '', type: '', properties: (0, _immutable.Map)() }, 'Guide')); var DefaultGuides = exports.DefaultGuides = new _immutable.Map({ 'h1': new Guide({ id: 'h1', type: 'horizontal-streak', properties: { step: 20, colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd'] } }), 'v1': new Guide({ id: 'v1', type: 'vertical-streak', properties: { step: 20, colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd'] } }) }); var ElementsSet = exports.ElementsSet = function (_Record2) { _inherits(ElementsSet, _Record2); function ElementsSet() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, ElementsSet); return _possibleConstructorReturn(this, (ElementsSet.__proto__ || Object.getPrototypeOf(ElementsSet)).call(this, { vertices: new _immutable.List(json.vertices || []), lines: new _immutable.List(json.lines || []), holes: new _immutable.List(json.holes || []), areas: new _immutable.List(json.areas || []), items: new _immutable.List(json.items || []) })); } return ElementsSet; }((0, _immutable.Record)({ vertices: new _immutable.List(), lines: new _immutable.List(), holes: new _immutable.List(), areas: new _immutable.List(), items: new _immutable.List() }, 'ElementsSet')); var sharedAttributes = { id: '', type: '', prototype: '', name: '', misc: new _immutable.Map(), selected: false, properties: new _immutable.Map() }; var Vertex = exports.Vertex = function (_Record3) { _inherits(Vertex, _Record3); function Vertex() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Vertex); return _possibleConstructorReturn(this, (Vertex.__proto__ || Object.getPrototypeOf(Vertex)).call(this, _extends({}, json, { lines: new _immutable.List(json.lines || []), areas: new _immutable.List(json.areas || []) }))); } return Vertex; }((0, _immutable.Record)(_extends({}, sharedAttributes, { x: -1, y: -1, prototype: 'vertices', lines: new _immutable.List(), areas: new _immutable.List() }), 'Vertex')); var Line = exports.Line = function (_Record4) { _inherits(Line, _Record4); function Line() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Line); return _possibleConstructorReturn(this, (Line.__proto__ || Object.getPrototypeOf(Line)).call(this, _extends({}, json, { properties: (0, _immutable.fromJS)(json.properties || {}), vertices: new _immutable.List(json.vertices || []), holes: new _immutable.List(json.holes || []) }))); } return Line; }((0, _immutable.Record)(_extends({}, sharedAttributes, { prototype: 'lines', vertices: new _immutable.List(), holes: new _immutable.List() }), 'Line')); var Hole = exports.Hole = function (_Record5) { _inherits(Hole, _Record5); function Hole() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Hole); return _possibleConstructorReturn(this, (Hole.__proto__ || Object.getPrototypeOf(Hole)).call(this, _extends({}, json, { properties: (0, _immutable.fromJS)(json.properties || {}) }))); } return Hole; }((0, _immutable.Record)(_extends({}, sharedAttributes, { prototype: 'holes', offset: -1, line: '' }), 'Hole')); var Area = exports.Area = function (_Record6) { _inherits(Area, _Record6); function Area() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Area); return _possibleConstructorReturn(this, (Area.__proto__ || Object.getPrototypeOf(Area)).call(this, _extends({}, json, { properties: (0, _immutable.fromJS)(json.properties || {}), vertices: new _immutable.List(json.vertices || []) }))); } return Area; }((0, _immutable.Record)(_extends({}, sharedAttributes, { prototype: 'areas', vertices: new _immutable.List(), holes: new _immutable.List(), showHeatMap: false, heatMapText: '', heatMapColor: [], tooltip: {} }), 'Area')); var Item = exports.Item = function (_Record7) { _inherits(Item, _Record7); function Item() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Item); return _possibleConstructorReturn(this, (Item.__proto__ || Object.getPrototypeOf(Item)).call(this, _extends({}, json, { properties: (0, _immutable.fromJS)(json.properties || {}) }))); } return Item; }((0, _immutable.Record)(_extends({}, sharedAttributes, { prototype: 'items', x: 0, y: 0, rotation: 0 }), 'Item')); var Layer = exports.Layer = function (_Record8) { _inherits(Layer, _Record8); function Layer() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Layer); return _possibleConstructorReturn(this, (Layer.__proto__ || Object.getPrototypeOf(Layer)).call(this, _extends({}, json, { vertices: safeLoadMapList(json.vertices, Vertex), lines: safeLoadMapList(json.lines, Line), holes: safeLoadMapList(json.holes, Hole), areas: safeLoadMapList(json.areas, Area), items: safeLoadMapList(json.items, Item), selected: new ElementsSet(json.selected) }))); } return Layer; }((0, _immutable.Record)({ id: '', altitude: 0, order: 0, opacity: 1, name: '', visible: true, vertices: new _immutable.Map(), lines: new _immutable.Map(), holes: new _immutable.Map(), areas: new _immutable.Map(), items: new _immutable.Map(), selected: new ElementsSet() }, 'Layer')); var DefaultLayers = exports.DefaultLayers = new _immutable.Map({ 'layer-1': new Layer({ id: 'layer-1', name: 'default' }) }); var Scene = exports.Scene = function (_Record9) { _inherits(Scene, _Record9); function Scene() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Scene); var layers = safeLoadMapList(json.layers, Layer, DefaultLayers); return _possibleConstructorReturn(this, (Scene.__proto__ || Object.getPrototypeOf(Scene)).call(this, _extends({}, json, { guides: safeLoadMapList(json.guides, Guide, DefaultGuides), layers: layers, selectedLayer: layers.first().id, meta: json.meta ? (0, _immutable.fromJS)(json.meta) : new _immutable.Map() }))); } return Scene; }((0, _immutable.Record)({ unit: 'cm', layers: new _immutable.Map(), guides: new _immutable.Map(), selectedLayer: null, fontSize: 12, width: 3000, height: 2000, meta: new _immutable.Map() //additional info }, 'Scene')); var CatalogElement = exports.CatalogElement = function (_Record10) { _inherits(CatalogElement, _Record10); function CatalogElement() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, CatalogElement); return _possibleConstructorReturn(this, (CatalogElement.__proto__ || Object.getPrototypeOf(CatalogElement)).call(this, _extends({}, json, { info: (0, _immutable.fromJS)(json.info), properties: (0, _immutable.fromJS)(json.properties) }))); } return CatalogElement; }((0, _immutable.Record)({ name: '', prototype: '', info: new _immutable.Map(), properties: new _immutable.Map() }, 'CatalogElement')); var Catalog = exports.Catalog = function (_Record11) { _inherits(Catalog, _Record11); function Catalog() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Catalog); var elements = safeLoadMapList(json.elements, CatalogElement); return _possibleConstructorReturn(this, (Catalog.__proto__ || Object.getPrototypeOf(Catalog)).call(this, { elements: elements, ready: !elements.isEmpty() })); } _createClass(Catalog, [{ key: 'factoryElement', value: function factoryElement(type, options) { var initialProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!this.elements.has(type)) { var catList = this.elements.map(function (element) { return element.name; }).toArray(); throw new Error('Element ' + type + ' does not exist in catalog ' + catList); } var element = this.elements.get(type); var properties = element.properties.map(function (value, key) { return initialProperties[key] || value.get('defaultValue'); }); switch (element.prototype) { case 'lines': return new Line(options).merge({ properties: properties }); case 'holes': return new Hole(options).merge({ properties: properties }); case 'areas': return new Area(options).merge({ properties: properties }); case 'items': return new Item(options).merge({ properties: properties }); default: throw new Error('prototype not valid'); } } }]); return Catalog; }((0, _immutable.Record)({ ready: false, page: "root", path: new _immutable.List(), elements: new _immutable.Map() }, 'Catalog')); var State = exports.State = function (_Record12) { _inherits(State, _Record12); function State() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, State); var scene = new Scene(json.scene); return _possibleConstructorReturn(this, (State.__proto__ || Object.getPrototypeOf(State)).call(this, _extends({}, json, { scene: scene, sceneHistory: json.sceneHistory ? json.sceneHistory : new _immutable.List([scene]), catalog: new Catalog(json.catalog || {}), viewer2D: new _immutable.Map(json.viewer2D || {}), drawingSupport: new _immutable.Map(json.drawingSupport || {}), draggingSupport: new _immutable.Map(json.draggingSupport || {}), rotatingSupport: new _immutable.Map(json.rotatingSupport || {}), misc: json.misc ? (0, _immutable.fromJS)(json.misc) : new _immutable.Map() }))); } return State; }((0, _immutable.Record)({ mode: _constants.MODE_IDLE, scene: new Scene(), sceneHistory: new _immutable.List([new Scene()]), catalog: new Catalog(), viewer2D: new _immutable.Map(), mouse: new _immutable.Map({ x: 0, y: 0 }), zoom: 0, areasText: new _immutable.Map(), snapMask: _snap.SNAP_MASK, snapElements: new _immutable.List(), activeSnapElement: null, drawingSupport: new _immutable.Map(), draggingSupport: new _immutable.Map(), rotatingSupport: new _immutable.Map(), errors: new _immutable.List(), warnings: new _immutable.List(), clipboardProperties: null, selectedElementsHistory: new _immutable.List(), misc: new _immutable.Map() //additional info }, 'State')); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbHMuanMiXSwibmFtZXMiOlsic2FmZUxvYWRNYXBMaXN0IiwibWFwTGlzdCIsIk1vZGVsIiwiZGVmYXVsdE1hcCIsIm1hcCIsIm0iLCJ0b01hcCIsIkd1aWRlIiwianNvbiIsInByb3BlcnRpZXMiLCJpZCIsInR5cGUiLCJEZWZhdWx0R3VpZGVzIiwic3RlcCIsImNvbG9ycyIsIkVsZW1lbnRzU2V0IiwidmVydGljZXMiLCJsaW5lcyIsImhvbGVzIiwiYXJlYXMiLCJpdGVtcyIsInNoYXJlZEF0dHJpYnV0ZXMiLCJwcm90b3R5cGUiLCJuYW1lIiwibWlzYyIsInNlbGVjdGVkIiwiVmVydGV4IiwieCIsInkiLCJMaW5lIiwiSG9sZSIsIm9mZnNldCIsImxpbmUiLCJBcmVhIiwic2hvd0hlYXRNYXAiLCJoZWF0TWFwVGV4dCIsImhlYXRNYXBDb2xvciIsInRvb2x0aXAiLCJJdGVtIiwicm90YXRpb24iLCJMYXllciIsImFsdGl0dWRlIiwib3JkZXIiLCJvcGFjaXR5IiwidmlzaWJsZSIsIkRlZmF1bHRMYXllcnMiLCJTY2VuZSIsImxheWVycyIsImd1aWRlcyIsInNlbGVjdGVkTGF5ZXIiLCJmaXJzdCIsIm1ldGEiLCJ1bml0IiwiZm9udFNpemUiLCJ3aWR0aCIsImhlaWdodCIsIkNhdGFsb2dFbGVtZW50IiwiaW5mbyIsIkNhdGFsb2ciLCJlbGVtZW50cyIsInJlYWR5IiwiaXNFbXB0eSIsIm9wdGlvbnMiLCJpbml0aWFsUHJvcGVydGllcyIsImhhcyIsImNhdExpc3QiLCJlbGVtZW50IiwidG9BcnJheSIsIkVycm9yIiwiZ2V0IiwidmFsdWUiLCJrZXkiLCJtZXJnZSIsInBhZ2UiLCJwYXRoIiwiU3RhdGUiLCJzY2VuZSIsInNjZW5lSGlzdG9yeSIsImNhdGFsb2ciLCJ2aWV3ZXIyRCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwibW9kZSIsIm1vdXNlIiwiem9vbSIsImFyZWFzVGV4dCIsInNuYXBNYXNrIiwic25hcEVsZW1lbnRzIiwiYWN0aXZlU25hcEVsZW1lbnQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImNsaXBib2FyZFByb3BlcnRpZXMiLCJzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFJQSxrQkFBa0IsU0FBbEJBLGVBQWtCLENBQUNDLE9BQUQsRUFBVUMsS0FBVixFQUFpQkMsVUFBakIsRUFBZ0M7QUFDcEQsU0FBT0YsVUFDSCxtQkFBUUEsT0FBUixFQUFpQkcsR0FBakIsQ0FBcUI7QUFBQSxXQUFLLElBQUlGLEtBQUosQ0FBVUcsQ0FBVixDQUFMO0FBQUEsR0FBckIsRUFBd0NDLEtBQXhDLEVBREcsR0FFRkgsY0FBYyxvQkFGbkI7QUFHRCxDQUpEOztJQU9hSSxLLFdBQUFBLEs7OztBQUtYLG1CQUF1QjtBQUFBLFFBQVhDLElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSxzSEFFaEJBLElBRmdCO0FBR25CQyxrQkFBWSx1QkFBT0QsS0FBS0MsVUFBTCxJQUFtQixFQUExQjtBQUhPO0FBS3RCOzs7RUFWd0IsdUJBQU87QUFDaENDLE1BQUksRUFENEI7QUFFaENDLFFBQU0sRUFGMEI7QUFHaENGLGNBQVk7QUFIb0IsQ0FBUCxFQUl4QixPQUp3QixDOztBQWFwQixJQUFNRyx3Q0FBZ0IsbUJBQVE7QUFDbkMsUUFBTSxJQUFJTCxLQUFKLENBQVU7QUFDZEcsUUFBSSxJQURVO0FBRWRDLFVBQU0sbUJBRlE7QUFHZEYsZ0JBQVk7QUFDVkksWUFBTSxFQURJO0FBRVZDLGNBQVEsQ0FBQyxTQUFELEVBQVksTUFBWixFQUFvQixNQUFwQixFQUE0QixNQUE1QixFQUFvQyxNQUFwQztBQUZFO0FBSEUsR0FBVixDQUQ2QjtBQVNuQyxRQUFNLElBQUlQLEtBQUosQ0FBVTtBQUNkRyxRQUFJLElBRFU7QUFFZEMsVUFBTSxpQkFGUTtBQUdkRixnQkFBWTtBQUNWSSxZQUFNLEVBREk7QUFFVkMs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QS9CLENBUkc7QUFTbkJDLHVCQUFpQixtQkFBUXpFLEtBQUt5RSxlQUFMLElBQXdCLEVBQWhDLENBVEU7QUFVbkJDLHVCQUFpQixtQkFBUTFFLEtBQUswRSxlQUFMLElBQXdCLEVBQWhDLENBVkU7QUFXbkIxRCxZQUFNaEIsS0FBS2dCLElBQUwsR0FBWSx1QkFBT2hCLEtBQUtnQixJQUFaLENBQVosR0FBZ0M7QUFYbkI7QUFhdEI7OztFQWxDd0IsdUJBQU87QUFDaEMyRCw0QkFEZ0M7QUFFaENQLFNBQU8sSUFBSTlCLEtBQUosRUFGeUI7QUFHaEMrQixnQkFBYyxvQkFBUyxDQUFDLElBQUkvQixLQUFKLEVBQUQsQ0FBVCxDQUhrQjtBQUloQ2dDLFdBQVMsSUFBSXBCLE9BQUosRUFKdUI7QUFLaENxQixZQUFVLG9CQUxzQjtBQU1oQ0ssU0FBTyxtQkFBUSxFQUFDekQsR0FBRyxDQUFKLEVBQU9DLEdBQUcsQ0FBVixFQUFSLENBTnlCO0FBT2hDeUQsUUFBTSxDQVAwQjtBQVFoQ0MsYUFBVyxvQkFScUI7QUFTaENDLDJCQVRnQztBQVVoQ0MsZ0JBQWMscUJBVmtCO0FBV2hDQyxxQkFBbUIsSUFYYTtBQVloQ1Qsa0JBQWdCLG9CQVpnQjtBQWFoQ0MsbUJBQWlCLG9CQWJlO0FBY2hDQyxtQkFBaUIsb0JBZGU7QUFlaENRLFVBQVEscUJBZndCO0FBZ0JoQ0MsWUFBVSxxQkFoQnNCO0FBaUJoQ0MsdUJBQXFCLElBakJXO0FBa0JoQ0MsMkJBQXlCLHFCQWxCTztBQW1CaENyRSxRQUFNLG9CQW5CMEIsQ0FtQmQ7QUFuQmMsQ0FBUCxFQW9CeEIsT0FwQndCLEMiLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWNvcmQsIExpc3QsIE1hcCwgZnJvbUpTfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IHtNT0RFX0lETEUsIE1PREVfMkRfUEFOfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1NOQVBfTUFTS30gZnJvbSAnLi91dGlscy9zbmFwJztcblxubGV0IHNhZmVMb2FkTWFwTGlzdCA9IChtYXBMaXN0LCBNb2RlbCwgZGVmYXVsdE1hcCkgPT4ge1xuICByZXR1cm4gbWFwTGlzdFxuICAgID8gbmV3IE1hcChtYXBMaXN0KS5tYXAobSA9PiBuZXcgTW9kZWwobSkpLnRvTWFwKClcbiAgICA6IChkZWZhdWx0TWFwIHx8IG5ldyBNYXAoKSk7XG59O1xuXG5cbmV4cG9ydCBjbGFzcyBHdWlkZSBleHRlbmRzIFJlY29yZCh7XG4gIGlkOiAnJyxcbiAgdHlwZTogJycsXG4gIHByb3BlcnRpZXM6IE1hcCgpXG59LCAnR3VpZGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0R3VpZGVzID0gbmV3IE1hcCh7XG4gICdoMSc6IG5ldyBHdWlkZSh7XG4gICAgaWQ6ICdoMScsXG4gICAgdHlwZTogJ2hvcml6b250YWwtc3RyZWFrJyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzdGVwOiAyMCxcbiAgICAgIGNvbG9yczogWycjODA4MDgwJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJywgJyNkZGQnXVxuICAgIH1cbiAgfSksXG4gICd2MSc6IG5ldyBHdWlkZSh7XG4gICAgaWQ6ICd2MScsXG4gICAgdHlwZTogJ3ZlcnRpY2FsLXN0cmVhaycsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc3RlcDogMjAsXG4gICAgICBjb2xvcnM6IFsnIzgwODA4MCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJ11cbiAgICB9XG4gIH0pXG59KTtcblxuXG5leHBvcnQgY2xhc3MgRWxlbWVudHNTZXQgZXh0ZW5kcyBSZWNvcmQoe1xuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgbGluZXM6IG5ldyBMaXN0KCksXG4gIGhvbGVzOiBuZXcgTGlzdCgpLFxuICBhcmVhczogbmV3IExpc3QoKSxcbiAgaXRlbXM6IG5ldyBMaXN0KCksXG59LCAnRWxlbWVudHNTZXQnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZlcnRpY2VzOiBuZXcgTGlzdChqc29uLnZlcnRpY2VzIHx8IFtdKSxcbiAgICAgIGxpbmVzOiBuZXcgTGlzdChqc29uLmxpbmVzIHx8IFtdKSxcbiAgICAgIGhvbGVzOiBuZXcgTGlzdChqc29uLmhvbGVzIHx8IFtdKSxcbiAgICAgIGFyZWFzOiBuZXcgTGlzdChqc29uLmFyZWFzIHx8IFtdKSxcbiAgICAgIGl0ZW1zOiBuZXcgTGlzdChqc29uLml0ZW1zIHx8IFtdKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3Qgc2hhcmVkQXR0cmlidXRlcyA9XG57XG4gIGlkOiAnJyxcbiAgdHlwZTogJycsXG4gIHByb3RvdHlwZTogJycsXG4gIG5hbWU6ICcnLFxuICBtaXNjOiBuZXcgTWFwKCksXG4gIHNlbGVjdGVkOiBmYWxzZSxcbiAgcHJvcGVydGllczogbmV3IE1hcCgpLFxufVxuXG5leHBvcnQgY2xhc3MgVmVydGV4IGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgeDogLTEsXG4gIHk6IC0xLFxuICBwcm90b3R5cGU6ICd2ZXJ0aWNlcycsXG4gIGxpbmVzOiBuZXcgTGlzdCgpLFxuICBhcmVhczogbmV3IExpc3QoKVxufSwgJ1ZlcnRleCcpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uanNvbixcbiAgICAgIGxpbmVzOiBuZXcgTGlzdChqc29uLmxpbmVzIHx8IFtdKSxcbiAgICAgIGFyZWFzOiBuZXcgTGlzdChqc29uLmFyZWFzIHx8IFtdKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmUgZXh0ZW5kcyBSZWNvcmQoe1xuICAuLi5zaGFyZWRBdHRyaWJ1dGVzLFxuICBwcm90b3R5cGU6ICdsaW5lcycsXG4gIHZlcnRpY2VzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKVxufSwgJ0xpbmUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KSxcbiAgICAgIHZlcnRpY2VzOiBuZXcgTGlzdChqc29uLnZlcnRpY2VzIHx8IFtdKSxcbiAgICAgIGhvbGVzOiBuZXcgTGlzdChqc29uLmhvbGVzIHx8IFtdKSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb2xlIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnaG9sZXMnLFxuICBvZmZzZXQ6IC0xLFxuICBsaW5lOiAnJ1xufSwgJ0hvbGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyZWEgZXh0ZW5kcyBSZWNvcmQoe1xuICAuLi5zaGFyZWRBdHRyaWJ1dGVzLFxuICBwcm90b3R5cGU6ICdhcmVhcycsXG4gIHZlcnRpY2VzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKSxcbiAgc2hvd0hlYXRNYXA6IGZhbHNlLFxuICBoZWF0TWFwVGV4dDogJycsXG4gIGhlYXRNYXBDb2xvcjogW10sXG4gIHRvb2x0aXA6IHt9LFxufSwgJ0FyZWEnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHsgXG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSksXG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJdGVtIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnaXRlbXMnLFxuICB4OiAwLFxuICB5OiAwLFxuICByb3RhdGlvbjogMFxufSwgJ0l0ZW0nKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExheWVyIGV4dGVuZHMgUmVjb3JkKHtcbiAgaWQ6ICcnLFxuICBhbHRpdHVkZTogMCxcbiAgb3JkZXI6IDAsXG4gIG9wYWNpdHk6IDEsXG4gIG5hbWU6ICcnLFxuICB2aXNpYmxlOiB0cnVlLFxuICB2ZXJ0aWNlczogbmV3IE1hcCgpLFxuICBsaW5lczogbmV3IE1hcCgpLFxuICBob2xlczogbmV3IE1hcCgpLFxuICBhcmVhczogbmV3IE1hcCgpLFxuICBpdGVtczogbmV3IE1hcCgpLFxuICBzZWxlY3RlZDogbmV3IEVsZW1lbnRzU2V0KCksXG59LCAnTGF5ZXInKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICB2ZXJ0aWNlczogc2FmZUxvYWRNYXBMaXN0KGpzb24udmVydGljZXMsIFZlcnRleCksXG4gICAgICBsaW5lczogc2FmZUxvYWRNYXBMaXN0KGpzb24ubGluZXMsIExpbmUpLFxuICAgICAgaG9sZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmhvbGVzLCBIb2xlKSxcbiAgICAgIGFyZWFzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5hcmVhcywgQXJlYSksXG4gICAgICBpdGVtczogc2FmZUxvYWRNYXBMaXN0KGpzb24uaXRlbXMsIEl0ZW0pLFxuICAgICAgc2VsZWN0ZWQ6IG5ldyBFbGVtZW50c1NldChqc29uLnNlbGVjdGVkKVxuICAgIH0pO1xuICB9XG59XG5cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRMYXllcnMgPSBuZXcgTWFwKHtcbiAgJ2xheWVyLTEnOiBuZXcgTGF5ZXIoe2lkOiAnbGF5ZXItMScsIG5hbWU6ICdkZWZhdWx0J30pXG59KTtcblxuXG5leHBvcnQgY2xhc3MgU2NlbmUgZXh0ZW5kcyBSZWNvcmQoe1xuICB1bml0OiAnY20nLFxuICBsYXllcnM6IG5ldyBNYXAoKSxcbiAgZ3VpZGVzOiBuZXcgTWFwKCksXG4gIHNlbGVjdGVkTGF5ZXI6IG51bGwsXG4gIGZvbnRTaXplOiAxMixcbiAgd2lkdGg6IDMwMDAsXG4gIGhlaWdodDogMjAwMCxcbiAgbWV0YTogbmV3IE1hcCgpICAgLy9hZGRpdGlvbmFsIGluZm9cbn0sICdTY2VuZScpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IGxheWVycyA9IHNhZmVMb2FkTWFwTGlzdChqc29uLmxheWVycywgTGF5ZXIsIERlZmF1bHRMYXllcnMpO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBndWlkZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmd1aWRlcywgR3VpZGUsIERlZmF1bHRHdWlkZXMpLFxuICAgICAgbGF5ZXJzLFxuICAgICAgc2VsZWN0ZWRMYXllcjogbGF5ZXJzLmZpcnN0KCkuaWQsXG4gICAgICBtZXRhOiBqc29uLm1ldGEgPyBmcm9tSlMoanNvbi5tZXRhKSA6IG5ldyBNYXAoKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGFsb2dFbGVtZW50IGV4dGVuZHMgUmVjb3JkKHtcbiAgbmFtZTogJycsXG4gIHByb3RvdHlwZTogJycsXG4gIGluZm86IG5ldyBNYXAoKSxcbiAgcHJvcGVydGllczogbmV3IE1hcCgpLFxufSwgJ0NhdGFsb2dFbGVtZW50Jykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgaW5mbzogZnJvbUpTKGpzb24uaW5mbyksXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzKVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRhbG9nIGV4dGVuZHMgUmVjb3JkKHtcbiAgcmVhZHk6IGZhbHNlLFxuICBwYWdlOiBcInJvb3RcIixcbiAgcGF0aDogbmV3IExpc3QoKSxcbiAgZWxlbWVudHM6IG5ldyBNYXAoKSxcbn0sICdDYXRhbG9nJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBsZXQgZWxlbWVudHMgPSBzYWZlTG9hZE1hcExpc3QoanNvbi5lbGVtZW50cywgQ2F0YWxvZ0VsZW1lbnQpO1xuICAgIHN1cGVyKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcmVhZHk6ICFlbGVtZW50cy5pc0VtcHR5KClcbiAgICB9KVxuICB9XG5cbiAgZmFjdG9yeUVsZW1lbnQodHlwZSwgb3B0aW9ucywgaW5pdGlhbFByb3BlcnRpZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy5lbGVtZW50cy5oYXModHlwZSkpIHtcbiAgICAgIGxldCBjYXRMaXN0ID0gdGhpcy5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiBlbGVtZW50Lm5hbWUpLnRvQXJyYXkoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke3R5cGV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2cgJHtjYXRMaXN0fWApO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtZW50cy5nZXQodHlwZSk7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBlbGVtZW50LnByb3BlcnRpZXMubWFwKCh2YWx1ZSwga2V5KSA9PiBpbml0aWFsUHJvcGVydGllc1trZXldIHx8IHZhbHVlLmdldCgnZGVmYXVsdFZhbHVlJykpO1xuXG4gICAgc3dpdGNoIChlbGVtZW50LnByb3RvdHlwZSkge1xuICAgICAgY2FzZSAnbGluZXMnOlxuICAgICAgICByZXR1cm4gbmV3IExpbmUob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnaG9sZXMnOlxuICAgICAgICByZXR1cm4gbmV3IEhvbGUob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnYXJlYXMnOlxuICAgICAgICByZXR1cm4gbmV3IEFyZWEob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnaXRlbXMnOlxuICAgICAgICByZXR1cm4gbmV3IEl0ZW0ob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm90b3R5cGUgbm90IHZhbGlkJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZSBleHRlbmRzIFJlY29yZCh7XG4gIG1vZGU6IE1PREVfSURMRSxcbiAgc2NlbmU6IG5ldyBTY2VuZSgpLFxuICBzY2VuZUhpc3Rvcnk6IG5ldyBMaXN0KFtuZXcgU2NlbmUoKV0pLFxuICBjYXRhbG9nOiBuZXcgQ2F0YWxvZygpLFxuICB2aWV3ZXIyRDogbmV3IE1hcCgpLFxuICBtb3VzZTogbmV3IE1hcCh7eDogMCwgeTogMH0pLFxuICB6b29tOiAwLFxuICBhcmVhc1RleHQ6IG5ldyBNYXAoKSxcbiAgc25hcE1hc2s6IFNOQVBfTUFTSyxcbiAgc25hcEVsZW1lbnRzOiBuZXcgTGlzdCgpLFxuICBhY3RpdmVTbmFwRWxlbWVudDogbnVsbCxcbiAgZHJhd2luZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgZHJhZ2dpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gIHJvdGF0aW5nU3VwcG9ydDogbmV3IE1hcCgpLFxuICBlcnJvcnM6IG5ldyBMaXN0KCksXG4gIHdhcm5pbmdzOiBuZXcgTGlzdCgpLFxuICBjbGlwYm9hcmRQcm9wZXJ0aWVzOiBudWxsLFxuICBzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeTogbmV3IExpc3QoKSxcbiAgbWlzYzogbmV3IE1hcCgpICAgLy9hZGRpdGlvbmFsIGluZm9cbn0sICdTdGF0ZScpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IHNjZW5lID0gbmV3IFNjZW5lKGpzb24uc2NlbmUpO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBzY2VuZSxcbiAgICAgIHNjZW5lSGlzdG9yeToganNvbi5zY2VuZUhpc3RvcnkgPyBqc29uLnNjZW5lSGlzdG9yeSA6IG5ldyBMaXN0KFtzY2VuZV0pLFxuICAgICAgY2F0YWxvZzogbmV3IENhdGFsb2coanNvbi5jYXRhbG9nIHx8IHt9KSxcbiAgICAgIHZpZXdlcjJEOiBuZXcgTWFwKGpzb24udmlld2VyMkQgfHwge30pLFxuICAgICAgZHJhd2luZ1N1cHBvcnQ6IG5ldyBNYXAoanNvbi5kcmF3aW5nU3VwcG9ydCB8fCB7fSksXG4gICAgICBkcmFnZ2luZ1N1cHBvcnQ6IG5ldyBNYXAoanNvbi5kcmFnZ2luZ1N1cHBvcnQgfHwge30pLFxuICAgICAgcm90YXRpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24ucm90YXRpbmdTdXBwb3J0IHx8IHt9KSxcbiAgICAgIG1pc2M6IGpzb24ubWlzYyA/IGZyb21KUyhqc29uLm1pc2MpIDogbmV3IE1hcCgpXG4gICAgfSlcbiAgfVxufVxuXG5cblxuIl19