UNPKG

react-planner-viewer

Version:

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

273 lines (221 loc) 26.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _export = require('./properties/export'); var _constants = require('../constants'); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Catalog = function () { function Catalog() { var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.UNIT_CENTIMETER; _classCallCheck(this, Catalog); this.elements = {}; this.categories = { root: { name: 'root', label: '/', elements: [], categories: [] } }; this.propertyTypes = {}; this.unit = unit; this.registerMultiplePropertyType([['color', _export.PropertyColor, _export.PropertyColor], ['enum', _export.PropertyEnum, _export.PropertyEnum], ['string', _export.PropertyString, _export.PropertyString], ['number', _export.PropertyNumber, _export.PropertyNumber], ['length-measure', _export.PropertyLengthMeasure, _export.PropertyLengthMeasure], ['toggle', _export.PropertyToggle, _export.PropertyToggle], ['checkbox', _export.PropertyCheckbox, _export.PropertyCheckbox], ['hidden', _export.PropertyHidden, _export.PropertyHidden], ['read-only', _export.PropertyReadOnly, _export.PropertyReadOnly]]); } /** @description Get catalog's element * @param {string} type Element's type * @return {?object} Element */ _createClass(Catalog, [{ key: 'getElement', value: function getElement(type) { if (this.hasElement(type)) { return this.elements[type]; } throw new Error('Element ' + type + ' does not exist in catalog'); } /** @description Get catalog category * @param {string} categoryName Name of category * @return {object} Category */ }, { key: 'getCategory', value: function getCategory(categoryName) { if (this.hasCategory(categoryName)) { return this.categories[categoryName]; } throw new Error('Category ' + categoryName + ' does not exist in catalog'); } /** @description Return type of a specfied property * @param {string} type Property type * @return {?object} Property */ }, { key: 'getPropertyType', value: function getPropertyType(type) { if (this.propertyTypes.hasOwnProperty(type)) { return this.propertyTypes[type]; } throw new Error('Element ' + type + ' does not exist in catalog'); } /** @description Register a new element * @param {object} json Element structure * @return {void} */ }, { key: 'registerElement', value: function registerElement(json) { json.properties = json.properties || {}; if (this.validateElement(json)) { this.elements[json.name] = json; this.categories.root.elements.push(this.elements[json.name]); } } /** @description Register multiple elements * @param {array} [elementArray] Array of elements * @return {void} */ }, { key: 'registerMultipleElements', value: function registerMultipleElements(elementArray) { var _this = this; elementArray.forEach(function (el) { return _this.registerElement(el); }); } /** @description Register a new property * @param {string} type Type of property * @param {object} Viewer Property viewer component * @param {object} Editor Property editor component * @return {void} */ }, { key: 'registerPropertyType', value: function registerPropertyType(type, Viewer, Editor) { this.propertyTypes[type] = { type: type, Viewer: Viewer, Editor: Editor }; } /** @description Register multiple property * @param {array} propertyTypeArray Array of properties * @return {void} */ }, { key: 'registerMultiplePropertyType', value: function registerMultiplePropertyType(propertyTypeArray) { var _this2 = this; propertyTypeArray.forEach(function (el) { return _this2.registerPropertyType.apply(_this2, _toConsumableArray(el)); }); } /** @description Validate an element * @param {object} json Element's structure * @return {?boolean} */ }, { key: 'validateElement', value: function validateElement(json) { if (!json.hasOwnProperty('name')) throw new Error('Element not valid'); var name = json.name; if (!json.hasOwnProperty('prototype')) throw new Error('Element ' + name + ' doesn\'t have prototype'); if (!json.hasOwnProperty('info')) throw new Error('Element ' + name + ' doesn\'t have info'); if (!json.info.hasOwnProperty('tag')) throw new Error('Element ' + name + ' doesn\'t have tag'); if (!json.info.hasOwnProperty('group')) throw new Error('Element ' + name + ' doesn\'t have group'); if (!json.info.hasOwnProperty('description')) throw new Error('Element ' + name + ' doesn\'t have description'); if (!json.info.hasOwnProperty('image')) throw new Error('Element ' + name + ' doesn\'t have image'); if (!json.hasOwnProperty('render2D')) throw new Error('Element ' + name + ' doesn\'t have render2D handler'); if (!json.hasOwnProperty('properties')) throw new Error('Element ' + name + ' doesn\'t have properties'); for (var propertyName in json.properties) { var propertyConfigs = json.properties[propertyName]; if (!propertyConfigs.hasOwnProperty('type')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have type'); if (!propertyConfigs.hasOwnProperty('defaultValue')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have defaultValue'); } return true; } /** @description Check if catalog has element * @param {string} type Element's type * @return {boolean} */ }, { key: 'hasElement', value: function hasElement(type) { return this.elements.hasOwnProperty(type); } /** @description Register a new category * @param {string} name Name of category * @param {string} label Label of category * @param {array} [childs] Category's childs * @return {?object} Registered category */ }, { key: 'registerCategory', value: function registerCategory(name, label, childs) { var _this3 = this; if (this.validateCategory(name, label)) { this.categories[name] = { name: name, label: label, categories: [], elements: [] }; this.categories.root.categories.push(this.categories[name]); if (childs && childs.length) { childs.forEach(function (el) { return _this3.addToCategory(name, el); }); } return this.categories[name]; } return null; } /** @description Add an element to the specified category * @param {string} name Name of category * @param {object} child Element's structure * @return {?void} */ }, { key: 'addToCategory', value: function addToCategory(name, child) { if (this.hasElement(child.name)) { this.categories[name].elements.push(child); this.categories.root.elements.splice(this.categories.root.elements.indexOf(child), 1); } else if (this.hasCategory(child.name)) { this.categories[name].categories.push(child); this.categories.root.categories.splice(this.categories.root.categories.indexOf(child), 1); } else { throw new Error('child ' + child + ' is either category nor element'); } } /** @description Check if category contain element * @param {string} categoryName Name of category * @param {string} elementName Name of element * @return {boolean} */ }, { key: 'categoryHasElement', value: function categoryHasElement(categoryName, elementName) { return this.hasCategory(categoryName) && this.categories[categoryName].elements.some(function (el) { return el.name === elementName; }); } /** @description Validate a category * @param {string} name Name of category * @param {string} label Label of category * @return {?boolean} */ }, { key: 'validateCategory', value: function validateCategory(name, label) { if (!name) { throw new Error('Category has undefined name'); } if (name === '') { throw new Error('Category has empty name'); } if (this.hasCategory(name)) { throw new Error('Category has already been registered'); } return true; } /** @description Verify if catalog already contain a category with specified name * @param {string} categoryName Name of category * @return {boolean} */ }, { key: 'hasCategory', value: function hasCategory(categoryName) { return this.categories.hasOwnProperty(categoryName); } }]); return Catalog; }(); exports.default = Catalog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXRhbG9nL2NhdGFsb2cuanMiXSwibmFtZXMiOlsiQ2F0YWxvZyIsInVuaXQiLCJlbGVtZW50cyIsImNhdGVnb3JpZXMiLCJyb290IiwibmFtZSIsImxhYmVsIiwicHJvcGVydHlUeXBlcyIsInJlZ2lzdGVyTXVsdGlwbGVQcm9wZXJ0eVR5cGUiLCJ0eXBlIiwiaGFzRWxlbWVudCIsIkVycm9yIiwiY2F0ZWdvcnlOYW1lIiwiaGFzQ2F0ZWdvcnkiLCJoYXNPd25Qcm9wZXJ0eSIsImpzb24iLCJwcm9wZXJ0aWVzIiwidmFsaWRhdGVFbGVtZW50IiwicHVzaCIsImVsZW1lbnRBcnJheSIsImZvckVhY2giLCJyZWdpc3RlckVsZW1lbnQiLCJlbCIsIlZpZXdlciIsIkVkaXRvciIsInByb3BlcnR5VHlwZUFycmF5IiwicmVnaXN0ZXJQcm9wZXJ0eVR5cGUiLCJpbmZvIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlDb25maWdzIiwiY2hpbGRzIiwidmFsaWRhdGVDYXRlZ29yeSIsImxlbmd0aCIsImFkZFRvQ2F0ZWdvcnkiLCJjaGlsZCIsInNwbGljZSIsImluZGV4T2YiLCJlbGVtZW50TmFtZSIsInNvbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBWUE7Ozs7OztJQUVxQkEsTztBQUVuQixxQkFBb0M7QUFBQSxRQUF4QkMsSUFBd0I7O0FBQUE7O0FBQ2xDLFNBQUtDLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLEVBQUNDLE1BQU0sRUFBQ0MsTUFBTSxNQUFQLEVBQWVDLE9BQU8sR0FBdEIsRUFBMkJKLFVBQVUsRUFBckMsRUFBeUNDLFlBQVksRUFBckQsRUFBUCxFQUFsQjtBQUNBLFNBQUtJLGFBQUwsR0FBcUIsRUFBckI7QUFDQSxTQUFLTixJQUFMLEdBQVlBLElBQVo7O0FBRUEsU0FBS08sNEJBQUwsQ0FBa0MsQ0FDaEMsQ0FBQyxPQUFELCtDQURnQyxFQUVoQyxDQUFDLE1BQUQsNkNBRmdDLEVBR2hD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aEMsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUJELFVBQXJCLENBQWdDaUMsT0FBaEMsQ0FBd0NGLEtBQXhDLENBQXZDLEVBQXVGLENBQXZGO0FBQ0QsT0FITSxNQUdBO0FBQ0wsY0FBTSxJQUFJdkIsS0FBSixZQUFtQnVCLEtBQW5CLHFDQUFOO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7dUNBS21CdEIsWSxFQUFjeUIsVyxFQUFhO0FBQzVDLGFBQU8sS0FBS3hCLFdBQUwsQ0FBaUJELFlBQWpCLEtBQWtDLEtBQUtULFVBQUwsQ0FBZ0JTLFlBQWhCLEVBQThCVixRQUE5QixDQUF1Q29DLElBQXZDLENBQTRDO0FBQUEsZUFBTWhCLEdBQUdqQixJQUFILEtBQVlnQyxXQUFsQjtBQUFBLE9BQTVDLENBQXpDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3FDQUtpQmhDLEksRUFBTUMsSyxFQUFPO0FBQzVCLFVBQUksQ0FBQ0QsSUFBTCxFQUFXO0FBQ1QsY0FBTSxJQUFJTSxLQUFKLENBQVUsNkJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSU4sU0FBUyxFQUFiLEVBQWlCO0FBQ2YsY0FBTSxJQUFJTSxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSSxLQUFLRSxXQUFMLENBQWlCUixJQUFqQixDQUFKLEVBQTRCO0FBQzFCLGNBQU0sSUFBSU0sS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRDs7QUFFRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7OztnQ0FJWUMsWSxFQUFjO0FBQ3hCLGFBQU8sS0FBS1QsVUFBTCxDQUFnQlcsY0FBaEIsQ0FBK0JGLFlBQS9CLENBQVA7QUFDRDs7Ozs7O2tCQXZNa0JaLE8iLCJmaWxlIjoiY2F0YWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByb3BlcnR5Q29sb3IsXG4gIFByb3BlcnR5RW51bSxcbiAgUHJvcGVydHlTdHJpbmcsXG4gIFByb3BlcnR5TnVtYmVyLFxuICBQcm9wZXJ0eUxlbmd0aE1lYXN1cmUsXG4gIFByb3BlcnR5VG9nZ2xlLFxuICBQcm9wZXJ0eUNoZWNrYm94LFxuICBQcm9wZXJ0eUhpZGRlbixcbiAgUHJvcGVydHlSZWFkT25seVxufSBmcm9tICcuL3Byb3BlcnRpZXMvZXhwb3J0JztcblxuaW1wb3J0IHtVTklUX0NFTlRJTUVURVJ9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGFsb2cge1xuXG4gIGNvbnN0cnVjdG9yKHVuaXQgPSBVTklUX0NFTlRJTUVURVIpIHtcbiAgICB0aGlzLmVsZW1lbnRzID0ge307XG4gICAgdGhpcy5jYXRlZ29yaWVzID0ge3Jvb3Q6IHtuYW1lOiAncm9vdCcsIGxhYmVsOiAnLycsIGVsZW1lbnRzOiBbXSwgY2F0ZWdvcmllczogW119fTtcbiAgICB0aGlzLnByb3BlcnR5VHlwZXMgPSB7fTtcbiAgICB0aGlzLnVuaXQgPSB1bml0O1xuXG4gICAgdGhpcy5yZWdpc3Rlck11bHRpcGxlUHJvcGVydHlUeXBlKFtcbiAgICAgIFsnY29sb3InLCBQcm9wZXJ0eUNvbG9yLCBQcm9wZXJ0eUNvbG9yXSxcbiAgICAgIFsnZW51bScsIFByb3BlcnR5RW51bSwgUHJvcGVydHlFbnVtXSxcbiAgICAgIFsnc3RyaW5nJywgUHJvcGVydHlTdHJpbmcsIFByb3BlcnR5U3RyaW5nXSxcbiAgICAgIFsnbnVtYmVyJywgUHJvcGVydHlOdW1iZXIsIFByb3BlcnR5TnVtYmVyXSxcbiAgICAgIFsnbGVuZ3RoLW1lYXN1cmUnLCBQcm9wZXJ0eUxlbmd0aE1lYXN1cmUsIFByb3BlcnR5TGVuZ3RoTWVhc3VyZV0sXG4gICAgICBbJ3RvZ2dsZScsIFByb3BlcnR5VG9nZ2xlLCBQcm9wZXJ0eVRvZ2dsZV0sXG4gICAgICBbJ2NoZWNrYm94JywgUHJvcGVydHlDaGVja2JveCwgUHJvcGVydHlDaGVja2JveF0sXG4gICAgICBbJ2hpZGRlbicsIFByb3BlcnR5SGlkZGVuLCBQcm9wZXJ0eUhpZGRlbl0sXG4gICAgICBbJ3JlYWQtb25seScsIFByb3BlcnR5UmVhZE9ubHksIFByb3BlcnR5UmVhZE9ubHldXG4gICAgXSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIEdldCBjYXRhbG9nJ3MgZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWxlbWVudCdzIHR5cGVcbiAgICogIEByZXR1cm4gez9vYmplY3R9IEVsZW1lbnRcbiAgKi9cbiAgZ2V0RWxlbWVudCh0eXBlKSB7XG4gICAgaWYgKHRoaXMuaGFzRWxlbWVudCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbdHlwZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke3R5cGV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2dgKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gR2V0IGNhdGFsb2cgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7b2JqZWN0fSBDYXRlZ29yeVxuICAqL1xuICBnZXRDYXRlZ29yeShjYXRlZ29yeU5hbWUpIHtcbiAgICBpZiAodGhpcy5oYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5TmFtZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2F0ZWdvcnkgJHtjYXRlZ29yeU5hbWV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2dgKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmV0dXJuIHR5cGUgb2YgYSBzcGVjZmllZCBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgUHJvcGVydHkgdHlwZVxuICAgKiAgQHJldHVybiB7P29iamVjdH0gUHJvcGVydHlcbiAgKi9cbiAgZ2V0UHJvcGVydHlUeXBlKHR5cGUpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0eVR5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVR5cGVzW3R5cGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGVsZW1lbnRcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIEVsZW1lbnQgc3RydWN0dXJlXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3RlckVsZW1lbnQoanNvbikge1xuICAgIGpzb24ucHJvcGVydGllcyA9IGpzb24ucHJvcGVydGllcyB8fCB7fTtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUVsZW1lbnQoanNvbikpIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbanNvbi5uYW1lXSA9IGpzb247XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5lbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudHNbanNvbi5uYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBtdWx0aXBsZSBlbGVtZW50c1xuICAgKiAgQHBhcmFtIHthcnJheX0gW2VsZW1lbnRBcnJheV0gQXJyYXkgb2YgZWxlbWVudHNcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyTXVsdGlwbGVFbGVtZW50cyhlbGVtZW50QXJyYXkpIHtcbiAgICBlbGVtZW50QXJyYXkuZm9yRWFjaChlbCA9PiB0aGlzLnJlZ2lzdGVyRWxlbWVudChlbCkpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtvYmplY3R9IFZpZXdlciBQcm9wZXJ0eSB2aWV3ZXIgY29tcG9uZW50XG4gICAqICBAcGFyYW0ge29iamVjdH0gRWRpdG9yIFByb3BlcnR5IGVkaXRvciBjb21wb25lbnRcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyUHJvcGVydHlUeXBlKHR5cGUsIFZpZXdlciwgRWRpdG9yKSB7XG4gICAgdGhpcy5wcm9wZXJ0eVR5cGVzW3R5cGVdID0ge3R5cGUsIFZpZXdlciwgRWRpdG9yfTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgbXVsdGlwbGUgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7YXJyYXl9IHByb3BlcnR5VHlwZUFycmF5IEFycmF5IG9mIHByb3BlcnRpZXNcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyTXVsdGlwbGVQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlQXJyYXkpIHtcbiAgICBwcm9wZXJ0eVR5cGVBcnJheS5mb3JFYWNoKGVsID0+IHRoaXMucmVnaXN0ZXJQcm9wZXJ0eVR5cGUoLi4uZWwpKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVmFsaWRhdGUgYW4gZWxlbWVudFxuICAgKiAgQHBhcmFtIHtvYmplY3R9IGpzb24gRWxlbWVudCdzIHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7P2Jvb2xlYW59XG4gICovXG4gIHZhbGlkYXRlRWxlbWVudChqc29uKSB7XG4gICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KCduYW1lJykpIHRocm93IG5ldyBFcnJvcignRWxlbWVudCBub3QgdmFsaWQnKTtcblxuICAgIGxldCBuYW1lID0ganNvbi5uYW1lO1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBwcm90b3R5cGVgKTtcblxuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgnaW5mbycpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgaW5mb2ApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCd0YWcnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHRhZ2ApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCdncm91cCcpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgZ3JvdXBgKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgnZGVzY3JpcHRpb24nKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGRlc2NyaXB0aW9uYCk7XG4gICAgaWYgKCFqc29uLmluZm8uaGFzT3duUHJvcGVydHkoJ2ltYWdlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBpbWFnZWApO1xuXG4gICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KCdyZW5kZXIyRCcpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcmVuZGVyMkQgaGFuZGxlcmApO1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncHJvcGVydGllcycpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcHJvcGVydGllc2ApO1xuXG4gICAgZm9yIChsZXQgcHJvcGVydHlOYW1lIGluIGpzb24ucHJvcGVydGllcykge1xuICAgICAgbGV0IHByb3BlcnR5Q29uZmlncyA9IGpzb24ucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgaWYgKCFwcm9wZXJ0eUNvbmZpZ3MuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0sIFByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBkb2Vzbid0IGhhdmUgdHlwZWApO1xuICAgICAgaWYgKCFwcm9wZXJ0eUNvbmZpZ3MuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSwgUHJvcGVydHkgJHtwcm9wZXJ0eU5hbWV9IGRvZXNuJ3QgaGF2ZSBkZWZhdWx0VmFsdWVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgY2F0YWxvZyBoYXMgZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWxlbWVudCdzIHR5cGVcbiAgICogIEByZXR1cm4ge2Jvb2xlYW59XG4gICovXG4gIGhhc0VsZW1lbnQodHlwZSkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmhhc093blByb3BlcnR5KHR5cGUpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGxhYmVsIExhYmVsIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge2FycmF5fSBbY2hpbGRzXSBDYXRlZ29yeSdzIGNoaWxkc1xuICAgKiAgQHJldHVybiB7P29iamVjdH0gUmVnaXN0ZXJlZCBjYXRlZ29yeVxuICAqL1xuICByZWdpc3RlckNhdGVnb3J5KG5hbWUsIGxhYmVsLCBjaGlsZHMpIHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUNhdGVnb3J5KG5hbWUsIGxhYmVsKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdID0ge25hbWUsIGxhYmVsLCBjYXRlZ29yaWVzOiBbXSwgZWxlbWVudHM6IFtdfTtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5yb290LmNhdGVnb3JpZXMucHVzaCh0aGlzLmNhdGVnb3JpZXNbbmFtZV0pO1xuXG4gICAgICBpZihjaGlsZHMgJiYgY2hpbGRzLmxlbmd0aCkge1xuICAgICAgICBjaGlsZHMuZm9yRWFjaCggZWwgPT4gdGhpcy5hZGRUb0NhdGVnb3J5KCBuYW1lLCBlbCApICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNhdGVnb3JpZXNbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBBZGQgYW4gZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge29iamVjdH0gY2hpbGQgRWxlbWVudCdzIHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7P3ZvaWR9XG4gICovXG4gIGFkZFRvQ2F0ZWdvcnkobmFtZSwgY2hpbGQpIHtcbiAgICBpZiAodGhpcy5oYXNFbGVtZW50KGNoaWxkLm5hbWUpKSB7XG4gICAgICB0aGlzLmNhdGVnb3JpZXNbbmFtZV0uZWxlbWVudHMucHVzaChjaGlsZCk7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5lbGVtZW50cy5zcGxpY2UodGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMuaW5kZXhPZihjaGlsZCksIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oYXNDYXRlZ29yeShjaGlsZC5uYW1lKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdLmNhdGVnb3JpZXMucHVzaChjaGlsZCk7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLnNwbGljZSh0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLmluZGV4T2YoY2hpbGQpLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjaGlsZCAke2NoaWxkfSBpcyBlaXRoZXIgY2F0ZWdvcnkgbm9yIGVsZW1lbnRgKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGNhdGVnb3J5IGNvbnRhaW4gZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5TmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gZWxlbWVudE5hbWUgTmFtZSBvZiBlbGVtZW50XG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBjYXRlZ29yeUhhc0VsZW1lbnQoY2F0ZWdvcnlOYW1lLCBlbGVtZW50TmFtZSkge1xuICAgIHJldHVybiB0aGlzLmhhc0NhdGVnb3J5KGNhdGVnb3J5TmFtZSkgJiYgdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5TmFtZV0uZWxlbWVudHMuc29tZShlbCA9PiBlbC5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZhbGlkYXRlIGEgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBMYWJlbCBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7P2Jvb2xlYW59XG4gICovXG4gIHZhbGlkYXRlQ2F0ZWdvcnkobmFtZSwgbGFiZWwpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIHVuZGVmaW5lZCBuYW1lJyk7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXRlZ29yeSBoYXMgZW1wdHkgbmFtZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNDYXRlZ29yeShuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXRlZ29yeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVmVyaWZ5IGlmIGNhdGFsb2cgYWxyZWFkeSBjb250YWluIGEgY2F0ZWdvcnkgd2l0aCBzcGVjaWZpZWQgbmFtZVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5TmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBoYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzLmhhc093blByb3BlcnR5KGNhdGVnb3J5TmFtZSk7XG4gIH1cblxufVxuIl19