/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/r3/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/r3/index.js": /*!*************************!*\ !*** ./src/r3/index.js ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var R3 = __webpack_require__(/*! ./r3.js */ "./src/r3/r3.js"); R3.System.Linking.start(); R3.System.Socket.start(); module.exports = R3; /***/ }), /***/ "./src/r3/r3-event.js": /*!****************************!*\ !*** ./src/r3/r3-event.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { 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 _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; } var Utils = __webpack_require__(/*! ./r3-utils */ "./src/r3/r3-utils.js"); var Event = /*#__PURE__*/function () { function Event() { _classCallCheck(this, Event); console.log('Event created'); } /** * Some nice Events handling * @type {{}} */ _createClass(Event, [{ key: "subscribe", value: /** * Subscribe to some events * @param eventName * @param callback */ function subscribe(eventName, callback) { return Event.Subscribe(eventName, callback.bind(this)); } }, { key: "emit", value: function emit(eventName, data, clientCallback, clientErrorCallback) { return Event.Emit(eventName, data, clientCallback, clientErrorCallback); } /** * Execute the functions which subscribe to this event, but don't process the client callback - the subscription function * should execute the client callback * @param eventId * @param data * @param clientCallback * @param clientErrorCallback * @returns {number} * @constructor */ }], [{ key: "Subscribe", value: function Subscribe(eventName, fn) { /** * Todo - maybe eventually store a boolean which indicates if the function has been executed */ var subscriptionId = Utils.RandomId(10); if (Event.Subscriptions.hasOwnProperty(eventName)) { if (Event.Subscriptions[eventName][subscriptionId]) { throw new Error('A component can only subscribe to a particular event ID once'); } Event.Subscriptions[eventName][subscriptionId] = fn; } else { Event.Subscriptions[eventName] = {}; Event.Subscriptions[eventName][subscriptionId] = fn; } /** * Return a handle to the caller to allow us to unsubscribe to this event */ return { fn: fn, remove: function (eventId, subscriptionId) { return function () { /** * Stop listening for this event from this component */ delete Event.Subscriptions[eventId][subscriptionId]; /** * If the length of listeners is 0, stop referencing this event * @type {string[]} */ var listeners = Object.keys(Event.Subscriptions[eventId]); if (listeners.length === 0) { delete Event.Subscriptions[eventId]; } }; }(eventName, subscriptionId), subscriptionId: subscriptionId }; } }, { key: "Emit", value: /** * Static Synchronous Event - Calls clientCallback directly after the event result is obtained * @param eventId * @param data * @param clientCallback is executed ideally when the event completed * @param clientErrorCallback * @returns {number} of callbacks executed * @constructor */ function Emit(eventId, data, clientCallback, clientErrorCallback) { if (Event.Subscriptions.hasOwnProperty(eventId)) { var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); subscriptionIds.map(function (subscriptionId) { try { var result = Event.Subscriptions[eventId][subscriptionId](data); if (clientCallback) { clientCallback(result); } } catch (error) { if (clientErrorCallback) { clientErrorCallback(error); } else { console.error(error); throw error; } } }); } } }, { key: "Async", value: function Async(eventId, data, clientCallback, clientErrorCallback) { if (Event.Subscriptions.hasOwnProperty(eventId)) { var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); subscriptionIds.map(function (subscriptionId) { try { Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback); } catch (error) { if (clientErrorCallback) { clientErrorCallback(error); } else { console.error(error); throw error; } } }); } } }]); return Event; }(); //EVENT_GENERATED_START _defineProperty(Event, "Subscriptions", {}); Event.OBJECT_CREATED = 0x1; //EVENT_GENERATED_END module.exports = Event; /***/ }), /***/ "./src/r3/r3-r3-object.js": /*!********************************!*\ !*** ./src/r3/r3-r3-object.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { 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 _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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { 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 { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], 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); } var Event = __webpack_require__(/*! ./r3-event */ "./src/r3/r3-event.js"); var R3Object = /*#__PURE__*/function (_Event) { _inherits(R3Object, _Event); var _super = _createSuper(R3Object); function R3Object() { var _this; _classCallCheck(this, R3Object); _this = _super.call(this); console.log('Object created'); _this.emit(Event.OBJECT_CREATED); return _this; } return R3Object; }(Event); module.exports = R3Object; /***/ }), /***/ "./src/r3/r3-system/index.js": /*!***********************************!*\ !*** ./src/r3/r3-system/index.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var System = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/r3-system.js"); var SystemLinking = __webpack_require__(/*! ./r3-system-linking */ "./src/r3/r3-system/r3-system-linking.js"); var SystemSocket = __webpack_require__(/*! ./r3-system-socket */ "./src/r3/r3-system/r3-system-socket.js"); module.exports = { System: System, SystemLinking: SystemLinking, SystemSocket: SystemSocket }; /***/ }), /***/ "./src/r3/r3-system/r3-system-linking.js": /*!***********************************************!*\ !*** ./src/r3/r3-system/r3-system-linking.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { 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 _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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { 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 { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], 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); } var System = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/r3-system.js"); var R3Object = __webpack_require__(/*! ../r3-r3-object */ "./src/r3/r3-r3-object.js"); var Event = __webpack_require__(/*! ../r3-event */ "./src/r3/r3-event.js"); var LinkingSystem = /*#__PURE__*/function (_System) { _inherits(LinkingSystem, _System); var _super = _createSuper(LinkingSystem); function LinkingSystem() { _classCallCheck(this, LinkingSystem); return _super.apply(this, arguments); } _createClass(LinkingSystem, null, [{ key: "start", value: function start() { _get(_getPrototypeOf(LinkingSystem), "start", this).call(this); console.log('starting linking system'); Event.Subscribe(Event.OBJECT_CREATED, function () { console.log('linking system discovered an object'); }); var object = new R3Object(); return true; } }]); return LinkingSystem; }(System); module.exports = LinkingSystem; /***/ }), /***/ "./src/r3/r3-system/r3-system-socket.js": /*!**********************************************!*\ !*** ./src/r3/r3-system/r3-system-socket.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { 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 _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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { 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 { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], 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); } var System = __webpack_require__(/*! ./r3-system.js */ "./src/r3/r3-system/r3-system.js"); var SocketSystem = /*#__PURE__*/function (_System) { _inherits(SocketSystem, _System); var _super = _createSuper(SocketSystem); function SocketSystem() { _classCallCheck(this, SocketSystem); return _super.apply(this, arguments); } _createClass(SocketSystem, null, [{ key: "start", value: function start() { _get(_getPrototypeOf(SocketSystem), "start", this).call(this); console.log('starting socket system'); return true; } }]); return SocketSystem; }(System); module.exports = SocketSystem; /***/ }), /***/ "./src/r3/r3-system/r3-system.js": /*!***************************************!*\ !*** ./src/r3/r3-system/r3-system.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { 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; } var System = /*#__PURE__*/function () { function System() { _classCallCheck(this, System); } _createClass(System, null, [{ key: "start", value: function start() { console.log('starting a system'); } }]); return System; }(); module.exports = System; /***/ }), /***/ "./src/r3/r3-utils.js": /*!****************************!*\ !*** ./src/r3/r3-utils.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports) { 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; } var Utils = /*#__PURE__*/function () { function Utils() { _classCallCheck(this, Utils); } /** * Gets the first parent of the object which is an instance of constructor * @param object * @param constructor * @returns {*} * @constructor */ _createClass(Utils, null, [{ key: "GetFirstParent", value: function GetFirstParent(object, constructor) { if (Utils.UndefinedOrNull(constructor)) { throw new Error('You need to specify a constructor'); } if (object.parent === null) { return null; } if (object.parent instanceof constructor) { return object.parent; } else { return Utils.GetFirstParent(object.parent, constructor); } } }, { key: "SyntaxHighlight", value: function SyntaxHighlight(json) { if (typeof json != 'string') { json = JSON.stringify(json, undefined, 2); } json = json.replace(/&/g, '&').replace(//g, '>'); return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { var cls = 'number'; if (/^"/.test(match)) { if (/:$/.test(match)) { cls = 'key'; } else { cls = 'string'; } } else if (/true|false/.test(match)) { cls = 'boolean'; } else if (/null/.test(match)) { cls = 'null'; } return '' + match + ''; }); } }, { key: "GetParentProject", value: function GetParentProject(component) { if (Utils.UndefinedOrNull(component.parent)) { throw new Error('Parent not found'); } if (component.parent instanceof R3.Project) { return component.parent; } return Utils.GetParentProject(component.parent); } }, { key: "GetParents", value: function GetParents(component, parents) { if (Utils.UndefinedOrNull(parents)) { parents = []; } if (Utils.UndefinedOrNull(component.parent)) { return parents; } parents.push(component.parent); return Utils.GetParents(component.parent, parents); } }, { key: "Instance", value: /** * @return {boolean} */ function Instance(component) { return Utils.Defined(component) && Utils.Defined(component.instance); } }, { key: "RemoveFromSelect", value: /** * Utils.RemoveFromSelect * @param select * @param id * @returns {boolean} * @constructor */ function RemoveFromSelect(select, id) { var i; for (i = 0; i < select.options.length; i++) { if (select.options[i].value === id) { select.remove(i); return true; } } return false; } }, { key: "SetSelectIndex", value: /** * Utils.GetSelectIndex * * Get the select index of given id * * @param select * @param id * @returns boolean true if successful * * @constructor */ function SetSelectIndex(select, id) { for (var _i = 0; _i < select.options.length; _i++) { if (select.options[_i].value === id) { select.selectedIndex = _i; return true; } } return false; } }, { key: "SortSelect", value: function SortSelect(select) { var tmp = []; var i; for (i = 1; i < select.options.length; i++) { tmp[i - 1] = []; tmp[i - 1][0] = select.options[i].text; tmp[i - 1][1] = select.options[i].value; } tmp.sort(); select.options = [select.options[0]]; for (i = 0; i < tmp.length; i++) { select.options[i + 1] = new Option(tmp[i][0], tmp[i][1]); } return; } }, { key: "GetParent", value: /** * Gets the parent of object whith property of optional type constructor. If index is specified, get the parent of the * object with property[index] - which means the property should be an array * @param object * @param property * @param index * @param constructor * @returns {*} * @constructor */ function GetParent(object, property, index, constructor) { if (Utils.UndefinedOrNull(constructor)) { constructor = null; } if (Utils.UndefinedOrNull(index)) { index = null; } if (object.parent) { /** * Parent defined */ if (object.parent.hasOwnProperty(property)) { if (constructor) { if (index) { if (object.parent[property][index] instanceof constructor) { return object.parent[property][index]; } else { if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } else { if (object.parent[property] instanceof constructor) { return object.parent[property]; } else { if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } } else { if (index) { return object.parent[property][index]; } else { return object.parent[property]; } } } else { /** * This parent does not have the property - go a level higher */ if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } else { /** * No parent defined */ console.warn('property : ' + property + ' of type ' + constructor + ' was not found in the parent chain'); return null; } } }, { key: "StripImageExtension", value: /** * Strips image extension from given path * @param imagePath * @constructor */ function StripImageExtension(imagePath) { return imagePath.replace(/(\.png$|\.gif$|\.jpeg$|\.jpg$)/, ''); } }, { key: "Unloaded", value: /** * Returns true if unloaded * @param component * @returns {boolean} * @constructor */ function Unloaded(component) { if (Utils.UndefinedOrNull(component) || Utils.UndefinedOrNull(component.instance)) { return true; } return false; } }, { key: "Loaded", value: /** * * @param component * @returns {boolean} * @constructor */ function Loaded(component) { if (component && component.instance) { return true; } return false; } }, { key: "BuildVectorSource", value: function BuildVectorSource(result, name, dimension) { if (dimension === 2) { result[name] = {}; result[name].x = false; result[name].y = false; return; } if (dimension === 3) { result[name] = {}; result[name].x = false; result[name].y = false; result[name].y = false; return; } if (dimension === 4) { result[name] = {}; result[name].x = false; result[name].y = false; result[name].z = false; result[name].w = false; return; } console.warn('unknown dimension : ' + dimension); } }, { key: "GetArrayInstances", value: /** * Returns all 'instances' of the array, or null if an 'instance' is undefined * @constructor * @param array */ function GetArrayInstances(array) { return array.reduce(function (result, object) { if (result === null) { return result; } if (Utils.UndefinedOrNull(object.instance)) { result = null; } else { result.push(object.instance); } return result; }, []); } }, { key: "SortFacesByMaterialIndex", value: function SortFacesByMaterialIndex(faces) { /** * Sorts faces according to material index because later we will create * groups for each vertice group */ faces.sort(function (a, b) { if (a.materialIndex < b.materialIndex) { return -1; } if (a.materialIndex > b.materialIndex) { return 1; } return 0; }); return faces; } }, { key: "BuildQuaternionSource", value: function BuildQuaternionSource(result, name) { result[name] = {}; result[name].axis = {}; result[name].axis.x = false; result[name].axis.y = false; result[name].axis.z = false; result[name].angle = false; result[name].x = false; result[name].y = false; result[name].z = false; result[name].w = false; } }, { key: "ObjectPropertiesAsBoolean", value: function ObjectPropertiesAsBoolean(object) { return Object.keys(object).reduce(function (result, propertyId) { if (typeof object[propertyId] === 'function') { return result; } result[propertyId] = false; // if (object[propertyId] instanceof R3.Vector2) { // Utils.BuildVectorSource(result, propertyId, 2); // } // // if (object[propertyId] instanceof R3.Vector3) { // Utils.BuildVectorSource(result, propertyId, 3); // } // // if (object[propertyId] instanceof R3.Vector4) { // Utils.BuildVectorSource(result, propertyId, 4); // } // // if (object[propertyId] instanceof R3.Quaternion) { // Utils.BuildQuaternionSource(result, propertyId); // } return result; }.bind(this), {}); } }, { key: "GetRuntime", value: function GetRuntime() { var result = null; R3.Event.Emit(R3.Event.GET_RUNTIME, null, function (runtime) { result = runtime; }); return result; } }, { key: "GetWindowSize", value: /** * Returns the window size or null * @returns {*} * @constructor */ function GetWindowSize() { var size = null; R3.Event.Emit(R3.Event.GET_WINDOW_SIZE, null, function (data) { size = data; }.bind(this)); return size; } }, { key: "UpdateWindowSize", value: /** * Convenience function to update object width and height members with window size * @param object * @constructor */ function UpdateWindowSize(object) { var size = Utils.GetWindowSize(); object.width = size.width; object.height = size.height; } }, { key: "ObjectIdWithNameInArray", value: /** * Returns id of object with the name if it exists in the array, otherwise null * @param name * @param array * @returns {*} * @constructor */ function ObjectIdWithNameInArray(name, array) { return array.reduce(function (result, object) { if (result) { return result; } if (name === object.name) { return object.id; } return null; }, null); } }, { key: "LoadIdsFromArrayToIdObject", value: function LoadIdsFromArrayToIdObject(array, idToObject) {} }, { key: "LoadIdsFromObjectToIdObject", value: function LoadIdsFromObjectToIdObject(object, idToObject) {} }, { key: "GetRandomInt", value: /** * Gets random int exclusive of maximum but inclusive of minimum * @param min * @param max * @returns {*} * @constructor */ function GetRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive } }, { key: "GetRandomIntInclusive", value: /** * Gets random int inclusive of minimum and maximum * @param min * @param max * @returns {*} * @constructor */ function GetRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive } }, { key: "InterpolateArray", value: function InterpolateArray(data, fitCount) { var linearInterpolate = function linearInterpolate(before, after, atPoint) { return before + (after - before) * atPoint; }; var newData = []; var springFactor = Number((data.length - 1) / (fitCount - 1)); newData[0] = data[0]; // for new allocation for (var _i2 = 1; _i2 < fitCount - 1; _i2++) { var tmp = _i2 * springFactor; var before = Number(Math.floor(tmp)).toFixed(); var after = Number(Math.ceil(tmp)).toFixed(); var atPoint = tmp - before; newData[_i2] = linearInterpolate(data[before], data[after], atPoint); } newData[fitCount - 1] = data[data.length - 1]; // for new allocation return newData; } }, { key: "UndefinedOrNull", value: /** * Undefined or null check * @param variable * @returns {boolean} * @constructor */ function UndefinedOrNull(variable) { return typeof variable === 'undefined' || variable === null; } }, { key: "Defined", value: /** * The variable is not undefined and not null * @param variable * @returns {boolean} * @constructor */ function Defined(variable) { return typeof variable !== 'undefined' && variable !== null; } }, { key: "GetParameters", value: /** * Gets function parameters * @param fn * @constructor */ function GetParameters(fn) { var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(_?)(.+?)\1\s*$/; var STRIP_COMMENTS = /(\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s*=[^,\)]*(('(?:\\'|[^'\r\n])*')|("(?:\\"|[^"\r\n])*"))|(\s*=[^,\)]*))/mg; var parameters, fnText, argDecl; if (typeof fn !== 'function') { parameters = []; fnText = fn.toString().replace(STRIP_COMMENTS, ''); argDecl = fnText.match(FN_ARGS); argDecl[1].split(FN_ARG_SPLIT).forEach(function (arg) { arg.replace(FN_ARG, function (all, underscore, name) { parameters.push(name); }); }); } else { throw Error("not a function"); } return parameters; } }, { key: "IdOrNull", value: /** * Returns either an ID of the object or Null * @param object * @returns {null} * @constructor */ function IdOrNull(object) { if (Utils.UndefinedOrNull(object)) { return null; } else { if (Utils.UndefinedOrNull(object.id)) { console.warn('saving an object reference with no ID : ', object); return null; } return object.id; } } }, { key: "LimitToPI", value: /** * Limit a property to values between -pi and +pi * @param property * @param objectProperty * @returns {{configurable?: boolean, enumerable?: boolean, value?, writable?: boolean, get?: Function, set?: Function}} * @constructor */ function LimitToPI(property, objectProperty) { var store = objectProperty; return { get: function get() { return store; }, set: function set(value) { while (value > Math.PI) { value -= Math.PI * 2; } while (value < -Math.PI) { value += Math.PI * 2; } store = value; } }; } }, { key: "IdArrayOrEmptyArray", value: /** * Returns an array of IDs representing the objects * @param array * @returns [] * @constructor */ function IdArrayOrEmptyArray(array) { if (Utils.UndefinedOrNull(array)) { return []; } else { return array.map(function (item) { if (Utils.UndefinedOrNull(item.id)) { throw new Error('No ID found while trying to store IDs to array'); } return item.id; }); } } }, { key: "Link", value: /** * Links an object to its parent through idToObject array * @param propertyString * @param idToObject * @param parentObject * @param id * @constructor */ function Link(propertyString, idToObject, parentObject, id) { if (!Utils.UndefinedOrNull(parentObject[propertyString])) { if (!idToObject.hasOwnProperty(id)) { console.warn('Linking failed for object:' + parentObject.name); } parentObject[propertyString] = idToObject[id]; } } }, { key: "RandomId", value: /** * Generates a random ID * @returns {string} * @constructor */ function RandomId(length) { if (Utils.UndefinedOrNull(length)) { length = 10; } return Math.random().toString(36).substr(2, length); } }, { key: "InvertWindingOrder", value: function InvertWindingOrder(triangles) { for (var _i3 = 0; _i3 < triangles.length; _i3++) { var v1 = triangles[_i3].v1; triangles[_i3].v1 = triangles[_i3].v2; triangles[_i3].v2 = v1; var backupUV = triangles[_i3].triangle.v1uv; triangles[_i3].triangle.v1uv = triangles[_i3].triangle.v2uv; triangles[_i3].triangle.v2uv = backupUV; } return triangles; } }, { key: "InvertMeshWindingOrder", value: /** * Inverts a mesh winding order (and its instance) * @param mesh R3.D3.Mesh * @returns {*} * @constructor */ function InvertMeshWindingOrder(mesh) { mesh.faces.forEach(function (face) { var tmpV1 = face.v1; face.v1 = face.v2; face.v2 = tmpV1; var tmpV1uv = face.v1uv; face.v1uv = face.v2uv; face.v2uv = tmpV1uv; }.bind(this)); //mesh.computeNormals = true; //mesh.createInstance(); } }, { key: "ResetWindingOrder", value: /** * This function resets a the winding order of a mesh from a reference point V (the average center of the mesh) */ function ResetWindingOrder(faces, vertices) { var vertexList = new R3.API.Vector3.Points(); for (var v = 0; v < vertices.length; v++) { vertexList.add(new R3.API.Vector3(vertices[v].position.x, vertices[v].position.y, vertices[v].position.z)); } var V = vertexList.average(); var triangles = []; for (var s = 0; s < faces.length; s += 3) { var v0 = faces[s]; var v1 = faces[s + 1]; var v2 = faces[s + 2]; triangles.push({ v0: v0, v1: v1, v2: v2, edges: [{ v0: v0, v1: v1 }, { v0: v1, v1: v2 }, { v0: v2, v1: v0 }], winding: 0, edgeIndex: -1, processed: false }); } for (var _i4 = 0; _i4 < triangles.length; _i4++) { if (R3.API.Vector3.clockwise(vertices[triangles[_i4].v0].position, vertices[triangles[_i4].v1].position, vertices[triangles[_i4].v2].position, V)) { console.log('clockwise'); var bv1 = triangles[_i4].v1; triangles[_i4].v1 = triangles[_i4].v2; triangles[_i4].v2 = bv1; } else { console.log('not clockwise'); } } return triangles; } }, { key: "FixWindingOrder", value: /** * This function resets the winding order for triangles in faces, given an initial triangle and orientation edge * used pseudocode from * http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh * We need to use a graph traversal algorithm, * lets assume we have method that returns neighbor of triangle on given edge * * neighbor_on_egde( next_tria, edge ) * * to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it * processed = set of processed triangles; initial empty * * while to_process is not empty: * next_tria, orientation_edge = to_process.pop() * add next_tria in processed * if next_tria is not opposite oriented than orientation_edge: * change next_tria (ABC) orientation (B<->C) * for each edge (AB) in next_tria: * neighbor_tria = neighbor_on_egde( next_tria, edge ) * if neighbor_tria exists and neighbor_tria not in processed: * to_process add (neighbor_tria, edge opposite oriented (BA)) * @param faces R3.D3.Face[] * @param orientationEdge R3.API.Vector2 * @returns {Array} */ function FixWindingOrder(faces, orientationEdge) { /** * Checks if a Face belonging to a TriangleEdge has already been processed * @param processed TriangleEdge[] * @param triangle Face * @returns {boolean} */ function inProcessed(processed, triangle) { for (var _i5 = 0; _i5 < processed.length; _i5++) { if (processed[_i5].triangle.equals(triangle)) { return true; } } return false; } /** * Returns a neighbouring triangle on a specific edge - preserving the edge orientation * @param edge R3.API.Vector2 * @param faces R3.D3.Face[] * @param currentTriangle * @returns {*} */ function neighbourOnEdge(edge, faces, currentTriangle) { for (var _i6 = 0; _i6 < faces.length; _i6++) { if (faces[_i6].v0 === edge.x && faces[_i6].v1 === edge.y || faces[_i6].v1 === edge.x && faces[_i6].v2 === edge.y || faces[_i6].v2 === edge.x && faces[_i6].v0 === edge.y || faces[_i6].v0 === edge.y && faces[_i6].v1 === edge.x || faces[_i6].v1 === edge.y && faces[_i6].v2 === edge.x || faces[_i6].v2 === edge.y && faces[_i6].v0 === edge.x) { var triangle = new R3.D3.API.Face(null, null, faces[_i6].v0index, faces[_i6].v1index, faces[_i6].v2index, faces[_i6].materialIndex, faces[_i6].uvs); if (triangle.equals(currentTriangle)) { continue; } return new R3.D3.TriangleEdge(triangle, edge); } } return null; } var toProcess = [new R3.D3.TriangleEdge(new R3.D3.API.Face(null, null, faces[0].v0index, faces[0].v1index, faces[0].v2index, faces[0].materialIndex, faces[0].uvs), orientationEdge)]; var processed = []; while (toProcess.length > 0) { var triangleEdge = toProcess.pop(); /** * If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed * to have the same winding order) */ if (triangleEdge.triangle.v0index === triangleEdge.edge.x && triangleEdge.triangle.v1index === triangleEdge.edge.y || triangleEdge.triangle.v1index === triangleEdge.edge.x && triangleEdge.triangle.v2index === triangleEdge.edge.y || triangleEdge.triangle.v2index === triangleEdge.edge.x && triangleEdge.triangle.v0index === triangleEdge.edge.y) { var backupV = triangleEdge.triangle.v1index; triangleEdge.triangle.v1index = triangleEdge.triangle.v2index; triangleEdge.triangle.v2index = backupV; // let backupUV = triangleEdge.triangle.v1uv; // triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv; // triangleEdge.triangle.v2uv = backupUV; // var backupUV = triangleEdge.triangle.uvs[0][1]; triangleEdge.triangle.uvs[0][1] = triangleEdge.triangle.uvs[0][2]; triangleEdge.triangle.uvs[0][2] = backupUV; } processed.push(triangleEdge); var edges = [new R3.API.Vector2(triangleEdge.triangle.v0index, triangleEdge.triangle.v1index), new R3.API.Vector2(triangleEdge.triangle.v1index, triangleEdge.triangle.v2index), new R3.API.Vector2(triangleEdge.triangle.v2index, triangleEdge.triangle.v0index)]; for (var j = 0; j < edges.length; j++) { var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle); if (neighbour && !inProcessed(processed, neighbour.triangle)) { toProcess.push(neighbour); } } } /** * In processed - we will have some duplicates - only add the unique ones * @type {Array} */ var triangles = []; for (var _i7 = 0; _i7 < processed.length; _i7++) { var found = false; for (var k = 0; k < triangles.length; k++) { if (triangles[k].equals(processed[_i7].triangle)) { found = true; break; } } if (!found) { triangles.push(processed[_i7].triangle); } } return triangles; } }, { key: "FixPolyZPlane", value: /** * This is a work-around function to fix polys which don't triangulate because * they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around * Z then Y axis * @param verticesFlat [] * @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY * @return [] */ function FixPolyZPlane(verticesFlat, grain) { if (verticesFlat.length % 3 !== 0 && !(verticesFlat.length > 9)) { console.log("The vertices are not in the right length : " + verticesFlat.length); } var vertices = []; var points = new R3.API.Quaternion.Points(); for (var _i8 = 0; _i8 < verticesFlat.length; _i8 += 3) { points.add(new R3.API.Vector3(verticesFlat[_i8], verticesFlat[_i8 + 1], verticesFlat[_i8 + 2])); } points.toOrigin(); points.maximizeXDistance(grain); points.maximizeYDistance(grain); for (i = 0; i < points.vectors.length; i++) { vertices.push([points.vectors[i].x, points.vectors[i].y]); } return vertices; } }, { key: "MovingAverage", value: function MovingAverage(period) { var nums = []; return function (num) { nums.push(num); if (nums.length > period) nums.splice(0, 1); // remove the first element of the array var sum = 0; for (var _i9 in nums) { sum += nums[_i9]; } var n = period; if (nums.length < period) n = nums.length; return sum / n; }; } }, { key: "Intersect", value: function Intersect(a, b) { var t; /** * Loop over shortest array */ if (b.length > a.length) { t = b; b = a; a = t; } return a.filter( /** * Check if exists * @param e * @returns {boolean} */ function (e) { return b.indexOf(e) > -1; }).filter( /** * Remove Duplicates * @param e * @param i * @param c * @returns {boolean} */ function (e, i, c) { return c.indexOf(e) === i; }); } }, { key: "Difference", value: function Difference(a, b) { var t; /** * Loop over shortest array */ if (b.length > a.length) { t = b; b = a; a = t; } return a.filter( /** * Check if exists * @param e * @returns {boolean} */ function (e) { return b.indexOf(e) === -1; }).filter( /** * Remove Duplicates * @param e * @param i * @param c * @returns {boolean} */ function (e, i, c) { return c.indexOf(e) === i; }); } }, { key: "PushUnique", value: /** * Push only if not in there already * @param array * @param object * @constructor */ function PushUnique(array, object) { if (array.indexOf(object) === -1) { array.push(object); } } }, { key: "IsEmpty", value: /** * Checks whether or not the object is empty * @param obj * @returns {boolean} * @constructor */ function IsEmpty(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object; } }, { key: "IsString", value: function IsString(member) { return typeof member === 'string'; } }, { key: "IsBoolean", value: function IsBoolean(member) { return member === true || member === false; } }, { key: "IsColor", value: function IsColor(member) { return member instanceof R3.Color; } }, { key: "IsNumber", value: function IsNumber(member) { return typeof member === 'number'; } }, { key: "IsVector2", value: function IsVector2(member) { return member instanceof R3.API.Vector2 || member instanceof R3.Vector2; } }, { key: "IsVector3", value: function IsVector3(member) { return member instanceof R3.API.Vector3 || member instanceof R3.Vector3; } }, { key: "IsVector4", value: function IsVector4(member) { return member instanceof R3.API.Vector4 || member instanceof R3.Vector4 || member instanceof R3.API.Quaternion || member instanceof R3.Quaternion; } }, { key: "IsObject", value: function IsObject(member) { var type = _typeof(member); return type === 'function' || type === 'object' && !!member; } }, { key: "LowerUnderscore", value: /** * @return {string} */ function LowerUnderscore(name) { var string = name.toLowerCase().replace(/\s+/g, '_'); string = string.replace(/-/g, '_'); string = string.replace(/\_+/g, '_'); return string; } }, { key: "UpperCaseWordsSpaces", value: function UpperCaseWordsSpaces(input) { var word = input.replace(/[-_]/g, ' '); word = word.replace(/\s+/, ' '); var words = word.split(' '); return words.reduce(function (result, word) { result += word[0].toUpperCase() + word.substr(1); return result + ' '; }, '').trim(); } }, { key: "UpperCaseUnderscore", value: /** * @return {string} */ function UpperCaseUnderscore(word) { var str = ''; word.split('').map(function (letter) { if (letter == letter.toUpperCase()) { str += '_' + letter; } else { str += letter.toUpperCase(); } }); str = str.replace(new RegExp('^_'), ''); return str; } }, { key: "PaddedText", value: /** * Returns Left Padded Text - ex. length 5, padchar 0, string abc = '00abc' * @param length * @param padChar * @param string * @returns {string} * @constructor */ function PaddedText(length, padChar, string) { var pad = ""; for (var x = 0; x < length; x++) { pad += padChar; } return pad.substring(0, pad.length - string.length) + string; } }]); return Utils; }(); module.exports = Utils; /***/ }), /***/ "./src/r3/r3.js": /*!**********************!*\ !*** ./src/r3/r3.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { 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; } var _require = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/index.js"), System = _require.System, SystemLinking = _require.SystemLinking, SystemSocket = _require.SystemSocket; var R3Object = __webpack_require__(/*! ./r3-r3-object */ "./src/r3/r3-r3-object.js"); var R3 = /*#__PURE__*/function () { function R3() { _classCallCheck(this, R3); } _createClass(R3, null, [{ key: "version", value: function version() { return 'Fri Jun 18 2021 11:52:07 GMT+0000 (Coordinated Universal Time)'; } }]); return R3; }(); R3.R3Object = R3Object; R3.System = System; R3.System.Linking = SystemLinking; R3.System.Socket = SystemSocket; module.exports = R3; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1ldmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtcjMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1zeXN0ZW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0tbGlua2luZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtc3lzdGVtL3IzLXN5c3RlbS1zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXV0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy5qcyJdLCJuYW1lcyI6WyJSMyIsInJlcXVpcmUiLCJTeXN0ZW0iLCJMaW5raW5nIiwic3RhcnQiLCJTb2NrZXQiLCJtb2R1bGUiLCJleHBvcnRzIiwiVXRpbHMiLCJFdmVudCIsImNvbnNvbGUiLCJsb2ciLCJldmVudE5hbWUiLCJjYWxsYmFjayIsIlN1YnNjcmliZSIsImJpbmQiLCJkYXRhIiwiY2xpZW50Q2FsbGJhY2siLCJjbGllbnRFcnJvckNhbGxiYWNrIiwiRW1pdCIsImZuIiwic3Vic2NyaXB0aW9uSWQiLCJSYW5kb21JZCIsIlN1YnNjcmlwdGlvbnMiLCJoYXNPd25Qcm9wZXJ0eSIsIkVycm9yIiwicmVtb3ZlIiwiZXZlbnRJZCIsImxpc3RlbmVycyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJzdWJzY3JpcHRpb25JZHMiLCJtYXAiLCJyZXN1bHQiLCJlcnJvciIsIk9CSkVDVF9DUkVBVEVEIiwiUjNPYmplY3QiLCJlbWl0IiwiU3lzdGVtTGlua2luZyIsIlN5c3RlbVNvY2tldCIsIkxpbmtpbmdTeXN0ZW0iLCJvYmplY3QiLCJTb2NrZXRTeXN0ZW0iLCJjb25zdHJ1Y3RvciIsIlVuZGVmaW5lZE9yTnVsbCIsInBhcmVudCIsIkdldEZpcnN0UGFyZW50IiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwibWF0Y2giLCJjbHMiLCJ0ZXN0IiwiY29tcG9uZW50IiwiUHJvamVjdCIsIkdldFBhcmVudFByb2plY3QiLCJwYXJlbnRzIiwicHVzaCIsIkdldFBhcmVudHMiLCJEZWZpbmVkIiwiaW5zdGFuY2UiLCJzZWxlY3QiLCJpZCIsImkiLCJvcHRpb25zIiwidmFsdWUiLCJzZWxlY3RlZEluZGV4IiwidG1wIiwidGV4dCIsInNvcnQiLCJPcHRpb24iLCJwcm9wZXJ0eSIsImluZGV4IiwiZ2V0UGFyZW50Iiwid2FybiIsImltYWdlUGF0aCIsIm5hbWUiLCJkaW1lbnNpb24iLCJ4IiwieSIsInoiLCJ3IiwiYXJyYXkiLCJyZWR1Y2UiLCJmYWNlcyIsImEiLCJiIiwibWF0ZXJpYWxJbmRleCIsImF4aXMiLCJhbmdsZSIsInByb3BlcnR5SWQiLCJHRVRfUlVOVElNRSIsInJ1bnRpbWUiLCJzaXplIiwiR0VUX1dJTkRPV19TSVpFIiwiR2V0V2luZG93U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiaWRUb09iamVjdCIsIm1pbiIsIm1heCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJmaXRDb3VudCIsImxpbmVhckludGVycG9sYXRlIiwiYmVmb3JlIiwiYWZ0ZXIiLCJhdFBvaW50IiwibmV3RGF0YSIsInNwcmluZ0ZhY3RvciIsIk51bWJlciIsInRvRml4ZWQiLCJ2YXJpYWJsZSIsIkZOX0FSR1MiLCJGTl9BUkdfU1BMSVQiLCJGTl9BUkciLCJTVFJJUF9DT01NRU5UUyIsInBhcmFtZXRlcnMiLCJmblRleHQiLCJhcmdEZWNsIiwidG9TdHJpbmciLCJzcGxpdCIsImZvckVhY2giLCJhcmciLCJhbGwiLCJ1bmRlcnNjb3JlIiwib2JqZWN0UHJvcGVydHkiLCJzdG9yZSIsImdldCIsInNldCIsIlBJIiwiaXRlbSIsInByb3BlcnR5U3RyaW5nIiwicGFyZW50T2JqZWN0Iiwic3Vic3RyIiwidHJpYW5nbGVzIiwidjEiLCJ2MiIsImJhY2t1cFVWIiwidHJpYW5nbGUiLCJ2MXV2IiwidjJ1diIsIm1lc2giLCJmYWNlIiwidG1wVjEiLCJ0bXBWMXV2IiwidmVydGljZXMiLCJ2ZXJ0ZXhMaXN0IiwiQVBJIiwiVmVjdG9yMyIsIlBvaW50cyIsInYiLCJhZGQiLCJwb3NpdGlvbiIsIlYiLCJhdmVyYWdlIiwicyIsInYwIiwiZWRnZXMiLCJ3aW5kaW5nIiwiZWRnZUluZGV4IiwicHJvY2Vzc2VkIiwiY2xvY2t3aXNlIiwiYnYxIiwib3JpZW50YXRpb25FZGdlIiwiaW5Qcm9jZXNzZWQiLCJlcXVhbHMiLCJuZWlnaGJvdXJPbkVkZ2UiLCJlZGdlIiwiY3VycmVudFRyaWFuZ2xlIiwiRDMiLCJGYWNlIiwidjBpbmRleCIsInYxaW5kZXgiLCJ2MmluZGV4IiwidXZzIiwiVHJpYW5nbGVFZGdlIiwidG9Qcm9jZXNzIiwidHJpYW5nbGVFZGdlIiwicG9wIiwiYmFja3VwViIsIlZlY3RvcjIiLCJqIiwibmVpZ2hib3VyIiwiZm91bmQiLCJrIiwidmVydGljZXNGbGF0IiwiZ3JhaW4iLCJwb2ludHMiLCJRdWF0ZXJuaW9uIiwidG9PcmlnaW4iLCJtYXhpbWl6ZVhEaXN0YW5jZSIsIm1heGltaXplWURpc3RhbmNlIiwidmVjdG9ycyIsInBlcmlvZCIsIm51bXMiLCJudW0iLCJzcGxpY2UiLCJzdW0iLCJuIiwidCIsImZpbHRlciIsImUiLCJpbmRleE9mIiwiYyIsIm9iaiIsIm1lbWJlciIsIkNvbG9yIiwiVmVjdG9yNCIsInR5cGUiLCJzdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImlucHV0Iiwid29yZCIsIndvcmRzIiwidG9VcHBlckNhc2UiLCJ0cmltIiwic3RyIiwibGV0dGVyIiwiUmVnRXhwIiwicGFkQ2hhciIsInBhZCIsInN1YnN0cmluZyJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtR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Q0MsT0FBUCxHQUFpQlAsRUFBakIsQyIsImZpbGUiOiJyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3IzL2luZGV4LmpzXCIpO1xuIiwiY29uc3QgUjMgPSByZXF1aXJlKCcuL3IzLmpzJyk7XG5cblIzLlN5c3RlbS5MaW5raW5nLnN0YXJ0KCk7XG5SMy5TeXN0ZW0uU29ja2V0LnN0YXJ0KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUjM7XG4iLCJjb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vcjMtdXRpbHMnKTtcblxuY2xhc3MgRXZlbnQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnNvbGUubG9nKCdFdmVudCBjcmVhdGVkJyk7XG5cdH1cblxuXHQvKipcblx0ICogU29tZSBuaWNlIEV2ZW50cyBoYW5kbGluZ1xuXHQgKiBAdHlwZSB7e319XG5cdCAqL1xuXHRzdGF0aWMgU3Vic2NyaXB0aW9ucyA9IHt9O1xuXG5cdHN0YXRpYyBTdWJzY3JpYmUoXG5cdFx0ZXZlbnROYW1lLFxuXHRcdGZuXG5cdCkge1xuXHRcdC8qKlxuXHRcdCAqIFRvZG8gLSBtYXliZSBldmVudHVhbGx5IHN0b3JlIGEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdFx0ICovXG5cdFx0bGV0IHN1YnNjcmlwdGlvbklkID0gVXRpbHMuUmFuZG9tSWQoMTApO1xuXG5cdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuXG5cdFx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdW3N1YnNjcmlwdGlvbklkXSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0EgY29tcG9uZW50IGNhbiBvbmx5IHN1YnNjcmliZSB0byBhIHBhcnRpY3VsYXIgZXZlbnQgSUQgb25jZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdID0gZm47XG5cdFx0fSBlbHNlIHtcblx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXSA9IHt9O1xuXHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdW3N1YnNjcmlwdGlvbklkXSA9IGZuO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIGhhbmRsZSB0byB0aGUgY2FsbGVyIHRvIGFsbG93IHVzIHRvIHVuc3Vic2NyaWJlIHRvIHRoaXMgZXZlbnRcblx0XHQgKi9cblx0XHRyZXR1cm4ge1xuXHRcdFx0Zm46IGZuLFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiAoZXZlbnRJZCwgc3Vic2NyaXB0aW9uSWQpIHtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU3RvcCBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQgZnJvbSB0aGlzIGNvbXBvbmVudFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGRlbGV0ZSBFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdW3N1YnNjcmlwdGlvbklkXTtcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIElmIHRoZSBsZW5ndGggb2YgbGlzdGVuZXJzIGlzIDAsIHN0b3AgcmVmZXJlbmNpbmcgdGhpcyBldmVudFxuXHRcdFx0XHRcdCAqIEB0eXBlIHtzdHJpbmdbXX1cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRsZXQgbGlzdGVuZXJzID0gT2JqZWN0LmtleXMoRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXSk7XG5cdFx0XHRcdFx0aWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9KGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9uSWQpLFxuXHRcdFx0c3Vic2NyaXB0aW9uSWQgOiBzdWJzY3JpcHRpb25JZFxuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIFN1YnNjcmliZSB0byBzb21lIGV2ZW50c1xuXHQgKiBAcGFyYW0gZXZlbnROYW1lXG5cdCAqIEBwYXJhbSBjYWxsYmFja1xuXHQgKi9cblx0c3Vic2NyaWJlKFxuXHRcdGV2ZW50TmFtZSxcblx0XHRjYWxsYmFja1xuXHQpIHtcblx0XHRyZXR1cm4gRXZlbnQuU3Vic2NyaWJlKGV2ZW50TmFtZSwgY2FsbGJhY2suYmluZCh0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFN0YXRpYyBTeW5jaHJvbm91cyBFdmVudCAtIENhbGxzIGNsaWVudENhbGxiYWNrIGRpcmVjdGx5IGFmdGVyIHRoZSBldmVudCByZXN1bHQgaXMgb2J0YWluZWRcblx0ICogQHBhcmFtIGV2ZW50SWRcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHBhcmFtIGNsaWVudENhbGxiYWNrIGlzIGV4ZWN1dGVkIGlkZWFsbHkgd2hlbiB0aGUgZXZlbnQgY29tcGxldGVkXG5cdCAqIEBwYXJhbSBjbGllbnRFcnJvckNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IG9mIGNhbGxiYWNrcyBleGVjdXRlZFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBFbWl0KFxuXHRcdGV2ZW50SWQsXG5cdFx0ZGF0YSxcblx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdCkge1xuXHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zLmhhc093blByb3BlcnR5KGV2ZW50SWQpKSB7XG5cblx0XHRcdGxldCBzdWJzY3JpcHRpb25JZHMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblxuXHRcdFx0c3Vic2NyaXB0aW9uSWRzLm1hcChcblx0XHRcdFx0ZnVuY3Rpb24oc3Vic2NyaXB0aW9uSWQpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0bGV0IHJlc3VsdCA9IEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF1bc3Vic2NyaXB0aW9uSWRdKGRhdGEpO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50Q2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0Y2xpZW50Q2FsbGJhY2socmVzdWx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0aWYgKGNsaWVudEVycm9yQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0Y2xpZW50RXJyb3JDYWxsYmFjayhlcnJvcik7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0fVxuXHR9XG5cblx0ZW1pdChcblx0XHRldmVudE5hbWUsXG5cdFx0ZGF0YSxcblx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdCkge1xuXHRcdHJldHVybiBFdmVudC5FbWl0KFxuXHRcdFx0ZXZlbnROYW1lLFxuXHRcdFx0ZGF0YSxcblx0XHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdFx0Y2xpZW50RXJyb3JDYWxsYmFja1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgZnVuY3Rpb25zIHdoaWNoIHN1YnNjcmliZSB0byB0aGlzIGV2ZW50LCBidXQgZG9uJ3QgcHJvY2VzcyB0aGUgY2xpZW50IGNhbGxiYWNrIC0gdGhlIHN1YnNjcmlwdGlvbiBmdW5jdGlvblxuXHQgKiBzaG91bGQgZXhlY3V0ZSB0aGUgY2xpZW50IGNhbGxiYWNrXG5cdCAqIEBwYXJhbSBldmVudElkXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEBwYXJhbSBjbGllbnRDYWxsYmFja1xuXHQgKiBAcGFyYW0gY2xpZW50RXJyb3JDYWxsYmFja1xuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBBc3luYyhcblx0XHRldmVudElkLFxuXHRcdGRhdGEsXG5cdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0Y2xpZW50RXJyb3JDYWxsYmFja1xuXHQpIHtcblx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShldmVudElkKSkge1xuXG5cdFx0XHRsZXQgc3Vic2NyaXB0aW9uSWRzID0gT2JqZWN0LmtleXMoRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXSk7XG5cblx0XHRcdHN1YnNjcmlwdGlvbklkcy5tYXAoXG5cdFx0XHRcdGZ1bmN0aW9uKHN1YnNjcmlwdGlvbklkKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF1bc3Vic2NyaXB0aW9uSWRdKGRhdGEsIGNsaWVudENhbGxiYWNrLCBjbGllbnRFcnJvckNhbGxiYWNrKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0aWYgKGNsaWVudEVycm9yQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0Y2xpZW50RXJyb3JDYWxsYmFjayhlcnJvcik7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0fVxuXHR9O1xuXG59XG5cbi8vRVZFTlRfR0VORVJBVEVEX1NUQVJUXG5FdmVudC5PQkpFQ1RfQ1JFQVRFRCA9IDB4MTtcbi8vRVZFTlRfR0VORVJBVEVEX0VORFxuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50O1xuIiwiY29uc3QgRXZlbnQgPSByZXF1aXJlKCcuL3IzLWV2ZW50Jyk7XG5cbmNsYXNzIFIzT2JqZWN0IGV4dGVuZHMgRXZlbnQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdGNvbnNvbGUubG9nKCdPYmplY3QgY3JlYXRlZCcpO1xuXG5cdFx0dGhpcy5lbWl0KEV2ZW50Lk9CSkVDVF9DUkVBVEVEKTtcblxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSM09iamVjdDsiLCJjb25zdCBTeXN0ZW0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgU3lzdGVtTGlua2luZyA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLWxpbmtpbmcnKTtcbmNvbnN0IFN5c3RlbVNvY2tldCA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLXNvY2tldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3lzdGVtLFxuICBTeXN0ZW1MaW5raW5nLFxuICBTeXN0ZW1Tb2NrZXRcbn0iLCJjb25zdCBTeXN0ZW0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgUjNPYmplY3QgPSByZXF1aXJlKCcuLi9yMy1yMy1vYmplY3QnKTtcbmNvbnN0IEV2ZW50ID0gcmVxdWlyZSgnLi4vcjMtZXZlbnQnKTtcblxuY2xhc3MgTGlua2luZ1N5c3RlbSBleHRlbmRzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXG5cdFx0c3VwZXIuc3RhcnQoKTtcblx0XHRcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgbGlua2luZyBzeXN0ZW0nKTtcblxuXHRcdEV2ZW50LlN1YnNjcmliZShcblx0XHRcdEV2ZW50Lk9CSkVDVF9DUkVBVEVELFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmxvZygnbGlua2luZyBzeXN0ZW0gZGlzY292ZXJlZCBhbiBvYmplY3QnKTtcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0bGV0IG9iamVjdCA9IG5ldyBSM09iamVjdCgpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVx0XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaW5raW5nU3lzdGVtO1xuIiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0uanMnKTtcblxuY2xhc3MgU29ja2V0U3lzdGVtIGV4dGVuZHMgU3lzdGVtIHtcblxuXHRzdGF0aWMgc3RhcnQoKSB7XG5cblx0XHRzdXBlci5zdGFydCgpO1xuXHRcdFxuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBzb2NrZXQgc3lzdGVtJyk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XHRcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNvY2tldFN5c3RlbTsiLCJjbGFzcyBTeXN0ZW0ge1xuXG5cdHN0YXRpYyBzdGFydCgpIHtcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgYSBzeXN0ZW0nKTtcdFxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTeXN0ZW07XG4iLCJjbGFzcyBVdGlscyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgdGhlIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBwYXJhbSBjb25zdHJ1Y3RvclxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0Rmlyc3RQYXJlbnQob2JqZWN0LCBjb25zdHJ1Y3Rvcikge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb25zdHJ1Y3RvcikpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc3BlY2lmeSBhIGNvbnN0cnVjdG9yJyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvYmplY3QucGFyZW50IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcblx0XHRcdHJldHVybiBvYmplY3QucGFyZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gVXRpbHMuR2V0Rmlyc3RQYXJlbnQob2JqZWN0LnBhcmVudCwgY29uc3RydWN0b3IpO1xuXHRcdH1cblxuXHR9O1xuXG5cdHN0YXRpYyBTeW50YXhIaWdobGlnaHQoanNvbikge1xuXHRcdGlmICh0eXBlb2YganNvbiAhPSAnc3RyaW5nJykge1xuXHRcdFx0anNvbiA9IEpTT04uc3RyaW5naWZ5KGpzb24sIHVuZGVmaW5lZCwgMik7XG5cdFx0fVxuXHRcdGpzb24gPSBqc29uLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0XHRyZXR1cm4ganNvbi5yZXBsYWNlKC8oXCIoXFxcXHVbYS16QS1aMC05XXs0fXxcXFxcW151XXxbXlxcXFxcIl0pKlwiKFxccyo6KT98XFxiKHRydWV8ZmFsc2V8bnVsbClcXGJ8LT9cXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQrKT8pL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdFx0bGV0IGNscyA9ICdudW1iZXInO1xuXHRcdFx0aWYgKC9eXCIvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGlmICgvOiQvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdFx0Y2xzID0gJ2tleSc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2xzID0gJ3N0cmluZyc7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoL3RydWV8ZmFsc2UvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGNscyA9ICdib29sZWFuJztcblx0XHRcdH0gZWxzZSBpZiAoL251bGwvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGNscyA9ICdudWxsJztcblx0XHRcdH1cblx0XHRcdHJldHVybiAnPHNwYW4gY2xhc3M9XCInICsgY2xzICsgJ1wiPicgKyBtYXRjaCArICc8L3NwYW4+Jztcblx0XHR9KTtcblx0fTtcblxuXHRzdGF0aWMgR2V0UGFyZW50UHJvamVjdChjb21wb25lbnQpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoY29tcG9uZW50LnBhcmVudCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignUGFyZW50IG5vdCBmb3VuZCcpO1xuXHRcdH1cblxuXHRcdGlmIChjb21wb25lbnQucGFyZW50IGluc3RhbmNlb2YgUjMuUHJvamVjdCkge1xuXHRcdFx0cmV0dXJuIGNvbXBvbmVudC5wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFV0aWxzLkdldFBhcmVudFByb2plY3QoY29tcG9uZW50LnBhcmVudCk7XG5cdH07XG5cblx0c3RhdGljIEdldFBhcmVudHMoY29tcG9uZW50LCBwYXJlbnRzKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKHBhcmVudHMpKSB7XG5cdFx0XHRwYXJlbnRzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQucGFyZW50KSkge1xuXHRcdFx0cmV0dXJuIHBhcmVudHM7XG5cdFx0fVxuXG5cdFx0cGFyZW50cy5wdXNoKGNvbXBvbmVudC5wYXJlbnQpO1xuXG5cdFx0cmV0dXJuIFV0aWxzLkdldFBhcmVudHMoY29tcG9uZW50LnBhcmVudCwgcGFyZW50cyk7XG5cblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdHN0YXRpYyBJbnN0YW5jZShjb21wb25lbnQpIHtcblx0XHRyZXR1cm4gVXRpbHMuRGVmaW5lZChjb21wb25lbnQpICYmIFV0aWxzLkRlZmluZWQoY29tcG9uZW50Lmluc3RhbmNlKTtcblx0fTtcblxuXHQvKipcblx0ICogVXRpbHMuUmVtb3ZlRnJvbVNlbGVjdFxuXHQgKiBAcGFyYW0gc2VsZWN0XG5cdCAqIEBwYXJhbSBpZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgUmVtb3ZlRnJvbVNlbGVjdChzZWxlY3QsIGlkKSB7XG5cblx0XHRsZXQgaTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlID09PSBpZCkge1xuXHRcdFx0XHRzZWxlY3QucmVtb3ZlKGkpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVdGlscy5HZXRTZWxlY3RJbmRleFxuXHQgKlxuXHQgKiBHZXQgdGhlIHNlbGVjdCBpbmRleCBvZiBnaXZlbiBpZFxuXHQgKlxuXHQgKiBAcGFyYW0gc2VsZWN0XG5cdCAqIEBwYXJhbSBpZFxuXHQgKiBAcmV0dXJucyBib29sZWFuIHRydWUgaWYgc3VjY2Vzc2Z1bFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBTZXRTZWxlY3RJbmRleChzZWxlY3QsIGlkKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlID09PSBpZCkge1xuXHRcdFx0XHRzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0c3RhdGljIFNvcnRTZWxlY3Qoc2VsZWN0KSB7XG5cblx0XHRsZXQgdG1wID0gW107XG5cdFx0bGV0IGk7XG5cblx0XHRmb3IgKGkgPSAxOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRtcFtpLTFdID0gW107XG5cdFx0XHR0bXBbaS0xXVswXSA9IHNlbGVjdC5vcHRpb25zW2ldLnRleHQ7XG5cdFx0XHR0bXBbaS0xXVsxXSA9IHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlO1xuXHRcdH1cblxuXHRcdHRtcC5zb3J0KCk7XG5cblx0XHRzZWxlY3Qub3B0aW9ucyA9IFtzZWxlY3Qub3B0aW9uc1swXV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzZWxlY3Qub3B0aW9uc1tpKzFdID0gbmV3IE9wdGlvbih0bXBbaV1bMF0sIHRtcFtpXVsxXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwYXJlbnQgb2Ygb2JqZWN0IHdoaXRoIHByb3BlcnR5IG9mIG9wdGlvbmFsIHR5cGUgY29uc3RydWN0b3IuIElmIGluZGV4IGlzIHNwZWNpZmllZCwgZ2V0IHRoZSBwYXJlbnQgb2YgdGhlXG5cdCAqIG9iamVjdCB3aXRoIHByb3BlcnR5W2luZGV4XSAtIHdoaWNoIG1lYW5zIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXlcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAcGFyYW0gcHJvcGVydHlcblx0ICogQHBhcmFtIGluZGV4XG5cdCAqIEBwYXJhbSBjb25zdHJ1Y3RvclxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UGFyZW50KG9iamVjdCwgcHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcikge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb25zdHJ1Y3RvcikpIHtcblx0XHRcdGNvbnN0cnVjdG9yID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGluZGV4KSkge1xuXHRcdFx0aW5kZXggPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvYmplY3QucGFyZW50KSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFBhcmVudCBkZWZpbmVkXG5cdFx0XHQgKi9cblx0XHRcdGlmIChvYmplY3QucGFyZW50Lmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuXG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvcikge1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4KSB7XG5cblx0XHRcdFx0XHRcdGlmIChvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF0gaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV1baW5kZXhdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50KHByb3BlcnR5LCBpbmRleCwgY29uc3RydWN0b3IpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignZ2V0UGFyZW50IG5vdCBkZWZpbmVkIG9uIEFQSSBvYmplY3QgOiAnICsgb2JqZWN0LnBhcmVudCArICcgLSB5b3Ugc2hvdWxkIGF2b2lkIGhhdmluZyB0aGVzZSBtZXNzc2FnZXMnKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChvYmplY3QucGFyZW50W3Byb3BlcnR5XSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QucGFyZW50LmdldFBhcmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50LmdldFBhcmVudChwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ2dldFBhcmVudCBub3QgZGVmaW5lZCBvbiBBUEkgb2JqZWN0IDogJyArIG9iamVjdC5wYXJlbnQgKyAnIC0geW91IHNob3VsZCBhdm9pZCBoYXZpbmcgdGhlc2UgbWVzc3NhZ2VzJyk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV1baW5kZXhdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoaXMgcGFyZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlcnR5IC0gZ28gYSBsZXZlbCBoaWdoZXJcblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQocHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdnZXRQYXJlbnQgbm90IGRlZmluZWQgb24gQVBJIG9iamVjdCA6ICcgKyBvYmplY3QucGFyZW50ICsgJyAtIHlvdSBzaG91bGQgYXZvaWQgaGF2aW5nIHRoZXNlIG1lc3NzYWdlcycpO1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBObyBwYXJlbnQgZGVmaW5lZFxuXHRcdFx0ICovXG5cdFx0XHRjb25zb2xlLndhcm4oJ3Byb3BlcnR5IDogJyArIHByb3BlcnR5ICsgJyBvZiB0eXBlICcgKyBjb25zdHJ1Y3RvciArICcgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IGNoYWluJyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBTdHJpcHMgaW1hZ2UgZXh0ZW5zaW9uIGZyb20gZ2l2ZW4gcGF0aFxuXHQgKiBAcGFyYW0gaW1hZ2VQYXRoXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFN0cmlwSW1hZ2VFeHRlbnNpb24oaW1hZ2VQYXRoKSB7XG5cdFx0cmV0dXJuIGltYWdlUGF0aC5yZXBsYWNlKC8oXFwucG5nJHxcXC5naWYkfFxcLmpwZWckfFxcLmpwZyQpLywnJylcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIHVubG9hZGVkXG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFVubG9hZGVkKGNvbXBvbmVudCkge1xuXHRcdGlmIChcblx0XHRcdFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQpIHx8XG5cdFx0XHRVdGlscy5VbmRlZmluZWRPck51bGwoY29tcG9uZW50Lmluc3RhbmNlKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBMb2FkZWQoY29tcG9uZW50KSB7XG5cdFx0aWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBuYW1lLCBkaW1lbnNpb24pIHtcblxuXHRcdGlmIChkaW1lbnNpb24gPT09IDIpIHtcblx0XHRcdHJlc3VsdFtuYW1lXSA9IHt9O1xuXHRcdFx0cmVzdWx0W25hbWVdLnggPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS55ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gMykge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS55ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gNCkge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS56ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0udyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnNvbGUud2FybigndW5rbm93biBkaW1lbnNpb24gOiAnICsgZGltZW5zaW9uKTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgJ2luc3RhbmNlcycgb2YgdGhlIGFycmF5LCBvciBudWxsIGlmIGFuICdpbnN0YW5jZScgaXMgdW5kZWZpbmVkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICovXG5cdHN0YXRpYyBHZXRBcnJheUluc3RhbmNlcyhhcnJheSkge1xuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoXG5cdFx0XHRmdW5jdGlvbihyZXN1bHQsIG9iamVjdCkge1xuXG5cdFx0XHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QuaW5zdGFuY2UpKSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gbnVsbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChvYmplY3QuaW5zdGFuY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIFNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleChmYWNlcykge1xuXG5cdFx0LyoqXG5cdFx0ICogU29ydHMgZmFjZXMgYWNjb3JkaW5nIHRvIG1hdGVyaWFsIGluZGV4IGJlY2F1c2UgbGF0ZXIgd2Ugd2lsbCBjcmVhdGVcblx0XHQgKiBncm91cHMgZm9yIGVhY2ggdmVydGljZSBncm91cFxuXHRcdCAqL1xuXHRcdGZhY2VzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXG5cdFx0XHRpZiAoYS5tYXRlcmlhbEluZGV4IDwgYi5tYXRlcmlhbEluZGV4KSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGEubWF0ZXJpYWxJbmRleCA+IGIubWF0ZXJpYWxJbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZmFjZXM7XG5cdH07XG5cblx0c3RhdGljIEJ1aWxkUXVhdGVybmlvblNvdXJjZShyZXN1bHQsIG5hbWUpIHtcblx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcyA9IHt9O1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzLnggPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcy55ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLmF4aXMueiA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS5hbmdsZSA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0ueiA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS53ID0gZmFsc2U7XG5cdH07XG5cblx0c3RhdGljIE9iamVjdFByb3BlcnRpZXNBc0Jvb2xlYW4ob2JqZWN0KSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCBwcm9wZXJ0eUlkKSB7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3RbcHJvcGVydHlJZF0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5SWRdID0gZmFsc2U7XG5cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjIpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgMik7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjMpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgMyk7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjQpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgNCk7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlF1YXRlcm5pb24pIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkUXVhdGVybmlvblNvdXJjZShyZXN1bHQsIHByb3BlcnR5SWQpO1xuXHRcdFx0XHQvLyB9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0fS5iaW5kKHRoaXMpLFxuXHRcdFx0e31cblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBHZXRSdW50aW1lKCkge1xuXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XG5cblx0XHRSMy5FdmVudC5FbWl0KFxuXHRcdFx0UjMuRXZlbnQuR0VUX1JVTlRJTUUsXG5cdFx0XHRudWxsLFxuXHRcdFx0ZnVuY3Rpb24ocnVudGltZSkge1xuXHRcdFx0XHRyZXN1bHQgPSBydW50aW1lO1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB3aW5kb3cgc2l6ZSBvciBudWxsXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRXaW5kb3dTaXplKCkge1xuXG5cdFx0bGV0IHNpemUgPSBudWxsO1xuXG5cdFx0UjMuRXZlbnQuRW1pdChcblx0XHRcdFIzLkV2ZW50LkdFVF9XSU5ET1dfU0laRSxcblx0XHRcdG51bGwsXG5cdFx0XHRmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdHNpemUgPSBkYXRhO1xuXHRcdFx0fS5iaW5kKHRoaXMpXG5cdFx0KTtcblxuXHRcdHJldHVybiBzaXplO1xuXG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBvYmplY3Qgd2lkdGggYW5kIGhlaWdodCBtZW1iZXJzIHdpdGggd2luZG93IHNpemVcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBVcGRhdGVXaW5kb3dTaXplKG9iamVjdCkge1xuXHRcdGxldCBzaXplID0gVXRpbHMuR2V0V2luZG93U2l6ZSgpO1xuXHRcdG9iamVjdC53aWR0aCA9IHNpemUud2lkdGg7XG5cdFx0b2JqZWN0LmhlaWdodCA9IHNpemUuaGVpZ2h0O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgaWQgb2Ygb2JqZWN0IHdpdGggdGhlIG5hbWUgaWYgaXQgZXhpc3RzIGluIHRoZSBhcnJheSwgb3RoZXJ3aXNlIG51bGxcblx0ICogQHBhcmFtIG5hbWVcblx0ICogQHBhcmFtIGFycmF5XG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBPYmplY3RJZFdpdGhOYW1lSW5BcnJheShuYW1lLCBhcnJheSkge1xuXG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgb2JqZWN0KSB7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobmFtZSA9PT0gb2JqZWN0Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LmlkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9LFxuXHRcdFx0bnVsbFxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIExvYWRJZHNGcm9tQXJyYXlUb0lkT2JqZWN0KGFycmF5LCBpZFRvT2JqZWN0KSB7XG5cblx0fTtcblxuXHRzdGF0aWMgTG9hZElkc0Zyb21PYmplY3RUb0lkT2JqZWN0KG9iamVjdCwgaWRUb09iamVjdCkge1xuXG5cblx0fTtcblxuXHQvKipcblx0ICogR2V0cyByYW5kb20gaW50IGV4Y2x1c2l2ZSBvZiBtYXhpbXVtIGJ1dCBpbmNsdXNpdmUgb2YgbWluaW11bVxuXHQgKiBAcGFyYW0gbWluXG5cdCAqIEBwYXJhbSBtYXhcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFJhbmRvbUludChtaW4sIG1heCkge1xuXHRcdG1pbiA9IE1hdGguY2VpbChtaW4pO1xuXHRcdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluOyAvL1RoZSBtYXhpbXVtIGlzIGV4Y2x1c2l2ZSBhbmQgdGhlIG1pbmltdW0gaXMgaW5jbHVzaXZlXG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgcmFuZG9tIGludCBpbmNsdXNpdmUgb2YgbWluaW11bSBhbmQgbWF4aW11bVxuXHQgKiBAcGFyYW0gbWluXG5cdCAqIEBwYXJhbSBtYXhcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFJhbmRvbUludEluY2x1c2l2ZShtaW4sIG1heCkge1xuXHRcdG1pbiA9IE1hdGguY2VpbChtaW4pO1xuXHRcdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsgLy9UaGUgbWF4aW11bSBpcyBpbmNsdXNpdmUgYW5kIHRoZSBtaW5pbXVtIGlzIGluY2x1c2l2ZVxuXHR9O1xuXG5cdHN0YXRpYyBJbnRlcnBvbGF0ZUFycmF5KGRhdGEsIGZpdENvdW50KSB7XG5cblx0XHRsZXQgbGluZWFySW50ZXJwb2xhdGUgPSBmdW5jdGlvbihiZWZvcmUsIGFmdGVyLCBhdFBvaW50KSB7XG5cdFx0XHRyZXR1cm4gYmVmb3JlICsgKGFmdGVyIC0gYmVmb3JlKSAqIGF0UG9pbnQ7XG5cdFx0fTtcblxuXHRcdGxldCBuZXdEYXRhID0gW107XG5cblx0XHRsZXQgc3ByaW5nRmFjdG9yID0gTnVtYmVyKChkYXRhLmxlbmd0aCAtIDEpIC8gKGZpdENvdW50IC0gMSkpO1xuXG5cdFx0bmV3RGF0YVswXSA9IGRhdGFbMF07IC8vIGZvciBuZXcgYWxsb2NhdGlvblxuXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgZml0Q291bnQgLSAxOyBpKyspIHtcblx0XHRcdGxldCB0bXAgICAgID0gaSAqIHNwcmluZ0ZhY3Rvcjtcblx0XHRcdGxldCBiZWZvcmUgID0gTnVtYmVyKE1hdGguZmxvb3IodG1wKSkudG9GaXhlZCgpO1xuXHRcdFx0bGV0IGFmdGVyICAgPSBOdW1iZXIoTWF0aC5jZWlsKHRtcCkpLnRvRml4ZWQoKTtcblx0XHRcdGxldCBhdFBvaW50ID0gdG1wIC0gYmVmb3JlO1xuXHRcdFx0bmV3RGF0YVtpXSAgPSBsaW5lYXJJbnRlcnBvbGF0ZShkYXRhW2JlZm9yZV0sIGRhdGFbYWZ0ZXJdLCBhdFBvaW50KTtcblx0XHR9XG5cblx0XHRuZXdEYXRhW2ZpdENvdW50IC0gMV0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV07IC8vIGZvciBuZXcgYWxsb2NhdGlvblxuXG5cdFx0cmV0dXJuIG5ld0RhdGE7XG5cdH07XG5cblx0LyoqXG5cdCAqIFVuZGVmaW5lZCBvciBudWxsIGNoZWNrXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgVW5kZWZpbmVkT3JOdWxsKFxuXHRcdHZhcmlhYmxlXG5cdCkge1xuXHRcdHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT09ICd1bmRlZmluZWQnIHx8IHZhcmlhYmxlID09PSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUgaXMgbm90IHVuZGVmaW5lZCBhbmQgbm90IG51bGxcblx0ICogQHBhcmFtIHZhcmlhYmxlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBEZWZpbmVkKFxuXHRcdHZhcmlhYmxlXG5cdCkge1xuXHRcdHJldHVybiB0eXBlb2YgdmFyaWFibGUgIT09ICd1bmRlZmluZWQnICYmIHZhcmlhYmxlICE9PSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGZ1bmN0aW9uIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGZuXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFBhcmFtZXRlcnMoZm4pIHtcblxuXHRcdGxldCBGTl9BUkdTID0gL15mdW5jdGlvblxccypbXlxcKF0qXFwoXFxzKihbXlxcKV0qKVxcKS9tO1xuXHRcdGxldCBGTl9BUkdfU1BMSVQgPSAvLC87XG5cdFx0bGV0IEZOX0FSRyA9IC9eXFxzKihfPykoLis/KVxcMVxccyokLztcblx0XHRsZXQgU1RSSVBfQ09NTUVOVFMgPSAvKFxcL1xcLy4qJCl8KFxcL1xcKltcXHNcXFNdKj9cXCpcXC8pfChcXHMqPVteLFxcKV0qKCgnKD86XFxcXCd8W14nXFxyXFxuXSkqJyl8KFwiKD86XFxcXFwifFteXCJcXHJcXG5dKSpcIikpfChcXHMqPVteLFxcKV0qKSkvbWc7XG5cblx0XHRsZXQgcGFyYW1ldGVycyxcblx0XHRcdGZuVGV4dCxcblx0XHRcdGFyZ0RlY2w7XG5cblx0XHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0gW107XG5cdFx0XHRmblRleHQgPSBmbi50b1N0cmluZygpLnJlcGxhY2UoU1RSSVBfQ09NTUVOVFMsICcnKTtcblx0XHRcdGFyZ0RlY2wgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7XG5cdFx0XHRhcmdEZWNsWzFdLnNwbGl0KEZOX0FSR19TUExJVCkuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcblx0XHRcdFx0YXJnLnJlcGxhY2UoRk5fQVJHLCBmdW5jdGlvbihhbGwsIHVuZGVyc2NvcmUsIG5hbWUpIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLnB1c2gobmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IEVycm9yKFwibm90IGEgZnVuY3Rpb25cIilcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyYW1ldGVycztcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBlaXRoZXIgYW4gSUQgb2YgdGhlIG9iamVjdCBvciBOdWxsXG5cdCAqIEBwYXJhbSBvYmplY3Rcblx0ICogQHJldHVybnMge251bGx9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElkT3JOdWxsKG9iamVjdCkge1xuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob2JqZWN0LmlkKSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ3NhdmluZyBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggbm8gSUQgOiAnLCBvYmplY3QpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmplY3QuaWQ7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBMaW1pdCBhIHByb3BlcnR5IHRvIHZhbHVlcyBiZXR3ZWVuIC1waSBhbmQgK3BpXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gb2JqZWN0UHJvcGVydHlcblx0ICogQHJldHVybnMge3tjb25maWd1cmFibGU/OiBib29sZWFuLCBlbnVtZXJhYmxlPzogYm9vbGVhbiwgdmFsdWU/LCB3cml0YWJsZT86IGJvb2xlYW4sIGdldD86IEZ1bmN0aW9uLCBzZXQ/OiBGdW5jdGlvbn19XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExpbWl0VG9QSShwcm9wZXJ0eSwgb2JqZWN0UHJvcGVydHkpIHtcblxuXHRcdGxldCBzdG9yZSA9IG9iamVjdFByb3BlcnR5O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gc3RvcmU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0IDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0d2hpbGUgKHZhbHVlID4gTWF0aC5QSSkge1xuXHRcdFx0XHRcdHZhbHVlIC09IChNYXRoLlBJICogMik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3aGlsZSAodmFsdWUgPCAtKE1hdGguUEkpKSB7XG5cdFx0XHRcdFx0dmFsdWUgKz0gKE1hdGguUEkgKiAyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0b3JlID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBhcnJheSBvZiBJRHMgcmVwcmVzZW50aW5nIHRoZSBvYmplY3RzXG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKiBAcmV0dXJucyBbXVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJZEFycmF5T3JFbXB0eUFycmF5KGFycmF5KSB7XG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChhcnJheSkpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcblxuXHRcdFx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGl0ZW0uaWQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdObyBJRCBmb3VuZCB3aGlsZSB0cnlpbmcgdG8gc3RvcmUgSURzIHRvIGFycmF5Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXRlbS5pZFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBMaW5rcyBhbiBvYmplY3QgdG8gaXRzIHBhcmVudCB0aHJvdWdoIGlkVG9PYmplY3QgYXJyYXlcblx0ICogQHBhcmFtIHByb3BlcnR5U3RyaW5nXG5cdCAqIEBwYXJhbSBpZFRvT2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJlbnRPYmplY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExpbmsocHJvcGVydHlTdHJpbmcsIGlkVG9PYmplY3QsIHBhcmVudE9iamVjdCwgaWQpIHtcblxuXHRcdGlmICghVXRpbHMuVW5kZWZpbmVkT3JOdWxsKHBhcmVudE9iamVjdFtwcm9wZXJ0eVN0cmluZ10pKSB7XG5cblx0XHRcdGlmICghaWRUb09iamVjdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdMaW5raW5nIGZhaWxlZCBmb3Igb2JqZWN0OicgKyBwYXJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmVudE9iamVjdFtwcm9wZXJ0eVN0cmluZ10gPSBpZFRvT2JqZWN0W2lkXTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHJhbmRvbSBJRFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBSYW5kb21JZChsZW5ndGgpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwobGVuZ3RoKSkge1xuXHRcdFx0bGVuZ3RoID0gMTA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCBsZW5ndGgpO1xuXHR9O1xuXG5cdHN0YXRpYyBJbnZlcnRXaW5kaW5nT3JkZXIodHJpYW5nbGVzKSB7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHYxID0gdHJpYW5nbGVzW2ldLnYxO1xuXHRcdFx0dHJpYW5nbGVzW2ldLnYxID0gdHJpYW5nbGVzW2ldLnYyO1xuXHRcdFx0dHJpYW5nbGVzW2ldLnYyID0gdjE7XG5cblx0XHRcdGxldCBiYWNrdXBVViA9IHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MXV2O1xuXHRcdFx0dHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYxdXYgPSB0cmlhbmdsZXNbaV0udHJpYW5nbGUudjJ1djtcblx0XHRcdHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MnV2ID0gYmFja3VwVVY7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogSW52ZXJ0cyBhIG1lc2ggd2luZGluZyBvcmRlciAoYW5kIGl0cyBpbnN0YW5jZSlcblx0ICogQHBhcmFtIG1lc2ggUjMuRDMuTWVzaFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgSW52ZXJ0TWVzaFdpbmRpbmdPcmRlcihtZXNoKSB7XG5cblx0XHRtZXNoLmZhY2VzLmZvckVhY2goXG5cdFx0XHRmdW5jdGlvbihmYWNlKSB7XG5cblx0XHRcdFx0bGV0IHRtcFYxID0gZmFjZS52MTtcblx0XHRcdFx0ZmFjZS52MSA9IGZhY2UudjI7XG5cdFx0XHRcdGZhY2UudjIgPSB0bXBWMTtcblxuXHRcdFx0XHRsZXQgdG1wVjF1diA9IGZhY2UudjF1djtcblx0XHRcdFx0ZmFjZS52MXV2ID0gZmFjZS52MnV2O1xuXHRcdFx0XHRmYWNlLnYydXYgPSB0bXBWMXV2O1xuXG5cdFx0XHR9LmJpbmQodGhpcylcblx0XHQpO1xuXG5cdFx0Ly9tZXNoLmNvbXB1dGVOb3JtYWxzID0gdHJ1ZTtcblx0XHQvL21lc2guY3JlYXRlSW5zdGFuY2UoKTtcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXNldHMgYSB0aGUgd2luZGluZyBvcmRlciBvZiBhIG1lc2ggZnJvbSBhIHJlZmVyZW5jZSBwb2ludCBWICh0aGUgYXZlcmFnZSBjZW50ZXIgb2YgdGhlIG1lc2gpXG5cdCAqL1xuXHRzdGF0aWMgUmVzZXRXaW5kaW5nT3JkZXIoZmFjZXMsIHZlcnRpY2VzKSB7XG5cblx0XHRsZXQgdmVydGV4TGlzdCA9IG5ldyBSMy5BUEkuVmVjdG9yMy5Qb2ludHMoKTtcblxuXHRcdGZvciAobGV0IHYgPSAwOyB2IDwgdmVydGljZXMubGVuZ3RoOyB2KyspIHtcblx0XHRcdHZlcnRleExpc3QuYWRkKG5ldyBSMy5BUEkuVmVjdG9yMyhcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24ueCxcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24ueSxcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24uelxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0bGV0IFYgPSB2ZXJ0ZXhMaXN0LmF2ZXJhZ2UoKTtcblxuXHRcdGxldCB0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IHMgPSAwOyBzIDwgZmFjZXMubGVuZ3RoOyBzICs9IDMpIHtcblxuXHRcdFx0bGV0IHYwID0gZmFjZXNbc107XG5cdFx0XHRsZXQgdjEgPSBmYWNlc1tzKzFdO1xuXHRcdFx0bGV0IHYyID0gZmFjZXNbcysyXTtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR2MCA6IHYwLFxuXHRcdFx0XHRcdHYxIDogdjEsXG5cdFx0XHRcdFx0djIgOiB2Mixcblx0XHRcdFx0XHRlZGdlcyA6IFtcblx0XHRcdFx0XHRcdHt2MDogdjAsIHYxOiB2MX0sXG5cdFx0XHRcdFx0XHR7djA6IHYxLCB2MTogdjJ9LFxuXHRcdFx0XHRcdFx0e3YwOiB2MiwgdjE6IHYwfVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0d2luZGluZyA6IDAsXG5cdFx0XHRcdFx0ZWRnZUluZGV4IDogLTEsXG5cdFx0XHRcdFx0cHJvY2Vzc2VkIDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRSMy5BUEkuVmVjdG9yMy5jbG9ja3dpc2UoXG5cdFx0XHRcdFx0dmVydGljZXNbdHJpYW5nbGVzW2ldLnYwXS5wb3NpdGlvbixcblx0XHRcdFx0XHR2ZXJ0aWNlc1t0cmlhbmdsZXNbaV0udjFdLnBvc2l0aW9uLFxuXHRcdFx0XHRcdHZlcnRpY2VzW3RyaWFuZ2xlc1tpXS52Ml0ucG9zaXRpb24sXG5cdFx0XHRcdFx0VlxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ2Nsb2Nrd2lzZScpO1xuXHRcdFx0XHRsZXQgYnYxID0gdHJpYW5nbGVzW2ldLnYxO1xuXHRcdFx0XHR0cmlhbmdsZXNbaV0udjEgPSB0cmlhbmdsZXNbaV0udjI7XG5cdFx0XHRcdHRyaWFuZ2xlc1tpXS52MiA9IGJ2MTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdub3QgY2xvY2t3aXNlJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHdpbmRpbmcgb3JkZXIgZm9yIHRyaWFuZ2xlcyBpbiBmYWNlcywgZ2l2ZW4gYW4gaW5pdGlhbCB0cmlhbmdsZSBhbmQgb3JpZW50YXRpb24gZWRnZVxuXHQgKiB1c2VkIHBzZXVkb2NvZGUgZnJvbVxuXHQgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE3MDM2OTcwL2hvdy10by1jb3JyZWN0LXdpbmRpbmctb2YtdHJpYW5nbGVzLXRvLWNvdW50ZXItY2xvY2t3aXNlLWRpcmVjdGlvbi1vZi1hLTNkLW1lc2hcblx0ICogIFdlIG5lZWQgdG8gdXNlIGEgZ3JhcGggdHJhdmVyc2FsIGFsZ29yaXRobSxcblx0ICogIGxldHMgYXNzdW1lIHdlIGhhdmUgbWV0aG9kIHRoYXQgcmV0dXJucyBuZWlnaGJvciBvZiB0cmlhbmdsZSBvbiBnaXZlbiBlZGdlXG5cdCAqXG5cdCAqICAgICAgbmVpZ2hib3Jfb25fZWdkZSggbmV4dF90cmlhLCBlZGdlIClcblx0ICpcblx0ICogIHRvX3Byb2Nlc3MgPSBzZXQgb2YgcGFpcnMgdHJpYW5nbGUgYW5kIG9yaWVudGF0aW9uIGVkZ2UsIGluaXRpYWwgc3RhdGUgaXMgb25lIGdvb2Qgb3JpZW50ZWQgdHJpYW5nbGUgd2l0aCBhbnkgZWRnZSBvbiBpdFxuXHQgKiAgcHJvY2Vzc2VkID0gc2V0IG9mIHByb2Nlc3NlZCB0cmlhbmdsZXM7IGluaXRpYWwgZW1wdHlcblx0ICpcblx0ICogIHdoaWxlIHRvX3Byb2Nlc3MgaXMgbm90IGVtcHR5OlxuXHQgKiAgICAgIG5leHRfdHJpYSwgb3JpZW50YXRpb25fZWRnZSA9IHRvX3Byb2Nlc3MucG9wKClcblx0ICogICAgICBhZGQgbmV4dF90cmlhIGluIHByb2Nlc3NlZFxuXHQgKiAgICAgIGlmIG5leHRfdHJpYSBpcyBub3Qgb3Bwb3NpdGUgb3JpZW50ZWQgdGhhbiBvcmllbnRhdGlvbl9lZGdlOlxuXHQgKiAgICAgICAgICBjaGFuZ2UgbmV4dF90cmlhIChBQkMpIG9yaWVudGF0aW9uICAoQjwtPkMpXG5cdCAqICAgICAgZm9yIGVhY2ggZWRnZSAoQUIpIGluIG5leHRfdHJpYTpcblx0ICogICAgICAgICAgbmVpZ2hib3JfdHJpYSA9IG5laWdoYm9yX29uX2VnZGUoIG5leHRfdHJpYSwgZWRnZSApXG5cdCAqICAgICAgICAgIGlmIG5laWdoYm9yX3RyaWEgZXhpc3RzIGFuZCBuZWlnaGJvcl90cmlhIG5vdCBpbiBwcm9jZXNzZWQ6XG5cdCAqICAgICAgICAgICAgICB0b19wcm9jZXNzIGFkZCAobmVpZ2hib3JfdHJpYSwgZWRnZSBvcHBvc2l0ZSBvcmllbnRlZCAoQkEpKVxuXHQgKiBAcGFyYW0gZmFjZXMgUjMuRDMuRmFjZVtdXG5cdCAqIEBwYXJhbSBvcmllbnRhdGlvbkVkZ2UgUjMuQVBJLlZlY3RvcjJcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKi9cblx0c3RhdGljIEZpeFdpbmRpbmdPcmRlcihmYWNlcywgb3JpZW50YXRpb25FZGdlKSB7XG5cblx0XHQvKipcblx0XHQgKiBDaGVja3MgaWYgYSBGYWNlIGJlbG9uZ2luZyB0byBhIFRyaWFuZ2xlRWRnZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZFxuXHRcdCAqIEBwYXJhbSBwcm9jZXNzZWQgVHJpYW5nbGVFZGdlW11cblx0XHQgKiBAcGFyYW0gdHJpYW5nbGUgRmFjZVxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGluUHJvY2Vzc2VkKHByb2Nlc3NlZCwgdHJpYW5nbGUpIHtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb2Nlc3NlZFtpXS50cmlhbmdsZS5lcXVhbHModHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgYSBuZWlnaGJvdXJpbmcgdHJpYW5nbGUgb24gYSBzcGVjaWZpYyBlZGdlIC0gcHJlc2VydmluZyB0aGUgZWRnZSBvcmllbnRhdGlvblxuXHRcdCAqIEBwYXJhbSBlZGdlIFIzLkFQSS5WZWN0b3IyXG5cdFx0ICogQHBhcmFtIGZhY2VzIFIzLkQzLkZhY2VbXVxuXHRcdCAqIEBwYXJhbSBjdXJyZW50VHJpYW5nbGVcblx0XHQgKiBAcmV0dXJucyB7Kn1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBuZWlnaGJvdXJPbkVkZ2UoZWRnZSwgZmFjZXMsIGN1cnJlbnRUcmlhbmdsZSkge1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoZmFjZXNbaV0udjAgPT09IGVkZ2UueCAmJiBmYWNlc1tpXS52MSA9PT0gZWRnZS55KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MSA9PT0gZWRnZS54ICYmIGZhY2VzW2ldLnYyID09PSBlZGdlLnkpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYyID09PSBlZGdlLnggJiYgZmFjZXNbaV0udjAgPT09IGVkZ2UueSkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjAgPT09IGVkZ2UueSAmJiBmYWNlc1tpXS52MSA9PT0gZWRnZS54KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MSA9PT0gZWRnZS55ICYmIGZhY2VzW2ldLnYyID09PSBlZGdlLngpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYyID09PSBlZGdlLnkgJiYgZmFjZXNbaV0udjAgPT09IGVkZ2UueClcblx0XHRcdFx0KSB7XG5cblx0XHRcdFx0XHRsZXQgdHJpYW5nbGUgPSBuZXcgUjMuRDMuQVBJLkZhY2UoXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnYwaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS52MWluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0udjJpbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLm1hdGVyaWFsSW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS51dnNcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKHRyaWFuZ2xlLmVxdWFscyhjdXJyZW50VHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gbmV3IFIzLkQzLlRyaWFuZ2xlRWRnZShcblx0XHRcdFx0XHRcdHRyaWFuZ2xlLFxuXHRcdFx0XHRcdFx0ZWRnZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0bGV0IHRvUHJvY2VzcyA9IFtcblx0XHRcdG5ldyBSMy5EMy5UcmlhbmdsZUVkZ2UoXG5cdFx0XHRcdG5ldyBSMy5EMy5BUEkuRmFjZShcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0ZmFjZXNbMF0udjBpbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS52MWluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnYyaW5kZXgsXG5cdFx0XHRcdFx0ZmFjZXNbMF0ubWF0ZXJpYWxJbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS51dnNcblx0XHRcdFx0KSxcblx0XHRcdFx0b3JpZW50YXRpb25FZGdlXG5cdFx0XHQpXG5cdFx0XTtcblxuXHRcdGxldCBwcm9jZXNzZWQgPSBbXTtcblxuXHRcdHdoaWxlICh0b1Byb2Nlc3MubGVuZ3RoID4gMCkge1xuXG5cdFx0XHRsZXQgdHJpYW5nbGVFZGdlID0gdG9Qcm9jZXNzLnBvcCgpO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIElmIGVkZ2UgaXMgdGhlIHNhbWUgb3JpZW50YXRpb24gKGkuZS4gdGhlIGVkZ2Ugb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHRyaWFuZ2xlIGVkZ2UpIGl0IG5lZWRzIHRvIGJlIHJldmVyc2VkXG5cdFx0XHQgKiB0byBoYXZlIHRoZSBzYW1lIHdpbmRpbmcgb3JkZXIpXG5cdFx0XHQgKi9cblx0XHRcdGlmIChcblx0XHRcdFx0KHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS54ICYmXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnkpIHx8XG5cdFx0XHRcdCh0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueCAmJlxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS55KSB8fFxuXHRcdFx0XHQodHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnggJiZcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjBpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueSlcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgYmFja3VwViA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4O1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4O1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCA9IGJhY2t1cFY7XG5cblx0XHRcdFx0Ly8gbGV0IGJhY2t1cFVWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxdXY7XG5cdFx0XHRcdC8vIHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MXV2ID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYydXY7XG5cdFx0XHRcdC8vIHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MnV2ID0gYmFja3VwVVY7XG5cdFx0XHRcdC8vXG5cdFx0XHRcdGxldCBiYWNrdXBVViA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMV07XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMV0gPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudXZzWzBdWzJdO1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudXZzWzBdWzJdID0gYmFja3VwVVY7XG5cdFx0XHR9XG5cblx0XHRcdHByb2Nlc3NlZC5wdXNoKHRyaWFuZ2xlRWRnZSk7XG5cblx0XHRcdGxldCBlZGdlcyA9IFtcblx0XHRcdFx0bmV3IFIzLkFQSS5WZWN0b3IyKFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4LFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4XG5cdFx0XHRcdCksXG5cdFx0XHRcdG5ldyBSMy5BUEkuVmVjdG9yMihcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCxcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRuZXcgUjMuQVBJLlZlY3RvcjIoXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXgsXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXhcblx0XHRcdFx0KVxuXHRcdFx0XTtcblxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRsZXQgbmVpZ2hib3VyID0gbmVpZ2hib3VyT25FZGdlKGVkZ2VzW2pdLCBmYWNlcywgdHJpYW5nbGVFZGdlLnRyaWFuZ2xlKTtcblx0XHRcdFx0aWYgKG5laWdoYm91ciAmJiAhaW5Qcm9jZXNzZWQocHJvY2Vzc2VkLCBuZWlnaGJvdXIudHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0dG9Qcm9jZXNzLnB1c2gobmVpZ2hib3VyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEluIHByb2Nlc3NlZCAtIHdlIHdpbGwgaGF2ZSBzb21lIGR1cGxpY2F0ZXMgLSBvbmx5IGFkZCB0aGUgdW5pcXVlIG9uZXNcblx0XHQgKiBAdHlwZSB7QXJyYXl9XG5cdFx0ICovXG5cdFx0bGV0IHRyaWFuZ2xlcyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgdHJpYW5nbGVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGlmICh0cmlhbmdsZXNba10uZXF1YWxzKHByb2Nlc3NlZFtpXS50cmlhbmdsZSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cmlhbmdsZXMucHVzaChwcm9jZXNzZWRbaV0udHJpYW5nbGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cmlhbmdsZXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSB3b3JrLWFyb3VuZCBmdW5jdGlvbiB0byBmaXggcG9seXMgd2hpY2ggZG9uJ3QgdHJpYW5ndWxhdGUgYmVjYXVzZVxuXHQgKiB0aGV5IGNvdWxkIGxpZSBvbiBaLXBsYW5lIChYWiBvciBZWikpIC0gd2UgdHJhbnNsYXRlIHRoZSBwb2x5IHRvIHRoZSBvcmlnaW4sIHN5c3RlbWF0aWNhbGx5IHJvdGF0ZSB0aGUgcG9seSBhcm91bmRcblx0ICogWiB0aGVuIFkgYXhpc1xuXHQgKiBAcGFyYW0gdmVydGljZXNGbGF0IFtdXG5cdCAqIEBwYXJhbSBncmFpbiBpcyB0aGUgYW1vdW50IHRvIHN5c3RlbWF0aWNhbGx5IHJvdGF0ZSB0aGUgcG9seSBieSAtIGEgZmluZXIgZ3JhaW4gbWVhbnMgYSBtb3JlIGFjY3VyYXRlIG1heGltdW0gWFlcblx0ICogQHJldHVybiBbXVxuXHQgKi9cblx0c3RhdGljIEZpeFBvbHlaUGxhbmUodmVydGljZXNGbGF0LCBncmFpbikge1xuXG5cdFx0aWYgKCh2ZXJ0aWNlc0ZsYXQubGVuZ3RoICUgMykgIT09IDAgJiYgISh2ZXJ0aWNlc0ZsYXQubGVuZ3RoID4gOSkpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiVGhlIHZlcnRpY2VzIGFyZSBub3QgaW4gdGhlIHJpZ2h0IGxlbmd0aCA6IFwiICsgdmVydGljZXNGbGF0Lmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0bGV0IHZlcnRpY2VzID0gW107XG5cblx0XHRsZXQgcG9pbnRzID0gbmV3IFIzLkFQSS5RdWF0ZXJuaW9uLlBvaW50cygpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlc0ZsYXQubGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdHBvaW50cy5hZGQobmV3IFIzLkFQSS5WZWN0b3IzKFxuXHRcdFx0XHR2ZXJ0aWNlc0ZsYXRbaV0sXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpICsgMV0sXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpICsgMl1cblx0XHRcdCkpO1xuXHRcdH1cblxuXHRcdHBvaW50cy50b09yaWdpbigpO1xuXG5cdFx0cG9pbnRzLm1heGltaXplWERpc3RhbmNlKGdyYWluKTtcblxuXHRcdHBvaW50cy5tYXhpbWl6ZVlEaXN0YW5jZShncmFpbik7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLnZlY3RvcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZlcnRpY2VzLnB1c2goXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRwb2ludHMudmVjdG9yc1tpXS54LFxuXHRcdFx0XHRcdHBvaW50cy52ZWN0b3JzW2ldLnlcblx0XHRcdFx0XVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmVydGljZXM7XG5cdH07XG5cblx0c3RhdGljIE1vdmluZ0F2ZXJhZ2UocGVyaW9kKSB7XG5cdFx0bGV0IG51bXMgPSBbXTtcblx0XHRyZXR1cm4gZnVuY3Rpb24obnVtKSB7XG5cdFx0XHRudW1zLnB1c2gobnVtKTtcblx0XHRcdGlmIChudW1zLmxlbmd0aCA+IHBlcmlvZClcblx0XHRcdFx0bnVtcy5zcGxpY2UoMCwxKTsgIC8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXlcblx0XHRcdGxldCBzdW0gPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSBpbiBudW1zKVxuXHRcdFx0XHRzdW0gKz0gbnVtc1tpXTtcblx0XHRcdGxldCBuID0gcGVyaW9kO1xuXHRcdFx0aWYgKG51bXMubGVuZ3RoIDwgcGVyaW9kKVxuXHRcdFx0XHRuID0gbnVtcy5sZW5ndGg7XG5cdFx0XHRyZXR1cm4oc3VtL24pO1xuXHRcdH1cblx0fTtcblxuXHRzdGF0aWMgSW50ZXJzZWN0KGEsIGIpIHtcblxuXHRcdGxldCB0O1xuXG5cdFx0LyoqXG5cdFx0ICogTG9vcCBvdmVyIHNob3J0ZXN0IGFycmF5XG5cdFx0ICovXG5cdFx0aWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcblx0XHRcdHQgPSBiO1xuXHRcdFx0YiA9IGE7XG5cdFx0XHRhID0gdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIENoZWNrIGlmIGV4aXN0c1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiAoYi5pbmRleE9mKGUpID4gLTEpO1xuXHRcdFx0fVxuXHRcdCkuZmlsdGVyKFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZW1vdmUgRHVwbGljYXRlc1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEBwYXJhbSBpXG5cdFx0XHQgKiBAcGFyYW0gY1xuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUsIGksIGMpIHtcblx0XHRcdFx0cmV0dXJuIGMuaW5kZXhPZihlKSA9PT0gaTtcblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBEaWZmZXJlbmNlKGEsIGIpIHtcblxuXHRcdGxldCB0O1xuXG5cdFx0LyoqXG5cdFx0ICogTG9vcCBvdmVyIHNob3J0ZXN0IGFycmF5XG5cdFx0ICovXG5cdFx0aWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcblx0XHRcdHQgPSBiO1xuXHRcdFx0YiA9IGE7XG5cdFx0XHRhID0gdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIENoZWNrIGlmIGV4aXN0c1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiAoYi5pbmRleE9mKGUpID09PSAtMSk7XG5cdFx0XHR9XG5cdFx0KS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlbW92ZSBEdXBsaWNhdGVzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHBhcmFtIGlcblx0XHRcdCAqIEBwYXJhbSBjXG5cdFx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24oZSwgaSwgYykge1xuXHRcdFx0XHRyZXR1cm4gYy5pbmRleE9mKGUpID09PSBpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFB1c2ggb25seSBpZiBub3QgaW4gdGhlcmUgYWxyZWFkeVxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBQdXNoVW5pcXVlKGFycmF5LCBvYmplY3QpIHtcblxuXHRcdGlmIChhcnJheS5pbmRleE9mKG9iamVjdCkgPT09IC0xKSB7XG5cdFx0XHRhcnJheS5wdXNoKG9iamVjdCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBlbXB0eVxuXHQgKiBAcGFyYW0gb2JqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJc0VtcHR5KG9iaikge1xuXHRcdHJldHVybiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDAgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1N0cmluZyhtZW1iZXIpIHtcblx0XHRyZXR1cm4gKHR5cGVvZiBtZW1iZXIgPT09ICdzdHJpbmcnKTtcblx0fTtcblxuXHRzdGF0aWMgSXNCb29sZWFuKG1lbWJlcikge1xuXHRcdHJldHVybiAobWVtYmVyID09PSB0cnVlIHx8IG1lbWJlciA9PT0gZmFsc2UpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc0NvbG9yKG1lbWJlcikge1xuXHRcdHJldHVybiAobWVtYmVyIGluc3RhbmNlb2YgUjMuQ29sb3IpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc051bWJlcihtZW1iZXIpIHtcblx0XHRyZXR1cm4gKHR5cGVvZiBtZW1iZXIgPT09ICdudW1iZXInKTtcblx0fTtcblxuXHRzdGF0aWMgSXNWZWN0b3IyKG1lbWJlcikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuVmVjdG9yMiB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuVmVjdG9yMlxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzVmVjdG9yMyhtZW1iZXIpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuQVBJLlZlY3RvcjMgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLlZlY3RvcjNcblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1ZlY3RvcjQobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5WZWN0b3I0IHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5WZWN0b3I0IHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuUXVhdGVybmlvbiB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuUXVhdGVybmlvblxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzT2JqZWN0KG1lbWJlcikge1xuXHRcdGxldCB0eXBlID0gdHlwZW9mIG1lbWJlcjtcblx0XHRyZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIW1lbWJlcjtcblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIExvd2VyVW5kZXJzY29yZShuYW1lKSB7XG5cdFx0bGV0IHN0cmluZyA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJyk7XG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLy0vZywgJ18nKTtcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxfKy9nLCAnXycpO1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH07XG5cblx0c3RhdGljIFVwcGVyQ2FzZVdvcmRzU3BhY2VzKGlucHV0KSB7XG5cblx0XHRsZXQgd29yZCA9IGlucHV0LnJlcGxhY2UoL1stX10vZywgJyAnKTtcblxuXHRcdHdvcmQgPSB3b3JkLnJlcGxhY2UoL1xccysvLCAnICcpO1xuXG5cdFx0bGV0IHdvcmRzID0gd29yZC5zcGxpdCgnICcpO1xuXG5cdFx0cmV0dXJuIHdvcmRzLnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgd29yZCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zdWJzdHIoMSk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQgKyAnICc7XG5cdFx0XHR9LFxuXHRcdFx0Jydcblx0XHQpLnRyaW0oKTtcblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIFVwcGVyQ2FzZVVuZGVyc2NvcmUod29yZCkge1xuXG5cdFx0bGV0IHN0ciA9ICcnO1xuXG5cdFx0d29yZC5zcGxpdCgnJykubWFwKGZ1bmN0aW9uKGxldHRlcil7XG5cdFx0XHRpZiAobGV0dGVyID09IGxldHRlci50b1VwcGVyQ2FzZSgpKSB7XG5cdFx0XHRcdHN0ciArPSAnXycgKyBsZXR0ZXI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdHIgKz0gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRzdHIgPSBzdHIucmVwbGFjZShuZXcgUmVnRXhwKCdeXycpLCcnKTtcblxuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgTGVmdCBQYWRkZWQgVGV4dCAtIGV4LiBsZW5ndGggNSwgcGFkY2hhciAwLCBzdHJpbmcgYWJjID0gJzAwYWJjJ1xuXHQgKiBAcGFyYW0gbGVuZ3RoXG5cdCAqIEBwYXJhbSBwYWRDaGFyXG5cdCAqIEBwYXJhbSBzdHJpbmdcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgUGFkZGVkVGV4dChsZW5ndGgsIHBhZENoYXIsIHN0cmluZykge1xuXG5cdFx0bGV0IHBhZCA9IFwiXCI7XG5cblx0XHRmb3IgKGxldCB4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7XG5cdFx0XHRwYWQgKz0gcGFkQ2hhcjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFkLnN1YnN0cmluZygwLCBwYWQubGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVXRpbHM7IiwiY29uc3Qge1N5c3RlbSwgU3lzdGVtTGlua2luZywgU3lzdGVtU29ja2V0fSA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtJyk7XG5jb25zdCBSM09iamVjdCA9IHJlcXVpcmUoJy4vcjMtcjMtb2JqZWN0Jyk7XG5cbmNsYXNzIFIzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0fVxuXG5cdHN0YXRpYyB2ZXJzaW9uKCkge1xuXHRcdHJldHVybiAnX19EQVRFX18nO1xuXHR9XG5cbn1cblxuUjMuUjNPYmplY3QgXHRcdD0gUjNPYmplY3Q7XG5SMy5TeXN0ZW0gXHRcdFx0PSBTeXN0ZW07XG5SMy5TeXN0ZW0uTGlua2luZ1x0PSBTeXN0ZW1MaW5raW5nO1xuUjMuU3lzdGVtLlNvY2tldFx0PSBTeXN0ZW1Tb2NrZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gUjM7XG4iXSwic291cmNlUm9vdCI6IiJ9