sdc_client 0.158.5 → 0.158.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
24
24
  \*********************************************/
25
25
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
26
26
 
27
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.uuidv4)();\n this.contentUrl = \"\";\n this.contentReload = false;\n this.parsedContentUrl = null;\n this.events = [];\n this.load_async = false;\n this._isEventsSet = false;\n this._allEvents = null;\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn(\"afterShow is deprecated!!\");\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = Object.getPrototypeOf(this)._tagName ?? \"\";\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(method, this._tagName);\n }\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === \"function\") {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n\n /**\n *\n * @return {Promise<*>|*}\n */\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(Array.apply(null, arguments), this._tagName);\n }\n }\n get parentController() {\n return this._parentController;\n }\n get childController() {\n return this._childController;\n }\n onLoad() {\n return this._runLifecycle(\"onLoad\", arguments);\n }\n willShow() {\n return this._runLifecycle(\"willShow\", arguments);\n }\n onRefresh() {\n return this._runLifecycle(\"onRefresh\", arguments);\n }\n onRemove() {\n this._runLifecycle(\"onRemove\", arguments);\n return true;\n }\n noOpenModelRequests() {\n return Promise.all(this._models.map(x => x.noOpenRequests()));\n }\n remove() {\n for (const model of this._models) {\n model.close();\n }\n let _childController = this._childController;\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n this.$container.remove();\n delete this;\n return true;\n }\n return false;\n }\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToReadableName)(this._tagName);\n }\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n return this._allEvents = _.merge(...allEvents);\n }\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error(\"To use the serverCall function the contentUrl must be set: \" + this.name);\n return;\n }\n return (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__.callServer)(app[1], this._tagName, this.parsedContentUrl ?? this.contentUrl, methode, args);\n }\n\n /**\n *\n * @param {string} modelName\n * @param {object?} modelQuery\n * @returns {SdcQuerySet}\n */\n querySet(modelName, modelQuery = {}) {\n const newQuerySet = new _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet(modelName, modelQuery);\n this._models.push(newQuerySet);\n return newQuerySet;\n }\n newModel(modelName, modelQuery = {}) {\n console.warn(\"newModel is deprecated and will soon be removed\");\n return this.querySet(modelName, modelQuery);\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n reconcile($virtualNode, $realNode = null) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reconcile(this, $virtualNode, $realNode);\n }\n submitModelFormDistributor($form, e) {\n if (typeof this._submitModelForm === \"function\") {\n return this._submitModelForm($form, e);\n }\n if (typeof this.submitModelForm === \"function\") {\n return this.submitModelForm($form, e);\n }\n return this.defaultSubmitModelForm($form, e);\n }\n iterateAllChildren() {\n let _childController = this._childController;\n let res = [];\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n res.push(cc);\n res.push(...cc.iterateAllChildren());\n }\n }\n }\n return res;\n }\n\n /**\n * Model Form Events\n */\n defaultSubmitModelForm($form, e) {\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let {\n model,\n form_name\n } = $form.data();\n let data = model.syncForm($form);\n return new Promise((resolve, reject) => {\n let prom;\n if (model.id !== null && model.id >= 0) {\n prom = model.save({\n formName: form_name,\n data\n });\n } else {\n prom = model.create({\n data\n });\n }\n prom.then(res => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.clearErrorsInForm)($form);\n this.submit_model_form_success && this.submit_model_form_success(res[0]);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_success && controller.submit_model_form_success(res[0]);\n }\n resolve(res);\n }).catch(data => {\n this.reconcile($(`<div class=\"container-fluid\">${data.html}</div>`), $form.find(\".container-fluid\").first());\n this.submit_model_form_error && this.submit_model_form_error(data);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_error && controller.submit_model_form_error(data);\n }\n reject(data);\n });\n });\n }\n return Promise.resolve();\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9BYnN0cmFjdFNEQy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBdUM7QUFDTDtBQUNTO0FBQ0s7QUFNeEI7QUFFakIsTUFBTVEsV0FBVyxDQUFDO0VBQ3ZCQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssR0FBR04scURBQU0sQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQ08sVUFBVSxHQUFHLEVBQUU7SUFDcEIsSUFBSSxDQUFDQyxhQUFhLEdBQUcsS0FBSztJQUMxQixJQUFJLENBQUNDLGdCQUFnQixHQUFHLElBQUk7SUFDNUIsSUFBSSxDQUFDQyxNQUFNLEdBQUcsRUFBRTtJQUNoQixJQUFJLENBQUNDLFVBQVUsR0FBRyxLQUFLO0lBQ3ZCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEtBQUs7SUFDekIsSUFBSSxDQUFDQyxVQUFVLEdBQUcsSUFBSTtJQUV0QixJQUFJLENBQUNDLFVBQVUsR0FBRyxFQUFFO0lBQ3BCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLEVBQUU7O0lBRWpCO0lBQ0EsSUFBSSxDQUFDQyxRQUFRLEdBQUcsRUFBRTtJQUNsQixJQUFJLENBQUNDLFNBQVMsR0FBRyxNQUFNO01BQ3JCQyxPQUFPLENBQUNDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUMzQyxDQUFDO0lBQ0Q7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7SUFDSSxJQUFJLENBQUNDLE9BQU8sR0FBRyxDQUFDLENBQUM7O0lBRWpCO0FBQ0o7QUFDQTtJQUNJLElBQUksQ0FBQ0MsUUFBUSxHQUFHQyxNQUFNLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQ0YsUUFBUSxJQUFJLEVBQUU7O0lBRTFEO0FBQ0o7QUFDQTtJQUNJLElBQUksQ0FBQ0csZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOztJQUUxQjtBQUNKO0FBQ0E7SUFDSSxJQUFJLENBQUNDLGlCQUFpQixHQUFHLElBQUk7O0lBRTdCO0FBQ0o7QUFDQTtJQUNJLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEtBQUs7O0lBRXhCO0FBQ0o7QUFDQTtJQUNJLElBQUksQ0FBQ0MsVUFBVSxHQUFHLElBQUk7O0lBRXRCO0FBQ0o7QUFDQTtBQUNBO0lBQ0ksSUFBSSxDQUFDQyxRQUFRLEdBQUcsS0FBSztFQUN2Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsYUFBYUEsQ0FBQ0MsTUFBTSxFQUFFQyxJQUFJLEVBQUU7SUFDMUIsSUFBSWxDLDZDQUFHLENBQUNtQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUNKLFFBQVEsRUFBRTtNQUMvQlYsT0FBTyxDQUFDZSxLQUFLLENBQUNILE1BQU0sRUFBRSxJQUFJLENBQUNULFFBQVEsQ0FBQztJQUN0QztJQUVBLElBQUlhLGVBQWUsR0FBRyxFQUFFO0lBQ3hCLElBQUksSUFBSSxDQUFDTixRQUFRLEVBQUU7TUFDakI7SUFDRjtJQUNBLElBQUksQ0FBQ0EsUUFBUSxHQUFHLElBQUk7SUFDcEIsS0FBSyxJQUFJTyxRQUFRLElBQUksSUFBSSxDQUFDZixPQUFPLEVBQUU7TUFDakMsSUFBSWdCLEtBQUssR0FBRyxJQUFJLENBQUNoQixPQUFPLENBQUNlLFFBQVEsQ0FBQztNQUNsQyxJQUFJLE9BQU9DLEtBQUssQ0FBQ04sTUFBTSxDQUFDLEtBQUssVUFBVSxFQUFFO1FBQ3ZDSSxlQUFlLENBQUNHLElBQUksQ0FBQ0QsS0FBSyxDQUFDTixNQUFNLENBQUMsQ0FBQ1EsS0FBSyxDQUFDLElBQUksRUFBRVAsSUFBSSxDQUFDLENBQUM7TUFDdkQ7SUFDRjtJQUVBLE9BQU9RLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDTixlQUFlLENBQUMsQ0FBQ08sSUFBSSxDQUFDLE1BQU07TUFDN0MsSUFBSSxDQUFDYixRQUFRLEdBQUcsS0FBSztJQUN2QixDQUFDLENBQUM7RUFDSjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFYyxNQUFNQSxDQUFBLEVBQUc7SUFDUCxJQUFJN0MsNkNBQUcsQ0FBQ21DLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQ0osUUFBUSxFQUFFO01BQy9CVixPQUFPLENBQUNlLEtBQUssQ0FBQ1UsS0FBSyxDQUFDTCxLQUFLLENBQUMsSUFBSSxFQUFFTSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUN2QixRQUFRLENBQUM7SUFDNUQ7RUFDRjtFQUVBLElBQUl3QixnQkFBZ0JBLENBQUEsRUFBRztJQUNyQixPQUFPLElBQUksQ0FBQ3BCLGlCQUFpQjtFQUMvQjtFQUVBLElBQUlxQixlQUFlQSxDQUFBLEVBQUc7SUFDcEIsT0FBTyxJQUFJLENBQUN0QixnQkFBZ0I7RUFDOUI7RUFFQXVCLE1BQU1BLENBQUEsRUFBRztJQUNQLE9BQU8sSUFBSSxDQUFDbEIsYUFBYSxDQUFDLFFBQVEsRUFBRWUsU0FBUyxDQUFDO0VBQ2hEO0VBRUFJLFFBQVFBLENBQUEsRUFBRztJQUNULE9BQU8sSUFBSSxDQUFDbkIsYUFBYSxDQUFDLFVBQVUsRUFBRWUsU0FBUyxDQUFDO0VBQ2xEO0VBRUFLLFNBQVNBLENBQUEsRUFBRztJQUNWLE9BQU8sSUFBSSxDQUFDcEIsYUFBYSxDQUFDLFdBQVcsRUFBRWUsU0FBUyxDQUFDO0VBQ25EO0VBRUFNLFFBQVFBLENBQUEsRUFBRztJQUNULElBQUksQ0FBQ3JCLGFBQWEsQ0FBQyxVQUFVLEVBQUVlLFNBQVMsQ0FBQztJQUN6QyxPQUFPLElBQUk7RUFDYjtFQUVBTyxtQkFBbUJBLENBQUEsRUFBRztJQUNwQixPQUFPWixPQUFPLENBQUNDLEdBQUcsQ0FBQyxJQUFJLENBQUN6QixPQUFPLENBQUNxQyxHQUFHLENBQUVDLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDakU7RUFFQUMsTUFBTUEsQ0FBQSxFQUFHO0lBQ1AsS0FBSyxNQUFNQyxLQUFLLElBQUksSUFBSSxDQUFDekMsT0FBTyxFQUFFO01BQ2hDeUMsS0FBSyxDQUFDQyxLQUFLLENBQUMsQ0FBQztJQUNmO0lBQ0EsSUFBSWpDLGdCQUFnQixHQUFHLElBQUksQ0FBQ0EsZ0JBQWdCO0lBQzVDLEtBQUssSUFBSWtDLENBQUMsSUFBSWxDLGdCQUFnQixFQUFFO01BQzlCLElBQUlBLGdCQUFnQixDQUFDbUMsY0FBYyxDQUFDRCxDQUFDLENBQUMsRUFBRTtRQUN0QyxLQUFLLElBQUlFLEVBQUUsSUFBSXBDLGdCQUFnQixDQUFDa0MsQ0FBQyxDQUFDLEVBQUU7VUFDbEMsSUFBSSxDQUFDRSxFQUFFLENBQUNMLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxLQUFLO1VBQ2Q7UUFDRjtNQUNGO0lBQ0Y7SUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDTCxRQUFRLElBQUksSUFBSSxDQUFDQSxRQUFRLENBQUMsQ0FBQyxFQUFFO01BQ3JDdEQsc0RBQU0sQ0FBQyxJQUFJLENBQUM7TUFDWixNQUFNaUUsTUFBTSxHQUFHM0QsaUVBQWtCLENBQUMsSUFBSSxDQUFDbUIsUUFBUSxDQUFDO01BQ2hELElBQUksSUFBSSxDQUFDSSxpQkFBaUIsQ0FBQ0QsZ0JBQWdCLENBQUNxQyxNQUFNLENBQUMsRUFBRTtRQUNuRCxJQUFJQyxHQUFHLEdBQUcsSUFBSSxDQUFDckMsaUJBQWlCLENBQUNELGdCQUFnQixDQUFDcUMsTUFBTSxDQUFDO1FBQ3pELEtBQUssSUFBSUgsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHSSxHQUFHLENBQUNDLE1BQU0sRUFBRUwsQ0FBQyxFQUFFLEVBQUU7VUFDbkMsSUFBSUksR0FBRyxDQUFDSixDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkJJLEdBQUcsQ0FBQ0UsTUFBTSxDQUFDTixDQUFDLEVBQUUsQ0FBQyxDQUFDO1VBQ2xCO1FBQ0Y7TUFDRjtNQUVBLElBQUksQ0FBQy9CLFVBQVUsQ0FBQzRCLE1BQU0sQ0FBQyxDQUFDO01BQ3hCLE9BQU8sSUFBSTtNQUNYLE9BQU8sSUFBSTtJQUNiO0lBRUEsT0FBTyxLQUFLO0VBQ2Q7RUFFQVUsZUFBZUEsQ0FBQSxFQUFHO0lBQ2hCLE9BQU85RCxvRUFBcUIsQ0FBQyxJQUFJLENBQUNrQixRQUFRLENBQUM7RUFDN0M7RUFFQTZDLFFBQVFBLENBQUNDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxPQUFPLEVBQUU7SUFDakMsSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUN6RCxVQUFVLENBQUNzRCxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUN0RCxVQUFVLENBQUNzRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsSUFBSSxDQUFDdEQsVUFBVSxDQUFDc0QsS0FBSyxDQUFDLENBQUNDLFFBQVEsQ0FBQyxHQUFHQyxPQUFPO0VBQzVDO0VBRUFDLFNBQVNBLENBQUEsRUFBRztJQUNWLElBQUksSUFBSSxDQUFDekQsVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDQSxVQUFVO0lBQzNDLElBQUkwRCxTQUFTLEdBQUcsRUFBRTtJQUNsQkEsU0FBUyxHQUFHQSxTQUFTLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUM5RCxNQUFNLENBQUM7SUFDekMsS0FBSyxJQUFJeUIsUUFBUSxJQUFJLElBQUksQ0FBQ2YsT0FBTyxFQUFFO01BQ2pDLElBQUlnQixLQUFLLEdBQUcsSUFBSSxDQUFDaEIsT0FBTyxDQUFDZSxRQUFRLENBQUM7TUFDbEMsSUFBSVEsS0FBSyxDQUFDOEIsT0FBTyxDQUFDckMsS0FBSyxDQUFDMUIsTUFBTSxDQUFDLEVBQUU7UUFDL0I2RCxTQUFTLEdBQUdBLFNBQVMsQ0FBQ0MsTUFBTSxDQUFDcEMsS0FBSyxDQUFDMUIsTUFBTSxDQUFDO01BQzVDO0lBQ0Y7SUFFQSxPQUFRLElBQUksQ0FBQ0csVUFBVSxHQUFHNkQsQ0FBQyxDQUFDQyxLQUFLLENBQUMsR0FBR0osU0FBUyxDQUFDO0VBQ2pEO0VBRUFLLElBQUlBLENBQUNDLEdBQUcsRUFBRTlDLElBQUksRUFBRTtJQUNkLE9BQU9sQyw2Q0FBRyxDQUFDK0UsSUFBSSxDQUFDLElBQUksRUFBRUMsR0FBRyxFQUFFOUMsSUFBSSxDQUFDO0VBQ2xDO0VBRUErQyxHQUFHQSxDQUFDRCxHQUFHLEVBQUU5QyxJQUFJLEVBQUU7SUFDYixPQUFPbEMsNkNBQUcsQ0FBQ2lGLEdBQUcsQ0FBQyxJQUFJLEVBQUVELEdBQUcsRUFBRTlDLElBQUksQ0FBQztFQUNqQztFQUVBZ0QsVUFBVUEsQ0FBQ0MsSUFBSSxFQUFFSCxHQUFHLEVBQUUvQyxNQUFNLEVBQUU7SUFDNUIsT0FBT2pDLDZDQUFHLENBQUNvRix1QkFBdUIsQ0FBQyxJQUFJLEVBQUVELElBQUksRUFBRUgsR0FBRyxFQUFFL0MsTUFBTSxDQUFDO0VBQzdEO0VBRUFvRCxVQUFVQSxDQUFDQyxPQUFPLEVBQUVwRCxJQUFJLEVBQUU7SUFDeEIsSUFBSXFELEVBQUUsR0FBRyxvQkFBb0I7SUFDN0IsSUFBSXZGLEdBQUcsR0FBRyxJQUFJLENBQUNVLFVBQVUsQ0FBQzhFLEtBQUssQ0FBQ0QsRUFBRSxDQUFDO0lBQ25DLElBQUksQ0FBQ3ZGLEdBQUcsSUFBSUEsR0FBRyxDQUFDa0UsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMxQjdDLE9BQU8sQ0FBQ29FLEtBQUssQ0FDWCw2REFBNkQsR0FDN0QsSUFBSSxDQUFDQyxJQUNQLENBQUM7TUFDRDtJQUNGO0lBRUEsT0FBT3hGLCtEQUFVLENBQ2ZGLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDTixJQUFJLENBQUN3QixRQUFRLEVBQ2IsSUFBSSxDQUFDWixnQkFBZ0IsSUFBSSxJQUFJLENBQUNGLFVBQVUsRUFDeEM0RSxPQUFPLEVBQ1BwRCxJQUNGLENBQUM7RUFDSDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRXlELFFBQVFBLENBQUNDLFNBQVMsRUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ25DLE1BQU1DLFdBQVcsR0FBRyxJQUFJN0Ysc0RBQVcsQ0FBQzJGLFNBQVMsRUFBRUMsVUFBVSxDQUFDO0lBQzFELElBQUksQ0FBQzNFLE9BQU8sQ0FBQ3NCLElBQUksQ0FBQ3NELFdBQVcsQ0FBQztJQUM5QixPQUFPQSxXQUFXO0VBQ3BCO0VBRUFDLFFBQVFBLENBQUNILFNBQVMsRUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ25DeEUsT0FBTyxDQUFDQyxJQUFJLENBQUMsaURBQWlELENBQUM7SUFDL0QsT0FBTyxJQUFJLENBQUNxRSxRQUFRLENBQUNDLFNBQVMsRUFBRUMsVUFBVSxDQUFDO0VBQzdDOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBQ0VHLElBQUlBLENBQUNDLFdBQVcsRUFBRTtJQUNoQixPQUFPLElBQUksQ0FBQ25FLFVBQVUsQ0FBQ2tFLElBQUksQ0FBQ0MsV0FBVyxDQUFDO0VBQzFDO0VBRUFDLE9BQU9BLENBQUEsRUFBRztJQUNSLE9BQU9sRyw2Q0FBRyxDQUFDa0csT0FBTyxDQUFDLElBQUksQ0FBQ3BFLFVBQVUsRUFBRSxJQUFJLENBQUM7RUFDM0M7RUFFQXFFLE1BQU1BLENBQUEsRUFBRztJQUNQLE9BQU9uRyw2Q0FBRyxDQUFDb0csZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0VBQ25DO0VBRUFDLFNBQVNBLENBQUNDLFlBQVksRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRTtJQUN4QyxPQUFPdkcsNkNBQUcsQ0FBQ3FHLFNBQVMsQ0FBQyxJQUFJLEVBQUVDLFlBQVksRUFBRUMsU0FBUyxDQUFDO0VBQ3JEO0VBRUFDLDBCQUEwQkEsQ0FBQ0MsS0FBSyxFQUFFQyxDQUFDLEVBQUU7SUFDbkMsSUFBSSxPQUFPLElBQUksQ0FBQ0MsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO01BQy9DLE9BQU8sSUFBSSxDQUFDQSxnQkFBZ0IsQ0FBQ0YsS0FBSyxFQUFFQyxDQUFDLENBQUM7SUFDeEM7SUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDRSxlQUFlLEtBQUssVUFBVSxFQUFFO01BQzlDLE9BQU8sSUFBSSxDQUFDQSxlQUFlLENBQUNILEtBQUssRUFBRUMsQ0FBQyxDQUFDO0lBQ3ZDO0lBQ0EsT0FBTyxJQUFJLENBQUNHLHNCQUFzQixDQUFDSixLQUFLLEVBQUVDLENBQUMsQ0FBQztFQUM5QztFQUVBSSxrQkFBa0JBLENBQUEsRUFBRztJQUNuQixJQUFJbkYsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDQSxnQkFBZ0I7SUFDNUMsSUFBSW9GLEdBQUcsR0FBRyxFQUFFO0lBQ1osS0FBSyxJQUFJbEQsQ0FBQyxJQUFJbEMsZ0JBQWdCLEVBQUU7TUFDOUIsSUFBSUEsZ0JBQWdCLENBQUNtQyxjQUFjLENBQUNELENBQUMsQ0FBQyxFQUFFO1FBQ3RDLEtBQUssSUFBSUUsRUFBRSxJQUFJcEMsZ0JBQWdCLENBQUNrQyxDQUFDLENBQUMsRUFBRTtVQUNsQ2tELEdBQUcsQ0FBQ3ZFLElBQUksQ0FBQ3VCLEVBQUUsQ0FBQztVQUNaZ0QsR0FBRyxDQUFDdkUsSUFBSSxDQUFDLEdBQUd1QixFQUFFLENBQUMrQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFDdEM7TUFDRjtJQUNGO0lBQ0EsT0FBT0MsR0FBRztFQUNaOztFQUVBO0FBQ0Y7QUFDQTtFQUNFRixzQkFBc0JBLENBQUNKLEtBQUssRUFBRUMsQ0FBQyxFQUFFO0lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMzRSxRQUFRLEVBQUU7TUFDbEIyRSxDQUFDLENBQUNNLGVBQWUsQ0FBQyxDQUFDO01BQ25CTixDQUFDLENBQUNPLGNBQWMsQ0FBQyxDQUFDO01BQ2xCLElBQUk7UUFBQ3RELEtBQUs7UUFBRXVEO01BQVMsQ0FBQyxHQUFHVCxLQUFLLENBQUNVLElBQUksQ0FBQyxDQUFDO01BQ3JDLElBQUlBLElBQUksR0FBR3hELEtBQUssQ0FBQ3lELFFBQVEsQ0FBQ1gsS0FBSyxDQUFDO01BQ2hDLE9BQU8sSUFBSS9ELE9BQU8sQ0FBQyxDQUFDMkUsT0FBTyxFQUFFQyxNQUFNLEtBQUs7UUFDdEMsSUFBSUMsSUFBSTtRQUNSLElBQUk1RCxLQUFLLENBQUM2RCxFQUFFLEtBQUssSUFBSSxJQUFJN0QsS0FBSyxDQUFDNkQsRUFBRSxJQUFJLENBQUMsRUFBRTtVQUN0Q0QsSUFBSSxHQUFHNUQsS0FBSyxDQUFDOEQsSUFBSSxDQUFDO1lBQUNDLFFBQVEsRUFBRVIsU0FBUztZQUFFQztVQUFJLENBQUMsQ0FBQztRQUNoRCxDQUFDLE1BQU07VUFDTEksSUFBSSxHQUFHNUQsS0FBSyxDQUFDZ0UsTUFBTSxDQUFDO1lBQUNSO1VBQUksQ0FBQyxDQUFDO1FBQzdCO1FBRUFJLElBQUksQ0FDRDNFLElBQUksQ0FBRW1FLEdBQUcsSUFBSztVQUNiM0csZ0VBQWlCLENBQUNxRyxLQUFLLENBQUM7VUFDeEIsSUFBSSxDQUFDbUIseUJBQXlCLElBQzlCLElBQUksQ0FBQ0EseUJBQXlCLENBQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUN0QyxLQUFLLE1BQU1jLFVBQVUsSUFBSSxJQUFJLENBQUNmLGtCQUFrQixDQUFDLENBQUMsRUFBRTtZQUNsRGUsVUFBVSxDQUFDRCx5QkFBeUIsSUFDcENDLFVBQVUsQ0FBQ0QseUJBQXlCLENBQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM5QztVQUVBTSxPQUFPLENBQUNOLEdBQUcsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNEZSxLQUFLLENBQUVYLElBQUksSUFBSztVQUNmLElBQUksQ0FBQ2QsU0FBUyxDQUNaMEIsQ0FBQyxDQUFDLGdDQUFnQ1osSUFBSSxDQUFDYSxJQUFJLFFBQVEsQ0FBQyxFQUNwRHZCLEtBQUssQ0FBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUNpQyxLQUFLLENBQUMsQ0FDdkMsQ0FBQztVQUNELElBQUksQ0FBQ0MsdUJBQXVCLElBQzVCLElBQUksQ0FBQ0EsdUJBQXVCLENBQUNmLElBQUksQ0FBQztVQUNsQyxLQUFLLE1BQU1VLFVBQVUsSUFBSSxJQUFJLENBQUNmLGtCQUFrQixDQUFDLENBQUMsRUFBRTtZQUNsRGUsVUFBVSxDQUFDSyx1QkFBdUIsSUFDbENMLFVBQVUsQ0FBQ0ssdUJBQXVCLENBQUNmLElBQUksQ0FBQztVQUMxQztVQUVBRyxNQUFNLENBQUNILElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztNQUNOLENBQUMsQ0FBQztJQUNKO0lBRUEsT0FBT3pFLE9BQU8sQ0FBQzJFLE9BQU8sQ0FBQyxDQUFDO0VBQzFCO0FBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvQWJzdHJhY3RTREMuanM/ZDdmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FsbE9mZn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge1NkY1F1ZXJ5U2V0fSBmcm9tIFwiLi9zZGNfbW9kZWwuanNcIjtcbmltcG9ydCB7Y2FsbFNlcnZlcn0gZnJvbSBcIi4vc2RjX3NlcnZlcl9jYWxsLmpzXCI7XG5pbXBvcnQge1xuICB1dWlkdjQsXG4gIGNsZWFyRXJyb3JzSW5Gb3JtLFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFNEQyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3V1aWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmNvbnRlbnRVcmwgPSBcIlwiO1xuICAgIHRoaXMuY29udGVudFJlbG9hZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA9IG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB0aGlzLmxvYWRfYXN5bmMgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0V2ZW50c1NldCA9IGZhbHNlO1xuICAgIHRoaXMuX2FsbEV2ZW50cyA9IG51bGw7XG5cbiAgICB0aGlzLl91cmxQYXJhbXMgPSBbXTtcbiAgICB0aGlzLl9tb2RlbHMgPSBbXTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBPbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLl9jc3NVcmxzID0gW107XG4gICAgdGhpcy5hZnRlclNob3cgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJhZnRlclNob3cgaXMgZGVwcmVjYXRlZCEhXCIpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gRW5kIG9sZCBkZXByZWNhdGVkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7e3N0cmluZzogQWJzdHJhY3RTREN9fVxuICAgICAqL1xuICAgIHRoaXMuX21peGlucyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLl90YWdOYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl90YWdOYW1lID8/IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e3N0cmluZzpBYnN0cmFjdFNEQ319XG4gICAgICovXG4gICAgdGhpcy5fY2hpbGRDb250cm9sbGVyID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QWJzdHJhY3RTREN9XG4gICAgICovXG4gICAgdGhpcy5fcGFyZW50Q29udHJvbGxlciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9vbkxvYWREb25lID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7anF1ZXJ5fVxuICAgICAqL1xuICAgIHRoaXMuJGNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIG11c3QgYmUgaW4ge31cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBpbiBhcmd1bWVudHMgb2ZcbiAgICpcbiAgICovXG4gIF9ydW5MaWZlY3ljbGUobWV0aG9kLCBhcmdzKSB7XG4gICAgaWYgKGFwcC5ERUJVRyAmJiAhdGhpcy5faXNNaXhpbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhtZXRob2QsIHRoaXMuX3RhZ05hbWUpO1xuICAgIH1cblxuICAgIGxldCByZXR1cm5Qcm9taXNzZXMgPSBbXTtcbiAgICBpZiAodGhpcy5faXNNaXhpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc01peGluID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICBpZiAodHlwZW9mIG1peGluW21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm5Qcm9taXNzZXMucHVzaChtaXhpblttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmV0dXJuUHJvbWlzc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPCo+fCp9XG4gICAqL1xuICBvbkluaXQoKSB7XG4gICAgaWYgKGFwcC5ERUJVRyAmJiAhdGhpcy5faXNNaXhpbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpLCB0aGlzLl90YWdOYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyZW50Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50Q29udHJvbGxlcjtcbiAgfVxuXG4gIGdldCBjaGlsZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkQ29udHJvbGxlcjtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25Mb2FkXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICB3aWxsU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwid2lsbFNob3dcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25SZWZyZXNoXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBvblJlbW92ZSgpIHtcbiAgICB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvblJlbW92ZVwiLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbm9PcGVuTW9kZWxSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fbW9kZWxzLm1hcCgoeCkgPT4geC5ub09wZW5SZXF1ZXN0cygpKSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLl9tb2RlbHMpIHtcbiAgICAgIG1vZGVsLmNsb3NlKCk7XG4gICAgfVxuICAgIGxldCBfY2hpbGRDb250cm9sbGVyID0gdGhpcy5fY2hpbGRDb250cm9sbGVyO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKF9jaGlsZENvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIGlmICghY2MucmVtb3ZlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub25SZW1vdmUgfHwgdGhpcy5vblJlbW92ZSgpKSB7XG4gICAgICBhbGxPZmYodGhpcyk7XG4gICAgICBjb25zdCBjX25hbWUgPSB0YWdOYW1lVG9DYW1lbENhc2UodGhpcy5fdGFnTmFtZSk7XG4gICAgICBpZiAodGhpcy5fcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NfbmFtZV0pIHtcbiAgICAgICAgbGV0IGFyciA9IHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChhcnJbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIGRlbGV0ZSB0aGlzO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29udHJvbGxlcl9uYW1lKCkge1xuICAgIHJldHVybiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUodGhpcy5fdGFnTmFtZSk7XG4gIH1cblxuICBhZGRFdmVudChldmVudCwgc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICB0aGlzLmdldEV2ZW50cygpO1xuICAgIHRoaXMuX2FsbEV2ZW50c1tldmVudF0gPSB0aGlzLl9hbGxFdmVudHNbZXZlbnRdIHx8IHt9O1xuICAgIHRoaXMuX2FsbEV2ZW50c1tldmVudF1bc2VsZWN0b3JdID0gaGFuZGxlcjtcbiAgfVxuXG4gIGdldEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5fYWxsRXZlbnRzKSByZXR1cm4gdGhpcy5fYWxsRXZlbnRzO1xuICAgIGxldCBhbGxFdmVudHMgPSBbXTtcbiAgICBhbGxFdmVudHMgPSBhbGxFdmVudHMuY29uY2F0KHRoaXMuZXZlbnRzKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtaXhpbi5ldmVudHMpKSB7XG4gICAgICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQobWl4aW4uZXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMuX2FsbEV2ZW50cyA9IF8ubWVyZ2UoLi4uYWxsRXZlbnRzKSk7XG4gIH1cblxuICBwb3N0KHVybCwgYXJncykge1xuICAgIHJldHVybiBhcHAucG9zdCh0aGlzLCB1cmwsIGFyZ3MpO1xuICB9XG5cbiAgZ2V0KHVybCwgYXJncykge1xuICAgIHJldHVybiBhcHAuZ2V0KHRoaXMsIHVybCwgYXJncyk7XG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm0sIHVybCwgbWV0aG9kKSB7XG4gICAgcmV0dXJuIGFwcC5zdWJtaXRGb3JtQW5kVXBkYXRlVmlldyh0aGlzLCBmb3JtLCB1cmwsIG1ldGhvZCk7XG4gIH1cblxuICBzZXJ2ZXJDYWxsKG1ldGhvZGUsIGFyZ3MpIHtcbiAgICBsZXQgcmUgPSAvc2RjX3ZpZXdcXC8oW14vXSspL2k7XG4gICAgbGV0IGFwcCA9IHRoaXMuY29udGVudFVybC5tYXRjaChyZSk7XG4gICAgaWYgKCFhcHAgfHwgYXBwLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiVG8gdXNlIHRoZSBzZXJ2ZXJDYWxsIGZ1bmN0aW9uIHRoZSBjb250ZW50VXJsIG11c3QgYmUgc2V0OiBcIiArXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxTZXJ2ZXIoXG4gICAgICBhcHBbMV0sXG4gICAgICB0aGlzLl90YWdOYW1lLFxuICAgICAgdGhpcy5wYXJzZWRDb250ZW50VXJsID8/IHRoaXMuY29udGVudFVybCxcbiAgICAgIG1ldGhvZGUsXG4gICAgICBhcmdzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcGFyYW0gIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtTZGNRdWVyeVNldH1cbiAgICovXG4gIHF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgY29uc3QgbmV3UXVlcnlTZXQgPSBuZXcgU2RjUXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5KTtcbiAgICB0aGlzLl9tb2RlbHMucHVzaChuZXdRdWVyeVNldCk7XG4gICAgcmV0dXJuIG5ld1F1ZXJ5U2V0O1xuICB9XG5cbiAgbmV3TW9kZWwobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oXCJuZXdNb2RlbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHNvb24gYmUgcmVtb3ZlZFwiKTtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0ZXIgdG8gdGhpcy4kY29udGFpbmVyLmZpbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvbVNlbGVjdG9yXG4gICAqL1xuICBmaW5kKGRvbVNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRhaW5lci5maW5kKGRvbVNlbGVjdG9yKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgcmV0dXJuIGFwcC5yZWZyZXNoKHRoaXMuJGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgcmV0dXJuIGFwcC5yZWxvYWRDb250cm9sbGVyKHRoaXMpO1xuICB9XG5cbiAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCkge1xuICAgIHJldHVybiBhcHAucmVjb25jaWxlKHRoaXMsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgfVxuXG4gIHN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yKCRmb3JtLCBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gIH1cblxuICBpdGVyYXRlQWxsQ2hpbGRyZW4oKSB7XG4gICAgbGV0IF9jaGlsZENvbnRyb2xsZXIgPSB0aGlzLl9jaGlsZENvbnRyb2xsZXI7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKF9jaGlsZENvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgICByZXMucHVzaCguLi5jYy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgKi9cbiAgZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCB7bW9kZWwsIGZvcm1fbmFtZX0gPSAkZm9ybS5kYXRhKCk7XG4gICAgICBsZXQgZGF0YSA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9tO1xuICAgICAgICBpZiAobW9kZWwuaWQgIT09IG51bGwgJiYgbW9kZWwuaWQgPj0gMCkge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5zYXZlKHtmb3JtTmFtZTogZm9ybV9uYW1lLCBkYXRhfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZSh7ZGF0YX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyAmJlxuICAgICAgICAgICAgdGhpcy5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvbmNpbGUoXG4gICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4ke2RhdGEuaHRtbH08L2Rpdj5gKSxcbiAgICAgICAgICAgICAgJGZvcm0uZmluZChcIi5jb250YWluZXItZmx1aWRcIikuZmlyc3QoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yICYmXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuaXRlcmF0ZUFsbENoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvciAmJlxuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhbGxPZmYiLCJhcHAiLCJTZGNRdWVyeVNldCIsImNhbGxTZXJ2ZXIiLCJ1dWlkdjQiLCJjbGVhckVycm9yc0luRm9ybSIsInRhZ05hbWVUb0NhbWVsQ2FzZSIsInRhZ05hbWVUb1JlYWRhYmxlTmFtZSIsIkFic3RyYWN0U0RDIiwiY29uc3RydWN0b3IiLCJfdXVpZCIsImNvbnRlbnRVcmwiLCJjb250ZW50UmVsb2FkIiwicGFyc2VkQ29udGVudFVybCIsImV2ZW50cyIsImxvYWRfYXN5bmMiLCJfaXNFdmVudHNTZXQiLCJfYWxsRXZlbnRzIiwiX3VybFBhcmFtcyIsIl9tb2RlbHMiLCJfY3NzVXJscyIsImFmdGVyU2hvdyIsImNvbnNvbGUiLCJ3YXJuIiwiX21peGlucyIsIl90YWdOYW1lIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfY2hpbGRDb250cm9sbGVyIiwiX3BhcmVudENvbnRyb2xsZXIiLCJfb25Mb2FkRG9uZSIsIiRjb250YWluZXIiLCJfaXNNaXhpbiIsIl9ydW5MaWZlY3ljbGUiLCJtZXRob2QiLCJhcmdzIiwiREVCVUciLCJkZWJ1ZyIsInJldHVyblByb21pc3NlcyIsIm1peGluS2V5IiwibWl4aW4iLCJwdXNoIiwiYXBwbHkiLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsIm9uSW5pdCIsIkFycmF5IiwiYXJndW1lbnRzIiwicGFyZW50Q29udHJvbGxlciIsImNoaWxkQ29udHJvbGxlciIsIm9uTG9hZCIsIndpbGxTaG93Iiwib25SZWZyZXNoIiwib25SZW1vdmUiLCJub09wZW5Nb2RlbFJlcXVlc3RzIiwibWFwIiwieCIsIm5vT3BlblJlcXVlc3RzIiwicmVtb3ZlIiwibW9kZWwiLCJjbG9zZSIsImkiLCJoYXNPd25Qcm9wZXJ0eSIsImNjIiwiY19uYW1lIiwiYXJyIiwibGVuZ3RoIiwic3BsaWNlIiwiY29udHJvbGxlcl9uYW1lIiwiYWRkRXZlbnQiLCJldmVudCIsInNlbGVjdG9yIiwiaGFuZGxlciIsImdldEV2ZW50cyIsImFsbEV2ZW50cyIsImNvbmNhdCIsImlzQXJyYXkiLCJfIiwibWVyZ2UiLCJwb3N0IiwidXJsIiwiZ2V0Iiwic3VibWl0Rm9ybSIsImZvcm0iLCJzdWJtaXRGb3JtQW5kVXBkYXRlVmlldyIsInNlcnZlckNhbGwiLCJtZXRob2RlIiwicmUiLCJtYXRjaCIsImVycm9yIiwibmFtZSIsInF1ZXJ5U2V0IiwibW9kZWxOYW1lIiwibW9kZWxRdWVyeSIsIm5ld1F1ZXJ5U2V0IiwibmV3TW9kZWwiLCJmaW5kIiwiZG9tU2VsZWN0b3IiLCJyZWZyZXNoIiwicmVsb2FkIiwicmVsb2FkQ29udHJvbGxlciIsInJlY29uY2lsZSIsIiR2aXJ0dWFsTm9kZSIsIiRyZWFsTm9kZSIsInN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yIiwiJGZvcm0iLCJlIiwiX3N1Ym1pdE1vZGVsRm9ybSIsInN1Ym1pdE1vZGVsRm9ybSIsImRlZmF1bHRTdWJtaXRNb2RlbEZvcm0iLCJpdGVyYXRlQWxsQ2hpbGRyZW4iLCJyZXMiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImZvcm1fbmFtZSIsImRhdGEiLCJzeW5jRm9ybSIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9tIiwiaWQiLCJzYXZlIiwiZm9ybU5hbWUiLCJjcmVhdGUiLCJzdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzIiwiY29udHJvbGxlciIsImNhdGNoIiwiJCIsImh0bWwiLCJmaXJzdCIsInN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
27
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.uuidv4)();\n this.contentUrl = \"\";\n this.contentReload = false;\n this.parsedContentUrl = null;\n this.events = [];\n this.load_async = false;\n this._isEventsSet = false;\n this._allEvents = null;\n this._params = {};\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn(\"afterShow is deprecated!!\");\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = Object.getPrototypeOf(this)._tagName ?? \"\";\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n get params() {\n return this._params;\n }\n set params(params) {\n this._params = params;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(method, this._tagName);\n }\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === \"function\") {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n\n /**\n *\n * @return {Promise<*>|*}\n */\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(Array.apply(null, arguments), this._tagName);\n }\n }\n get parentController() {\n return this._parentController;\n }\n get childController() {\n return this._childController;\n }\n onLoad() {\n return this._runLifecycle(\"onLoad\", arguments);\n }\n willShow() {\n return this._runLifecycle(\"willShow\", arguments);\n }\n onRefresh() {\n return this._runLifecycle(\"onRefresh\", arguments);\n }\n onRemove() {\n this._runLifecycle(\"onRemove\", arguments);\n return true;\n }\n noOpenModelRequests() {\n return Promise.all(this._models.map(x => x.noOpenRequests()));\n }\n remove() {\n for (const model of this._models) {\n model.close();\n }\n let _childController = this._childController;\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n this.$container.remove();\n delete this;\n return true;\n }\n return false;\n }\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToReadableName)(this._tagName);\n }\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n return this._allEvents = _.merge(...allEvents);\n }\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error(\"To use the serverCall function the contentUrl must be set: \" + this.name);\n return;\n }\n return (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__.callServer)(app[1], this._tagName, this.parsedContentUrl ?? this.contentUrl, methode, args);\n }\n\n /**\n *\n * @param {string} modelName\n * @param {object?} modelQuery\n * @returns {SdcQuerySet}\n */\n querySet(modelName, modelQuery = {}) {\n const newQuerySet = new _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet(modelName, modelQuery);\n this._models.push(newQuerySet);\n return newQuerySet;\n }\n newModel(modelName, modelQuery = {}) {\n console.warn(\"newModel is deprecated and will soon be removed\");\n return this.querySet(modelName, modelQuery);\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n reconcile($virtualNode, $realNode = null) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reconcile(this, $virtualNode, $realNode);\n }\n submitModelFormDistributor($form, e) {\n if (typeof this._submitModelForm === \"function\") {\n return this._submitModelForm($form, e);\n }\n if (typeof this.submitModelForm === \"function\") {\n return this.submitModelForm($form, e);\n }\n return this.defaultSubmitModelForm($form, e);\n }\n iterateAllChildren() {\n let _childController = this._childController;\n let res = [];\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n res.push(cc);\n res.push(...cc.iterateAllChildren());\n }\n }\n }\n return res;\n }\n\n /**\n * Model Form Events\n */\n defaultSubmitModelForm($form, e) {\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let {\n model,\n form_name\n } = $form.data();\n let data = model.syncForm($form);\n return new Promise((resolve, reject) => {\n let prom;\n if (model.id !== null && model.id >= 0) {\n prom = model.save({\n formName: form_name,\n data\n });\n } else {\n prom = model.create({\n data\n });\n }\n prom.then(res => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.clearErrorsInForm)($form);\n this.submit_model_form_success && this.submit_model_form_success(res[0]);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_success && controller.submit_model_form_success(res[0]);\n }\n resolve(res);\n }).catch(data => {\n this.reconcile($(`<div class=\"container-fluid\">${data.html}</div>`), $form.find(\".container-fluid\").first());\n this.submit_model_form_error && this.submit_model_form_error(data);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_error && controller.submit_model_form_error(data);\n }\n reject(data);\n });\n });\n }\n return Promise.resolve();\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFJLENBQUM7UUFDZCxDQUFDLENBQUM7TUFDTixDQUFDLENBQUM7SUFDSjtJQUVBLE9BQU96RSxPQUFPLENBQUMyRSxPQUFPLENBQUMsQ0FBQztFQUMxQjtBQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL0Fic3RyYWN0U0RDLmpzP2Q3ZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthbGxPZmZ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7YXBwfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHtTZGNRdWVyeVNldH0gZnJvbSBcIi4vc2RjX21vZGVsLmpzXCI7XG5pbXBvcnQge2NhbGxTZXJ2ZXJ9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuaW1wb3J0IHtcbiAgdXVpZHY0LFxuICBjbGVhckVycm9yc0luRm9ybSxcbiAgdGFnTmFtZVRvQ2FtZWxDYXNlLFxuICB0YWdOYW1lVG9SZWFkYWJsZU5hbWUsXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RTREMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl91dWlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5jb250ZW50VXJsID0gXCJcIjtcbiAgICB0aGlzLmNvbnRlbnRSZWxvYWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlZENvbnRlbnRVcmwgPSBudWxsO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5sb2FkX2FzeW5jID0gZmFsc2U7XG4gICAgdGhpcy5faXNFdmVudHNTZXQgPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxFdmVudHMgPSBudWxsO1xuICAgIHRoaXMuX3BhcmFtcyA9IHt9O1xuXG4gICAgdGhpcy5fdXJsUGFyYW1zID0gW107XG4gICAgdGhpcy5fbW9kZWxzID0gW107XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gT2xkIGRlcHJlY2F0ZWQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgdGhpcy5fY3NzVXJscyA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJTaG93ID0gKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFwiYWZ0ZXJTaG93IGlzIGRlcHJlY2F0ZWQhIVwiKTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tIEVuZCBvbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHR5cGUge3tzdHJpbmc6IEFic3RyYWN0U0RDfX1cbiAgICAgKi9cbiAgICB0aGlzLl9taXhpbnMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5fdGFnTmFtZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fdGFnTmFtZSA/PyBcIlwiO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3tzdHJpbmc6QWJzdHJhY3RTREN9fVxuICAgICAqL1xuICAgIHRoaXMuX2NoaWxkQ29udHJvbGxlciA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Fic3RyYWN0U0RDfVxuICAgICAqL1xuICAgIHRoaXMuX3BhcmVudENvbnRyb2xsZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5fb25Mb2FkRG9uZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2pxdWVyeX1cbiAgICAgKi9cbiAgICB0aGlzLiRjb250YWluZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9pc01peGluID0gZmFsc2U7XG4gIH1cblxuICBnZXQgcGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbXM7XG4gIH1cblxuICBzZXQgcGFyYW1zKHBhcmFtcykge1xuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIG11c3QgYmUgaW4ge31cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBpbiBhcmd1bWVudHMgb2ZcbiAgICpcbiAgICovXG4gIF9ydW5MaWZlY3ljbGUobWV0aG9kLCBhcmdzKSB7XG4gICAgaWYgKGFwcC5ERUJVRyAmJiAhdGhpcy5faXNNaXhpbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhtZXRob2QsIHRoaXMuX3RhZ05hbWUpO1xuICAgIH1cblxuICAgIGxldCByZXR1cm5Qcm9taXNzZXMgPSBbXTtcbiAgICBpZiAodGhpcy5faXNNaXhpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc01peGluID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICBpZiAodHlwZW9mIG1peGluW21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm5Qcm9taXNzZXMucHVzaChtaXhpblttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmV0dXJuUHJvbWlzc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPCo+fCp9XG4gICAqL1xuICBvbkluaXQoKSB7XG4gICAgaWYgKGFwcC5ERUJVRyAmJiAhdGhpcy5faXNNaXhpbikge1xuICAgICAgY29uc29sZS5kZWJ1ZyhBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpLCB0aGlzLl90YWdOYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyZW50Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50Q29udHJvbGxlcjtcbiAgfVxuXG4gIGdldCBjaGlsZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkQ29udHJvbGxlcjtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25Mb2FkXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICB3aWxsU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwid2lsbFNob3dcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25SZWZyZXNoXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBvblJlbW92ZSgpIHtcbiAgICB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvblJlbW92ZVwiLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbm9PcGVuTW9kZWxSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fbW9kZWxzLm1hcCgoeCkgPT4geC5ub09wZW5SZXF1ZXN0cygpKSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLl9tb2RlbHMpIHtcbiAgICAgIG1vZGVsLmNsb3NlKCk7XG4gICAgfVxuICAgIGxldCBfY2hpbGRDb250cm9sbGVyID0gdGhpcy5fY2hpbGRDb250cm9sbGVyO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKF9jaGlsZENvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIGlmICghY2MucmVtb3ZlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub25SZW1vdmUgfHwgdGhpcy5vblJlbW92ZSgpKSB7XG4gICAgICBhbGxPZmYodGhpcyk7XG4gICAgICBjb25zdCBjX25hbWUgPSB0YWdOYW1lVG9DYW1lbENhc2UodGhpcy5fdGFnTmFtZSk7XG4gICAgICBpZiAodGhpcy5fcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NfbmFtZV0pIHtcbiAgICAgICAgbGV0IGFyciA9IHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChhcnJbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIGRlbGV0ZSB0aGlzO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29udHJvbGxlcl9uYW1lKCkge1xuICAgIHJldHVybiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUodGhpcy5fdGFnTmFtZSk7XG4gIH1cblxuICBhZGRFdmVudChldmVudCwgc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICB0aGlzLmdldEV2ZW50cygpO1xuICAgIHRoaXMuX2FsbEV2ZW50c1tldmVudF0gPSB0aGlzLl9hbGxFdmVudHNbZXZlbnRdIHx8IHt9O1xuICAgIHRoaXMuX2FsbEV2ZW50c1tldmVudF1bc2VsZWN0b3JdID0gaGFuZGxlcjtcbiAgfVxuXG4gIGdldEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5fYWxsRXZlbnRzKSByZXR1cm4gdGhpcy5fYWxsRXZlbnRzO1xuICAgIGxldCBhbGxFdmVudHMgPSBbXTtcbiAgICBhbGxFdmVudHMgPSBhbGxFdmVudHMuY29uY2F0KHRoaXMuZXZlbnRzKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtaXhpbi5ldmVudHMpKSB7XG4gICAgICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQobWl4aW4uZXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMuX2FsbEV2ZW50cyA9IF8ubWVyZ2UoLi4uYWxsRXZlbnRzKSk7XG4gIH1cblxuICBwb3N0KHVybCwgYXJncykge1xuICAgIHJldHVybiBhcHAucG9zdCh0aGlzLCB1cmwsIGFyZ3MpO1xuICB9XG5cbiAgZ2V0KHVybCwgYXJncykge1xuICAgIHJldHVybiBhcHAuZ2V0KHRoaXMsIHVybCwgYXJncyk7XG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm0sIHVybCwgbWV0aG9kKSB7XG4gICAgcmV0dXJuIGFwcC5zdWJtaXRGb3JtQW5kVXBkYXRlVmlldyh0aGlzLCBmb3JtLCB1cmwsIG1ldGhvZCk7XG4gIH1cblxuICBzZXJ2ZXJDYWxsKG1ldGhvZGUsIGFyZ3MpIHtcbiAgICBsZXQgcmUgPSAvc2RjX3ZpZXdcXC8oW14vXSspL2k7XG4gICAgbGV0IGFwcCA9IHRoaXMuY29udGVudFVybC5tYXRjaChyZSk7XG4gICAgaWYgKCFhcHAgfHwgYXBwLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiVG8gdXNlIHRoZSBzZXJ2ZXJDYWxsIGZ1bmN0aW9uIHRoZSBjb250ZW50VXJsIG11c3QgYmUgc2V0OiBcIiArXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxTZXJ2ZXIoXG4gICAgICBhcHBbMV0sXG4gICAgICB0aGlzLl90YWdOYW1lLFxuICAgICAgdGhpcy5wYXJzZWRDb250ZW50VXJsID8/IHRoaXMuY29udGVudFVybCxcbiAgICAgIG1ldGhvZGUsXG4gICAgICBhcmdzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcGFyYW0gIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtTZGNRdWVyeVNldH1cbiAgICovXG4gIHF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgY29uc3QgbmV3UXVlcnlTZXQgPSBuZXcgU2RjUXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5KTtcbiAgICB0aGlzLl9tb2RlbHMucHVzaChuZXdRdWVyeVNldCk7XG4gICAgcmV0dXJuIG5ld1F1ZXJ5U2V0O1xuICB9XG5cbiAgbmV3TW9kZWwobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oXCJuZXdNb2RlbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHNvb24gYmUgcmVtb3ZlZFwiKTtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0ZXIgdG8gdGhpcy4kY29udGFpbmVyLmZpbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvbVNlbGVjdG9yXG4gICAqL1xuICBmaW5kKGRvbVNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRhaW5lci5maW5kKGRvbVNlbGVjdG9yKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgcmV0dXJuIGFwcC5yZWZyZXNoKHRoaXMuJGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgcmV0dXJuIGFwcC5yZWxvYWRDb250cm9sbGVyKHRoaXMpO1xuICB9XG5cbiAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCkge1xuICAgIHJldHVybiBhcHAucmVjb25jaWxlKHRoaXMsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgfVxuXG4gIHN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yKCRmb3JtLCBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gIH1cblxuICBpdGVyYXRlQWxsQ2hpbGRyZW4oKSB7XG4gICAgbGV0IF9jaGlsZENvbnRyb2xsZXIgPSB0aGlzLl9jaGlsZENvbnRyb2xsZXI7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKF9jaGlsZENvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgICByZXMucHVzaCguLi5jYy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgKi9cbiAgZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCB7bW9kZWwsIGZvcm1fbmFtZX0gPSAkZm9ybS5kYXRhKCk7XG4gICAgICBsZXQgZGF0YSA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9tO1xuICAgICAgICBpZiAobW9kZWwuaWQgIT09IG51bGwgJiYgbW9kZWwuaWQgPj0gMCkge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5zYXZlKHtmb3JtTmFtZTogZm9ybV9uYW1lLCBkYXRhfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZSh7ZGF0YX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyAmJlxuICAgICAgICAgICAgdGhpcy5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvbmNpbGUoXG4gICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4ke2RhdGEuaHRtbH08L2Rpdj5gKSxcbiAgICAgICAgICAgICAgJGZvcm0uZmluZChcIi5jb250YWluZXItZmx1aWRcIikuZmlyc3QoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yICYmXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuaXRlcmF0ZUFsbENoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvciAmJlxuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhbGxPZmYiLCJhcHAiLCJTZGNRdWVyeVNldCIsImNhbGxTZXJ2ZXIiLCJ1dWlkdjQiLCJjbGVhckVycm9yc0luRm9ybSIsInRhZ05hbWVUb0NhbWVsQ2FzZSIsInRhZ05hbWVUb1JlYWRhYmxlTmFtZSIsIkFic3RyYWN0U0RDIiwiY29uc3RydWN0b3IiLCJfdXVpZCIsImNvbnRlbnRVcmwiLCJjb250ZW50UmVsb2FkIiwicGFyc2VkQ29udGVudFVybCIsImV2ZW50cyIsImxvYWRfYXN5bmMiLCJfaXNFdmVudHNTZXQiLCJfYWxsRXZlbnRzIiwiX3BhcmFtcyIsIl91cmxQYXJhbXMiLCJfbW9kZWxzIiwiX2Nzc1VybHMiLCJhZnRlclNob3ciLCJjb25zb2xlIiwid2FybiIsIl9taXhpbnMiLCJfdGFnTmFtZSIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX2NoaWxkQ29udHJvbGxlciIsIl9wYXJlbnRDb250cm9sbGVyIiwiX29uTG9hZERvbmUiLCIkY29udGFpbmVyIiwiX2lzTWl4aW4iLCJwYXJhbXMiLCJfcnVuTGlmZWN5Y2xlIiwibWV0aG9kIiwiYXJncyIsIkRFQlVHIiwiZGVidWciLCJyZXR1cm5Qcm9taXNzZXMiLCJtaXhpbktleSIsIm1peGluIiwicHVzaCIsImFwcGx5IiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJvbkluaXQiLCJBcnJheSIsImFyZ3VtZW50cyIsInBhcmVudENvbnRyb2xsZXIiLCJjaGlsZENvbnRyb2xsZXIiLCJvbkxvYWQiLCJ3aWxsU2hvdyIsIm9uUmVmcmVzaCIsIm9uUmVtb3ZlIiwibm9PcGVuTW9kZWxSZXF1ZXN0cyIsIm1hcCIsIngiLCJub09wZW5SZXF1ZXN0cyIsInJlbW92ZSIsIm1vZGVsIiwiY2xvc2UiLCJpIiwiaGFzT3duUHJvcGVydHkiLCJjYyIsImNfbmFtZSIsImFyciIsImxlbmd0aCIsInNwbGljZSIsImNvbnRyb2xsZXJfbmFtZSIsImFkZEV2ZW50IiwiZXZlbnQiLCJzZWxlY3RvciIsImhhbmRsZXIiLCJnZXRFdmVudHMiLCJhbGxFdmVudHMiLCJjb25jYXQiLCJpc0FycmF5IiwiXyIsIm1lcmdlIiwicG9zdCIsInVybCIsImdldCIsInN1Ym1pdEZvcm0iLCJmb3JtIiwic3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXciLCJzZXJ2ZXJDYWxsIiwibWV0aG9kZSIsInJlIiwibWF0Y2giLCJlcnJvciIsIm5hbWUiLCJxdWVyeVNldCIsIm1vZGVsTmFtZSIsIm1vZGVsUXVlcnkiLCJuZXdRdWVyeVNldCIsIm5ld01vZGVsIiwiZmluZCIsImRvbVNlbGVjdG9yIiwicmVmcmVzaCIsInJlbG9hZCIsInJlbG9hZENvbnRyb2xsZXIiLCJyZWNvbmNpbGUiLCIkdmlydHVhbE5vZGUiLCIkcmVhbE5vZGUiLCJzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvciIsIiRmb3JtIiwiZSIsIl9zdWJtaXRNb2RlbEZvcm0iLCJzdWJtaXRNb2RlbEZvcm0iLCJkZWZhdWx0U3VibWl0TW9kZWxGb3JtIiwiaXRlcmF0ZUFsbENoaWxkcmVuIiwicmVzIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJmb3JtX25hbWUiLCJkYXRhIiwic3luY0Zvcm0iLCJyZXNvbHZlIiwicmVqZWN0IiwicHJvbSIsImlkIiwic2F2ZSIsImZvcm1OYW1lIiwiY3JlYXRlIiwic3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyIsImNvbnRyb2xsZXIiLCJjYXRjaCIsIiQiLCJodG1sIiwiZmlyc3QiLCJzdWJtaXRfbW9kZWxfZm9ybV9lcnJvciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
28
28
 
29
29
  /***/ },
30
30
 
@@ -74,7 +74,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
74
74
  \*******************************************/
75
75
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
76
76
 
77
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n };\n }\n super(props.msg);\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\nclass FileLoaded {\n constructor({\n name,\n url\n }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(() => {\n resolve('');\n });\n });\n }\n return this.content;\n }\n async text() {\n return this.load();\n }\n static isValid(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof File) && typeof value.url === \"string\" && typeof value.name === \"string\";\n }\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {};\n this.onCreate = () => {};\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return {\n value: this.valuesList[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n set on_create(handler) {\n this.onCreate = handler;\n }\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet) {\n this.valuesList = structuredClone(ids.valuesList);\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n } else if (ids instanceof SdcModel) {\n this.valuesList = [structuredClone(ids)];\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n }\n let numList,\n numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n } else {\n numId = parseInt(ids);\n }\n }\n if (!Number.isNaN(numId)) {\n const newModel = this.new();\n newModel.id = numId;\n } else if (numList) {\n this.valuesList = this.valuesList.filter(item => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach(id => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({\n id\n }));\n });\n }\n return this.valuesList;\n }\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find(elm => elm.id === normalizedId) ?? null;\n }\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad();\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({\n modelQuery = null,\n item = null\n }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? {\n pk: item.id\n } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({\n pk = null,\n elem = null\n }) {\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null) {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery\n }\n }));\n this.openRequest[id] = [data => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\"\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\"\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n */\n getForm({\n modelObj,\n eventType,\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId\n }) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n model_name: this.modelName,\n pk,\n form_name: formName\n }\n }));\n });\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n this.openRequest[id] = [data => {\n $divForm.append(data.html);\n let $form = $divForm.closest(\"form\").addClass(`sdc-model-${className}-form sdc-model-form ${formId}`).data(\"model\", modelObj).data(\"model_pk\", pk).data(\"form_name\", formName);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? modelQuery?.pk;\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n return this.valuesList[0];\n }\n detailView({\n pk,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendDetailView({\n pk,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n listView({\n modelQuery = {},\n searchValues = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, {\n '__search_values': searchValues\n }),\n cbResolve,\n cbReject,\n templateContext\n });\n }\n save({\n pk = null,\n formName = \"edit_form\",\n data = null\n } = {}) {\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n const sendData = data ? {\n ...data\n } : elem.serialize();\n sendData.pk = elem.id;\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id: id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n pk: sendData.pk,\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(pList);\n });\n }\n\n /**\n *\n * @param elem {?SdcModel}\n * @param data {?object}\n * @returns {Promise<unknown>}\n */\n create({\n elem = null,\n data = null\n } = {}) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n if (elem) {\n elem.id = data[0]?.pk || data[0]?.id;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (!this._isConnectingProcess || !this.openRequest[CONNECTING_REQUEST_ID]) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] = this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n resolveOrigin();\n resolve();\n }, () => {\n rejectOrigin();\n reject();\n }];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this[\"socket\"];\n }\n this.valuesList.forEach(elem => {\n elem._onClose();\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach(key => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(new Promise(async (resolve, reject) => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[id] = [resolve, reject];\n const buffer = await value.arrayBuffer();\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)));\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id: id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n }\n }));\n }\n });\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise(resolve => {\n const modelIdentifier = `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`);\n this._isConnected = false;\n for (const [_key, value] of Object.entries(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n setTimeout(() => {\n if (this._autoReconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = [];\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({\n 'id': x.pk ?? x.id,\n ...x.fields\n });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n if (!parent) {\n return new SdcQuerySet(this.modeName, modelQuerySet);\n }\n return parent.querySet(this.modeName, modelQuerySet);\n }\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n this._forms.push($form);\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\"input.formWatcher change.formWatcher\", \"input, select, textarea\", onChange);\n }\n }\n _onChange(event) {\n const {\n name\n } = event.target;\n if (this.constructor.fields[name]) {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n }\n }\n _updateForm(fieldName) {\n const self = this;\n this._forms.forEach($form => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n });\n });\n }\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n save({\n formName = \"edit_form\",\n data = null\n } = {}) {\n return this._querySet.deref().save({\n pk: this.id,\n formName,\n data\n });\n }\n create({\n data = null\n } = {}) {\n return this._querySet.deref().create({\n elem: this,\n data\n });\n }\n delete() {\n return this._querySet.deref().delete({\n elem: this\n });\n }\n load() {\n return this._querySet.deref().update({\n item: this\n });\n }\n get id() {\n return this._id;\n }\n set pk(data) {\n this._id = data;\n }\n get pk() {\n return this._id;\n }\n close() {\n return this._querySet.deref().close();\n }\n _onClose() {\n Object.keys(this.constructor.fields).filter(x => this[`_${x}`] instanceof SdcQuerySet).forEach(x => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._querySet.deref().detailView({\n pk: this.id,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n }\n toJson() {\n const res = {};\n for (let key in this.constructor.fields) {\n const value = this[key];\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk) {\n return;\n }\n for (let formItem of this.elements) {\n let name = formItem.name;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name]);\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n const returnValue = {};\n function setValueInForm(name, value) {\n if (!!fields[name]) {\n self[name] = value;\n }\n returnValue[name] = value;\n }\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n return self;\n });\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({\n cbResolve = null,\n cbReject = null\n } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({\n cbReject,\n cbResolve\n });\n }\n return this._editForm({\n cbReject,\n cbResolve\n });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({\n formName,\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $('<div class=\"container-fluid\">');\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type\n } = config;\n if (value === null) {\n return null;\n }\n switch (type) {\n case \"CharField\":\n case \"TeextField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n return parseInt(value, 10);\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n return !!value;\n case \"DateField\":\n case \"DateTimeField\":\n return Date.parse(value);\n case \"URLField\":\n return new URL(value);\n case \"FileField\":\n if (value == null) {\n return null;\n }\n if (typeof value === \"string\") {\n return null;\n }\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n return value;\n }\n break;\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n default:\n break;\n }\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel\n } = config;\n void isRelation;\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n if (!Number.isInteger(value)) {\n return \"Must be an integer\";\n }\n break;\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n case \"JSONField\":\n if (typeof value !== \"object\") {\n return \"Must be JSON object\";\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n break;\n default:\n break;\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUM5SCxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVCLE9BQU8sc0JBQXNCO01BQy9CO01BQ0E7SUFFRixLQUFLLFlBQVk7TUFDZixJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzFFLE9BQU8sZUFBZTtNQUN4QjtNQUNBO0lBRUYsS0FBSyxVQUFVO01BQ2IsSUFBSTtRQUNGLElBQUk0TyxHQUFHLENBQUM1TyxLQUFLLENBQUM7TUFDaEIsQ0FBQyxDQUFDLE1BQU07UUFDTixPQUFPLGFBQWE7TUFDdEI7TUFDQTtJQUVGLEtBQUssV0FBVztNQUNkLElBQUksQ0FBQywyRUFBMkUsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzVGLE9BQU8sY0FBYztNQUN2QjtNQUNBO0lBRUYsS0FBSyxXQUFXO01BQ2QsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8scUJBQXFCO01BQzlCO01BQ0E7SUFDRixLQUFLLFdBQVc7TUFDZCxJQUFJLENBQUNmLFVBQVUsQ0FBQ2MsT0FBTyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQSxLQUFLLFlBQVlHLElBQUksQ0FBQyxJQUFJLEVBQUVILEtBQUssWUFBWWYsVUFBVSxDQUFDLEVBQUU7UUFDNUYsT0FBTyxzQkFBc0I7TUFDL0I7TUFDQTtJQUNGO01BQ0U7RUFDSjtFQUVBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qcz80NDM2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFZhbHVlRnJvbUZpZWxkLCBzZXRWYWx1ZUluRmllbGQsIHV1aWR2NCB9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgZ2V0TW9kZWwgfSBmcm9tIFwiLi9zZGNfc29ja2V0LmpzXCJcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG5jb25zdCBNQVhfRklMRV9VUExPQUQgPSAyNTAwMDtcbmNvbnN0IENPTk5FQ1RJTkdfUkVRVUVTVF9JRCA9IFwiX2Nvbm5lY3RpbmdfcHJvY2Vzc1wiO1xuXG5jbGFzcyBTZGNNb2RlbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm9wcyA9IHtcbiAgICAgICAgbXNnOiBwcm9wcyxcbiAgICAgICAgaXNfZXJyb3I6IHRydWUsXG4gICAgICAgIGhlYWRlcjogJ0Vycm9yJ1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlcihwcm9wcy5tc2cpXG4gICAgdGhpcy5tc2cgPSBwcm9wcy5tc2c7XG4gICAgdGhpcy5oZWFkZXIgPSBwcm9wcy5oZWFkZXI7XG4gICAgdGhpcy5pc19lcnJvciA9IHByb3BzLmlzX2Vycm9yO1xuICAgIHRoaXMuaHRtbCA9IHByb3BzLmh0bWw7XG4gIH1cbn1cblxuY2xhc3MgRmlsZUxvYWRlZCB7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZSwgdXJsIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMuY29udGVudCA9IG51bGw7XG4gIH1cblxuICBhc3luYyBsb2FkKGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoZm9yY2UgfHwgIXRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5jb250ZW50ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAkLmdldCh0aGlzLnVybCkudGhlbihyZXNvbHZlKS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50O1xuICB9XG5cbiAgYXN5bmMgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkKCk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZCh2YWx1ZSkge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLnVybCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09IFwic3RyaW5nXCJcbiAgICApO1xuICB9XG5cblxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBpbmNvbWluZyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAqXG4gKiBgLTFgIGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIG1vZHVsZSBhcyB0aGUgc2VudGluZWwgZm9yIFwibmV3IG9iamVjdCAvIG5vIHBrXCIuXG4gKlxuICogQHBhcmFtIHsqfSBwa1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGsocGspIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBrID0gcGFyc2VJbnQocGsgPz8gLTEsIDEwKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihub3JtYWxpemVkUGspID8gLTEgOiBub3JtYWxpemVkUGs7XG59XG5cbmV4cG9ydCBjbGFzcyBTZGNRdWVyeVNldCB7XG4gIC8qKlxuICAgKiBMaWdodHdlaWdodCBjbGllbnQtc2lkZSBjb2xsZWN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSBTREMgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBUaGUgcXVlcnlzZXQgZXhwb3NlcyBhcnJheS1saWtlIGFjY2VzcyB0aHJvdWdoIGEgcHJveHkgd2hpbGUgYWxzbyBrZWVwaW5nXG4gICAqIHRyYWNrIG9mIHNvY2tldCBzdGF0ZSBhbmQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIHRoYXQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTmFtZSA9IG1vZGVsTmFtZTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHt9O1xuICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgLy8gUmVxdWVzdCByZXNvbHZlcnMgYXJlIHN0b3JlZCBieSB3ZWJzb2NrZXQgZXZlbnQgaWQgdW50aWwgdGhlIHNlcnZlciByZXNwb25kcy5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG4gICAgdGhpcy5tb2RlbElkID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgIH07XG4gICAgdGhpcy5vbkNyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiAhaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0LnZhbHVlc0xpc3RbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH0sXG5cbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBpZHggPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICArK2lkeDtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy52YWx1ZXNMaXN0W2lkeF0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHNldCBvbl9jcmVhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25DcmVhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uX3VwZGF0ZShoYW5kbGVyKSB7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxpbnRlZ3J8c3RyaW5nPnxpbnRlZ2VyfFNkY01vZGVsfFNkY1F1ZXJ5U2V0fHN0cmluZ30gaWRzXG4gICAqL1xuICBzZXRJZHMoaWRzKSB7XG5cbiAgICBpZiAoaWRzID09PSBudWxsIHx8IGlkcyA9PT0gXCJcIiB8fCBBcnJheS5pc0FycmF5KGlkcykgJiYgaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICAgIH0gZWxzZSBpZiAoaWRzIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHN0cnVjdHVyZWRDbG9uZShpZHMudmFsdWVzTGlzdCk7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSkpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSBbc3RydWN0dXJlZENsb25lKGlkcyldO1xuICAgICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2godmFsdWUgPT4gdmFsdWUuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfVxuXG4gICAgbGV0IG51bUxpc3QsIG51bUlkID0gTnVtYmVyLk5hTjtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZHMpKSB7XG4gICAgICBudW1JZCA9IGlkcztcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLnNwbGl0KCcsJykubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUlkID0gcGFyc2VJbnQoaWRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihudW1JZCkpIHtcbiAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5uZXcoKTtcbiAgICAgIG5ld01vZGVsLmlkID0gbnVtSWQ7XG4gICAgfSBlbHNlIGlmIChudW1MaXN0KSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSB0aGlzLnZhbHVlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiBudW1MaXN0LmluY2x1ZGVzKGl0ZW0uaWQpKTtcbiAgICAgIGNvbnN0IHZhbHVlSWRzID0gdGhpcy5nZXRJZHMoKTtcbiAgICAgIG51bUxpc3QuZmlsdGVyKHggPT4gIXZhbHVlSWRzLmluY2x1ZGVzKHgpKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXcgKGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKSkoeyBpZCB9KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgfVxuXG4gIGdldElkcygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0Lm1hcCh4ID0+IHguaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBtb2RlbCBpbnN0YW5jZXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbW9kZWwgaW5zdGFuY2UgYnkgaWQsIGxvYWRpbmcgdGhlIHF1ZXJ5c2V0IGZpcnN0IGlmIG5lZWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBpZFxuICAgKiBAcmV0dXJucyB7U2RjTW9kZWx8bnVsbH1cbiAgICovXG4gIGJ5SWQoaWQpIHtcbiAgICBpZiAoaWQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZVBrKGlkKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QuZmluZCgoZWxtKSA9PiBlbG0uaWQgPT09IG5vcm1hbGl6ZWRJZCkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzIGludG8gdGhlIGN1cnJlbnQgcXVlcnlzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtTZGNRdWVyeVNldH1cbiAgICovXG4gIHNldEZpbHRlcihtb2RlbFF1ZXJ5KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEZpbHRlcihtb2RlbFF1ZXJ5KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbFF1ZXJ5LCBtb2RlbFF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyB7U2RjTW9kZWx9XG4gICAqL1xuICBuZXcodmFsdWVzID0ge30pIHtcbiAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyAoZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpKSh2YWx1ZXMpO1xuICAgIG5ld01vZGVsLl9zZXRRdWVyeVNldCh0aGlzLCBmYWxzZSk7XG4gICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgIHJldHVybiBuZXdNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1vZGVsIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeSBpbnRvIHRoZSBxdWVyeXNldCBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY1F1ZXJ5U2V0Pn1cbiAgICovXG4gIGxvYWQobW9kZWxRdWVyeSA9IG51bGwpIHtcbiAgICB0aGlzLnZhbHVlc0xpc3QgPSBbXTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1vZGVsIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeSBpbnRvIHRoZSBxdWVyeXNldCBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEBwYXJhbSB7P1NkY01vZGVsfSBpdGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY1F1ZXJ5U2V0Pn1cbiAgICovXG4gIHVwZGF0ZSh7IG1vZGVsUXVlcnkgPSBudWxsLCBpdGVtID0gbnVsbCB9KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnk7XG4gICAgbGV0IGxvYWRRdWVyeSA9IGl0ZW0gPyB7IHBrOiBpdGVtLmlkIH0gOiB0aGlzLm1vZGVsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRMb2FkKGxvYWRRdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBrIHtpbnRlZ3J9XG4gICAqIEBwYXJhbSBlbGVtIHtTZGNNb2RlbH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBkZWxldGUoeyBwayA9IG51bGwsIGVsZW0gPSBudWxsIH0pIHtcbiAgICBwayA9ICFlbGVtID8gcGsgOiBlbGVtLmlkO1xuICAgIGlmIChwayA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGsgb3IgZWxlbSBtdXN0IGJlIHNldFwiKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXNpZGUgcXVlcnlzZXQgZGF0YSBvdmVyIHRoZSBtb2RlbCB3ZWJzb2NrZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgKi9cbiAgX3NlbmRMb2FkKGxvYWRRdWVyeSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwibG9hZFwiLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IGxvYWRRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxpc3QtdmlldyBlbmRwb2ludCBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmRMaXN0Vmlldyh7XG4gICAgICAgICAgICAgICAgICBtb2RlbFF1ZXJ5ID0ge30sXG4gICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICAgICAgICAgfSkge1xuICAgIHJldHVybiB0aGlzLnZpZXcoe1xuICAgICAgbW9kZWxRdWVyeSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgICAgZXZlbnRUeXBlOiBcImxpc3Rfdmlld1wiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIG1vZGVsIHZpZXcgYW5kIGFwcGVuZCBpdHMgSFRNTCB0byBhIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHZpZXcoe1xuICAgICAgICAgdmlld05hbWUgPSBcImh0bWxfbGlzdF90ZW1wbGF0ZVwiLFxuICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgZXZlbnRUeXBlID0gXCJuYW1lZF92aWV3XCIsXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICB2aWV3X25hbWU6IHZpZXdOYW1lLFxuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtb2RlbF9xdWVyeTogbW9kZWxRdWVyeSxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBkZXRhaWwtdmlldyBlbmRwb2ludCBmb3IgYSBzaW5nbGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmREZXRhaWxWaWV3KHtcbiAgICAgICAgICAgICAgICAgICAgcGsgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgICAgICAgICAgfSkge1xuICAgIHBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBcImRldGFpbF92aWV3XCIsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgJGRpdkxpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgYXBwLnJlZnJlc2goJGRpdkxpc3QpO1xuICAgICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIG1vZGVsIGZvcm0gZnJhZ21lbnQgYW5kIGF0dGFjaCB0aGUgU0RDIGZvcm0gbWV0YWRhdGEgZXhwZWN0ZWQgYnlcbiAgICogdGhlIHJlc3Qgb2YgdGhlIGNsaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcGFyYW0ge1NkY01vZGVsfSBtb2RlbE9ialxuICAgKi9cbiAgZ2V0Rm9ybSh7IG1vZGVsT2JqLCBldmVudFR5cGUsIGZvcm1OYW1lLCAkZGl2Rm9ybSwgY2JSZXNvbHZlLCBjYlJlamVjdCwgZm9ybUlkIH0pIHtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIGNvbnN0IHBrID0gbW9kZWxPYmouaWQgPz8gLTE7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgZm9ybV9uYW1lOiBmb3JtTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCB8fCBwayA9PT0gLTEgPyBcImNyZWF0ZVwiIDogXCJlZGl0XCI7XG5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtcbiAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICRkaXZGb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICBsZXQgJGZvcm0gPSAkZGl2Rm9ybVxuICAgICAgICAgIC5jbG9zZXN0KFwiZm9ybVwiKVxuICAgICAgICAgIC5hZGRDbGFzcyhcbiAgICAgICAgICAgIGBzZGMtbW9kZWwtJHtjbGFzc05hbWV9LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHtmb3JtSWR9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmRhdGEoXCJtb2RlbFwiLCBtb2RlbE9iailcbiAgICAgICAgICAuZGF0YShcIm1vZGVsX3BrXCIsIHBrKVxuICAgICAgICAgIC5kYXRhKFwiZm9ybV9uYW1lXCIsIGZvcm1OYW1lKTtcbiAgICAgICAgbW9kZWxPYmouYWRkRm9ybSgkZm9ybSk7XG4gICAgICAgIGlmICgkZm9ybS5sZW5ndGggPiAwICYmICEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoXCJzZGNfc3VibWl0XCIpKSB7XG4gICAgICAgICAgJGZvcm0uYXR0cihcInNkY19zdWJtaXRcIiwgXCJzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZGb3JtKS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgfSxcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHNpbmdsZSBtb2RlbCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IGRvTm90TG9hZCB0cnVlIGlmIG1vZGVsUXVlcnkgY29udGFpbnMgaWQgb3IgcGsgYW5kIG9iamVjdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjTW9kZWw+fVxuICAgKi9cbiAgYXN5bmMgZ2V0KG1vZGVsUXVlcnkgPSBudWxsLCBkb05vdExvYWQgPSBmYWxzZSkge1xuICAgIGlmIChkb05vdExvYWQpIHtcbiAgICAgIGNvbnN0IGlkID0gbW9kZWxRdWVyeT8uaWQgPz8gbW9kZWxRdWVyeT8ucGs7XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKGlkKSA/PyB0aGlzLm5ldyhtb2RlbFF1ZXJ5IHx8IHRoaXMubW9kZWxRdWVyeSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZChtb2RlbFF1ZXJ5KTtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbW9kZWwgcXVlcnkgcmV0dXJucyAke3RoaXMubGVuZ3RofSBidXQgb25seSAxIGV4cGVjdGVkLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3RbMF07XG4gIH1cblxuICBkZXRhaWxWaWV3KHsgcGssIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kRGV0YWlsVmlldyh7XG4gICAgICBwayxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoeyBtb2RlbFF1ZXJ5ID0ge30sIHNlYXJjaFZhbHVlcyA9IHt9LCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExpc3RWaWV3KHtcbiAgICAgIG1vZGVsUXVlcnk6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubW9kZWxRdWVyeSwgbW9kZWxRdWVyeSwgeyAnX19zZWFyY2hfdmFsdWVzJzogc2VhcmNoVmFsdWVzIH0pLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlKHsgcGsgPSBudWxsLCBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIGNvbnN0IG5vcm1QayA9IG5vcm1hbGl6ZVBrKHBrKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgbGV0IGVsZW1MaXN0O1xuICAgICAgaWYgKG5vcm1QayA+IC0xKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmJ5SWQobm9ybVBrKTtcbiAgICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTZGNNb2RlbEVycm9yKGBFbGVtZW50IG5vdCBmb3VuZCB3aXRoIElEOiAke25vcm1Qa31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbUxpc3QgPSBbZWxlbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtTGlzdCA9IHRoaXMudmFsdWVzTGlzdDtcbiAgICAgIH1cbiAgICAgIGxldCBwTGlzdCA9IFtdO1xuICAgICAgZWxlbUxpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICBwTGlzdC5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzZW5kRGF0YSA9IGRhdGEgPyB7IC4uLmRhdGEgfSA6IGVsZW0uc2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgIHNlbmREYXRhLnBrID0gZWxlbS5pZDtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZW5kRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHNlbmREYXRhLnBrLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbSB7P1NkY01vZGVsfVxuICAgKiBAcGFyYW0gZGF0YSB7P29iamVjdH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUoeyBlbGVtID0gbnVsbCwgZGF0YSA9IG51bGwgfSA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIGVsZW0gPSB0aGlzLm5ldyhkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY3JlYXRlXCIsXG4gICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSA/PyBlbGVtPy5zZXJpYWxpemUoKSA/PyB7fSxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbXG4gICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbS5pZCA9IGRhdGFbMF0/LnBrIHx8IGRhdGFbMF0/LmlkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSlbMF07XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHdlYnNvY2tldCBpcyBvcGVuIGFuZCBoYXMgY29tcGxldGVkIHRoZSBzZXJ2ZXItc2lkZSBjb25uZWN0XG4gICAqIGhhbmRzaGFrZSBiZWZvcmUgaXNzdWluZyBtb2RlbCByZXF1ZXN0cy5cbiAgICpcbiAgICogTXVsdGlwbGUgY2FsbGVycyBjYW4gYXJyaXZlIHdoaWxlIGEgY29ubmVjdGlvbiBhdHRlbXB0IGlzIGFscmVhZHkgaW5cbiAgICogcHJvZ3Jlc3MuIEluIHRoYXQgY2FzZSB0aGV5IGFyZSBxdWV1ZWQgYmVoaW5kIHRoZSBzYW1lIHN5bnRoZXRpYyByZXF1ZXN0IGlkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIXRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgfHxcbiAgICAgICAgIXRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbKCkgPT4ge1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH1dO1xuICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcmVzb2x2ZU9yaWdpbiwgcmVqZWN0T3JpZ2luXSA9XG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZU9yaWdpbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0T3JpZ2luKCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGRpc2FibGUgYXV0b21hdGljIHJlY29ubmVjdCBmb3IgdGhpcyBxdWVyeXNldC5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXNbXCJzb2NrZXRcIl07XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgIGVsZW0uX29uQ2xvc2UoKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhdHRhY2hlZCBgRmlsZWAgdmFsdWVzIGluIGZpeGVkLXNpemUgY2h1bmtzIGJlZm9yZSBzYXZlL2NyZWF0ZSBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gZWxlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICAgKi9cbiAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgbGV0IHRvU29sdmUgPSBbXTtcbiAgICBsZXQgZmlsZXMgPSB7fTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmlsZXMpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhlbGVtLmNvbnN0cnVjdG9yLmZpZWxkcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVsZW1ba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgdG9Tb2x2ZS5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICBsZXQgbnVtYmVyT2ZDaHVua3MgPSBNYXRoLmNlaWwocmVzdWx0Lmxlbmd0aCAvIE1BWF9GSUxFX1VQTE9BRCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0ge1xuICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBBcnJheS5mcm9tKHJlc3VsdC5zbGljZShcbiAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiBpLFxuICAgICAgICAgICAgICAgIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSksXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInVwbG9hZFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgICAgICAgICAgaWR4OiBpLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2h1bmtzOiBudW1iZXJPZkNodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbCh0b1NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWxlcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSB3ZWJzb2NrZXQgcmVzcG9uc2VzIHRvIHRoZSBtYXRjaGluZyBwZW5kaW5nIHJlcXVlc3QgYW5kIHVwZGF0ZSBsb2NhbFxuICAgKiBzdGF0ZSB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgbW9kZWwgcGF5bG9hZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7TWVzc2FnZUV2ZW50fSBlXG4gICAqL1xuICBhc3luYyBfb25NZXNzYWdlKGUpIHtcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgaWYgKHRoaXMub3BlblJlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShuZXcgU2RjTW9kZWxFcnJvcihkYXRhKSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hFcnJvck1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdWzFdKG5ldyBTZGNNb2RlbEVycm9yKGRhdGEpKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKFwicHVzaE1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgfSBlbHNlIGlmIChbXCJsb2FkXCIsIFwibmFtZWRfdmlld1wiLCBcImRldGFpbF92aWV3XCJdLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY29uc3QganNvblJlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IGF3YWl0IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25SZXMpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwib25fdXBkYXRlXCIgfHwgZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICBsZXQgb2JqID0gYXdhaXQgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvblJlcyk7XG4gICAgICAgIGxldCBjYjtcblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uQ3JlYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiID0gdGhpcy5vblVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNiKG9iaik7XG4gICAgICAgIGRhdGEuYXJncy5kYXRhID0gb2JqO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zdGFuY2UgPSBkYXRhLmRhdGE/Lmluc3RhbmNlO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuZGF0YS5pbnN0YW5jZSA9IEpTT04ucGFyc2UoZGF0YS5kYXRhLmluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3BlblJlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IHdlYnNvY2tldCByZXF1ZXN0cyBmb3IgdGhpcyBxdWVyeXNldCBhcmUgcmVzb2x2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgbm9PcGVuUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb21wbGV0ZWQgcmVxdWVzdCBhbmQgd2FrZSBhbnkgYG5vT3BlblJlcXVlc3RzKClgIHdhaXRlcnMgd2hlbiB0aGVcbiAgICogcmVxdWVzdCBtYXAgYmVjb21lcyBlbXB0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50SWRcbiAgICovXG4gIF9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50SWQpIHtcbiAgICBkZWxldGUgdGhpcy5vcGVuUmVxdWVzdFtldmVudElkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLmZvckVhY2goKHgpID0+IHgoKSk7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaCB0aGUgcmF3IHdlYnNvY2tldCBjb25uZWN0aW9uIGZvciB0aGlzIHF1ZXJ5c2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbElkZW50aWZpZXIgPVxuICAgICAgICBgJHt0aGlzLm1vZGVsTmFtZX1gICsgKHRoaXMubW9kZWxJZCA+IDAgPyBgLyR7dGhpcy5tb2RlbElkfWAgOiBcIlwiKTtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgIGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICBgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbE5hbWV9LCAke3RoaXMubW9kZWxJZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBbX2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3BlblJlcXVlc3QpKSB7XG4gICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdCA9IHt9O1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9hdXRvUmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBNb2RlbCBTb2NrZXQgZW5jb3VudGVyZWQgZXJyb3I6ICR7ZXJyfSBDbG9zaW5nIHNvY2tldGApO1xuICAgICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYXBwbGljYXRpb24tbGV2ZWwgY29ubmVjdCBoYW5kc2hha2Ugb25jZSB0aGUgd2Vic29ja2V0IG9wZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICovXG4gIF9jaGVja0Nvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogXCJjb25uZWN0XCIsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgYmFja2VuZCBtb2RlbCBwYXlsb2FkIGludG8gbG9jYWxseSB0cmFja2VkIG1vZGVsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVzdWx0c1xuICAgKi9cbiAgX3BhcnNlU2VydmVyUmVzKHJlc3VsdHMpIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBbXVxuICAgIGZvciAoY29uc3QgeCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gaXMgbm8gU2RjTW9kZWwuIG15YmUgdGhlIG1vZGVscyBhciBub3QgaW1wb3J0YWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyBNb2RlbENsYXNzKHsgJ2lkJzogeC5wayA/PyB4LmlkLCAuLi54LmZpZWxkcyB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHRoaXMuYnlJZChuZXdNb2RlbC5pZCk7XG4gICAgICBpZiAoY3VycmVudE1vZGVsKSB7XG4gICAgICAgIGN1cnJlbnRNb2RlbC5zZXRWYWx1ZXMobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChjdXJyZW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbC5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIG5ld01vZGVscy5wdXNoKG5ld01vZGVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXNMaXN0LnNvcnQoKGEsIGIpID0+IGEuX2lkIC0gYi5faWQpO1xuICAgIHJldHVybiBuZXdNb2RlbHM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2RjTW9kZWwge1xuICBzdGF0aWMgZmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgbW9kZWwgd3JhcHBlciB1c2VkIGJ5IFNEQyBtb2RlbCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUpIHtcbiAgICB0aGlzLl9pZCA9IG51bGw7XG4gICAgdGhpcy5fZm9ybXMgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybUlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5U2V0XG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudFxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBzdGF0aWMgcXVlcnlTZXQobW9kZWxRdWVyeVNldCA9IG51bGwsIHBhcmVudCA9IG51bGwpIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIG5ldyBTZGNRdWVyeVNldCh0aGlzLm1vZGVOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2V0KHRoaXMubW9kZU5hbWUsIG1vZGVsUXVlcnlTZXQpO1xuICB9XG5cbiAgYWRkRm9ybSgkZm9ybSkge1xuICAgIC8vIFJlbW92ZSBvbGQgbGlzdGVuZXJzIGlmIGZvcm0gYWxyZWFkeSBzZXRcbiAgICBjb25zdCBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9mb3Jtcy5wdXNoKCRmb3JtKTtcblxuICAgIGlmICgkZm9ybSkge1xuICAgICAgLy8gQXR0YWNoIGRlbGVnYXRlZCBldmVudCBoYW5kbGVyIHRvIGFsbCBpbnB1dHNcbiAgICAgICRmb3JtLm9uKFxuICAgICAgICBcImlucHV0LmZvcm1XYXRjaGVyIGNoYW5nZS5mb3JtV2F0Y2hlclwiLFxuICAgICAgICBcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIsXG4gICAgICAgIG9uQ2hhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkc1tuYW1lXSkge1xuICAgICAgdGhpc1tgc2V0JHtuYW1lfWBdKGdldFZhbHVlRnJvbUZpZWxkKGV2ZW50LnRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVGb3JtKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2Zvcm1zLmZvckVhY2goKCRmb3JtKSA9PiB7XG4gICAgICAkZm9ybS5maW5kKGBbbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRWYWx1ZUluRmllbGQodGhpcywgc2VsZltmaWVsZE5hbWVdKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRWYWx1ZXMoZGF0YSA9IHt9KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VmFsdWVzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIHF1ZXJ5c2V0IHRoYXQgb3ducyB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY1F1ZXJ5U2V0fSBxdWVyeVNldFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG9hZGVkXG4gICAqL1xuICBfc2V0UXVlcnlTZXQocXVlcnlTZXQsIGlzTG9hZGVkKSB7XG4gICAgdGhpcy5fcXVlcnlTZXQgPSBuZXcgV2Vha1JlZihxdWVyeVNldCk7XG4gICAgdGhpcy5sb2FkZWQgPSBpc0xvYWRlZDtcbiAgfVxuXG4gIHNhdmUoeyBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnNhdmUoeyBwazogdGhpcy5pZCwgZm9ybU5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBjcmVhdGUoeyBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jcmVhdGUoeyBlbGVtOiB0aGlzLCBkYXRhIH0pO1xuICB9XG5cbiAgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRlbGV0ZSh7IGVsZW06IHRoaXMgfSk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnVwZGF0ZSh7IGl0ZW06IHRoaXMgfSk7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgc2V0IHBrKGRhdGEpIHtcbiAgICB0aGlzLl9pZCA9IGRhdGE7XG4gIH1cblxuICBnZXQgcGsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNsb3NlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3IuZmllbGRzKVxuICAgICAgLmZpbHRlcigoeCkgPT4gdGhpc1tgXyR7eH1gXSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KVxuICAgICAgLmZvckVhY2goKHgpID0+IHRoaXNbYF8ke3h9YF0uY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXJlbmRlcmVkIGRldGFpbCB2aWV3IGZvciB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRldGFpbFZpZXcoeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZXRhaWxWaWV3KHsgcGs6IHRoaXMuaWQsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCB9KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIGlmICh2YWwubWFueV90b19tYW55IHx8IHZhbC5vbmVfdG9fbWFueSkge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsSWRzID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgICAgaWYgKGFsbElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGFsbElkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbC5pc19yZWxhdGlvbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWUuaWQgPz8gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgY29uc3QgcmVzID0ge31cbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgZm9yIHN5bmNpbmcgdmFsdWVzIGZyb20gYSBmb3JtIGludG8gdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGZvcm0gY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfcmVzb2x2ZUZvcm1zKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJChgLiR7dGhpcy5mb3JtSWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICRmb3JtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSBjdXJyZW50IG1vZGVsIHN0YXRlIGludG8gbWF0Y2hpbmcgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqL1xuICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIGlmIChzZWxmLmlkICE9PSBwaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGZvcm1JdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtSXRlbS5uYW1lO1xuICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIlwiICYmICEhZmllbGRzW25hbWVdKSB7XG4gICAgICAgICAgc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCBzZWxmW25hbWVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBtYXRjaGluZyBmb3JtIHZhbHVlcyBiYWNrIG9udG8gdGhlIGN1cnJlbnQgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEhpZGRlbiBpbnB1dHMgYXJlIHBhcnNlZCB0byB0aGVpciBvcmlnaW5hbCBwcmltaXRpdmUgdHlwZSB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICRmb3JtcyA9IHRoaXMuX3Jlc29sdmVGb3JtcygkZm9ybXMpO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHM7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fVxuXG4gICAgZnVuY3Rpb24gc2V0VmFsdWVJbkZvcm0obmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmICghIWZpZWxkc1tuYW1lXSkge1xuICAgICAgICBzZWxmW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgaWYgKHNlbGYuaWQgIT09IHBrICYmIChzZWxmLmlkICE9PSBudWxsIHx8IHBrICE9PSAtMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIHNldFZhbHVlSW5Gb3JtKGZvcm1JdGVtLm5hbWUsIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY29ycmVjdCBzZXJ2ZXItc2lkZSBmb3JtIGZvciB0aGlzIG1vZGVsIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwgfHwgdGhpcy5pZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNyZWF0ZSBmb3JtIGZvciBhIG5ldyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfY3JlYXRlRm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJChcIjxkaXY+XCIpO1xuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJjcmVhdGVfZm9ybVwiLFxuICAgICAgZm9ybU5hbWU6IG51bGwsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGVkaXQgZm9ybSBmb3IgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2VkaXRGb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiZWRpdF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgbmFtZWRGb3JtKHsgZm9ybU5hbWUsIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJuYW1lZF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZSxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkIGZpZWxkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqL1xuICB2YWxpZGF0ZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgY29uc3QgZXJyID0gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKTtcbiAgICBpZiAoZXJyKSB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgcmF3IGlucHV0IHZhbHVlIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHBhcnNlVmFsdWUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGVcbiAgICB9ID0gY29uZmlnO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgICBjYXNlIFwiVGVleHRGaWVsZFwiOlxuICAgICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgICAgIGNhc2UgXCJGbG9hdEZpZWxkXCI6XG4gICAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgbnVtYmVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuRmllbGRcIjpcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJEYXRlRmllbGRcIjpcbiAgICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEZpbGVMb2FkZWQuaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2FkZWQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5tYXhfc2l6ZSAmJiB2YWx1ZS5zaXplID4gY29uZmlnLm1heF9zaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gYEZpbGUgdG9vIGxhcmdlIChtYXggJHtjb25maWcubWF4X3NpemV9IGJ5dGVzKWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkX3R5cGVzICYmICFjb25maWcuYWxsb3dlZF90eXBlcy5pbmNsdWRlcyh2YWx1ZS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBJbnZhbGlkIGZpbGUgdHlwZSAoJHt2YWx1ZS50eXBlfSlgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgYWdhaW5zdCB0aGUgZmllbGQgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIG1heF9sZW5ndGg6IG1heExlbmd0aCxcbiAgICBpc19yZWxhdGlvbjogaXNSZWxhdGlvbixcbiAgICBtYW55X3RvX21hbnk6IG1hbnlUb01hbnksXG4gICAgb25lX3RvX21hbnk6IG9uZVRvTWFueSxcbiAgICBtYW55X3RvX29uZTogbWFueVRvT25lLFxuICAgIG9uZV90b19vbmU6IG9uZVRvT25lLFxuICAgIHJlbGF0ZWRfbW9kZWw6IHJlbGF0ZWRNb2RlbCxcbiAgfSA9IGNvbmZpZztcblxuICB2b2lkIGlzUmVsYXRpb247XG5cbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIjtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG1hbnlUb01hbnkgfHwgb25lVG9NYW55IHx8IG1hbnlUb09uZSB8fCBvbmVUb09uZSkge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHx8IHZhbHVlLm1vZGVsTmFtZSAhPT0gcmVsYXRlZE1vZGVsKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIE51bWJlci5pc05hTihwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgb2JqZWN0IG9yIElEXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgY2FzZSBcIlRleHRGaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgc3RyaW5nXCI7XG4gICAgICB9XG4gICAgICBpZiAobWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gYE1heCBsZW5ndGggaXMgJHttYXhMZW5ndGh9YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICBjYXNlIFwiQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYW4gaW50ZWdlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgIGNhc2UgXCJEZWNpbWFsRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIG51bWJlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQm9vbGVhbkZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgYm9vbGVhblwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRGF0ZUZpZWxkXCI6XG4gICAgY2FzZSBcIkRhdGVUaW1lRmllbGRcIjpcbiAgICAgIGlmIChpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGRhdGVcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIkludmFsaWQgZW1haWxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVSTFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVVVJREZpZWxkXCI6XG4gICAgICBpZiAoIS9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVVSURcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIEpTT04gb2JqZWN0XCI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiRmlsZUZpZWxkXCI6XG4gICAgICBpZiAoIUZpbGVMb2FkZWQuaXNWYWxpZCh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlTG9hZGVkKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgdmFsaWQgZmlsZVwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOlsiZ2V0VmFsdWVGcm9tRmllbGQiLCJzZXRWYWx1ZUluRmllbGQiLCJ1dWlkdjQiLCJnZXRNb2RlbCIsImFwcCIsInRyaWdnZXIiLCJNQVhfRklMRV9VUExPQUQiLCJDT05ORUNUSU5HX1JFUVVFU1RfSUQiLCJTZGNNb2RlbEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwibXNnIiwiaXNfZXJyb3IiLCJoZWFkZXIiLCJodG1sIiwiRmlsZUxvYWRlZCIsIm5hbWUiLCJ1cmwiLCJjb250ZW50IiwibG9hZCIsImZvcmNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCIkIiwiZ2V0IiwidGhlbiIsImNhdGNoIiwidGV4dCIsImlzVmFsaWQiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsIkZpbGUiLCJub3JtYWxpemVQayIsInBrIiwibm9ybWFsaXplZFBrIiwicGFyc2VJbnQiLCJOdW1iZXIiLCJpc05hTiIsIlNkY1F1ZXJ5U2V0IiwibW9kZWxOYW1lIiwibW9kZWxRdWVyeSIsInZhbHVlc0xpc3QiLCJsb2FkZWQiLCJfb25Ob09wZW5SZXF1ZXN0cyIsIl9pc0Nvbm5lY3RlZCIsIl9pc0Nvbm5lY3RpbmdQcm9jZXNzIiwiX2F1dG9SZWNvbm5lY3QiLCJzb2NrZXQiLCJvcGVuUmVxdWVzdCIsIm1vZGVsSWQiLCJvblVwZGF0ZSIsIm9uQ3JlYXRlIiwiUHJveHkiLCJ0YXJnZXQiLCJwcm9wIiwic2V0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJpZHgiLCJuZXh0IiwibGVuZ3RoIiwiZG9uZSIsIm9uX2NyZWF0ZSIsImhhbmRsZXIiLCJvbl91cGRhdGUiLCJzZXRJZHMiLCJpZHMiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJmb3JFYWNoIiwiX3NldFF1ZXJ5U2V0IiwiU2RjTW9kZWwiLCJudW1MaXN0IiwibnVtSWQiLCJOYU4iLCJpc0ludGVnZXIiLCJ0ZW1wTnVtTGlzdCIsIm1hcCIsIngiLCJzb21lIiwic3BsaXQiLCJuZXdNb2RlbCIsIm5ldyIsImlkIiwiZmlsdGVyIiwiaXRlbSIsImluY2x1ZGVzIiwidmFsdWVJZHMiLCJnZXRJZHMiLCJwdXNoIiwiYnlJZCIsIm5vcm1hbGl6ZWRJZCIsImZpbmQiLCJlbG0iLCJzZXRGaWx0ZXIiLCJhZGRGaWx0ZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJ2YWx1ZXMiLCJfc2VuZExvYWQiLCJ1cGRhdGUiLCJsb2FkUXVlcnkiLCJkZWxldGUiLCJlbGVtIiwiaXNDb25uZWN0ZWQiLCJzZW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50IiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwiYXJncyIsIm1vZGVsX25hbWUiLCJtb2RlbF9xdWVyeSIsImRhdGEiLCJfc2VuZExpc3RWaWV3IiwiY2JSZXNvbHZlIiwiY2JSZWplY3QiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ2aWV3IiwiZXZlbnRUeXBlIiwidmlld05hbWUiLCIkZGl2TGlzdCIsInZpZXdfbmFtZSIsInRlbXBsYXRlX2NvbnRleHQiLCJhcHBlbmQiLCJyZWZyZXNoIiwicmVzIiwiX3NlbmREZXRhaWxWaWV3IiwiZ2V0Rm9ybSIsIm1vZGVsT2JqIiwiZm9ybU5hbWUiLCIkZGl2Rm9ybSIsImZvcm1JZCIsImZvcm1fbmFtZSIsImNsYXNzTmFtZSIsIiRmb3JtIiwiY2xvc2VzdCIsImFkZENsYXNzIiwiYWRkRm9ybSIsImhhc0F0dHJpYnV0ZSIsImF0dHIiLCJkb05vdExvYWQiLCJkZXRhaWxWaWV3IiwibGlzdFZpZXciLCJzZWFyY2hWYWx1ZXMiLCJzYXZlIiwibm9ybVBrIiwiZWxlbUxpc3QiLCJwTGlzdCIsIl9yZWFkRmlsZXMiLCJmaWxlcyIsInNlbmREYXRhIiwic2VyaWFsaXplIiwiaW5zdGFuY2UiLCJwYXJzZSIsIl9wYXJzZVNlcnZlclJlcyIsImFsbCIsImNyZWF0ZSIsIl9jb25uZWN0VG9TZXJ2ZXIiLCJfY2hlY2tDb25uZWN0aW9uIiwicmVzb2x2ZU9yaWdpbiIsInJlamVjdE9yaWdpbiIsImNsb3NlIiwib25jbG9zZSIsIl9vbkNsb3NlIiwidG9Tb2x2ZSIsImtleXMiLCJmaWVsZHMiLCJrZXkiLCJidWZmZXIiLCJhcnJheUJ1ZmZlciIsInJlc3VsdCIsIlVpbnQ4QXJyYXkiLCJudW1iZXJPZkNodW5rcyIsIk1hdGgiLCJjZWlsIiwiZmlsZV9uYW1lIiwiZmllbGRfbmFtZSIsImNvbnRlbnRfbGVuZ3RoIiwic2l6ZSIsImkiLCJjaHVuayIsImZyb20iLCJzbGljZSIsIm51bWJlcl9vZl9jaHVua3MiLCJjb250ZW50X3R5cGUiLCJ0eXBlIiwiX29uTWVzc2FnZSIsImUiLCJoYXNPd25Qcm9wZXJ0eSIsIl9jbG9zZU9wZW5SZXF1ZXN0IiwianNvblJlcyIsIm9iaiIsImNiIiwibm9PcGVuUmVxdWVzdHMiLCJldmVudElkIiwibW9kZWxJZGVudGlmaWVyIiwid2luZG93IiwibG9jYXRpb24iLCJwcm90b2NvbCIsIldlYlNvY2tldCIsImhvc3QiLCJvbm1lc3NhZ2UiLCJiaW5kIiwiY29uc29sZSIsImVycm9yIiwiX2tleSIsImVudHJpZXMiLCJzZXRUaW1lb3V0Iiwib25lcnJvciIsImVyciIsIm9ub3BlbiIsInJlc3VsdHMiLCJuZXdNb2RlbHMiLCJNb2RlbENsYXNzIiwiY3VycmVudE1vZGVsIiwic2V0VmFsdWVzIiwic29ydCIsImEiLCJiIiwiX2lkIiwiX2Zvcm1zIiwicXVlcnlTZXQiLCJtb2RlbFF1ZXJ5U2V0IiwicGFyZW50IiwibW9kZU5hbWUiLCJvbkNoYW5nZSIsIl9vbkNoYW5nZSIsIm9uIiwiX3VwZGF0ZUZvcm0iLCJmaWVsZE5hbWUiLCJzZWxmIiwiZWFjaCIsImlzTG9hZGVkIiwiX3F1ZXJ5U2V0IiwiV2Vha1JlZiIsImRlcmVmIiwicmVkdWNlIiwiYWNjIiwidmFsIiwibWFueV90b19tYW55Iiwib25lX3RvX21hbnkiLCJhbGxJZHMiLCJpc19yZWxhdGlvbiIsInRvSnNvbiIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwiX3Jlc29sdmVGb3JtcyIsImhhc0NsYXNzIiwic3luY01vZGVsVG9Gb3JtIiwiZm9ybUl0ZW0iLCJlbGVtZW50cyIsInJldHVyblZhbHVlIiwic2V0VmFsdWVJbkZvcm0iLCJmb3JtIiwiX2NyZWF0ZUZvcm0iLCJfZWRpdEZvcm0iLCJuYW1lZEZvcm0iLCJ2YWxpZGF0ZSIsImNvbmZpZyIsInZhbGlkYXRlRmllbGQiLCJwYXJzZVZhbHVlIiwiRGF0ZSIsIlVSTCIsIm1heF9zaXplIiwiYWxsb3dlZF90eXBlcyIsInJlcXVpcmVkIiwibWF4X2xlbmd0aCIsIm1heExlbmd0aCIsImlzUmVsYXRpb24iLCJtYW55VG9NYW55Iiwib25lVG9NYW55IiwibWFueV90b19vbmUiLCJtYW55VG9PbmUiLCJvbmVfdG9fb25lIiwib25lVG9PbmUiLCJyZWxhdGVkX21vZGVsIiwicmVsYXRlZE1vZGVsIiwidW5kZWZpbmVkIiwidGVzdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
77
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\nconst cloneObject = original => {\n return Object.assign(Object.create(Object.getPrototypeOf(original)), structuredClone(original));\n};\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n };\n }\n super(props.msg);\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\nclass FileLoaded {\n constructor({\n name,\n url\n }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(() => {\n resolve('');\n });\n });\n }\n return this.content;\n }\n async text() {\n return this.load();\n }\n static isValid(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof File) && typeof value.url === \"string\" && typeof value.name === \"string\";\n }\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {};\n this.onCreate = () => {};\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return {\n value: this.valuesList[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n set on_create(handler) {\n this.onCreate = handler;\n }\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n const vl = this._setIds(ids);\n const filter = {\n id__in: vl.map(x => x.id)\n };\n this.setFilter(filter);\n return vl;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n cloneObject;\n _setIds(ids) {\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet) {\n this.valuesList = ids.valuesList.map(cloneObject);\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n } else if (ids instanceof SdcModel) {\n this.valuesList = [cloneObject(ids)];\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n }\n let numList,\n numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n } else {\n numId = parseInt(ids);\n }\n }\n if (!Number.isNaN(numId)) {\n this.valuesList = this.valuesList.filter(item => numId === item.id);\n if (this.valuesList.length === 0) {\n const newModel = this.new();\n newModel.id = numId;\n }\n } else if (numList) {\n this.valuesList = this.valuesList.filter(item => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach(id => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({\n id\n }));\n });\n }\n return this.valuesList;\n }\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find(elm => elm.id === normalizedId) ?? null;\n }\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad();\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({\n modelQuery = null,\n item = null\n }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? {\n id: item.id\n } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({\n pk = null,\n id = null,\n elem = null\n }) {\n pk ??= id;\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk\n }\n }));\n this.openRequest[event_id] = [resolve, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null) {\n return this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery\n }\n }));\n this.openRequest[event_id] = [data => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\"\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\"\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext\n }\n }));\n this.openRequest[event_id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n id = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n pk ??= id;\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk,\n template_context: templateContext\n }\n }));\n this.openRequest[event_id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n * @param formName\n * @param $divForm\n * @param cbResolve\n * @param cbReject\n * @param formId\n */\n getForm({\n modelObj,\n eventType,\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId\n }) {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n model_name: this.modelName,\n id: pk,\n pk,\n form_name: formName\n }\n }));\n });\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n this.openRequest[event_id] = [data => {\n $divForm.append(data.html);\n let $form = $divForm.closest(\"form\").addClass(`sdc-model-${className}-form sdc-model-form ${formId}`).data(\"model\", modelObj).data(\"model_pk\", pk).data(\"form_name\", formName);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? this.modelQuery?.id;\n if (modelQuery) {\n this.setFilter(modelQuery);\n }\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n this.addFilter({\n id: this.valuesList[0].id\n });\n return this.valuesList[0];\n }\n detailView({\n pk,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendDetailView({\n id: pk,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n listView({\n modelQuery = {},\n searchValues = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, {\n '__search_values': searchValues\n }),\n cbResolve,\n cbReject,\n templateContext\n });\n }\n save({\n pk = null,\n id = null,\n formName = \"edit_form\",\n data = null\n } = {}) {\n pk ??= id;\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach(elem => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n const sendData = data ? {\n ...data\n } : elem.serialize();\n sendData.id = elem.id;\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n id: sendData.id,\n pk: sendData.id,\n files: files\n }\n }));\n this.openRequest[event_id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(pList);\n });\n }\n\n /**\n *\n * @param elem {?SdcModel}\n * @param data {?object}\n * @returns {Promise<unknown>}\n */\n create({\n elem = null,\n data = null\n } = {}) {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files\n }\n }));\n this.openRequest[event_id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n if (elem) {\n elem.id = data[0]?.id || data[0]?.pk;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (!this._isConnectingProcess || !this.openRequest[CONNECTING_REQUEST_ID]) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] = this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n resolveOrigin();\n resolve();\n }, () => {\n rejectOrigin();\n reject();\n }];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this[\"socket\"];\n }\n this.valuesList.forEach(elem => {\n elem._onClose();\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach(key => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(new Promise(async (resolve, reject) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[event_id] = [resolve, reject];\n const buffer = await value.arrayBuffer();\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: event_id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)));\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n }\n }));\n }\n });\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise(resolve => {\n const modelIdentifier = `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`);\n this._isConnected = false;\n for (const [_key, value] of Object.entries(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n setTimeout(() => {\n if (this._autoReconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n this.openRequest[event_id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = [];\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({\n 'id': x.id ?? x.pk,\n ...x.fields\n });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n if (!parent) {\n return new SdcQuerySet(this.modeName, modelQuerySet);\n }\n return parent.querySet(this.modeName, modelQuerySet);\n }\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n this._forms.push($form);\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\"input.formWatcher change.formWatcher\", \"input, select, textarea\", onChange);\n }\n }\n _onChange(event) {\n const {\n name\n } = event.target;\n if (this.constructor.fields[name]) {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n }\n }\n _updateForm(fieldName) {\n const self = this;\n this._forms.forEach($form => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n });\n });\n }\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n get querySet() {\n return this._querySet.deref();\n }\n save({\n formName = \"edit_form\",\n data = null\n } = {}) {\n return this._querySet.deref().save({\n pk: this.id,\n formName,\n data\n });\n }\n create({\n data = null\n } = {}) {\n return this._querySet.deref().create({\n elem: this,\n data\n });\n }\n delete() {\n return this._querySet.deref().delete({\n elem: this\n });\n }\n load() {\n return this._querySet.deref().update({\n item: this\n });\n }\n update() {\n return this.load();\n }\n get id() {\n return this._id;\n }\n set id(data) {\n this._id = data;\n }\n set pk(data) {\n this.id = data;\n }\n get pk() {\n return this._id;\n }\n close() {\n return this._querySet.deref().close();\n }\n _onClose() {\n Object.keys(this.constructor.fields).filter(x => this[`_${x}`] instanceof SdcQuerySet).forEach(x => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._querySet.deref().detailView({\n pk: this.id,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n }\n toJson() {\n const res = {};\n for (let key in this.constructor.fields) {\n const value = this[key];\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk) {\n return;\n }\n for (let formItem of this.elements) {\n let name = formItem.name;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name]);\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n const returnValue = {};\n function setValueInForm(name, value) {\n if (!!fields[name]) {\n self[name] = value;\n }\n returnValue[name] = value;\n }\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n return self;\n });\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({\n cbResolve = null,\n cbReject = null\n } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({\n cbReject,\n cbResolve\n });\n }\n return this._editForm({\n cbReject,\n cbResolve\n });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({\n formName,\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $('<div class=\"container-fluid\">');\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne\n } = config;\n if (value === null) {\n return null;\n }\n if ((manyToMany || oneToMany || manyToOne || oneToOne) && value && typeof value === 'string') {\n return JSON.parse(value);\n }\n switch (type) {\n case \"CharField\":\n case \"TeextField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n return parseInt(value, 10);\n case \"FloatField\":\n case \"DecimalField\":\n return parseFloat(value);\n case \"BooleanField\":\n return !!value;\n case \"DateField\":\n case \"DateTimeField\":\n return Date.parse(value);\n case \"URLField\":\n return new URL(value);\n case \"FileField\":\n if (value == null) {\n return null;\n }\n if (typeof value === \"string\") {\n return null;\n }\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n return value;\n }\n break;\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n default:\n break;\n }\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel\n } = config;\n void isRelation;\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if (typeof value === 'string') {\n value = JSON.parse(value);\n }\n if ((manyToMany || manyToOne) && Array.isArray(value) && value.some(x => !Number.isNaN(parseInt(x)))) {\n return null;\n }\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n if (!isFinite(parseInt(value))) {\n return \"Must be an integer\";\n }\n break;\n case \"FloatField\":\n case \"DecimalField\":\n if (!isFinite(parseFloat(value))) {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n case \"JSONField\":\n if (typeof value !== \"object\") {\n return \"Must be JSON object\";\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n break;\n default:\n break;\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFLLFlBQVk7TUFDZixJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzZQLElBQUksQ0FBQzdQLEtBQUssQ0FBQyxFQUFFO1FBQzFFLE9BQU8sZUFBZTtNQUN4QjtNQUNBO0lBRUYsS0FBSyxVQUFVO01BQ2IsSUFBSTtRQUNGLElBQUlrUCxHQUFHLENBQUNsUCxLQUFLLENBQUM7TUFDaEIsQ0FBQyxDQUFDLE1BQU07UUFDTixPQUFPLGFBQWE7TUFDdEI7TUFDQTtJQUVGLEtBQUssV0FBVztNQUNkLElBQUksQ0FBQywyRUFBMkUsQ0FBQzZQLElBQUksQ0FBQzdQLEtBQUssQ0FBQyxFQUFFO1FBQzVGLE9BQU8sY0FBYztNQUN2QjtNQUNBO0lBRUYsS0FBSyxXQUFXO01BQ2QsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8scUJBQXFCO01BQzlCO01BQ0E7SUFDRixLQUFLLFdBQVc7TUFDZCxJQUFJLENBQUNmLFVBQVUsQ0FBQ2MsT0FBTyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQSxLQUFLLFlBQVlHLElBQUksQ0FBQyxJQUFJLEVBQUVILEtBQUssWUFBWWYsVUFBVSxDQUFDLEVBQUU7UUFDNUYsT0FBTyxzQkFBc0I7TUFDL0I7TUFDQTtJQUNGO01BQ0U7RUFDSjtFQUVBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qcz80NDM2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFZhbHVlRnJvbUZpZWxkLCBzZXRWYWx1ZUluRmllbGQsIHV1aWR2NCB9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgZ2V0TW9kZWwgfSBmcm9tIFwiLi9zZGNfc29ja2V0LmpzXCJcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG5jb25zdCBNQVhfRklMRV9VUExPQUQgPSAyNTAwMDtcbmNvbnN0IENPTk5FQ1RJTkdfUkVRVUVTVF9JRCA9IFwiX2Nvbm5lY3RpbmdfcHJvY2Vzc1wiO1xuXG5jb25zdCBjbG9uZU9iamVjdCA9IChvcmlnaW5hbCkgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpLFxuICAgIHN0cnVjdHVyZWRDbG9uZShvcmlnaW5hbClcbiAgKTtcbn1cblxuY2xhc3MgU2RjTW9kZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIHByb3BzID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIG1zZzogcHJvcHMsXG4gICAgICAgIGlzX2Vycm9yOiB0cnVlLFxuICAgICAgICBoZWFkZXI6ICdFcnJvcidcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIocHJvcHMubXNnKVxuICAgIHRoaXMubXNnID0gcHJvcHMubXNnO1xuICAgIHRoaXMuaGVhZGVyID0gcHJvcHMuaGVhZGVyO1xuICAgIHRoaXMuaXNfZXJyb3IgPSBwcm9wcy5pc19lcnJvcjtcbiAgICB0aGlzLmh0bWwgPSBwcm9wcy5odG1sO1xuICB9XG59XG5cbmNsYXNzIEZpbGVMb2FkZWQge1xuICBjb25zdHJ1Y3Rvcih7IG5hbWUsIHVybCB9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLmNvbnRlbnQgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgbG9hZChmb3JjZSA9IGZhbHNlKSB7XG4gICAgaWYgKGZvcmNlIHx8ICF0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgJC5nZXQodGhpcy51cmwpLnRoZW4ocmVzb2x2ZSkuY2F0Y2goXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudDtcbiAgfVxuXG4gIGFzeW5jIHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgc3RhdGljIGlzVmFsaWQodmFsdWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS51cmwgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5uYW1lID09PSBcInN0cmluZ1wiXG4gICAgKTtcbiAgfVxuXG5cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gaW5jb21pbmcgcHJpbWFyeSBrZXkgdmFsdWUuXG4gKlxuICogYC0xYCBpcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBtb2R1bGUgYXMgdGhlIHNlbnRpbmVsIGZvciBcIm5ldyBvYmplY3QgLyBubyBwa1wiLlxuICpcbiAqIEBwYXJhbSB7Kn0gcGtcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBrKHBrKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQayA9IHBhcnNlSW50KHBrID8/IC0xLCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4obm9ybWFsaXplZFBrKSA/IC0xIDogbm9ybWFsaXplZFBrO1xufVxuXG5leHBvcnQgY2xhc3MgU2RjUXVlcnlTZXQge1xuICAvKipcbiAgICogTGlnaHR3ZWlnaHQgY2xpZW50LXNpZGUgY29sbGVjdGlvbiB3cmFwcGVyIGFyb3VuZCB0aGUgU0RDIG1vZGVsIHdlYnNvY2tldC5cbiAgICpcbiAgICogVGhlIHF1ZXJ5c2V0IGV4cG9zZXMgYXJyYXktbGlrZSBhY2Nlc3MgdGhyb3VnaCBhIHByb3h5IHdoaWxlIGFsc28ga2VlcGluZ1xuICAgKiB0cmFjayBvZiBzb2NrZXQgc3RhdGUgYW5kIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGF0IG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUsIG1vZGVsUXVlcnkgPSB7fSkge1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeSA/PyB7fTtcbiAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gZmFsc2U7XG4gICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IHRydWU7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIC8vIFJlcXVlc3QgcmVzb2x2ZXJzIGFyZSBzdG9yZWQgYnkgd2Vic29ja2V0IGV2ZW50IGlkIHVudGlsIHRoZSBzZXJ2ZXIgcmVzcG9uZHMuXG4gICAgdGhpcy5vcGVuUmVxdWVzdCA9IHt9O1xuICAgIHRoaXMubW9kZWxJZCA9IDA7XG4gICAgdGhpcy5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIHRoaXMub25DcmVhdGUgPSAoKSA9PiB7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09IFwic3ltYm9sXCIgJiYgIWlzTmFOKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldC52YWx1ZXNMaXN0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICB9LFxuXG4gICAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzTmFOKHByb3ApKSB7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlc0xpc3RbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgaWR4ID0gLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgKytpZHg7XG4gICAgICAgIGlmIChpZHggPCB0aGlzLnZhbHVlc0xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMudmFsdWVzTGlzdFtpZHhdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzZXQgb25fY3JlYXRlKGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uQ3JlYXRlID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbl91cGRhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25VcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8aW50ZWdyfHN0cmluZz58aW50ZWdlcnxTZGNNb2RlbHxTZGNRdWVyeVNldHxzdHJpbmd9IGlkc1xuICAgKi9cbiAgc2V0SWRzKGlkcykge1xuICAgIGNvbnN0IHZsID0gdGhpcy5fc2V0SWRzKGlkcyk7XG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgaWRfX2luOiB2bC5tYXAoKHgpID0+IHguaWQpXG4gICAgfVxuXG4gICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyKTtcbiAgICByZXR1cm4gdmw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxpbnRlZ3J8c3RyaW5nPnxpbnRlZ2VyfFNkY01vZGVsfFNkY1F1ZXJ5U2V0fHN0cmluZ30gaWRzXG4gICAqL2Nsb25lT2JqZWN0XG4gIF9zZXRJZHMoaWRzKSB7XG5cbiAgICBpZiAoaWRzID09PSBudWxsIHx8IGlkcyA9PT0gXCJcIiB8fCBBcnJheS5pc0FycmF5KGlkcykgJiYgaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICAgIH0gZWxzZSBpZiAoaWRzIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IGlkcy52YWx1ZXNMaXN0Lm1hcChjbG9uZU9iamVjdCk7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSkpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSBbY2xvbmVPYmplY3QoaWRzKV07XG4gICAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSkpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9XG5cbiAgICBsZXQgbnVtTGlzdCwgbnVtSWQgPSBOdW1iZXIuTmFOO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlkcykpIHtcbiAgICAgIG51bUlkID0gaWRzO1xuICAgIH0gZWxzZSBpZiAoaWRzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCkpO1xuICAgICAgaWYgKCF0ZW1wTnVtTGlzdC5zb21lKE51bWJlci5pc05hTikpIHtcbiAgICAgICAgbnVtTGlzdCA9IHRlbXBOdW1MaXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdGVtcE51bUxpc3QgPSBpZHMuc3BsaXQoJywnKS5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtSWQgPSBwYXJzZUludChpZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUlkKSkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gdGhpcy52YWx1ZXNMaXN0LmZpbHRlcigoaXRlbSkgPT4gbnVtSWQgPT09IGl0ZW0uaWQpO1xuICAgICAgaWYgKHRoaXMudmFsdWVzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgbmV3TW9kZWwgPSB0aGlzLm5ldygpO1xuICAgICAgICBuZXdNb2RlbC5pZCA9IG51bUlkO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobnVtTGlzdCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gdGhpcy52YWx1ZXNMaXN0LmZpbHRlcigoaXRlbSkgPT4gbnVtTGlzdC5pbmNsdWRlcyhpdGVtLmlkKSk7XG4gICAgICBjb25zdCB2YWx1ZUlkcyA9IHRoaXMuZ2V0SWRzKCk7XG4gICAgICBudW1MaXN0LmZpbHRlcih4ID0+ICF2YWx1ZUlkcy5pbmNsdWRlcyh4KSkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHsgaWQgfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gIH1cblxuICBnZXRJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5tYXAoeCA9PiB4LmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgbW9kZWwgaW5zdGFuY2VzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBxdWVyeXNldCBjYWNoZS5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG1vZGVsIGluc3RhbmNlIGJ5IGlkLCBsb2FkaW5nIHRoZSBxdWVyeXNldCBmaXJzdCBpZiBuZWVkZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gaWRcbiAgICogQHJldHVybnMge1NkY01vZGVsfG51bGx9XG4gICAqL1xuICBieUlkKGlkKSB7XG4gICAgaWYgKGlkICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVQayhpZCk7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0LmZpbmQoKGVsbSkgPT4gZWxtLmlkID09PSBub3JtYWxpemVkSWQpID8/IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cyBpbnRvIHRoZSBjdXJyZW50IHF1ZXJ5c2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxRdWVyeVxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBzZXRGaWx0ZXIobW9kZWxRdWVyeSkge1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRGaWx0ZXIobW9kZWxRdWVyeSkge1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubW9kZWxRdWVyeSwgbW9kZWxRdWVyeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHs/b2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMge1NkY01vZGVsfVxuICAgKi9cbiAgbmV3KHZhbHVlcyA9IHt9KSB7XG4gICAgY29uc3QgbmV3TW9kZWwgPSBuZXcgKGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKSkodmFsdWVzKTtcbiAgICBuZXdNb2RlbC5fc2V0UXVlcnlTZXQodGhpcywgZmFsc2UpO1xuICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ld01vZGVsKTtcbiAgICByZXR1cm4gbmV3TW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBtb2RlbCBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcXVlcnkgaW50byB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbW9kZWxRdWVyeVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZGNRdWVyeVNldD59XG4gICAqL1xuICBsb2FkKG1vZGVsUXVlcnkgPSBudWxsKSB7XG4gICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRMb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBtb2RlbCBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcXVlcnkgaW50byB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbW9kZWxRdWVyeVxuICAgKiBAcGFyYW0gez9TZGNNb2RlbH0gaXRlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZGNRdWVyeVNldD59XG4gICAqL1xuICB1cGRhdGUoeyBtb2RlbFF1ZXJ5ID0gbnVsbCwgaXRlbSA9IG51bGwgfSkge1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8gdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIGxldCBsb2FkUXVlcnkgPSBpdGVtID8geyBpZDogaXRlbS5pZCB9IDogdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9zZW5kTG9hZChsb2FkUXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwayB7aW50ZWdyfVxuICAgKiBAcGFyYW0gZWxlbSB7U2RjTW9kZWx9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgZGVsZXRlKHsgcGsgPSBudWxsLCBpZCA9IG51bGwsIGVsZW0gPSBudWxsIH0pIHtcbiAgICBwayA/Pz0gaWQ7XG4gICAgcGsgPSAhZWxlbSA/IHBrIDogZWxlbS5pZDtcbiAgICBpZiAocGsgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBrIG9yIGVsZW0gbXVzdCBiZSBzZXRcIik7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgIGlkOiBwayxcbiAgICAgICAgICAgICAgcGtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNlcnZlci1zaWRlIHF1ZXJ5c2V0IGRhdGEgb3ZlciB0aGUgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICovXG4gIF9zZW5kTG9hZChsb2FkUXVlcnkgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImxvYWRcIixcbiAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IGxvYWRRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxpc3QtdmlldyBlbmRwb2ludCBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmRMaXN0Vmlldyh7XG4gICAgICAgICAgICAgICAgICBtb2RlbFF1ZXJ5ID0ge30sXG4gICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICAgICAgICAgfSkge1xuICAgIHJldHVybiB0aGlzLnZpZXcoe1xuICAgICAgbW9kZWxRdWVyeSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgICAgZXZlbnRUeXBlOiBcImxpc3Rfdmlld1wiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIG1vZGVsIHZpZXcgYW5kIGFwcGVuZCBpdHMgSFRNTCB0byBhIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHZpZXcoe1xuICAgICAgICAgdmlld05hbWUgPSBcImh0bWxfbGlzdF90ZW1wbGF0ZVwiLFxuICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgZXZlbnRUeXBlID0gXCJuYW1lZF92aWV3XCIsXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHZpZXdfbmFtZTogdmlld05hbWUsXG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiBtb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgJGRpdkxpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgYXBwLnJlZnJlc2goJGRpdkxpc3QpO1xuICAgICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGRldGFpbC12aWV3IGVuZHBvaW50IGZvciBhIHNpbmdsZSBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfc2VuZERldGFpbFZpZXcoe1xuICAgICAgICAgICAgICAgICAgICBwayA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgICAgICAgICAgIH0pIHtcbiAgICBwayA/Pz0gaWQ7XG4gICAgcGsgPSBub3JtYWxpemVQayhwayk7XG4gICAgbGV0ICRkaXZMaXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IFwiZGV0YWlsX3ZpZXdcIixcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICBwayxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBtb2RlbCBmb3JtIGZyYWdtZW50IGFuZCBhdHRhY2ggdGhlIFNEQyBmb3JtIG1ldGFkYXRhIGV4cGVjdGVkIGJ5XG4gICAqIHRoZSByZXN0IG9mIHRoZSBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gbW9kZWxPYmpcbiAgICogQHBhcmFtIGZvcm1OYW1lXG4gICAqIEBwYXJhbSAkZGl2Rm9ybVxuICAgKiBAcGFyYW0gY2JSZXNvbHZlXG4gICAqIEBwYXJhbSBjYlJlamVjdFxuICAgKiBAcGFyYW0gZm9ybUlkXG4gICAqL1xuICBnZXRGb3JtKHsgbW9kZWxPYmosIGV2ZW50VHlwZSwgZm9ybU5hbWUsICRkaXZGb3JtLCBjYlJlc29sdmUsIGNiUmVqZWN0LCBmb3JtSWQgfSkge1xuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgY29uc3QgcGsgPSBtb2RlbE9iai5pZCA/PyAtMTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICBwayxcbiAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGsgPT09IG51bGwgfHwgcGsgPT09IC0xID8gXCJjcmVhdGVcIiA6IFwiZWRpdFwiO1xuXG4gICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAkZGl2Rm9ybS5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgbGV0ICRmb3JtID0gJGRpdkZvcm1cbiAgICAgICAgICAuY2xvc2VzdChcImZvcm1cIilcbiAgICAgICAgICAuYWRkQ2xhc3MoXG4gICAgICAgICAgICBgc2RjLW1vZGVsLSR7Y2xhc3NOYW1lfS1mb3JtIHNkYy1tb2RlbC1mb3JtICR7Zm9ybUlkfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5kYXRhKFwibW9kZWxcIiwgbW9kZWxPYmopXG4gICAgICAgICAgLmRhdGEoXCJtb2RlbF9wa1wiLCBwaylcbiAgICAgICAgICAuZGF0YShcImZvcm1fbmFtZVwiLCBmb3JtTmFtZSk7XG4gICAgICAgIG1vZGVsT2JqLmFkZEZvcm0oJGZvcm0pO1xuICAgICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKFwic2RjX3N1Ym1pdFwiKSkge1xuICAgICAgICAgICRmb3JtLmF0dHIoXCJzZGNfc3VibWl0XCIsIFwic3VibWl0TW9kZWxGb3JtRGlzdHJpYnV0b3JcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcHAucmVmcmVzaCgkZGl2Rm9ybSkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgIH0sXG4gICAgICAocmVzKSA9PiB7XG4gICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBzaW5nbGUgbW9kZWwgaW5zdGFuY2UgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbW9kZWxRdWVyeVxuICAgKiBAcGFyYW0gez9ib29sZWFufSBkb05vdExvYWQgdHJ1ZSBpZiBtb2RlbFF1ZXJ5IGNvbnRhaW5zIGlkIG9yIHBrIGFuZCBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY01vZGVsPn1cbiAgICovXG4gIGFzeW5jIGdldChtb2RlbFF1ZXJ5ID0gbnVsbCwgZG9Ob3RMb2FkID0gZmFsc2UpIHtcbiAgICBpZiAoZG9Ob3RMb2FkKSB7XG4gICAgICBjb25zdCBpZCA9IG1vZGVsUXVlcnk/LmlkID8/IHRoaXMubW9kZWxRdWVyeT8uaWQ7XG4gICAgICBpZihtb2RlbFF1ZXJ5KSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyKG1vZGVsUXVlcnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnlJZChpZCkgPz8gdGhpcy5uZXcobW9kZWxRdWVyeSB8fCB0aGlzLm1vZGVsUXVlcnkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvYWQobW9kZWxRdWVyeSk7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1vZGVsIHF1ZXJ5IHJldHVybnMgJHt0aGlzLmxlbmd0aH0gYnV0IG9ubHkgMSBleHBlY3RlZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEZpbHRlcih7IGlkOiB0aGlzLnZhbHVlc0xpc3RbMF0uaWQgfSk7XG5cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0WzBdO1xuICB9XG5cbiAgZGV0YWlsVmlldyh7IHBrLCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZERldGFpbFZpZXcoe1xuICAgICAgaWQ6IHBrLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICBsaXN0Vmlldyh7IG1vZGVsUXVlcnkgPSB7fSwgc2VhcmNoVmFsdWVzID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kTGlzdFZpZXcoe1xuICAgICAgbW9kZWxRdWVyeTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbFF1ZXJ5LCBtb2RlbFF1ZXJ5LCB7ICdfX3NlYXJjaF92YWx1ZXMnOiBzZWFyY2hWYWx1ZXMgfSksXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIHRlbXBsYXRlQ29udGV4dCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmUoeyBwayA9IG51bGwsIGlkID0gbnVsbCwgZm9ybU5hbWUgPSBcImVkaXRfZm9ybVwiLCBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICBwayA/Pz0gaWQ7XG4gICAgY29uc3Qgbm9ybVBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgZWxlbUxpc3Q7XG4gICAgICBpZiAobm9ybVBrID4gLTEpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYnlJZChub3JtUGspO1xuICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFNkY01vZGVsRXJyb3IoYEVsZW1lbnQgbm90IGZvdW5kIHdpdGggSUQ6ICR7bm9ybVBrfWApKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtTGlzdCA9IFtlbGVtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1MaXN0ID0gdGhpcy52YWx1ZXNMaXN0O1xuICAgICAgfVxuICAgICAgbGV0IHBMaXN0ID0gW107XG4gICAgICBlbGVtTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICAgIHBMaXN0LnB1c2goXG4gICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbmREYXRhID0gZGF0YSA/IHsgLi4uZGF0YSB9IDogZWxlbS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgc2VuZERhdGEuaWQgPSBlbGVtLmlkO1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInNhdmVcIixcbiAgICAgICAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBzZW5kRGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHNlbmREYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbSB7P1NkY01vZGVsfVxuICAgKiBAcGFyYW0gZGF0YSB7P29iamVjdH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUoeyBlbGVtID0gbnVsbCwgZGF0YSA9IG51bGwgfSA9IHt9KSB7XG4gICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIGVsZW0gPSB0aGlzLm5ldyhkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY3JlYXRlXCIsXG4gICAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhID8/IGVsZW0/LnNlcmlhbGl6ZSgpID8/IHt9LFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGRhdGEgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgOiByZXMuZGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtLmlkID0gZGF0YVswXT8uaWQgfHwgZGF0YVswXT8ucGs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKVswXTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBdO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgd2Vic29ja2V0IGlzIG9wZW4gYW5kIGhhcyBjb21wbGV0ZWQgdGhlIHNlcnZlci1zaWRlIGNvbm5lY3RcbiAgICogaGFuZHNoYWtlIGJlZm9yZSBpc3N1aW5nIG1vZGVsIHJlcXVlc3RzLlxuICAgKlxuICAgKiBNdWx0aXBsZSBjYWxsZXJzIGNhbiBhcnJpdmUgd2hpbGUgYSBjb25uZWN0aW9uIGF0dGVtcHQgaXMgYWxyZWFkeSBpblxuICAgKiBwcm9ncmVzcy4gSW4gdGhhdCBjYXNlIHRoZXkgYXJlIHF1ZXVlZCBiZWhpbmQgdGhlIHNhbWUgc3ludGhldGljIHJlcXVlc3QgaWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyB8fFxuICAgICAgICAhdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXSA9IFsoKSA9PiB7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfV07XG4gICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fY2hlY2tDb25uZWN0aW9uKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFtyZXNvbHZlT3JpZ2luLCByZWplY3RPcmlnaW5dID1cbiAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF07XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXSA9IFtcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlT3JpZ2luKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3RPcmlnaW4oKTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHdlYnNvY2tldCBhbmQgZGlzYWJsZSBhdXRvbWF0aWMgcmVjb25uZWN0IGZvciB0aGlzIHF1ZXJ5c2V0LlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICBkZWxldGUgdGhpc1tcInNvY2tldFwiXTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5fb25DbG9zZSgpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGF0dGFjaGVkIGBGaWxlYCB2YWx1ZXMgaW4gZml4ZWQtc2l6ZSBjaHVua3MgYmVmb3JlIHNhdmUvY3JlYXRlIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY01vZGVsfSBlbGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBfcmVhZEZpbGVzKGVsZW0pIHtcbiAgICBsZXQgdG9Tb2x2ZSA9IFtdO1xuICAgIGxldCBmaWxlcyA9IHt9O1xuICAgIGlmICghZWxlbSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmaWxlcyk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKGVsZW0uY29uc3RydWN0b3IuZmllbGRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZWxlbVtrZXldO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICB0b1NvbHZlLnB1c2goXG4gICAgICAgICAgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHZhbHVlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJPZkNodW5rcyA9IE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKTtcbiAgICAgICAgICAgIGZpbGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgIGlkOiBldmVudF9pZCxcbiAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaHVua3M7ICsraSkge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IEFycmF5LmZyb20ocmVzdWx0LnNsaWNlKFxuICAgICAgICAgICAgICAgIE1BWF9GSUxFX1VQTE9BRCAqIGksXG4gICAgICAgICAgICAgICAgTUFYX0ZJTEVfVVBMT0FEICogKGkgKyAxKSxcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwidXBsb2FkXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyT2ZDaHVua3MsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9Tb2x2ZSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgd2Vic29ja2V0IHJlc3BvbnNlcyB0byB0aGUgbWF0Y2hpbmcgcGVuZGluZyByZXF1ZXN0IGFuZCB1cGRhdGUgbG9jYWxcbiAgICogc3RhdGUgd2hlbiB0aGUgc2VydmVyIHNlbmRzIG1vZGVsIHBheWxvYWRzLlxuICAgKlxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudH0gZVxuICAgKi9cbiAgYXN5bmMgX29uTWVzc2FnZShlKSB7XG4gICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5SZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZGF0YS5ldmVudF9pZF1bMV0obmV3IFNkY01vZGVsRXJyb3IoZGF0YSkpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoXCJwdXNoRXJyb3JNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwiY29ubmVjdFwiKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVsxXShuZXcgU2RjTW9kZWxFcnJvcihkYXRhKSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoQ09OTkVDVElOR19SRVFVRVNUX0lEKTtcbiAgICAgICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwiY29ubmVjdFwiKSB7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoQ09OTkVDVElOR19SRVFVRVNUX0lEKTtcbiAgICAgIH0gZWxzZSBpZiAoW1wibG9hZFwiLCBcIm5hbWVkX3ZpZXdcIiwgXCJkZXRhaWxfdmlld1wiXS5pbmNsdWRlcyhkYXRhLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBhd2FpdCB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uUmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBcIm9uX3VwZGF0ZVwiIHx8IGRhdGEudHlwZSA9PT0gXCJvbl9jcmVhdGVcIikge1xuICAgICAgICBjb25zdCBqc29uUmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG5cbiAgICAgICAgbGV0IG9iaiA9IGF3YWl0IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25SZXMpO1xuICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJvbl9jcmVhdGVcIikge1xuICAgICAgICAgIGNiID0gdGhpcy5vbkNyZWF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25VcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjYihvYmopO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcbiAgICAgIH1cblxuICAgICAgbGV0IGluc3RhbmNlID0gZGF0YS5kYXRhPy5pbnN0YW5jZTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBkYXRhLmRhdGEuaW5zdGFuY2UgPSBKU09OLnBhcnNlKGRhdGEuZGF0YS5pbnN0YW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wZW5SZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgYWxsIGluLWZsaWdodCB3ZWJzb2NrZXQgcmVxdWVzdHMgZm9yIHRoaXMgcXVlcnlzZXQgYXJlIHJlc29sdmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIG5vT3BlblJlcXVlc3RzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3BlblJlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLnB1c2gocmVzb2x2ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29tcGxldGVkIHJlcXVlc3QgYW5kIHdha2UgYW55IGBub09wZW5SZXF1ZXN0cygpYCB3YWl0ZXJzIHdoZW4gdGhlXG4gICAqIHJlcXVlc3QgbWFwIGJlY29tZXMgZW1wdHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudElkXG4gICAqL1xuICBfY2xvc2VPcGVuUmVxdWVzdChldmVudElkKSB7XG4gICAgZGVsZXRlIHRoaXMub3BlblJlcXVlc3RbZXZlbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3BlblJlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5mb3JFYWNoKCh4KSA9PiB4KCkpO1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2ggdGhlIHJhdyB3ZWJzb2NrZXQgY29ubmVjdGlvbiBmb3IgdGhpcyBxdWVyeXNldC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfY29ubmVjdFRvU2VydmVyKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJZGVudGlmaWVyID1cbiAgICAgICAgYCR7dGhpcy5tb2RlbE5hbWV9YCArICh0aGlzLm1vZGVsSWQgPiAwID8gYC8ke3RoaXMubW9kZWxJZH1gIDogXCJcIik7XG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICBgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxJZGVudGlmaWVyfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXG4gICAgICAgICAgYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxJZGVudGlmaWVyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgU0RDIE1vZGVsICgke3RoaXMubW9kZWxOYW1lfSwgJHt0aGlzLm1vZGVsSWR9KSBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wZW5SZXF1ZXN0KSkge1xuICAgICAgICAgIHZhbHVlWzFdKGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3QgPSB7fTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fYXV0b1JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFwcGxpY2F0aW9uLWxldmVsIGNvbm5lY3QgaGFuZHNoYWtlIG9uY2UgdGhlIHdlYnNvY2tldCBvcGVucy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gICAqL1xuICBfY2hlY2tDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY29ubmVjdFwiLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgYmFja2VuZCBtb2RlbCBwYXlsb2FkIGludG8gbG9jYWxseSB0cmFja2VkIG1vZGVsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVzdWx0c1xuICAgKi9cbiAgX3BhcnNlU2VydmVyUmVzKHJlc3VsdHMpIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBbXVxuICAgIGZvciAoY29uc3QgeCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gaXMgbm8gU2RjTW9kZWwuIG15YmUgdGhlIG1vZGVscyBhciBub3QgaW1wb3J0YWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyBNb2RlbENsYXNzKHsgJ2lkJzogeC5pZCA/PyB4LnBrLCAuLi54LmZpZWxkcyB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHRoaXMuYnlJZChuZXdNb2RlbC5pZCk7XG4gICAgICBpZiAoY3VycmVudE1vZGVsKSB7XG4gICAgICAgIGN1cnJlbnRNb2RlbC5zZXRWYWx1ZXMobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChjdXJyZW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbC5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIG5ld01vZGVscy5wdXNoKG5ld01vZGVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXNMaXN0LnNvcnQoKGEsIGIpID0+IGEuX2lkIC0gYi5faWQpO1xuICAgIHJldHVybiBuZXdNb2RlbHM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2RjTW9kZWwge1xuICBzdGF0aWMgZmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgbW9kZWwgd3JhcHBlciB1c2VkIGJ5IFNEQyBtb2RlbCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUpIHtcbiAgICB0aGlzLl9pZCA9IG51bGw7XG4gICAgdGhpcy5fZm9ybXMgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybUlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5U2V0XG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudFxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBzdGF0aWMgcXVlcnlTZXQobW9kZWxRdWVyeVNldCA9IG51bGwsIHBhcmVudCA9IG51bGwpIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIG5ldyBTZGNRdWVyeVNldCh0aGlzLm1vZGVOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2V0KHRoaXMubW9kZU5hbWUsIG1vZGVsUXVlcnlTZXQpO1xuICB9XG5cbiAgYWRkRm9ybSgkZm9ybSkge1xuICAgIC8vIFJlbW92ZSBvbGQgbGlzdGVuZXJzIGlmIGZvcm0gYWxyZWFkeSBzZXRcbiAgICBjb25zdCBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9mb3Jtcy5wdXNoKCRmb3JtKTtcblxuICAgIGlmICgkZm9ybSkge1xuICAgICAgLy8gQXR0YWNoIGRlbGVnYXRlZCBldmVudCBoYW5kbGVyIHRvIGFsbCBpbnB1dHNcbiAgICAgICRmb3JtLm9uKFxuICAgICAgICBcImlucHV0LmZvcm1XYXRjaGVyIGNoYW5nZS5mb3JtV2F0Y2hlclwiLFxuICAgICAgICBcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIsXG4gICAgICAgIG9uQ2hhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkc1tuYW1lXSkge1xuICAgICAgdGhpc1tgc2V0JHtuYW1lfWBdKGdldFZhbHVlRnJvbUZpZWxkKGV2ZW50LnRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVGb3JtKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2Zvcm1zLmZvckVhY2goKCRmb3JtKSA9PiB7XG4gICAgICAkZm9ybS5maW5kKGBbbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRWYWx1ZUluRmllbGQodGhpcywgc2VsZltmaWVsZE5hbWVdKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRWYWx1ZXMoZGF0YSA9IHt9KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VmFsdWVzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIHF1ZXJ5c2V0IHRoYXQgb3ducyB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY1F1ZXJ5U2V0fSBxdWVyeVNldFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG9hZGVkXG4gICAqL1xuICBfc2V0UXVlcnlTZXQocXVlcnlTZXQsIGlzTG9hZGVkKSB7XG4gICAgdGhpcy5fcXVlcnlTZXQgPSBuZXcgV2Vha1JlZihxdWVyeVNldCk7XG4gICAgdGhpcy5sb2FkZWQgPSBpc0xvYWRlZDtcbiAgfVxuXG4gIGdldCBxdWVyeVNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKTtcbiAgfVxuXG4gIHNhdmUoeyBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnNhdmUoeyBwazogdGhpcy5pZCwgZm9ybU5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBjcmVhdGUoeyBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jcmVhdGUoeyBlbGVtOiB0aGlzLCBkYXRhIH0pO1xuICB9XG5cbiAgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRlbGV0ZSh7IGVsZW06IHRoaXMgfSk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnVwZGF0ZSh7IGl0ZW06IHRoaXMgfSk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHNldCBpZChkYXRhKSB7XG4gICAgdGhpcy5faWQgPSBkYXRhO1xuICB9XG5cbiAgc2V0IHBrKGRhdGEpIHtcbiAgICB0aGlzLmlkID0gZGF0YTtcbiAgfVxuXG4gIGdldCBwaygpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jbG9zZSgpO1xuICB9XG5cbiAgX29uQ2xvc2UoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpXG4gICAgICAuZmlsdGVyKCh4KSA9PiB0aGlzW2BfJHt4fWBdIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpXG4gICAgICAuZm9yRWFjaCgoeCkgPT4gdGhpc1tgXyR7eH1gXS5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXItcmVuZGVyZWQgZGV0YWlsIHZpZXcgZm9yIHRoaXMgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZGV0YWlsVmlldyh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRldGFpbFZpZXcoeyBwazogdGhpcy5pZCwgY2JSZXNvbHZlLCBjYlJlamVjdCwgdGVtcGxhdGVDb250ZXh0IH0pO1xuICB9XG5cbiAgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcykucmVkdWNlKChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgICAgaWYgKHZhbC5tYW55X3RvX21hbnkgfHwgdmFsLm9uZV90b19tYW55KSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxJZHMgPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgICAgICBpZiAoYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gYWxsSWRzWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsLmlzX3JlbGF0aW9uICYmIHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZS5pZCA/PyBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICBjb25zdCByZXMgPSB7fVxuICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZS5uYW1lO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuaWQ7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrd2FyZHMtY29tcGF0aWJsZSBhbGlhcyBmb3Igc3luY2luZyB2YWx1ZXMgZnJvbSBhIGZvcm0gaW50byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgc3luY0Zvcm1Ub01vZGVsKCRmb3Jtcykge1xuICAgIHJldHVybiB0aGlzLnN5bmNGb3JtKCRmb3Jtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZm9ybSBjb2xsZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9yZXNvbHZlRm9ybXMoJGZvcm1zKSB7XG4gICAgaWYgKCEkZm9ybXMgfHwgISRmb3Jtcy5oYXNDbGFzcyh0aGlzLmZvcm1JZCkpIHtcbiAgICAgIHJldHVybiAkKGAuJHt0aGlzLmZvcm1JZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJGZvcm1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIGN1cnJlbnQgbW9kZWwgc3RhdGUgaW50byBtYXRjaGluZyBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICovXG4gIHN5bmNNb2RlbFRvRm9ybSgkZm9ybXMpIHtcbiAgICAkZm9ybXMgPSB0aGlzLl9yZXNvbHZlRm9ybXMoJGZvcm1zKTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuY29uc3RydWN0b3IuZmllbGRzO1xuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgaWYgKHNlbGYuaWQgIT09IHBrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZm9ybUl0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICBsZXQgbmFtZSA9IGZvcm1JdGVtLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIgJiYgISFmaWVsZHNbbmFtZV0pIHtcbiAgICAgICAgICBzZXRWYWx1ZUluRmllbGQoZm9ybUl0ZW0sIHNlbGZbbmFtZV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IG1hdGNoaW5nIGZvcm0gdmFsdWVzIGJhY2sgb250byB0aGUgY3VycmVudCBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogSGlkZGVuIGlucHV0cyBhcmUgcGFyc2VkIHRvIHRoZWlyIG9yaWdpbmFsIHByaW1pdGl2ZSB0eXBlIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcztcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHt9XG5cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUluRm9ybShuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKCEhZmllbGRzW25hbWVdKSB7XG4gICAgICAgIHNlbGZbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlW25hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGsgPSBub3JtYWxpemVQaygkKHRoaXMpLmRhdGEoXCJtb2RlbF9wa1wiKSk7XG4gICAgICBpZiAoc2VsZi5pZCAhPT0gcGsgJiYgKHNlbGYuaWQgIT09IG51bGwgfHwgcGsgIT09IC0xKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGZvcm1JdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgc2V0VmFsdWVJbkZvcm0oZm9ybUl0ZW0ubmFtZSwgZ2V0VmFsdWVGcm9tRmllbGQoZm9ybUl0ZW0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjb3JyZWN0IHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCB8fCB0aGlzLmlkID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUZvcm0oeyBjYlJlamVjdCwgY2JSZXNvbHZlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWRpdEZvcm0oeyBjYlJlamVjdCwgY2JSZXNvbHZlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY3JlYXRlIGZvcm0gZm9yIGEgbmV3IG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9jcmVhdGVGb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG4gICAgdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5nZXRGb3JtKHtcbiAgICAgIG1vZGVsT2JqOiB0aGlzLFxuICAgICAgZXZlbnRUeXBlOiBcImNyZWF0ZV9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZWRpdCBmb3JtIGZvciBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfZWRpdEZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSkge1xuICAgIGxldCAkZGl2Rm9ybSA9ICQoXCI8ZGl2PlwiKTtcblxuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJlZGl0X2Zvcm1cIixcbiAgICAgIGZvcm1OYW1lOiBudWxsLFxuICAgICAgJGRpdkZvcm0sXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkZvcm07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgbmFtZWQgc2VydmVyLXNpZGUgZm9ybSBmb3IgdGhpcyBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBuYW1lZEZvcm0oeyBmb3JtTmFtZSwgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKCc8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5nZXRGb3JtKHtcbiAgICAgIG1vZGVsT2JqOiB0aGlzLFxuICAgICAgZXZlbnRUeXBlOiBcIm5hbWVkX2Zvcm1cIixcbiAgICAgIGZvcm1OYW1lLFxuICAgICAgJGRpdkZvcm0sXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkZvcm07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBmaWVsZCB2YWx1ZSB1c2luZyB0aGUgc3VwcGxpZWQgZmllbGQgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAgICovXG4gIHZhbGlkYXRlKHZhbHVlLCBjb25maWcpIHtcbiAgICBjb25zdCBlcnIgPSB2YWxpZGF0ZUZpZWxkKHZhbHVlLCBjb25maWcpO1xuICAgIGlmIChlcnIpIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSByYXcgaW5wdXQgdmFsdWUgaW50byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgdGhlIGZpZWxkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcGFyc2VWYWx1ZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIG1hbnlfdG9fbWFueTogbWFueVRvTWFueSxcbiAgICAgIG9uZV90b19tYW55OiBvbmVUb01hbnksXG4gICAgICBtYW55X3RvX29uZTogbWFueVRvT25lLFxuICAgICAgb25lX3RvX29uZTogb25lVG9PbmUsXG4gICAgfSA9IGNvbmZpZztcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgobWFueVRvTWFueSB8fCBvbmVUb01hbnkgfHwgbWFueVRvT25lIHx8IG9uZVRvT25lKSAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgICBjYXNlIFwiVGVleHRGaWVsZFwiOlxuICAgICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgICAgIGNhc2UgXCJGbG9hdEZpZWxkXCI6XG4gICAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgY2FzZSBcIkJvb2xlYW5GaWVsZFwiOlxuICAgICAgICByZXR1cm4gISF2YWx1ZTtcblxuICAgICAgY2FzZSBcIkRhdGVGaWVsZFwiOlxuICAgICAgY2FzZSBcIkRhdGVUaW1lRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIERhdGUucGFyc2UodmFsdWUpO1xuXG4gICAgICBjYXNlIFwiVVJMRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBVUkwodmFsdWUpO1xuXG4gICAgICBjYXNlIFwiRmlsZUZpZWxkXCI6XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRmlsZUxvYWRlZC5pc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTG9hZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9hZGVkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICBpZiAoY29uZmlnLm1heF9zaXplICYmIHZhbHVlLnNpemUgPiBjb25maWcubWF4X3NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBgRmlsZSB0b28gbGFyZ2UgKG1heCAke2NvbmZpZy5tYXhfc2l6ZX0gYnl0ZXMpYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRfdHlwZXMgJiYgIWNvbmZpZy5hbGxvd2VkX3R5cGVzLmluY2x1ZGVzKHZhbHVlLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYEludmFsaWQgZmlsZSB0eXBlICgke3ZhbHVlLnR5cGV9KWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiSlNPTkZpZWxkXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBmaWVsZCB2YWx1ZSBhZ2FpbnN0IHRoZSBmaWVsZCBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpZWxkKHZhbHVlLCBjb25maWcpIHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgbWF4X2xlbmd0aDogbWF4TGVuZ3RoLFxuICAgIGlzX3JlbGF0aW9uOiBpc1JlbGF0aW9uLFxuICAgIG1hbnlfdG9fbWFueTogbWFueVRvTWFueSxcbiAgICBvbmVfdG9fbWFueTogb25lVG9NYW55LFxuICAgIG1hbnlfdG9fb25lOiBtYW55VG9PbmUsXG4gICAgb25lX3RvX29uZTogb25lVG9PbmUsXG4gICAgcmVsYXRlZF9tb2RlbDogcmVsYXRlZE1vZGVsLFxuICB9ID0gY29uZmlnO1xuXG4gIHZvaWQgaXNSZWxhdGlvbjtcblxuICBpZiAocmVxdWlyZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobWFueVRvTWFueSB8fCBvbmVUb01hbnkgfHwgbWFueVRvT25lIHx8IG9uZVRvT25lKSB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkgfHwgdmFsdWUubW9kZWxOYW1lICE9PSByZWxhdGVkTW9kZWwpIHtcbiAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChtYW55VG9NYW55IHx8IG1hbnlUb09uZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuc29tZSgoeCkgPT4gIU51bWJlci5pc05hTihwYXJzZUludCh4KSkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiBOdW1iZXIuaXNOYU4ocGFyc2VJbnQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIG9iamVjdCBvciBJRFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgIGNhc2UgXCJUZXh0RmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHN0cmluZ1wiO1xuICAgICAgfVxuICAgICAgaWYgKG1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGBNYXggbGVuZ3RoIGlzICR7bWF4TGVuZ3RofWA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgY2FzZSBcIkJpZ0ludGVnZXJGaWVsZFwiOlxuICAgICAgaWYgKCFpc0Zpbml0ZShwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYW4gaW50ZWdlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgIGNhc2UgXCJEZWNpbWFsRmllbGRcIjpcbiAgICAgIGlmICghaXNGaW5pdGUocGFyc2VGbG9hdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSBudW1iZXJcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkJvb2xlYW5GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIGJvb2xlYW5cIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkRhdGVGaWVsZFwiOlxuICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSB2YWxpZCBkYXRlXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICEvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIGVtYWlsXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVUkxGaWVsZFwiOlxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVUkxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgaWYgKCEvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVVUlEXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJKU09ORmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBKU09OIG9iamVjdFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgaWYgKCFGaWxlTG9hZGVkLmlzVmFsaWQodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGZpbGVcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbImdldFZhbHVlRnJvbUZpZWxkIiwic2V0VmFsdWVJbkZpZWxkIiwidXVpZHY0IiwiZ2V0TW9kZWwiLCJhcHAiLCJ0cmlnZ2VyIiwiTUFYX0ZJTEVfVVBMT0FEIiwiQ09OTkVDVElOR19SRVFVRVNUX0lEIiwiY2xvbmVPYmplY3QiLCJvcmlnaW5hbCIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZSIsImdldFByb3RvdHlwZU9mIiwic3RydWN0dXJlZENsb25lIiwiU2RjTW9kZWxFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIm1zZyIsImlzX2Vycm9yIiwiaGVhZGVyIiwiaHRtbCIsIkZpbGVMb2FkZWQiLCJuYW1lIiwidXJsIiwiY29udGVudCIsImxvYWQiLCJmb3JjZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiJCIsImdldCIsInRoZW4iLCJjYXRjaCIsInRleHQiLCJpc1ZhbGlkIiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJGaWxlIiwibm9ybWFsaXplUGsiLCJwayIsIm5vcm1hbGl6ZWRQayIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNOYU4iLCJTZGNRdWVyeVNldCIsIm1vZGVsTmFtZSIsIm1vZGVsUXVlcnkiLCJ2YWx1ZXNMaXN0IiwibG9hZGVkIiwiX29uTm9PcGVuUmVxdWVzdHMiLCJfaXNDb25uZWN0ZWQiLCJfaXNDb25uZWN0aW5nUHJvY2VzcyIsIl9hdXRvUmVjb25uZWN0Iiwic29ja2V0Iiwib3BlblJlcXVlc3QiLCJtb2RlbElkIiwib25VcGRhdGUiLCJvbkNyZWF0ZSIsIlByb3h5IiwidGFyZ2V0IiwicHJvcCIsInNldCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiaWR4IiwibmV4dCIsImxlbmd0aCIsImRvbmUiLCJvbl9jcmVhdGUiLCJoYW5kbGVyIiwib25fdXBkYXRlIiwic2V0SWRzIiwiaWRzIiwidmwiLCJfc2V0SWRzIiwiZmlsdGVyIiwiaWRfX2luIiwibWFwIiwieCIsImlkIiwic2V0RmlsdGVyIiwiZm9yRWFjaCIsIl9zZXRRdWVyeVNldCIsIlNkY01vZGVsIiwibnVtTGlzdCIsIm51bUlkIiwiTmFOIiwiaXNJbnRlZ2VyIiwidGVtcE51bUxpc3QiLCJzb21lIiwic3BsaXQiLCJpdGVtIiwibmV3TW9kZWwiLCJuZXciLCJpbmNsdWRlcyIsInZhbHVlSWRzIiwiZ2V0SWRzIiwicHVzaCIsImJ5SWQiLCJub3JtYWxpemVkSWQiLCJmaW5kIiwiZWxtIiwiYWRkRmlsdGVyIiwidmFsdWVzIiwiX3NlbmRMb2FkIiwidXBkYXRlIiwibG9hZFF1ZXJ5IiwiZGVsZXRlIiwiZWxlbSIsImV2ZW50X2lkIiwiaXNDb25uZWN0ZWQiLCJzZW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50IiwiZXZlbnRfdHlwZSIsImFyZ3MiLCJtb2RlbF9uYW1lIiwibW9kZWxfcXVlcnkiLCJkYXRhIiwiX3NlbmRMaXN0VmlldyIsImNiUmVzb2x2ZSIsImNiUmVqZWN0IiwidGVtcGxhdGVDb250ZXh0IiwidmlldyIsImV2ZW50VHlwZSIsInZpZXdOYW1lIiwiJGRpdkxpc3QiLCJ2aWV3X25hbWUiLCJ0ZW1wbGF0ZV9jb250ZXh0IiwiYXBwZW5kIiwicmVmcmVzaCIsInJlcyIsIl9zZW5kRGV0YWlsVmlldyIsImdldEZvcm0iLCJtb2RlbE9iaiIsImZvcm1OYW1lIiwiJGRpdkZvcm0iLCJmb3JtSWQiLCJmb3JtX25hbWUiLCJjbGFzc05hbWUiLCIkZm9ybSIsImNsb3Nlc3QiLCJhZGRDbGFzcyIsImFkZEZvcm0iLCJoYXNBdHRyaWJ1dGUiLCJhdHRyIiwiZG9Ob3RMb2FkIiwiZGV0YWlsVmlldyIsImxpc3RWaWV3Iiwic2VhcmNoVmFsdWVzIiwic2F2ZSIsIm5vcm1QayIsImVsZW1MaXN0IiwicExpc3QiLCJfcmVhZEZpbGVzIiwiZmlsZXMiLCJzZW5kRGF0YSIsInNlcmlhbGl6ZSIsImluc3RhbmNlIiwicGFyc2UiLCJfcGFyc2VTZXJ2ZXJSZXMiLCJhbGwiLCJfY29ubmVjdFRvU2VydmVyIiwiX2NoZWNrQ29ubmVjdGlvbiIsInJlc29sdmVPcmlnaW4iLCJyZWplY3RPcmlnaW4iLCJjbG9zZSIsIm9uY2xvc2UiLCJfb25DbG9zZSIsInRvU29sdmUiLCJrZXlzIiwiZmllbGRzIiwia2V5IiwiYnVmZmVyIiwiYXJyYXlCdWZmZXIiLCJyZXN1bHQiLCJVaW50OEFycmF5IiwibnVtYmVyT2ZDaHVua3MiLCJNYXRoIiwiY2VpbCIsImZpbGVfbmFtZSIsImZpZWxkX25hbWUiLCJjb250ZW50X2xlbmd0aCIsInNpemUiLCJpIiwiY2h1bmsiLCJmcm9tIiwic2xpY2UiLCJudW1iZXJfb2ZfY2h1bmtzIiwiY29udGVudF90eXBlIiwidHlwZSIsIl9vbk1lc3NhZ2UiLCJlIiwiaGFzT3duUHJvcGVydHkiLCJfY2xvc2VPcGVuUmVxdWVzdCIsImpzb25SZXMiLCJvYmoiLCJjYiIsIm5vT3BlblJlcXVlc3RzIiwiZXZlbnRJZCIsIm1vZGVsSWRlbnRpZmllciIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiYmluZCIsImNvbnNvbGUiLCJlcnJvciIsIl9rZXkiLCJlbnRyaWVzIiwic2V0VGltZW91dCIsIm9uZXJyb3IiLCJlcnIiLCJvbm9wZW4iLCJyZXN1bHRzIiwibmV3TW9kZWxzIiwiTW9kZWxDbGFzcyIsImN1cnJlbnRNb2RlbCIsInNldFZhbHVlcyIsInNvcnQiLCJhIiwiYiIsIl9pZCIsIl9mb3JtcyIsInF1ZXJ5U2V0IiwibW9kZWxRdWVyeVNldCIsInBhcmVudCIsIm1vZGVOYW1lIiwib25DaGFuZ2UiLCJfb25DaGFuZ2UiLCJvbiIsIl91cGRhdGVGb3JtIiwiZmllbGROYW1lIiwic2VsZiIsImVhY2giLCJpc0xvYWRlZCIsIl9xdWVyeVNldCIsIldlYWtSZWYiLCJkZXJlZiIsInJlZHVjZSIsImFjYyIsInZhbCIsIm1hbnlfdG9fbWFueSIsIm9uZV90b19tYW55IiwiYWxsSWRzIiwiaXNfcmVsYXRpb24iLCJ0b0pzb24iLCJzeW5jRm9ybVRvTW9kZWwiLCIkZm9ybXMiLCJzeW5jRm9ybSIsIl9yZXNvbHZlRm9ybXMiLCJoYXNDbGFzcyIsInN5bmNNb2RlbFRvRm9ybSIsImZvcm1JdGVtIiwiZWxlbWVudHMiLCJyZXR1cm5WYWx1ZSIsInNldFZhbHVlSW5Gb3JtIiwiZm9ybSIsIl9jcmVhdGVGb3JtIiwiX2VkaXRGb3JtIiwibmFtZWRGb3JtIiwidmFsaWRhdGUiLCJjb25maWciLCJ2YWxpZGF0ZUZpZWxkIiwicGFyc2VWYWx1ZSIsIm1hbnlUb01hbnkiLCJvbmVUb01hbnkiLCJtYW55X3RvX29uZSIsIm1hbnlUb09uZSIsIm9uZV90b19vbmUiLCJvbmVUb09uZSIsInBhcnNlRmxvYXQiLCJEYXRlIiwiVVJMIiwibWF4X3NpemUiLCJhbGxvd2VkX3R5cGVzIiwicmVxdWlyZWQiLCJtYXhfbGVuZ3RoIiwibWF4TGVuZ3RoIiwiaXNSZWxhdGlvbiIsInJlbGF0ZWRfbW9kZWwiLCJyZWxhdGVkTW9kZWwiLCJ1bmRlZmluZWQiLCJpc0Zpbml0ZSIsInRlc3QiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
78
78
 
79
79
  /***/ },
80
80
 
@@ -84,7 +84,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
84
84
  \********************************************/
85
85
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
86
86
 
87
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getUrlParam: () => (/* binding */ getUrlParam),\n/* harmony export */ prepareData: () => (/* binding */ prepareData),\n/* harmony export */ runOnInitWithParameter: () => (/* binding */ runOnInitWithParameter)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\nfunction prepareData(data, paramNameList = []) {\n const data_json_key = \"SDC_JSON_MODEL=[\";\n return Object.fromEntries(Object.entries(data).filter(([key, element]) => {\n return key !== _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY && !paramNameList.includes(key);\n }).map(([key, element]) => {\n if (typeof element === \"string\" && element.startsWith(data_json_key)) {\n try {\n const {\n pk,\n fields\n } = JSON.parse(element.slice(data_json_key.length, -1));\n return [key, {\n ...fields,\n id: pk,\n pk\n }];\n } catch {}\n }\n return [key, element];\n }));\n}\nfunction getParamList(paramNameList, $element) {\n let returnList;\n if (!paramNameList) {\n paramNameList = [];\n }\n let data = $element.data();\n let restData = prepareData(data, paramNameList);\n returnList = [];\n for (let i = 0; i < paramNameList.length; i++) {\n let data_name = paramNameList[i];\n if (data.hasOwnProperty(data_name)) {\n returnList.push(data[data_name]);\n } else {\n returnList.push(\"undefined\");\n }\n }\n returnList.push(restData);\n return returnList;\n}\nfunction parseParamNameList(list, controller = null) {\n let values = [];\n for (let i = 0; i < list.length; i++) {\n let tempValue = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.checkIfParamNumberBoolOrString)(list[i], controller);\n values.push(tempValue);\n }\n return values;\n}\nfunction getDomTagParamsWithList(paramNameList, $element, controller = null) {\n let paramList = getParamList(paramNameList, $element);\n return parseParamNameList(paramList, controller);\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $element\n * @param applyController\n * @returns {boolean}\n */\nfunction reg_runOnInitWithParameter(controller, $element, applyController) {\n if (!controller) {\n return false;\n } else if (typeof controller.onInit !== \"function\") {\n return false;\n }\n let paramNameList;\n if (typeof controller._on_init_params === \"function\") {\n paramNameList = controller._on_init_params();\n } else {\n paramNameList = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParamsNameOfFunction)(controller.onInit);\n }\n let initParams = getDomTagParamsWithList(paramNameList, $element, applyController._parentController);\n controller.onInit.apply(applyController, initParams);\n if (applyController === controller) {\n for (let mixinKey in controller._mixins) {\n reg_runOnInitWithParameter(controller._mixins[mixinKey], $element, applyController);\n }\n }\n}\nfunction runOnInitWithParameter($element, controller) {\n reg_runOnInitWithParameter(controller, $element, controller);\n}\nfunction getUrlParam(controller, $element) {\n return getDomTagParamsWithList(controller._urlParams, $element);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RTtFQUMzREssMEJBQTBCLENBQUNMLFVBQVUsRUFBRVQsUUFBUSxFQUFFUyxVQUFVLENBQUM7QUFDOUQ7QUFFTyxTQUFTZSxXQUFXQSxDQUFDZixVQUFVLEVBQUVULFFBQVEsRUFBRTtFQUNoRCxPQUFPWSx1QkFBdUIsQ0FBQ0gsVUFBVSxDQUFDZ0IsVUFBVSxFQUFFekIsUUFBUSxDQUFDO0FBQ2pFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19wYXJhbXMuanM/ZTRiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbixcbiAgY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IERBVEFfQ09OVFJPTExFUl9LRVkgfSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZURhdGEoZGF0YSwgcGFyYW1OYW1lTGlzdCA9IFtdKSB7XG4gIGNvbnN0IGRhdGFfanNvbl9rZXkgPSBcIlNEQ19KU09OX01PREVMPVtcIjtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhkYXRhKVxuICAgICAgLmZpbHRlcigoW2tleSwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgcmV0dXJuIGtleSAhPT0gREFUQV9DT05UUk9MTEVSX0tFWSAmJiAhcGFyYW1OYW1lTGlzdC5pbmNsdWRlcyhrZXkpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtrZXksIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtZW50LnN0YXJ0c1dpdGgoZGF0YV9qc29uX2tleSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBwaywgZmllbGRzIH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICBlbGVtZW50LnNsaWNlKGRhdGFfanNvbl9rZXkubGVuZ3RoLCAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgICAgICAgIGlkOiBwayxcbiAgICAgICAgICAgICAgICBwayxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5LCBlbGVtZW50XTtcbiAgICAgIH0pLFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJhbUxpc3QocGFyYW1OYW1lTGlzdCwgJGVsZW1lbnQpIHtcbiAgbGV0IHJldHVybkxpc3Q7XG4gIGlmICghcGFyYW1OYW1lTGlzdCkge1xuICAgIHBhcmFtTmFtZUxpc3QgPSBbXTtcbiAgfVxuXG4gIGxldCBkYXRhID0gJGVsZW1lbnQuZGF0YSgpO1xuICBsZXQgcmVzdERhdGEgPSBwcmVwYXJlRGF0YShkYXRhLCBwYXJhbU5hbWVMaXN0KTtcblxuICByZXR1cm5MaXN0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1OYW1lTGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGxldCBkYXRhX25hbWUgPSBwYXJhbU5hbWVMaXN0W2ldO1xuXG4gICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoZGF0YV9uYW1lKSkge1xuICAgICAgcmV0dXJuTGlzdC5wdXNoKGRhdGFbZGF0YV9uYW1lXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybkxpc3QucHVzaChcInVuZGVmaW5lZFwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm5MaXN0LnB1c2gocmVzdERhdGEpO1xuICByZXR1cm4gcmV0dXJuTGlzdDtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbU5hbWVMaXN0KGxpc3QsIGNvbnRyb2xsZXIgPSBudWxsKSB7XG4gIGxldCB2YWx1ZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdGVtcFZhbHVlID0gY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nKGxpc3RbaV0sIGNvbnRyb2xsZXIpO1xuICAgIHZhbHVlcy5wdXNoKHRlbXBWYWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXREb21UYWdQYXJhbXNXaXRoTGlzdChwYXJhbU5hbWVMaXN0LCAkZWxlbWVudCwgY29udHJvbGxlciA9IG51bGwpIHtcbiAgbGV0IHBhcmFtTGlzdCA9IGdldFBhcmFtTGlzdChwYXJhbU5hbWVMaXN0LCAkZWxlbWVudCk7XG4gIHJldHVybiBwYXJzZVBhcmFtTmFtZUxpc3QocGFyYW1MaXN0LCBjb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0gYXBwbHlDb250cm9sbGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gcmVnX3J1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoY29udHJvbGxlciwgJGVsZW1lbnQsIGFwcGx5Q29udHJvbGxlcikge1xuICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXIub25Jbml0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IHBhcmFtTmFtZUxpc3Q7XG4gIGlmICh0eXBlb2YgY29udHJvbGxlci5fb25faW5pdF9wYXJhbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHBhcmFtTmFtZUxpc3QgPSBjb250cm9sbGVyLl9vbl9pbml0X3BhcmFtcygpO1xuICB9IGVsc2Uge1xuICAgIHBhcmFtTmFtZUxpc3QgPSBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihjb250cm9sbGVyLm9uSW5pdCk7XG4gIH1cblxuICBsZXQgaW5pdFBhcmFtcyA9IGdldERvbVRhZ1BhcmFtc1dpdGhMaXN0KFxuICAgIHBhcmFtTmFtZUxpc3QsXG4gICAgJGVsZW1lbnQsXG4gICAgYXBwbHlDb250cm9sbGVyLl9wYXJlbnRDb250cm9sbGVyLFxuICApO1xuICBjb250cm9sbGVyLm9uSW5pdC5hcHBseShhcHBseUNvbnRyb2xsZXIsIGluaXRQYXJhbXMpO1xuICBpZiAoYXBwbHlDb250cm9sbGVyID09PSBjb250cm9sbGVyKSB7XG4gICAgZm9yIChsZXQgbWl4aW5LZXkgaW4gY29udHJvbGxlci5fbWl4aW5zKSB7XG4gICAgICByZWdfcnVuT25Jbml0V2l0aFBhcmFtZXRlcihcbiAgICAgICAgY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XSxcbiAgICAgICAgJGVsZW1lbnQsXG4gICAgICAgIGFwcGx5Q29udHJvbGxlcixcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5PbkluaXRXaXRoUGFyYW1ldGVyKCRlbGVtZW50LCBjb250cm9sbGVyKSB7XG4gIHJlZ19ydW5PbkluaXRXaXRoUGFyYW1ldGVyKGNvbnRyb2xsZXIsICRlbGVtZW50LCBjb250cm9sbGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtKGNvbnRyb2xsZXIsICRlbGVtZW50KSB7XG4gIHJldHVybiBnZXREb21UYWdQYXJhbXNXaXRoTGlzdChjb250cm9sbGVyLl91cmxQYXJhbXMsICRlbGVtZW50KTtcbn1cbiJdLCJuYW1lcyI6WyJnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbiIsImNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyIsIkRBVEFfQ09OVFJPTExFUl9LRVkiLCJwcmVwYXJlRGF0YSIsImRhdGEiLCJwYXJhbU5hbWVMaXN0IiwiZGF0YV9qc29uX2tleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsImZpbHRlciIsImtleSIsImVsZW1lbnQiLCJpbmNsdWRlcyIsIm1hcCIsInN0YXJ0c1dpdGgiLCJwayIsImZpZWxkcyIsIkpTT04iLCJwYXJzZSIsInNsaWNlIiwibGVuZ3RoIiwiaWQiLCJnZXRQYXJhbUxpc3QiLCIkZWxlbWVudCIsInJldHVybkxpc3QiLCJyZXN0RGF0YSIsImkiLCJkYXRhX25hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInB1c2giLCJwYXJzZVBhcmFtTmFtZUxpc3QiLCJsaXN0IiwiY29udHJvbGxlciIsInZhbHVlcyIsInRlbXBWYWx1ZSIsImdldERvbVRhZ1BhcmFtc1dpdGhMaXN0IiwicGFyYW1MaXN0IiwicmVnX3J1bk9uSW5pdFdpdGhQYXJhbWV0ZXIiLCJhcHBseUNvbnRyb2xsZXIiLCJvbkluaXQiLCJfb25faW5pdF9wYXJhbXMiLCJpbml0UGFyYW1zIiwiX3BhcmVudENvbnRyb2xsZXIiLCJhcHBseSIsIm1peGluS2V5IiwiX21peGlucyIsInJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIiLCJnZXRVcmxQYXJhbSIsIl91cmxQYXJhbXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_params.js\n\n}");
87
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getUrlParam: () => (/* binding */ getUrlParam),\n/* harmony export */ prepareData: () => (/* binding */ prepareData),\n/* harmony export */ runOnInitWithParameter: () => (/* binding */ runOnInitWithParameter)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\nfunction prepareData(data, controller = null) {\n const data_json_key = \"SDC_JSON_MODEL=[\";\n return Object.fromEntries(Object.entries(data).filter(([key, element]) => {\n return key !== _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY;\n }).map(([key, element]) => {\n if (typeof element === \"string\" && element.startsWith(data_json_key)) {\n try {\n const {\n pk,\n fields\n } = JSON.parse(element.slice(data_json_key.length, -1));\n return [key, {\n ...fields,\n id: pk,\n id: pk\n }];\n } catch {}\n }\n return [key, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.checkIfParamNumberBoolOrString)(element, controller)];\n }));\n}\nfunction getDomTagParamsWithList($element, controller = null) {\n return prepareData($element.data(), controller);\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $element\n * @param applyController\n * @returns {boolean}\n */\nfunction reg_runOnInitWithParameter(controller, $element, applyController) {\n if (!controller) {\n return false;\n } else if (typeof controller.onInit !== \"function\") {\n return false;\n }\n controller.params = getDomTagParamsWithList($element, applyController._parentController);\n}\nfunction runOnInitWithParameter($element, controller) {\n reg_runOnInitWithParameter(controller, $element, controller);\n}\nfunction getUrlParam(controller, $element) {\n const values = getDomTagParamsWithList($element, controller);\n const [params, args] = Object.entries(values).reduce(([params, args], [k, v]) => {\n if (controller._urlParams.includes(k)) {\n params[k] = v;\n } else {\n args[k] = v;\n }\n return [params, args];\n }, [{}, {}]);\n return {\n params,\n args\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsT0FBTyxDQUFDUixNQUFNLEVBQUVLLElBQUksQ0FBQztFQUN2QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBRVosT0FBTztJQUFFTCxNQUFNO0lBQUVLO0VBQUssQ0FBQztBQUN6QiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfcGFyYW1zLmpzP2U0YjUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IERBVEFfQ09OVFJPTExFUl9LRVkgfSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZURhdGEoZGF0YSwgY29udHJvbGxlciA9IG51bGwpIHtcbiAgY29uc3QgZGF0YV9qc29uX2tleSA9IFwiU0RDX0pTT05fTU9ERUw9W1wiO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpXG4gICAgICAuZmlsdGVyKChba2V5LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5ICE9PSBEQVRBX0NPTlRST0xMRVJfS0VZO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtrZXksIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtZW50LnN0YXJ0c1dpdGgoZGF0YV9qc29uX2tleSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBwaywgZmllbGRzIH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICBlbGVtZW50LnNsaWNlKGRhdGFfanNvbl9rZXkubGVuZ3RoLCAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgICAgICAgIGlkOiBwayxcbiAgICAgICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nKGVsZW1lbnQsIGNvbnRyb2xsZXIpXTtcbiAgICAgIH0pLFxuICApO1xufVxuXG5cbmZ1bmN0aW9uIGdldERvbVRhZ1BhcmFtc1dpdGhMaXN0KCRlbGVtZW50LCBjb250cm9sbGVyID0gbnVsbCkge1xuICByZXR1cm4gcHJlcGFyZURhdGEoJGVsZW1lbnQuZGF0YSgpLCBjb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0gYXBwbHlDb250cm9sbGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gcmVnX3J1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoY29udHJvbGxlciwgJGVsZW1lbnQsIGFwcGx5Q29udHJvbGxlcikge1xuICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXIub25Jbml0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb250cm9sbGVyLnBhcmFtcyA9IGdldERvbVRhZ1BhcmFtc1dpdGhMaXN0KFxuICAgICRlbGVtZW50LFxuICAgIGFwcGx5Q29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlcixcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIpIHtcbiAgcmVnX3J1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoY29udHJvbGxlciwgJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsUGFyYW0oY29udHJvbGxlciwgJGVsZW1lbnQpIHtcbiAgY29uc3QgdmFsdWVzID0gZ2V0RG9tVGFnUGFyYW1zV2l0aExpc3QoJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xuICBjb25zdCBbcGFyYW1zLCBhcmdzXSA9IE9iamVjdC5lbnRyaWVzKHZhbHVlcykucmVkdWNlKChbcGFyYW1zLCBhcmdzXSwgW2ssIHZdKSA9PiB7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5pbmNsdWRlcyhrKSkge1xuICAgICAgcGFyYW1zW2tdID0gdjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJnc1trXSA9IHY7XG4gICAgfVxuICAgIHJldHVybiBbcGFyYW1zLCBhcmdzXVxuICB9LCBbe30sIHt9XSk7XG5cbiAgcmV0dXJuIHsgcGFyYW1zLCBhcmdzIH07XG59XG4iXSwibmFtZXMiOlsiY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nIiwiREFUQV9DT05UUk9MTEVSX0tFWSIsInByZXBhcmVEYXRhIiwiZGF0YSIsImNvbnRyb2xsZXIiLCJkYXRhX2pzb25fa2V5IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiZWxlbWVudCIsIm1hcCIsInN0YXJ0c1dpdGgiLCJwayIsImZpZWxkcyIsIkpTT04iLCJwYXJzZSIsInNsaWNlIiwibGVuZ3RoIiwiaWQiLCJnZXREb21UYWdQYXJhbXNXaXRoTGlzdCIsIiRlbGVtZW50IiwicmVnX3J1bk9uSW5pdFdpdGhQYXJhbWV0ZXIiLCJhcHBseUNvbnRyb2xsZXIiLCJvbkluaXQiLCJwYXJhbXMiLCJfcGFyZW50Q29udHJvbGxlciIsInJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIiLCJnZXRVcmxQYXJhbSIsInZhbHVlcyIsImFyZ3MiLCJyZWR1Y2UiLCJrIiwidiIsIl91cmxQYXJhbXMiLCJpbmNsdWRlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_params.js\n\n}");
88
88
 
89
89
  /***/ },
90
90
 
@@ -94,7 +94,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
94
94
  \*************************************************/
95
95
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
96
96
 
97
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nlet OPEN_REQUESTS = {};\nfunction callServer(app, controller, parsedContentUrl, funcName, args) {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketCallServer(app, controller, funcName, args);\n } else {\n return postCallServer(parsedContentUrl, funcName, args);\n }\n}\nfunction isConnected() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketIsConnected();\n } else {\n return Promise.resolve(true);\n }\n}\nfunction close() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n socketClose();\n }\n}\nfunction postCallServer(parsedContentUrl, funcName, args) {\n if (typeof args !== \"object\" && Array.isArray(args) && args === null) {\n args = {\n arg0: args\n };\n }\n args = {\n data: JSON.stringify(args),\n _sdc_func_name: funcName,\n _method: \"sdc_server_call\"\n };\n return $.post({\n url: parsedContentUrl,\n data: args,\n beforeSend: function (xhr, settings) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }).then(res => {\n const data = res[\"_return_data\"];\n _handle_response(data);\n return data;\n }).catch(res => {\n const data = res.responseJSON;\n data.is_error = true;\n _handle_response(data);\n throw res;\n });\n}\nfunction socketCallServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: \"sdc_call\",\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n _handle_response(data);\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error(\"SDC Socket closed unexpectedly\");\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error(\"Socket encountered error: \", err.message, \"Closing socket\");\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction _handle_response(data) {\n if (!data) {\n data = {};\n }\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type && data.type === \"sdc_recall\") {\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === \"sdc_event\") {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === \"sdc_redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"onNavLink\", data.link);\n }\n }\n}\nfunction socketClose() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\nfunction socketIsConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBd0M7QUFDRTtBQUUxQyxJQUFJRSxZQUFZLEdBQUcsS0FBSztBQUN4QixJQUFJQyxhQUFhLEdBQUcsS0FBSztBQUN6QixJQUFJQyxVQUFVLEdBQUcsSUFBSTtBQUNyQixJQUFJQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBRWYsU0FBU0MsVUFBVUEsQ0FBQ0MsR0FBRyxFQUFFQyxVQUFVLEVBQUVDLGdCQUFnQixFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBRTtFQUM1RSxJQUFJQyxNQUFNLENBQUNDLDBCQUEwQixFQUFFO0lBQ3JDLE9BQU9DLGdCQUFnQixDQUFDUCxHQUFHLEVBQUVDLFVBQVUsRUFBRUUsUUFBUSxFQUFFQyxJQUFJLENBQUM7RUFDMUQsQ0FBQyxNQUFNO0lBQ0wsT0FBT0ksY0FBYyxDQUFDTixnQkFBZ0IsRUFBRUMsUUFBUSxFQUFFQyxJQUFJLENBQUM7RUFDekQ7QUFDRjtBQUVPLFNBQVNLLFdBQVdBLENBQUEsRUFBRztFQUM1QixJQUFJSixNQUFNLENBQUNDLDBCQUEwQixFQUFFO0lBQ3JDLE9BQU9JLGlCQUFpQixDQUFDLENBQUM7RUFDNUIsQ0FBQyxNQUFNO0lBQ0wsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO0VBQzlCO0FBQ0Y7QUFFTyxTQUFTQyxLQUFLQSxDQUFBLEVBQUc7RUFDdEIsSUFBSVIsTUFBTSxDQUFDQywwQkFBMEIsRUFBRTtJQUNyQ1EsV0FBVyxDQUFDLENBQUM7RUFDZjtBQUNGO0FBRUEsU0FBU04sY0FBY0EsQ0FBQ04sZ0JBQWdCLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFO0VBQ3hELElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsSUFBSVcsS0FBSyxDQUFDQyxPQUFPLENBQUNaLElBQUksQ0FBQyxJQUFJQSxJQUFJLEtBQUssSUFBSSxFQUFFO0lBQ3BFQSxJQUFJLEdBQUc7TUFB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LElBQUksQ0FBQzhDLElBQUksSUFBSTlDLElBQUksQ0FBQzhDLElBQUksS0FBSyxjQUFjLEVBQUU7TUFDcER0RSx1REFBTyxDQUFDLFdBQVcsRUFBRXdCLElBQUksQ0FBQ2dELElBQUksQ0FBQztJQUNqQztFQUNGO0FBQ0Y7QUFFQSxTQUFTcEQsV0FBV0EsQ0FBQSxFQUFHO0VBQ3JCLElBQUluQixZQUFZLEVBQUU7SUFDaEJBLFlBQVksR0FBRyxLQUFLO0lBQ3BCLElBQUk7TUFDRkUsVUFBVSxDQUFDZ0IsS0FBSyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLE9BQU9tQyxDQUFDLEVBQUUsQ0FBQztFQUNmO0FBQ0Y7QUFFQSxTQUFTdEMsaUJBQWlCQSxDQUFBLEVBQUc7RUFDM0IsT0FBTyxJQUFJQyxPQUFPLENBQUVDLE9BQU8sSUFBSztJQUM5QixJQUFJakIsWUFBWSxFQUFFO01BQ2hCLE9BQU9pQixPQUFPLENBQUMsQ0FBQztJQUNsQixDQUFDLE1BQU0sSUFBSWhCLGFBQWEsRUFBRTtNQUN4QjZELFVBQVUsQ0FBQyxNQUFNO1FBQ2ZoRCxXQUFXLENBQUMsQ0FBQyxDQUFDc0IsSUFBSSxDQUFDLE1BQU07VUFDdkJuQixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQztNQUNKLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDVCxDQUFDLE1BQU07TUFDTCxPQUFPQSxPQUFPLENBQUM4QixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVCO0VBQ0YsQ0FBQyxDQUFDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3NlcnZlcl9jYWxsLmpzP2MzZTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG5sZXQgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG5sZXQgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xubGV0IFNEQ19TT0NLRVQgPSBudWxsO1xubGV0IE9QRU5fUkVRVUVTVFMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBwYXJzZWRDb250ZW50VXJsLCBmdW5jTmFtZSwgYXJncykge1xuICBpZiAod2luZG93LlNFUlZFUl9DQUxMX1ZJQV9XRUJfU09DS0VUKSB7XG4gICAgcmV0dXJuIHNvY2tldENhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvc3RDYWxsU2VydmVyKHBhcnNlZENvbnRlbnRVcmwsIGZ1bmNOYW1lLCBhcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25uZWN0ZWQoKSB7XG4gIGlmICh3aW5kb3cuU0VSVkVSX0NBTExfVklBX1dFQl9TT0NLRVQpIHtcbiAgICByZXR1cm4gc29ja2V0SXNDb25uZWN0ZWQoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgaWYgKHdpbmRvdy5TRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCkge1xuICAgIHNvY2tldENsb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9zdENhbGxTZXJ2ZXIocGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncyA9PT0gbnVsbCkge1xuICAgIGFyZ3MgPSB7IGFyZzA6IGFyZ3MgfTtcbiAgfVxuICBhcmdzID0ge1xuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgIF9zZGNfZnVuY19uYW1lOiBmdW5jTmFtZSxcbiAgICBfbWV0aG9kOiBcInNkY19zZXJ2ZXJfY2FsbFwiLFxuICB9O1xuICByZXR1cm4gJC5wb3N0KHtcbiAgICB1cmw6IHBhcnNlZENvbnRlbnRVcmwsXG4gICAgZGF0YTogYXJncyxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUNTUkZUb2tlblwiLCB3aW5kb3cuQ1NSRl9UT0tFTik7XG4gICAgfSxcbiAgfSlcbiAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzW1wiX3JldHVybl9kYXRhXCJdO1xuICAgICAgX2hhbmRsZV9yZXNwb25zZShkYXRhKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXMucmVzcG9uc2VKU09OO1xuICAgICAgZGF0YS5pc19lcnJvciA9IHRydWU7XG4gICAgICBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpO1xuICAgICAgdGhyb3cgcmVzO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzb2NrZXRDYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgbGV0IGlkID0gdXVpZHY0KCk7XG4gIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgU0RDX1NPQ0tFVC5zZW5kKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogXCJzZGNfY2FsbFwiLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXG4gICAgICAgIGFwcDogYXBwLFxuICAgICAgICBmdW5jdGlvbjogZnVuY05hbWUsXG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIE9QRU5fUkVRVUVTVFNbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgSVNfQ09OTkVDVElORyA9IHRydWU7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3Mvd3MvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICB9XG5cbiAgICBTRENfU09DS0VULm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSk7XG4gICAgfTtcblxuICAgIFNEQ19TT0NLRVQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNEQyBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseVwiKTtcbiAgICAgIH1cbiAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgdmFsdWVbMV0oe30pO1xuICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1trZXldO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH07XG5cbiAgICBTRENfU09DS0VULm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogXCIsXG4gICAgICAgIGVyci5tZXNzYWdlLFxuICAgICAgICBcIkNsb3Npbmcgc29ja2V0XCIsXG4gICAgICApO1xuICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19yZWNhbGxcIikge1xuICAgICAgaWYgKGRhdGEuaWQgJiYgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzBdKGRhdGEuZGF0YSk7XG4gICAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfZXZlbnRcIikge1xuICAgICAgbGV0IGV2ZW50ID0gZGF0YS5ldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB0cmlnZ2VyKGV2ZW50LCBkYXRhLnBheWxvYWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfcmVkaXJlY3RcIikge1xuICAgICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBkYXRhLmxpbmspO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRDbG9zZSgpIHtcbiAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRJc0Nvbm5lY3RlZCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInV1aWR2NCIsInRyaWdnZXIiLCJJU19DT05ORUNURUQiLCJJU19DT05ORUNUSU5HIiwiU0RDX1NPQ0tFVCIsIk9QRU5fUkVRVUVTVFMiLCJjYWxsU2VydmVyIiwiYXBwIiwiY29udHJvbGxlciIsInBhcnNlZENvbnRlbnRVcmwiLCJmdW5jTmFtZSIsImFyZ3MiLCJ3aW5kb3ciLCJTRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCIsInNvY2tldENhbGxTZXJ2ZXIiLCJwb3N0Q2FsbFNlcnZlciIsImlzQ29ubmVjdGVkIiwic29ja2V0SXNDb25uZWN0ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNsb3NlIiwic29ja2V0Q2xvc2UiLCJBcnJheSIsImlzQXJyYXkiLCJhcmcwIiwiZGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJfc2RjX2Z1bmNfbmFtZSIsIl9tZXRob2QiLCIkIiwicG9zdCIsInVybCIsImJlZm9yZVNlbmQiLCJ4aHIiLCJzZXR0aW5ncyIsInNldFJlcXVlc3RIZWFkZXIiLCJDU1JGX1RPS0VOIiwidGhlbiIsInJlcyIsIl9oYW5kbGVfcmVzcG9uc2UiLCJjYXRjaCIsInJlc3BvbnNlSlNPTiIsImlzX2Vycm9yIiwiaWQiLCJzZW5kIiwiZXZlbnQiLCJmdW5jdGlvbiIsInJlamVjdCIsIl9jb25uZWN0IiwibG9jYXRpb24iLCJwcm90b2NvbCIsIldlYlNvY2tldCIsImhvc3QiLCJvbm1lc3NhZ2UiLCJlIiwicGFyc2UiLCJvbmNsb3NlIiwiY29uc29sZSIsImVycm9yIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwic2V0VGltZW91dCIsIm9uZXJyb3IiLCJlcnIiLCJtZXNzYWdlIiwib25vcGVuIiwibXNnIiwiaGVhZGVyIiwidHlwZSIsInBheWxvYWQiLCJsaW5rIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_server_call.js\n\n}");
97
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nlet OPEN_REQUESTS = {};\nfunction callServer(app, controller, parsedContentUrl, funcName, args) {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketCallServer(app, controller, funcName, args);\n } else {\n return postCallServer(parsedContentUrl, funcName, args);\n }\n}\nfunction isConnected() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketIsConnected();\n } else {\n return Promise.resolve(true);\n }\n}\nfunction close() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n socketClose();\n }\n}\nfunction postCallServer(parsedContentUrl, funcName, args) {\n if (typeof args !== \"object\" && Array.isArray(args) && args === null) {\n args = {\n arg0: args\n };\n }\n args = {\n data: JSON.stringify(args),\n _sdc_func_name: funcName,\n _method: \"sdc_server_call\"\n };\n return $.post({\n url: parsedContentUrl,\n data: args,\n beforeSend: function (xhr, settings) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }).then(res => {\n const data = res[\"_return_data\"];\n _handle_response(data);\n return data;\n }).catch(res => {\n const data = res.responseJSON || {};\n data.is_error = true;\n _handle_response(data);\n throw res;\n });\n}\nfunction socketCallServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: \"sdc_call\",\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n _handle_response(data);\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error(\"SDC Socket closed unexpectedly\");\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error(\"Socket encountered error: \", err.message, \"Closing socket\");\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction _handle_response(data) {\n if (!data) {\n data = {};\n }\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type && data.type === \"sdc_recall\") {\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === \"sdc_event\") {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === \"sdc_redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"onNavLink\", data.link);\n }\n }\n}\nfunction socketClose() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\nfunction socketIsConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBd0M7QUFDRTtBQUUxQyxJQUFJRSxZQUFZLEdBQUcsS0FBSztBQUN4QixJQUFJQyxhQUFhLEdBQUcsS0FBSztBQUN6QixJQUFJQyxVQUFVLEdBQUcsSUFBSTtBQUNyQixJQUFJQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBRWYsU0FBU0MsVUFBVUEsQ0FBQ0MsR0FBRyxFQUFFQyxVQUFVLEVBQUVDLGdCQUFnQixFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBRTtFQUM1RSxJQUFJQyxNQUFNLENBQUNDLDBCQUEwQixFQUFFO0lBQ3JDLE9BQU9DLGdCQUFnQixDQUFDUCxHQUFHLEVBQUVDLFVBQVUsRUFBRUUsUUFBUSxFQUFFQyxJQUFJLENBQUM7RUFDMUQsQ0FBQyxNQUFNO0lBQ0wsT0FBT0ksY0FBYyxDQUFDTixnQkFBZ0IsRUFBRUMsUUFBUSxFQUFFQyxJQUFJLENBQUM7RUFDekQ7QUFDRjtBQUVPLFNBQVNLLFdBQVdBLENBQUEsRUFBRztFQUM1QixJQUFJSixNQUFNLENBQUNDLDBCQUEwQixFQUFFO0lBQ3JDLE9BQU9JLGlCQUFpQixDQUFDLENBQUM7RUFDNUIsQ0FBQyxNQUFNO0lBQ0wsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO0VBQzlCO0FBQ0Y7QUFFTyxTQUFTQyxLQUFLQSxDQUFBLEVBQUc7RUFDdEIsSUFBSVIsTUFBTSxDQUFDQywwQkFBMEIsRUFBRTtJQUNyQ1EsV0FBVyxDQUFDLENBQUM7RUFDZjtBQUNGO0FBRUEsU0FBU04sY0FBY0EsQ0FBQ04sZ0JBQWdCLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFO0VBQ3hELElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsSUFBSVcsS0FBSyxDQUFDQyxPQUFPLENBQUNaLElBQUksQ0FBQyxJQUFJQSxJQUFJLEtBQUssSUFBSSxFQUFFO0lBQ3BFQSxJQUFJLEdBQUc7TUFBRWEsSUFBSSxFQUFFYjtJQUFLLENBQUM7RUFDdkI7RUFDQUEsSUFBSSxHQUFHO0lBQ0xjLElBQUksRUFBRUMsSUFBSSxDQUFDQyxTQUFTLENBQUNoQixJQUFJLENBQUM7SUFDMUJpQixjQUFjLEVBQUVsQixRQUFRO0lBQ3hCbUIsT0FBTyxFQUFFO0VBQ1gsQ0FBQztFQUNELE9BQU9DLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO0lBQ1pDLEdBQUcsRUFBRXZCLGdCQUFnQjtJQUNyQmdCLElBQUksRUFBRWQsSUFBSTtJQUNWc0IsVUFBVSxFQUFFLFNBQUFBLENBQVVDLEdBQUcsRUFBRUMsUUFBUSxFQUFFO01BQ25DRCxHQUFHLENBQUNFLGdCQUFnQixDQUFDLGFBQWEsRUFBRXhCLE1BQU0sQ0FBQ3lCLFVBQVUsQ0FBQztJQUN4RDtFQUNGLENBQUMsQ0FBQyxDQUNDQyxJQUFJLENBQUVDLEdBQUcsSUFBSztJQUNiLE1BQU1kLElBQUksR0FBR2MsR0FBRyxDQUFDLGNBQWMsQ0FBQztJQUNoQ0MsZ0JBQWdCLENBQUNmLElBQUksQ0FBQztJQUN0QixPQUFPQSxJQUFJO0VBQ2IsQ0FBQyxDQUFDLENBQ0RnQixLQUFLLENBQUVGLEdBQUcsSUFBSztJQUNkLE1BQU1kLElBQUksR0FBR2MsR0FBRyxDQUFDRyxZQUFZLElBQUksQ0FBQyxDQUFDO0lBQ25DakIsSUFBSSxDQUFDa0IsUUFBUSxHQUFHLElBQUk7SUFDcEJILGdCQUFnQixDQUFDZixJQUFJLENBQUM7SUFDdEIsTUFBTWMsR0FBRztFQUNYLENBQUMsQ0FBQztBQUNOO0FBRUEsU0FBU3pCLGdCQUFnQkEsQ0FBQ1AsR0FBRyxFQUFFQyxVQUFVLEVBQUVFLFFBQVEsRUFBRUMsSUFBSSxFQUFFO0VBQ3pELElBQUlpQyxFQUFFLEdBQUc1QyxxREFBTSxDQUFDLENBQUM7RUFDakJnQixXQUFXLENBQUMsQ0FBQyxDQUFDc0IsSUFBSSxDQUFDLE1BQU07SUFDdkJsQyxVQUFVLENBQUN5QyxJQUFJLENBQ2JuQixJQUFJLENBQUNDLFNBQVMsQ0FBQztNQUNibUIsS0FBSyxFQUFFLFVBQVU7TUFDakJGLEVBQUUsRUFBRUEsRUFBRTtNQUNOcEMsVUFBVSxFQUFFQSxVQUFVO01BQ3RCRCxHQUFHLEVBQUVBLEdBQUc7TUFDUndDLFFBQVEsRUFBRXJDLFFBQVE7TUFDbEJDLElBQUksRUFBRUE7SUFDUixDQUFDLENBQ0gsQ0FBQztFQUNILENBQUMsQ0FBQztFQUVGLE9BQU8sSUFBSU8sT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRTZCLE1BQU0sS0FBSztJQUN0QzNDLGFBQWEsQ0FBQ3VDLEVBQUUsQ0FBQyxHQUFHLENBQUN6QixPQUFPLEVBQUU2QixNQUFNLENBQUM7RUFDdkMsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxTQUFTQyxRQUFRQSxDQUFBLEVBQUc7RUFDbEI5QyxhQUFhLEdBQUcsSUFBSTtFQUNwQixPQUFPLElBQUllLE9BQU8sQ0FBRUMsT0FBTyxJQUFLO0lBQzlCLElBQUlQLE1BQU0sQ0FBQ3NDLFFBQVEsQ0FBQ0MsUUFBUSxLQUFLLFFBQVEsRUFBRTtNQUN6Qy9DLFVBQVUsR0FBRyxJQUFJZ0QsU0FBUyxDQUFDLFNBQVN4QyxNQUFNLENBQUNzQyxRQUFRLENBQUNHLElBQUksYUFBYSxDQUFDO0lBQ3hFLENBQUMsTUFBTTtNQUNMakQsVUFBVSxHQUFHLElBQUlnRCxTQUFTLENBQUMsUUFBUXhDLE1BQU0sQ0FBQ3NDLFFBQVEsQ0FBQ0csSUFBSSxhQUFhLENBQUM7SUFDdkU7SUFFQWpELFVBQVUsQ0FBQ2tELFNBQVMsR0FBRyxVQUFVQyxDQUFDLEVBQUU7TUFDbEMsSUFBSTlCLElBQUksR0FBR0MsSUFBSSxDQUFDOEIsS0FBSyxDQUFDRCxDQUFDLENBQUM5QixJQUFJLENBQUM7TUFDN0JlLGdCQUFnQixDQUFDZixJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEckIsVUFBVSxDQUFDcUQsT0FBTyxHQUFHLFlBQVk7TUFDL0IsSUFBSXZELFlBQVksRUFBRTtRQUNoQndELE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO01BQ2pEO01BQ0F6RCxZQUFZLEdBQUcsS0FBSztNQUNwQixLQUFLLE1BQU0sQ0FBQzBELEdBQUcsRUFBRUMsS0FBSyxDQUFDLElBQUlDLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDMUQsYUFBYSxDQUFDLEVBQUU7UUFDeER3RCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixPQUFPeEQsYUFBYSxDQUFDdUQsR0FBRyxDQUFDO01BQzNCO01BRUFJLFVBQVUsQ0FBQyxNQUFNO1FBQ2ZmLFFBQVEsQ0FBQyxDQUFDO01BQ1osQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNWLENBQUM7SUFFRDdDLFVBQVUsQ0FBQzZELE9BQU8sR0FBRyxVQUFVQyxHQUFHLEVBQUU7TUFDbENSLE9BQU8sQ0FBQ0MsS0FBSyxDQUNYLDRCQUE0QixFQUM1Qk8sR0FBRyxDQUFDQyxPQUFPLEVBQ1gsZ0JBQ0YsQ0FBQztNQUNELElBQUlqRSxZQUFZLEVBQUU7UUFDaEIsSUFBSTtVQUNGRSxVQUFVLENBQUNnQixLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsT0FBT21DLENBQUMsRUFBRSxDQUFDO01BQ2Y7SUFDRixDQUFDO0lBRURuRCxVQUFVLENBQUNnRSxNQUFNLEdBQUcsWUFBWTtNQUM5QmxFLFlBQVksR0FBRyxJQUFJO01BQ25CQyxhQUFhLEdBQUcsS0FBSztNQUNyQmdCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztFQUNILENBQUMsQ0FBQztBQUNKO0FBRUEsU0FBU3FCLGdCQUFnQkEsQ0FBQ2YsSUFBSSxFQUFFO0VBQzlCLElBQUksQ0FBQ0EsSUFBSSxFQUFFO0lBQ1RBLElBQUksR0FBRyxDQUFDLENBQUM7RUFDWDtFQUNBLElBQUlBLElBQUksQ0FBQ2tCLFFBQVEsRUFBRTtJQUNqQixJQUFJbEIsSUFBSSxDQUFDNEMsR0FBRyxJQUFJNUMsSUFBSSxDQUFDNkMsTUFBTSxFQUFFO01BQzNCckUsdURBQU8sQ0FBQyxjQUFjLEVBQUV3QixJQUFJLENBQUM2QyxNQUFNLElBQUksRUFBRSxFQUFFN0MsSUFBSSxDQUFDNEMsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUM1RDtJQUNBLElBQUk1QyxJQUFJLENBQUNtQixFQUFFLElBQUl2QyxhQUFhLENBQUNvQixJQUFJLENBQUNtQixFQUFFLENBQUMsRUFBRTtNQUNyQ3ZDLGFBQWEsQ0FBQ29CLElBQUksQ0FBQ21CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDbkIsSUFBSSxDQUFDQSxJQUFJLElBQUksSUFBSSxDQUFDO01BQzVDLE9BQU9wQixhQUFhLENBQUNvQixJQUFJLENBQUNtQixFQUFFLENBQUM7SUFDL0I7RUFDRixDQUFDLE1BQU07SUFDTCxJQUFJbkIsSUFBSSxDQUFDNEMsR0FBRyxJQUFJNUMsSUFBSSxDQUFDNkMsTUFBTSxFQUFFO01BQzNCckUsdURBQU8sQ0FBQyxTQUFTLEVBQUV3QixJQUFJLENBQUM2QyxNQUFNLElBQUksRUFBRSxFQUFFN0MsSUFBSSxDQUFDNEMsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUN2RDtJQUVBLElBQUk1QyxJQUFJLENBQUM4QyxJQUFJLElBQUk5QyxJQUFJLENBQUM4QyxJQUFJLEtBQUssWUFBWSxFQUFFO01BQzNDLElBQUk5QyxJQUFJLENBQUNtQixFQUFFLElBQUl2QyxhQUFhLENBQUNvQixJQUFJLENBQUNtQixFQUFFLENBQUMsRUFBRTtRQUNyQ3ZDLGFBQWEsQ0FBQ29CLElBQUksQ0FBQ21CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDbkIsSUFBSSxDQUFDQSxJQUFJLENBQUM7UUFDcEMsT0FBT3BCLGFBQWEsQ0FBQ29CLElBQUksQ0FBQ21CLEVBQUUsQ0FBQztNQUMvQjtJQUNGLENBQUMsTUFBTSxJQUFJbkIsSUFBSSxDQUFDOEMsSUFBSSxJQUFJOUMsSUFBSSxDQUFDOEMsSUFBSSxLQUFLLFdBQVcsRUFBRTtNQUNqRCxJQUFJekIsS0FBSyxHQUFHckIsSUFBSSxDQUFDcUIsS0FBSztNQUN0QixJQUFJQSxLQUFLLEVBQUU7UUFDVDdDLHVEQUFPLENBQUM2QyxLQUFLLEVBQUVyQixJQUFJLENBQUMrQyxPQUFPLENBQUM7TUFDOUI7SUFDRixDQUFDLE1BQU0sSUFBSS9DLElBQUksQ0FBQzhDLElBQUksSUFBSTlDLElBQUksQ0FBQzhDLElBQUksS0FBSyxjQUFjLEVBQUU7TUFDcER0RSx1REFBTyxDQUFDLFdBQVcsRUFBRXdCLElBQUksQ0FBQ2dELElBQUksQ0FBQztJQUNqQztFQUNGO0FBQ0Y7QUFFQSxTQUFTcEQsV0FBV0EsQ0FBQSxFQUFHO0VBQ3JCLElBQUluQixZQUFZLEVBQUU7SUFDaEJBLFlBQVksR0FBRyxLQUFLO0lBQ3BCLElBQUk7TUFDRkUsVUFBVSxDQUFDZ0IsS0FBSyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLE9BQU9tQyxDQUFDLEVBQUUsQ0FBQztFQUNmO0FBQ0Y7QUFFQSxTQUFTdEMsaUJBQWlCQSxDQUFBLEVBQUc7RUFDM0IsT0FBTyxJQUFJQyxPQUFPLENBQUVDLE9BQU8sSUFBSztJQUM5QixJQUFJakIsWUFBWSxFQUFFO01BQ2hCLE9BQU9pQixPQUFPLENBQUMsQ0FBQztJQUNsQixDQUFDLE1BQU0sSUFBSWhCLGFBQWEsRUFBRTtNQUN4QjZELFVBQVUsQ0FBQyxNQUFNO1FBQ2ZoRCxXQUFXLENBQUMsQ0FBQyxDQUFDc0IsSUFBSSxDQUFDLE1BQU07VUFDdkJuQixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQztNQUNKLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDVCxDQUFDLE1BQU07TUFDTCxPQUFPQSxPQUFPLENBQUM4QixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVCO0VBQ0YsQ0FBQyxDQUFDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3NlcnZlcl9jYWxsLmpzP2MzZTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG5sZXQgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG5sZXQgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xubGV0IFNEQ19TT0NLRVQgPSBudWxsO1xubGV0IE9QRU5fUkVRVUVTVFMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBwYXJzZWRDb250ZW50VXJsLCBmdW5jTmFtZSwgYXJncykge1xuICBpZiAod2luZG93LlNFUlZFUl9DQUxMX1ZJQV9XRUJfU09DS0VUKSB7XG4gICAgcmV0dXJuIHNvY2tldENhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvc3RDYWxsU2VydmVyKHBhcnNlZENvbnRlbnRVcmwsIGZ1bmNOYW1lLCBhcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25uZWN0ZWQoKSB7XG4gIGlmICh3aW5kb3cuU0VSVkVSX0NBTExfVklBX1dFQl9TT0NLRVQpIHtcbiAgICByZXR1cm4gc29ja2V0SXNDb25uZWN0ZWQoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgaWYgKHdpbmRvdy5TRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCkge1xuICAgIHNvY2tldENsb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9zdENhbGxTZXJ2ZXIocGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncyA9PT0gbnVsbCkge1xuICAgIGFyZ3MgPSB7IGFyZzA6IGFyZ3MgfTtcbiAgfVxuICBhcmdzID0ge1xuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgIF9zZGNfZnVuY19uYW1lOiBmdW5jTmFtZSxcbiAgICBfbWV0aG9kOiBcInNkY19zZXJ2ZXJfY2FsbFwiLFxuICB9O1xuICByZXR1cm4gJC5wb3N0KHtcbiAgICB1cmw6IHBhcnNlZENvbnRlbnRVcmwsXG4gICAgZGF0YTogYXJncyxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUNTUkZUb2tlblwiLCB3aW5kb3cuQ1NSRl9UT0tFTik7XG4gICAgfSxcbiAgfSlcbiAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzW1wiX3JldHVybl9kYXRhXCJdO1xuICAgICAgX2hhbmRsZV9yZXNwb25zZShkYXRhKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXMucmVzcG9uc2VKU09OIHx8IHt9O1xuICAgICAgZGF0YS5pc19lcnJvciA9IHRydWU7XG4gICAgICBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpO1xuICAgICAgdGhyb3cgcmVzO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzb2NrZXRDYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgbGV0IGlkID0gdXVpZHY0KCk7XG4gIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgU0RDX1NPQ0tFVC5zZW5kKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogXCJzZGNfY2FsbFwiLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXG4gICAgICAgIGFwcDogYXBwLFxuICAgICAgICBmdW5jdGlvbjogZnVuY05hbWUsXG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIE9QRU5fUkVRVUVTVFNbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgSVNfQ09OTkVDVElORyA9IHRydWU7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3Mvd3MvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICB9XG5cbiAgICBTRENfU09DS0VULm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSk7XG4gICAgfTtcblxuICAgIFNEQ19TT0NLRVQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNEQyBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseVwiKTtcbiAgICAgIH1cbiAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgdmFsdWVbMV0oe30pO1xuICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1trZXldO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH07XG5cbiAgICBTRENfU09DS0VULm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogXCIsXG4gICAgICAgIGVyci5tZXNzYWdlLFxuICAgICAgICBcIkNsb3Npbmcgc29ja2V0XCIsXG4gICAgICApO1xuICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19yZWNhbGxcIikge1xuICAgICAgaWYgKGRhdGEuaWQgJiYgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzBdKGRhdGEuZGF0YSk7XG4gICAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfZXZlbnRcIikge1xuICAgICAgbGV0IGV2ZW50ID0gZGF0YS5ldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB0cmlnZ2VyKGV2ZW50LCBkYXRhLnBheWxvYWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfcmVkaXJlY3RcIikge1xuICAgICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBkYXRhLmxpbmspO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRDbG9zZSgpIHtcbiAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRJc0Nvbm5lY3RlZCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInV1aWR2NCIsInRyaWdnZXIiLCJJU19DT05ORUNURUQiLCJJU19DT05ORUNUSU5HIiwiU0RDX1NPQ0tFVCIsIk9QRU5fUkVRVUVTVFMiLCJjYWxsU2VydmVyIiwiYXBwIiwiY29udHJvbGxlciIsInBhcnNlZENvbnRlbnRVcmwiLCJmdW5jTmFtZSIsImFyZ3MiLCJ3aW5kb3ciLCJTRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCIsInNvY2tldENhbGxTZXJ2ZXIiLCJwb3N0Q2FsbFNlcnZlciIsImlzQ29ubmVjdGVkIiwic29ja2V0SXNDb25uZWN0ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNsb3NlIiwic29ja2V0Q2xvc2UiLCJBcnJheSIsImlzQXJyYXkiLCJhcmcwIiwiZGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJfc2RjX2Z1bmNfbmFtZSIsIl9tZXRob2QiLCIkIiwicG9zdCIsInVybCIsImJlZm9yZVNlbmQiLCJ4aHIiLCJzZXR0aW5ncyIsInNldFJlcXVlc3RIZWFkZXIiLCJDU1JGX1RPS0VOIiwidGhlbiIsInJlcyIsIl9oYW5kbGVfcmVzcG9uc2UiLCJjYXRjaCIsInJlc3BvbnNlSlNPTiIsImlzX2Vycm9yIiwiaWQiLCJzZW5kIiwiZXZlbnQiLCJmdW5jdGlvbiIsInJlamVjdCIsIl9jb25uZWN0IiwibG9jYXRpb24iLCJwcm90b2NvbCIsIldlYlNvY2tldCIsImhvc3QiLCJvbm1lc3NhZ2UiLCJlIiwicGFyc2UiLCJvbmNsb3NlIiwiY29uc29sZSIsImVycm9yIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwic2V0VGltZW91dCIsIm9uZXJyb3IiLCJlcnIiLCJtZXNzYWdlIiwib25vcGVuIiwibXNnIiwiaGVhZGVyIiwidHlwZSIsInBheWxvYWQiLCJsaW5rIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_server_call.js\n\n}");
98
98
 
99
99
  /***/ },
100
100
 
@@ -114,7 +114,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
114
114
  \************************************************/
115
115
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
116
116
 
117
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ controllerFromTestHtml: () => (/* binding */ controllerFromTestHtml),\n/* harmony export */ getCsrfToken: () => (/* binding */ getCsrfToken),\n/* harmony export */ get_controller: () => (/* binding */ get_controller)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/**\n * @jest-environment jsdom\n */\n\nlet spy = [],\n _originAjax;\nfunction setDefaults() {\n if (!jest) throw new Error(\"JEST is not defined\");\n if (spy.length === 0) {\n _originAjax = $.ajax.bind($);\n spy.push(jest.spyOn($, \"ajax\"));\n spy[0].mockImplementation(function (a) {\n return _originAjax(a).then(html => {\n return html;\n }).catch(html => {\n return html;\n });\n });\n }\n}\nfunction getCookie(name) {\n let cookieValue = null;\n if (document.cookie && document.cookie !== \"\") {\n const cookies = document.cookie.split(\";\");\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) === name + \"=\") {\n return decodeURIComponent(cookie.substring(name.length + 1));\n }\n }\n }\n return \"\";\n}\n\n/**\n * Returns the CSRF token\n */\nfunction getCsrfToken() {\n return getCookie(\"csrftoken\");\n}\n\n/**\n *\n * @param html{string} HTML: .\n * @param afterLifecycle{bool} Lifecycle Methode -> Reruns the controller after the root controller has run the \"onRefresh\" methode. This is optional.\n * @returns {Promise<Array<{AbstractSDC}>>}\n */\nasync function controllerFromTestHtml(html, afterLifecycle = null) {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n $body.safeEmpty().append(html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n let children = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.rootController.iterateAllChildren();\n if (!afterLifecycle) {\n return children;\n }\n const origenRefresh = children[0].onRefresh;\n const refreshSpy = jest.spyOn(children[0], \"onRefresh\");\n return new Promise(resolve => {\n refreshSpy.mockImplementation(function () {\n refreshSpy.mockRestore();\n const res = origenRefresh.apply(children[0], arguments);\n resolve(children);\n return res;\n });\n });\n}\n\n/**\n * Returns a controller. This controller has been created by the using the normal SDC life cycle.\n *\n * @param tag_name{string} Controller tag name (snake-case)\n * @param init_arguments{object} object: Mockeds the tag data arguments.\n * @param origen_html{string} HTML: Mocked content of the content in your target HTML container.\n * @returns {Promise<{AbstractSDC}>}\n */\nasync function get_controller(tag_name, init_arguments = {}, origen_html = \"\") {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n $body.safeEmpty();\n const $controller = $(`<${tag_name}>${origen_html}</${tag_name}>`);\n for (const [key, value] of Object.entries(init_arguments)) {\n $controller.data(key, value);\n }\n const $divContainer = $(\"<div></div>\").append($controller);\n $body.append($divContainer);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.getController($controller);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzJCLE1BQU0sQ0FBQ29CLFdBQVcsQ0FBQztFQUUxRHZCLEtBQUssQ0FBQ0csTUFBTSxDQUFDMEIsYUFBYSxDQUFDO0VBQzNCNUQsNkNBQUcsQ0FBQ21DLE9BQU8sR0FBRyxLQUFLO0VBQ25CbkMsNkNBQUcsQ0FBQ29DLFVBQVUsQ0FBQyxDQUFDO0VBQ2hCLE1BQU1wQyw2Q0FBRyxDQUFDcUMsUUFBUSxDQUFDLENBQUM7RUFDcEIsT0FBT3JDLDZDQUFHLENBQUM2RCxhQUFhLENBQUNQLFdBQVcsQ0FBQztBQUN2QyIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcz9hNDM5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGplc3QtZW52aXJvbm1lbnQganNkb21cbiAqL1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcblxubGV0IHNweSA9IFtdLFxuICBfb3JpZ2luQWpheDtcblxuZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gIGlmICghamVzdCkgdGhyb3cgbmV3IEVycm9yKFwiSkVTVCBpcyBub3QgZGVmaW5lZFwiKTtcbiAgaWYgKHNweS5sZW5ndGggPT09IDApIHtcbiAgICBfb3JpZ2luQWpheCA9ICQuYWpheC5iaW5kKCQpO1xuXG4gICAgc3B5LnB1c2goamVzdC5zcHlPbigkLCBcImFqYXhcIikpO1xuICAgIHNweVswXS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBfb3JpZ2luQWpheChhKVxuICAgICAgICAudGhlbigoaHRtbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGh0bWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgbGV0IGNvb2tpZVZhbHVlID0gbnVsbDtcbiAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09IFwiXCIpIHtcbiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0udHJpbSgpO1xuICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50P1xuICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PT0gbmFtZSArIFwiPVwiKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhuYW1lLmxlbmd0aCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1NSRiB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3NyZlRva2VuKCkge1xuICByZXR1cm4gZ2V0Q29va2llKFwiY3NyZnRva2VuXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gaHRtbHtzdHJpbmd9IEhUTUw6IC5cbiAqIEBwYXJhbSBhZnRlckxpZmVjeWNsZXtib29sfSBMaWZlY3ljbGUgTWV0aG9kZSAtPiBSZXJ1bnMgdGhlIGNvbnRyb2xsZXIgYWZ0ZXIgdGhlIHJvb3QgY29udHJvbGxlciBoYXMgcnVuIHRoZSBcIm9uUmVmcmVzaFwiIG1ldGhvZGUuIFRoaXMgaXMgb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7QWJzdHJhY3RTREN9Pj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250cm9sbGVyRnJvbVRlc3RIdG1sKGh0bWwsIGFmdGVyTGlmZWN5Y2xlID0gbnVsbCkge1xuICBzZXREZWZhdWx0cygpO1xuICBjb25zdCAkYm9keSA9ICQoXCJib2R5XCIpO1xuICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICRib2R5LnNhZmVFbXB0eSgpLmFwcGVuZChodG1sKTtcbiAgYXBwLl9pc0luaXQgPSBmYWxzZTtcbiAgYXBwLmNsZWFuQ2FjaGUoKTtcbiAgYXdhaXQgYXBwLmluaXRfc2RjKCk7XG5cbiAgbGV0IGNoaWxkcmVuID0gYXBwLnJvb3RDb250cm9sbGVyLml0ZXJhdGVBbGxDaGlsZHJlbigpO1xuXG4gIGlmICghYWZ0ZXJMaWZlY3ljbGUpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBjb25zdCBvcmlnZW5SZWZyZXNoID0gY2hpbGRyZW5bMF0ub25SZWZyZXNoO1xuXG4gIGNvbnN0IHJlZnJlc2hTcHkgPSBqZXN0LnNweU9uKGNoaWxkcmVuWzBdLCBcIm9uUmVmcmVzaFwiKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZWZyZXNoU3B5Lm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICByZWZyZXNoU3B5Lm1vY2tSZXN0b3JlKCk7XG4gICAgICBjb25zdCByZXMgPSBvcmlnZW5SZWZyZXNoLmFwcGx5KGNoaWxkcmVuWzBdLCBhcmd1bWVudHMpO1xuICAgICAgcmVzb2x2ZShjaGlsZHJlbik7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlci4gVGhpcyBjb250cm9sbGVyIGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIHVzaW5nIHRoZSBub3JtYWwgU0RDIGxpZmUgY3ljbGUuXG4gKlxuICogQHBhcmFtIHRhZ19uYW1le3N0cmluZ30gQ29udHJvbGxlciB0YWcgbmFtZSAoc25ha2UtY2FzZSlcbiAqIEBwYXJhbSBpbml0X2FyZ3VtZW50c3tvYmplY3R9IG9iamVjdDogTW9ja2VkcyB0aGUgdGFnIGRhdGEgYXJndW1lbnRzLlxuICogQHBhcmFtIG9yaWdlbl9odG1se3N0cmluZ30gSFRNTDogTW9ja2VkIGNvbnRlbnQgb2YgdGhlIGNvbnRlbnQgaW4geW91ciB0YXJnZXQgSFRNTCBjb250YWluZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7QWJzdHJhY3RTREN9Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldF9jb250cm9sbGVyKFxuICB0YWdfbmFtZSxcbiAgaW5pdF9hcmd1bWVudHMgPSB7fSxcbiAgb3JpZ2VuX2h0bWwgPSBcIlwiLFxuKSB7XG4gIHNldERlZmF1bHRzKCk7XG4gIGNvbnN0ICRib2R5ID0gJChcImJvZHlcIik7XG4gIGFwcC51cGRhdGVKcXVlcnkoKTtcblxuICAkYm9keS5zYWZlRW1wdHkoKTtcblxuICBjb25zdCAkY29udHJvbGxlciA9ICQoYDwke3RhZ19uYW1lfT4ke29yaWdlbl9odG1sfTwvJHt0YWdfbmFtZX0+YCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRfYXJndW1lbnRzKSkge1xuICAgICRjb250cm9sbGVyLmRhdGEoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgJGRpdkNvbnRhaW5lciA9ICQoXCI8ZGl2PjwvZGl2PlwiKS5hcHBlbmQoJGNvbnRyb2xsZXIpO1xuXG4gICRib2R5LmFwcGVuZCgkZGl2Q29udGFpbmVyKTtcbiAgYXBwLl9pc0luaXQgPSBmYWxzZTtcbiAgYXBwLmNsZWFuQ2FjaGUoKTtcbiAgYXdhaXQgYXBwLmluaXRfc2RjKCk7XG4gIHJldHVybiBhcHAuZ2V0Q29udHJvbGxlcigkY29udHJvbGxlcik7XG59XG4iXSwibmFtZXMiOlsiYXBwIiwic3B5IiwiX29yaWdpbkFqYXgiLCJzZXREZWZhdWx0cyIsImplc3QiLCJFcnJvciIsImxlbmd0aCIsIiQiLCJhamF4IiwiYmluZCIsInB1c2giLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImEiLCJ0aGVuIiwiaHRtbCIsImNhdGNoIiwiZ2V0Q29va2llIiwibmFtZSIsImNvb2tpZVZhbHVlIiwiZG9jdW1lbnQiLCJjb29raWUiLCJjb29raWVzIiwic3BsaXQiLCJpIiwidHJpbSIsInN1YnN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImdldENzcmZUb2tlbiIsImNvbnRyb2xsZXJGcm9tVGVzdEh0bWwiLCJhZnRlckxpZmVjeWNsZSIsIiRib2R5IiwidXBkYXRlSnF1ZXJ5Iiwic2FmZUVtcHR5IiwiYXBwZW5kIiwiX2lzSW5pdCIsImNsZWFuQ2FjaGUiLCJpbml0X3NkYyIsImNoaWxkcmVuIiwicm9vdENvbnRyb2xsZXIiLCJpdGVyYXRlQWxsQ2hpbGRyZW4iLCJvcmlnZW5SZWZyZXNoIiwib25SZWZyZXNoIiwicmVmcmVzaFNweSIsIlByb21pc2UiLCJyZXNvbHZlIiwibW9ja1Jlc3RvcmUiLCJyZXMiLCJhcHBseSIsImFyZ3VtZW50cyIsImdldF9jb250cm9sbGVyIiwidGFnX25hbWUiLCJpbml0X2FyZ3VtZW50cyIsIm9yaWdlbl9odG1sIiwiJGNvbnRyb2xsZXIiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJkYXRhIiwiJGRpdkNvbnRhaW5lciIsImdldENvbnRyb2xsZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_test_utils.js\n\n}");
117
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ controllerFromTestHtml: () => (/* binding */ controllerFromTestHtml),\n/* harmony export */ getCsrfToken: () => (/* binding */ getCsrfToken),\n/* harmony export */ get_controller: () => (/* binding */ get_controller)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/**\n * @jest-environment jsdom\n */\n\nlet spy = [],\n _originAjax;\nfunction setDefaults() {\n if (!jest) throw new Error(\"JEST is not defined\");\n if (spy.length === 0) {\n _originAjax = $.ajax.bind($);\n spy.push(jest.spyOn($, \"ajax\"));\n spy[0].mockImplementation(function (a) {\n return _originAjax(a).then(html => {\n return html;\n }).catch(html => {\n return html;\n });\n });\n }\n}\nfunction getCookie(name) {\n let cookieValue = null;\n if (document.cookie && document.cookie !== \"\") {\n const cookies = document.cookie.split(\";\");\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) === name + \"=\") {\n return decodeURIComponent(cookie.substring(name.length + 1));\n }\n }\n }\n return \"\";\n}\n\n/**\n * Returns the CSRF token\n */\nfunction getCsrfToken() {\n return getCookie(\"csrftoken\");\n}\n\n/**\n *\n * @param html{string} HTML: .\n * @param afterLifecycle{bool} Lifecycle Methode -> Reruns the controller after the root controller has run the \"onRefresh\" methode. This is optional.\n * @returns {Promise<Array<{AbstractSDC}>>}\n */\nasync function controllerFromTestHtml(html, afterLifecycle = null) {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n $body.safeEmpty().append(html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n let children = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.rootController.iterateAllChildren();\n if (!afterLifecycle) {\n return children;\n }\n const origenRefresh = children[0].onRefresh;\n const refreshSpy = jest.spyOn(children[0], \"onRefresh\");\n return new Promise(resolve => {\n refreshSpy.mockImplementation(function () {\n refreshSpy.mockRestore();\n const res = origenRefresh.apply(children[0], arguments);\n resolve(children);\n return res;\n });\n });\n}\n\n/**\n * Returns a controller. This controller has been created by the using the normal SDC life cycle.\n *\n * @param tag_name{string} Controller tag name (snake-case)\n * @param init_arguments{object} object: Mockeds the tag data arguments.\n * @param origen_html{string} HTML: Mocked content of the content in your target HTML container.\n * @returns {Promise<{AbstractSDC}>}\n */\nasync function get_controller(tag_name, init_arguments = {}, origen_html = \"\") {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n $body.safeEmpty();\n const $controller = $(`<${tag_name}>${origen_html}</${tag_name}>`);\n for (const [key, value] of Object.entries(init_arguments)) {\n $controller.data(key, value);\n }\n const $divContainer = $(\"<div></div>\").append($controller);\n $body.append($divContainer);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n const controller = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.getController($controller);\n controller.navControllerPath = [tag_name];\n return controller;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzJCLE1BQU0sQ0FBQ29CLFdBQVcsQ0FBQztFQUUxRHZCLEtBQUssQ0FBQ0csTUFBTSxDQUFDMEIsYUFBYSxDQUFDO0VBQzNCNUQsNkNBQUcsQ0FBQ21DLE9BQU8sR0FBRyxLQUFLO0VBQ25CbkMsNkNBQUcsQ0FBQ29DLFVBQVUsQ0FBQyxDQUFDO0VBQ2hCLE1BQU1wQyw2Q0FBRyxDQUFDcUMsUUFBUSxDQUFDLENBQUM7RUFDcEIsTUFBTXdCLFVBQVUsR0FBRzdELDZDQUFHLENBQUM4RCxhQUFhLENBQUNSLFdBQVcsQ0FBQztFQUNqRE8sVUFBVSxDQUFDRSxpQkFBaUIsR0FBRyxDQUFDWixRQUFRLENBQUM7RUFDekMsT0FBT1UsVUFBVTtBQUNuQiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcz9hNDM5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGplc3QtZW52aXJvbm1lbnQganNkb21cbiAqL1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcblxubGV0IHNweSA9IFtdLFxuICBfb3JpZ2luQWpheDtcblxuZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gIGlmICghamVzdCkgdGhyb3cgbmV3IEVycm9yKFwiSkVTVCBpcyBub3QgZGVmaW5lZFwiKTtcbiAgaWYgKHNweS5sZW5ndGggPT09IDApIHtcbiAgICBfb3JpZ2luQWpheCA9ICQuYWpheC5iaW5kKCQpO1xuXG4gICAgc3B5LnB1c2goamVzdC5zcHlPbigkLCBcImFqYXhcIikpO1xuICAgIHNweVswXS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBfb3JpZ2luQWpheChhKVxuICAgICAgICAudGhlbigoaHRtbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGh0bWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgbGV0IGNvb2tpZVZhbHVlID0gbnVsbDtcbiAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09IFwiXCIpIHtcbiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0udHJpbSgpO1xuICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50P1xuICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PT0gbmFtZSArIFwiPVwiKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhuYW1lLmxlbmd0aCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1NSRiB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3NyZlRva2VuKCkge1xuICByZXR1cm4gZ2V0Q29va2llKFwiY3NyZnRva2VuXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gaHRtbHtzdHJpbmd9IEhUTUw6IC5cbiAqIEBwYXJhbSBhZnRlckxpZmVjeWNsZXtib29sfSBMaWZlY3ljbGUgTWV0aG9kZSAtPiBSZXJ1bnMgdGhlIGNvbnRyb2xsZXIgYWZ0ZXIgdGhlIHJvb3QgY29udHJvbGxlciBoYXMgcnVuIHRoZSBcIm9uUmVmcmVzaFwiIG1ldGhvZGUuIFRoaXMgaXMgb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7QWJzdHJhY3RTREN9Pj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250cm9sbGVyRnJvbVRlc3RIdG1sKGh0bWwsIGFmdGVyTGlmZWN5Y2xlID0gbnVsbCkge1xuICBzZXREZWZhdWx0cygpO1xuICBjb25zdCAkYm9keSA9ICQoXCJib2R5XCIpO1xuICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICRib2R5LnNhZmVFbXB0eSgpLmFwcGVuZChodG1sKTtcbiAgYXBwLl9pc0luaXQgPSBmYWxzZTtcbiAgYXBwLmNsZWFuQ2FjaGUoKTtcbiAgYXdhaXQgYXBwLmluaXRfc2RjKCk7XG5cbiAgbGV0IGNoaWxkcmVuID0gYXBwLnJvb3RDb250cm9sbGVyLml0ZXJhdGVBbGxDaGlsZHJlbigpO1xuXG4gIGlmICghYWZ0ZXJMaWZlY3ljbGUpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBjb25zdCBvcmlnZW5SZWZyZXNoID0gY2hpbGRyZW5bMF0ub25SZWZyZXNoO1xuXG4gIGNvbnN0IHJlZnJlc2hTcHkgPSBqZXN0LnNweU9uKGNoaWxkcmVuWzBdLCBcIm9uUmVmcmVzaFwiKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZWZyZXNoU3B5Lm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICByZWZyZXNoU3B5Lm1vY2tSZXN0b3JlKCk7XG4gICAgICBjb25zdCByZXMgPSBvcmlnZW5SZWZyZXNoLmFwcGx5KGNoaWxkcmVuWzBdLCBhcmd1bWVudHMpO1xuICAgICAgcmVzb2x2ZShjaGlsZHJlbik7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlci4gVGhpcyBjb250cm9sbGVyIGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIHVzaW5nIHRoZSBub3JtYWwgU0RDIGxpZmUgY3ljbGUuXG4gKlxuICogQHBhcmFtIHRhZ19uYW1le3N0cmluZ30gQ29udHJvbGxlciB0YWcgbmFtZSAoc25ha2UtY2FzZSlcbiAqIEBwYXJhbSBpbml0X2FyZ3VtZW50c3tvYmplY3R9IG9iamVjdDogTW9ja2VkcyB0aGUgdGFnIGRhdGEgYXJndW1lbnRzLlxuICogQHBhcmFtIG9yaWdlbl9odG1se3N0cmluZ30gSFRNTDogTW9ja2VkIGNvbnRlbnQgb2YgdGhlIGNvbnRlbnQgaW4geW91ciB0YXJnZXQgSFRNTCBjb250YWluZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7QWJzdHJhY3RTREN9Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldF9jb250cm9sbGVyKFxuICB0YWdfbmFtZSxcbiAgaW5pdF9hcmd1bWVudHMgPSB7fSxcbiAgb3JpZ2VuX2h0bWwgPSBcIlwiLFxuKSB7XG4gIHNldERlZmF1bHRzKCk7XG4gIGNvbnN0ICRib2R5ID0gJChcImJvZHlcIik7XG4gIGFwcC51cGRhdGVKcXVlcnkoKTtcblxuICAkYm9keS5zYWZlRW1wdHkoKTtcblxuICBjb25zdCAkY29udHJvbGxlciA9ICQoYDwke3RhZ19uYW1lfT4ke29yaWdlbl9odG1sfTwvJHt0YWdfbmFtZX0+YCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRfYXJndW1lbnRzKSkge1xuICAgICRjb250cm9sbGVyLmRhdGEoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgJGRpdkNvbnRhaW5lciA9ICQoXCI8ZGl2PjwvZGl2PlwiKS5hcHBlbmQoJGNvbnRyb2xsZXIpXG5cbiAgJGJvZHkuYXBwZW5kKCRkaXZDb250YWluZXIpO1xuICBhcHAuX2lzSW5pdCA9IGZhbHNlO1xuICBhcHAuY2xlYW5DYWNoZSgpO1xuICBhd2FpdCBhcHAuaW5pdF9zZGMoKTtcbiAgY29uc3QgY29udHJvbGxlciA9IGFwcC5nZXRDb250cm9sbGVyKCRjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci5uYXZDb250cm9sbGVyUGF0aCA9IFt0YWdfbmFtZV1cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG4iXSwibmFtZXMiOlsiYXBwIiwic3B5IiwiX29yaWdpbkFqYXgiLCJzZXREZWZhdWx0cyIsImplc3QiLCJFcnJvciIsImxlbmd0aCIsIiQiLCJhamF4IiwiYmluZCIsInB1c2giLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImEiLCJ0aGVuIiwiaHRtbCIsImNhdGNoIiwiZ2V0Q29va2llIiwibmFtZSIsImNvb2tpZVZhbHVlIiwiZG9jdW1lbnQiLCJjb29raWUiLCJjb29raWVzIiwic3BsaXQiLCJpIiwidHJpbSIsInN1YnN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImdldENzcmZUb2tlbiIsImNvbnRyb2xsZXJGcm9tVGVzdEh0bWwiLCJhZnRlckxpZmVjeWNsZSIsIiRib2R5IiwidXBkYXRlSnF1ZXJ5Iiwic2FmZUVtcHR5IiwiYXBwZW5kIiwiX2lzSW5pdCIsImNsZWFuQ2FjaGUiLCJpbml0X3NkYyIsImNoaWxkcmVuIiwicm9vdENvbnRyb2xsZXIiLCJpdGVyYXRlQWxsQ2hpbGRyZW4iLCJvcmlnZW5SZWZyZXNoIiwib25SZWZyZXNoIiwicmVmcmVzaFNweSIsIlByb21pc2UiLCJyZXNvbHZlIiwibW9ja1Jlc3RvcmUiLCJyZXMiLCJhcHBseSIsImFyZ3VtZW50cyIsImdldF9jb250cm9sbGVyIiwidGFnX25hbWUiLCJpbml0X2FyZ3VtZW50cyIsIm9yaWdlbl9odG1sIiwiJGNvbnRyb2xsZXIiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJkYXRhIiwiJGRpdkNvbnRhaW5lciIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwibmF2Q29udHJvbGxlclBhdGgiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_test_utils.js\n\n}");
118
118
 
119
119
  /***/ },
120
120
 
@@ -134,7 +134,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
134
134
  \******************************************/
135
135
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
136
136
 
137
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\n }\n });\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n url = url.replace(re, \"\" + urlValues.shift());\n }\n }\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const {\n contentUrl,\n _tagName,\n contentReload\n } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n return $.get(contentUrl, args).then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n return data;\n }).catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", data[\"url-link\"]);\n }\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", {\n controller_name: () => err.status\n });\n }\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while (matches = re.exec(url)) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n let params = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n return null;\n });\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n return new Promise(resolve => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n return replaceAllTagElementsInContainer(controller.$container, controller, process);\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName.toLowerCase().replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data());\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this.children(), process);\n }));\n }\n });\n return Promise.all(plist);\n}\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [[\"name\", \"\"], [\"type\", \"text\"], [\"id\", \"\"]].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\nfunction reconcileTree({\n $element,\n id = [],\n parent = null\n}) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(0, (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1);\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj\n })).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({\n $element: $realNode\n });\n const $new = reconcileTree({\n $element: $virtualNode\n });\n $old.map((x, i) => x.idx = i);\n $new.map((x, i) => x.idx = i);\n const depth = Math.max(...$new.concat($old).map(x => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\n if (op.type === \"keep_counterpart\") {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\n}\nfunction syncAttributes($real, $virtual) {\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach(attr => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach(attr => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: \"keep\",\n idx: newNode.idx\n };\n newNode.op = {\n type: \"keep_counterpart\",\n counterpart: oldNode\n };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: \"delete\",\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\" ? element.parent.op.counterpart : element.parent;\n }\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\" ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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InNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcz8yNGI1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNvbnRyb2xsZXJGYWN0b3J5LFxuICBwcmVwYXJlUmVmcmVzaFByb2Nlc3MsXG4gIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gsXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbSwgcHJlcGFyZURhdGEgfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuLyoqXG4gKiBMaXN0IG9mIEhUTUwgZmlsZXMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBodG1sRmlsZXMgPSB7fTtcblxuZXhwb3J0IGNvbnN0IERBVEFfQ09OVFJPTExFUl9LRVkgPSBcIl9jb250cm9sbGVyX1wiO1xuZXhwb3J0IGNvbnN0IENPTlRST0xMRVJfQ0xBU1MgPSBcIl9zZGNfY29udHJvbGxlcl9cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG4gIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gIGlmICghJGNvbnRhaW5lcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJGNoaWxkcmVuID0gJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICBsZXQgdGFnTmFtZSA9ICRlbGVtZW50LnByb3AoXCJ0YWdOYW1lXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCJfXCIpO1xuICAgIGlmICgkLmluQXJyYXkodGFnTmFtZVswXSwgdGFnTmFtZUxpc3QpID49IDApIHtcbiAgICAgIGVtcHR5TGlzdC5wdXNoKHtcbiAgICAgICAgdGFnOiB0YWdOYW1lWzBdLFxuICAgICAgICBzdXBlcjogdGFnTmFtZS5zcGxpY2UoMSkgfHwgW10sXG4gICAgICAgIGRvbTogJGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aChcInRoaXMuXCIpKSB7XG4gICAgICAkZWxlbWVudC5hZGRDbGFzcyhcbiAgICAgICAgYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1wdHlMaXN0ID0gZW1wdHlMaXN0LmNvbmNhdChcbiAgICAgICAgZmluZFNkY1RncygkZWxlbWVudCwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCBcIlwiICsgdXJsVmFsdWVzLnNoaWZ0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgY29udGVudCBVUkwgZnJvbSB0aGUgY29udHJvbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gZ2V0IGFyZ3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnl8Qm9vbGVhbj59IC0gd2FpdHMgZm9yIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGFyZ3MpIHtcbiAgY29uc3QgeyBjb250ZW50VXJsLCBfdGFnTmFtZSwgY29udGVudFJlbG9hZCB9ID0gY29udHJvbGxlcjtcbiAgaWYgKCFjb250ZW50VXJsKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH0gZWxzZSBpZiAoaHRtbEZpbGVzW190YWdOYW1lXSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaHRtbEZpbGVzW190YWdOYW1lXSk7XG4gIH1cblxuICBhcmdzLlZFUlNJT04gPSBhcHAuVkVSU0lPTjtcbiAgYXJncy5fbWV0aG9kID0gXCJjb250ZW50XCI7XG5cbiAgcmV0dXJuICQuZ2V0KGNvbnRlbnRVcmwsIGFyZ3MpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmICghY29udGVudFJlbG9hZCkge1xuICAgICAgICBodG1sRmlsZXNbX3RhZ05hbWVdID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDMwMSkge1xuICAgICAgICBjb25zdCBkYXRhID0gZXJyLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgdHJpZ2dlcihcIl9SZWRpcmVjdE9uVmlld1wiLCBkYXRhW1widXJsLWxpbmtcIl0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyLmNvbmZpcm1QYWdlTG9hZGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJpZ2dlcihcIm5hdkxvYWRlZFwiLCB7IGNvbnRyb2xsZXJfbmFtZTogKCkgPT4gZXJyLnN0YXR1cyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIHJlcGxhY2VzIGFsbCByZWdpc3RlcmVkIHRhZ3MgYnkgdGhlIGNvbnRyb2xsZXIuXG4gKiBJbiB0aGlzIHN0ZXAgdGhlIGxpZmUtY3ljbGUgc3RhcnRzLlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0gZ2l2ZW4gY29udGFpbmVyXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gcGFyZW50IGNvbnRvbGxlciBzdXJyb3VuZGVkIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkY29udGFpbmVyLFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzID0gbnVsbCxcbikge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGNvbnRhaW5lcixcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcGFyc2VDb250ZW50VXJsIHVzZXMgdGhlIGNvbnRlbnQgVVJMIHByZWZpeCB0byBtYXJnZSB0aGVcbiAqIGNvcnJlY3QgVVJMLiBBbHNvIHBhcnNlcyB0aGUgdXJsIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHJldHVybnMge3t1cmw6IFN0cmluZywgYXJnczogQXJyYXl9fSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpIHtcbiAgbGV0IHVybCA9IGNvbnRyb2xsZXIuY29udGVudFVybDtcbiAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGxldCByZSA9IC8lXFwoKFteKV0rKVxcKVxcdy9nbTtcbiAgICBsZXQgbWF0Y2hlcztcbiAgICBjb250cm9sbGVyLl91cmxQYXJhbXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoZXMgPSByZS5leGVjKHVybCkpKSB7XG4gICAgICBjb250cm9sbGVyLl91cmxQYXJhbXMucHVzaChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbGV0IHBhcmFtcyA9IGdldFVybFBhcmFtKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoKSB7XG4gICAgdXJsID0gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHBhcmFtcyk7XG4gIH1cblxuICBjb250cm9sbGVyLnBhcnNlZENvbnRlbnRVcmwgPSB1cmw7XG5cbiAgcmV0dXJuIHsgdXJsOiB1cmwsIGFyZ3M6IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV0gfTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXIoJGVsZW0pIHtcbiAgaWYgKCRlbGVtLmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgcmV0dXJuICRlbGVtLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgfVxuICByZXR1cm4gJGVsZW0uY2xvc2VzdChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG59XG5cbi8qKlxuICogbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKiBUaGUgY29udGVudCBpcyBzYXZlZCBhcyBqUXVlcnkgb2JqZWN0IHRvIHRoZSBjb250cm9sbGVyLiRjb250ZW50IHByb3BlcnR5IG9mXG4gKiB0aGUgY29udHJvbGxlci5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBsZXQgZ2V0RWxlbWVudHMgPSB7IGFyZ3M6IHt9IH07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKV0pLnRoZW4oXG4gICAgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGxldCBodG1sRmlsZSA9IHJlc3VsdHNbMF07XG4gICAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gJChodG1sRmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiAkKFwiPGRpdj48L2Rpdj5cIikuYXBwZW5kKGh0bWxGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIHJlbG9hZEhUTUxDb250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgbGV0IGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGdldEVsZW1lbnRzLmFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZSgkKCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICBsZXQgY29udHJvbGxlciA9ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIGlmIChjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbiAgfVxuXG4gIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyRmFjdG9yeShcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICRlbGVtZW50LFxuICAgIHRhZ05hbWUsXG4gICAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgKTtcbiAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBjb250cm9sbGVyKTtcbiAgJGVsZW1lbnQuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gIHJldHVybiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuLyoqXG4gKiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQgZW1wdGllcyB0aGUgcmVnaXN0ZXJlZCB0YWcgYW5kIHJlcGxhY2VzIGl0IGJ5IHRoZSBjb250cm9sbGVyXG4gKiBjb250ZW50LiBJdCBzZXRzIHRoZSBDU1MgdGFncyBmb3IgdGhlIHJlbGF0aW9uIHdpdGggdGhlIENTUyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHBhcmFtIHtqcXVlcnl9ICRodG1sIC0galF1ZXJ5IGxvYWRlZCBjb250ZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCRodG1sICYmICRodG1sLmxlbmd0aCA+IDApIHtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuZW1wdHkoKTtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXR0cihjb250cm9sbGVyLl90YWdOYW1lLCBcIlwiKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiBjb250cm9sbGVyLl9taXhpbnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX21peGluc1ttaXhpbktleV0uX3RhZ05hbWUsIFwiXCIpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgY29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG4vKipcbiAqIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBGb3IgZWFjaCByZWdpc3RlcmVkIHRhZyBpdCBsb2FkcyB0aGUgY29udGVudC5cbiAqIEFmdGVyd2FyZHMgaXQgc3RhcnRzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjb250cm9sbGVyLiBJIHRoZSBuZXh0IHN0ZXAgaXQgc3RhcnRzIHRoZVxuICogcHJvY2VkdXJlIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIgdGFnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTGlzdCAtIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgdGFnc1xuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyIHRvIGZpbmQgdGhlIHRhZ3NcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gIHRhZ0xpc3QsXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MsXG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKFxuICAgICAgJGNvbnRhaW5lcixcbiAgICAgIHRhZ0xpc3QsXG4gICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICk7XG4gICAgbGV0IHRhZ0NvdW50ID0gdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgIGxldCBlbGVtZW50SW5kZXggPSAwO1xuICAgICAgZWxlbWVudEluZGV4IDwgdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG4gICAgICBlbGVtZW50SW5kZXgrK1xuICAgICkge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5kb20sXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS50YWcsXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5zdXBlcixcbiAgICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAgICAgcHJvY2VzcyxcbiAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgIHRhZ0NvdW50LS07XG4gICAgICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRjb250YWluZXIsIHByb2Nlc3MpIHtcbiAgcmV0dXJuIF9yZWxvYWRNZXRob2RIVE1MKFxuICAgIGNvbnRyb2xsZXIsXG4gICAgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGRvbSwgcHJvY2Vzcykge1xuICBjb25zdCBwbGlzdCA9IFtdO1xuXG4gICRkb21cbiAgICAuZmluZChgLl9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyLnNkY191dWlkXyR7Y29udHJvbGxlci5fdXVpZH1gKVxuICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoYF93aXRoX2hhbmRsZXJgKSkge1xuICAgICAgICByZXN1bHQgPSAkdGhpcy5kYXRhKFwiaGFuZGxlclwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb250cm9sbGVyX2hhbmRsZXIgPSB0aGlzLnRhZ05hbWVcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5yZXBsYWNlKC9edGhpcy4vLCBcIlwiKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXSkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBwcmVwYXJlRGF0YSgkdGhpcy5kYXRhKCkpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZChjb250cm9sbGVyKShuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcGxpc3QucHVzaChcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKCh4KSA9PiB7XG4gICAgICAgICAgICBsZXQgJG5ld0NvbnRlbnQgPSAkKGA8ZGl2PjwvZGl2PmApO1xuICAgICAgICAgICAgJG5ld0NvbnRlbnQuYXBwZW5kKHgpO1xuXG4gICAgICAgICAgICBpZiAoJHRoaXMuaHRtbCgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICR0aGlzLmFwcGVuZChcIjxkaXY+PC9kaXY+XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShcbiAgICAgICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgJG5ld0NvbnRlbnQsXG4gICAgICAgICAgICAgICR0aGlzLmNoaWxkcmVuKCksXG4gICAgICAgICAgICAgIHByb2Nlc3MsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChwbGlzdCk7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZVswXS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBgVEVYVF9fJHtub2RlWzBdLm5vZGVWYWx1ZX1gO1xuICB9XG4gIGNvbnN0IHJlcyA9IFtub2RlWzBdLnRhZ05hbWVdO1xuICBpZiAobm9kZVswXS5ub2RlTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgW1xuICAgICAgW1wibmFtZVwiLCBcIlwiXSxcbiAgICAgIFtcInR5cGVcIiwgXCJ0ZXh0XCJdLFxuICAgICAgW1wiaWRcIiwgXCJcIl0sXG4gICAgXS5mb3JFYWNoKChba2V5LCBkZWZhdWx0VmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyKGtleSkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgcmVzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcy5qb2luKFwiX19cIik7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudCwgaWQgPSBbXSwgcGFyZW50ID0gbnVsbCB9KSB7XG4gIGlkLnB1c2goZ2V0Tm9kZUtleSgkZWxlbWVudCkpO1xuICBjb25zdCBvYmogPSB7XG4gICAgJGVsZW1lbnQsXG4gICAgaWQ6IGlkLmpvaW4oXCI6OlwiKSxcbiAgICBkZXB0aDogaWQubGVuZ3RoLFxuICAgIGlkeDogMCxcbiAgICBnZXRSZWFsUGFyZW50OiAoKSA9PiBwYXJlbnQsXG4gICAgZ2V0SWR4OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlkeCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAodGhpcy5nZXRSZWFsUGFyZW50KCk/LmdldElkeCgpID8/IC0xKSArICRlbGVtZW50LmluZGV4KCkgKyAxLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9LFxuICAgIG9wOiBudWxsLFxuICAgIHBhcmVudCxcbiAgfTtcbiAgb2JqLmdldElkeC5iaW5kKG9iaik7XG4gIHJldHVybiBbb2JqXS5jb25jYXQoXG4gICAgJGVsZW1lbnRcbiAgICAgIC5jb250ZW50cygpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKCh4KSA9PlxuICAgICAgICByZWNvbmNpbGVUcmVlKHtcbiAgICAgICAgICAkZWxlbWVudDogJCh4KSxcbiAgICAgICAgICBpZDogaWQuc2xpY2UoKSxcbiAgICAgICAgICBwYXJlbnQ6IG9iaixcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuZmxhdCgpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKSB7XG4gIGNvbnN0ICRvbGQgPSByZWNvbmNpbGVUcmVlKHsgJGVsZW1lbnQ6ICRyZWFsTm9kZSB9KTtcbiAgY29uc3QgJG5ldyA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHZpcnR1YWxOb2RlIH0pO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICAkbmV3Lm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICBjb25zdCBkZXB0aCA9IE1hdGgubWF4KC4uLiRuZXcuY29uY2F0KCRvbGQpLm1hcCgoeCkgPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3QgeyBvcCwgJGVsZW1lbnQsIGlkeCB9ID0gb3Bfc3RlcDtcblxuICAgIGlmIChvcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIikge1xuICAgICAgbGV0IGNJZHggPSBvcC5jb3VudGVycGFydC5nZXRJZHgoKTtcbiAgICAgIGlmIChjSWR4ICE9PSBpZHgpIHtcbiAgICAgICAgY29uc3QgZWxlbUJlZm9yZSA9IG9wX3N0ZXAuZ2V0QmVmb3JlKCk7XG4gICAgICAgIGlmICghZWxlbUJlZm9yZSkge1xuICAgICAgICAgIG9wX3N0ZXAuZ2V0UmVhbFBhcmVudCgpLiRlbGVtZW50LnByZXBlbmQob3AuY291bnRlcnBhcnQuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50Lmluc2VydEFmdGVyKGVsZW1CZWZvcmUuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN5bmNBdHRyaWJ1dGVzKG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50LCAkZWxlbWVudCk7XG4gICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKS4kY29udGFpbmVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQ7XG4gICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRvUmVtb3ZlLnB1c2goJGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJkZWxldGVcIikge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgY29uc3QgeyBhZnRlciwgdGFyZ2V0IH0gPSBvcF9zdGVwLm9wO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICRlbGVtZW50Lmluc2VydEFmdGVyKGFmdGVyLiRlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC4kZWxlbWVudC5wcmVwZW5kKCRlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRvUmVtb3ZlLmZvckVhY2goKCRlbGVtZW50KSA9PiAkZWxlbWVudC5zYWZlUmVtb3ZlKCkpO1xufVxuXG5mdW5jdGlvbiBzeW5jQXR0cmlidXRlcygkcmVhbCwgJHZpcnR1YWwpIHtcbiAgY29uc3QgcmVhbEF0dHJzID0gJHJlYWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgY29uc3QgdmlydHVhbEF0dHJzID0gJHZpcnR1YWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgLy8gUmVtb3ZlIG1pc3NpbmcgYXR0cnNcbiAgWy4uLnJlYWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghJHZpcnR1YWwuaXMoYFske2F0dHIubmFtZX1dYCkpIHtcbiAgICAgICRyZWFsLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCBvciB1cGRhdGVcbiAgWy4uLnZpcnR1YWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXNcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmRlcHRoID09PSBkZXB0aCAmJiAheC5vcClcbiAgICAuZm9yRWFjaCgobmV3Tm9kZSkgPT4ge1xuICAgICAgY29uc3Qgb2xkTm9kZSA9IG9sZE5vZGVzLmZpbmQoKHRlbXBPbGROb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICAgIG9sZE5vZGUub3AgPSB7IHR5cGU6IFwia2VlcFwiLCBpZHg6IG5ld05vZGUuaWR4IH07XG4gICAgICAgICAgbmV3Tm9kZS5vcCA9IHsgdHlwZTogXCJrZWVwX2NvdW50ZXJwYXJ0XCIsIGNvdW50ZXJwYXJ0OiBvbGROb2RlIH07XG4gICAgICAgICAgb2xkTm9kZSA9IG9sZE5vZGUucGFyZW50O1xuICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudDtcbiAgICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIGlmIChkZXB0aCA+IDEpIHtcbiAgICByZXR1cm4gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoIC0gMSk7XG4gIH1cblxuICBvbGROb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgaWYgKCF4Lm9wKSB7XG4gICAgICBjb25zdCBpZHggPSAob2xkTm9kZXNbaSAtIDFdPy5vcC5pZHggPz8gLTEpICsgMTtcbiAgICAgIHgub3AgPSB7IHR5cGU6IFwiZGVsZXRlXCIsIGlkeCB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIlxuICAgICAgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydFxuICAgICAgOiBlbGVtZW50LnBhcmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJlZm9yZShlbGVtZW50LCBpZHgpIHtcbiAgICBjb25zdCBzdGFydERlcHRoID0gZWxlbWVudC5kZXB0aDtcbiAgICB3aGlsZSAoaWR4ID49IDEgJiYgZWxlbWVudC5kZXB0aCA+PSBzdGFydERlcHRoKSB7XG4gICAgICBpZHggLT0gMTtcbiAgICAgIGVsZW1lbnQgPSBuZXdOb2Rlc1tpZHhdO1xuICAgICAgaWYgKGVsZW1lbnQuZGVwdGggPT09IHN0YXJ0RGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgICAgICA/IGVsZW1lbnQub3AuY291bnRlcnBhcnRcbiAgICAgICAgICA6IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSBcImluc2VydFwiID8gXCJpbnNlcnRfaWdub3JlXCIgOiBcImluc2VydFwiO1xuICAgICAgeC5vcCA9IHsgdHlwZSwgdGFyZ2V0LCBhZnRlcjogeC5nZXRCZWZvcmUoKSB9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gWy4uLm9sZE5vZGVzLCAuLi5uZXdOb2Rlc107XG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IHJlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzIH0gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MoXG4gICAgcHJvY2VzcyxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGRvbSxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY29udHJvbGxlckZhY3RvcnkiLCJwcmVwYXJlUmVmcmVzaFByb2Nlc3MiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsImdldFVybFBhcmFtIiwicHJlcGFyZURhdGEiLCJhcHAiLCJ0cmlnZ2VyIiwiaHRtbEZpbGVzIiwiREFUQV9DT05UUk9MTEVSX0tFWSIsIkNPTlRST0xMRVJfQ0xBU1MiLCJjbGVhbkNhY2hlIiwiZmluZFNkY1RncyIsIiRjb250YWluZXIiLCJ0YWdOYW1lTGlzdCIsInBhcmVudENvbnRyb2xsZXIiLCIkY2hpbGRyZW4iLCJjaGlsZHJlbiIsImVtcHR5TGlzdCIsImVhY2giLCJfIiwiZWxlbWVudCIsIiRlbGVtZW50IiwiJCIsInRhZ05hbWUiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJzcGxpdCIsImluQXJyYXkiLCJwdXNoIiwidGFnIiwic3VwZXIiLCJzcGxpY2UiLCJkb20iLCJzdGFydHNXaXRoIiwiYWRkQ2xhc3MiLCJfdXVpZCIsImNvbmNhdCIsInJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIiLCJjb250cm9sbGVyIiwidXJsIiwidXJsVmFsdWVzIiwia2V5X2lkeCIsIl91cmxQYXJhbXMiLCJoYXNPd25Qcm9wZXJ0eSIsImtleSIsInJlIiwiUmVnRXhwIiwicmVwbGFjZSIsInNoaWZ0IiwibG9hZEhUTUxGaWxlIiwiYXJncyIsImNvbnRlbnRVcmwiLCJfdGFnTmFtZSIsImNvbnRlbnRSZWxvYWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlZFUlNJT04iLCJfbWV0aG9kIiwiZ2V0IiwidGhlbiIsImRhdGEiLCJjYXRjaCIsImVyciIsInN0YXR1cyIsInJlc3BvbnNlSlNPTiIsImNvbmZpcm1QYWdlTG9hZGVkIiwiY29udHJvbGxlcl9uYW1lIiwicmVzcG9uc2VUZXh0IiwicmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJwcm9jZXNzIiwicmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJ0YWdOYW1lcyIsInBhcnNlQ29udGVudFVybCIsImxlbmd0aCIsIm1hdGNoZXMiLCJleGVjIiwicGFyYW1zIiwicGFyc2VkQ29udGVudFVybCIsImdldENvbnRyb2xsZXIiLCIkZWxlbSIsImhhc0NsYXNzIiwiY2xvc2VzdCIsImxvYWRGaWxlc0Zyb21Db250cm9sbGVyIiwiZ2V0RWxlbWVudHMiLCJhbGwiLCJyZXN1bHRzIiwiaHRtbEZpbGUiLCJhcHBlbmQiLCJyZWxvYWRIVE1MQ29udHJvbGxlciIsInJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwic3VwZXJUYWdOYW1lTGlzdCIsInJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCIsIiRodG1sIiwiZW1wdHkiLCJhdHRyIiwibWl4aW5LZXkiLCJfbWl4aW5zIiwidGFnTGlzdCIsInRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMiLCJ0YWdDb3VudCIsImVsZW1lbnRJbmRleCIsInJlbG9hZE1ldGhvZEhUTUwiLCJfcmVsb2FkTWV0aG9kSFRNTCIsIiRkb20iLCJwbGlzdCIsImZpbmQiLCIkdGhpcyIsInJlc3VsdCIsInVuZGVmaW5lZCIsImNvbnRyb2xsZXJfaGFuZGxlciIsIm5ld0RhdGEiLCJiaW5kIiwieCIsIiRuZXdDb250ZW50IiwiaHRtbCIsInJlY29uY2lsZSIsImdldE5vZGVLZXkiLCJub2RlIiwibm9kZVR5cGUiLCJub2RlVmFsdWUiLCJyZXMiLCJub2RlTmFtZSIsImZvckVhY2giLCJkZWZhdWx0VmFsdWUiLCJqb2luIiwicmVjb25jaWxlVHJlZSIsImlkIiwicGFyZW50Iiwib2JqIiwiZGVwdGgiLCJpZHgiLCJnZXRSZWFsUGFyZW50IiwiZ2V0SWR4IiwiTWF0aCIsIm1heCIsImluZGV4Iiwib3AiLCJjb250ZW50cyIsInRvQXJyYXkiLCJtYXAiLCJzbGljZSIsImZsYXQiLCIkdmlydHVhbE5vZGUiLCIkcmVhbE5vZGUiLCIkb2xkIiwiJG5ldyIsImkiLCJvcF9zdGVwcyIsImxjYkRpZmYiLCJ0b1JlbW92ZSIsIndpbmRvdyIsIk1BSU4iLCJPUFMiLCJvcF9zdGVwIiwidHlwZSIsImNJZHgiLCJjb3VudGVycGFydCIsImVsZW1CZWZvcmUiLCJnZXRCZWZvcmUiLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJzeW5jQXR0cmlidXRlcyIsInNhZmVSZW1vdmUiLCJhZnRlciIsInRhcmdldCIsIiRyZWFsIiwiJHZpcnR1YWwiLCJyZWFsQXR0cnMiLCJhdHRyaWJ1dGVzIiwidmlydHVhbEF0dHJzIiwiaXMiLCJuYW1lIiwicmVtb3ZlQXR0ciIsInZhbHVlIiwicmVtb3ZlRGF0YSIsIk9iamVjdCIsImVudHJpZXMiLCJvbGROb2RlcyIsIm5ld05vZGVzIiwiZmlsdGVyIiwibmV3Tm9kZSIsIm9sZE5vZGUiLCJ0ZW1wT2xkTm9kZSIsImtlZXBUcmVlQnJhbmNoIiwic3RhcnREZXB0aCIsInRhZ2dlZCIsInNvcnQiLCJhIiwiYiIsImFWYWwiLCJiVmFsIiwicmVmcmVzaCIsImxlYWZDb250cm9sbGVyIiwicmVmcmVzaFByb2Nlc3MiLCJpc1J1bm5pbmdQcm9jZXNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
137
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\n }\n });\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n const val = urlValues[key];\n if (!val) {\n console.warn(`${key} is not set for controller ${controller._tagName}`);\n }\n url = url.replace(re, val);\n }\n }\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const {\n contentUrl,\n _tagName,\n contentReload\n } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n return $.get(contentUrl, args).then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n return data;\n }).catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", data[\"url-link\"]);\n }\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", {\n controller_name: () => err.status\n });\n }\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while (matches = re.exec(url)) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n let {\n args,\n params\n } = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n controller.parsedContentUrl = url;\n return {\n url: url,\n args\n };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n return null;\n });\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n return new Promise(resolve => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n return replaceAllTagElementsInContainer(controller.$container, controller, process);\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName.toLowerCase().replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data(), controller);\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this.children(), process);\n }));\n }\n });\n return Promise.all(plist);\n}\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [[\"name\", \"\"], [\"type\", \"text\"], [\"id\", \"\"]].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\nfunction reconcileTree({\n $element,\n id = [],\n parent = null\n}) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(0, (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1);\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj\n })).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({\n $element: $realNode\n });\n const $new = reconcileTree({\n $element: $virtualNode\n });\n $old.map((x, i) => x.idx = i);\n $new.map((x, i) => x.idx = i);\n const depth = Math.max(...$new.concat($old).map(x => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\n if (op.type === \"keep_counterpart\") {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\n}\nfunction syncAttributes($real, $virtual) {\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach(attr => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach(attr => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: \"keep\",\n idx: newNode.idx\n };\n newNode.op = {\n type: \"keep_counterpart\",\n counterpart: oldNode\n };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: \"delete\",\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\" ? element.parent.op.counterpart : element.parent;\n }\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\" ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsTUFBTTtNQUN2RSxJQUFJLENBQUN1SSxnQkFBZ0IsRUFBRTtRQUNyQmxNLGtGQUE4QixDQUFDaU0sY0FBYyxDQUFDO01BQ2hEO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3ZpZXcuanM/MjRiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzLFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoLFxufSBmcm9tIFwiLi9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW0sIHByZXBhcmVEYXRhIH0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbi8qKlxuICogTGlzdCBvZiBIVE1MIGZpbGVzLlxuICogQHR5cGUge3t9fVxuICovXG5sZXQgaHRtbEZpbGVzID0ge307XG5cbmV4cG9ydCBjb25zdCBEQVRBX0NPTlRST0xMRVJfS0VZID0gXCJfY29udHJvbGxlcl9cIjtcbmV4cG9ydCBjb25zdCBDT05UUk9MTEVSX0NMQVNTID0gXCJfc2RjX2NvbnRyb2xsZXJfXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuICBodG1sRmlsZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBmaW5kU2RjVGdzIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBJdCBjb2xsZWN0cyBhbGwgdGhvc2VcbiAqIGRvbXMgYW5kIHJldHVybnMgYSBsaXN0IG9mIG9iamVjdHMgY29udGFpbmluZyBhbHNvIHRoZSB0YWcgbmFtZSB0aGUgZG9tIGFuZCB0aGUgdGFnXG4gKiBuYW1lcyBvZiB0aGUgc3VwZXIgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0galF1ZXJ5IGNvbnRhaW5lclxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdOYW1lTGlzdCAtIGEgc3RyaW5nIGxpc3Qgd2l0aCB0YWcgbmFtZXMuXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gY29udHJvbGxlciBpbiBzdXJyb3VuZGluZ1xuICogQHJldHVybiB7QXJyYXl9IC0gYSBhcnJheSBvZiBvYmplY3RzIHdpdGggYWxsIHJlZ2lzdGVyIHRhZ3MgZm91bmRcbiAqL1xuZnVuY3Rpb24gZmluZFNkY1RncygkY29udGFpbmVyLCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlcikge1xuICBpZiAoISRjb250YWluZXIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0ICRjaGlsZHJlbiA9ICRjb250YWluZXIuY2hpbGRyZW4oKTtcbiAgbGV0IGVtcHR5TGlzdCA9IFtdO1xuICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgbGV0IHRhZ05hbWUgPSAkZWxlbWVudC5wcm9wKFwidGFnTmFtZVwiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiX1wiKTtcbiAgICBpZiAoJC5pbkFycmF5KHRhZ05hbWVbMF0sIHRhZ05hbWVMaXN0KSA+PSAwKSB7XG4gICAgICBlbXB0eUxpc3QucHVzaCh7XG4gICAgICAgIHRhZzogdGFnTmFtZVswXSxcbiAgICAgICAgc3VwZXI6IHRhZ05hbWUuc3BsaWNlKDEpIHx8IFtdLFxuICAgICAgICBkb206ICRlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YWdOYW1lWzBdLnN0YXJ0c1dpdGgoXCJ0aGlzLlwiKSkge1xuICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoXG4gICAgICAgIGBfYmluZF90b191cGRhdGVfaGFuZGxlciBzZGNfdXVpZF8ke3BhcmVudENvbnRyb2xsZXIuX3V1aWR9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtcHR5TGlzdCA9IGVtcHR5TGlzdC5jb25jYXQoXG4gICAgICAgIGZpbmRTZGNUZ3MoJGVsZW1lbnQsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZW1wdHlMaXN0O1xufVxuXG4vKipcbiAqIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIgZmlsbHMgdGhlIHBhcmFtZXRlciBvZiB0aGUgY29udGVudFxuICogdXJsIHRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgdGFnIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEBwYXJhbSB1cmwgLSB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMXG4gKiBAcGFyYW0gdXJsVmFsdWVzIC0gdmFsdWVzIGZvciB0aGUgdXJsIHBsYWNlaG9sZGVyLiBJbiBzYW1lIG9yZGVyISFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyKGNvbnRyb2xsZXIsIHVybCwgdXJsVmFsdWVzKSB7XG4gIGZvciAobGV0IGtleV9pZHggaW4gY29udHJvbGxlci5fdXJsUGFyYW1zKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXlfaWR4KSkge1xuICAgICAgbGV0IGtleSA9IGNvbnRyb2xsZXIuX3VybFBhcmFtc1trZXlfaWR4XTtcbiAgICAgIGxldCByZSA9IFJlZ0V4cChcIiVcXFxcKFwiICsga2V5ICsgXCJcXFxcKVxcXFx3XCIsIFwiZ21cIik7XG4gICAgICBjb25zdCB2YWwgPSB1cmxWYWx1ZXNba2V5XTtcbiAgICAgIGlmKCF2YWwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2tleX0gaXMgbm90IHNldCBmb3IgY29udHJvbGxlciAkeyBjb250cm9sbGVyLl90YWdOYW1lIH1gKTtcbiAgICAgIH1cbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCB2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgY29udGVudCBVUkwgZnJvbSB0aGUgY29udHJvbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gZ2V0IGFyZ3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnl8Qm9vbGVhbj59IC0gd2FpdHMgZm9yIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGFyZ3MpIHtcbiAgY29uc3QgeyBjb250ZW50VXJsLCBfdGFnTmFtZSwgY29udGVudFJlbG9hZCB9ID0gY29udHJvbGxlcjtcbiAgaWYgKCFjb250ZW50VXJsKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH0gZWxzZSBpZiAoaHRtbEZpbGVzW190YWdOYW1lXSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaHRtbEZpbGVzW190YWdOYW1lXSk7XG4gIH1cblxuICBhcmdzLlZFUlNJT04gPSBhcHAuVkVSU0lPTjtcbiAgYXJncy5fbWV0aG9kID0gXCJjb250ZW50XCI7XG5cbiAgcmV0dXJuICQuZ2V0KGNvbnRlbnRVcmwsIGFyZ3MpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmICghY29udGVudFJlbG9hZCkge1xuICAgICAgICBodG1sRmlsZXNbX3RhZ05hbWVdID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDMwMSkge1xuICAgICAgICBjb25zdCBkYXRhID0gZXJyLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgdHJpZ2dlcihcIl9SZWRpcmVjdE9uVmlld1wiLCBkYXRhW1widXJsLWxpbmtcIl0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyLmNvbmZpcm1QYWdlTG9hZGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJpZ2dlcihcIm5hdkxvYWRlZFwiLCB7IGNvbnRyb2xsZXJfbmFtZTogKCkgPT4gZXJyLnN0YXR1cyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIHJlcGxhY2VzIGFsbCByZWdpc3RlcmVkIHRhZ3MgYnkgdGhlIGNvbnRyb2xsZXIuXG4gKiBJbiB0aGlzIHN0ZXAgdGhlIGxpZmUtY3ljbGUgc3RhcnRzLlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0gZ2l2ZW4gY29udGFpbmVyXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gcGFyZW50IGNvbnRvbGxlciBzdXJyb3VuZGVkIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkY29udGFpbmVyLFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzID0gbnVsbCxcbikge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGNvbnRhaW5lcixcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcGFyc2VDb250ZW50VXJsIHVzZXMgdGhlIGNvbnRlbnQgVVJMIHByZWZpeCB0byBtYXJnZSB0aGVcbiAqIGNvcnJlY3QgVVJMLiBBbHNvIHBhcnNlcyB0aGUgdXJsIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHJldHVybnMge3t1cmw6IFN0cmluZywgYXJnczogQXJyYXl9fSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpIHtcbiAgbGV0IHVybCA9IGNvbnRyb2xsZXIuY29udGVudFVybDtcbiAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGxldCByZSA9IC8lXFwoKFteKV0rKVxcKVxcdy9nbTtcbiAgICBsZXQgbWF0Y2hlcztcbiAgICBjb250cm9sbGVyLl91cmxQYXJhbXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoZXMgPSByZS5leGVjKHVybCkpKSB7XG4gICAgICBjb250cm9sbGVyLl91cmxQYXJhbXMucHVzaChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgYXJncywgcGFyYW1zIH0gPSBnZXRVcmxQYXJhbShjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpO1xuICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCkge1xuICAgIHVybCA9IHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCBwYXJhbXMpO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJzZWRDb250ZW50VXJsID0gdXJsO1xuXG4gIHJldHVybiB7IHVybDogdXJsLCBhcmdzIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVyKCRlbGVtKSB7XG4gIGlmICgkZWxlbS5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgIHJldHVybiAkZWxlbS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gIH1cbiAgcmV0dXJuICRlbGVtLmNsb3Nlc3QoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xufVxuXG4vKipcbiAqIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICogVGhlIGNvbnRlbnQgaXMgc2F2ZWQgYXMgalF1ZXJ5IG9iamVjdCB0byB0aGUgY29udHJvbGxlci4kY29udGVudCBwcm9wZXJ0eSBvZlxuICogdGhlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgbGV0IGdldEVsZW1lbnRzID0geyBhcmdzOiB7fSB9O1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtsb2FkSFRNTEZpbGUoY29udHJvbGxlciwgZ2V0RWxlbWVudHMuYXJncyldKS50aGVuKFxuICAgIGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBsZXQgaHRtbEZpbGUgPSByZXN1bHRzWzBdO1xuICAgICAgaWYgKGh0bWxGaWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICQoaHRtbEZpbGUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gJChcIjxkaXY+PC9kaXY+XCIpLmFwcGVuZChodG1sRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gICAgcmV0dXJuIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmUoJCgpKTtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdFxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5mdW5jdGlvbiBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MsXG4pIHtcbiAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICBpZiAoY29udHJvbGxlcikge1xuICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gIH1cblxuXG4gIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyRmFjdG9yeShcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICRlbGVtZW50LFxuICAgIHRhZ05hbWUsXG4gICAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgKTtcbiAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBjb250cm9sbGVyKTtcbiAgJGVsZW1lbnQuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gIHJldHVybiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuLyoqXG4gKiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQgZW1wdGllcyB0aGUgcmVnaXN0ZXJlZCB0YWcgYW5kIHJlcGxhY2VzIGl0IGJ5IHRoZSBjb250cm9sbGVyXG4gKiBjb250ZW50LiBJdCBzZXRzIHRoZSBDU1MgdGFncyBmb3IgdGhlIHJlbGF0aW9uIHdpdGggdGhlIENTUyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHBhcmFtIHtqcXVlcnl9ICRodG1sIC0galF1ZXJ5IGxvYWRlZCBjb250ZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCRodG1sICYmICRodG1sLmxlbmd0aCA+IDApIHtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuZW1wdHkoKTtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXR0cihjb250cm9sbGVyLl90YWdOYW1lLCBcIlwiKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiBjb250cm9sbGVyLl9taXhpbnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX21peGluc1ttaXhpbktleV0uX3RhZ05hbWUsIFwiXCIpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgY29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG4vKipcbiAqIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBGb3IgZWFjaCByZWdpc3RlcmVkIHRhZyBpdCBsb2FkcyB0aGUgY29udGVudC5cbiAqIEFmdGVyd2FyZHMgaXQgc3RhcnRzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjb250cm9sbGVyLiBJIHRoZSBuZXh0IHN0ZXAgaXQgc3RhcnRzIHRoZVxuICogcHJvY2VkdXJlIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIgdGFnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTGlzdCAtIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgdGFnc1xuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyIHRvIGZpbmQgdGhlIHRhZ3NcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gIHRhZ0xpc3QsXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MsXG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKFxuICAgICAgJGNvbnRhaW5lcixcbiAgICAgIHRhZ0xpc3QsXG4gICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICk7XG4gICAgbGV0IHRhZ0NvdW50ID0gdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgIGxldCBlbGVtZW50SW5kZXggPSAwO1xuICAgICAgZWxlbWVudEluZGV4IDwgdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG4gICAgICBlbGVtZW50SW5kZXgrK1xuICAgICkge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5kb20sXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS50YWcsXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5zdXBlcixcbiAgICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAgICAgcHJvY2VzcyxcbiAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgIHRhZ0NvdW50LS07XG4gICAgICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRjb250YWluZXIsIHByb2Nlc3MpIHtcbiAgcmV0dXJuIF9yZWxvYWRNZXRob2RIVE1MKFxuICAgIGNvbnRyb2xsZXIsXG4gICAgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGRvbSwgcHJvY2Vzcykge1xuICBjb25zdCBwbGlzdCA9IFtdO1xuXG4gICRkb21cbiAgICAuZmluZChgLl9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyLnNkY191dWlkXyR7Y29udHJvbGxlci5fdXVpZH1gKVxuICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoYF93aXRoX2hhbmRsZXJgKSkge1xuICAgICAgICByZXN1bHQgPSAkdGhpcy5kYXRhKFwiaGFuZGxlclwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb250cm9sbGVyX2hhbmRsZXIgPSB0aGlzLnRhZ05hbWVcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5yZXBsYWNlKC9edGhpcy4vLCBcIlwiKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXSkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBwcmVwYXJlRGF0YSgkdGhpcy5kYXRhKCksIGNvbnRyb2xsZXIpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZChjb250cm9sbGVyKShuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcGxpc3QucHVzaChcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKCh4KSA9PiB7XG4gICAgICAgICAgICBsZXQgJG5ld0NvbnRlbnQgPSAkKGA8ZGl2PjwvZGl2PmApO1xuICAgICAgICAgICAgJG5ld0NvbnRlbnQuYXBwZW5kKHgpO1xuXG4gICAgICAgICAgICBpZiAoJHRoaXMuaHRtbCgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICR0aGlzLmFwcGVuZChcIjxkaXY+PC9kaXY+XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShcbiAgICAgICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgJG5ld0NvbnRlbnQsXG4gICAgICAgICAgICAgICR0aGlzLmNoaWxkcmVuKCksXG4gICAgICAgICAgICAgIHByb2Nlc3MsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChwbGlzdCk7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZVswXS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBgVEVYVF9fJHtub2RlWzBdLm5vZGVWYWx1ZX1gO1xuICB9XG4gIGNvbnN0IHJlcyA9IFtub2RlWzBdLnRhZ05hbWVdO1xuICBpZiAobm9kZVswXS5ub2RlTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgW1xuICAgICAgW1wibmFtZVwiLCBcIlwiXSxcbiAgICAgIFtcInR5cGVcIiwgXCJ0ZXh0XCJdLFxuICAgICAgW1wiaWRcIiwgXCJcIl0sXG4gICAgXS5mb3JFYWNoKChba2V5LCBkZWZhdWx0VmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyKGtleSkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgcmVzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcy5qb2luKFwiX19cIik7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudCwgaWQgPSBbXSwgcGFyZW50ID0gbnVsbCB9KSB7XG4gIGlkLnB1c2goZ2V0Tm9kZUtleSgkZWxlbWVudCkpO1xuICBjb25zdCBvYmogPSB7XG4gICAgJGVsZW1lbnQsXG4gICAgaWQ6IGlkLmpvaW4oXCI6OlwiKSxcbiAgICBkZXB0aDogaWQubGVuZ3RoLFxuICAgIGlkeDogMCxcbiAgICBnZXRSZWFsUGFyZW50OiAoKSA9PiBwYXJlbnQsXG4gICAgZ2V0SWR4OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlkeCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAodGhpcy5nZXRSZWFsUGFyZW50KCk/LmdldElkeCgpID8/IC0xKSArICRlbGVtZW50LmluZGV4KCkgKyAxLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9LFxuICAgIG9wOiBudWxsLFxuICAgIHBhcmVudCxcbiAgfTtcbiAgb2JqLmdldElkeC5iaW5kKG9iaik7XG4gIHJldHVybiBbb2JqXS5jb25jYXQoXG4gICAgJGVsZW1lbnRcbiAgICAgIC5jb250ZW50cygpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKCh4KSA9PlxuICAgICAgICByZWNvbmNpbGVUcmVlKHtcbiAgICAgICAgICAkZWxlbWVudDogJCh4KSxcbiAgICAgICAgICBpZDogaWQuc2xpY2UoKSxcbiAgICAgICAgICBwYXJlbnQ6IG9iaixcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuZmxhdCgpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKSB7XG4gIGNvbnN0ICRvbGQgPSByZWNvbmNpbGVUcmVlKHsgJGVsZW1lbnQ6ICRyZWFsTm9kZSB9KTtcbiAgY29uc3QgJG5ldyA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHZpcnR1YWxOb2RlIH0pO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICAkbmV3Lm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICBjb25zdCBkZXB0aCA9IE1hdGgubWF4KC4uLiRuZXcuY29uY2F0KCRvbGQpLm1hcCgoeCkgPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3QgeyBvcCwgJGVsZW1lbnQsIGlkeCB9ID0gb3Bfc3RlcDtcblxuICAgIGlmIChvcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIikge1xuICAgICAgbGV0IGNJZHggPSBvcC5jb3VudGVycGFydC5nZXRJZHgoKTtcbiAgICAgIGlmIChjSWR4ICE9PSBpZHgpIHtcbiAgICAgICAgY29uc3QgZWxlbUJlZm9yZSA9IG9wX3N0ZXAuZ2V0QmVmb3JlKCk7XG4gICAgICAgIGlmICghZWxlbUJlZm9yZSkge1xuICAgICAgICAgIG9wX3N0ZXAuZ2V0UmVhbFBhcmVudCgpLiRlbGVtZW50LnByZXBlbmQob3AuY291bnRlcnBhcnQuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50Lmluc2VydEFmdGVyKGVsZW1CZWZvcmUuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN5bmNBdHRyaWJ1dGVzKG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50LCAkZWxlbWVudCk7XG4gICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKS4kY29udGFpbmVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQ7XG4gICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRvUmVtb3ZlLnB1c2goJGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJkZWxldGVcIikge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgY29uc3QgeyBhZnRlciwgdGFyZ2V0IH0gPSBvcF9zdGVwLm9wO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICRlbGVtZW50Lmluc2VydEFmdGVyKGFmdGVyLiRlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC4kZWxlbWVudC5wcmVwZW5kKCRlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRvUmVtb3ZlLmZvckVhY2goKCRlbGVtZW50KSA9PiAkZWxlbWVudC5zYWZlUmVtb3ZlKCkpO1xufVxuXG5mdW5jdGlvbiBzeW5jQXR0cmlidXRlcygkcmVhbCwgJHZpcnR1YWwpIHtcbiAgY29uc3QgcmVhbEF0dHJzID0gJHJlYWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgY29uc3QgdmlydHVhbEF0dHJzID0gJHZpcnR1YWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgLy8gUmVtb3ZlIG1pc3NpbmcgYXR0cnNcbiAgWy4uLnJlYWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghJHZpcnR1YWwuaXMoYFske2F0dHIubmFtZX1dYCkpIHtcbiAgICAgICRyZWFsLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCBvciB1cGRhdGVcbiAgWy4uLnZpcnR1YWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXNcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmRlcHRoID09PSBkZXB0aCAmJiAheC5vcClcbiAgICAuZm9yRWFjaCgobmV3Tm9kZSkgPT4ge1xuICAgICAgY29uc3Qgb2xkTm9kZSA9IG9sZE5vZGVzLmZpbmQoKHRlbXBPbGROb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICAgIG9sZE5vZGUub3AgPSB7IHR5cGU6IFwia2VlcFwiLCBpZHg6IG5ld05vZGUuaWR4IH07XG4gICAgICAgICAgbmV3Tm9kZS5vcCA9IHsgdHlwZTogXCJrZWVwX2NvdW50ZXJwYXJ0XCIsIGNvdW50ZXJwYXJ0OiBvbGROb2RlIH07XG4gICAgICAgICAgb2xkTm9kZSA9IG9sZE5vZGUucGFyZW50O1xuICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudDtcbiAgICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIGlmIChkZXB0aCA+IDEpIHtcbiAgICByZXR1cm4gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoIC0gMSk7XG4gIH1cblxuICBvbGROb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgaWYgKCF4Lm9wKSB7XG4gICAgICBjb25zdCBpZHggPSAob2xkTm9kZXNbaSAtIDFdPy5vcC5pZHggPz8gLTEpICsgMTtcbiAgICAgIHgub3AgPSB7IHR5cGU6IFwiZGVsZXRlXCIsIGlkeCB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIlxuICAgICAgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydFxuICAgICAgOiBlbGVtZW50LnBhcmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJlZm9yZShlbGVtZW50LCBpZHgpIHtcbiAgICBjb25zdCBzdGFydERlcHRoID0gZWxlbWVudC5kZXB0aDtcbiAgICB3aGlsZSAoaWR4ID49IDEgJiYgZWxlbWVudC5kZXB0aCA+PSBzdGFydERlcHRoKSB7XG4gICAgICBpZHggLT0gMTtcbiAgICAgIGVsZW1lbnQgPSBuZXdOb2Rlc1tpZHhdO1xuICAgICAgaWYgKGVsZW1lbnQuZGVwdGggPT09IHN0YXJ0RGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgICAgICA/IGVsZW1lbnQub3AuY291bnRlcnBhcnRcbiAgICAgICAgICA6IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSBcImluc2VydFwiID8gXCJpbnNlcnRfaWdub3JlXCIgOiBcImluc2VydFwiO1xuICAgICAgeC5vcCA9IHsgdHlwZSwgdGFyZ2V0LCBhZnRlcjogeC5nZXRCZWZvcmUoKSB9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gWy4uLm9sZE5vZGVzLCAuLi5uZXdOb2Rlc107XG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IHJlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzIH0gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MoXG4gICAgcHJvY2VzcyxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGRvbSxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY29udHJvbGxlckZhY3RvcnkiLCJwcmVwYXJlUmVmcmVzaFByb2Nlc3MiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsImdldFVybFBhcmFtIiwicHJlcGFyZURhdGEiLCJhcHAiLCJ0cmlnZ2VyIiwiaHRtbEZpbGVzIiwiREFUQV9DT05UUk9MTEVSX0tFWSIsIkNPTlRST0xMRVJfQ0xBU1MiLCJjbGVhbkNhY2hlIiwiZmluZFNkY1RncyIsIiRjb250YWluZXIiLCJ0YWdOYW1lTGlzdCIsInBhcmVudENvbnRyb2xsZXIiLCIkY2hpbGRyZW4iLCJjaGlsZHJlbiIsImVtcHR5TGlzdCIsImVhY2giLCJfIiwiZWxlbWVudCIsIiRlbGVtZW50IiwiJCIsInRhZ05hbWUiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJzcGxpdCIsImluQXJyYXkiLCJwdXNoIiwidGFnIiwic3VwZXIiLCJzcGxpY2UiLCJkb20iLCJzdGFydHNXaXRoIiwiYWRkQ2xhc3MiLCJfdXVpZCIsImNvbmNhdCIsInJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIiLCJjb250cm9sbGVyIiwidXJsIiwidXJsVmFsdWVzIiwia2V5X2lkeCIsIl91cmxQYXJhbXMiLCJoYXNPd25Qcm9wZXJ0eSIsImtleSIsInJlIiwiUmVnRXhwIiwidmFsIiwiY29uc29sZSIsIndhcm4iLCJfdGFnTmFtZSIsInJlcGxhY2UiLCJsb2FkSFRNTEZpbGUiLCJhcmdzIiwiY29udGVudFVybCIsImNvbnRlbnRSZWxvYWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlZFUlNJT04iLCJfbWV0aG9kIiwiZ2V0IiwidGhlbiIsImRhdGEiLCJjYXRjaCIsImVyciIsInN0YXR1cyIsInJlc3BvbnNlSlNPTiIsImNvbmZpcm1QYWdlTG9hZGVkIiwiY29udHJvbGxlcl9uYW1lIiwicmVzcG9uc2VUZXh0IiwicmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJwcm9jZXNzIiwicmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJ0YWdOYW1lcyIsInBhcnNlQ29udGVudFVybCIsImxlbmd0aCIsIm1hdGNoZXMiLCJleGVjIiwicGFyYW1zIiwicGFyc2VkQ29udGVudFVybCIsImdldENvbnRyb2xsZXIiLCIkZWxlbSIsImhhc0NsYXNzIiwiY2xvc2VzdCIsImxvYWRGaWxlc0Zyb21Db250cm9sbGVyIiwiZ2V0RWxlbWVudHMiLCJhbGwiLCJyZXN1bHRzIiwiaHRtbEZpbGUiLCJhcHBlbmQiLCJyZWxvYWRIVE1MQ29udHJvbGxlciIsInJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwic3VwZXJUYWdOYW1lTGlzdCIsInJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCIsIiRodG1sIiwiZW1wdHkiLCJhdHRyIiwibWl4aW5LZXkiLCJfbWl4aW5zIiwidGFnTGlzdCIsInRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMiLCJ0YWdDb3VudCIsImVsZW1lbnRJbmRleCIsInJlbG9hZE1ldGhvZEhUTUwiLCJfcmVsb2FkTWV0aG9kSFRNTCIsIiRkb20iLCJwbGlzdCIsImZpbmQiLCIkdGhpcyIsInJlc3VsdCIsInVuZGVmaW5lZCIsImNvbnRyb2xsZXJfaGFuZGxlciIsIm5ld0RhdGEiLCJiaW5kIiwieCIsIiRuZXdDb250ZW50IiwiaHRtbCIsInJlY29uY2lsZSIsImdldE5vZGVLZXkiLCJub2RlIiwibm9kZVR5cGUiLCJub2RlVmFsdWUiLCJyZXMiLCJub2RlTmFtZSIsImZvckVhY2giLCJkZWZhdWx0VmFsdWUiLCJqb2luIiwicmVjb25jaWxlVHJlZSIsImlkIiwicGFyZW50Iiwib2JqIiwiZGVwdGgiLCJpZHgiLCJnZXRSZWFsUGFyZW50IiwiZ2V0SWR4IiwiTWF0aCIsIm1heCIsImluZGV4Iiwib3AiLCJjb250ZW50cyIsInRvQXJyYXkiLCJtYXAiLCJzbGljZSIsImZsYXQiLCIkdmlydHVhbE5vZGUiLCIkcmVhbE5vZGUiLCIkb2xkIiwiJG5ldyIsImkiLCJvcF9zdGVwcyIsImxjYkRpZmYiLCJ0b1JlbW92ZSIsIndpbmRvdyIsIk1BSU4iLCJPUFMiLCJvcF9zdGVwIiwidHlwZSIsImNJZHgiLCJjb3VudGVycGFydCIsImVsZW1CZWZvcmUiLCJnZXRCZWZvcmUiLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJzeW5jQXR0cmlidXRlcyIsInNhZmVSZW1vdmUiLCJhZnRlciIsInRhcmdldCIsIiRyZWFsIiwiJHZpcnR1YWwiLCJyZWFsQXR0cnMiLCJhdHRyaWJ1dGVzIiwidmlydHVhbEF0dHJzIiwiaXMiLCJuYW1lIiwicmVtb3ZlQXR0ciIsInZhbHVlIiwicmVtb3ZlRGF0YSIsIk9iamVjdCIsImVudHJpZXMiLCJvbGROb2RlcyIsIm5ld05vZGVzIiwiZmlsdGVyIiwibmV3Tm9kZSIsIm9sZE5vZGUiLCJ0ZW1wT2xkTm9kZSIsImtlZXBUcmVlQnJhbmNoIiwic3RhcnREZXB0aCIsInRhZ2dlZCIsInNvcnQiLCJhIiwiYiIsImFWYWwiLCJiVmFsIiwicmVmcmVzaCIsImxlYWZDb250cm9sbGVyIiwicmVmcmVzaFByb2Nlc3MiLCJpc1J1bm5pbmdQcm9jZXNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
138
138
 
139
139
  /***/ }
140
140