r3-v2/dist/r3.js

1711 lines
154 KiB
JavaScript

/******/ (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;
}();
_defineProperty(Event, "Subscriptions", {});
Event.OBJECT_CREATED = 0x1;
module.exports = Event;
/***/ }),
/***/ "./src/r3/r3-object.js":
/*!*****************************!*\
!*** ./src/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 _Object = /*#__PURE__*/function (_Event) {
_inherits(Object, _Event);
var _super = _createSuper(Object);
function Object() {
var _this;
_classCallCheck(this, Object);
_this = _super.call(this);
console.log('Object created');
_this.emit(Event.OBJECT_CREATED);
return _this;
}
return Object;
}(Event);
module.exports = _Object;
/***/ }),
/***/ "./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 _Object = __webpack_require__(/*! ../r3-object */ "./src/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 _Object();
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; }
module.exports = /*#__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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
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 '<span class="' + cls + '">' + match + '</span>';
});
}
}, {
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;
}();
/***/ }),
/***/ "./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 _Object = __webpack_require__(/*! ./r3-object */ "./src/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 02:04:29 GMT+0200 (Central European Summer Time)';
}
}]);
return R3;
}();
R3.Object = _Object;
R3.System = System;
R3.System.Linking = SystemLinking;
R3.System.Socket = SystemSocket;
module.exports = R3;
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1ldmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1zeXN0ZW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0tbGlua2luZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtc3lzdGVtL3IzLXN5c3RlbS1zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXV0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy5qcyJdLCJuYW1lcyI6WyJSMyIsInJlcXVpcmUiLCJTeXN0ZW0iLCJMaW5raW5nIiwic3RhcnQiLCJTb2NrZXQiLCJtb2R1bGUiLCJleHBvcnRzIiwiVXRpbHMiLCJFdmVudCIsImNvbnNvbGUiLCJsb2ciLCJldmVudE5hbWUiLCJjYWxsYmFjayIsIlN1YnNjcmliZSIsImJpbmQiLCJkYXRhIiwiY2xpZW50Q2FsbGJhY2siLCJjbGllbnRFcnJvckNhbGxiYWNrIiwiRW1pdCIsImZuIiwic3Vic2NyaXB0aW9uSWQiLCJSYW5kb21JZCIsIlN1YnNjcmlwdGlvbnMiLCJoYXNPd25Qcm9wZXJ0eSIsIkVycm9yIiwicmVtb3ZlIiwiZXZlbnRJZCIsImxpc3RlbmVycyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJzdWJzY3JpcHRpb25JZHMiLCJtYXAiLCJyZXN1bHQiLCJlcnJvciIsIk9CSkVDVF9DUkVBVEVEIiwiZW1pdCIsIlN5c3RlbUxpbmtpbmciLCJTeXN0ZW1Tb2NrZXQiLCJMaW5raW5nU3lzdGVtIiwib2JqZWN0IiwiU29ja2V0U3lzdGVtIiwiY29uc3RydWN0b3IiLCJVbmRlZmluZWRPck51bGwiLCJwYXJlbnQiLCJHZXRGaXJzdFBhcmVudCIsImpzb24iLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwicmVwbGFjZSIsIm1hdGNoIiwiY2xzIiwidGVzdCIsImNvbXBvbmVudCIsIlByb2plY3QiLCJHZXRQYXJlbnRQcm9qZWN0IiwicGFyZW50cyIsInB1c2giLCJHZXRQYXJlbnRzIiwiRGVmaW5lZCIsImluc3RhbmNlIiwic2VsZWN0IiwiaWQiLCJpIiwib3B0aW9ucyIsInZhbHVlIiwic2VsZWN0ZWRJbmRleCIsInRtcCIsInRleHQiLCJzb3J0IiwiT3B0aW9uIiwicHJvcGVydHkiLCJpbmRleCIsImdldFBhcmVudCIsIndhcm4iLCJpbWFnZVBhdGgiLCJuYW1lIiwiZGltZW5zaW9uIiwieCIsInkiLCJ6IiwidyIsImFycmF5IiwicmVkdWNlIiwiZmFjZXMiLCJhIiwiYiIsIm1hdGVyaWFsSW5kZXgiLCJheGlzIiwiYW5nbGUiLCJwcm9wZXJ0eUlkIiwiR0VUX1JVTlRJTUUiLCJydW50aW1lIiwic2l6ZSIsIkdFVF9XSU5ET1dfU0laRSIsIkdldFdpbmRvd1NpemUiLCJ3aWR0aCIsImhlaWdodCIsImlkVG9PYmplY3QiLCJtaW4iLCJtYXgiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZml0Q291bnQiLCJsaW5lYXJJbnRlcnBvbGF0ZSIsImJlZm9yZSIsImFmdGVyIiwiYXRQb2ludCIsIm5ld0RhdGEiLCJzcHJpbmdGYWN0b3IiLCJOdW1iZXIiLCJ0b0ZpeGVkIiwidmFyaWFibGUiLCJGTl9BUkdTIiwiRk5fQVJHX1NQTElUIiwiRk5fQVJHIiwiU1RSSVBfQ09NTUVOVFMiLCJwYXJhbWV0ZXJzIiwiZm5UZXh0IiwiYXJnRGVjbCIsInRvU3RyaW5nIiwic3BsaXQiLCJmb3JFYWNoIiwiYXJnIiwiYWxsIiwidW5kZXJzY29yZSIsIm9iamVjdFByb3BlcnR5Iiwic3RvcmUiLCJnZXQiLCJzZXQiLCJQSSIsIml0ZW0iLCJwcm9wZXJ0eVN0cmluZyIsInBhcmVudE9iamVjdCIsInN1YnN0ciIsInRyaWFuZ2xlcyIsInYxIiwidjIiLCJiYWNrdXBVViIsInRyaWFuZ2xlIiwidjF1diIsInYydXYiLCJtZXNoIiwiZmFjZSIsInRtcFYxIiwidG1wVjF1diIsInZlcnRpY2VzIiwidmVydGV4TGlzdCIsIkFQSSIsIlZlY3RvcjMiLCJQb2ludHMiLCJ2IiwiYWRkIiwicG9zaXRpb24iLCJWIiwiYXZlcmFnZSIsInMiLCJ2MCIsImVkZ2VzIiwid2luZGluZyIsImVkZ2VJbmRleCIsInByb2Nlc3NlZCIsImNsb2Nrd2lzZSIsImJ2MSIsIm9yaWVudGF0aW9uRWRnZSIsImluUHJvY2Vzc2VkIiwiZXF1YWxzIiwibmVpZ2hib3VyT25FZGdlIiwiZWRnZSIsImN1cnJlbnRUcmlhbmdsZSIsIkQzIiwiRmFjZSIsInYwaW5kZXgiLCJ2MWluZGV4IiwidjJpbmRleCIsInV2cyIsIlRyaWFuZ2xlRWRnZSIsInRvUHJvY2VzcyIsInRyaWFuZ2xlRWRnZSIsInBvcCIsImJhY2t1cFYiLCJWZWN0b3IyIiwiaiIsIm5laWdoYm91ciIsImZvdW5kIiwiayIsInZlcnRpY2VzRmxhdCIsImdyYWluIiwicG9pbnRzIiwiUXVhdGVybmlvbiIsInRvT3JpZ2luIiwibWF4aW1pemVYRGlzdGFuY2UiLCJtYXhpbWl6ZVlEaXN0YW5jZSIsInZlY3RvcnMiLCJwZXJpb2QiLCJudW1zIiwibnVtIiwic3BsaWNlIiwic3VtIiwibiIsInQiLCJmaWx0ZXIiLCJlIiwiaW5kZXhPZiIsImMiLCJvYmoiLCJtZW1iZXIiLCJDb2xvciIsIlZlY3RvcjQiLCJ0eXBlIiwic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJpbnB1dCIsIndvcmQiLCJ3b3JkcyIsInRvVXBwZXJDYXNlIiwidHJpbSIsInN0ciIsImxldHRlciIsIlJlZ0V4cCIsInBhZENoYXIiLCJwYWQiLCJzdWJzdHJpbmciXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7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ZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvcjMvaW5kZXguanNcIik7XG4iLCJjb25zdCBSMyA9IHJlcXVpcmUoJy4vcjMuanMnKTtcblxuUjMuU3lzdGVtLkxpbmtpbmcuc3RhcnQoKTtcblIzLlN5c3RlbS5Tb2NrZXQuc3RhcnQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSMztcbiIsImNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi9yMy11dGlscycpO1xuXG5jbGFzcyBFdmVudCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc29sZS5sb2coJ0V2ZW50IGNyZWF0ZWQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTb21lIG5pY2UgRXZlbnRzIGhhbmRsaW5nXG5cdCAqIEB0eXBlIHt7fX1cblx0ICovXG5cdHN0YXRpYyBTdWJzY3JpcHRpb25zID0ge307XG5cblx0c3RhdGljIFN1YnNjcmliZShcblx0XHRldmVudE5hbWUsXG5cdFx0Zm5cblx0KSB7XG5cdFx0LyoqXG5cdFx0ICogVG9kbyAtIG1heWJlIGV2ZW50dWFsbHkgc3RvcmUgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0XHQgKi9cblx0XHRsZXQgc3Vic2NyaXB0aW9uSWQgPSBVdGlscy5SYW5kb21JZCgxMCk7XG5cblx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG5cblx0XHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignQSBjb21wb25lbnQgY2FuIG9ubHkgc3Vic2NyaWJlIHRvIGEgcGFydGljdWxhciBldmVudCBJRCBvbmNlJyk7XG5cdFx0XHR9XG5cblx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXVtzdWJzY3JpcHRpb25JZF0gPSBmbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdID0ge307XG5cdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdID0gZm47XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBjYWxsZXIgdG8gYWxsb3cgdXMgdG8gdW5zdWJzY3JpYmUgdG8gdGhpcyBldmVudFxuXHRcdCAqL1xuXHRcdHJldHVybiB7XG5cdFx0XHRmbjogZm4sXG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uIChldmVudElkLCBzdWJzY3JpcHRpb25JZCkge1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBTdG9wIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudCBmcm9tIHRoaXMgY29tcG9uZW50XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF1bc3Vic2NyaXB0aW9uSWRdO1xuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgdGhlIGxlbmd0aCBvZiBsaXN0ZW5lcnMgaXMgMCwgc3RvcCByZWZlcmVuY2luZyB0aGlzIGV2ZW50XG5cdFx0XHRcdFx0ICogQHR5cGUge3N0cmluZ1tdfVxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGxldCBsaXN0ZW5lcnMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblx0XHRcdFx0XHRpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH0oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25JZCksXG5cdFx0XHRzdWJzY3JpcHRpb25JZCA6IHN1YnNjcmlwdGlvbklkXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogU3Vic2NyaWJlIHRvIHNvbWUgZXZlbnRzXG5cdCAqIEBwYXJhbSBldmVudE5hbWVcblx0ICogQHBhcmFtIGNhbGxiYWNrXG5cdCAqL1xuXHRzdWJzY3JpYmUoXG5cdFx0ZXZlbnROYW1lLFxuXHRcdGNhbGxiYWNrXG5cdCkge1xuXHRcdHJldHVybiBFdmVudC5TdWJzY3JpYmUoZXZlbnROYW1lLCBjYWxsYmFjay5iaW5kKHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RhdGljIFN5bmNocm9ub3VzIEV2ZW50IC0gQ2FsbHMgY2xpZW50Q2FsbGJhY2sgZGlyZWN0bHkgYWZ0ZXIgdGhlIGV2ZW50IHJlc3VsdCBpcyBvYnRhaW5lZFxuXHQgKiBAcGFyYW0gZXZlbnRJZFxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcGFyYW0gY2xpZW50Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgaWRlYWxseSB3aGVuIHRoZSBldmVudCBjb21wbGV0ZWRcblx0ICogQHBhcmFtIGNsaWVudEVycm9yQ2FsbGJhY2tcblx0ICogQHJldHVybnMge251bWJlcn0gb2YgY2FsbGJhY2tzIGV4ZWN1dGVkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEVtaXQoXG5cdFx0ZXZlbnRJZCxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoZXZlbnRJZCkpIHtcblxuXHRcdFx0bGV0IHN1YnNjcmlwdGlvbklkcyA9IE9iamVjdC5rZXlzKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF0pO1xuXG5cdFx0XHRzdWJzY3JpcHRpb25JZHMubWFwKFxuXHRcdFx0XHRmdW5jdGlvbihzdWJzY3JpcHRpb25JZCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSk7XG5cblx0XHRcdFx0XHRcdGlmIChjbGllbnRDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRDYWxsYmFjayhyZXN1bHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH1cblxuXHRlbWl0KFxuXHRcdGV2ZW50TmFtZSxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0cmV0dXJuIEV2ZW50LkVtaXQoXG5cdFx0XHRldmVudE5hbWUsXG5cdFx0XHRkYXRhLFxuXHRcdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbnMgd2hpY2ggc3Vic2NyaWJlIHRvIHRoaXMgZXZlbnQsIGJ1dCBkb24ndCBwcm9jZXNzIHRoZSBjbGllbnQgY2FsbGJhY2sgLSB0aGUgc3Vic2NyaXB0aW9uIGZ1bmN0aW9uXG5cdCAqIHNob3VsZCBleGVjdXRlIHRoZSBjbGllbnQgY2FsbGJhY2tcblx0ICogQHBhcmFtIGV2ZW50SWRcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHBhcmFtIGNsaWVudENhbGxiYWNrXG5cdCAqIEBwYXJhbSBjbGllbnRFcnJvckNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEFzeW5jKFxuXHRcdGV2ZW50SWQsXG5cdFx0ZGF0YSxcblx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdCkge1xuXHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zLmhhc093blByb3BlcnR5KGV2ZW50SWQpKSB7XG5cblx0XHRcdGxldCBzdWJzY3JpcHRpb25JZHMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblxuXHRcdFx0c3Vic2NyaXB0aW9uSWRzLm1hcChcblx0XHRcdFx0ZnVuY3Rpb24oc3Vic2NyaXB0aW9uSWQpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSwgY2xpZW50Q2FsbGJhY2ssIGNsaWVudEVycm9yQ2FsbGJhY2spO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH07XG5cbn1cblxuRXZlbnQuT0JKRUNUX0NSRUFURUQgPSAweDE7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnQ7XG4iLCJjb25zdCBFdmVudCA9IHJlcXVpcmUoJy4vcjMtZXZlbnQnKTtcblxuY2xhc3MgT2JqZWN0IGV4dGVuZHMgRXZlbnQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdGNvbnNvbGUubG9nKCdPYmplY3QgY3JlYXRlZCcpO1xuXG5cdFx0dGhpcy5lbWl0KEV2ZW50Lk9CSkVDVF9DUkVBVEVEKTtcblxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Q7IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0nKTtcbmNvbnN0IFN5c3RlbUxpbmtpbmcgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1saW5raW5nJyk7XG5jb25zdCBTeXN0ZW1Tb2NrZXQgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1zb2NrZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFN5c3RlbSxcbiAgU3lzdGVtTGlua2luZyxcbiAgU3lzdGVtU29ja2V0XG59IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0nKTtcbmNvbnN0IE9iamVjdCA9IHJlcXVpcmUoJy4uL3IzLW9iamVjdCcpO1xuY29uc3QgRXZlbnQgPSByZXF1aXJlKCcuLi9yMy1ldmVudCcpO1xuXG5jbGFzcyBMaW5raW5nU3lzdGVtIGV4dGVuZHMgU3lzdGVtIHtcblxuXHRzdGF0aWMgc3RhcnQoKSB7XG5cblx0XHRzdXBlci5zdGFydCgpO1xuXHRcdFxuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBsaW5raW5nIHN5c3RlbScpO1xuXG5cdFx0RXZlbnQuU3Vic2NyaWJlKFxuXHRcdFx0RXZlbnQuT0JKRUNUX0NSRUFURUQsXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdsaW5raW5nIHN5c3RlbSBkaXNjb3ZlcmVkIGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRsZXQgb2JqZWN0ID0gbmV3IE9iamVjdCgpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVx0XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaW5raW5nU3lzdGVtO1xuIiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0uanMnKTtcblxuY2xhc3MgU29ja2V0U3lzdGVtIGV4dGVuZHMgU3lzdGVtIHtcblxuXHRzdGF0aWMgc3RhcnQoKSB7XG5cblx0XHRzdXBlci5zdGFydCgpO1xuXHRcdFxuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBzb2NrZXQgc3lzdGVtJyk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XHRcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNvY2tldFN5c3RlbTsiLCJjbGFzcyBTeXN0ZW0ge1xuXG5cdHN0YXRpYyBzdGFydCgpIHtcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgYSBzeXN0ZW0nKTtcdFxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTeXN0ZW07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFV0aWxzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcblx0fVxuXHRcblx0LyoqXG5cdCAqIEdldHMgdGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSBvYmplY3Rcblx0ICogQHBhcmFtIGNvbnN0cnVjdG9yXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRGaXJzdFBhcmVudChvYmplY3QsIGNvbnN0cnVjdG9yKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbnN0cnVjdG9yKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cblx0XHRpZiAob2JqZWN0LnBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuXHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBVdGlscy5HZXRGaXJzdFBhcmVudChvYmplY3QucGFyZW50LCBjb25zdHJ1Y3Rvcik7XG5cdFx0fVxuXG5cdH07XG5cblx0c3RhdGljIFN5bnRheEhpZ2hsaWdodChqc29uKSB7XG5cdFx0aWYgKHR5cGVvZiBqc29uICE9ICdzdHJpbmcnKSB7XG5cdFx0XHRqc29uID0gSlNPTi5zdHJpbmdpZnkoanNvbiwgdW5kZWZpbmVkLCAyKTtcblx0XHR9XG5cdFx0anNvbiA9IGpzb24ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXHRcdHJldHVybiBqc29uLnJlcGxhY2UoLyhcIihcXFxcdVthLXpBLVowLTldezR9fFxcXFxbXnVdfFteXFxcXFwiXSkqXCIoXFxzKjopP3xcXGIodHJ1ZXxmYWxzZXxudWxsKVxcYnwtP1xcZCsoPzpcXC5cXGQqKT8oPzpbZUVdWytcXC1dP1xcZCspPykvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0XHRsZXQgY2xzID0gJ251bWJlcic7XG5cdFx0XHRpZiAoL15cIi8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0aWYgKC86JC8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0XHRjbHMgPSAna2V5Jztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjbHMgPSAnc3RyaW5nJztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgvdHJ1ZXxmYWxzZS8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0Y2xzID0gJ2Jvb2xlYW4nO1xuXHRcdFx0fSBlbHNlIGlmICgvbnVsbC8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0Y2xzID0gJ251bGwnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICc8c3BhbiBjbGFzcz1cIicgKyBjbHMgKyAnXCI+JyArIG1hdGNoICsgJzwvc3Bhbj4nO1xuXHRcdH0pO1xuXHR9O1xuXG5cdHN0YXRpYyBHZXRQYXJlbnRQcm9qZWN0KGNvbXBvbmVudCkge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQucGFyZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm90IGZvdW5kJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbXBvbmVudC5wYXJlbnQgaW5zdGFuY2VvZiBSMy5Qcm9qZWN0KSB7XG5cdFx0XHRyZXR1cm4gY29tcG9uZW50LnBhcmVudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gVXRpbHMuR2V0UGFyZW50UHJvamVjdChjb21wb25lbnQucGFyZW50KTtcblx0fTtcblxuXHRzdGF0aWMgR2V0UGFyZW50cyhjb21wb25lbnQsIHBhcmVudHMpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwocGFyZW50cykpIHtcblx0XHRcdHBhcmVudHMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbXBvbmVudC5wYXJlbnQpKSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50cztcblx0XHR9XG5cblx0XHRwYXJlbnRzLnB1c2goY29tcG9uZW50LnBhcmVudCk7XG5cblx0XHRyZXR1cm4gVXRpbHMuR2V0UGFyZW50cyhjb21wb25lbnQucGFyZW50LCBwYXJlbnRzKTtcblxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0c3RhdGljIEluc3RhbmNlKGNvbXBvbmVudCkge1xuXHRcdHJldHVybiBVdGlscy5EZWZpbmVkKGNvbXBvbmVudCkgJiYgVXRpbHMuRGVmaW5lZChjb21wb25lbnQuaW5zdGFuY2UpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVdGlscy5SZW1vdmVGcm9tU2VsZWN0XG5cdCAqIEBwYXJhbSBzZWxlY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBSZW1vdmVGcm9tU2VsZWN0KHNlbGVjdCwgaWQpIHtcblxuXHRcdGxldCBpO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT09IGlkKSB7XG5cdFx0XHRcdHNlbGVjdC5yZW1vdmUoaSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIFV0aWxzLkdldFNlbGVjdEluZGV4XG5cdCAqXG5cdCAqIEdldCB0aGUgc2VsZWN0IGluZGV4IG9mIGdpdmVuIGlkXG5cdCAqXG5cdCAqIEBwYXJhbSBzZWxlY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEByZXR1cm5zIGJvb2xlYW4gdHJ1ZSBpZiBzdWNjZXNzZnVsXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFNldFNlbGVjdEluZGV4KHNlbGVjdCwgaWQpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT09IGlkKSB7XG5cdFx0XHRcdHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gaTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgU29ydFNlbGVjdChzZWxlY3QpIHtcblxuXHRcdGxldCB0bXAgPSBbXTtcblx0XHRsZXQgaTtcblxuXHRcdGZvciAoaSA9IDE7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dG1wW2ktMV0gPSBbXTtcblx0XHRcdHRtcFtpLTFdWzBdID0gc2VsZWN0Lm9wdGlvbnNbaV0udGV4dDtcblx0XHRcdHRtcFtpLTFdWzFdID0gc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWU7XG5cdFx0fVxuXG5cdFx0dG1wLnNvcnQoKTtcblxuXHRcdHNlbGVjdC5vcHRpb25zID0gW3NlbGVjdC5vcHRpb25zWzBdXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNlbGVjdC5vcHRpb25zW2krMV0gPSBuZXcgT3B0aW9uKHRtcFtpXVswXSwgdG1wW2ldWzFdKTtcblx0XHR9XG5cblx0XHRyZXR1cm47XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhcmVudCBvZiBvYmplY3Qgd2hpdGggcHJvcGVydHkgb2Ygb3B0aW9uYWwgdHlwZSBjb25zdHJ1Y3Rvci4gSWYgaW5kZXggaXMgc3BlY2lmaWVkLCBnZXQgdGhlIHBhcmVudCBvZiB0aGVcblx0ICogb2JqZWN0IHdpdGggcHJvcGVydHlbaW5kZXhdIC0gd2hpY2ggbWVhbnMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhbiBhcnJheVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gaW5kZXhcblx0ICogQHBhcmFtIGNvbnN0cnVjdG9yXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRQYXJlbnQob2JqZWN0LCBwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbnN0cnVjdG9yKSkge1xuXHRcdFx0Y29uc3RydWN0b3IgPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoaW5kZXgpKSB7XG5cdFx0XHRpbmRleCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogUGFyZW50IGRlZmluZWRcblx0XHRcdCAqL1xuXHRcdFx0aWYgKG9iamVjdC5wYXJlbnQuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG5cblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yKSB7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXgpIHtcblxuXHRcdFx0XHRcdFx0aWYgKG9iamVjdC5wYXJlbnRbcHJvcGVydHldW2luZGV4XSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF07XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQocHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcik7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCdnZXRQYXJlbnQgbm90IGRlZmluZWQgb24gQVBJIG9iamVjdCA6ICcgKyBvYmplY3QucGFyZW50ICsgJyAtIHlvdSBzaG91bGQgYXZvaWQgaGF2aW5nIHRoZXNlIG1lc3NzYWdlcycpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKG9iamVjdC5wYXJlbnRbcHJvcGVydHldIGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnRbcHJvcGVydHldO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50KHByb3BlcnR5LCBpbmRleCwgY29uc3RydWN0b3IpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignZ2V0UGFyZW50IG5vdCBkZWZpbmVkIG9uIEFQSSBvYmplY3QgOiAnICsgb2JqZWN0LnBhcmVudCArICcgLSB5b3Ugc2hvdWxkIGF2b2lkIGhhdmluZyB0aGVzZSBtZXNzc2FnZXMnKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhpcyBwYXJlbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVydHkgLSBnbyBhIGxldmVsIGhpZ2hlclxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QucGFyZW50LmdldFBhcmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50LmdldFBhcmVudChwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ2dldFBhcmVudCBub3QgZGVmaW5lZCBvbiBBUEkgb2JqZWN0IDogJyArIG9iamVjdC5wYXJlbnQgKyAnIC0geW91IHNob3VsZCBhdm9pZCBoYXZpbmcgdGhlc2UgbWVzc3NhZ2VzJyk7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIE5vIHBhcmVudCBkZWZpbmVkXG5cdFx0XHQgKi9cblx0XHRcdGNvbnNvbGUud2FybigncHJvcGVydHkgOiAnICsgcHJvcGVydHkgKyAnIG9mIHR5cGUgJyArIGNvbnN0cnVjdG9yICsgJyB3YXMgbm90IGZvdW5kIGluIHRoZSBwYXJlbnQgY2hhaW4nKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFN0cmlwcyBpbWFnZSBleHRlbnNpb24gZnJvbSBnaXZlbiBwYXRoXG5cdCAqIEBwYXJhbSBpbWFnZVBhdGhcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgU3RyaXBJbWFnZUV4dGVuc2lvbihpbWFnZVBhdGgpIHtcblx0XHRyZXR1cm4gaW1hZ2VQYXRoLnJlcGxhY2UoLyhcXC5wbmckfFxcLmdpZiR8XFwuanBlZyR8XFwuanBnJCkvLCcnKVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdW5sb2FkZWRcblx0ICogQHBhcmFtIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgVW5sb2FkZWQoY29tcG9uZW50KSB7XG5cdFx0aWYgKFxuXHRcdFx0VXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbXBvbmVudCkgfHxcblx0XHRcdFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQuaW5zdGFuY2UpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExvYWRlZChjb21wb25lbnQpIHtcblx0XHRpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5pbnN0YW5jZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdHN0YXRpYyBCdWlsZFZlY3RvclNvdXJjZShyZXN1bHQsIG5hbWUsIGRpbWVuc2lvbikge1xuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gMikge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZGltZW5zaW9uID09PSAzKSB7XG5cdFx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZGltZW5zaW9uID09PSA0KSB7XG5cdFx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnogPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS53ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc29sZS53YXJuKCd1bmtub3duIGRpbWVuc2lvbiA6ICcgKyBkaW1lbnNpb24pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCAnaW5zdGFuY2VzJyBvZiB0aGUgYXJyYXksIG9yIG51bGwgaWYgYW4gJ2luc3RhbmNlJyBpcyB1bmRlZmluZWRcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKi9cblx0c3RhdGljIEdldEFycmF5SW5zdGFuY2VzKGFycmF5KSB7XG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgb2JqZWN0KSB7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKG9iamVjdC5pbnN0YW5jZSkpIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKG9iamVjdC5pbnN0YW5jZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdFtdXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgU29ydEZhY2VzQnlNYXRlcmlhbEluZGV4KGZhY2VzKSB7XG5cblx0XHQvKipcblx0XHQgKiBTb3J0cyBmYWNlcyBhY2NvcmRpbmcgdG8gbWF0ZXJpYWwgaW5kZXggYmVjYXVzZSBsYXRlciB3ZSB3aWxsIGNyZWF0ZVxuXHRcdCAqIGdyb3VwcyBmb3IgZWFjaCB2ZXJ0aWNlIGdyb3VwXG5cdFx0ICovXG5cdFx0ZmFjZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cblx0XHRcdGlmIChhLm1hdGVyaWFsSW5kZXggPCBiLm1hdGVyaWFsSW5kZXgpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYS5tYXRlcmlhbEluZGV4ID4gYi5tYXRlcmlhbEluZGV4KSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9KTtcblxuXHRcdHJldHVybiBmYWNlcztcblx0fTtcblxuXHRzdGF0aWMgQnVpbGRRdWF0ZXJuaW9uU291cmNlKHJlc3VsdCwgbmFtZSkge1xuXHRcdHJlc3VsdFtuYW1lXSA9IHt9O1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzID0ge307XG5cdFx0cmVzdWx0W25hbWVdLmF4aXMueCA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzLnkgPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcy56ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLmFuZ2xlID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLnggPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS56ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLncgPSBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgT2JqZWN0UHJvcGVydGllc0FzQm9vbGVhbihvYmplY3QpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5yZWR1Y2UoXG5cdFx0XHRmdW5jdGlvbihyZXN1bHQsIHByb3BlcnR5SWQpIHtcblxuXHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdFtwcm9wZXJ0eUlkXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcHJvcGVydHlJZF0gPSBmYWxzZTtcblxuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yMikge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCAyKTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yMykge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCAzKTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yNCkge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCA0KTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuUXVhdGVybmlvbikge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRRdWF0ZXJuaW9uU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCk7XG5cdFx0XHRcdC8vIH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHR9LmJpbmQodGhpcyksXG5cdFx0XHR7fVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIEdldFJ1bnRpbWUoKSB7XG5cblx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcblxuXHRcdFIzLkV2ZW50LkVtaXQoXG5cdFx0XHRSMy5FdmVudC5HRVRfUlVOVElNRSxcblx0XHRcdG51bGwsXG5cdFx0XHRmdW5jdGlvbihydW50aW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJ1bnRpbWU7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHdpbmRvdyBzaXplIG9yIG51bGxcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFdpbmRvd1NpemUoKSB7XG5cblx0XHRsZXQgc2l6ZSA9IG51bGw7XG5cblx0XHRSMy5FdmVudC5FbWl0KFxuXHRcdFx0UjMuRXZlbnQuR0VUX1dJTkRPV19TSVpFLFxuXHRcdFx0bnVsbCxcblx0XHRcdGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdFx0c2l6ZSA9IGRhdGE7XG5cdFx0XHR9LmJpbmQodGhpcylcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHNpemU7XG5cblx0fTtcblxuXHQvKipcblx0ICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gdXBkYXRlIG9iamVjdCB3aWR0aCBhbmQgaGVpZ2h0IG1lbWJlcnMgd2l0aCB3aW5kb3cgc2l6ZVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFVwZGF0ZVdpbmRvd1NpemUob2JqZWN0KSB7XG5cdFx0bGV0IHNpemUgPSBVdGlscy5HZXRXaW5kb3dTaXplKCk7XG5cdFx0b2JqZWN0LndpZHRoID0gc2l6ZS53aWR0aDtcblx0XHRvYmplY3QuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG5cdH07XG5cblxuXHQvKipcblx0ICogUmV0dXJucyBpZCBvZiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGFycmF5LCBvdGhlcndpc2UgbnVsbFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIE9iamVjdElkV2l0aE5hbWVJbkFycmF5KG5hbWUsIGFycmF5KSB7XG5cblx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCBvYmplY3QpIHtcblxuXHRcdFx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChuYW1lID09PSBvYmplY3QubmFtZSkge1xuXHRcdFx0XHRcdHJldHVybiBvYmplY3QuaWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0sXG5cdFx0XHRudWxsXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgTG9hZElkc0Zyb21BcnJheVRvSWRPYmplY3QoYXJyYXksIGlkVG9PYmplY3QpIHtcblxuXHR9O1xuXG5cdHN0YXRpYyBMb2FkSWRzRnJvbU9iamVjdFRvSWRPYmplY3Qob2JqZWN0LCBpZFRvT2JqZWN0KSB7XG5cblxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHJhbmRvbSBpbnQgZXhjbHVzaXZlIG9mIG1heGltdW0gYnV0IGluY2x1c2l2ZSBvZiBtaW5pbXVtXG5cdCAqIEBwYXJhbSBtaW5cblx0ICogQHBhcmFtIG1heFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UmFuZG9tSW50KG1pbiwgbWF4KSB7XG5cdFx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdFx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47IC8vVGhlIG1heGltdW0gaXMgZXhjbHVzaXZlIGFuZCB0aGUgbWluaW11bSBpcyBpbmNsdXNpdmVcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyByYW5kb20gaW50IGluY2x1c2l2ZSBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtXG5cdCAqIEBwYXJhbSBtaW5cblx0ICogQHBhcmFtIG1heFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UmFuZG9tSW50SW5jbHVzaXZlKG1pbiwgbWF4KSB7XG5cdFx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdFx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOyAvL1RoZSBtYXhpbXVtIGlzIGluY2x1c2l2ZSBhbmQgdGhlIG1pbmltdW0gaXMgaW5jbHVzaXZlXG5cdH07XG5cblx0c3RhdGljIEludGVycG9sYXRlQXJyYXkoZGF0YSwgZml0Q291bnQpIHtcblxuXHRcdGxldCBsaW5lYXJJbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKGJlZm9yZSwgYWZ0ZXIsIGF0UG9pbnQpIHtcblx0XHRcdHJldHVybiBiZWZvcmUgKyAoYWZ0ZXIgLSBiZWZvcmUpICogYXRQb2ludDtcblx0XHR9O1xuXG5cdFx0bGV0IG5ld0RhdGEgPSBbXTtcblxuXHRcdGxldCBzcHJpbmdGYWN0b3IgPSBOdW1iZXIoKGRhdGEubGVuZ3RoIC0gMSkgLyAoZml0Q291bnQgLSAxKSk7XG5cblx0XHRuZXdEYXRhWzBdID0gZGF0YVswXTsgLy8gZm9yIG5ldyBhbGxvY2F0aW9uXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCBmaXRDb3VudCAtIDE7IGkrKykge1xuXHRcdFx0bGV0IHRtcCAgICAgPSBpICogc3ByaW5nRmFjdG9yO1xuXHRcdFx0bGV0IGJlZm9yZSAgPSBOdW1iZXIoTWF0aC5mbG9vcih0bXApKS50b0ZpeGVkKCk7XG5cdFx0XHRsZXQgYWZ0ZXIgICA9IE51bWJlcihNYXRoLmNlaWwodG1wKSkudG9GaXhlZCgpO1xuXHRcdFx0bGV0IGF0UG9pbnQgPSB0bXAgLSBiZWZvcmU7XG5cdFx0XHRuZXdEYXRhW2ldICA9IGxpbmVhckludGVycG9sYXRlKGRhdGFbYmVmb3JlXSwgZGF0YVthZnRlcl0sIGF0UG9pbnQpO1xuXHRcdH1cblxuXHRcdG5ld0RhdGFbZml0Q291bnQgLSAxXSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXTsgLy8gZm9yIG5ldyBhbGxvY2F0aW9uXG5cblx0XHRyZXR1cm4gbmV3RGF0YTtcblx0fTtcblxuXHQvKipcblx0ICogVW5kZWZpbmVkIG9yIG51bGwgY2hlY2tcblx0ICogQHBhcmFtIHZhcmlhYmxlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBVbmRlZmluZWRPck51bGwoXG5cdFx0dmFyaWFibGVcblx0KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFyaWFibGUgPT09IG51bGw7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBpcyBub3QgdW5kZWZpbmVkIGFuZCBub3QgbnVsbFxuXHQgKiBAcGFyYW0gdmFyaWFibGVcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIERlZmluZWQoXG5cdFx0dmFyaWFibGVcblx0KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YXJpYWJsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFyaWFibGUgIT09IG51bGw7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgZnVuY3Rpb24gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gZm5cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UGFyYW1ldGVycyhmbikge1xuXG5cdFx0bGV0IEZOX0FSR1MgPSAvXmZ1bmN0aW9uXFxzKlteXFwoXSpcXChcXHMqKFteXFwpXSopXFwpL207XG5cdFx0bGV0IEZOX0FSR19TUExJVCA9IC8sLztcblx0XHRsZXQgRk5fQVJHID0gL15cXHMqKF8/KSguKz8pXFwxXFxzKiQvO1xuXHRcdGxldCBTVFJJUF9DT01NRU5UUyA9IC8oXFwvXFwvLiokKXwoXFwvXFwqW1xcc1xcU10qP1xcKlxcLyl8KFxccyo9W14sXFwpXSooKCcoPzpcXFxcJ3xbXidcXHJcXG5dKSonKXwoXCIoPzpcXFxcXCJ8W15cIlxcclxcbl0pKlwiKSl8KFxccyo9W14sXFwpXSopKS9tZztcblxuXHRcdGxldCBwYXJhbWV0ZXJzLFxuXHRcdFx0Zm5UZXh0LFxuXHRcdFx0YXJnRGVjbDtcblxuXHRcdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHBhcmFtZXRlcnMgPSBbXTtcblx0XHRcdGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpO1xuXHRcdFx0YXJnRGVjbCA9IGZuVGV4dC5tYXRjaChGTl9BUkdTKTtcblx0XHRcdGFyZ0RlY2xbMV0uc3BsaXQoRk5fQVJHX1NQTElUKS5mb3JFYWNoKGZ1bmN0aW9uKGFyZykge1xuXHRcdFx0XHRhcmcucmVwbGFjZShGTl9BUkcsIGZ1bmN0aW9uKGFsbCwgdW5kZXJzY29yZSwgbmFtZSkge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMucHVzaChuYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJub3QgYSBmdW5jdGlvblwiKVxuXHRcdH1cblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGVpdGhlciBhbiBJRCBvZiB0aGUgb2JqZWN0IG9yIE51bGxcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAcmV0dXJucyB7bnVsbH1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgSWRPck51bGwob2JqZWN0KSB7XG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QuaWQpKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybignc2F2aW5nIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCBubyBJRCA6ICcsIG9iamVjdCk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9iamVjdC5pZDtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIExpbWl0IGEgcHJvcGVydHkgdG8gdmFsdWVzIGJldHdlZW4gLXBpIGFuZCArcGlcblx0ICogQHBhcmFtIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBvYmplY3RQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyB7e2NvbmZpZ3VyYWJsZT86IGJvb2xlYW4sIGVudW1lcmFibGU/OiBib29sZWFuLCB2YWx1ZT8sIHdyaXRhYmxlPzogYm9vbGVhbiwgZ2V0PzogRnVuY3Rpb24sIHNldD86IEZ1bmN0aW9ufX1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgTGltaXRUb1BJKHByb3BlcnR5LCBvYmplY3RQcm9wZXJ0eSkge1xuXG5cdFx0bGV0IHN0b3JlID0gb2JqZWN0UHJvcGVydHk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0IDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBzdG9yZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQgOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHR3aGlsZSAodmFsdWUgPiBNYXRoLlBJKSB7XG5cdFx0XHRcdFx0dmFsdWUgLT0gKE1hdGguUEkgKiAyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHdoaWxlICh2YWx1ZSA8IC0oTWF0aC5QSSkpIHtcblx0XHRcdFx0XHR2YWx1ZSArPSAoTWF0aC5QSSAqIDIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RvcmUgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIElEcyByZXByZXNlbnRpbmcgdGhlIG9iamVjdHNcblx0ICogQHBhcmFtIGFycmF5XG5cdCAqIEByZXR1cm5zIFtdXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElkQXJyYXlPckVtcHR5QXJyYXkoYXJyYXkpIHtcblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGFycmF5KSkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuXG5cdFx0XHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoaXRlbS5pZCkpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIElEIGZvdW5kIHdoaWxlIHRyeWluZyB0byBzdG9yZSBJRHMgdG8gYXJyYXknKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpdGVtLmlkXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIExpbmtzIGFuIG9iamVjdCB0byBpdHMgcGFyZW50IHRocm91Z2ggaWRUb09iamVjdCBhcnJheVxuXHQgKiBAcGFyYW0gcHJvcGVydHlTdHJpbmdcblx0ICogQHBhcmFtIGlkVG9PYmplY3Rcblx0ICogQHBhcmFtIHBhcmVudE9iamVjdFxuXHQgKiBAcGFyYW0gaWRcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgTGluayhwcm9wZXJ0eVN0cmluZywgaWRUb09iamVjdCwgcGFyZW50T2JqZWN0LCBpZCkge1xuXG5cdFx0aWYgKCFVdGlscy5VbmRlZmluZWRPck51bGwocGFyZW50T2JqZWN0W3Byb3BlcnR5U3RyaW5nXSkpIHtcblxuXHRcdFx0aWYgKCFpZFRvT2JqZWN0Lmhhc093blByb3BlcnR5KGlkKSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ0xpbmtpbmcgZmFpbGVkIGZvciBvYmplY3Q6JyArIHBhcmVudE9iamVjdC5uYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0cGFyZW50T2JqZWN0W3Byb3BlcnR5U3RyaW5nXSA9IGlkVG9PYmplY3RbaWRdO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIGEgcmFuZG9tIElEXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFJhbmRvbUlkKGxlbmd0aCkge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChsZW5ndGgpKSB7XG5cdFx0XHRsZW5ndGggPSAxMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIGxlbmd0aCk7XG5cdH07XG5cblx0c3RhdGljIEludmVydFdpbmRpbmdPcmRlcih0cmlhbmdsZXMpIHtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgdjEgPSB0cmlhbmdsZXNbaV0udjE7XG5cdFx0XHR0cmlhbmdsZXNbaV0udjEgPSB0cmlhbmdsZXNbaV0udjI7XG5cdFx0XHR0cmlhbmdsZXNbaV0udjIgPSB2MTtcblxuXHRcdFx0bGV0IGJhY2t1cFVWID0gdHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYxdXY7XG5cdFx0XHR0cmlhbmdsZXNbaV0udHJpYW5nbGUudjF1diA9IHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MnV2O1xuXHRcdFx0dHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYydXYgPSBiYWNrdXBVVjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBJbnZlcnRzIGEgbWVzaCB3aW5kaW5nIG9yZGVyIChhbmQgaXRzIGluc3RhbmNlKVxuXHQgKiBAcGFyYW0gbWVzaCBSMy5EMy5NZXNoXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJbnZlcnRNZXNoV2luZGluZ09yZGVyKG1lc2gpIHtcblxuXHRcdG1lc2guZmFjZXMuZm9yRWFjaChcblx0XHRcdGZ1bmN0aW9uKGZhY2UpIHtcblxuXHRcdFx0XHRsZXQgdG1wVjEgPSBmYWNlLnYxO1xuXHRcdFx0XHRmYWNlLnYxID0gZmFjZS52Mjtcblx0XHRcdFx0ZmFjZS52MiA9IHRtcFYxO1xuXG5cdFx0XHRcdGxldCB0bXBWMXV2ID0gZmFjZS52MXV2O1xuXHRcdFx0XHRmYWNlLnYxdXYgPSBmYWNlLnYydXY7XG5cdFx0XHRcdGZhY2UudjJ1diA9IHRtcFYxdXY7XG5cblx0XHRcdH0uYmluZCh0aGlzKVxuXHRcdCk7XG5cblx0XHQvL21lc2guY29tcHV0ZU5vcm1hbHMgPSB0cnVlO1xuXHRcdC8vbWVzaC5jcmVhdGVJbnN0YW5jZSgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBhIHRoZSB3aW5kaW5nIG9yZGVyIG9mIGEgbWVzaCBmcm9tIGEgcmVmZXJlbmNlIHBvaW50IFYgKHRoZSBhdmVyYWdlIGNlbnRlciBvZiB0aGUgbWVzaClcblx0ICovXG5cdHN0YXRpYyBSZXNldFdpbmRpbmdPcmRlcihmYWNlcywgdmVydGljZXMpIHtcblxuXHRcdGxldCB2ZXJ0ZXhMaXN0ID0gbmV3IFIzLkFQSS5WZWN0b3IzLlBvaW50cygpO1xuXG5cdFx0Zm9yIChsZXQgdiA9IDA7IHYgPCB2ZXJ0aWNlcy5sZW5ndGg7IHYrKykge1xuXHRcdFx0dmVydGV4TGlzdC5hZGQobmV3IFIzLkFQSS5WZWN0b3IzKFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi54LFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi55LFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi56XG5cdFx0XHQpKTtcblx0XHR9XG5cblx0XHRsZXQgViA9IHZlcnRleExpc3QuYXZlcmFnZSgpO1xuXG5cdFx0bGV0IHRyaWFuZ2xlcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgcyA9IDA7IHMgPCBmYWNlcy5sZW5ndGg7IHMgKz0gMykge1xuXG5cdFx0XHRsZXQgdjAgPSBmYWNlc1tzXTtcblx0XHRcdGxldCB2MSA9IGZhY2VzW3MrMV07XG5cdFx0XHRsZXQgdjIgPSBmYWNlc1tzKzJdO1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHYwIDogdjAsXG5cdFx0XHRcdFx0djEgOiB2MSxcblx0XHRcdFx0XHR2MiA6IHYyLFxuXHRcdFx0XHRcdGVkZ2VzIDogW1xuXHRcdFx0XHRcdFx0e3YwOiB2MCwgdjE6IHYxfSxcblx0XHRcdFx0XHRcdHt2MDogdjEsIHYxOiB2Mn0sXG5cdFx0XHRcdFx0XHR7djA6IHYyLCB2MTogdjB9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR3aW5kaW5nIDogMCxcblx0XHRcdFx0XHRlZGdlSW5kZXggOiAtMSxcblx0XHRcdFx0XHRwcm9jZXNzZWQgOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdFIzLkFQSS5WZWN0b3IzLmNsb2Nrd2lzZShcblx0XHRcdFx0XHR2ZXJ0aWNlc1t0cmlhbmdsZXNbaV0udjBdLnBvc2l0aW9uLFxuXHRcdFx0XHRcdHZlcnRpY2VzW3RyaWFuZ2xlc1tpXS52MV0ucG9zaXRpb24sXG5cdFx0XHRcdFx0dmVydGljZXNbdHJpYW5nbGVzW2ldLnYyXS5wb3NpdGlvbixcblx0XHRcdFx0XHRWXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zb2xlLmxvZygnY2xvY2t3aXNlJyk7XG5cdFx0XHRcdGxldCBidjEgPSB0cmlhbmdsZXNbaV0udjE7XG5cdFx0XHRcdHRyaWFuZ2xlc1tpXS52MSA9IHRyaWFuZ2xlc1tpXS52Mjtcblx0XHRcdFx0dHJpYW5nbGVzW2ldLnYyID0gYnYxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ25vdCBjbG9ja3dpc2UnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgd2luZGluZyBvcmRlciBmb3IgdHJpYW5nbGVzIGluIGZhY2VzLCBnaXZlbiBhbiBpbml0aWFsIHRyaWFuZ2xlIGFuZCBvcmllbnRhdGlvbiBlZGdlXG5cdCAqIHVzZWQgcHNldWRvY29kZSBmcm9tXG5cdCAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzY5NzAvaG93LXRvLWNvcnJlY3Qtd2luZGluZy1vZi10cmlhbmdsZXMtdG8tY291bnRlci1jbG9ja3dpc2UtZGlyZWN0aW9uLW9mLWEtM2QtbWVzaFxuXHQgKiAgV2UgbmVlZCB0byB1c2UgYSBncmFwaCB0cmF2ZXJzYWwgYWxnb3JpdGhtLFxuXHQgKiAgbGV0cyBhc3N1bWUgd2UgaGF2ZSBtZXRob2QgdGhhdCByZXR1cm5zIG5laWdoYm9yIG9mIHRyaWFuZ2xlIG9uIGdpdmVuIGVkZ2Vcblx0ICpcblx0ICogICAgICBuZWlnaGJvcl9vbl9lZ2RlKCBuZXh0X3RyaWEsIGVkZ2UgKVxuXHQgKlxuXHQgKiAgdG9fcHJvY2VzcyA9IHNldCBvZiBwYWlycyB0cmlhbmdsZSBhbmQgb3JpZW50YXRpb24gZWRnZSwgaW5pdGlhbCBzdGF0ZSBpcyBvbmUgZ29vZCBvcmllbnRlZCB0cmlhbmdsZSB3aXRoIGFueSBlZGdlIG9uIGl0XG5cdCAqICBwcm9jZXNzZWQgPSBzZXQgb2YgcHJvY2Vzc2VkIHRyaWFuZ2xlczsgaW5pdGlhbCBlbXB0eVxuXHQgKlxuXHQgKiAgd2hpbGUgdG9fcHJvY2VzcyBpcyBub3QgZW1wdHk6XG5cdCAqICAgICAgbmV4dF90cmlhLCBvcmllbnRhdGlvbl9lZGdlID0gdG9fcHJvY2Vzcy5wb3AoKVxuXHQgKiAgICAgIGFkZCBuZXh0X3RyaWEgaW4gcHJvY2Vzc2VkXG5cdCAqICAgICAgaWYgbmV4dF90cmlhIGlzIG5vdCBvcHBvc2l0ZSBvcmllbnRlZCB0aGFuIG9yaWVudGF0aW9uX2VkZ2U6XG5cdCAqICAgICAgICAgIGNoYW5nZSBuZXh0X3RyaWEgKEFCQykgb3JpZW50YXRpb24gIChCPC0+Qylcblx0ICogICAgICBmb3IgZWFjaCBlZGdlIChBQikgaW4gbmV4dF90cmlhOlxuXHQgKiAgICAgICAgICBuZWlnaGJvcl90cmlhID0gbmVpZ2hib3Jfb25fZWdkZSggbmV4dF90cmlhLCBlZGdlIClcblx0ICogICAgICAgICAgaWYgbmVpZ2hib3JfdHJpYSBleGlzdHMgYW5kIG5laWdoYm9yX3RyaWEgbm90IGluIHByb2Nlc3NlZDpcblx0ICogICAgICAgICAgICAgIHRvX3Byb2Nlc3MgYWRkIChuZWlnaGJvcl90cmlhLCBlZGdlIG9wcG9zaXRlIG9yaWVudGVkIChCQSkpXG5cdCAqIEBwYXJhbSBmYWNlcyBSMy5EMy5GYWNlW11cblx0ICogQHBhcmFtIG9yaWVudGF0aW9uRWRnZSBSMy5BUEkuVmVjdG9yMlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9XG5cdCAqL1xuXHRzdGF0aWMgRml4V2luZGluZ09yZGVyKGZhY2VzLCBvcmllbnRhdGlvbkVkZ2UpIHtcblxuXHRcdC8qKlxuXHRcdCAqIENoZWNrcyBpZiBhIEZhY2UgYmVsb25naW5nIHRvIGEgVHJpYW5nbGVFZGdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkXG5cdFx0ICogQHBhcmFtIHByb2Nlc3NlZCBUcmlhbmdsZUVkZ2VbXVxuXHRcdCAqIEBwYXJhbSB0cmlhbmdsZSBGYWNlXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaW5Qcm9jZXNzZWQocHJvY2Vzc2VkLCB0cmlhbmdsZSkge1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkW2ldLnRyaWFuZ2xlLmVxdWFscyh0cmlhbmdsZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyBhIG5laWdoYm91cmluZyB0cmlhbmdsZSBvbiBhIHNwZWNpZmljIGVkZ2UgLSBwcmVzZXJ2aW5nIHRoZSBlZGdlIG9yaWVudGF0aW9uXG5cdFx0ICogQHBhcmFtIGVkZ2UgUjMuQVBJLlZlY3RvcjJcblx0XHQgKiBAcGFyYW0gZmFjZXMgUjMuRDMuRmFjZVtdXG5cdFx0ICogQHBhcmFtIGN1cnJlbnRUcmlhbmdsZVxuXHRcdCAqIEByZXR1cm5zIHsqfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIG5laWdoYm91ck9uRWRnZShlZGdlLCBmYWNlcywgY3VycmVudFRyaWFuZ2xlKSB7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MCA9PT0gZWRnZS54ICYmIGZhY2VzW2ldLnYxID09PSBlZGdlLnkpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYxID09PSBlZGdlLnggJiYgZmFjZXNbaV0udjIgPT09IGVkZ2UueSkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjIgPT09IGVkZ2UueCAmJiBmYWNlc1tpXS52MCA9PT0gZWRnZS55KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MCA9PT0gZWRnZS55ICYmIGZhY2VzW2ldLnYxID09PSBlZGdlLngpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYxID09PSBlZGdlLnkgJiYgZmFjZXNbaV0udjIgPT09IGVkZ2UueCkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjIgPT09IGVkZ2UueSAmJiBmYWNlc1tpXS52MCA9PT0gZWRnZS54KVxuXHRcdFx0XHQpIHtcblxuXHRcdFx0XHRcdGxldCB0cmlhbmdsZSA9IG5ldyBSMy5EMy5BUEkuRmFjZShcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0udjBpbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnYxaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS52MmluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0ubWF0ZXJpYWxJbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnV2c1xuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAodHJpYW5nbGUuZXF1YWxzKGN1cnJlbnRUcmlhbmdsZSkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBuZXcgUjMuRDMuVHJpYW5nbGVFZGdlKFxuXHRcdFx0XHRcdFx0dHJpYW5nbGUsXG5cdFx0XHRcdFx0XHRlZGdlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRsZXQgdG9Qcm9jZXNzID0gW1xuXHRcdFx0bmV3IFIzLkQzLlRyaWFuZ2xlRWRnZShcblx0XHRcdFx0bmV3IFIzLkQzLkFQSS5GYWNlKFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRmYWNlc1swXS52MGluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnYxaW5kZXgsXG5cdFx0XHRcdFx0ZmFjZXNbMF0udjJpbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS5tYXRlcmlhbEluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnV2c1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRvcmllbnRhdGlvbkVkZ2Vcblx0XHRcdClcblx0XHRdO1xuXG5cdFx0bGV0IHByb2Nlc3NlZCA9IFtdO1xuXG5cdFx0d2hpbGUgKHRvUHJvY2Vzcy5sZW5ndGggPiAwKSB7XG5cblx0XHRcdGxldCB0cmlhbmdsZUVkZ2UgPSB0b1Byb2Nlc3MucG9wKCk7XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgZWRnZSBpcyB0aGUgc2FtZSBvcmllbnRhdGlvbiAoaS5lLiB0aGUgZWRnZSBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gdHJpYW5nbGUgZWRnZSkgaXQgbmVlZHMgdG8gYmUgcmV2ZXJzZWRcblx0XHRcdCAqIHRvIGhhdmUgdGhlIHNhbWUgd2luZGluZyBvcmRlcilcblx0XHRcdCAqL1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQodHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnggJiZcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueSkgfHxcblx0XHRcdFx0KHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS54ICYmXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnkpIHx8XG5cdFx0XHRcdCh0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueCAmJlxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS55KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBiYWNrdXBWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXg7XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4ID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXg7XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4ID0gYmFja3VwVjtcblxuXHRcdFx0XHQvLyBsZXQgYmFja3VwVVYgPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjF1djtcblx0XHRcdFx0Ly8gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxdXYgPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJ1djtcblx0XHRcdFx0Ly8gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYydXYgPSBiYWNrdXBVVjtcblx0XHRcdFx0Ly9cblx0XHRcdFx0bGV0IGJhY2t1cFVWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnV2c1swXVsxXTtcblx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnV2c1swXVsxXSA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMl07XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMl0gPSBiYWNrdXBVVjtcblx0XHRcdH1cblxuXHRcdFx0cHJvY2Vzc2VkLnB1c2godHJpYW5nbGVFZGdlKTtcblxuXHRcdFx0bGV0IGVkZ2VzID0gW1xuXHRcdFx0XHRuZXcgUjMuQVBJLlZlY3RvcjIoXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXgsXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXhcblx0XHRcdFx0KSxcblx0XHRcdFx0bmV3IFIzLkFQSS5WZWN0b3IyKFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4LFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4XG5cdFx0XHRcdCksXG5cdFx0XHRcdG5ldyBSMy5BUEkuVmVjdG9yMihcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCxcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjBpbmRleFxuXHRcdFx0XHQpXG5cdFx0XHRdO1xuXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGxldCBuZWlnaGJvdXIgPSBuZWlnaGJvdXJPbkVkZ2UoZWRnZXNbal0sIGZhY2VzLCB0cmlhbmdsZUVkZ2UudHJpYW5nbGUpO1xuXHRcdFx0XHRpZiAobmVpZ2hib3VyICYmICFpblByb2Nlc3NlZChwcm9jZXNzZWQsIG5laWdoYm91ci50cmlhbmdsZSkpIHtcblx0XHRcdFx0XHR0b1Byb2Nlc3MucHVzaChuZWlnaGJvdXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogSW4gcHJvY2Vzc2VkIC0gd2Ugd2lsbCBoYXZlIHNvbWUgZHVwbGljYXRlcyAtIG9ubHkgYWRkIHRoZSB1bmlxdWUgb25lc1xuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0XHRsZXQgdHJpYW5nbGVzID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCB0cmlhbmdsZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0aWYgKHRyaWFuZ2xlc1trXS5lcXVhbHMocHJvY2Vzc2VkW2ldLnRyaWFuZ2xlKSl7XG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyaWFuZ2xlcy5wdXNoKHByb2Nlc3NlZFtpXS50cmlhbmdsZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZ1bmN0aW9uIHRvIGZpeCBwb2x5cyB3aGljaCBkb24ndCB0cmlhbmd1bGF0ZSBiZWNhdXNlXG5cdCAqIHRoZXkgY291bGQgbGllIG9uIFotcGxhbmUgKFhaIG9yIFlaKSkgLSB3ZSB0cmFuc2xhdGUgdGhlIHBvbHkgdG8gdGhlIG9yaWdpbiwgc3lzdGVtYXRpY2FsbHkgcm90YXRlIHRoZSBwb2x5IGFyb3VuZFxuXHQgKiBaIHRoZW4gWSBheGlzXG5cdCAqIEBwYXJhbSB2ZXJ0aWNlc0ZsYXQgW11cblx0ICogQHBhcmFtIGdyYWluIGlzIHRoZSBhbW91bnQgdG8gc3lzdGVtYXRpY2FsbHkgcm90YXRlIHRoZSBwb2x5IGJ5IC0gYSBmaW5lciBncmFpbiBtZWFucyBhIG1vcmUgYWNjdXJhdGUgbWF4aW11bSBYWVxuXHQgKiBAcmV0dXJuIFtdXG5cdCAqL1xuXHRzdGF0aWMgRml4UG9seVpQbGFuZSh2ZXJ0aWNlc0ZsYXQsIGdyYWluKSB7XG5cblx0XHRpZiAoKHZlcnRpY2VzRmxhdC5sZW5ndGggJSAzKSAhPT0gMCAmJiAhKHZlcnRpY2VzRmxhdC5sZW5ndGggPiA5KSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJUaGUgdmVydGljZXMgYXJlIG5vdCBpbiB0aGUgcmlnaHQgbGVuZ3RoIDogXCIgKyB2ZXJ0aWNlc0ZsYXQubGVuZ3RoKTtcblx0XHR9XG5cblx0XHRsZXQgdmVydGljZXMgPSBbXTtcblxuXHRcdGxldCBwb2ludHMgPSBuZXcgUjMuQVBJLlF1YXRlcm5pb24uUG9pbnRzKCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzRmxhdC5sZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0cG9pbnRzLmFkZChuZXcgUjMuQVBJLlZlY3RvcjMoXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpXSxcblx0XHRcdFx0dmVydGljZXNGbGF0W2kgKyAxXSxcblx0XHRcdFx0dmVydGljZXNGbGF0W2kgKyAyXVxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0cG9pbnRzLnRvT3JpZ2luKCk7XG5cblx0XHRwb2ludHMubWF4aW1pemVYRGlzdGFuY2UoZ3JhaW4pO1xuXG5cdFx0cG9pbnRzLm1heGltaXplWURpc3RhbmNlKGdyYWluKTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHMudmVjdG9ycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmVydGljZXMucHVzaChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdHBvaW50cy52ZWN0b3JzW2ldLngsXG5cdFx0XHRcdFx0cG9pbnRzLnZlY3RvcnNbaV0ueVxuXHRcdFx0XHRdXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fTtcblxuXHRzdGF0aWMgTW92aW5nQXZlcmFnZShwZXJpb2QpIHtcblx0XHRsZXQgbnVtcyA9IFtdO1xuXHRcdHJldHVybiBmdW5jdGlvbihudW0pIHtcblx0XHRcdG51bXMucHVzaChudW0pO1xuXHRcdFx0aWYgKG51bXMubGVuZ3RoID4gcGVyaW9kKVxuXHRcdFx0XHRudW1zLnNwbGljZSgwLDEpOyAgLy8gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheVxuXHRcdFx0bGV0IHN1bSA9IDA7XG5cdFx0XHRmb3IgKGxldCBpIGluIG51bXMpXG5cdFx0XHRcdHN1bSArPSBudW1zW2ldO1xuXHRcdFx0bGV0IG4gPSBwZXJpb2Q7XG5cdFx0XHRpZiAobnVtcy5sZW5ndGggPCBwZXJpb2QpXG5cdFx0XHRcdG4gPSBudW1zLmxlbmd0aDtcblx0XHRcdHJldHVybihzdW0vbik7XG5cdFx0fVxuXHR9O1xuXG5cdHN0YXRpYyBJbnRlcnNlY3QoYSwgYikge1xuXG5cdFx0bGV0IHQ7XG5cblx0XHQvKipcblx0XHQgKiBMb29wIG92ZXIgc2hvcnRlc3QgYXJyYXlcblx0XHQgKi9cblx0XHRpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuXHRcdFx0dCA9IGI7XG5cdFx0XHRiID0gYTtcblx0XHRcdGEgPSB0O1xuXHRcdH1cblxuXHRcdHJldHVybiBhLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgZXhpc3RzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIChiLmluZGV4T2YoZSkgPiAtMSk7XG5cdFx0XHR9XG5cdFx0KS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlbW92ZSBEdXBsaWNhdGVzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHBhcmFtIGlcblx0XHRcdCAqIEBwYXJhbSBjXG5cdFx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24oZSwgaSwgYykge1xuXHRcdFx0XHRyZXR1cm4gYy5pbmRleE9mKGUpID09PSBpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIERpZmZlcmVuY2UoYSwgYikge1xuXG5cdFx0bGV0IHQ7XG5cblx0XHQvKipcblx0XHQgKiBMb29wIG92ZXIgc2hvcnRlc3QgYXJyYXlcblx0XHQgKi9cblx0XHRpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuXHRcdFx0dCA9IGI7XG5cdFx0XHRiID0gYTtcblx0XHRcdGEgPSB0O1xuXHRcdH1cblxuXHRcdHJldHVybiBhLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgZXhpc3RzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIChiLmluZGV4T2YoZSkgPT09IC0xKTtcblx0XHRcdH1cblx0XHQpLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogUmVtb3ZlIER1cGxpY2F0ZXNcblx0XHRcdCAqIEBwYXJhbSBlXG5cdFx0XHQgKiBAcGFyYW0gaVxuXHRcdFx0ICogQHBhcmFtIGNcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlLCBpLCBjKSB7XG5cdFx0XHRcdHJldHVybiBjLmluZGV4T2YoZSkgPT09IGk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fTtcblxuXHQvKipcblx0ICogUHVzaCBvbmx5IGlmIG5vdCBpbiB0aGVyZSBhbHJlYWR5XG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFB1c2hVbmlxdWUoYXJyYXksIG9iamVjdCkge1xuXG5cdFx0aWYgKGFycmF5LmluZGV4T2Yob2JqZWN0KSA9PT0gLTEpIHtcblx0XHRcdGFycmF5LnB1c2gob2JqZWN0KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGVtcHR5XG5cdCAqIEBwYXJhbSBvYmpcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElzRW1wdHkob2JqKSB7XG5cdFx0cmV0dXJuIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCk7XG5cdH07XG5cblx0c3RhdGljIElzU3RyaW5nKG1lbWJlcikge1xuXHRcdHJldHVybiAodHlwZW9mIG1lbWJlciA9PT0gJ3N0cmluZycpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc0Jvb2xlYW4obWVtYmVyKSB7XG5cdFx0cmV0dXJuIChtZW1iZXIgPT09IHRydWUgfHwgbWVtYmVyID09PSBmYWxzZSk7XG5cdH07XG5cblx0c3RhdGljIElzQ29sb3IobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChtZW1iZXIgaW5zdGFuY2VvZiBSMy5Db2xvcik7XG5cdH07XG5cblx0c3RhdGljIElzTnVtYmVyKG1lbWJlcikge1xuXHRcdHJldHVybiAodHlwZW9mIG1lbWJlciA9PT0gJ251bWJlcicpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1ZlY3RvcjIobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5WZWN0b3IyIHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5WZWN0b3IyXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgSXNWZWN0b3IzKG1lbWJlcikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuVmVjdG9yMyB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuVmVjdG9yM1xuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzVmVjdG9yNChtZW1iZXIpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuQVBJLlZlY3RvcjQgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLlZlY3RvcjQgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5RdWF0ZXJuaW9uIHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5RdWF0ZXJuaW9uXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgSXNPYmplY3QobWVtYmVyKSB7XG5cdFx0bGV0IHR5cGUgPSB0eXBlb2YgbWVtYmVyO1xuXHRcdHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhbWVtYmVyO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgTG93ZXJVbmRlcnNjb3JlKG5hbWUpIHtcblx0XHRsZXQgc3RyaW5nID0gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJ18nKTtcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvLS9nLCAnXycpO1xuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXF8rL2csICdfJyk7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRzdGF0aWMgVXBwZXJDYXNlV29yZHNTcGFjZXMoaW5wdXQpIHtcblxuXHRcdGxldCB3b3JkID0gaW5wdXQucmVwbGFjZSgvWy1fXS9nLCAnICcpO1xuXG5cdFx0d29yZCA9IHdvcmQucmVwbGFjZSgvXFxzKy8sICcgJyk7XG5cblx0XHRsZXQgd29yZHMgPSB3b3JkLnNwbGl0KCcgJyk7XG5cblx0XHRyZXR1cm4gd29yZHMucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCB3b3JkKSB7XG5cdFx0XHRcdHJlc3VsdCArPSB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnN1YnN0cigxKTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdCArICcgJztcblx0XHRcdH0sXG5cdFx0XHQnJ1xuXHRcdCkudHJpbSgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgVXBwZXJDYXNlVW5kZXJzY29yZSh3b3JkKSB7XG5cblx0XHRsZXQgc3RyID0gJyc7XG5cblx0XHR3b3JkLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24obGV0dGVyKXtcblx0XHRcdGlmIChsZXR0ZXIgPT0gbGV0dGVyLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdFx0c3RyICs9ICdfJyArIGxldHRlcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0ciArPSBsZXR0ZXIudG9VcHBlckNhc2UoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ15fJyksJycpO1xuXG5cdFx0cmV0dXJuIHN0cjtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBMZWZ0IFBhZGRlZCBUZXh0IC0gZXguIGxlbmd0aCA1LCBwYWRjaGFyIDAsIHN0cmluZyBhYmMgPSAnMDBhYmMnXG5cdCAqIEBwYXJhbSBsZW5ndGhcblx0ICogQHBhcmFtIHBhZENoYXJcblx0ICogQHBhcmFtIHN0cmluZ1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBQYWRkZWRUZXh0KGxlbmd0aCwgcGFkQ2hhciwgc3RyaW5nKSB7XG5cblx0XHRsZXQgcGFkID0gXCJcIjtcblxuXHRcdGZvciAobGV0IHggPSAwOyB4IDwgbGVuZ3RoOyB4KyspIHtcblx0XHRcdHBhZCArPSBwYWRDaGFyO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYWQuc3Vic3RyaW5nKDAsIHBhZC5sZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcblx0fTtcbn1cbiIsImNvbnN0IHtTeXN0ZW0sIFN5c3RlbUxpbmtpbmcsIFN5c3RlbVNvY2tldH0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgT2JqZWN0ID0gcmVxdWlyZSgnLi9yMy1vYmplY3QnKTtcblxuY2xhc3MgUjMge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHR9XG5cblx0c3RhdGljIHZlcnNpb24oKSB7XG5cdFx0cmV0dXJuICdfX0RBVEVfXyc7XG5cdH1cblxufVxuXG5SMy5PYmplY3QgXHRcdFx0PSBPYmplY3Q7XG5SMy5TeXN0ZW0gXHRcdFx0PSBTeXN0ZW07XG5SMy5TeXN0ZW0uTGlua2luZ1x0PSBTeXN0ZW1MaW5raW5nO1xuUjMuU3lzdGVtLlNvY2tldFx0PSBTeXN0ZW1Tb2NrZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gUjM7XG4iXSwic291cmNlUm9vdCI6IiJ9