sdc_client 0.158.8 → 0.159.0

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +21 -0
  3. package/dist/index.js +49 -24
  4. package/dist/ugly.index.js +2 -1
  5. package/dist/ugly.index.js.LICENSE.txt +1 -8
  6. package/gulp/gulp.jsx +12 -42
  7. package/package.json +39 -31
  8. package/src/index.js +27 -7
  9. package/src/simpleDomControl/AbstractSDC.js +24 -11
  10. package/src/simpleDomControl/sdc_controller.js +7 -4
  11. package/src/simpleDomControl/sdc_dom_events.js +5 -10
  12. package/src/simpleDomControl/sdc_events.js +3 -3
  13. package/src/simpleDomControl/sdc_main.js +34 -13
  14. package/src/simpleDomControl/sdc_model.js +209 -84
  15. package/src/simpleDomControl/sdc_params.js +0 -3
  16. package/src/simpleDomControl/sdc_server_call.js +21 -4
  17. package/src/simpleDomControl/sdc_test_utils.js +0 -1
  18. package/src/simpleDomControl/sdc_utils.js +59 -7
  19. package/src/simpleDomControl/sdc_view.js +21 -1
  20. package/.github/workflows/node.js.yml +0 -38
  21. package/.idea/inspectionProfiles/Project_Default.xml +0 -17
  22. package/.idea/jsLibraryMappings.xml +0 -6
  23. package/.idea/misc.xml +0 -6
  24. package/.idea/modules.xml +0 -8
  25. package/.idea/vcs.xml +0 -6
  26. package/.idea/workspace.xml +0 -403
  27. package/.readthedocs.yaml +0 -13
  28. package/.tool-versions +0 -1
  29. package/SimpleDomControlClient.iml +0 -12
  30. package/docs/api-reference.rst +0 -225
  31. package/docs/conf.py +0 -11
  32. package/docs/controllers.rst +0 -228
  33. package/docs/events-and-dom.rst +0 -120
  34. package/docs/getting-started.rst +0 -143
  35. package/docs/index.rst +0 -22
  36. package/docs/models.rst +0 -351
  37. package/docs/overview.rst +0 -66
  38. package/docs/requirements.txt +0 -1
  39. package/eslint.config.js +0 -60
  40. package/gulpfile.jsx +0 -25
  41. package/jest.config.mjs +0 -197
  42. package/test/controller.test.js +0 -93
  43. package/test/dist.test.js +0 -127
  44. package/test/model.test.js +0 -330
  45. package/test/models/Author.js +0 -145
  46. package/test/models/Book.js +0 -112
  47. package/test/models/BookContent.js +0 -114
  48. package/test/models/SdcUser.js +0 -75
  49. package/test/models/src.js +0 -8
  50. package/test/sdc_model_dates.ai.test.js +0 -57
  51. package/test/sdc_server_call.ai.test.js +0 -267
  52. package/test/utils.js +0 -88
  53. package/test/view.test.js +0 -159
  54. package/test-setup.js +0 -4
  55. package/webpack.config/webpack.default.config.cjs +0 -22
  56. package/webpack.config/webpack.development.config.cjs +0 -14
  57. package/webpack.config/webpack.production.config.cjs +0 -11
package/dist/index.js CHANGED
@@ -8,13 +8,23 @@
8
8
  */
9
9
  /******/ var __webpack_modules__ = ({
10
10
 
11
+ /***/ "./node_modules/js-cookie/dist/js.cookie.mjs"
12
+ /*!***************************************************!*\
13
+ !*** ./node_modules/js-cookie/dist/js.cookie.mjs ***!
14
+ \***************************************************/
15
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16
+
17
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ api)\n/* harmony export */ });\n/*! js-cookie v3.0.8 | MIT */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (key === '__proto__') continue\n target[key] = source[key];\n }\n }\n return target\n}\n\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n\nfunction init(converter, defaultAttributes) {\n function set(name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get(name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n if (!(found in jar)) jar[found] = converter.read(value, found);\n if (name === found) {\n break\n }\n } catch (_e) {\n // Do nothing...\n }\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set: set,\n get: get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLEVBQUU7QUFDdEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsdUVBQXVFO0FBQ3ZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0EsNkNBQTZDO0FBQzdDLE9BQU87QUFDUDtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBLG9CQUFvQix5Q0FBeUM7QUFDN0QsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsV0FBVzs7QUFFcEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5tanM/MDlkYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEganMtY29va2llIHYzLjAuOCB8IE1JVCAqL1xuZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nKSBjb250aW51ZVxuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5pdChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2Ql18NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgZm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAvLyAuLi5cbiAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxuICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAvLyAuLi5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgbmFtZSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwgbmFtZSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFuYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgdmFyIGphciA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgdmFyIHZhbHVlID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZm91bmQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICBpZiAoIShmb3VuZCBpbiBqYXIpKSBqYXJbZm91bmRdID0gY29udmVydGVyLnJlYWQodmFsdWUsIGZvdW5kKTtcbiAgICAgICAgaWYgKG5hbWUgPT09IGZvdW5kKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy4uLlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lID8gamFyW25hbWVdIDogamFyXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICB7XG4gICAgICBzZXQ6IHNldCxcbiAgICAgIGdldDogZ2V0LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzZXQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcbiAgICAgIH0sXG4gICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgIHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgfVxuICApXG59XG5cbnZhciBhcGkgPSBpbml0KGRlZmF1bHRDb252ZXJ0ZXIsIHsgcGF0aDogJy8nIH0pO1xuXG5leHBvcnQgeyBhcGkgYXMgZGVmYXVsdCB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/js-cookie/dist/js.cookie.mjs\n\n}");
18
+
19
+ /***/ },
20
+
11
21
  /***/ "./src/index.js"
12
22
  /*!**********************!*\
13
23
  !*** ./src/index.js ***!
14
24
  \**********************/
15
25
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16
26
 
17
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* reexport safe */ _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__.AbstractSDC),\n/* harmony export */ SdcModel: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ SdcQuerySet: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet),\n/* harmony export */ allOff: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_4__.allOff),\n/* harmony export */ app: () => (/* reexport safe */ _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_5__.checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_5__.clearErrorsInForm),\n/* harmony export */ controllerFactory: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_6__.controllerFactory),\n/* harmony export */ on: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_4__.on),\n/* harmony export */ registerModel: () => (/* reexport safe */ _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__.registerModel),\n/* harmony export */ runControlFlowFunctions: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_6__.runControlFlowFunctions),\n/* harmony export */ setErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_5__.setErrorsInForm),\n/* harmony export */ setEvent: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_4__.setEvent),\n/* harmony export */ socketReconnect: () => (/* binding */ socketReconnect),\n/* harmony export */ test_utils: () => (/* binding */ test_utils),\n/* harmony export */ trigger: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_4__.trigger)\n/* harmony export */ });\n/* harmony import */ var _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./simpleDomControl/sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./simpleDomControl/AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./simpleDomControl/sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./simpleDomControl/sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./simpleDomControl/sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./simpleDomControl/sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./simpleDomControl/sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./simpleDomControl/sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./simpleDomControl/sdc_test_utils.js */ \"./src/simpleDomControl/sdc_test_utils.js\");\n\n\n\n\n\n\n\n\n\nconst socketReconnect = _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_7__.close;\nconst test_utils = {\n get_controller: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_8__.get_controller,\n getCsrfToken: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_8__.getCsrfToken,\n controllerFromTestHtml: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_8__.controllerFromTestHtml\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFtRDtBQUNXO0FBQ1E7QUFDUDtBQU1yQjtBQU1EO0FBSUs7QUFDYztBQUtkO0FBRTlDLE1BQU1rQixlQUFlLEdBQUdKLHVFQUFLO0FBQzdCLE1BQU1LLFVBQVUsR0FBRztFQUFDSixjQUFjO0VBQUVDLFlBQVk7RUFBRUMsc0JBQXNCQSx5RkFBQUE7QUFBQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9pbmRleC5qcz9iNjM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge0Fic3RyYWN0U0RDfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQgU2RjTW9kZWwsIHtTZGNRdWVyeVNldH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfbW9kZWwuanNcIjtcbmltcG9ydCB7cmVnaXN0ZXJNb2RlbH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzXCI7XG5pbXBvcnQge1xuICBvbixcbiAgdHJpZ2dlcixcbiAgYWxsT2ZmLFxuICBzZXRFdmVudCxcbn0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfZXZlbnRzLmpzXCI7XG5cbmltcG9ydCB7XG4gIGNsZWFyRXJyb3JzSW5Gb3JtLFxuICBzZXRFcnJvcnNJbkZvcm0sXG4gIGNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyxcbn0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIGNvbnRyb2xsZXJGYWN0b3J5LFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbn0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHtjbG9zZX0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanNcIjtcbmltcG9ydCB7XG4gIGdldF9jb250cm9sbGVyLFxuICBnZXRDc3JmVG9rZW4sXG4gIGNvbnRyb2xsZXJGcm9tVGVzdEh0bWwsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3Rlc3RfdXRpbHMuanNcIjtcblxuY29uc3Qgc29ja2V0UmVjb25uZWN0ID0gY2xvc2U7XG5jb25zdCB0ZXN0X3V0aWxzID0ge2dldF9jb250cm9sbGVyLCBnZXRDc3JmVG9rZW4sIGNvbnRyb2xsZXJGcm9tVGVzdEh0bWx9O1xuXG5leHBvcnQge1xuICBhcHAsXG4gIEFic3RyYWN0U0RDLFxuICBvbixcbiAgdHJpZ2dlcixcbiAgYWxsT2ZmLFxuICBzZXRFdmVudCxcbiAgY2xlYXJFcnJvcnNJbkZvcm0sXG4gIHNldEVycm9yc0luRm9ybSxcbiAgY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nLFxuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHNvY2tldFJlY29ubmVjdCxcbiAgdGVzdF91dGlscyxcbiAgU2RjTW9kZWwsXG4gIFNkY1F1ZXJ5U2V0LFxuICByZWdpc3Rlck1vZGVsXG59O1xuIl0sIm5hbWVzIjpbImFwcCIsIkFic3RyYWN0U0RDIiwiU2RjTW9kZWwiLCJTZGNRdWVyeVNldCIsInJlZ2lzdGVyTW9kZWwiLCJvbiIsInRyaWdnZXIiLCJhbGxPZmYiLCJzZXRFdmVudCIsImNsZWFyRXJyb3JzSW5Gb3JtIiwic2V0RXJyb3JzSW5Gb3JtIiwiY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nIiwiY29udHJvbGxlckZhY3RvcnkiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsImNsb3NlIiwiZ2V0X2NvbnRyb2xsZXIiLCJnZXRDc3JmVG9rZW4iLCJjb250cm9sbGVyRnJvbVRlc3RIdG1sIiwic29ja2V0UmVjb25uZWN0IiwidGVzdF91dGlscyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/index.js\n\n}");
27
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* reexport safe */ _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__.AbstractSDC),\n/* harmony export */ SdcModel: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ SdcQuerySet: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet),\n/* harmony export */ allOff: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.allOff),\n/* harmony export */ app: () => (/* reexport safe */ _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.clearErrorsInForm),\n/* harmony export */ controllerFactory: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__.controllerFactory),\n/* harmony export */ on: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.on),\n/* harmony export */ registerModel: () => (/* reexport safe */ _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__.registerModel),\n/* harmony export */ runControlFlowFunctions: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__.runControlFlowFunctions),\n/* harmony export */ setErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.setErrorsInForm),\n/* harmony export */ setEvent: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.setEvent),\n/* harmony export */ socketReconnect: () => (/* binding */ socketReconnect),\n/* harmony export */ test_utils: () => (/* binding */ test_utils),\n/* harmony export */ trigger: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)\n/* harmony export */ });\n/* harmony import */ var _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./simpleDomControl/sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./simpleDomControl/AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./simpleDomControl/sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./simpleDomControl/sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! js-cookie */ \"./node_modules/js-cookie/dist/js.cookie.mjs\");\n/* harmony import */ var _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./simpleDomControl/sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./simpleDomControl/sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./simpleDomControl/sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./simpleDomControl/sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./simpleDomControl/sdc_test_utils.js */ \"./src/simpleDomControl/sdc_test_utils.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst socketReconnect = _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_8__.close;\nconst test_utils = {\n get_controller: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.get_controller,\n getCsrfToken: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.getCsrfToken,\n controllerFromTestHtml: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.controllerFromTestHtml,\n logout: () => {\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].remove(\"sessionid\");\n console.log(\"Logged out\");\n },\n login: (user) => {\n const sessionId = globalThis.SDC_TEST_USER?.[user];\n if (!sessionId) {\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].remove(\"sessionid\");\n console.warn(`Unknown test user: ${user}`);\n return false;\n }\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].set(\"sessionid\", sessionId);\n console.log(`Logged in as ${user}`);\n return true;\n },\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBcUQ7QUFDVztBQUNRO0FBQ1A7QUFDakM7QUFNVTs7QUFNRDtBQUlLO0FBQ2dCO0FBS2hCOztBQUU5Qyx3QkFBd0IsdUVBQUs7QUFDN0I7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYztBQUNkLHdCQUF3QjtBQUN4QjtBQUNBLElBQUksaURBQU87QUFDWDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNLGlEQUFPO0FBQ2IseUNBQXlDLEtBQUs7QUFDOUM7QUFDQTtBQUNBLElBQUksaURBQU87QUFDWCxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBLEdBQUc7QUFDSDs7QUFtQkUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL2luZGV4LmpzP2U1ZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTREMgfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQgU2RjTW9kZWwsIHsgU2RjUXVlcnlTZXQgfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXJNb2RlbCB9IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3NvY2tldC5qc1wiO1xuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IHtcbiAgb24sXG4gIHRyaWdnZXIsXG4gIGFsbE9mZixcbiAgc2V0RXZlbnQsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX2V2ZW50cy5qc1wiO1xuXG5pbXBvcnQge1xuICBjbGVhckVycm9yc0luRm9ybSxcbiAgc2V0RXJyb3JzSW5Gb3JtLFxuICBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IGNsb3NlIH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanNcIjtcbmltcG9ydCB7XG4gIGdldF9jb250cm9sbGVyLFxuICBnZXRDc3JmVG9rZW4sXG4gIGNvbnRyb2xsZXJGcm9tVGVzdEh0bWwsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3Rlc3RfdXRpbHMuanNcIjtcblxuY29uc3Qgc29ja2V0UmVjb25uZWN0ID0gY2xvc2U7XG5jb25zdCB0ZXN0X3V0aWxzID0ge1xuICBnZXRfY29udHJvbGxlcixcbiAgZ2V0Q3NyZlRva2VuLFxuICBjb250cm9sbGVyRnJvbVRlc3RIdG1sLFxuICBsb2dvdXQ6ICgpID0+IHtcbiAgICBDb29raWVzLnJlbW92ZShcInNlc3Npb25pZFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxvZ2dlZCBvdXRcIik7XG4gIH0sXG4gIGxvZ2luOiAodXNlcikgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGdsb2JhbFRoaXMuU0RDX1RFU1RfVVNFUj8uW3VzZXJdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBDb29raWVzLnJlbW92ZShcInNlc3Npb25pZFwiKTtcbiAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biB0ZXN0IHVzZXI6ICR7dXNlcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgQ29va2llcy5zZXQoXCJzZXNzaW9uaWRcIiwgc2Vzc2lvbklkKTtcbiAgICBjb25zb2xlLmxvZyhgTG9nZ2VkIGluIGFzICR7dXNlcn1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGFwcCxcbiAgQWJzdHJhY3RTREMsXG4gIG9uLFxuICB0cmlnZ2VyLFxuICBhbGxPZmYsXG4gIHNldEV2ZW50LFxuICBjbGVhckVycm9yc0luRm9ybSxcbiAgc2V0RXJyb3JzSW5Gb3JtLFxuICBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcsXG4gIGNvbnRyb2xsZXJGYWN0b3J5LFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbiAgc29ja2V0UmVjb25uZWN0LFxuICB0ZXN0X3V0aWxzLFxuICBTZGNNb2RlbCxcbiAgU2RjUXVlcnlTZXQsXG4gIHJlZ2lzdGVyTW9kZWwsXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/index.js\n\n}");
18
28
 
19
29
  /***/ },
20
30
 
@@ -24,7 +34,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
24
34
  \*********************************************/
25
35
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
26
36
 
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. Please use this.querySet(modelName, modelQuery)\");\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/fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtTZGNRdWVyeVNldH1cbiAgICovXG4gIHF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgY29uc3QgbmV3UXVlcnlTZXQgPSBuZXcgU2RjUXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5KTtcbiAgICB0aGlzLl9tb2RlbHMucHVzaChuZXdRdWVyeVNldCk7XG4gICAgcmV0dXJuIG5ld1F1ZXJ5U2V0O1xuICB9XG5cbiAgbmV3TW9kZWwobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oXCJuZXdNb2RlbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHNvb24gYmUgcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGlzLnF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSlcIik7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGFwdGVyIHRvIHRoaXMuJGNvbnRhaW5lci5maW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkb21TZWxlY3RvclxuICAgKi9cbiAgZmluZChkb21TZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLiRjb250YWluZXIuZmluZChkb21TZWxlY3Rvcik7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHJldHVybiBhcHAucmVmcmVzaCh0aGlzLiRjb250YWluZXIsIHRoaXMpO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIHJldHVybiBhcHAucmVsb2FkQ29udHJvbGxlcih0aGlzKTtcbiAgfVxuXG4gIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSA9IG51bGwpIHtcbiAgICByZXR1cm4gYXBwLnJlY29uY2lsZSh0aGlzLCAkdmlydHVhbE5vZGUsICRyZWFsTm9kZSk7XG4gIH1cblxuICBzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvcigkZm9ybSwgZSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc3VibWl0TW9kZWxGb3JtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuc3VibWl0TW9kZWxGb3JtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRTdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpO1xuICB9XG5cbiAgaXRlcmF0ZUFsbENoaWxkcmVuKCkge1xuICAgIGxldCBfY2hpbGRDb250cm9sbGVyID0gdGhpcy5fY2hpbGRDb250cm9sbGVyO1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpIGluIF9jaGlsZENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChfY2hpbGRDb250cm9sbGVyLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIGZvciAobGV0IGNjIG9mIF9jaGlsZENvbnRyb2xsZXJbaV0pIHtcbiAgICAgICAgICByZXMucHVzaChjYyk7XG4gICAgICAgICAgcmVzLnB1c2goLi4uY2MuaXRlcmF0ZUFsbENoaWxkcmVuKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgRm9ybSBFdmVudHNcbiAgICovXG4gIGRlZmF1bHRTdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpIHtcbiAgICBpZiAoIXRoaXMuX2lzTWl4aW4pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBsZXQge21vZGVsLCBmb3JtX25hbWV9ID0gJGZvcm0uZGF0YSgpO1xuICAgICAgbGV0IGRhdGEgPSBtb2RlbC5zeW5jRm9ybSgkZm9ybSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcHJvbTtcbiAgICAgICAgaWYgKG1vZGVsLmlkICE9PSBudWxsICYmIG1vZGVsLmlkID49IDApIHtcbiAgICAgICAgICBwcm9tID0gbW9kZWwuc2F2ZSh7Zm9ybU5hbWU6IGZvcm1fbmFtZSwgZGF0YX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5jcmVhdGUoe2RhdGF9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21cbiAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICBjbGVhckVycm9yc0luRm9ybSgkZm9ybSk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyhyZXNbMF0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuaXRlcmF0ZUFsbENoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzICYmXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyhyZXNbMF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb25jaWxlKFxuICAgICAgICAgICAgICAkKGA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+JHtkYXRhLmh0bWx9PC9kaXY+YCksXG4gICAgICAgICAgICAgICRmb3JtLmZpbmQoXCIuY29udGFpbmVyLWZsdWlkXCIpLmZpcnN0KCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvciAmJlxuICAgICAgICAgICAgdGhpcy5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvcihkYXRhKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiB0aGlzLml0ZXJhdGVBbGxDaGlsZHJlbigpKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvcihkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVqZWN0KGRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiYWxsT2ZmIiwiYXBwIiwiU2RjUXVlcnlTZXQiLCJjYWxsU2VydmVyIiwidXVpZHY0IiwiY2xlYXJFcnJvcnNJbkZvcm0iLCJ0YWdOYW1lVG9DYW1lbENhc2UiLCJ0YWdOYW1lVG9SZWFkYWJsZU5hbWUiLCJBYnN0cmFjdFNEQyIsImNvbnN0cnVjdG9yIiwiX3V1aWQiLCJjb250ZW50VXJsIiwiY29udGVudFJlbG9hZCIsInBhcnNlZENvbnRlbnRVcmwiLCJldmVudHMiLCJsb2FkX2FzeW5jIiwiX2lzRXZlbnRzU2V0IiwiX2FsbEV2ZW50cyIsIl9wYXJhbXMiLCJfdXJsUGFyYW1zIiwiX21vZGVscyIsIl9jc3NVcmxzIiwiYWZ0ZXJTaG93IiwiY29uc29sZSIsIndhcm4iLCJfbWl4aW5zIiwiX3RhZ05hbWUiLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9jaGlsZENvbnRyb2xsZXIiLCJfcGFyZW50Q29udHJvbGxlciIsIl9vbkxvYWREb25lIiwiJGNvbnRhaW5lciIsIl9pc01peGluIiwicGFyYW1zIiwiX3J1bkxpZmVjeWNsZSIsIm1ldGhvZCIsImFyZ3MiLCJERUJVRyIsImRlYnVnIiwicmV0dXJuUHJvbWlzc2VzIiwibWl4aW5LZXkiLCJtaXhpbiIsInB1c2giLCJhcHBseSIsIlByb21pc2UiLCJhbGwiLCJ0aGVuIiwib25Jbml0IiwiQXJyYXkiLCJhcmd1bWVudHMiLCJwYXJlbnRDb250cm9sbGVyIiwiY2hpbGRDb250cm9sbGVyIiwib25Mb2FkIiwid2lsbFNob3ciLCJvblJlZnJlc2giLCJvblJlbW92ZSIsIm5vT3Blbk1vZGVsUmVxdWVzdHMiLCJtYXAiLCJ4Iiwibm9PcGVuUmVxdWVzdHMiLCJyZW1vdmUiLCJtb2RlbCIsImNsb3NlIiwiaSIsImhhc093blByb3BlcnR5IiwiY2MiLCJjX25hbWUiLCJhcnIiLCJsZW5ndGgiLCJzcGxpY2UiLCJjb250cm9sbGVyX25hbWUiLCJhZGRFdmVudCIsImV2ZW50Iiwic2VsZWN0b3IiLCJoYW5kbGVyIiwiZ2V0RXZlbnRzIiwiYWxsRXZlbnRzIiwiY29uY2F0IiwiaXNBcnJheSIsIl8iLCJtZXJnZSIsInBvc3QiLCJ1cmwiLCJnZXQiLCJzdWJtaXRGb3JtIiwiZm9ybSIsInN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3Iiwic2VydmVyQ2FsbCIsIm1ldGhvZGUiLCJyZSIsIm1hdGNoIiwiZXJyb3IiLCJuYW1lIiwicXVlcnlTZXQiLCJtb2RlbE5hbWUiLCJtb2RlbFF1ZXJ5IiwibmV3UXVlcnlTZXQiLCJuZXdNb2RlbCIsImZpbmQiLCJkb21TZWxlY3RvciIsInJlZnJlc2giLCJyZWxvYWQiLCJyZWxvYWRDb250cm9sbGVyIiwicmVjb25jaWxlIiwiJHZpcnR1YWxOb2RlIiwiJHJlYWxOb2RlIiwic3VibWl0TW9kZWxGb3JtRGlzdHJpYnV0b3IiLCIkZm9ybSIsImUiLCJfc3VibWl0TW9kZWxGb3JtIiwic3VibWl0TW9kZWxGb3JtIiwiZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSIsIml0ZXJhdGVBbGxDaGlsZHJlbiIsInJlcyIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZm9ybV9uYW1lIiwiZGF0YSIsInN5bmNGb3JtIiwicmVzb2x2ZSIsInJlamVjdCIsInByb20iLCJpZCIsInNhdmUiLCJmb3JtTmFtZSIsImNyZWF0ZSIsInN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MiLCJjb250cm9sbGVyIiwiY2F0Y2giLCIkIiwiaHRtbCIsImZpcnN0Iiwic3VibWl0X21vZGVsX2Zvcm1fZXJyb3IiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
37
+ 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\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._allEvents = null;\n this._autoRedirect = null;\n this._params = {};\n\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 get params() {\n return this._params;\n }\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\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\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n\n /**\n * @deprecated Not called by the runtime since 0.158.7. Read the data-*\n * attributes from ``this.params`` in ``onLoad()`` instead.\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\n set autoRedirect(url){\n this._autoRedirect = url;\n }\n\n get autoRedirect() {\n return this._autoRedirect;\n }\n\n get parentController() {\n return this._parentController;\n }\n\n get childController() {\n return this._childController;\n }\n\n onLoad() {\n return this._runLifecycle(\"onLoad\", arguments);\n }\n\n willShow() {\n return this._runLifecycle(\"willShow\", arguments);\n }\n\n onRefresh() {\n return this._runLifecycle(\"onRefresh\", arguments);\n }\n\n onRemove() {\n this._runLifecycle(\"onRemove\", arguments);\n return true;\n }\n\n noOpenModelRequests() {\n return Promise.all(this._models.map((x) => x.noOpenRequests()));\n }\n\n remove() {\n for (const model of this._models) {\n model.close();\n }\n const { _childController } = this;\n for (let i in _childController) {\n if (Object.hasOwn(_childController, i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\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\n this.$container.remove();\n return true;\n }\n\n return false;\n }\n\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToReadableName)(this._tagName);\n }\n\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\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\n // Merge into a new object: the event maps of the controller and its mixins\n // may be shared between instances and must not be changed.\n return (this._allEvents = _.merge({}, ...allEvents));\n }\n\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\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(\n \"To use the serverCall function the contentUrl must contain sdc_view/<app>: \" +\n this._tagName,\n );\n return;\n }\n\n return (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__.callServer)(\n app[1],\n this._tagName,\n this.parsedContentUrl ?? this.contentUrl,\n methode,\n args,\n );\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\n newModel(modelName, modelQuery = {}) {\n console.warn(\"newModel is deprecated and will soon be removed. Please use this.querySet(modelName, modelQuery)\");\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\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n\n reconcile($virtualNode, $realNode = null) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reconcile(this, $virtualNode, $realNode);\n }\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\n iterateAllChildren() {\n const { _childController } = this;\n let res = [];\n for (let i in _childController) {\n if (Object.hasOwn(_childController, 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 {model, form_name} = $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({formName: form_name, data});\n } else {\n prom = model.create({data});\n }\n\n prom\n .then((res) => {\n ;(0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.clearErrorsInForm)($form);\n // save() resolves with a list of responses, create() with one response.\n const response = Array.isArray(res) ? res[0] : res;\n this.submit_model_form_success &&\n this.submit_model_form_success(response);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_success &&\n controller.submit_model_form_success(response);\n }\n\n resolve(res);\n })\n .catch((data) => {\n this.reconcile(\n $(`<div class=\"container-fluid\">${data.html}</div>`),\n $form.find(\".container-fluid\").first(),\n );\n this.submit_model_form_error &&\n this.submit_model_form_error(data);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_error &&\n controller.submit_model_form_error(data);\n }\n\n reject(data);\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFrQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwwQkFBMEI7QUFDdkQsVUFBVTtBQUNWLCtCQUErQixLQUFLO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxZQUFZLGlFQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxnREFBZ0QsVUFBVTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvQWJzdHJhY3RTREMuanM/ZjU3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FsbE9mZn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge1NkY1F1ZXJ5U2V0fSBmcm9tIFwiLi9zZGNfbW9kZWwuanNcIjtcbmltcG9ydCB7Y2FsbFNlcnZlcn0gZnJvbSBcIi4vc2RjX3NlcnZlcl9jYWxsLmpzXCI7XG5pbXBvcnQge1xuICB1dWlkdjQsXG4gIGNsZWFyRXJyb3JzSW5Gb3JtLFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFNEQyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3V1aWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmNvbnRlbnRVcmwgPSBcIlwiO1xuICAgIHRoaXMuY29udGVudFJlbG9hZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA9IG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB0aGlzLmxvYWRfYXN5bmMgPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxFdmVudHMgPSBudWxsO1xuICAgIHRoaXMuX2F1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgdGhpcy5fcGFyYW1zID0ge307XG5cbiAgICB0aGlzLl91cmxQYXJhbXMgPSBbXTtcbiAgICB0aGlzLl9tb2RlbHMgPSBbXTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBPbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLl9jc3NVcmxzID0gW107XG4gICAgdGhpcy5hZnRlclNob3cgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJhZnRlclNob3cgaXMgZGVwcmVjYXRlZCEhXCIpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gRW5kIG9sZCBkZXByZWNhdGVkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7e3N0cmluZzogQWJzdHJhY3RTREN9fVxuICAgICAqL1xuICAgIHRoaXMuX21peGlucyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLl90YWdOYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl90YWdOYW1lID8/IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e3N0cmluZzpBYnN0cmFjdFNEQ319XG4gICAgICovXG4gICAgdGhpcy5fY2hpbGRDb250cm9sbGVyID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QWJzdHJhY3RTREN9XG4gICAgICovXG4gICAgdGhpcy5fcGFyZW50Q29udHJvbGxlciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9vbkxvYWREb25lID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7anF1ZXJ5fVxuICAgICAqL1xuICAgIHRoaXMuJGNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBwYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtcztcbiAgfVxuXG4gIHNldCBwYXJhbXMocGFyYW1zKSB7XG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgbXVzdCBiZSBpbiB7fVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIGluIGFyZ3VtZW50cyBvZlxuICAgKlxuICAgKi9cbiAgX3J1bkxpZmVjeWNsZShtZXRob2QsIGFyZ3MpIHtcbiAgICBpZiAoYXBwLkRFQlVHICYmICF0aGlzLl9pc01peGluKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG1ldGhvZCwgdGhpcy5fdGFnTmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IHJldHVyblByb21pc3NlcyA9IFtdO1xuICAgIGlmICh0aGlzLl9pc01peGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzTWl4aW4gPSB0cnVlO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgIGlmICh0eXBlb2YgbWl4aW5bbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVyblByb21pc3Nlcy5wdXNoKG1peGluW21ldGhvZF0uYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXR1cm5Qcm9taXNzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5faXNNaXhpbiA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIE5vdCBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUgc2luY2UgMC4xNTguNy4gUmVhZCB0aGUgZGF0YS0qXG4gICAqIGF0dHJpYnV0ZXMgZnJvbSBgYHRoaXMucGFyYW1zYGAgaW4gYGBvbkxvYWQoKWBgIGluc3RlYWQuXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Kj58Kn1cbiAgICovXG4gIG9uSW5pdCgpIHtcbiAgICBpZiAoYXBwLkRFQlVHICYmICF0aGlzLl9pc01peGluKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKEFycmF5LmFwcGx5KG51bGwsIGFyZ3VtZW50cyksIHRoaXMuX3RhZ05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBhdXRvUmVkaXJlY3QodXJsKXtcbiAgICB0aGlzLl9hdXRvUmVkaXJlY3QgPSB1cmw7XG4gIH1cblxuICBnZXQgYXV0b1JlZGlyZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRvUmVkaXJlY3Q7XG4gIH1cblxuICBnZXQgcGFyZW50Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50Q29udHJvbGxlcjtcbiAgfVxuXG4gIGdldCBjaGlsZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkQ29udHJvbGxlcjtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25Mb2FkXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICB3aWxsU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwid2lsbFNob3dcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25SZWZyZXNoXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBvblJlbW92ZSgpIHtcbiAgICB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvblJlbW92ZVwiLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbm9PcGVuTW9kZWxSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fbW9kZWxzLm1hcCgoeCkgPT4geC5ub09wZW5SZXF1ZXN0cygpKSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLl9tb2RlbHMpIHtcbiAgICAgIG1vZGVsLmNsb3NlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgX2NoaWxkQ29udHJvbGxlciB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpIGluIF9jaGlsZENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duKF9jaGlsZENvbnRyb2xsZXIsIGkpKSB7XG4gICAgICAgIGZvciAobGV0IGNjIG9mIF9jaGlsZENvbnRyb2xsZXJbaV0pIHtcbiAgICAgICAgICBpZiAoIWNjLnJlbW92ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9uUmVtb3ZlIHx8IHRoaXMub25SZW1vdmUoKSkge1xuICAgICAgYWxsT2ZmKHRoaXMpO1xuICAgICAgY29uc3QgY19uYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRoaXMuX3RhZ05hbWUpO1xuICAgICAgaWYgKHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdKSB7XG4gICAgICAgIGxldCBhcnIgPSB0aGlzLl9wYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY19uYW1lXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJyW2ldID09PSB0aGlzKSB7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLiRjb250YWluZXIucmVtb3ZlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb250cm9sbGVyX25hbWUoKSB7XG4gICAgcmV0dXJuIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSh0aGlzLl90YWdOYW1lKTtcbiAgfVxuXG4gIGFkZEV2ZW50KGV2ZW50LCBzZWxlY3RvciwgaGFuZGxlcikge1xuICAgIHRoaXMuZ2V0RXZlbnRzKCk7XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XSA9IHRoaXMuX2FsbEV2ZW50c1tldmVudF0gfHwge307XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XVtzZWxlY3Rvcl0gPSBoYW5kbGVyO1xuICB9XG5cbiAgZ2V0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9hbGxFdmVudHMpIHJldHVybiB0aGlzLl9hbGxFdmVudHM7XG4gICAgbGV0IGFsbEV2ZW50cyA9IFtdO1xuICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQodGhpcy5ldmVudHMpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1peGluLmV2ZW50cykpIHtcbiAgICAgICAgYWxsRXZlbnRzID0gYWxsRXZlbnRzLmNvbmNhdChtaXhpbi5ldmVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIGludG8gYSBuZXcgb2JqZWN0OiB0aGUgZXZlbnQgbWFwcyBvZiB0aGUgY29udHJvbGxlciBhbmQgaXRzIG1peGluc1xuICAgIC8vIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBpbnN0YW5jZXMgYW5kIG11c3Qgbm90IGJlIGNoYW5nZWQuXG4gICAgcmV0dXJuICh0aGlzLl9hbGxFdmVudHMgPSBfLm1lcmdlKHt9LCAuLi5hbGxFdmVudHMpKTtcbiAgfVxuXG4gIHBvc3QodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5wb3N0KHRoaXMsIHVybCwgYXJncyk7XG4gIH1cblxuICBnZXQodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5nZXQodGhpcywgdXJsLCBhcmdzKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdXJsLCBtZXRob2QpIHtcbiAgICByZXR1cm4gYXBwLnN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3KHRoaXMsIGZvcm0sIHVybCwgbWV0aG9kKTtcbiAgfVxuXG4gIHNlcnZlckNhbGwobWV0aG9kZSwgYXJncykge1xuICAgIGxldCByZSA9IC9zZGNfdmlld1xcLyhbXi9dKykvaTtcbiAgICBsZXQgYXBwID0gdGhpcy5jb250ZW50VXJsLm1hdGNoKHJlKTtcbiAgICBpZiAoIWFwcCB8fCBhcHAubGVuZ3RoIDwgMikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJUbyB1c2UgdGhlIHNlcnZlckNhbGwgZnVuY3Rpb24gdGhlIGNvbnRlbnRVcmwgbXVzdCBjb250YWluIHNkY192aWV3LzxhcHA+OiBcIiArXG4gICAgICAgIHRoaXMuX3RhZ05hbWUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBjYWxsU2VydmVyKFxuICAgICAgYXBwWzFdLFxuICAgICAgdGhpcy5fdGFnTmFtZSxcbiAgICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA/PyB0aGlzLmNvbnRlbnRVcmwsXG4gICAgICBtZXRob2RlLFxuICAgICAgYXJncyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtICB7b2JqZWN0P30gbW9kZWxRdWVyeVxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBxdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkgPSB7fSkge1xuICAgIGNvbnN0IG5ld1F1ZXJ5U2V0ID0gbmV3IFNkY1F1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSk7XG4gICAgdGhpcy5fbW9kZWxzLnB1c2gobmV3UXVlcnlTZXQpO1xuICAgIHJldHVybiBuZXdRdWVyeVNldDtcbiAgfVxuXG4gIG5ld01vZGVsKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgY29uc29sZS53YXJuKFwibmV3TW9kZWwgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBzb29uIGJlIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhpcy5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpXCIpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQWRhcHRlciB0byB0aGlzLiRjb250YWluZXIuZmluZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tU2VsZWN0b3JcbiAgICovXG4gIGZpbmQoZG9tU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4kY29udGFpbmVyLmZpbmQoZG9tU2VsZWN0b3IpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICByZXR1cm4gYXBwLnJlZnJlc2godGhpcy4kY29udGFpbmVyLCB0aGlzKTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICByZXR1cm4gYXBwLnJlbG9hZENvbnRyb2xsZXIodGhpcyk7XG4gIH1cblxuICByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsKSB7XG4gICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUodGhpcywgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpO1xuICB9XG5cbiAgc3VibWl0TW9kZWxGb3JtRGlzdHJpYnV0b3IoJGZvcm0sIGUpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N1Ym1pdE1vZGVsRm9ybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLnN1Ym1pdE1vZGVsRm9ybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0U3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgfVxuXG4gIGl0ZXJhdGVBbGxDaGlsZHJlbigpIHtcbiAgICBjb25zdCB7IF9jaGlsZENvbnRyb2xsZXIgfSA9IHRoaXM7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oX2NoaWxkQ29udHJvbGxlciwgaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgICByZXMucHVzaCguLi5jYy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgKi9cbiAgZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCB7bW9kZWwsIGZvcm1fbmFtZX0gPSAkZm9ybS5kYXRhKCk7XG4gICAgICBsZXQgZGF0YSA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9tO1xuICAgICAgICBpZiAobW9kZWwuaWQgIT09IG51bGwgJiYgbW9kZWwuaWQgPj0gMCkge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5zYXZlKHtmb3JtTmFtZTogZm9ybV9uYW1lLCBkYXRhfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZSh7ZGF0YX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIC8vIHNhdmUoKSByZXNvbHZlcyB3aXRoIGEgbGlzdCBvZiByZXNwb25zZXMsIGNyZWF0ZSgpIHdpdGggb25lIHJlc3BvbnNlLlxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBBcnJheS5pc0FycmF5KHJlcykgPyByZXNbMF0gOiByZXM7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyhyZXNwb25zZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlY29uY2lsZShcbiAgICAgICAgICAgICAgJChgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiR7ZGF0YS5odG1sfTwvZGl2PmApLFxuICAgICAgICAgICAgICAkZm9ybS5maW5kKFwiLmNvbnRhaW5lci1mbHVpZFwiKS5maXJzdCgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IgJiZcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yICYmXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlamVjdChkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
28
38
 
29
39
  /***/ },
30
40
 
@@ -34,7 +44,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
34
44
  \************************************************/
35
45
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
36
46
 
37
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\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/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\nfunction tagList() {\n return Object.keys(controllerList);\n}\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n parentController._childController[controllerName].push(controller);\n }\n return controller._parentController = parentController;\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n if (cController === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(parentController, $element, tagName, superTagNameList) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(controllerClass, ...mixinControllerClass))();\n controller._tagName = tagName;\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_2__.runOnInitWithParameter)($element, controller);\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(parentController, $element, tagName, superTagNameList) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(parentController, $element, tagName, superTagNameList);\n }\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n return controllerFactoryInstance(parentController, $element, tagName, superTagNameList);\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then(html => {\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller).then(function ($html) {\n return runControllerShow(controller, $html);\n }).then(() => {\n return runRefresh(controller, process);\n }).catch(function ($html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n });\n if (controller.load_async) {\n return Promise.resolve();\n }\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controller._isEventsSet = false;\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller]\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n return {\n isRunningProcess,\n refreshProcess\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUl3QjtBQU9EO0FBRWtDO0FBQ0M7QUFDdEI7QUFFN0IsSUFBSVcsTUFBTSxHQUFHLEVBQUU7QUFDZixJQUFJQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXZCLFNBQVNDLE9BQU9BLENBQUEsRUFBRztFQUN4QixPQUFPQyxNQUFNLENBQUNDLElBQUksQ0FBQ0gsY0FBYyxDQUFDO0FBQ3BDO0FBRUEsU0FBU0ksYUFBYUEsQ0FBQ0MsZ0JBQWdCLEVBQUVDLE9BQU8sRUFBRTtFQUNoREQsZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDRSxNQUFNLENBQUNQLGNBQWMsQ0FBQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdEVELGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ0csTUFBTSxDQUFDLENBQUNDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEtBQUs7SUFDakUsT0FBT0EsSUFBSSxDQUFDQyxPQUFPLENBQUNILEtBQUssQ0FBQyxLQUFLQyxLQUFLO0VBQ3RDLENBQUMsQ0FBQztFQUNGLElBQUlHLFFBQVEsR0FBRyxJQUFJO0VBQ25CLE9BQU9BLFFBQVEsRUFBRTtJQUNmQSxRQUFRLEdBQUcsS0FBSztJQUNoQixLQUFLLElBQUlDLEdBQUcsSUFBSVQsZ0JBQWdCLEVBQUU7TUFDaEMsS0FBSyxJQUFJVSxNQUFNLElBQUlmLGNBQWMsQ0FBQ2MsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDekMsSUFBSSxDQUFDVCxnQkFBZ0IsQ0FBQ1csUUFBUSxDQUFDRCxNQUFNLENBQUMsRUFBRTtVQUN0Q1YsZ0JBQWdCLENBQUNZLElBQUksQ0FBQ0YsTUFBTSxDQUFDO1VBQzdCRixRQUFRLEdBQUcsSUFBSTtRQUNqQjtNQUNGO0lBQ0Y7RUFDRjtFQUNBLE9BQU9SLGdCQUFnQjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFD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Q0csS0FBSyxDQUFDSSxHQUFHLENBQUN2RCxVQUFVLENBQUNxRCxLQUFLLENBQUM7SUFDMUNMLGNBQWMsQ0FBQ2hELFVBQVUsQ0FBQ0gsSUFBSSxDQUFDRyxVQUFVLENBQUM7RUFDNUM7RUFFQSxPQUFPO0lBQUVpRCxnQkFBZ0I7SUFBRUQ7RUFBZSxDQUFDO0FBQzdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19jb250cm9sbGVyLmpzPzhhMzEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgcHJvbWlzZUR1bW15RmFjdG9yeSxcbiAgdGFnTmFtZVRvQ2FtZWxDYXNlLFxuICBhZ2lsZUFnZ3JlZ2F0aW9uLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIENPTlRST0xMRVJfQ0xBU1MsXG4gIGdldENvbnRyb2xsZXIsXG4gIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyLFxuICByZWZyZXNoLFxuICBydW5Db250cm9sbGVyRmlsbENvbnRlbnQsXG59IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5cbmltcG9ydCB7IHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIgfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQgeyBzZXRDb250cm9sbGVyRXZlbnRzIH0gZnJvbSBcIi4vc2RjX2RvbV9ldmVudHMuanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5cbmV4cG9ydCBsZXQgR2xvYmFsID0gW107XG5leHBvcnQgbGV0IGNvbnRyb2xsZXJMaXN0ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdMaXN0KCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29udHJvbGxlckxpc3QpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpIHtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuY29uY2F0KGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdKTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG4gIH0pO1xuICBsZXQgaGFzQWRkZWQgPSB0cnVlO1xuICB3aGlsZSAoaGFzQWRkZWQpIHtcbiAgICBoYXNBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHRhZyBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgICBmb3IgKGxldCBuZXdUYWcgb2YgY29udHJvbGxlckxpc3RbdGFnXVsxXSkge1xuICAgICAgICBpZiAoIXN1cGVyVGFnTmFtZUxpc3QuaW5jbHVkZXMobmV3VGFnKSkge1xuICAgICAgICAgIHN1cGVyVGFnTmFtZUxpc3QucHVzaChuZXdUYWcpO1xuICAgICAgICAgIGhhc0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VwZXJUYWdOYW1lTGlzdDtcbn1cblxuLyoqXG4gKiBzZXRQYXJlbnRDb250cm9sbGVyIHNldHMgdGhlIHBhcmVudCBjb250cm9sbGVyIGFzIHByb3BlcnR5OiAncGFyZW50Q29udHJvbGxlcidcbiAqIHRvIHRoZSBjaGlsZCBjb250cm9sbGVyLiBBbHNvLCBpdCBhZGRzIHRoZSBjaGlsZCBjb250cm9sbGVyIHRvIHRoZSBwcm9wZXJ0eSBsaXN0OlxuICogJ3BhcmVudENvbnRyb2xsZXInIHRvIHRoZSBwYXJlbnQgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlLCBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NIG9mIHRoZSBjb250cm9sbGVycyBET01cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSBwYXJlbnRDb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHNldFBhcmVudENvbnRyb2xsZXIocGFyZW50Q29udHJvbGxlciwgY29udHJvbGxlcikge1xuICBpZiAocGFyZW50Q29udHJvbGxlcikge1xuICAgIGxldCBjb250cm9sbGVyTmFtZSA9IHRhZ05hbWVUb0NhbWVsQ2FzZShjb250cm9sbGVyLl90YWdOYW1lKTtcbiAgICBpZiAoIXBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0pIHtcbiAgICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY29udHJvbGxlck5hbWVdLnB1c2goY29udHJvbGxlcik7XG4gIH1cblxuICByZXR1cm4gKGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiByZXNldENoaWxkcmVuIHJlc2V0cyBhbGwgY2hpbGRyZW4gb2YgYSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2hpbGRyZW4ocGFyZW50Q29udHJvbGxlcikge1xuICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcbiAgcGFyZW50Q29udHJvbGxlci5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICBjb25zdCBjQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJHRoaXMpO1xuICAgIGlmIChjQ29udHJvbGxlciA9PT0gcGFyZW50Q29udHJvbGxlcikge1xuICAgICAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjQ29udHJvbGxlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlIGl0IGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgaW5pdCBwYXJhbWV0ZXIgYnkgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBET00uXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgc3VwZXIgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4pIHtcbiAgbGV0IG1peGluQ29udHJvbGxlckNsYXNzID0gW107XG4gIHN1cGVyVGFnTmFtZUxpc3QgPSBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpO1xuICBmb3IgKGxldCBzdXBlclRhZ05hbWUgb2Ygc3VwZXJUYWdOYW1lTGlzdCkge1xuICAgIG1peGluQ29udHJvbGxlckNsYXNzLnB1c2goY29udHJvbGxlckxpc3Rbc3VwZXJUYWdOYW1lXVswXSk7XG4gIH1cblxuICBsZXQgY29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gIGxldCBjb250cm9sbGVyID0gbmV3IChhZ2lsZUFnZ3JlZ2F0aW9uKFxuICAgIGNvbnRyb2xsZXJDbGFzcyxcbiAgICAuLi5taXhpbkNvbnRyb2xsZXJDbGFzcyxcbiAgKSkoKTtcbiAgY29udHJvbGxlci5fdGFnTmFtZSA9IHRhZ05hbWU7XG5cbiAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci4kY29udGFpbmVyID0gJGVsZW1lbnQ7XG4gIHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5IGl0IGVpdGhlciBnZW5lcmF0ZXMgYSBjb250cm9sbGVyIG9yIHRha2VzIGEgZ2xvYmUgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogUmVtZW1iZXIgR2xvYmFsIGNvbnRyb2xsZXIgY2FuIG5vdCBoYXZlIGEgc3VwZXIgY29udHJvbGxlciFcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJGYWN0b3J5KFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBpZiAoR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgbGV0IGdUYWdOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRhZ05hbWUpO1xuICAgIGlmICghd2luZG93W2dUYWdOYW1lXSkge1xuICAgICAgd2luZG93W2dUYWdOYW1lXSA9IGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgICAgICRlbGVtZW50LFxuICAgICAgICB0YWdOYW1lLFxuICAgICAgICBzdXBlclRhZ05hbWVMaXN0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3aW5kb3dbZ1RhZ05hbWVdLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgICByZXR1cm4gd2luZG93W2dUYWdOYW1lXTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJTaG93IGZpcnN0IHJ1bnMgb25Mb2FkIGFuZCBmaWxsIGNvbnRlbnQgZm9yIGFsbCBzdWJcbiAqIGNvbnRyb2xsZXIuIE9ubHkgaWYgYWxsIHRoZSBzdWIgY29udHJvbGxlciBhcmUgbG9hZGVkIHRoZSB3aWxsU2hvd1xuICogY29udHJvbCBmbG93IGZ1bmN0aW9uIGdldHMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpIHtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCkudGhlbihmdW5jdGlvbiAoYXJncykge1xuICAgIGFyZ3MgPSBhcmdzIHx8IHRydWU7XG4gICAgaWYgKGNvbnRyb2xsZXIud2lsbFNob3cpIHtcbiAgICAgIGxldCBsb2FkUHJvbWlzZU9yQ29udGVudCA9IGNvbnRyb2xsZXIud2lsbFNob3coKTtcbiAgICAgIGlmIChsb2FkUHJvbWlzZU9yQ29udGVudCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9taXNlT3JDb250ZW50LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfSk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlckxvYWQgQ2FsbHMgdGhlIG9uTG9hZCBmdW5jdGlvbiBvZiB0aGUgY29udHJvbGxlci5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgSFRNTCBpcyBzZXQgdG8gdGhlIHBhZ2UuXG4gKiBUaGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgdGFnIGFuZCB0aGUgcmVnaXN0ZXJlZCB0YWcuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlckxvYWQoY29udHJvbGxlcikge1xuICByZXR1cm4gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgIGlmICghY29udHJvbGxlci5vbkxvYWQgfHwgY29udHJvbGxlci5fb25Mb2FkRG9uZSkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5fb25Mb2FkRG9uZSA9IHRydWU7XG4gICAgbGV0IGxvYWRQcm9taXNlID0gY29udHJvbGxlci5vbkxvYWQoaHRtbCk7XG4gICAgcmV0dXJuIChsb2FkUHJvbWlzZSB8fCBwcm9taXNlRHVtbXlGYWN0b3J5KCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIHJ1bnMgdGhlIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnM6XG4gKiAxLiBvbkxvYWQoKVxuICogMi4gZmlsbCBjb250ZW50XG4gKiAzLiB3aWxsU2hvdyhkb20gcGFyYW1ldGVyKVxuICogNC4gcmVmcmVzaCgpXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHByb21fY29udHJvbGxlciA9IHJ1bkNvbnRyb2xsZXJMb2FkKGNvbnRyb2xsZXIpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICByZXR1cm4gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICByZXR1cm4gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sKTtcbiAgICB9KTtcblxuICBpZiAoY29udHJvbGxlci5sb2FkX2FzeW5jKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHByb21fY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcykge1xuICByZXR1cm4gcmVmcmVzaChudWxsLCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50TGlzdChjb250cm9sbGVyKSB7XG4gIGxldCBjb250cm9sbGVyTGlzdCA9IFtdO1xuICB3aGlsZSAoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXIuX2lzRXZlbnRzU2V0ID0gZmFsc2U7XG4gICAgY29udHJvbGxlckxpc3QudW5zaGlmdChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyID0gY29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlcjtcbiAgfVxuICByZXR1cm4gY29udHJvbGxlckxpc3Q7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocHJvY2Vzcykge1xuICBjb25zdCBwYXJlbnRMaXN0ID0gZ2V0UGFyZW50TGlzdChwcm9jZXNzLmNvbnRyb2xsZXJbMF0pO1xuICBjb25zdCBjb250cm9sbGVyTGlzdCA9IHBhcmVudExpc3QuY29uY2F0KHByb2Nlc3MuY29udHJvbGxlci5zbGljZSgxKSk7XG5cbiAgZm9yIChsZXQgY29uIG9mIGNvbnRyb2xsZXJMaXN0KSB7XG4gICAgc2V0Q29udHJvbGxlckV2ZW50cyhjb24pO1xuICAgIGNvbi5vblJlZnJlc2gocHJvY2Vzcy5jb250cm9sbGVyWzBdKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKHJlZnJlc2hQcm9jZXNzLCBjb250cm9sbGVyKSB7XG4gIGxldCBpc1J1bm5pbmdQcm9jZXNzID0gQm9vbGVhbihyZWZyZXNoUHJvY2Vzcyk7XG5cbiAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgcmVmcmVzaFByb2Nlc3MgPSB7XG4gICAgICB1dWlkczogbmV3IFNldChbY29udHJvbGxlci5fdXVpZF0pLFxuICAgICAgY29udHJvbGxlcjogW2NvbnRyb2xsZXJdLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoIXJlZnJlc2hQcm9jZXNzLnV1aWRzLmhhcyhjb250cm9sbGVyLl91dWlkKSkge1xuICAgIHJlZnJlc2hQcm9jZXNzLnV1aWRzLmFkZChjb250cm9sbGVyLl91dWlkKTtcbiAgICByZWZyZXNoUHJvY2Vzcy5jb250cm9sbGVyLnB1c2goY29udHJvbGxlcik7XG4gIH1cblxuICByZXR1cm4geyBpc1J1bm5pbmdQcm9jZXNzLCByZWZyZXNoUHJvY2VzcyB9O1xufVxuIl0sIm5hbWVzIjpbInByb21pc2VEdW1teUZhY3RvcnkiLCJ0YWdOYW1lVG9DYW1lbENhc2UiLCJhZ2lsZUFnZ3JlZ2F0aW9uIiwiQ09OVFJPTExFUl9DTEFTUyIsImdldENvbnRyb2xsZXIiLCJsb2FkRmlsZXNGcm9tQ29udHJvbGxlciIsInJlZnJlc2giLCJydW5Db250cm9sbGVyRmlsbENvbnRlbnQiLCJydW5PbkluaXRXaXRoUGFyYW1ldGVyIiwic2V0Q29udHJvbGxlckV2ZW50cyIsImFwcCIsIkdsb2JhbCIsImNvbnRyb2xsZXJMaXN0IiwidGFnTGlzdCIsIk9iamVjdCIsImtleXMiLCJwcmVwYXJlTWl4aW5zIiwic3VwZXJUYWdOYW1lTGlzdCIsInRhZ05hbWUiLCJjb25jYXQiLCJmaWx0ZXIiLCJ2YWx1ZSIsImluZGV4Iiwic2VsZiIsImluZGV4T2YiLCJoYXNBZGRlZCIsInRhZyIsIm5ld1RhZyIsImluY2x1ZGVzIiwicHVzaCIsInNldFBhcmVudENvbnRyb2xsZXIiLCJwYXJlbnRDb250cm9sbGVyIiwiY29udHJvbGxlciIsImNvbnRyb2xsZXJOYW1lIiwiX3RhZ05hbWUiLCJfY2hpbGRDb250cm9sbGVyIiwiX3BhcmVudENvbnRyb2xsZXIiLCJyZXNldENoaWxkcmVuIiwiZmluZCIsImVhY2giLCIkdGhpcyIsIiQiLCJjQ29udHJvbGxlciIsImNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UiLCIkZWxlbWVudCIsIm1peGluQ29udHJvbGxlckNsYXNzIiwic3VwZXJUYWdOYW1lIiwiY29udHJvbGxlckNsYXNzIiwiJGNvbnRhaW5lciIsImNvbnRyb2xsZXJGYWN0b3J5IiwiZ1RhZ05hbWUiLCJ3aW5kb3ciLCJydW5Db250cm9sbGVyU2hvdyIsIiRodG1sIiwidGhlbiIsImFyZ3MiLCJ3aWxsU2hvdyIsImxvYWRQcm9taXNlT3JDb250ZW50IiwiUHJvbWlzZSIsInJ1bkNvbnRyb2xsZXJMb2FkIiwiaHRtbCIsIm9uTG9hZCIsIl9vbkxvYWREb25lIiwibG9hZFByb21pc2UiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInByb2Nlc3MiLCJwcm9tX2NvbnRyb2xsZXIiLCJydW5SZWZyZXNoIiwiY2F0Y2giLCJsb2FkX2FzeW5jIiwicmVzb2x2ZSIsImdldFBhcmVudExpc3QiLCJfaXNFdmVudHNTZXQiLCJ1bnNoaWZ0IiwidXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoIiwicGFyZW50TGlzdCIsInNsaWNlIiwiY29uIiwib25SZWZyZXNoIiwicHJlcGFyZVJlZnJlc2hQcm9jZXNzIiwicmVmcmVzaFByb2Nlc3MiLCJpc1J1bm5pbmdQcm9jZXNzIiwiQm9vbGVhbiIsInV1aWRzIiwiU2V0IiwiX3V1aWQiLCJoYXMiLCJhZGQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
47
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\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/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\n\nfunction tagList() {\n return Object.keys(controllerList);\n}\n\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n\n parentController._childController[controllerName].push(controller);\n }\n\n return (controller._parentController = parentController);\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n // Direct children only: the closest controller around the child element is the parent.\n if (cController && (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this.parent()) === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(\n controllerClass,\n ...mixinControllerClass,\n ))();\n controller._tagName = tagName;\n\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_2__.runOnInitWithParameter)($element, controller);\n\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n }\n\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n\n return controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then((html) => {\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller)\n .then(function ($html) {\n return runControllerShow(controller, $html);\n })\n .then(() => {\n return runRefresh(controller, process);\n })\n .catch(function ($html) {\n if (typeof $html === 'string' || $html instanceof $) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n }\n throw $html;\n });\n\n if (controller.load_async) {\n return Promise.resolve();\n }\n\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\n\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\n\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller],\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n\n return { isRunningProcess, refreshProcess };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUl3QjtBQU9EOztBQUVrQztBQUNDO0FBQ25DOztBQUVoQjtBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWtCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBLDRCQUE0QiwwREFBZ0IsQ0FBQztBQUM3QztBQUNBLHdCQUF3QiwyREFBYTtBQUNyQztBQUNBLHVCQUF1QiwyREFBYTtBQUNwQztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLCtEQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxzRUFBc0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGVBQWU7QUFDMUIsWUFBWSxhQUFhO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0EsU0FBUyxzRUFBd0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBLFNBQVMscUVBQXVCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLGtFQUFtQjtBQUM5QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsc0VBQXdCO0FBQ3ZDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUCxTQUFTLHFEQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLElBQUksdUVBQW1CO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcz80MzgxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHByb21pc2VEdW1teUZhY3RvcnksXG4gIHRhZ05hbWVUb0NhbWVsQ2FzZSxcbiAgYWdpbGVBZ2dyZWdhdGlvbixcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBDT05UUk9MTEVSX0NMQVNTLFxuICBnZXRDb250cm9sbGVyLFxuICBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcixcbiAgcmVmcmVzaCxcbiAgcnVuQ29udHJvbGxlckZpbGxDb250ZW50LFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuXG5pbXBvcnQgeyBydW5PbkluaXRXaXRoUGFyYW1ldGVyIH0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHsgc2V0Q29udHJvbGxlckV2ZW50cyB9IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgXCIuL3NkY19tYWluLmpzXCI7XG5cbmV4cG9ydCBsZXQgR2xvYmFsID0gW107XG5leHBvcnQgbGV0IGNvbnRyb2xsZXJMaXN0ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdMaXN0KCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29udHJvbGxlckxpc3QpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpIHtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuY29uY2F0KGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdKTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG4gIH0pO1xuICBsZXQgaGFzQWRkZWQgPSB0cnVlO1xuICB3aGlsZSAoaGFzQWRkZWQpIHtcbiAgICBoYXNBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHRhZyBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgICBmb3IgKGxldCBuZXdUYWcgb2YgY29udHJvbGxlckxpc3RbdGFnXVsxXSkge1xuICAgICAgICBpZiAoIXN1cGVyVGFnTmFtZUxpc3QuaW5jbHVkZXMobmV3VGFnKSkge1xuICAgICAgICAgIHN1cGVyVGFnTmFtZUxpc3QucHVzaChuZXdUYWcpO1xuICAgICAgICAgIGhhc0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VwZXJUYWdOYW1lTGlzdDtcbn1cblxuLyoqXG4gKiBzZXRQYXJlbnRDb250cm9sbGVyIHNldHMgdGhlIHBhcmVudCBjb250cm9sbGVyIGFzIHByb3BlcnR5OiAncGFyZW50Q29udHJvbGxlcidcbiAqIHRvIHRoZSBjaGlsZCBjb250cm9sbGVyLiBBbHNvLCBpdCBhZGRzIHRoZSBjaGlsZCBjb250cm9sbGVyIHRvIHRoZSBwcm9wZXJ0eSBsaXN0OlxuICogJ3BhcmVudENvbnRyb2xsZXInIHRvIHRoZSBwYXJlbnQgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlLCBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NIG9mIHRoZSBjb250cm9sbGVycyBET01cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSBwYXJlbnRDb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHNldFBhcmVudENvbnRyb2xsZXIocGFyZW50Q29udHJvbGxlciwgY29udHJvbGxlcikge1xuICBpZiAocGFyZW50Q29udHJvbGxlcikge1xuICAgIGxldCBjb250cm9sbGVyTmFtZSA9IHRhZ05hbWVUb0NhbWVsQ2FzZShjb250cm9sbGVyLl90YWdOYW1lKTtcbiAgICBpZiAoIXBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0pIHtcbiAgICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY29udHJvbGxlck5hbWVdLnB1c2goY29udHJvbGxlcik7XG4gIH1cblxuICByZXR1cm4gKGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiByZXNldENoaWxkcmVuIHJlc2V0cyBhbGwgY2hpbGRyZW4gb2YgYSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2hpbGRyZW4ocGFyZW50Q29udHJvbGxlcikge1xuICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcbiAgcGFyZW50Q29udHJvbGxlci5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICBjb25zdCBjQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJHRoaXMpO1xuICAgIC8vIERpcmVjdCBjaGlsZHJlbiBvbmx5OiB0aGUgY2xvc2VzdCBjb250cm9sbGVyIGFyb3VuZCB0aGUgY2hpbGQgZWxlbWVudCBpcyB0aGUgcGFyZW50LlxuICAgIGlmIChjQ29udHJvbGxlciAmJiBnZXRDb250cm9sbGVyKCR0aGlzLnBhcmVudCgpKSA9PT0gcGFyZW50Q29udHJvbGxlcikge1xuICAgICAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjQ29udHJvbGxlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlIGl0IGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgaW5pdCBwYXJhbWV0ZXIgYnkgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBET00uXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgc3VwZXIgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4pIHtcbiAgbGV0IG1peGluQ29udHJvbGxlckNsYXNzID0gW107XG4gIHN1cGVyVGFnTmFtZUxpc3QgPSBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpO1xuICBmb3IgKGxldCBzdXBlclRhZ05hbWUgb2Ygc3VwZXJUYWdOYW1lTGlzdCkge1xuICAgIG1peGluQ29udHJvbGxlckNsYXNzLnB1c2goY29udHJvbGxlckxpc3Rbc3VwZXJUYWdOYW1lXVswXSk7XG4gIH1cblxuICBsZXQgY29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gIGxldCBjb250cm9sbGVyID0gbmV3IChhZ2lsZUFnZ3JlZ2F0aW9uKFxuICAgIGNvbnRyb2xsZXJDbGFzcyxcbiAgICAuLi5taXhpbkNvbnRyb2xsZXJDbGFzcyxcbiAgKSkoKTtcbiAgY29udHJvbGxlci5fdGFnTmFtZSA9IHRhZ05hbWU7XG5cbiAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci4kY29udGFpbmVyID0gJGVsZW1lbnQ7XG4gIHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5IGl0IGVpdGhlciBnZW5lcmF0ZXMgYSBjb250cm9sbGVyIG9yIHRha2VzIGEgZ2xvYmUgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogUmVtZW1iZXIgR2xvYmFsIGNvbnRyb2xsZXIgY2FuIG5vdCBoYXZlIGEgc3VwZXIgY29udHJvbGxlciFcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJGYWN0b3J5KFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBpZiAoR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgbGV0IGdUYWdOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRhZ05hbWUpO1xuICAgIGlmICghd2luZG93W2dUYWdOYW1lXSkge1xuICAgICAgd2luZG93W2dUYWdOYW1lXSA9IGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgICAgICRlbGVtZW50LFxuICAgICAgICB0YWdOYW1lLFxuICAgICAgICBzdXBlclRhZ05hbWVMaXN0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3aW5kb3dbZ1RhZ05hbWVdLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgICByZXR1cm4gd2luZG93W2dUYWdOYW1lXTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJTaG93IGZpcnN0IHJ1bnMgb25Mb2FkIGFuZCBmaWxsIGNvbnRlbnQgZm9yIGFsbCBzdWJcbiAqIGNvbnRyb2xsZXIuIE9ubHkgaWYgYWxsIHRoZSBzdWIgY29udHJvbGxlciBhcmUgbG9hZGVkIHRoZSB3aWxsU2hvd1xuICogY29udHJvbCBmbG93IGZ1bmN0aW9uIGdldHMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpIHtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCkudGhlbihmdW5jdGlvbiAoYXJncykge1xuICAgIGFyZ3MgPSBhcmdzIHx8IHRydWU7XG4gICAgaWYgKGNvbnRyb2xsZXIud2lsbFNob3cpIHtcbiAgICAgIGxldCBsb2FkUHJvbWlzZU9yQ29udGVudCA9IGNvbnRyb2xsZXIud2lsbFNob3coKTtcbiAgICAgIGlmIChsb2FkUHJvbWlzZU9yQ29udGVudCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9taXNlT3JDb250ZW50LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfSk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlckxvYWQgQ2FsbHMgdGhlIG9uTG9hZCBmdW5jdGlvbiBvZiB0aGUgY29udHJvbGxlci5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgSFRNTCBpcyBzZXQgdG8gdGhlIHBhZ2UuXG4gKiBUaGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgdGFnIGFuZCB0aGUgcmVnaXN0ZXJlZCB0YWcuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlckxvYWQoY29udHJvbGxlcikge1xuICByZXR1cm4gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgIGlmICghY29udHJvbGxlci5vbkxvYWQgfHwgY29udHJvbGxlci5fb25Mb2FkRG9uZSkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5fb25Mb2FkRG9uZSA9IHRydWU7XG4gICAgbGV0IGxvYWRQcm9taXNlID0gY29udHJvbGxlci5vbkxvYWQoaHRtbCk7XG4gICAgcmV0dXJuIChsb2FkUHJvbWlzZSB8fCBwcm9taXNlRHVtbXlGYWN0b3J5KCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIHJ1bnMgdGhlIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnM6XG4gKiAxLiBvbkxvYWQoKVxuICogMi4gZmlsbCBjb250ZW50XG4gKiAzLiB3aWxsU2hvdyhkb20gcGFyYW1ldGVyKVxuICogNC4gcmVmcmVzaCgpXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHByb21fY29udHJvbGxlciA9IHJ1bkNvbnRyb2xsZXJMb2FkKGNvbnRyb2xsZXIpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICByZXR1cm4gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICBpZiAodHlwZW9mICRodG1sID09PSAnc3RyaW5nJyB8fCAkaHRtbCBpbnN0YW5jZW9mICQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgICB9XG4gICAgICB0aHJvdyAkaHRtbDtcbiAgICB9KTtcblxuICBpZiAoY29udHJvbGxlci5sb2FkX2FzeW5jKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHByb21fY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcykge1xuICByZXR1cm4gcmVmcmVzaChudWxsLCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50TGlzdChjb250cm9sbGVyKSB7XG4gIGxldCBjb250cm9sbGVyTGlzdCA9IFtdO1xuICB3aGlsZSAoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXJMaXN0LnVuc2hpZnQoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXI7XG4gIH1cbiAgcmV0dXJuIGNvbnRyb2xsZXJMaXN0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHByb2Nlc3MpIHtcbiAgY29uc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QocHJvY2Vzcy5jb250cm9sbGVyWzBdKTtcbiAgY29uc3QgY29udHJvbGxlckxpc3QgPSBwYXJlbnRMaXN0LmNvbmNhdChwcm9jZXNzLmNvbnRyb2xsZXIuc2xpY2UoMSkpO1xuXG4gIGZvciAobGV0IGNvbiBvZiBjb250cm9sbGVyTGlzdCkge1xuICAgIHNldENvbnRyb2xsZXJFdmVudHMoY29uKTtcbiAgICBjb24ub25SZWZyZXNoKHByb2Nlc3MuY29udHJvbGxlclswXSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVSZWZyZXNoUHJvY2VzcyhyZWZyZXNoUHJvY2VzcywgY29udHJvbGxlcikge1xuICBsZXQgaXNSdW5uaW5nUHJvY2VzcyA9IEJvb2xlYW4ocmVmcmVzaFByb2Nlc3MpO1xuXG4gIGlmICghaXNSdW5uaW5nUHJvY2Vzcykge1xuICAgIHJlZnJlc2hQcm9jZXNzID0ge1xuICAgICAgdXVpZHM6IG5ldyBTZXQoW2NvbnRyb2xsZXIuX3V1aWRdKSxcbiAgICAgIGNvbnRyb2xsZXI6IFtjb250cm9sbGVyXSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFyZWZyZXNoUHJvY2Vzcy51dWlkcy5oYXMoY29udHJvbGxlci5fdXVpZCkpIHtcbiAgICByZWZyZXNoUHJvY2Vzcy51dWlkcy5hZGQoY29udHJvbGxlci5fdXVpZCk7XG4gICAgcmVmcmVzaFByb2Nlc3MuY29udHJvbGxlci5wdXNoKGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgcmV0dXJuIHsgaXNSdW5uaW5nUHJvY2VzcywgcmVmcmVzaFByb2Nlc3MgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
38
48
 
39
49
  /***/ },
40
50
 
@@ -44,7 +54,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
44
54
  \************************************************/
45
55
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
46
56
 
47
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ STD_EVENT_BLACK_LIST: () => (/* binding */ STD_EVENT_BLACK_LIST),\n/* harmony export */ STD_EVENT_LIST: () => (/* binding */ STD_EVENT_LIST),\n/* harmony export */ initEvents: () => (/* binding */ initEvents),\n/* harmony export */ setControllerEvents: () => (/* binding */ setControllerEvents),\n/* harmony export */ windowEventHandler: () => (/* binding */ windowEventHandler)\n/* harmony export */ });\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\nconst STD_EVENT_BLACK_LIST = [\"onbeforeunload\", \"onunload\"];\nconst STD_EVENT_LIST = Object.keys(window).filter(key => /^on/.test(key) && !STD_EVENT_BLACK_LIST.includes(key)).map(x => x.slice(2));\nfunction checkIfEventFits(ev_type, e, target) {\n let elementUnderMouse;\n switch (ev_type) {\n case \"mouseleave\":\n case \"mouseout\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return target !== elementUnderMouse && !target.contains(elementUnderMouse);\n case \"mouseenter\":\n case \"mousein\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return target !== elementUnderMouse && !target.contains(elementUnderMouse);\n default:\n return true;\n }\n}\nfunction windowEventHandler(event) {\n let ev_type = event.type;\n if (event.hasOwnProperty(\"namespace\") && event.namespace && event.namespace.length) ev_type += `.${event.namespace}`;\n let $elm = $(event.target);\n let controller = null;\n let is_done = false;\n let is_last_elem = false;\n event.stopImmediatePropagation = () => is_last_elem = true;\n event.stopPropagation = () => is_last_elem = is_done = true;\n while ($elm.length) {\n let attrs = $elm.attr(`sdc_${ev_type}`);\n if (attrs && checkIfEventFits(ev_type, event, $elm[0])) {\n if (!controller) {\n controller = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_0__.getController)($elm);\n if (!controller) return;\n }\n while (controller) {\n attrs.split(\" \").forEach(attr => {\n if (is_done) return;\n let handler = null;\n if (typeof attr === \"function\") {\n handler = attr;\n } else if (typeof controller[attr] === \"function\") {\n handler = controller[attr];\n } else if (typeof attr === \"string\" && attr.startsWith(\"this.event_\")) {\n handler = controller.getEvents()[ev_type];\n if (!handler) {\n return;\n }\n handler = handler[attr.slice(\"this.event_\".length)];\n if (!handler) {\n return;\n }\n }\n handler && handler.call(controller, $elm, event);\n });\n if (is_last_elem) return;\n controller = controller._parentController;\n }\n }\n if (is_done) return;\n $elm = $elm.parent();\n }\n return {\n res: true\n };\n}\n\n/**\n *\n */\nfunction initEvents() {\n const $window = $(window);\n STD_EVENT_LIST.forEach(ev_type => {\n $window.off(ev_type).on(ev_type, windowEventHandler);\n });\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n */\nfunction setControllerEvents(controller) {\n if (controller._isEventsSet) {\n return;\n }\n const events = controller.getEvents();\n for (let ev_type in events) {\n if (events.hasOwnProperty(ev_type)) {\n let eventList = events[ev_type];\n for (let domSelector in eventList) {\n if (eventList.hasOwnProperty(domSelector)) {\n controller.find(domSelector).each(function () {\n let $elements = $(this);\n let event_list = $elements.attr(`sdc_${ev_type}`) || null;\n if (!event_list) event_list = [];else event_list = event_list.split(\" \");\n const new_key = `this.event_${domSelector}`;\n if (event_list.indexOf(new_key) === -1) {\n event_list.push(new_key);\n $elements.attr(`sdc_${ev_type}`, event_list.join(\" \"));\n }\n });\n }\n }\n }\n }\n // TODO: Is it needed\n //controller._isEventsSet = true;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0ksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hEO1VBQ0YsQ0FBQyxDQUFDO1FBQ0o7TUFDRjtJQUNGO0VBQ0Y7RUFDQTtFQUNBO0FBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2RvbV9ldmVudHMuanM/NDMzOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb250cm9sbGVyIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcblxuZXhwb3J0IGNvbnN0IFNURF9FVkVOVF9CTEFDS19MSVNUID0gW1wib25iZWZvcmV1bmxvYWRcIiwgXCJvbnVubG9hZFwiXTtcbmV4cG9ydCBjb25zdCBTVERfRVZFTlRfTElTVCA9IE9iamVjdC5rZXlzKHdpbmRvdylcbiAgLmZpbHRlcigoa2V5KSA9PiAvXm9uLy50ZXN0KGtleSkgJiYgIVNURF9FVkVOVF9CTEFDS19MSVNULmluY2x1ZGVzKGtleSkpXG4gIC5tYXAoKHgpID0+IHguc2xpY2UoMikpO1xuXG5mdW5jdGlvbiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGUsIHRhcmdldCkge1xuICBsZXQgZWxlbWVudFVuZGVyTW91c2U7XG4gIHN3aXRjaCAoZXZfdHlwZSkge1xuICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBjYXNlIFwibW91c2VlbnRlclwiOlxuICAgIGNhc2UgXCJtb3VzZWluXCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd0V2ZW50SGFuZGxlcihldmVudCkge1xuICBsZXQgZXZfdHlwZSA9IGV2ZW50LnR5cGU7XG4gIGlmIChcbiAgICBldmVudC5oYXNPd25Qcm9wZXJ0eShcIm5hbWVzcGFjZVwiKSAmJlxuICAgIGV2ZW50Lm5hbWVzcGFjZSAmJlxuICAgIGV2ZW50Lm5hbWVzcGFjZS5sZW5ndGhcbiAgKVxuICAgIGV2X3R5cGUgKz0gYC4ke2V2ZW50Lm5hbWVzcGFjZX1gO1xuXG4gIGxldCAkZWxtID0gJChldmVudC50YXJnZXQpO1xuICBsZXQgY29udHJvbGxlciA9IG51bGw7XG4gIGxldCBpc19kb25lID0gZmFsc2U7XG4gIGxldCBpc19sYXN0X2VsZW0gPSBmYWxzZTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4gKGlzX2xhc3RfZWxlbSA9IHRydWUpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSAoKSA9PiAoaXNfbGFzdF9lbGVtID0gaXNfZG9uZSA9IHRydWUpO1xuICB3aGlsZSAoJGVsbS5sZW5ndGgpIHtcbiAgICBsZXQgYXR0cnMgPSAkZWxtLmF0dHIoYHNkY18ke2V2X3R5cGV9YCk7XG4gICAgaWYgKGF0dHJzICYmIGNoZWNrSWZFdmVudEZpdHMoZXZfdHlwZSwgZXZlbnQsICRlbG1bMF0pKSB7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGVsbSk7XG4gICAgICAgIGlmICghY29udHJvbGxlcikgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYXR0cnMuc3BsaXQoXCIgXCIpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoaXNfZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIGxldCBoYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICBpZiAodHlwZW9mIGF0dHIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaGFuZGxlciA9IGF0dHI7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udHJvbGxlclthdHRyXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gY29udHJvbGxlclthdHRyXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGF0dHIgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGF0dHIuc3RhcnRzV2l0aChcInRoaXMuZXZlbnRfXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gY29udHJvbGxlci5nZXRFdmVudHMoKVtldl90eXBlXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlclthdHRyLnNsaWNlKFwidGhpcy5ldmVudF9cIi5sZW5ndGgpXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaGFuZGxlciAmJiBoYW5kbGVyLmNhbGwoY29udHJvbGxlciwgJGVsbSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzX2xhc3RfZWxlbSkgcmV0dXJuO1xuICAgICAgICBjb250cm9sbGVyID0gY29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX2RvbmUpIHJldHVybjtcbiAgICAkZWxtID0gJGVsbS5wYXJlbnQoKTtcbiAgfVxuXG4gIHJldHVybiB7IHJlczogdHJ1ZSB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXZlbnRzKCkge1xuICBjb25zdCAkd2luZG93ID0gJCh3aW5kb3cpO1xuICBTVERfRVZFTlRfTElTVC5mb3JFYWNoKChldl90eXBlKSA9PiB7XG4gICAgJHdpbmRvdy5vZmYoZXZfdHlwZSkub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRyb2xsZXJFdmVudHMoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5faXNFdmVudHNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBldmVudHMgPSBjb250cm9sbGVyLmdldEV2ZW50cygpO1xuICBmb3IgKGxldCBldl90eXBlIGluIGV2ZW50cykge1xuICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkoZXZfdHlwZSkpIHtcbiAgICAgIGxldCBldmVudExpc3QgPSBldmVudHNbZXZfdHlwZV07XG4gICAgICBmb3IgKGxldCBkb21TZWxlY3RvciBpbiBldmVudExpc3QpIHtcbiAgICAgICAgaWYgKGV2ZW50TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21TZWxlY3RvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmZpbmQoZG9tU2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0ICRlbGVtZW50cyA9ICQodGhpcyk7XG4gICAgICAgICAgICBsZXQgZXZlbnRfbGlzdCA9ICRlbGVtZW50cy5hdHRyKGBzZGNfJHtldl90eXBlfWApIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50X2xpc3QpIGV2ZW50X2xpc3QgPSBbXTtcbiAgICAgICAgICAgIGVsc2UgZXZlbnRfbGlzdCA9IGV2ZW50X2xpc3Quc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgbmV3X2tleSA9IGB0aGlzLmV2ZW50XyR7ZG9tU2VsZWN0b3J9YDtcbiAgICAgICAgICAgIGlmIChldmVudF9saXN0LmluZGV4T2YobmV3X2tleSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGV2ZW50X2xpc3QucHVzaChuZXdfa2V5KTtcbiAgICAgICAgICAgICAgJGVsZW1lbnRzLmF0dHIoYHNkY18ke2V2X3R5cGV9YCwgZXZlbnRfbGlzdC5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gVE9ETzogSXMgaXQgbmVlZGVkXG4gIC8vY29udHJvbGxlci5faXNFdmVudHNTZXQgPSB0cnVlO1xufVxuIl0sIm5hbWVzIjpbImdldENvbnRyb2xsZXIiLCJTVERfRVZFTlRfQkxBQ0tfTElTVCIsIlNURF9FVkVOVF9MSVNUIiwiT2JqZWN0Iiwia2V5cyIsIndpbmRvdyIsImZpbHRlciIsImtleSIsInRlc3QiLCJpbmNsdWRlcyIsIm1hcCIsIngiLCJzbGljZSIsImNoZWNrSWZFdmVudEZpdHMiLCJldl90eXBlIiwiZSIsInRhcmdldCIsImVsZW1lbnRVbmRlck1vdXNlIiwiZG9jdW1lbnQiLCJlbGVtZW50RnJvbVBvaW50IiwiY2xpZW50WCIsImNsaWVudFkiLCJjb250YWlucyIsIndpbmRvd0V2ZW50SGFuZGxlciIsImV2ZW50IiwidHlwZSIsImhhc093blByb3BlcnR5IiwibmFtZXNwYWNlIiwibGVuZ3RoIiwiJGVsbSIsIiQiLCJjb250cm9sbGVyIiwiaXNfZG9uZSIsImlzX2xhc3RfZWxlbSIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInN0b3BQcm9wYWdhdGlvbiIsImF0dHJzIiwiYXR0ciIsInNwbGl0IiwiZm9yRWFjaCIsImhhbmRsZXIiLCJzdGFydHNXaXRoIiwiZ2V0RXZlbnRzIiwiY2FsbCIsIl9wYXJlbnRDb250cm9sbGVyIiwicGFyZW50IiwicmVzIiwiaW5pdEV2ZW50cyIsIiR3aW5kb3ciLCJvZmYiLCJvbiIsInNldENvbnRyb2xsZXJFdmVudHMiLCJfaXNFdmVudHNTZXQiLCJldmVudHMiLCJldmVudExpc3QiLCJkb21TZWxlY3RvciIsImZpbmQiLCJlYWNoIiwiJGVsZW1lbnRzIiwiZXZlbnRfbGlzdCIsIm5ld19rZXkiLCJpbmRleE9mIiwicHVzaCIsImpvaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_dom_events.js\n\n}");
57
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ STD_EVENT_BLACK_LIST: () => (/* binding */ STD_EVENT_BLACK_LIST),\n/* harmony export */ STD_EVENT_LIST: () => (/* binding */ STD_EVENT_LIST),\n/* harmony export */ initEvents: () => (/* binding */ initEvents),\n/* harmony export */ setControllerEvents: () => (/* binding */ setControllerEvents),\n/* harmony export */ windowEventHandler: () => (/* binding */ windowEventHandler)\n/* harmony export */ });\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\nconst STD_EVENT_BLACK_LIST = [\"onbeforeunload\", \"onunload\"];\nconst STD_EVENT_LIST = Object.keys(window)\n .filter((key) => /^on/.test(key) && !STD_EVENT_BLACK_LIST.includes(key))\n .map((x) => x.slice(2));\n\nfunction checkIfEventFits(ev_type, e, target) {\n let elementUnderMouse;\n switch (ev_type) {\n case \"mouseleave\":\n case \"mouseout\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n case \"mouseenter\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n default:\n return true;\n }\n}\n\nfunction windowEventHandler(event) {\n let ev_type = event.type;\n if (\n Object.hasOwn(event, \"namespace\") &&\n event.namespace &&\n event.namespace.length\n )\n ev_type += `.${event.namespace}`;\n\n let $elm = $(event.target);\n let controller = null;\n let is_done = false;\n let is_last_elem = false;\n event.stopImmediatePropagation = () => (is_last_elem = true);\n event.stopPropagation = () => (is_last_elem = is_done = true);\n while ($elm.length) {\n let attrs = $elm.attr(`sdc_${ev_type}`);\n if (attrs && checkIfEventFits(ev_type, event, $elm[0])) {\n if (!controller) {\n controller = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_0__.getController)($elm);\n if (!controller) return;\n }\n while (controller) {\n attrs.split(\" \").forEach((attr) => {\n if (is_done) return;\n let handler = null;\n if (typeof attr === \"function\") {\n handler = attr;\n } else if (typeof controller[attr] === \"function\") {\n handler = controller[attr];\n } else if (\n typeof attr === \"string\" &&\n attr.startsWith(\"this.event_\")\n ) {\n handler = controller.getEvents()[ev_type];\n if (!handler) {\n return;\n }\n handler = handler[attr.slice(\"this.event_\".length)];\n if (!handler) {\n return;\n }\n }\n\n handler && handler.call(controller, $elm, event);\n });\n if (is_last_elem) return;\n controller = controller._parentController;\n }\n }\n if (is_done) return;\n $elm = $elm.parent();\n }\n\n return { res: true };\n}\n\n/**\n *\n */\nfunction initEvents() {\n const $window = $(window);\n STD_EVENT_LIST.forEach((ev_type) => {\n $window.off(ev_type).on(ev_type, windowEventHandler);\n });\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n */\nfunction setControllerEvents(controller) {\n const events = controller.getEvents();\n for (let ev_type in events) {\n if (Object.hasOwn(events, ev_type)) {\n let eventList = events[ev_type];\n for (let domSelector in eventList) {\n if (Object.hasOwn(eventList, domSelector)) {\n controller.find(domSelector).each(function () {\n let $elements = $(this);\n let event_list = $elements.attr(`sdc_${ev_type}`) || null;\n if (!event_list) event_list = [];\n else event_list = event_list.split(\" \");\n const new_key = `this.event_${domSelector}`;\n if (event_list.indexOf(new_key) === -1) {\n event_list.push(new_key);\n $elements.attr(`sdc_${ev_type}`, event_list.join(\" \"));\n }\n });\n }\n }\n }\n }\n // Not cached on purpose: a refresh can add new elements that match the selectors,\n // so the attributes are set again on every refresh (existing entries are skipped).\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfZG9tX2V2ZW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBOEM7O0FBRXZDO0FBQ0E7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBLHFCQUFxQiwyREFBYTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0Esb0NBQW9DLFFBQVE7QUFDNUM7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2RvbV9ldmVudHMuanM/YzdmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb250cm9sbGVyIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcblxuZXhwb3J0IGNvbnN0IFNURF9FVkVOVF9CTEFDS19MSVNUID0gW1wib25iZWZvcmV1bmxvYWRcIiwgXCJvbnVubG9hZFwiXTtcbmV4cG9ydCBjb25zdCBTVERfRVZFTlRfTElTVCA9IE9iamVjdC5rZXlzKHdpbmRvdylcbiAgLmZpbHRlcigoa2V5KSA9PiAvXm9uLy50ZXN0KGtleSkgJiYgIVNURF9FVkVOVF9CTEFDS19MSVNULmluY2x1ZGVzKGtleSkpXG4gIC5tYXAoKHgpID0+IHguc2xpY2UoMikpO1xuXG5mdW5jdGlvbiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGUsIHRhcmdldCkge1xuICBsZXQgZWxlbWVudFVuZGVyTW91c2U7XG4gIHN3aXRjaCAoZXZfdHlwZSkge1xuICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBjYXNlIFwibW91c2VlbnRlclwiOlxuICAgICAgZWxlbWVudFVuZGVyTW91c2UgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRhcmdldCAhPT0gZWxlbWVudFVuZGVyTW91c2UgJiYgIXRhcmdldC5jb250YWlucyhlbGVtZW50VW5kZXJNb3VzZSlcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dFdmVudEhhbmRsZXIoZXZlbnQpIHtcbiAgbGV0IGV2X3R5cGUgPSBldmVudC50eXBlO1xuICBpZiAoXG4gICAgT2JqZWN0Lmhhc093bihldmVudCwgXCJuYW1lc3BhY2VcIikgJiZcbiAgICBldmVudC5uYW1lc3BhY2UgJiZcbiAgICBldmVudC5uYW1lc3BhY2UubGVuZ3RoXG4gIClcbiAgICBldl90eXBlICs9IGAuJHtldmVudC5uYW1lc3BhY2V9YDtcblxuICBsZXQgJGVsbSA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsO1xuICBsZXQgaXNfZG9uZSA9IGZhbHNlO1xuICBsZXQgaXNfbGFzdF9lbGVtID0gZmFsc2U7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IChpc19sYXN0X2VsZW0gPSB0cnVlKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gKCkgPT4gKGlzX2xhc3RfZWxlbSA9IGlzX2RvbmUgPSB0cnVlKTtcbiAgd2hpbGUgKCRlbG0ubGVuZ3RoKSB7XG4gICAgbGV0IGF0dHJzID0gJGVsbS5hdHRyKGBzZGNfJHtldl90eXBlfWApO1xuICAgIGlmIChhdHRycyAmJiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGV2ZW50LCAkZWxtWzBdKSkge1xuICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCRlbG0pO1xuICAgICAgICBpZiAoIWNvbnRyb2xsZXIpIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF0dHJzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgaWYgKGlzX2RvbmUpIHJldHVybjtcbiAgICAgICAgICBsZXQgaGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhdHRyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSBhdHRyO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXJbYXR0cl0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaGFuZGxlciA9IGNvbnRyb2xsZXJbYXR0cl07XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBhdHRyID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBhdHRyLnN0YXJ0c1dpdGgoXCJ0aGlzLmV2ZW50X1wiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaGFuZGxlciA9IGNvbnRyb2xsZXIuZ2V0RXZlbnRzKClbZXZfdHlwZV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJbYXR0ci5zbGljZShcInRoaXMuZXZlbnRfXCIubGVuZ3RoKV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhbmRsZXIgJiYgaGFuZGxlci5jYWxsKGNvbnRyb2xsZXIsICRlbG0sIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc19sYXN0X2VsZW0pIHJldHVybjtcbiAgICAgICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc19kb25lKSByZXR1cm47XG4gICAgJGVsbSA9ICRlbG0ucGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4geyByZXM6IHRydWUgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEV2ZW50cygpIHtcbiAgY29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcbiAgU1REX0VWRU5UX0xJU1QuZm9yRWFjaCgoZXZfdHlwZSkgPT4ge1xuICAgICR3aW5kb3cub2ZmKGV2X3R5cGUpLm9uKGV2X3R5cGUsIHdpbmRvd0V2ZW50SGFuZGxlcik7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250cm9sbGVyRXZlbnRzKGNvbnRyb2xsZXIpIHtcbiAgY29uc3QgZXZlbnRzID0gY29udHJvbGxlci5nZXRFdmVudHMoKTtcbiAgZm9yIChsZXQgZXZfdHlwZSBpbiBldmVudHMpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudHMsIGV2X3R5cGUpKSB7XG4gICAgICBsZXQgZXZlbnRMaXN0ID0gZXZlbnRzW2V2X3R5cGVdO1xuICAgICAgZm9yIChsZXQgZG9tU2VsZWN0b3IgaW4gZXZlbnRMaXN0KSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50TGlzdCwgZG9tU2VsZWN0b3IpKSB7XG4gICAgICAgICAgY29udHJvbGxlci5maW5kKGRvbVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCAkZWxlbWVudHMgPSAkKHRoaXMpO1xuICAgICAgICAgICAgbGV0IGV2ZW50X2xpc3QgPSAkZWxlbWVudHMuYXR0cihgc2RjXyR7ZXZfdHlwZX1gKSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKCFldmVudF9saXN0KSBldmVudF9saXN0ID0gW107XG4gICAgICAgICAgICBlbHNlIGV2ZW50X2xpc3QgPSBldmVudF9saXN0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld19rZXkgPSBgdGhpcy5ldmVudF8ke2RvbVNlbGVjdG9yfWA7XG4gICAgICAgICAgICBpZiAoZXZlbnRfbGlzdC5pbmRleE9mKG5ld19rZXkpID09PSAtMSkge1xuICAgICAgICAgICAgICBldmVudF9saXN0LnB1c2gobmV3X2tleSk7XG4gICAgICAgICAgICAgICRlbGVtZW50cy5hdHRyKGBzZGNfJHtldl90eXBlfWAsIGV2ZW50X2xpc3Quam9pbihcIiBcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIE5vdCBjYWNoZWQgb24gcHVycG9zZTogYSByZWZyZXNoIGNhbiBhZGQgbmV3IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9ycyxcbiAgLy8gc28gdGhlIGF0dHJpYnV0ZXMgYXJlIHNldCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoIChleGlzdGluZyBlbnRyaWVzIGFyZSBza2lwcGVkKS5cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_dom_events.js\n\n}");
48
58
 
49
59
  /***/ },
50
60
 
@@ -54,7 +64,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
54
64
  \********************************************/
55
65
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
56
66
 
57
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ allOff: () => (/* binding */ allOff),\n/* harmony export */ on: () => (/* binding */ on),\n/* harmony export */ setEvent: () => (/* binding */ setEvent),\n/* harmony export */ trigger: () => (/* binding */ trigger)\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\n\n/**\n * A list of handler (controller) for the registered events.\n * @type {{}}\n */\nlet handlerList = {};\n\n/**\n * eventList is a map connection the event to a responsing function name.\n * @type {{}}\n */\nlet eventList = {};\n\n/**\n * on is a function to register a controller to a event. The controller has to\n * implement the the handler function. The handler functions by default has the same\n * name as the event. You can use the app.events.setEvent function to register a\n * event with a different named function.\n *\n * @param {string} name - the event name String\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction on(name, controller) {\n setEvent(name);\n if (!eventList.hasOwnProperty(name)) {\n return console.log(\"No event: \" + name, controller);\n }\n let funcName = eventList[name];\n if (!controller[funcName]) {\n return console.log(\"No event handler: \" + name, controller);\n }\n handlerList[name].push(controller);\n}\n\n/**\n * setEvent allows you to register a event with a function with a different\n * name as the event.\n *\n * @param {string} name - event name\n * @param {string} functionName - function name\n */\nfunction setEvent(name, functionName) {\n if (!functionName) {\n functionName = name;\n }\n if (!eventList[name]) {\n eventList[name] = functionName;\n handlerList[name] = [];\n }\n}\n\n/**\n * allOff is to remove all events of the controller instance\n * ! important before destroying the instance.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction allOff(controller) {\n for (let eventName in handlerList) {\n if (handlerList.hasOwnProperty(eventName)) {\n for (let i = handlerList[eventName].length - 1; i >= 0; i--) {\n if (controller === handlerList[eventName][i]) {\n handlerList[eventName].splice(i, 1);\n }\n }\n }\n }\n}\n\n/**\n * trigger triggers the event. The handler function of all registered\n * controller gets called. The returned Promise returns a list with all\n * returned values.\n *\n * @param {string} name - event name\n * @returns {Promise<object>} - waits to return all return values of the handler\n */\nfunction trigger(name) {\n let args = Array.apply(null, arguments);\n name = args.shift();\n if (!handlerList.hasOwnProperty(name) || !eventList.hasOwnProperty(name)) {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)();\n }\n let handler = handlerList[name];\n let funcName = eventList[name];\n let list = [];\n for (let i = 0; i < handler.length; i++) {\n let return_val = handler[i][funcName].apply(handler[i], args);\n if (typeof return_val !== \"undefined\") {\n list.push(return_val);\n }\n }\n return Promise.all(list);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsRUFBRUEsQ0FBQyxHQUFHUyxPQUFPLENBQUNSLE1BQU0sRUFBRUQsQ0FBQyxFQUFFLEVBQUU7SUFDdkMsSUFBSVcsVUFBVSxHQUFHRixPQUFPLENBQUNULENBQUMsQ0FBQyxDQUFDTCxRQUFRLENBQUMsQ0FBQ1csS0FBSyxDQUFDRyxPQUFPLENBQUNULENBQUMsQ0FBQyxFQUFFSSxJQUFJLENBQUM7SUFDN0QsSUFBSSxPQUFPTyxVQUFVLEtBQUssV0FBVyxFQUFFO01BQ3JDRCxJQUFJLENBQUNkLElBQUksQ0FBQ2UsVUFBVSxDQUFDO0lBQ3ZCO0VBQ0Y7RUFFQSxPQUFPQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0gsSUFBSSxDQUFDO0FBQzFCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19ldmVudHMuanM/OGI4OCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlRHVtbXlGYWN0b3J5IH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQSBsaXN0IG9mIGhhbmRsZXIgKGNvbnRyb2xsZXIpIGZvciB0aGUgcmVnaXN0ZXJlZCBldmVudHMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBoYW5kbGVyTGlzdCA9IHt9O1xuXG4vKipcbiAqIGV2ZW50TGlzdCBpcyBhIG1hcCBjb25uZWN0aW9uIHRoZSBldmVudCB0byBhIHJlc3BvbnNpbmcgZnVuY3Rpb24gbmFtZS5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGV2ZW50TGlzdCA9IHt9O1xuXG4vKipcbiAqIG9uIGlzIGEgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSBjb250cm9sbGVyIHRvIGEgZXZlbnQuIFRoZSBjb250cm9sbGVyIGhhcyB0b1xuICogaW1wbGVtZW50IHRoZSB0aGUgaGFuZGxlciBmdW5jdGlvbi4gVGhlIGhhbmRsZXIgZnVuY3Rpb25zIGJ5IGRlZmF1bHQgaGFzIHRoZSBzYW1lXG4gKiBuYW1lIGFzIHRoZSBldmVudC4gWW91IGNhbiB1c2UgdGhlIGFwcC5ldmVudHMuc2V0RXZlbnQgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYVxuICogZXZlbnQgd2l0aCBhIGRpZmZlcmVudCBuYW1lZCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBldmVudCBuYW1lIFN0cmluZ1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtICBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uKG5hbWUsIGNvbnRyb2xsZXIpIHtcbiAgc2V0RXZlbnQobmFtZSk7XG4gIGlmICghZXZlbnRMaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiTm8gZXZlbnQ6IFwiICsgbmFtZSwgY29udHJvbGxlcik7XG4gIH1cblxuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG4gIGlmICghY29udHJvbGxlcltmdW5jTmFtZV0pIHtcbiAgICByZXR1cm4gY29uc29sZS5sb2coXCJObyBldmVudCBoYW5kbGVyOiBcIiArIG5hbWUsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgaGFuZGxlckxpc3RbbmFtZV0ucHVzaChjb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiBzZXRFdmVudCBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgZXZlbnQgd2l0aCBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnRcbiAqIG5hbWUgYXMgdGhlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gZXZlbnQgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIGZ1bmN0aW9uIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV2ZW50KG5hbWUsIGZ1bmN0aW9uTmFtZSkge1xuICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgIGZ1bmN0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBpZiAoIWV2ZW50TGlzdFtuYW1lXSkge1xuICAgIGV2ZW50TGlzdFtuYW1lXSA9IGZ1bmN0aW9uTmFtZTtcbiAgICBoYW5kbGVyTGlzdFtuYW1lXSA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogYWxsT2ZmIGlzIHRvIHJlbW92ZSBhbGwgZXZlbnRzIG9mIHRoZSBjb250cm9sbGVyIGluc3RhbmNlXG4gKiAhIGltcG9ydGFudCBiZWZvcmUgZGVzdHJveWluZyB0aGUgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsT2ZmKGNvbnRyb2xsZXIpIHtcbiAgZm9yIChsZXQgZXZlbnROYW1lIGluIGhhbmRsZXJMaXN0KSB7XG4gICAgaWYgKGhhbmRsZXJMaXN0Lmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVyTGlzdFtldmVudE5hbWVdLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChjb250cm9sbGVyID09PSBoYW5kbGVyTGlzdFtldmVudE5hbWVdW2ldKSB7XG4gICAgICAgICAgaGFuZGxlckxpc3RbZXZlbnROYW1lXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiB0cmlnZ2VyIHRyaWdnZXJzIHRoZSBldmVudC4gVGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YgYWxsIHJlZ2lzdGVyZWRcbiAqIGNvbnRyb2xsZXIgZ2V0cyBjYWxsZWQuIFRoZSByZXR1cm5lZCBQcm9taXNlIHJldHVybnMgYSBsaXN0IHdpdGggYWxsXG4gKiByZXR1cm5lZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBldmVudCBuYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSAtIHdhaXRzIHRvIHJldHVybiBhbGwgcmV0dXJuIHZhbHVlcyBvZiB0aGUgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlcihuYW1lKSB7XG4gIGxldCBhcmdzID0gQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgbmFtZSA9IGFyZ3Muc2hpZnQoKTtcbiAgaWYgKCFoYW5kbGVyTGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSB8fCAhZXZlbnRMaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIHByb21pc2VEdW1teUZhY3RvcnkoKTtcbiAgfVxuICBsZXQgaGFuZGxlciA9IGhhbmRsZXJMaXN0W25hbWVdO1xuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG5cbiAgbGV0IGxpc3QgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgcmV0dXJuX3ZhbCA9IGhhbmRsZXJbaV1bZnVuY05hbWVdLmFwcGx5KGhhbmRsZXJbaV0sIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgcmV0dXJuX3ZhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbGlzdC5wdXNoKHJldHVybl92YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChsaXN0KTtcbn1cbiJdLCJuYW1lcyI6WyJwcm9taXNlRHVtbXlGYWN0b3J5IiwiaGFuZGxlckxpc3QiLCJldmVudExpc3QiLCJvbiIsIm5hbWUiLCJjb250cm9sbGVyIiwic2V0RXZlbnQiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbnNvbGUiLCJsb2ciLCJmdW5jTmFtZSIsInB1c2giLCJmdW5jdGlvbk5hbWUiLCJhbGxPZmYiLCJldmVudE5hbWUiLCJpIiwibGVuZ3RoIiwic3BsaWNlIiwidHJpZ2dlciIsImFyZ3MiLCJBcnJheSIsImFwcGx5IiwiYXJndW1lbnRzIiwic2hpZnQiLCJoYW5kbGVyIiwibGlzdCIsInJldHVybl92YWwiLCJQcm9taXNlIiwiYWxsIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_events.js\n\n}");
67
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ allOff: () => (/* binding */ allOff),\n/* harmony export */ on: () => (/* binding */ on),\n/* harmony export */ setEvent: () => (/* binding */ setEvent),\n/* harmony export */ trigger: () => (/* binding */ trigger)\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\n\n/**\n * A list of handler (controller) for the registered events.\n * @type {{}}\n */\nlet handlerList = {};\n\n/**\n * eventList is a map connection the event to a responsing function name.\n * @type {{}}\n */\nlet eventList = {};\n\n/**\n * on is a function to register a controller to a event. The controller has to\n * implement the the handler function. The handler functions by default has the same\n * name as the event. You can use the app.events.setEvent function to register a\n * event with a different named function.\n *\n * @param {string} name - the event name String\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction on(name, controller) {\n setEvent(name);\n if (!Object.hasOwn(eventList, name)) {\n return console.log(\"No event: \" + name, controller);\n }\n\n let funcName = eventList[name];\n if (!controller[funcName]) {\n return console.log(\"No event handler: \" + name, controller);\n }\n\n handlerList[name].push(controller);\n}\n\n/**\n * setEvent allows you to register a event with a function with a different\n * name as the event.\n *\n * @param {string} name - event name\n * @param {string} functionName - function name\n */\nfunction setEvent(name, functionName) {\n if (!functionName) {\n functionName = name;\n }\n\n if (!eventList[name]) {\n eventList[name] = functionName;\n handlerList[name] = [];\n }\n}\n\n/**\n * allOff is to remove all events of the controller instance\n * ! important before destroying the instance.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction allOff(controller) {\n for (let eventName in handlerList) {\n if (Object.hasOwn(handlerList, eventName)) {\n for (let i = handlerList[eventName].length - 1; i >= 0; i--) {\n if (controller === handlerList[eventName][i]) {\n handlerList[eventName].splice(i, 1);\n }\n }\n }\n }\n}\n\n/**\n * trigger triggers the event. The handler function of all registered\n * controller gets called. The returned Promise returns a list with all\n * returned values.\n *\n * @param {string} name - event name\n * @returns {Promise<object>} - waits to return all return values of the handler\n */\nfunction trigger(name) {\n let args = Array.apply(null, arguments);\n name = args.shift();\n if (!Object.hasOwn(handlerList, name) || !Object.hasOwn(eventList, name)) {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)();\n }\n let handler = handlerList[name];\n let funcName = eventList[name];\n\n let list = [];\n\n for (let i = 0; i < handler.length; i++) {\n let return_val = handler[i][funcName].apply(handler[i], args);\n if (typeof return_val !== \"undefined\") {\n list.push(return_val);\n }\n }\n\n return Promise.all(list);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfZXZlbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsYUFBYTtBQUN4QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBO0FBQ0Esc0RBQXNELFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLGlCQUFpQjtBQUM5QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrRUFBbUI7QUFDOUI7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19ldmVudHMuanM/NjEzZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlRHVtbXlGYWN0b3J5IH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQSBsaXN0IG9mIGhhbmRsZXIgKGNvbnRyb2xsZXIpIGZvciB0aGUgcmVnaXN0ZXJlZCBldmVudHMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBoYW5kbGVyTGlzdCA9IHt9O1xuXG4vKipcbiAqIGV2ZW50TGlzdCBpcyBhIG1hcCBjb25uZWN0aW9uIHRoZSBldmVudCB0byBhIHJlc3BvbnNpbmcgZnVuY3Rpb24gbmFtZS5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGV2ZW50TGlzdCA9IHt9O1xuXG4vKipcbiAqIG9uIGlzIGEgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSBjb250cm9sbGVyIHRvIGEgZXZlbnQuIFRoZSBjb250cm9sbGVyIGhhcyB0b1xuICogaW1wbGVtZW50IHRoZSB0aGUgaGFuZGxlciBmdW5jdGlvbi4gVGhlIGhhbmRsZXIgZnVuY3Rpb25zIGJ5IGRlZmF1bHQgaGFzIHRoZSBzYW1lXG4gKiBuYW1lIGFzIHRoZSBldmVudC4gWW91IGNhbiB1c2UgdGhlIGFwcC5ldmVudHMuc2V0RXZlbnQgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYVxuICogZXZlbnQgd2l0aCBhIGRpZmZlcmVudCBuYW1lZCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBldmVudCBuYW1lIFN0cmluZ1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtICBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uKG5hbWUsIGNvbnRyb2xsZXIpIHtcbiAgc2V0RXZlbnQobmFtZSk7XG4gIGlmICghT2JqZWN0Lmhhc093bihldmVudExpc3QsIG5hbWUpKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiTm8gZXZlbnQ6IFwiICsgbmFtZSwgY29udHJvbGxlcik7XG4gIH1cblxuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG4gIGlmICghY29udHJvbGxlcltmdW5jTmFtZV0pIHtcbiAgICByZXR1cm4gY29uc29sZS5sb2coXCJObyBldmVudCBoYW5kbGVyOiBcIiArIG5hbWUsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgaGFuZGxlckxpc3RbbmFtZV0ucHVzaChjb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiBzZXRFdmVudCBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgZXZlbnQgd2l0aCBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnRcbiAqIG5hbWUgYXMgdGhlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gZXZlbnQgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIGZ1bmN0aW9uIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV2ZW50KG5hbWUsIGZ1bmN0aW9uTmFtZSkge1xuICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgIGZ1bmN0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBpZiAoIWV2ZW50TGlzdFtuYW1lXSkge1xuICAgIGV2ZW50TGlzdFtuYW1lXSA9IGZ1bmN0aW9uTmFtZTtcbiAgICBoYW5kbGVyTGlzdFtuYW1lXSA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogYWxsT2ZmIGlzIHRvIHJlbW92ZSBhbGwgZXZlbnRzIG9mIHRoZSBjb250cm9sbGVyIGluc3RhbmNlXG4gKiAhIGltcG9ydGFudCBiZWZvcmUgZGVzdHJveWluZyB0aGUgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsT2ZmKGNvbnRyb2xsZXIpIHtcbiAgZm9yIChsZXQgZXZlbnROYW1lIGluIGhhbmRsZXJMaXN0KSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oaGFuZGxlckxpc3QsIGV2ZW50TmFtZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVyTGlzdFtldmVudE5hbWVdLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChjb250cm9sbGVyID09PSBoYW5kbGVyTGlzdFtldmVudE5hbWVdW2ldKSB7XG4gICAgICAgICAgaGFuZGxlckxpc3RbZXZlbnROYW1lXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiB0cmlnZ2VyIHRyaWdnZXJzIHRoZSBldmVudC4gVGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YgYWxsIHJlZ2lzdGVyZWRcbiAqIGNvbnRyb2xsZXIgZ2V0cyBjYWxsZWQuIFRoZSByZXR1cm5lZCBQcm9taXNlIHJldHVybnMgYSBsaXN0IHdpdGggYWxsXG4gKiByZXR1cm5lZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBldmVudCBuYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSAtIHdhaXRzIHRvIHJldHVybiBhbGwgcmV0dXJuIHZhbHVlcyBvZiB0aGUgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlcihuYW1lKSB7XG4gIGxldCBhcmdzID0gQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgbmFtZSA9IGFyZ3Muc2hpZnQoKTtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGhhbmRsZXJMaXN0LCBuYW1lKSB8fCAhT2JqZWN0Lmhhc093bihldmVudExpc3QsIG5hbWUpKSB7XG4gICAgcmV0dXJuIHByb21pc2VEdW1teUZhY3RvcnkoKTtcbiAgfVxuICBsZXQgaGFuZGxlciA9IGhhbmRsZXJMaXN0W25hbWVdO1xuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG5cbiAgbGV0IGxpc3QgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgcmV0dXJuX3ZhbCA9IGhhbmRsZXJbaV1bZnVuY05hbWVdLmFwcGx5KGhhbmRsZXJbaV0sIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgcmV0dXJuX3ZhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbGlzdC5wdXNoKHJldHVybl92YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChsaXN0KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_events.js\n\n}");
58
68
 
59
69
  /***/ },
60
70
 
@@ -64,7 +74,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
64
74
  \******************************************/
65
75
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
66
76
 
67
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\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/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = {\n classname: \"class\"\n};\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n $new_elem[0].addEventListener(k.substring(2).toLowerCase(), v);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n return $new_elem;\n};\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\") ? event.type : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n const $globalDiv = $(\"<div></div>\");\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.forEach(tagName => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(`<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`);\n });\n const {\n refreshProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, $globalDiv, app.globalRootController, refreshProcess).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(), app.rootController, refreshProcess).then(res => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n controllerToTag: Controller => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: Controller => {\n app.register(Controller);\n let tagName = Controller.prototype._tagName;\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n },\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n }\n };\n }\n return {\n addMixin: (...mixins) => {}\n };\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n const p = new Promise((resolve, reject) => {\n return method(url, args).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n }).catch(reject);\n });\n return p;\n },\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n const redirector = a => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n };\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n }).catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n return p;\n },\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then(resolve).catch(reject);\n });\n },\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: $elem => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: $elem => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n return $elem;\n },\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: $elem => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n return $elem.remove();\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: controller => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then(html => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n $realNode = $realNode ?? controller.$container;\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(process, controller);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q21GLFVBQVUsQ0FBQztNQUN6QixJQUFJLENBQUM2QyxnQkFBZ0IsRUFBRTtRQUNyQi9ILGtGQUE4QixDQUFDZ0UsY0FBYyxDQUFDO01BQ2hEO01BQ0EsT0FBT2tCLFVBQVU7SUFDbkIsQ0FBQyxDQUFDO0VBQ0osQ0FBQztFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFeEYsT0FBTyxFQUFFQSxDQUFDc0ksSUFBSSxFQUFFQyxjQUFjLEdBQUcsSUFBSSxLQUFLO0lBQ3hDLE9BQU92SSxxREFBTyxDQUFDc0ksSUFBSSxFQUFFQyxjQUFjLENBQUM7RUFDdEM7QUFDRixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tYWluLmpzPzA4ZmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2FtZWxDYXNlVG9UYWdOYW1lLFxuICBnZXRCb2R5LFxuICB1cGxvYWRGaWxlRm9ybURhdGEsXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIsXG4gIHJlbG9hZEhUTUxDb250cm9sbGVyLFxuICBEQVRBX0NPTlRST0xMRVJfS0VZLFxuICBDT05UUk9MTEVSX0NMQVNTLFxuICBnZXRDb250cm9sbGVyLFxuICBjbGVhbkNhY2hlLFxuICByZWZyZXNoLFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTREMgfSBmcm9tIFwiLi9BYnN0cmFjdFNEQy5qc1wiO1xuaW1wb3J0IHtcbiAgR2xvYmFsLFxuICBjb250cm9sbGVyTGlzdCxcbiAgdGFnTGlzdCxcbiAgcmVzZXRDaGlsZHJlbixcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoLFxuICBwcmVwYXJlUmVmcmVzaFByb2Nlc3MsXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge1xuICBpbml0RXZlbnRzLFxuICBTVERfRVZFTlRfTElTVCxcbiAgd2luZG93RXZlbnRIYW5kbGVyLFxufSBmcm9tIFwiLi9zZGNfZG9tX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgcmVjb25jaWxlIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBpc0Nvbm5lY3RlZCwgY2xvc2UgfSBmcm9tIFwiLi9zZGNfc2VydmVyX2NhbGwuanNcIjtcblxuY29uc3QgUFJPUEVSVElFU19VUERBVEUgPSB7IGNsYXNzbmFtZTogXCJjbGFzc1wiIH07XG5cbmxldCBzZGNEb21GcmFnbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wcykge1xuICBsZXQgJG5ld19lbGVtLFxuICAgIGlzX3NlbGYgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgJG5ld19lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YWdOYW1lID0gYHRoaXMuJHtlbGVtZW50Lm5hbWV9YDtcbiAgICAkbmV3X2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgICRuZXdfZWxlbS5kYXRhKFwiaGFuZGxlclwiLCBlbGVtZW50KTtcbiAgICBpc19zZWxmID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9wcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGlmIChrLnN0YXJ0c1dpdGgoXCJvblwiKSkge1xuICAgICAgICAkbmV3X2VsZW1bMF0uYWRkRXZlbnRMaXN0ZW5lcihrLnN1YnN0cmluZygyKS50b0xvd2VyQ2FzZSgpLCB2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChQUk9QRVJUSUVTX1VQREFURVtrLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgayA9IFBST1BFUlRJRVNfVVBEQVRFW2sudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgICAgJG5ld19lbGVtWzBdLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc19zZWxmKSB7XG4gICAgJG5ld19lbGVtLmFkZENsYXNzKFwiX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgX3dpdGhfaGFuZGxlclwiKTtcbiAgfVxuXG4gIHJldHVybiAkbmV3X2VsZW07XG59O1xuXG53aW5kb3cuc2RjRG9tID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BzLCAuLi5jaGlsZHJlbikge1xuICBpZiAoIXRhZ05hbWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBjb25zdCAkbmV3X2VsZW0gPSBzZGNEb21GcmFnbWVudCh0YWdOYW1lLCBwcm9wcyk7XG4gIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICRuZXdfZWxlbS5hcHBlbmQoYyk7XG4gIH1cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn07XG5cbmV4cG9ydCBsZXQgYXBwID0ge1xuICBDU1JGX1RPS0VOOiB3aW5kb3cuQ1NSRl9UT0tFTiB8fCBcIlwiLFxuICBMQU5HVUFHRV9DT0RFOiB3aW5kb3cuTEFOR1VBR0VfQ09ERSB8fCBcImVuXCIsXG4gIERFQlVHOiB3aW5kb3cuREVCVUcgfHwgZmFsc2UsXG4gIFZFUlNJT046IHdpbmRvdy5WRVJTSU9OIHx8IFwiMC4wXCIsXG4gIHRhZ05hbWVzOiBbXSxcbiAgR2xvYmFsOiBHbG9iYWwsXG4gIHJvb3RDb250cm9sbGVyOiBudWxsLFxuICBnbG9iYWxSb290Q29udHJvbGxlcjogbnVsbCxcbiAgX2lzSW5pdDogZmFsc2UsXG4gIF9vcmlnaW5fdHJpZ2dlcjogbnVsbCxcbiAgX2dsb2JhbENvbnRyb2xsZXJDbGFzc2VzOiBbXSxcblxuICBpbml0X3NkYzogKCkgPT4ge1xuICAgIGlmICghYXBwLl9pc0luaXQpIHtcbiAgICAgIGFwcC5faXNJbml0ID0gdHJ1ZTtcbiAgICAgIGlmICghYXBwLl9vcmlnaW5fdHJpZ2dlcikge1xuICAgICAgICBhcHAuX29yaWdpbl90cmlnZ2VyID0gJC5mbi50cmlnZ2VyO1xuICAgICAgICAkLmZuLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBldl90eXBlID0ge30uaGFzT3duUHJvcGVydHkuY2FsbChldmVudCwgXCJ0eXBlXCIpXG4gICAgICAgICAgICA/IGV2ZW50LnR5cGVcbiAgICAgICAgICAgIDogZXZlbnQ7XG4gICAgICAgICAgaWYgKCFTVERfRVZFTlRfTElTVC5pbmNsdWRlcyhldl90eXBlKSkge1xuICAgICAgICAgICAgU1REX0VWRU5UX0xJU1QucHVzaChldl90eXBlKTtcbiAgICAgICAgICAgICQod2luZG93KS5vbihldl90eXBlLCB3aW5kb3dFdmVudEhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXBwLl9vcmlnaW5fdHJpZ2dlci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfTtcblxuICAgICAgICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICBpc0Nvbm5lY3RlZCgpO1xuXG4gICAgICBpbml0RXZlbnRzKCk7XG5cbiAgICAgIGFwcC5yb290Q29udHJvbGxlciA9IGFwcC5yb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICAgIGFwcC5nbG9iYWxSb290Q29udHJvbGxlciA9IGFwcC5nbG9iYWxSb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICB9XG5cbiAgICBhcHAudGFnTmFtZXMgPSB0YWdMaXN0KCk7XG5cbiAgICBjb25zdCAkZ2xvYmFsRGl2ID0gJChcIjxkaXY+PC9kaXY+XCIpO1xuICAgIEdsb2JhbC5mb3JFYWNoKCh0YWdOYW1lKSA9PiB7XG4gICAgICBjb25zdCBDb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgICAgICRnbG9iYWxEaXYuYXBwZW5kKFxuICAgICAgICBgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKG51bGwsIGFwcC5yb290Q29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICBhcHAudGFnTmFtZXMsXG4gICAgICAkZ2xvYmFsRGl2LFxuICAgICAgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLFxuICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgICBnZXRCb2R5KCksXG4gICAgICAgIGFwcC5yb290Q29udHJvbGxlcixcbiAgICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgICApLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfTtcbiAgICAkLmZuLnNhZmVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZUVtcHR5KCQodGhpcykpO1xuICAgIH07XG4gICAgJC5mbi5zYWZlUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVtb3ZlKCQodGhpcykpO1xuICAgIH07XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgXCJcIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IENvbnRyb2xsZXJcbiAgICovXG4gIHJlZ2lzdGVyR2xvYmFsOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGFwcC5yZWdpc3RlcihDb250cm9sbGVyKTtcbiAgICBsZXQgdGFnTmFtZSA9IENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lO1xuICAgIEdsb2JhbC5wdXNoKHRhZ05hbWUpO1xuICB9LFxuXG4gIGNsZWFuQ2FjaGU6ICgpID0+IHtcbiAgICBjbGVhbkNhY2hlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IENvbnRyb2xsZXJcbiAgICogQHBhcmFtIG92ZXJ3cml0ZVxuICAgKi9cbiAgcmVnaXN0ZXI6IChDb250cm9sbGVyLCBvdmVyd3JpdGUgPSBmYWxzZSkgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhDb250cm9sbGVyKTtcbiAgICBpZiAoIWNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdIHx8IG92ZXJ3cml0ZSkge1xuICAgICAgY29udHJvbGxlckxpc3RbdGFnTmFtZV0gPSBbQ29udHJvbGxlciwgW11dO1xuICAgICAgQ29udHJvbGxlci5wcm90b3R5cGUuX3RhZ05hbWUgPSB0YWdOYW1lO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBtaXhpbnMgQ29udHJvbGxlciB0YWcgbmFtZXNcbiAgICAgICAgICovXG4gICAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgbWl4aW4gb2YgbWl4aW5zKSB7XG4gICAgICAgICAgICBsZXQgbWl4aW5OYW1lO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtaXhpbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBtaXhpbk5hbWUgPSBjYW1lbENhc2VUb1RhZ05hbWUobWl4aW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtaXhpbikge1xuICAgICAgICAgICAgICBtaXhpbk5hbWUgPSBhcHAuY29udHJvbGxlclRvVGFnKG1peGluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdLnB1c2gobWl4aW5OYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWRkTWl4aW46ICguLi5taXhpbnMpID0+IHt9LFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgcG9zdDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuQ1NSRl9UT0tFTiA9IGFwcC5DU1JGX1RPS0VOO1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQucG9zdCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgZ2V0OiAoY29udHJvbGxlciwgdXJsLCBhcmdzKSA9PiB7XG4gICAgcmV0dXJuIGFwcC5hamF4KGNvbnRyb2xsZXIsIHVybCwgYXJncywgJC5nZXQpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kICQuZ2V0IG9yICQucG9zdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgYWpheDogKGNvbnRyb2xsZXIsIHVybCwgYXJncywgbWV0aG9kKSA9PiB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgYXJncy5WRVJTSU9OID0gYXBwLlZFUlNJT047XG4gICAgYXJncy5fbWV0aG9kID0gYXJncy5fbWV0aG9kIHx8IFwiYXBpXCI7XG5cbiAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG1ldGhvZCh1cmwsIGFyZ3MpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBhW1widXJsLWxpbmtcIl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBhcHAucmVmcmVzaChjb250cm9sbGVyLiRjb250YWluZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3OiAoY29udHJvbGxlciwgZm9ybSwgdXJsLCBtZXRob2QpID0+IHtcbiAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gICAgICBpZiAoYVtcInVybC1saW5rXCJdKSB7XG4gICAgICAgIHRyaWdnZXIoXCJvbk5hdkxpbmtcIiwgYVtcInVybC1saW5rXCJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYVtcInVybFwiXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgcmVkaXJlY3RvcihhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgICAgIGEgPSBhLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoYSwgYiwgYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwgfHwgZm9ybS5hY3Rpb24sIG1ldGhvZCB8fCBmb3JtLm1ldGhvZClcbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZW1vdmUgcmVtb3ZlcyBhIGRvbSBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBEb21cbiAgICovXG4gIHNhZmVSZW1vdmU6ICgkZWxlbSkgPT4ge1xuICAgICRlbGVtLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGlmICgkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkpIHtcbiAgICAgICAgJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJGVsZW0uZmluZChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSAkKHRoaXMpLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgICAgIGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbS5yZW1vdmUoKTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGpRdWVyeT59XG4gICAqL1xuICByZWxvYWRDb250cm9sbGVyOiAoY29udHJvbGxlcikgPT4ge1xuICAgIHJldHVybiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgICBsZXQgJGh0bWwgPSAkKGh0bWwpO1xuICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkdmlydHVhbE5vZGVcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRyZWFsTm9kZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICAgKi9cbiAgcmVjb25jaWxlOiAoY29udHJvbGxlciwgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsLCBwcm9jZXNzID0gbnVsbCkgPT4ge1xuICAgIGlmICghJHJlYWxOb2RlKSB7XG4gICAgICBsZXQgJHRlbXAgPSBjb250cm9sbGVyLiRjb250YWluZXIuY2xvbmUoKS5lbXB0eSgpO1xuICAgICAgJHRlbXAuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgICR0ZW1wLnJlbW92ZUNsYXNzKENPTlRST0xMRVJfQ0xBU1MpO1xuICAgICAgJHRlbXAuYXBwZW5kKCR2aXJ0dWFsTm9kZSk7XG4gICAgICAkdmlydHVhbE5vZGUgPSAkdGVtcDtcbiAgICB9XG5cbiAgICAkcmVhbE5vZGUgPSAkcmVhbE5vZGUgPz8gY29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgICAgcHJvY2VzcyxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgKTtcblxuICAgIHJldHVybiByZWZyZXNoKCR2aXJ0dWFsTm9kZSwgY29udHJvbGxlciwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgICAgIHJlc2V0Q2hpbGRyZW4oY29udHJvbGxlcik7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250cm9sbGVyO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyID0gbnVsbCkgPT4ge1xuICAgIHJldHVybiByZWZyZXNoKCRkb20sIGxlYWZDb250cm9sbGVyKTtcbiAgfSxcbn07XG4iXSwibmFtZXMiOlsiY2FtZWxDYXNlVG9UYWdOYW1lIiwiZ2V0Qm9keSIsInVwbG9hZEZpbGVGb3JtRGF0YSIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJEQVRBX0NPTlRST0xMRVJfS0VZIiwiQ09OVFJPTExFUl9DTEFTUyIsImdldENvbnRyb2xsZXIiLCJjbGVhbkNhY2hlIiwicmVmcmVzaCIsIkFic3RyYWN0U0RDIiwiR2xvYmFsIiwiY29udHJvbGxlckxpc3QiLCJ0YWdMaXN0IiwicmVzZXRDaGlsZHJlbiIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsInByZXBhcmVSZWZyZXNoUHJvY2VzcyIsImluaXRFdmVudHMiLCJTVERfRVZFTlRfTElTVCIsIndpbmRvd0V2ZW50SGFuZGxlciIsInJlY29uY2lsZSIsInRyaWdnZXIiLCJpc0Nvbm5lY3RlZCIsImNsb3NlIiwiUFJPUEVSVElFU19VUERBVEUiLCJjbGFzc25hbWUiLCJzZGNEb21GcmFnbWVudCIsImVsZW1lbnQiLCJwcm9wcyIsIiRuZXdfZWxlbSIsImlzX3NlbGYiLCIkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGFnTmFtZSIsIm5hbWUiLCJkYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJrIiwidiIsInN0YXJ0c1dpdGgiLCJhZGRFdmVudExpc3RlbmVyIiwic3Vic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJzZXRBdHRyaWJ1dGUiLCJhZGRDbGFzcyIsIndpbmRvdyIsInNkY0RvbSIsImNoaWxkcmVuIiwiYyIsImFwcGVuZCIsImFwcCIsIkNTUkZfVE9LRU4iLCJMQU5HVUFHRV9DT0RFIiwiREVCVUciLCJWRVJTSU9OIiwidGFnTmFtZXMiLCJyb290Q29udHJvbGxlciIsImdsb2JhbFJvb3RDb250cm9sbGVyIiwiX2lzSW5pdCIsIl9vcmlnaW5fdHJpZ2dlciIsIl9nbG9iYWxDb250cm9sbGVyQ2xhc3NlcyIsImluaXRfc2RjIiwiZm4iLCJldmVudCIsImV2X3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ0eXBlIiwiaW5jbHVkZXMiLCJwdXNoIiwib24iLCJ1cGRhdGVKcXVlcnkiLCIkZ2xvYmFsRGl2IiwiQ29udHJvbGxlckNsYXNzIiwicHJvdG90eXBlIiwiX3RhZ05hbWUiLCJyZWZyZXNoUHJvY2VzcyIsInRoZW4iLCJyZXMiLCJzYWZlUmVwbGFjZSIsIiRlbGVtIiwic2FmZUVtcHR5Iiwic2FmZVJlbW92ZSIsImNvbnRyb2xsZXJUb1RhZyIsIkNvbnRyb2xsZXIiLCJyZXBsYWNlIiwicmVnaXN0ZXJHbG9iYWwiLCJyZWdpc3RlciIsIm92ZXJ3cml0ZSIsImFkZE1peGluIiwibWl4aW5zIiwibWl4aW4iLCJtaXhpbk5hbWUiLCJwb3N0IiwiY29udHJvbGxlciIsInVybCIsImFyZ3MiLCJhamF4IiwiZ2V0IiwibWV0aG9kIiwiX21ldGhvZCIsInAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImEiLCJiIiwic3RhdHVzIiwiJGNvbnRhaW5lciIsImNhdGNoIiwic3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXciLCJmb3JtIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsInJlZGlyZWN0b3IiLCJsb2NhdGlvbiIsImhyZWYiLCJhY3Rpb24iLCJyZXNwb25zZUpTT04iLCJzdWJtaXRGb3JtIiwiJGNoaWxkcmVuIiwiZWFjaCIsIl8iLCIkZWxlbWVudCIsIiRuZXciLCJpbnNlcnRCZWZvcmUiLCIkdGhpcyIsInJlbW92ZSIsImZpbmQiLCJyZWxvYWRDb250cm9sbGVyIiwiaHRtbCIsIiRodG1sIiwiJHZpcnR1YWxOb2RlIiwiJHJlYWxOb2RlIiwicHJvY2VzcyIsIiR0ZW1wIiwiY2xvbmUiLCJlbXB0eSIsInJlbW92ZUNsYXNzIiwiaXNSdW5uaW5nUHJvY2VzcyIsIiRkb20iLCJsZWFmQ29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
77
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\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/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = { classname: \"class\" };\n\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n const type = k.substring(2).toLowerCase();\n $new_elem[0].addEventListener(type, v);\n // Remembered so reconcile() can move the listeners to a node it keeps.\n ($new_elem[0]._sdcListeners ??= []).push([type, v]);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n\n return $new_elem;\n};\n\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\n\nconst redirector = (a) => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n};\n\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n _createdGlobals: [],\n\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\")\n ? event.type\n : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n\n ;(0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n\n // Global controllers are created only once, even if init_sdc() is called again.\n const newGlobals = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.filter((tagName) => !app._createdGlobals.includes(tagName));\n app._createdGlobals.push(...newGlobals);\n\n const $globalDiv = $(\"<div></div>\");\n newGlobals.forEach((tagName) => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(\n `<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`,\n );\n });\n\n const { refreshProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n $globalDiv,\n app.globalRootController,\n refreshProcess,\n ).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(),\n app.rootController,\n refreshProcess,\n ).then((res) => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n\n controllerToTag: (Controller) => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: (Controller) => {\n const registration = app.register(Controller);\n let tagName = Controller.prototype._tagName;\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.includes(tagName)) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n }\n return registration;\n },\n\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n },\n };\n }\n return {\n addMixin: (...mixins) => {},\n };\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n\n const p = new Promise((resolve, reject) => {\n return method(url, args)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n })\n .catch((a, b, c) => {\n // send_redirect() answers with HTTP 301 and the redirect in the JSON body.\n if (a.status === 301 && a.responseJSON) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n })\n .catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then(resolve)\n .catch(reject);\n });\n },\n\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: ($elem) => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: ($elem) => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n\n return $elem;\n },\n\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: ($elem) => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n\n return $elem.remove();\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: (controller) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then((html) => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n\n $realNode = $realNode ?? controller.$container;\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(\n process,\n controller,\n );\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n },\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxrRUFBb0I7QUFDL0I7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNkRBQW1CO0FBQ3BDLHdCQUF3QiwwREFBZ0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLFlBQVksbUNBQW1DLEVBQUUseUVBQXFCO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLHFEQUFPO0FBQ2xCLE1BQU0sdURBQVM7QUFDZixNQUFNLGlFQUFhO0FBQ25CO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxxREFBTztBQUNsQixHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX21haW4uanM/MTc4MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjYW1lbENhc2VUb1RhZ05hbWUsXG4gIGdldEJvZHksXG4gIHVwbG9hZEZpbGVGb3JtRGF0YSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcixcbiAgcmVsb2FkSFRNTENvbnRyb2xsZXIsXG4gIERBVEFfQ09OVFJPTExFUl9LRVksXG4gIENPTlRST0xMRVJfQ0xBU1MsXG4gIGdldENvbnRyb2xsZXIsXG4gIGNsZWFuQ2FjaGUsXG4gIHJlZnJlc2gsXG59IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNEQyB9IGZyb20gXCIuL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQge1xuICBHbG9iYWwsXG4gIGNvbnRyb2xsZXJMaXN0LFxuICB0YWdMaXN0LFxuICByZXNldENoaWxkcmVuLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gsXG4gIHByZXBhcmVSZWZyZXNoUHJvY2Vzcyxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7XG4gIGluaXRFdmVudHMsXG4gIFNURF9FVkVOVF9MSVNULFxuICB3aW5kb3dFdmVudEhhbmRsZXIsXG59IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyByZWNvbmNpbGUgfSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkLCBjbG9zZSB9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuXG5jb25zdCBQUk9QRVJUSUVTX1VQREFURSA9IHsgY2xhc3NuYW1lOiBcImNsYXNzXCIgfTtcblxubGV0IHNkY0RvbUZyYWdtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzKSB7XG4gIGxldCAkbmV3X2VsZW0sXG4gICAgaXNfc2VsZiA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAkbmV3X2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRhZ05hbWUgPSBgdGhpcy4ke2VsZW1lbnQubmFtZX1gO1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7XG4gICAgJG5ld19lbGVtLmRhdGEoXCJoYW5kbGVyXCIsIGVsZW1lbnQpO1xuICAgIGlzX3NlbGYgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3BzKSB7XG4gICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKGsuc3RhcnRzV2l0aChcIm9uXCIpKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBrLnN1YnN0cmluZygyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAkbmV3X2VsZW1bMF0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB2KTtcbiAgICAgICAgLy8gUmVtZW1iZXJlZCBzbyByZWNvbmNpbGUoKSBjYW4gbW92ZSB0aGUgbGlzdGVuZXJzIHRvIGEgbm9kZSBpdCBrZWVwcy5cbiAgICAgICAgKCRuZXdfZWxlbVswXS5fc2RjTGlzdGVuZXJzID8/PSBbXSkucHVzaChbdHlwZSwgdl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFBST1BFUlRJRVNfVVBEQVRFW2sudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICBrID0gUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgICAkbmV3X2VsZW1bMF0uc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzX3NlbGYpIHtcbiAgICAkbmV3X2VsZW0uYWRkQ2xhc3MoXCJfYmluZF90b191cGRhdGVfaGFuZGxlciBfd2l0aF9oYW5kbGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn07XG5cbndpbmRvdy5zZGNEb20gPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIC4uLmNoaWxkcmVuKSB7XG4gIGlmICghdGFnTmFtZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIGNvbnN0ICRuZXdfZWxlbSA9IHNkY0RvbUZyYWdtZW50KHRhZ05hbWUsIHByb3BzKTtcbiAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgJG5ld19lbGVtLmFwcGVuZChjKTtcbiAgfVxuICByZXR1cm4gJG5ld19lbGVtO1xufTtcblxuY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gIGlmIChhW1widXJsLWxpbmtcIl0pIHtcbiAgICB0cmlnZ2VyKFwib25OYXZMaW5rXCIsIGFbXCJ1cmwtbGlua1wiXSk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhW1widXJsXCJdO1xuICB9XG59O1xuXG5leHBvcnQgbGV0IGFwcCA9IHtcbiAgQ1NSRl9UT0tFTjogd2luZG93LkNTUkZfVE9LRU4gfHwgXCJcIixcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgXCJlblwiLFxuICBERUJVRzogd2luZG93LkRFQlVHIHx8IGZhbHNlLFxuICBWRVJTSU9OOiB3aW5kb3cuVkVSU0lPTiB8fCBcIjAuMFwiLFxuICB0YWdOYW1lczogW10sXG4gIEdsb2JhbDogR2xvYmFsLFxuICByb290Q29udHJvbGxlcjogbnVsbCxcbiAgZ2xvYmFsUm9vdENvbnRyb2xsZXI6IG51bGwsXG4gIF9pc0luaXQ6IGZhbHNlLFxuICBfb3JpZ2luX3RyaWdnZXI6IG51bGwsXG4gIF9nbG9iYWxDb250cm9sbGVyQ2xhc3NlczogW10sXG4gIF9jcmVhdGVkR2xvYmFsczogW10sXG5cbiAgaW5pdF9zZGM6ICgpID0+IHtcbiAgICBpZiAoIWFwcC5faXNJbml0KSB7XG4gICAgICBhcHAuX2lzSW5pdCA9IHRydWU7XG4gICAgICBpZiAoIWFwcC5fb3JpZ2luX3RyaWdnZXIpIHtcbiAgICAgICAgYXBwLl9vcmlnaW5fdHJpZ2dlciA9ICQuZm4udHJpZ2dlcjtcbiAgICAgICAgJC5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZXZfdHlwZSA9IHt9Lmhhc093blByb3BlcnR5LmNhbGwoZXZlbnQsIFwidHlwZVwiKVxuICAgICAgICAgICAgPyBldmVudC50eXBlXG4gICAgICAgICAgICA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwLnVwZGF0ZUpxdWVyeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaXNDb25uZWN0ZWQoKTtcblxuICAgICAgaW5pdEV2ZW50cygpO1xuXG4gICAgICBhcHAucm9vdENvbnRyb2xsZXIgPSBhcHAucm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgICBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgPSBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgfVxuXG4gICAgYXBwLnRhZ05hbWVzID0gdGFnTGlzdCgpO1xuXG4gICAgLy8gR2xvYmFsIGNvbnRyb2xsZXJzIGFyZSBjcmVhdGVkIG9ubHkgb25jZSwgZXZlbiBpZiBpbml0X3NkYygpIGlzIGNhbGxlZCBhZ2Fpbi5cbiAgICBjb25zdCBuZXdHbG9iYWxzID0gR2xvYmFsLmZpbHRlcigodGFnTmFtZSkgPT4gIWFwcC5fY3JlYXRlZEdsb2JhbHMuaW5jbHVkZXModGFnTmFtZSkpO1xuICAgIGFwcC5fY3JlYXRlZEdsb2JhbHMucHVzaCguLi5uZXdHbG9iYWxzKTtcblxuICAgIGNvbnN0ICRnbG9iYWxEaXYgPSAkKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgbmV3R2xvYmFscy5mb3JFYWNoKCh0YWdOYW1lKSA9PiB7XG4gICAgICBjb25zdCBDb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgICAgICRnbG9iYWxEaXYuYXBwZW5kKFxuICAgICAgICBgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKG51bGwsIGFwcC5yb290Q29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICBhcHAudGFnTmFtZXMsXG4gICAgICAkZ2xvYmFsRGl2LFxuICAgICAgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLFxuICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgICBnZXRCb2R5KCksXG4gICAgICAgIGFwcC5yb290Q29udHJvbGxlcixcbiAgICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgICApLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfTtcbiAgICAkLmZuLnNhZmVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZUVtcHR5KCQodGhpcykpO1xuICAgIH07XG4gICAgJC5mbi5zYWZlUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVtb3ZlKCQodGhpcykpO1xuICAgIH07XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgXCJcIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IENvbnRyb2xsZXJcbiAgICovXG4gIHJlZ2lzdGVyR2xvYmFsOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGFwcC5yZWdpc3RlcihDb250cm9sbGVyKTtcbiAgICBsZXQgdGFnTmFtZSA9IENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lO1xuICAgIGlmICghR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVcbiAgICovXG4gIHJlZ2lzdGVyOiAoQ29udHJvbGxlciwgb3ZlcndyaXRlID0gZmFsc2UpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgaWYgKCFjb250cm9sbGVyTGlzdFt0YWdOYW1lXSB8fCBvdmVyd3JpdGUpIHtcbiAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdID0gW0NvbnRyb2xsZXIsIFtdXTtcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbWl4aW5zIENvbnRyb2xsZXIgdGFnIG5hbWVzXG4gICAgICAgICAqL1xuICAgICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IG1peGluIG9mIG1peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKG1peGluKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhtaXhpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVsxXS5wdXNoKG1peGluTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHBvc3Q6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MpID0+IHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBhcmdzLkNTUkZfVE9LRU4gPSBhcHAuQ1NSRl9UT0tFTjtcbiAgICByZXR1cm4gYXBwLmFqYXgoY29udHJvbGxlciwgdXJsLCBhcmdzLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCBcImFwaVwiO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtZXRob2QodXJsLCBhcmdzKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIC8vIHNlbmRfcmVkaXJlY3QoKSBhbnN3ZXJzIHdpdGggSFRUUCAzMDEgYW5kIHRoZSByZWRpcmVjdCBpbiB0aGUgSlNPTiBib2R5LlxuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxICYmIGEucmVzcG9uc2VKU09OKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtQW5kVXBkYXRlVmlldzogKGNvbnRyb2xsZXIsIGZvcm0sIHVybCwgbWV0aG9kKSA9PiB7XG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgcmVkaXJlY3RvcihhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgICAgIGEgPSBhLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoYSwgYiwgYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwgfHwgZm9ybS5hY3Rpb24sIG1ldGhvZCB8fCBmb3JtLm1ldGhvZClcbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZW1vdmUgcmVtb3ZlcyBhIGRvbSBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBEb21cbiAgICovXG4gIHNhZmVSZW1vdmU6ICgkZWxlbSkgPT4ge1xuICAgICRlbGVtLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGlmICgkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkpIHtcbiAgICAgICAgJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJGVsZW0uZmluZChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSAkKHRoaXMpLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgICAgIGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbS5yZW1vdmUoKTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGpRdWVyeT59XG4gICAqL1xuICByZWxvYWRDb250cm9sbGVyOiAoY29udHJvbGxlcikgPT4ge1xuICAgIHJldHVybiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgICBsZXQgJGh0bWwgPSAkKGh0bWwpO1xuICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkdmlydHVhbE5vZGVcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRyZWFsTm9kZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICAgKi9cbiAgcmVjb25jaWxlOiAoY29udHJvbGxlciwgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsLCBwcm9jZXNzID0gbnVsbCkgPT4ge1xuICAgIGlmICghJHJlYWxOb2RlKSB7XG4gICAgICBsZXQgJHRlbXAgPSBjb250cm9sbGVyLiRjb250YWluZXIuY2xvbmUoKS5lbXB0eSgpO1xuICAgICAgJHRlbXAuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgICR0ZW1wLnJlbW92ZUNsYXNzKENPTlRST0xMRVJfQ0xBU1MpO1xuICAgICAgJHRlbXAuYXBwZW5kKCR2aXJ0dWFsTm9kZSk7XG4gICAgICAkdmlydHVhbE5vZGUgPSAkdGVtcDtcbiAgICB9XG5cbiAgICAkcmVhbE5vZGUgPSAkcmVhbE5vZGUgPz8gY29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgICAgcHJvY2VzcyxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgKTtcblxuICAgIHJldHVybiByZWZyZXNoKCR2aXJ0dWFsTm9kZSwgY29udHJvbGxlciwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgICAgIHJlc2V0Q2hpbGRyZW4oY29udHJvbGxlcik7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250cm9sbGVyO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyID0gbnVsbCkgPT4ge1xuICAgIHJldHVybiByZWZyZXNoKCRkb20sIGxlYWZDb250cm9sbGVyKTtcbiAgfSxcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
68
78
 
69
79
  /***/ },
70
80
 
@@ -74,7 +84,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
74
84
  \*******************************************/
75
85
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
76
86
 
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}");
87
+ 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\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\n\n/**\n * Copy a model instance for another queryset. A new instance of the same class is\n * created from the serialized field values (structuredClone cannot copy the\n * WeakRef/Proxy members of a model).\n */\nconst cloneModel = (original) => {\n const copy = new original.constructor({});\n copy.setValues(original.serialize());\n return copy;\n}\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}\n\nclass FileLoaded {\n constructor({ name, url }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\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 () => {\n resolve('');\n }\n );\n });\n }\n\n return this.content;\n }\n\n async text() {\n return this.load();\n }\n\n static isValid(value) {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof File) &&\n typeof value.url === \"string\" &&\n typeof value.name === \"string\"\n );\n }\n\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}\n\n/**\n * Decide whether an argument of `create()` is an options object\n * (`{elem, data}`) or the data itself. It is treated as options if it is\n * a non-empty plain object whose keys are only `elem` and/or `data`, and\n * `elem` (if present) is an SdcModel.\n *\n * @param {*} arg\n * @returns {boolean}\n */\nfunction isCreateOptions(arg) {\n if (!arg || typeof arg !== \"object\" || arg instanceof SdcModel) {\n return false;\n }\n const keys = Object.keys(arg);\n if (keys.length === 0 || !keys.every((k) => k === \"elem\" || k === \"data\")) {\n return false;\n }\n if (\"elem\" in arg && arg.elem !== null && !(arg.elem instanceof SdcModel)) {\n return false;\n }\n return !(\"data\" in arg) || arg.data === null || typeof arg.data === \"object\";\n}\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 };\n this.onCreate = () => {\n };\n // Called with the removed models when rows of this queryset are deleted on the\n // server. If not set, onUpdate is called instead.\n this.onDelete = null;\n\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\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\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return { value: this.valuesList[idx], done: false };\n }\n return { value: null, done: true };\n },\n };\n }\n\n set on_create(handler) {\n this.onCreate = handler;\n }\n\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n set on_delete(handler) {\n this.onDelete = handler;\n }\n\n /**\n * Remove the models with the given ids from the local list.\n *\n * @param {Array<number>} ids\n * @returns {Array<SdcModel>} the removed models\n */\n _removeIds(ids) {\n const removed = this.valuesList.filter((item) => ids.includes(item.id));\n this.valuesList = this.valuesList.filter((item) => !ids.includes(item.id));\n return removed;\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\n this.setFilter(filter);\n return vl;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n _setIds(ids) {\n\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet || ids instanceof SdcModel) {\n // Models already in this queryset are kept (so references to them stay valid);\n // other models are copied into it.\n const sources = ids instanceof SdcModel ? [ids] : ids.valuesList;\n this.valuesList = sources.map((source) => {\n const existing = source.id !== null ? this.byId(source.id) : null;\n if (existing) {\n return existing;\n }\n const copy = cloneModel(source);\n copy._setQuerySet(this, true);\n return copy;\n });\n return this.valuesList;\n }\n\n let numList, 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\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))({ id }));\n });\n }\n return this.valuesList;\n }\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\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\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({ modelQuery = null, item = null }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? { id: item.id } : 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({ pk = null, id = null, elem = null }) {\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(\n 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 );\n\n this.openRequest[event_id] = [(res) => {\n this._removeIds([normalizePk(pk)]);\n resolve(res);\n }, 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(\n 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 );\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(\n 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 );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\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\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(\n 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 );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\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({ modelObj, eventType, formName, $divForm, cbResolve, cbReject, formId }) {\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(\n 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 });\n\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n\n this.openRequest[event_id] = [\n (data) => {\n $divForm.append(data.html);\n let $form = $divForm\n .closest(\"form\")\n .addClass(\n `sdc-model-${className}-form sdc-model-form ${formId}`,\n )\n .data(\"model\", modelObj)\n .data(\"model_pk\", pk)\n .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\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\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\n this.addFilter({ id: this.valuesList[0].id });\n\n return this.valuesList[0];\n }\n\n detailView({ pk, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendDetailView({\n id: pk,\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n listView({ modelQuery = {}, searchValues = {}, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, { '__search_values': searchValues }),\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n save({ pk = null, id = null, formName = \"edit_form\", data = null } = {}) {\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(\n new Promise((resolve, reject) => {\n this._readFiles(elem).then((files) => {\n const sendData = data ? { ...data } : elem.serialize();\n sendData.id = elem.id;\n this.socket.send(\n 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 );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n },\n reject,\n ];\n });\n }),\n );\n });\n\n return Promise.all(pList);\n });\n }\n\n /**\n * Create a new instance in the DB.\n *\n * @param {{elem?: SdcModel, data?: object} | object} arg\n * Either an options object containing `elem` and/or `data`,\n * or `data` directly.\n *\n * @example\n * create({ elem, data });\n * create({ elem });\n * create(data);\n * @returns {Promise<unknown>}\n */\n create(arg = null) {\n let { elem = null, data = null } = isCreateOptions(arg) ? arg : { data: arg };\n if (data && typeof data === \"object\" && Object.keys(data).length === 0) {\n data = null;\n }\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(\n 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 );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : 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 },\n reject,\n ];\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 (\n !this._isConnectingProcess ||\n !this.openRequest[CONNECTING_REQUEST_ID]\n ) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n }, () => {\n }];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] =\n this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [\n () => {\n resolveOrigin();\n resolve();\n },\n () => {\n rejectOrigin();\n reject();\n },\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 };\n this.socket.close();\n delete this[\"socket\"];\n }\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(\n new Promise((resolve, reject) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[event_id] = [resolve, reject];\n\n value.arrayBuffer().then((buffer) => {\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(\n MAX_FILE_UPLOAD * i,\n MAX_FILE_UPLOAD * (i + 1),\n ));\n this.socket.send(\n 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 }).catch((err) => {\n this._closeOpenRequest(event_id);\n reject(err);\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 (Object.hasOwn(this.openRequest, 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\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\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\", \"list_view\", \"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\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n\n cb(obj);\n data.args.data = obj;\n } else if (data.type === \"on_delete\") {\n const ids = JSON.parse(data.args.data).map((x) => normalizePk(x.id ?? x.pk));\n const removed = this._removeIds(ids);\n (this.onDelete ?? this.onUpdate)(removed);\n data.args.data = removed;\n }\n\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n\n if (Object.hasOwn(this.openRequest, 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\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 =\n `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(\n `wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n } else {\n this.socket = new WebSocket(\n `ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n }\n\n this.socket.onmessage = this._onMessage.bind(this);\n\n this.socket.onclose = (e) => {\n console.error(\n `SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`,\n );\n this._isConnected = false;\n for (const value of Object.values(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n\n this._isConnectingProcess = false;\n setTimeout(() => {\n if (this._autoReconnect && !this._isConnected) {\n // isConnected() opens the socket and sends the connect handshake, so\n // live updates work again and later requests reuse this connection.\n this.isConnected().catch(() => {\n });\n }\n }, 1000);\n };\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 };\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(\n 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 );\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({ 'id': x.id ?? x.pk, ...x.fields });\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}\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 const { modelName } = new this({});\n if (!parent) {\n return new SdcQuerySet(modelName, modelQuerySet);\n }\n\n return parent.querySet(modelName, modelQuerySet);\n }\n\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n\n this._forms.push($form);\n\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\n \"input.formWatcher change.formWatcher\",\n \"input, select, textarea\",\n onChange\n );\n }\n }\n\n _onChange(event) {\n const { name } = event.target;\n if (this.constructor.fields[name]) {\n try {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n } catch {\n // Invalid input (e.g. an empty required field) is kept in the form and\n // validated by the server on submit.\n return;\n }\n // Show the new value in the other forms of this model, not in the input being edited.\n this._updateForm(name, event.target);\n }\n }\n\n _updateForm(fieldName, skipElement = null) {\n const self = this;\n this._forms.forEach(($form) => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n if (this !== skipElement) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n }\n });\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\n get querySet() {\n return this._querySet.deref();\n }\n\n save({ formName = \"edit_form\", data = null } = {}) {\n return this._querySet.deref().save({ pk: this.id, formName, data });\n }\n\n /**\n * Create this instance in the DB.\n *\n * @param {{data?: object} | object | null} values\n * Either `{ data }` or `data` directly.\n * @returns {Promise<unknown>}\n */\n create(values = null) {\n const data = isCreateOptions(values) ? (values.data ?? null) : values;\n return this._querySet.deref().create({ elem: this, data });\n }\n\n delete() {\n return this._querySet.deref().delete({ elem: this });\n }\n\n load() {\n return this._querySet.deref().update({ item: this });\n }\n\n update() {\n return this.load();\n }\n\n get id() {\n return this._id;\n }\n\n set id(data) {\n this._id = data;\n }\n\n set pk(data) {\n this.id = data;\n }\n\n get pk() {\n return this._id;\n }\n\n close() {\n return this._querySet.deref().close();\n }\n\n _onClose() {\n Object.keys(this.constructor.fields)\n .filter((x) => this[`_${x}`] instanceof SdcQuerySet)\n .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({ cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._querySet.deref().detailView({ pk: this.id, cbResolve, cbReject, 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 }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else if (value instanceof Date) {\n // Django's DateField does not accept a full ISO datetime.\n acc[key] = val.type === \"DateField\" ? (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatDate)(value) : value.toISOString();\n } else {\n acc[key] = value;\n }\n\n return acc\n }, {});\n }\n\n toJson() {\n const res = {}\n for (let key in this.constructor.fields) {\n const value = this[key];\n\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\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\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\n const self = this;\n const { fields } = this.constructor;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n // Create forms carry model_pk -1 while the new model's id is still null.\n if (normalizePk(self.id) !== pk) {\n return;\n }\n\n for (let formItem of this.elements) {\n let { name } = formItem;\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\n const self = this;\n const { fields } = this.constructor;\n const returnValue = {}\n\n function setValueInForm(name, value) {\n if (fields[name]) {\n try {\n self[name] = value;\n } catch {\n // Invalid values are still sent to the server, which returns the form\n // errors; the model keeps its last valid value.\n }\n }\n returnValue[name] = value;\n }\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\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n\n return self;\n });\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({ cbResolve = null, cbReject = null } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({ cbReject, cbResolve });\n }\n return this._editForm({ cbReject, cbResolve });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({ cbResolve = null, cbReject = null }) {\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\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({ cbResolve = null, cbReject = null }) {\n let $divForm = $(\"<div>\");\n\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\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({ formName, cbResolve = null, cbReject = null }) {\n let $divForm = $('<div class=\"container-fluid\">');\n\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\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\n if ((manyToMany || oneToMany || manyToOne || oneToOne) && value && typeof value === 'string') {\n return JSON.parse(value);\n }\n\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n case \"SlugField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n\n case \"IntegerField\":\n case \"SmallIntegerField\":\n case \"BigIntegerField\":\n case \"PositiveIntegerField\":\n case \"PositiveSmallIntegerField\":\n case \"PositiveBigIntegerField\":\n case \"AutoField\":\n case \"SmallAutoField\":\n case \"BigAutoField\":\n return parseInt(value, 10);\n\n case \"FloatField\":\n case \"DecimalField\":\n return parseFloat(value);\n\n case \"BooleanField\":\n return !!value;\n\n case \"DateField\":\n case \"DateTimeField\":\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.toDate)(value);\n\n case \"URLField\":\n return new URL(value);\n\n case \"FileField\":\n if (value == null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n return null;\n }\n\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n\n if (typeof File !== \"undefined\" && value instanceof File) {\n // Size and type are checked in validate().\n return value;\n }\n break;\n\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\n default:\n break;\n }\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\n void isRelation;\n\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\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\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\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\n case \"IntegerField\":\n case \"SmallIntegerField\":\n case \"BigIntegerField\":\n case \"PositiveIntegerField\":\n case \"PositiveSmallIntegerField\":\n case \"PositiveBigIntegerField\":\n case \"AutoField\":\n case \"SmallAutoField\":\n case \"BigAutoField\":\n if (!isFinite(parseInt(value))) {\n return \"Must be an integer\";\n }\n break;\n\n case \"FloatField\":\n case \"DecimalField\":\n if (!isFinite(parseFloat(value))) {\n return \"Must be a number\";\n }\n break;\n\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n\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\n case \"JSONField\":\n if (typeof value === \"string\") {\n try {\n JSON.parse(value);\n } catch {\n return \"Must be valid JSON\";\n }\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 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 }\n break;\n default:\n break;\n }\n\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEdBQUc7QUFDcEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGlCQUFpQjtBQUN6RDtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX21vZGVsLmpzPzk5MWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0RGF0ZSwgZ2V0VmFsdWVGcm9tRmllbGQsIHNldFZhbHVlSW5GaWVsZCwgdG9EYXRlLCB1dWlkdjQgfSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IGdldE1vZGVsIH0gZnJvbSBcIi4vc2RjX3NvY2tldC5qc1wiXG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5jb25zdCBDT05ORUNUSU5HX1JFUVVFU1RfSUQgPSBcIl9jb25uZWN0aW5nX3Byb2Nlc3NcIjtcblxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgaW5zdGFuY2UgZm9yIGFub3RoZXIgcXVlcnlzZXQuIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGlzXG4gKiBjcmVhdGVkIGZyb20gdGhlIHNlcmlhbGl6ZWQgZmllbGQgdmFsdWVzIChzdHJ1Y3R1cmVkQ2xvbmUgY2Fubm90IGNvcHkgdGhlXG4gKiBXZWFrUmVmL1Byb3h5IG1lbWJlcnMgb2YgYSBtb2RlbCkuXG4gKi9cbmNvbnN0IGNsb25lTW9kZWwgPSAob3JpZ2luYWwpID0+IHtcbiAgY29uc3QgY29weSA9IG5ldyBvcmlnaW5hbC5jb25zdHJ1Y3Rvcih7fSk7XG4gIGNvcHkuc2V0VmFsdWVzKG9yaWdpbmFsLnNlcmlhbGl6ZSgpKTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmNsYXNzIFNkY01vZGVsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBtc2c6IHByb3BzLFxuICAgICAgICBpc19lcnJvcjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyOiAnRXJyb3InXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKHByb3BzLm1zZylcbiAgICB0aGlzLm1zZyA9IHByb3BzLm1zZztcbiAgICB0aGlzLmhlYWRlciA9IHByb3BzLmhlYWRlcjtcbiAgICB0aGlzLmlzX2Vycm9yID0gcHJvcHMuaXNfZXJyb3I7XG4gICAgdGhpcy5odG1sID0gcHJvcHMuaHRtbDtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTG9hZGVkIHtcbiAgY29uc3RydWN0b3IoeyBuYW1lLCB1cmwgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb250ZW50ID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmIChmb3JjZSB8fCAhdGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICQuZ2V0KHRoaXMudXJsKS50aGVuKHJlc29sdmUpLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmXG4gICAgICB0eXBlb2YgdmFsdWUudXJsID09PSBcInN0cmluZ1wiICYmXG4gICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICk7XG4gIH1cblxuXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGluY29taW5nIHByaW1hcnkga2V5IHZhbHVlLlxuICpcbiAqIGAtMWAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgbW9kdWxlIGFzIHRoZSBzZW50aW5lbCBmb3IgXCJuZXcgb2JqZWN0IC8gbm8gcGtcIi5cbiAqXG4gKiBAcGFyYW0geyp9IHBrXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQayhwaykge1xuICBjb25zdCBub3JtYWxpemVkUGsgPSBwYXJzZUludChwayA/PyAtMSwgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRQaykgPyAtMSA6IG5vcm1hbGl6ZWRQaztcbn1cblxuLyoqXG4gKiBEZWNpZGUgd2hldGhlciBhbiBhcmd1bWVudCBvZiBgY3JlYXRlKClgIGlzIGFuIG9wdGlvbnMgb2JqZWN0XG4gKiAoYHtlbGVtLCBkYXRhfWApIG9yIHRoZSBkYXRhIGl0c2VsZi4gSXQgaXMgdHJlYXRlZCBhcyBvcHRpb25zIGlmIGl0IGlzXG4gKiBhIG5vbi1lbXB0eSBwbGFpbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgb25seSBgZWxlbWAgYW5kL29yIGBkYXRhYCwgYW5kXG4gKiBgZWxlbWAgKGlmIHByZXNlbnQpIGlzIGFuIFNkY01vZGVsLlxuICpcbiAqIEBwYXJhbSB7Kn0gYXJnXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVhdGVPcHRpb25zKGFyZykge1xuICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSBcIm9iamVjdFwiIHx8IGFyZyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcmcpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgfHwgIWtleXMuZXZlcnkoKGspID0+IGsgPT09IFwiZWxlbVwiIHx8IGsgPT09IFwiZGF0YVwiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXCJlbGVtXCIgaW4gYXJnICYmIGFyZy5lbGVtICE9PSBudWxsICYmICEoYXJnLmVsZW0gaW5zdGFuY2VvZiBTZGNNb2RlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICEoXCJkYXRhXCIgaW4gYXJnKSB8fCBhcmcuZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgYXJnLmRhdGEgPT09IFwib2JqZWN0XCI7XG59XG5cbmV4cG9ydCBjbGFzcyBTZGNRdWVyeVNldCB7XG4gIC8qKlxuICAgKiBMaWdodHdlaWdodCBjbGllbnQtc2lkZSBjb2xsZWN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSBTREMgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBUaGUgcXVlcnlzZXQgZXhwb3NlcyBhcnJheS1saWtlIGFjY2VzcyB0aHJvdWdoIGEgcHJveHkgd2hpbGUgYWxzbyBrZWVwaW5nXG4gICAqIHRyYWNrIG9mIHNvY2tldCBzdGF0ZSBhbmQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIHRoYXQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTmFtZSA9IG1vZGVsTmFtZTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHt9O1xuICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgLy8gUmVxdWVzdCByZXNvbHZlcnMgYXJlIHN0b3JlZCBieSB3ZWJzb2NrZXQgZXZlbnQgaWQgdW50aWwgdGhlIHNlcnZlciByZXNwb25kcy5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG4gICAgdGhpcy5tb2RlbElkID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgIH07XG4gICAgdGhpcy5vbkNyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIC8vIENhbGxlZCB3aXRoIHRoZSByZW1vdmVkIG1vZGVscyB3aGVuIHJvd3Mgb2YgdGhpcyBxdWVyeXNldCBhcmUgZGVsZXRlZCBvbiB0aGVcbiAgICAvLyBzZXJ2ZXIuIElmIG5vdCBzZXQsIG9uVXBkYXRlIGlzIGNhbGxlZCBpbnN0ZWFkLlxuICAgIHRoaXMub25EZWxldGUgPSBudWxsO1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiAhaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0LnZhbHVlc0xpc3RbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH0sXG5cbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBpZHggPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICArK2lkeDtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy52YWx1ZXNMaXN0W2lkeF0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHNldCBvbl9jcmVhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25DcmVhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uX3VwZGF0ZShoYW5kbGVyKSB7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXQgb25fZGVsZXRlKGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uRGVsZXRlID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIG1vZGVscyB3aXRoIHRoZSBnaXZlbiBpZHMgZnJvbSB0aGUgbG9jYWwgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBpZHNcbiAgICogQHJldHVybnMge0FycmF5PFNkY01vZGVsPn0gdGhlIHJlbW92ZWQgbW9kZWxzXG4gICAqL1xuICBfcmVtb3ZlSWRzKGlkcykge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnZhbHVlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiBpZHMuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+ICFpZHMuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8aW50ZWdyfHN0cmluZz58aW50ZWdlcnxTZGNNb2RlbHxTZGNRdWVyeVNldHxzdHJpbmd9IGlkc1xuICAgKi9cbiAgc2V0SWRzKGlkcykge1xuICAgIGNvbnN0IHZsID0gdGhpcy5fc2V0SWRzKGlkcyk7XG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgaWRfX2luOiB2bC5tYXAoKHgpID0+IHguaWQpXG4gICAgfVxuXG4gICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyKTtcbiAgICByZXR1cm4gdmw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxpbnRlZ3J8c3RyaW5nPnxpbnRlZ2VyfFNkY01vZGVsfFNkY1F1ZXJ5U2V0fHN0cmluZ30gaWRzXG4gICAqL1xuICBfc2V0SWRzKGlkcykge1xuXG4gICAgaWYgKGlkcyA9PT0gbnVsbCB8fCBpZHMgPT09IFwiXCIgfHwgQXJyYXkuaXNBcnJheShpZHMpICYmIGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0IHx8IGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAvLyBNb2RlbHMgYWxyZWFkeSBpbiB0aGlzIHF1ZXJ5c2V0IGFyZSBrZXB0IChzbyByZWZlcmVuY2VzIHRvIHRoZW0gc3RheSB2YWxpZCk7XG4gICAgICAvLyBvdGhlciBtb2RlbHMgYXJlIGNvcGllZCBpbnRvIGl0LlxuICAgICAgY29uc3Qgc291cmNlcyA9IGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsID8gW2lkc10gOiBpZHMudmFsdWVzTGlzdDtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBzb3VyY2UuaWQgIT09IG51bGwgPyB0aGlzLmJ5SWQoc291cmNlLmlkKSA6IG51bGw7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3B5ID0gY2xvbmVNb2RlbChzb3VyY2UpO1xuICAgICAgICBjb3B5Ll9zZXRRdWVyeVNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfVxuXG4gICAgbGV0IG51bUxpc3QsIG51bUlkID0gTnVtYmVyLk5hTjtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZHMpKSB7XG4gICAgICBudW1JZCA9IGlkcztcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLnNwbGl0KCcsJykubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUlkID0gcGFyc2VJbnQoaWRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihudW1JZCkpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUlkID09PSBpdGVtLmlkKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5uZXcoKTtcbiAgICAgICAgbmV3TW9kZWwuaWQgPSBudW1JZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG51bUxpc3QpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUxpc3QuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgICAgY29uc3QgdmFsdWVJZHMgPSB0aGlzLmdldElkcygpO1xuICAgICAgbnVtTGlzdC5maWx0ZXIoeCA9PiAhdmFsdWVJZHMuaW5jbHVkZXMoeCkpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ldyAoZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpKSh7IGlkIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICB9XG5cbiAgZ2V0SWRzKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubWFwKHggPT4geC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1vZGVsIGluc3RhbmNlcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtb2RlbCBpbnN0YW5jZSBieSBpZCwgbG9hZGluZyB0aGUgcXVlcnlzZXQgZmlyc3QgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGlkXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbHxudWxsfVxuICAgKi9cbiAgYnlJZChpZCkge1xuICAgIGlmIChpZCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplUGsoaWQpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5maW5kKChlbG0pID0+IGVsbS5pZCA9PT0gbm9ybWFsaXplZElkKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFkZGl0aW9uYWwgcXVlcnkgY29uc3RyYWludHMgaW50byB0aGUgY3VycmVudCBxdWVyeXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc2V0RmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkRmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbH1cbiAgICovXG4gIG5ldyh2YWx1ZXMgPSB7fSkge1xuICAgIGNvbnN0IG5ld01vZGVsID0gbmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHZhbHVlcyk7XG4gICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXdNb2RlbCk7XG4gICAgcmV0dXJuIG5ld01vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgbG9hZChtb2RlbFF1ZXJ5ID0gbnVsbCkge1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8gdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9zZW5kTG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/U2RjTW9kZWx9IGl0ZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgdXBkYXRlKHsgbW9kZWxRdWVyeSA9IG51bGwsIGl0ZW0gPSBudWxsIH0pIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICBsZXQgbG9hZFF1ZXJ5ID0gaXRlbSA/IHsgaWQ6IGl0ZW0uaWQgfSA6IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQobG9hZFF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGsge2ludGVncn1cbiAgICogQHBhcmFtIGVsZW0ge1NkY01vZGVsfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGRlbGV0ZSh7IHBrID0gbnVsbCwgaWQgPSBudWxsLCBlbGVtID0gbnVsbCB9KSB7XG4gICAgcGsgPz89IGlkO1xuICAgIHBrID0gIWVsZW0gPyBwayA6IGVsZW0uaWQ7XG4gICAgaWYgKHBrID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwayBvciBlbGVtIG11c3QgYmUgc2V0XCIpO1xuICAgIH1cbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICAgIHBrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVJZHMoW25vcm1hbGl6ZVBrKHBrKV0pO1xuICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNlcnZlci1zaWRlIHF1ZXJ5c2V0IGRhdGEgb3ZlciB0aGUgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICovXG4gIF9zZW5kTG9hZChsb2FkUXVlcnkgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImxvYWRcIixcbiAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IGxvYWRRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxpc3QtdmlldyBlbmRwb2ludCBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmRMaXN0Vmlldyh7XG4gICAgICAgICAgICAgICAgICBtb2RlbFF1ZXJ5ID0ge30sXG4gICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICAgICAgICAgfSkge1xuICAgIHJldHVybiB0aGlzLnZpZXcoe1xuICAgICAgbW9kZWxRdWVyeSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgICAgZXZlbnRUeXBlOiBcImxpc3Rfdmlld1wiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIG1vZGVsIHZpZXcgYW5kIGFwcGVuZCBpdHMgSFRNTCB0byBhIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHZpZXcoe1xuICAgICAgICAgdmlld05hbWUgPSBcImh0bWxfbGlzdF90ZW1wbGF0ZVwiLFxuICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgZXZlbnRUeXBlID0gXCJuYW1lZF92aWV3XCIsXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHZpZXdfbmFtZTogdmlld05hbWUsXG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiBtb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgJGRpdkxpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgYXBwLnJlZnJlc2goJGRpdkxpc3QpO1xuICAgICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGRldGFpbC12aWV3IGVuZHBvaW50IGZvciBhIHNpbmdsZSBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfc2VuZERldGFpbFZpZXcoe1xuICAgICAgICAgICAgICAgICAgICBwayA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgICAgICAgICAgIH0pIHtcbiAgICBwayA/Pz0gaWQ7XG4gICAgcGsgPSBub3JtYWxpemVQayhwayk7XG4gICAgbGV0ICRkaXZMaXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IFwiZGV0YWlsX3ZpZXdcIixcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICBwayxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBtb2RlbCBmb3JtIGZyYWdtZW50IGFuZCBhdHRhY2ggdGhlIFNEQyBmb3JtIG1ldGFkYXRhIGV4cGVjdGVkIGJ5XG4gICAqIHRoZSByZXN0IG9mIHRoZSBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gbW9kZWxPYmpcbiAgICogQHBhcmFtIGZvcm1OYW1lXG4gICAqIEBwYXJhbSAkZGl2Rm9ybVxuICAgKiBAcGFyYW0gY2JSZXNvbHZlXG4gICAqIEBwYXJhbSBjYlJlamVjdFxuICAgKiBAcGFyYW0gZm9ybUlkXG4gICAqL1xuICBnZXRGb3JtKHsgbW9kZWxPYmosIGV2ZW50VHlwZSwgZm9ybU5hbWUsICRkaXZGb3JtLCBjYlJlc29sdmUsIGNiUmVqZWN0LCBmb3JtSWQgfSkge1xuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgY29uc3QgcGsgPSBtb2RlbE9iai5pZCA/PyAtMTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICBwayxcbiAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGsgPT09IG51bGwgfHwgcGsgPT09IC0xID8gXCJjcmVhdGVcIiA6IFwiZWRpdFwiO1xuXG4gICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAkZGl2Rm9ybS5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgbGV0ICRmb3JtID0gJGRpdkZvcm1cbiAgICAgICAgICAuY2xvc2VzdChcImZvcm1cIilcbiAgICAgICAgICAuYWRkQ2xhc3MoXG4gICAgICAgICAgICBgc2RjLW1vZGVsLSR7Y2xhc3NOYW1lfS1mb3JtIHNkYy1tb2RlbC1mb3JtICR7Zm9ybUlkfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5kYXRhKFwibW9kZWxcIiwgbW9kZWxPYmopXG4gICAgICAgICAgLmRhdGEoXCJtb2RlbF9wa1wiLCBwaylcbiAgICAgICAgICAuZGF0YShcImZvcm1fbmFtZVwiLCBmb3JtTmFtZSk7XG4gICAgICAgIG1vZGVsT2JqLmFkZEZvcm0oJGZvcm0pO1xuICAgICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKFwic2RjX3N1Ym1pdFwiKSkge1xuICAgICAgICAgICRmb3JtLmF0dHIoXCJzZGNfc3VibWl0XCIsIFwic3VibWl0TW9kZWxGb3JtRGlzdHJpYnV0b3JcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcHAucmVmcmVzaCgkZGl2Rm9ybSkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgIH0sXG4gICAgICAocmVzKSA9PiB7XG4gICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBzaW5nbGUgbW9kZWwgaW5zdGFuY2UgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbW9kZWxRdWVyeVxuICAgKiBAcGFyYW0gez9ib29sZWFufSBkb05vdExvYWQgdHJ1ZSBpZiBtb2RlbFF1ZXJ5IGNvbnRhaW5zIGlkIG9yIHBrIGFuZCBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY01vZGVsPn1cbiAgICovXG4gIGFzeW5jIGdldChtb2RlbFF1ZXJ5ID0gbnVsbCwgZG9Ob3RMb2FkID0gZmFsc2UpIHtcbiAgICBpZiAoZG9Ob3RMb2FkKSB7XG4gICAgICBjb25zdCBpZCA9IG1vZGVsUXVlcnk/LmlkID8/IHRoaXMubW9kZWxRdWVyeT8uaWQ7XG4gICAgICBpZihtb2RlbFF1ZXJ5KSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyKG1vZGVsUXVlcnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnlJZChpZCkgPz8gdGhpcy5uZXcobW9kZWxRdWVyeSB8fCB0aGlzLm1vZGVsUXVlcnkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvYWQobW9kZWxRdWVyeSk7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1vZGVsIHF1ZXJ5IHJldHVybnMgJHt0aGlzLmxlbmd0aH0gYnV0IG9ubHkgMSBleHBlY3RlZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEZpbHRlcih7IGlkOiB0aGlzLnZhbHVlc0xpc3RbMF0uaWQgfSk7XG5cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0WzBdO1xuICB9XG5cbiAgZGV0YWlsVmlldyh7IHBrLCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZERldGFpbFZpZXcoe1xuICAgICAgaWQ6IHBrLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICBsaXN0Vmlldyh7IG1vZGVsUXVlcnkgPSB7fSwgc2VhcmNoVmFsdWVzID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kTGlzdFZpZXcoe1xuICAgICAgbW9kZWxRdWVyeTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbFF1ZXJ5LCBtb2RlbFF1ZXJ5LCB7ICdfX3NlYXJjaF92YWx1ZXMnOiBzZWFyY2hWYWx1ZXMgfSksXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIHRlbXBsYXRlQ29udGV4dCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmUoeyBwayA9IG51bGwsIGlkID0gbnVsbCwgZm9ybU5hbWUgPSBcImVkaXRfZm9ybVwiLCBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICBwayA/Pz0gaWQ7XG4gICAgY29uc3Qgbm9ybVBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgZWxlbUxpc3Q7XG4gICAgICBpZiAobm9ybVBrID4gLTEpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYnlJZChub3JtUGspO1xuICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFNkY01vZGVsRXJyb3IoYEVsZW1lbnQgbm90IGZvdW5kIHdpdGggSUQ6ICR7bm9ybVBrfWApKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtTGlzdCA9IFtlbGVtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1MaXN0ID0gdGhpcy52YWx1ZXNMaXN0O1xuICAgICAgfVxuICAgICAgbGV0IHBMaXN0ID0gW107XG4gICAgICBlbGVtTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICAgIHBMaXN0LnB1c2goXG4gICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbmREYXRhID0gZGF0YSA/IHsgLi4uZGF0YSB9IDogZWxlbS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgc2VuZERhdGEuaWQgPSBlbGVtLmlkO1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInNhdmVcIixcbiAgICAgICAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBzZW5kRGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHNlbmREYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgaW4gdGhlIERCLlxuICAgKlxuICAgKiBAcGFyYW0ge3tlbGVtPzogU2RjTW9kZWwsIGRhdGE/OiBvYmplY3R9IHwgb2JqZWN0fSBhcmdcbiAgICogICBFaXRoZXIgYW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBgZWxlbWAgYW5kL29yIGBkYXRhYCxcbiAgICogICBvciBgZGF0YWAgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNyZWF0ZSh7IGVsZW0sIGRhdGEgfSk7XG4gICAqIGNyZWF0ZSh7IGVsZW0gfSk7XG4gICAqIGNyZWF0ZShkYXRhKTtcbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUoYXJnID0gbnVsbCkge1xuICAgIGxldCB7IGVsZW0gPSBudWxsLCBkYXRhID0gbnVsbCB9ID0gaXNDcmVhdGVPcHRpb25zKGFyZykgPyBhcmcgOiB7IGRhdGE6IGFyZyB9O1xuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIGVsZW0gPSB0aGlzLm5ldyhkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY3JlYXRlXCIsXG4gICAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhID8/IGVsZW0/LnNlcmlhbGl6ZSgpID8/IHt9LFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGRhdGEgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgOiByZXMuZGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtLmlkID0gZGF0YVswXT8uaWQgfHwgZGF0YVswXT8ucGs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKVswXTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBdO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgd2Vic29ja2V0IGlzIG9wZW4gYW5kIGhhcyBjb21wbGV0ZWQgdGhlIHNlcnZlci1zaWRlIGNvbm5lY3RcbiAgICogaGFuZHNoYWtlIGJlZm9yZSBpc3N1aW5nIG1vZGVsIHJlcXVlc3RzLlxuICAgKlxuICAgKiBNdWx0aXBsZSBjYWxsZXJzIGNhbiBhcnJpdmUgd2hpbGUgYSBjb25uZWN0aW9uIGF0dGVtcHQgaXMgYWxyZWFkeSBpblxuICAgKiBwcm9ncmVzcy4gSW4gdGhhdCBjYXNlIHRoZXkgYXJlIHF1ZXVlZCBiZWhpbmQgdGhlIHNhbWUgc3ludGhldGljIHJlcXVlc3QgaWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyB8fFxuICAgICAgICAhdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXSA9IFsoKSA9PiB7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfV07XG4gICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fY2hlY2tDb25uZWN0aW9uKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFtyZXNvbHZlT3JpZ2luLCByZWplY3RPcmlnaW5dID1cbiAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF07XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXSA9IFtcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlT3JpZ2luKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3RPcmlnaW4oKTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHdlYnNvY2tldCBhbmQgZGlzYWJsZSBhdXRvbWF0aWMgcmVjb25uZWN0IGZvciB0aGlzIHF1ZXJ5c2V0LlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICBkZWxldGUgdGhpc1tcInNvY2tldFwiXTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5fb25DbG9zZSgpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGF0dGFjaGVkIGBGaWxlYCB2YWx1ZXMgaW4gZml4ZWQtc2l6ZSBjaHVua3MgYmVmb3JlIHNhdmUvY3JlYXRlIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY01vZGVsfSBlbGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBfcmVhZEZpbGVzKGVsZW0pIHtcbiAgICBsZXQgdG9Tb2x2ZSA9IFtdO1xuICAgIGxldCBmaWxlcyA9IHt9O1xuICAgIGlmICghZWxlbSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmaWxlcyk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKGVsZW0uY29uc3RydWN0b3IuZmllbGRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZWxlbVtrZXldO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICB0b1NvbHZlLnB1c2goXG4gICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG5cbiAgICAgICAgICAgIHZhbHVlLmFycmF5QnVmZmVyKCkudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgICBsZXQgbnVtYmVyT2ZDaHVua3MgPSBNYXRoLmNlaWwocmVzdWx0Lmxlbmd0aCAvIE1BWF9GSUxFX1VQTE9BRCk7XG4gICAgICAgICAgICAgIGZpbGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50X2lkLFxuICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaHVua3M7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gQXJyYXkuZnJvbShyZXN1bHQuc2xpY2UoXG4gICAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiBpLFxuICAgICAgICAgICAgICAgICAgTUFYX0ZJTEVfVVBMT0FEICogKGkgKyAxKSxcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInVwbG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2h1bmtzOiBudW1iZXJPZkNodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50X2lkKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbCh0b1NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWxlcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSB3ZWJzb2NrZXQgcmVzcG9uc2VzIHRvIHRoZSBtYXRjaGluZyBwZW5kaW5nIHJlcXVlc3QgYW5kIHVwZGF0ZSBsb2NhbFxuICAgKiBzdGF0ZSB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgbW9kZWwgcGF5bG9hZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7TWVzc2FnZUV2ZW50fSBlXG4gICAqL1xuICBhc3luYyBfb25NZXNzYWdlKGUpIHtcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24odGhpcy5vcGVuUmVxdWVzdCwgZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShuZXcgU2RjTW9kZWxFcnJvcihkYXRhKSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hFcnJvck1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdWzFdKG5ldyBTZGNNb2RlbEVycm9yKGRhdGEpKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKFwicHVzaE1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgfSBlbHNlIGlmIChbXCJsb2FkXCIsIFwibGlzdF92aWV3XCIsIFwibmFtZWRfdmlld1wiLCBcImRldGFpbF92aWV3XCJdLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY29uc3QganNvblJlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IGF3YWl0IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25SZXMpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwib25fdXBkYXRlXCIgfHwgZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICBsZXQgb2JqID0gYXdhaXQgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvblJlcyk7XG4gICAgICAgIGxldCBjYjtcblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uQ3JlYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiID0gdGhpcy5vblVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNiKG9iaik7XG4gICAgICAgIGRhdGEuYXJncy5kYXRhID0gb2JqO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwib25fZGVsZXRlXCIpIHtcbiAgICAgICAgY29uc3QgaWRzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSkubWFwKCh4KSA9PiBub3JtYWxpemVQayh4LmlkID8/IHgucGspKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZUlkcyhpZHMpO1xuICAgICAgICAodGhpcy5vbkRlbGV0ZSA/PyB0aGlzLm9uVXBkYXRlKShyZW1vdmVkKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSByZW1vdmVkO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zdGFuY2UgPSBkYXRhLmRhdGE/Lmluc3RhbmNlO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuZGF0YS5pbnN0YW5jZSA9IEpTT04ucGFyc2UoZGF0YS5kYXRhLmluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5oYXNPd24odGhpcy5vcGVuUmVxdWVzdCwgZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IHdlYnNvY2tldCByZXF1ZXN0cyBmb3IgdGhpcyBxdWVyeXNldCBhcmUgcmVzb2x2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgbm9PcGVuUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb21wbGV0ZWQgcmVxdWVzdCBhbmQgd2FrZSBhbnkgYG5vT3BlblJlcXVlc3RzKClgIHdhaXRlcnMgd2hlbiB0aGVcbiAgICogcmVxdWVzdCBtYXAgYmVjb21lcyBlbXB0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50SWRcbiAgICovXG4gIF9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50SWQpIHtcbiAgICBkZWxldGUgdGhpcy5vcGVuUmVxdWVzdFtldmVudElkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLmZvckVhY2goKHgpID0+IHgoKSk7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaCB0aGUgcmF3IHdlYnNvY2tldCBjb25uZWN0aW9uIGZvciB0aGlzIHF1ZXJ5c2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbElkZW50aWZpZXIgPVxuICAgICAgICBgJHt0aGlzLm1vZGVsTmFtZX1gICsgKHRoaXMubW9kZWxJZCA+IDAgPyBgLyR7dGhpcy5tb2RlbElkfWAgOiBcIlwiKTtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgIGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICBgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbE5hbWV9LCAke3RoaXMubW9kZWxJZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHRoaXMub3BlblJlcXVlc3QpKSB7XG4gICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdCA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2F1dG9SZWNvbm5lY3QgJiYgIXRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAvLyBpc0Nvbm5lY3RlZCgpIG9wZW5zIHRoZSBzb2NrZXQgYW5kIHNlbmRzIHRoZSBjb25uZWN0IGhhbmRzaGFrZSwgc29cbiAgICAgICAgICAgIC8vIGxpdmUgdXBkYXRlcyB3b3JrIGFnYWluIGFuZCBsYXRlciByZXF1ZXN0cyByZXVzZSB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1vZGVsIFNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJHtlcnJ9IENsb3Npbmcgc29ja2V0YCk7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhcHBsaWNhdGlvbi1sZXZlbCBjb25uZWN0IGhhbmRzaGFrZSBvbmNlIHRoZSB3ZWJzb2NrZXQgb3BlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgKi9cbiAgX2NoZWNrQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBcImNvbm5lY3RcIixcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGJhY2tlbmQgbW9kZWwgcGF5bG9hZCBpbnRvIGxvY2FsbHkgdHJhY2tlZCBtb2RlbCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IHJlc3VsdHNcbiAgICovXG4gIF9wYXJzZVNlcnZlclJlcyhyZXN1bHRzKSB7XG4gICAgY29uc3QgbmV3TW9kZWxzID0gW11cbiAgICBmb3IgKGNvbnN0IHggb2YgcmVzdWx0cykge1xuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKTtcbiAgICAgIGlmICghTW9kZWxDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbE5hbWV9IGlzIG5vIFNkY01vZGVsLiBteWJlIHRoZSBtb2RlbHMgYXIgbm90IGltcG9ydGFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3TW9kZWwgPSBuZXcgTW9kZWxDbGFzcyh7ICdpZCc6IHguaWQgPz8geC5waywgLi4ueC5maWVsZHMgfSk7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSB0aGlzLmJ5SWQobmV3TW9kZWwuaWQpO1xuICAgICAgaWYgKGN1cnJlbnRNb2RlbCkge1xuICAgICAgICBjdXJyZW50TW9kZWwuc2V0VmFsdWVzKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWxzLnB1c2goY3VycmVudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChuZXdNb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmFsdWVzTGlzdC5zb3J0KChhLCBiKSA9PiBhLl9pZCAtIGIuX2lkKTtcbiAgICByZXR1cm4gbmV3TW9kZWxzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNkY01vZGVsIHtcbiAgc3RhdGljIGZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBCYXNlIG1vZGVsIHdyYXBwZXIgdXNlZCBieSBTREMgbW9kZWwgcmVnaXN0cmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lKSB7XG4gICAgdGhpcy5faWQgPSBudWxsO1xuICAgIHRoaXMuX2Zvcm1zID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1JZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0P30gbW9kZWxRdWVyeVNldFxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5U2V0KG1vZGVsUXVlcnlTZXQgPSBudWxsLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgY29uc3QgeyBtb2RlbE5hbWUgfSA9IG5ldyB0aGlzKHt9KTtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIG5ldyBTZGNRdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnlTZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQucXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgfVxuXG4gIGFkZEZvcm0oJGZvcm0pIHtcbiAgICAvLyBSZW1vdmUgb2xkIGxpc3RlbmVycyBpZiBmb3JtIGFscmVhZHkgc2V0XG4gICAgY29uc3Qgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fZm9ybXMucHVzaCgkZm9ybSk7XG5cbiAgICBpZiAoJGZvcm0pIHtcbiAgICAgIC8vIEF0dGFjaCBkZWxlZ2F0ZWQgZXZlbnQgaGFuZGxlciB0byBhbGwgaW5wdXRzXG4gICAgICAkZm9ybS5vbihcbiAgICAgICAgXCJpbnB1dC5mb3JtV2F0Y2hlciBjaGFuZ2UuZm9ybVdhdGNoZXJcIixcbiAgICAgICAgXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYVwiLFxuICAgICAgICBvbkNoYW5nZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBfb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5maWVsZHNbbmFtZV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXNbYHNldCR7bmFtZX1gXShnZXRWYWx1ZUZyb21GaWVsZChldmVudC50YXJnZXQpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJbnZhbGlkIGlucHV0IChlLmcuIGFuIGVtcHR5IHJlcXVpcmVkIGZpZWxkKSBpcyBrZXB0IGluIHRoZSBmb3JtIGFuZFxuICAgICAgICAvLyB2YWxpZGF0ZWQgYnkgdGhlIHNlcnZlciBvbiBzdWJtaXQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNob3cgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgb3RoZXIgZm9ybXMgb2YgdGhpcyBtb2RlbCwgbm90IGluIHRoZSBpbnB1dCBiZWluZyBlZGl0ZWQuXG4gICAgICB0aGlzLl91cGRhdGVGb3JtKG5hbWUsIGV2ZW50LnRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUZvcm0oZmllbGROYW1lLCBza2lwRWxlbWVudCA9IG51bGwpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9mb3Jtcy5mb3JFYWNoKCgkZm9ybSkgPT4ge1xuICAgICAgJGZvcm0uZmluZChgW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgIT09IHNraXBFbGVtZW50KSB7XG4gICAgICAgICAgc2V0VmFsdWVJbkZpZWxkKHRoaXMsIHNlbGZbZmllbGROYW1lXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0VmFsdWVzKGRhdGEgPSB7fSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInNldFZhbHVlcygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NcIik7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBxdWVyeXNldCB0aGF0IG93bnMgdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtTZGNRdWVyeVNldH0gcXVlcnlTZXRcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xvYWRlZFxuICAgKi9cbiAgX3NldFF1ZXJ5U2V0KHF1ZXJ5U2V0LCBpc0xvYWRlZCkge1xuICAgIHRoaXMuX3F1ZXJ5U2V0ID0gbmV3IFdlYWtSZWYocXVlcnlTZXQpO1xuICAgIHRoaXMubG9hZGVkID0gaXNMb2FkZWQ7XG4gIH1cblxuICBnZXQgcXVlcnlTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCk7XG4gIH1cblxuICBzYXZlKHsgZm9ybU5hbWUgPSBcImVkaXRfZm9ybVwiLCBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5zYXZlKHsgcGs6IHRoaXMuaWQsIGZvcm1OYW1lLCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGlzIGluc3RhbmNlIGluIHRoZSBEQi5cbiAgICpcbiAgICogQHBhcmFtIHt7ZGF0YT86IG9iamVjdH0gfCBvYmplY3QgfCBudWxsfSB2YWx1ZXNcbiAgICogICBFaXRoZXIgYHsgZGF0YSB9YCBvciBgZGF0YWAgZGlyZWN0bHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgY3JlYXRlKHZhbHVlcyA9IG51bGwpIHtcbiAgICBjb25zdCBkYXRhID0gaXNDcmVhdGVPcHRpb25zKHZhbHVlcykgPyAodmFsdWVzLmRhdGEgPz8gbnVsbCkgOiB2YWx1ZXM7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY3JlYXRlKHsgZWxlbTogdGhpcywgZGF0YSB9KTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZWxldGUoeyBlbGVtOiB0aGlzIH0pO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS51cGRhdGUoeyBpdGVtOiB0aGlzIH0pO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBzZXQgaWQoZGF0YSkge1xuICAgIHRoaXMuX2lkID0gZGF0YTtcbiAgfVxuXG4gIHNldCBwayhkYXRhKSB7XG4gICAgdGhpcy5pZCA9IGRhdGE7XG4gIH1cblxuICBnZXQgcGsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNsb3NlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3IuZmllbGRzKVxuICAgICAgLmZpbHRlcigoeCkgPT4gdGhpc1tgXyR7eH1gXSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KVxuICAgICAgLmZvckVhY2goKHgpID0+IHRoaXNbYF8ke3h9YF0uY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXJlbmRlcmVkIGRldGFpbCB2aWV3IGZvciB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRldGFpbFZpZXcoeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZXRhaWxWaWV3KHsgcGs6IHRoaXMuaWQsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCB9KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIGlmICh2YWwubWFueV90b19tYW55IHx8IHZhbC5vbmVfdG9fbWFueSkge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsSWRzID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgICAgaWYgKGFsbElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGFsbElkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbC5pc19yZWxhdGlvbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWUuaWQgPz8gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIC8vIERqYW5nbydzIERhdGVGaWVsZCBkb2VzIG5vdCBhY2NlcHQgYSBmdWxsIElTTyBkYXRldGltZS5cbiAgICAgICAgYWNjW2tleV0gPSB2YWwudHlwZSA9PT0gXCJEYXRlRmllbGRcIiA/IGZvcm1hdERhdGUodmFsdWUpIDogdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgY29uc3QgcmVzID0ge31cbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgZm9yIHN5bmNpbmcgdmFsdWVzIGZyb20gYSBmb3JtIGludG8gdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGZvcm0gY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfcmVzb2x2ZUZvcm1zKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJChgLiR7dGhpcy5mb3JtSWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICRmb3JtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSBjdXJyZW50IG1vZGVsIHN0YXRlIGludG8gbWF0Y2hpbmcgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqL1xuICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCB7IGZpZWxkcyB9ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIC8vIENyZWF0ZSBmb3JtcyBjYXJyeSBtb2RlbF9wayAtMSB3aGlsZSB0aGUgbmV3IG1vZGVsJ3MgaWQgaXMgc3RpbGwgbnVsbC5cbiAgICAgIGlmIChub3JtYWxpemVQayhzZWxmLmlkKSAhPT0gcGspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCB7IG5hbWUgfSA9IGZvcm1JdGVtO1xuICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIlwiICYmICEhZmllbGRzW25hbWVdKSB7XG4gICAgICAgICAgc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCBzZWxmW25hbWVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBtYXRjaGluZyBmb3JtIHZhbHVlcyBiYWNrIG9udG8gdGhlIGN1cnJlbnQgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEhpZGRlbiBpbnB1dHMgYXJlIHBhcnNlZCB0byB0aGVpciBvcmlnaW5hbCBwcmltaXRpdmUgdHlwZSB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICRmb3JtcyA9IHRoaXMuX3Jlc29sdmVGb3JtcygkZm9ybXMpO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgeyBmaWVsZHMgfSA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fVxuXG4gICAgZnVuY3Rpb24gc2V0VmFsdWVJbkZvcm0obmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmIChmaWVsZHNbbmFtZV0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWxmW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEludmFsaWQgdmFsdWVzIGFyZSBzdGlsbCBzZW50IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIHJldHVybnMgdGhlIGZvcm1cbiAgICAgICAgICAvLyBlcnJvcnM7IHRoZSBtb2RlbCBrZWVwcyBpdHMgbGFzdCB2YWxpZCB2YWx1ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWVbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIGlmIChzZWxmLmlkICE9PSBwayAmJiAoc2VsZi5pZCAhPT0gbnVsbCB8fCBwayAhPT0gLTEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZm9ybUl0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICBzZXRWYWx1ZUluRm9ybShmb3JtSXRlbS5uYW1lLCBnZXRWYWx1ZUZyb21GaWVsZChmb3JtSXRlbSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNvcnJlY3Qgc2VydmVyLXNpZGUgZm9ybSBmb3IgdGhpcyBtb2RlbCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBmb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLmlkID09PSBudWxsIHx8IHRoaXMuaWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3JlYXRlRm9ybSh7IGNiUmVqZWN0LCBjYlJlc29sdmUgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9lZGl0Rm9ybSh7IGNiUmVqZWN0LCBjYlJlc29sdmUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjcmVhdGUgZm9ybSBmb3IgYSBuZXcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2NyZWF0ZUZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSkge1xuICAgIGxldCAkZGl2Rm9ybSA9ICQoXCI8ZGl2PlwiKTtcbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiY3JlYXRlX2Zvcm1cIixcbiAgICAgIGZvcm1OYW1lOiBudWxsLFxuICAgICAgJGRpdkZvcm0sXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkZvcm07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBlZGl0IGZvcm0gZm9yIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9lZGl0Rm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJChcIjxkaXY+XCIpO1xuXG4gICAgdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5nZXRGb3JtKHtcbiAgICAgIG1vZGVsT2JqOiB0aGlzLFxuICAgICAgZXZlbnRUeXBlOiBcImVkaXRfZm9ybVwiLFxuICAgICAgZm9ybU5hbWU6IG51bGwsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBuYW1lZCBzZXJ2ZXItc2lkZSBmb3JtIGZvciB0aGlzIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIG5hbWVkRm9ybSh7IGZvcm1OYW1lLCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSkge1xuICAgIGxldCAkZGl2Rm9ybSA9ICQoJzxkaXYgIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwibmFtZWRfZm9ybVwiLFxuICAgICAgZm9ybU5hbWUsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZCBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKi9cbiAgdmFsaWRhdGUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IGVyciA9IHZhbGlkYXRlRmllbGQodmFsdWUsIGNvbmZpZyk7XG4gICAgaWYgKGVycikgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHJhdyBpbnB1dCB2YWx1ZSBpbnRvIHRoZSBzaGFwZSBleHBlY3RlZCBieSB0aGUgZmllbGQgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwYXJzZVZhbHVlKHZhbHVlLCBjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgbWFueV90b19tYW55OiBtYW55VG9NYW55LFxuICAgICAgb25lX3RvX21hbnk6IG9uZVRvTWFueSxcbiAgICAgIG1hbnlfdG9fb25lOiBtYW55VG9PbmUsXG4gICAgICBvbmVfdG9fb25lOiBvbmVUb09uZSxcbiAgICB9ID0gY29uZmlnO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKChtYW55VG9NYW55IHx8IG9uZVRvTWFueSB8fCBtYW55VG9PbmUgfHwgb25lVG9PbmUpICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJDaGFyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJUZXh0RmllbGRcIjpcbiAgICAgIGNhc2UgXCJTbHVnRmllbGRcIjpcbiAgICAgIGNhc2UgXCJVVUlERmllbGRcIjpcbiAgICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuXG4gICAgICBjYXNlIFwiSW50ZWdlckZpZWxkXCI6XG4gICAgICBjYXNlIFwiU21hbGxJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJQb3NpdGl2ZUludGVnZXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlBvc2l0aXZlU21hbGxJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJQb3NpdGl2ZUJpZ0ludGVnZXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIkF1dG9GaWVsZFwiOlxuICAgICAgY2FzZSBcIlNtYWxsQXV0b0ZpZWxkXCI6XG4gICAgICBjYXNlIFwiQmlnQXV0b0ZpZWxkXCI6XG4gICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgICAgY2FzZSBcIkRlY2ltYWxGaWVsZFwiOlxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuRmllbGRcIjpcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJEYXRlRmllbGRcIjpcbiAgICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICAgIHJldHVybiB0b0RhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIFwiVVJMRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBVUkwodmFsdWUpO1xuXG4gICAgICBjYXNlIFwiRmlsZUZpZWxkXCI6XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRmlsZUxvYWRlZC5pc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTG9hZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9hZGVkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAvLyBTaXplIGFuZCB0eXBlIGFyZSBjaGVja2VkIGluIHZhbGlkYXRlKCkuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiSlNPTkZpZWxkXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBmaWVsZCB2YWx1ZSBhZ2FpbnN0IHRoZSBmaWVsZCBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpZWxkKHZhbHVlLCBjb25maWcpIHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgbWF4X2xlbmd0aDogbWF4TGVuZ3RoLFxuICAgIGlzX3JlbGF0aW9uOiBpc1JlbGF0aW9uLFxuICAgIG1hbnlfdG9fbWFueTogbWFueVRvTWFueSxcbiAgICBvbmVfdG9fbWFueTogb25lVG9NYW55LFxuICAgIG1hbnlfdG9fb25lOiBtYW55VG9PbmUsXG4gICAgb25lX3RvX29uZTogb25lVG9PbmUsXG4gICAgcmVsYXRlZF9tb2RlbDogcmVsYXRlZE1vZGVsLFxuICB9ID0gY29uZmlnO1xuXG4gIHZvaWQgaXNSZWxhdGlvbjtcblxuICBpZiAocmVxdWlyZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobWFueVRvTWFueSB8fCBvbmVUb01hbnkgfHwgbWFueVRvT25lIHx8IG9uZVRvT25lKSB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkgfHwgdmFsdWUubW9kZWxOYW1lICE9PSByZWxhdGVkTW9kZWwpIHtcbiAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChtYW55VG9NYW55IHx8IG1hbnlUb09uZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuc29tZSgoeCkgPT4gIU51bWJlci5pc05hTihwYXJzZUludCh4KSkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiBOdW1iZXIuaXNOYU4ocGFyc2VJbnQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIG9iamVjdCBvciBJRFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgIGNhc2UgXCJUZXh0RmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHN0cmluZ1wiO1xuICAgICAgfVxuICAgICAgaWYgKG1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGBNYXggbGVuZ3RoIGlzICR7bWF4TGVuZ3RofWA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiU21hbGxJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgY2FzZSBcIlBvc2l0aXZlSW50ZWdlckZpZWxkXCI6XG4gICAgY2FzZSBcIlBvc2l0aXZlU21hbGxJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiUG9zaXRpdmVCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgY2FzZSBcIlNtYWxsQXV0b0ZpZWxkXCI6XG4gICAgY2FzZSBcIkJpZ0F1dG9GaWVsZFwiOlxuICAgICAgaWYgKCFpc0Zpbml0ZShwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYW4gaW50ZWdlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgIGNhc2UgXCJEZWNpbWFsRmllbGRcIjpcbiAgICAgIGlmICghaXNGaW5pdGUocGFyc2VGbG9hdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSBudW1iZXJcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkJvb2xlYW5GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIGJvb2xlYW5cIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkRhdGVGaWVsZFwiOlxuICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSB2YWxpZCBkYXRlXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICEvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIGVtYWlsXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVUkxGaWVsZFwiOlxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVUkxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgaWYgKCEvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVVUlEXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJKU09ORmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSB2YWxpZCBKU09OXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJGaWxlRmllbGRcIjpcbiAgICAgIGlmICghRmlsZUxvYWRlZC5pc1ZhbGlkKHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMb2FkZWQpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSB2YWxpZCBmaWxlXCI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGlmIChjb25maWcubWF4X3NpemUgJiYgdmFsdWUuc2l6ZSA+IGNvbmZpZy5tYXhfc2l6ZSkge1xuICAgICAgICAgIHJldHVybiBgRmlsZSB0b28gbGFyZ2UgKG1heCAke2NvbmZpZy5tYXhfc2l6ZX0gYnl0ZXMpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRfdHlwZXMgJiYgIWNvbmZpZy5hbGxvd2VkX3R5cGVzLmluY2x1ZGVzKHZhbHVlLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBJbnZhbGlkIGZpbGUgdHlwZSAoJHt2YWx1ZS50eXBlfSlgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
78
88
 
79
89
  /***/ },
80
90
 
@@ -84,7 +94,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
84
94
  \********************************************/
85
95
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
86
96
 
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}");
97
+ 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\n\nfunction prepareData(data, controller = null) {\n const data_json_key = \"SDC_JSON_MODEL=[\";\n return Object.fromEntries(\n Object.entries(data)\n .filter(([key, element]) => {\n return key !== _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY;\n })\n .map(([key, element]) => {\n if (typeof element === \"string\" && element.startsWith(data_json_key)) {\n try {\n const { pk, fields } = JSON.parse(\n element.slice(data_json_key.length, -1),\n );\n return [\n key,\n {\n ...fields,\n id: pk,\n },\n ];\n } catch {\n }\n }\n return [key, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.checkIfParamNumberBoolOrString)(element, controller)];\n }),\n );\n}\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 }\n\n controller.params = getDomTagParamsWithList(\n $element,\n applyController._parentController,\n );\n}\n\nfunction runOnInitWithParameter($element, controller) {\n reg_runOnInitWithParameter(controller, $element, controller);\n}\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\n return { params, args };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfcGFyYW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRXdCO0FBQzRCOztBQUU3QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDZEQUFtQjtBQUMxQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLHFCQUFxQiw2RUFBOEI7QUFDbkQsT0FBTztBQUNQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRyxLQUFLLElBQUk7O0FBRVosV0FBVztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19wYXJhbXMuanM/ZDM0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcsXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgREFUQV9DT05UUk9MTEVSX0tFWSB9IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlRGF0YShkYXRhLCBjb250cm9sbGVyID0gbnVsbCkge1xuICBjb25zdCBkYXRhX2pzb25fa2V5ID0gXCJTRENfSlNPTl9NT0RFTD1bXCI7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSlcbiAgICAgIC5maWx0ZXIoKFtrZXksIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgIT09IERBVEFfQ09OVFJPTExFUl9LRVk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW2tleSwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiICYmIGVsZW1lbnQuc3RhcnRzV2l0aChkYXRhX2pzb25fa2V5KSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHBrLCBmaWVsZHMgfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgIGVsZW1lbnQuc2xpY2UoZGF0YV9qc29uX2tleS5sZW5ndGgsIC0xKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgICAgICAgaWQ6IHBrLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyhlbGVtZW50LCBjb250cm9sbGVyKV07XG4gICAgICB9KSxcbiAgKTtcbn1cblxuXG5mdW5jdGlvbiBnZXREb21UYWdQYXJhbXNXaXRoTGlzdCgkZWxlbWVudCwgY29udHJvbGxlciA9IG51bGwpIHtcbiAgcmV0dXJuIHByZXBhcmVEYXRhKCRlbGVtZW50LmRhdGEoKSwgY29udHJvbGxlcik7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbWVudFxuICogQHBhcmFtIGFwcGx5Q29udHJvbGxlclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJlZ19ydW5PbkluaXRXaXRoUGFyYW1ldGVyKGNvbnRyb2xsZXIsICRlbGVtZW50LCBhcHBseUNvbnRyb2xsZXIpIHtcbiAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJhbXMgPSBnZXREb21UYWdQYXJhbXNXaXRoTGlzdChcbiAgICAkZWxlbWVudCxcbiAgICBhcHBseUNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5PbkluaXRXaXRoUGFyYW1ldGVyKCRlbGVtZW50LCBjb250cm9sbGVyKSB7XG4gIHJlZ19ydW5PbkluaXRXaXRoUGFyYW1ldGVyKGNvbnRyb2xsZXIsICRlbGVtZW50LCBjb250cm9sbGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtKGNvbnRyb2xsZXIsICRlbGVtZW50KSB7XG4gIGNvbnN0IHZhbHVlcyA9IGdldERvbVRhZ1BhcmFtc1dpdGhMaXN0KCRlbGVtZW50LCBjb250cm9sbGVyKTtcbiAgY29uc3QgW3BhcmFtcywgYXJnc10gPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpLnJlZHVjZSgoW3BhcmFtcywgYXJnc10sIFtrLCB2XSkgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMuaW5jbHVkZXMoaykpIHtcbiAgICAgIHBhcmFtc1trXSA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3Nba10gPSB2O1xuICAgIH1cbiAgICByZXR1cm4gW3BhcmFtcywgYXJnc11cbiAgfSwgW3t9LCB7fV0pO1xuXG4gIHJldHVybiB7IHBhcmFtcywgYXJncyB9O1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_params.js\n\n}");
88
98
 
89
99
  /***/ },
90
100
 
@@ -94,7 +104,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
94
104
  \*************************************************/
95
105
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
96
106
 
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}");
107
+ 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\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nlet OPEN_REQUESTS = {};\n\n/**\n * Server methods receive the arguments as keyword arguments, so they must be an\n * object. Other values are passed as ``arg0``.\n */\nfunction normalizeArgs(args) {\n if (args === undefined || args === null) {\n return {};\n }\n if (typeof args !== \"object\" || Array.isArray(args)) {\n return { arg0: args };\n }\n return args;\n}\n\nfunction callServer(app, controller, parsedContentUrl, funcName, args) {\n args = normalizeArgs(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}\n\nfunction isConnected() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketIsConnected();\n } else {\n return Promise.resolve(true);\n }\n}\n\nfunction close() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n socketClose();\n }\n}\n\nfunction postCallServer(parsedContentUrl, funcName, args) {\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 })\n .then((res) => {\n const data = res[\"_return_data\"];\n _handle_response(data);\n return data;\n })\n .catch((res) => {\n const data = res.responseJSON || {};\n data.is_error = true;\n _handle_response(data);\n throw res;\n });\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(\n JSON.stringify({\n event: \"sdc_call\",\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args,\n }),\n );\n });\n\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\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\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n _handle_response(data);\n };\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\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n\n SDC_SOCKET.onerror = function (err) {\n console.error(\n \"Socket encountered error: \",\n err.message,\n \"Closing socket\",\n );\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\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\n if (data.type && data.type === \"sdc_recall\") {\n // Like over HTTP: msg/header in the return value of the server method show a message.\n const { data: returnData } = data;\n if (returnData && typeof returnData === \"object\" && (returnData.msg || returnData.header)) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", returnData.header || \"\", returnData.msg || \"\");\n }\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;\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}\n\nfunction socketClose() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\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}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBd0M7QUFDRTs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxXQUFXLHFEQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxxQkFBcUI7QUFDL0QsTUFBTTtBQUNOLHlDQUF5QyxxQkFBcUI7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sdURBQU87QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsTUFBTSx1REFBTztBQUNiOztBQUVBO0FBQ0E7QUFDQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBLFFBQVEsdURBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFlBQVksUUFBUTtBQUNwQjtBQUNBLFFBQVEsdURBQU87QUFDZjtBQUNBLE1BQU07QUFDTixNQUFNLHVEQUFPO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19zZXJ2ZXJfY2FsbC5qcz9kMjRiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxubGV0IElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xubGV0IElTX0NPTk5FQ1RJTkcgPSBmYWxzZTtcbmxldCBTRENfU09DS0VUID0gbnVsbDtcbmxldCBPUEVOX1JFUVVFU1RTID0ge307XG5cbi8qKlxuICogU2VydmVyIG1ldGhvZHMgcmVjZWl2ZSB0aGUgYXJndW1lbnRzIGFzIGtleXdvcmQgYXJndW1lbnRzLCBzbyB0aGV5IG11c3QgYmUgYW5cbiAqIG9iamVjdC4gT3RoZXIgdmFsdWVzIGFyZSBwYXNzZWQgYXMgYGBhcmcwYGAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoYXJncykge1xuICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICByZXR1cm4geyBhcmcwOiBhcmdzIH07XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgcGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgYXJncyA9IG5vcm1hbGl6ZUFyZ3MoYXJncyk7XG4gIGlmICh3aW5kb3cuU0VSVkVSX0NBTExfVklBX1dFQl9TT0NLRVQpIHtcbiAgICByZXR1cm4gc29ja2V0Q2FsbFNlcnZlcihhcHAsIGNvbnRyb2xsZXIsIGZ1bmNOYW1lLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9zdENhbGxTZXJ2ZXIocGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcbiAgaWYgKHdpbmRvdy5TRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCkge1xuICAgIHJldHVybiBzb2NrZXRJc0Nvbm5lY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICBpZiAod2luZG93LlNFUlZFUl9DQUxMX1ZJQV9XRUJfU09DS0VUKSB7XG4gICAgc29ja2V0Q2xvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0Q2FsbFNlcnZlcihwYXJzZWRDb250ZW50VXJsLCBmdW5jTmFtZSwgYXJncykge1xuICBhcmdzID0ge1xuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgIF9zZGNfZnVuY19uYW1lOiBmdW5jTmFtZSxcbiAgICBfbWV0aG9kOiBcInNkY19zZXJ2ZXJfY2FsbFwiLFxuICB9O1xuICByZXR1cm4gJC5wb3N0KHtcbiAgICB1cmw6IHBhcnNlZENvbnRlbnRVcmwsXG4gICAgZGF0YTogYXJncyxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUNTUkZUb2tlblwiLCB3aW5kb3cuQ1NSRl9UT0tFTik7XG4gICAgfSxcbiAgfSlcbiAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzW1wiX3JldHVybl9kYXRhXCJdO1xuICAgICAgX2hhbmRsZV9yZXNwb25zZShkYXRhKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXMucmVzcG9uc2VKU09OIHx8IHt9O1xuICAgICAgZGF0YS5pc19lcnJvciA9IHRydWU7XG4gICAgICBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpO1xuICAgICAgdGhyb3cgcmVzO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzb2NrZXRDYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgbGV0IGlkID0gdXVpZHY0KCk7XG4gIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgU0RDX1NPQ0tFVC5zZW5kKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogXCJzZGNfY2FsbFwiLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXG4gICAgICAgIGFwcDogYXBwLFxuICAgICAgICBmdW5jdGlvbjogZnVuY05hbWUsXG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIE9QRU5fUkVRVUVTVFNbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgSVNfQ09OTkVDVElORyA9IHRydWU7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3Mvd3MvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICB9XG5cbiAgICBTRENfU09DS0VULm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSk7XG4gICAgfTtcblxuICAgIFNEQ19TT0NLRVQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNEQyBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseVwiKTtcbiAgICAgIH1cbiAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgdmFsdWVbMV0oe30pO1xuICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1trZXldO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH07XG5cbiAgICBTRENfU09DS0VULm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogXCIsXG4gICAgICAgIGVyci5tZXNzYWdlLFxuICAgICAgICBcIkNsb3Npbmcgc29ja2V0XCIsXG4gICAgICApO1xuICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19yZWNhbGxcIikge1xuICAgICAgLy8gTGlrZSBvdmVyIEhUVFA6IG1zZy9oZWFkZXIgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc2VydmVyIG1ldGhvZCBzaG93IGEgbWVzc2FnZS5cbiAgICAgIGNvbnN0IHsgZGF0YTogcmV0dXJuRGF0YSB9ID0gZGF0YTtcbiAgICAgIGlmIChyZXR1cm5EYXRhICYmIHR5cGVvZiByZXR1cm5EYXRhID09PSBcIm9iamVjdFwiICYmIChyZXR1cm5EYXRhLm1zZyB8fCByZXR1cm5EYXRhLmhlYWRlcikpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hNc2dcIiwgcmV0dXJuRGF0YS5oZWFkZXIgfHwgXCJcIiwgcmV0dXJuRGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICAgIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF1bMF0oZGF0YS5kYXRhKTtcbiAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19ldmVudFwiKSB7XG4gICAgICBsZXQgeyBldmVudCB9ID0gZGF0YTtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB0cmlnZ2VyKGV2ZW50LCBkYXRhLnBheWxvYWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfcmVkaXJlY3RcIikge1xuICAgICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBkYXRhLmxpbmspO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRDbG9zZSgpIHtcbiAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRJc0Nvbm5lY3RlZCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_server_call.js\n\n}");
98
108
 
99
109
  /***/ },
100
110
 
@@ -104,7 +114,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
104
114
  \********************************************/
105
115
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
106
116
 
107
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getModel: () => (/* binding */ getModel),\n/* harmony export */ registerModel: () => (/* binding */ registerModel)\n/* harmony export */ });\nconst registeredModels = {};\nfunction registerModel(name, classObj) {\n registeredModels[name] = classObj;\n}\nfunction getModel(name) {\n return registeredModels[name];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsTUFBTUEsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBRzNCLFNBQVNDLGFBQWFBLENBQUNDLElBQUksRUFBRUMsUUFBUSxFQUFFO0VBQ3JDSCxnQkFBZ0IsQ0FBQ0UsSUFBSSxDQUFDLEdBQUdDLFFBQVE7QUFDbkM7QUFFQSxTQUFTQyxRQUFRQSxDQUFDRixJQUFJLEVBQUU7RUFDdEIsT0FBT0YsZ0JBQWdCLENBQUNFLElBQUksQ0FBQztBQUMvQiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVnaXN0ZXJlZE1vZGVscyA9IHt9O1xuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWwobmFtZSwgY2xhc3NPYmopIHtcbiAgcmVnaXN0ZXJlZE1vZGVsc1tuYW1lXSA9IGNsYXNzT2JqO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RlbChuYW1lKSB7XG4gIHJldHVybiByZWdpc3RlcmVkTW9kZWxzW25hbWVdO1xufVxuXG5cbmV4cG9ydCB7XG4gIHJlZ2lzdGVyTW9kZWwsXG4gIGdldE1vZGVsLFxufSJdLCJuYW1lcyI6WyJyZWdpc3RlcmVkTW9kZWxzIiwicmVnaXN0ZXJNb2RlbCIsIm5hbWUiLCJjbGFzc09iaiIsImdldE1vZGVsIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
117
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getModel: () => (/* binding */ getModel),\n/* harmony export */ registerModel: () => (/* binding */ registerModel)\n/* harmony export */ });\nconst registeredModels = {};\n\n\nfunction registerModel(name, classObj) {\n registeredModels[name] = classObj;\n}\n\nfunction getModel(name) {\n return registeredModels[name];\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3NvY2tldC5qcz8wNDcxIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHJlZ2lzdGVyZWRNb2RlbHMgPSB7fTtcblxuXG5mdW5jdGlvbiByZWdpc3Rlck1vZGVsKG5hbWUsIGNsYXNzT2JqKSB7XG4gIHJlZ2lzdGVyZWRNb2RlbHNbbmFtZV0gPSBjbGFzc09iajtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kZWwobmFtZSkge1xuICByZXR1cm4gcmVnaXN0ZXJlZE1vZGVsc1tuYW1lXTtcbn1cblxuXG5leHBvcnQge1xuICByZWdpc3Rlck1vZGVsLFxuICBnZXRNb2RlbCxcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
108
118
 
109
119
  /***/ },
110
120
 
@@ -114,7 +124,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
114
124
  \************************************************/
115
125
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
116
126
 
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}");
127
+ 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\n\nlet spy = [],\n _originAjax;\n\nfunction setDefaults() {\n if (!jest) throw new Error(\"JEST is not defined\");\n if (spy.length === 0) {\n _originAjax = $.ajax.bind($);\n\n spy.push(jest.spyOn($, \"ajax\"));\n spy[0].mockImplementation(function (a) {\n return _originAjax(a)\n .then((html) => {\n return html;\n })\n .catch((html) => {\n return html;\n });\n });\n }\n}\n\nfunction getCookie(name) {\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\n let children = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.rootController.iterateAllChildren();\n\n if (!afterLifecycle) {\n return children;\n }\n\n const origenRefresh = children[0].onRefresh;\n\n const refreshSpy = jest.spyOn(children[0], \"onRefresh\");\n\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(\n tag_name,\n init_arguments = {},\n origen_html = \"\",\n) {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n\n $body.safeEmpty();\n\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\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}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ29DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLHlCQUF5QixNQUFNO0FBQy9CLGFBQWEsZUFBZSxZQUFZO0FBQ3hDO0FBQ087QUFDUDtBQUNBO0FBQ0EsRUFBRSw2Q0FBRztBQUNMO0FBQ0EsRUFBRSw2Q0FBRztBQUNMLEVBQUUsNkNBQUc7QUFDTCxRQUFRLDZDQUFHOztBQUVYLGlCQUFpQiw2Q0FBRzs7QUFFcEI7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0IseUJBQXlCLFFBQVE7QUFDakMsc0JBQXNCLFFBQVE7QUFDOUIsYUFBYSxTQUFTLFlBQVk7QUFDbEM7QUFDTztBQUNQO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSw2Q0FBRzs7QUFFTDs7QUFFQSw0QkFBNEIsU0FBUyxHQUFHLFlBQVksSUFBSSxTQUFTO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSw2Q0FBRztBQUNMLEVBQUUsNkNBQUc7QUFDTCxRQUFRLDZDQUFHO0FBQ1gscUJBQXFCLDZDQUFHO0FBQ3hCO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcz81ZmJiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGplc3QtZW52aXJvbm1lbnQganNkb21cbiAqL1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcblxubGV0IHNweSA9IFtdLFxuICBfb3JpZ2luQWpheDtcblxuZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gIGlmICghamVzdCkgdGhyb3cgbmV3IEVycm9yKFwiSkVTVCBpcyBub3QgZGVmaW5lZFwiKTtcbiAgaWYgKHNweS5sZW5ndGggPT09IDApIHtcbiAgICBfb3JpZ2luQWpheCA9ICQuYWpheC5iaW5kKCQpO1xuXG4gICAgc3B5LnB1c2goamVzdC5zcHlPbigkLCBcImFqYXhcIikpO1xuICAgIHNweVswXS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBfb3JpZ2luQWpheChhKVxuICAgICAgICAudGhlbigoaHRtbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGh0bWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09IFwiXCIpIHtcbiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0udHJpbSgpO1xuICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50P1xuICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PT0gbmFtZSArIFwiPVwiKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhuYW1lLmxlbmd0aCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1NSRiB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3NyZlRva2VuKCkge1xuICByZXR1cm4gZ2V0Q29va2llKFwiY3NyZnRva2VuXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gaHRtbHtzdHJpbmd9IEhUTUw6IC5cbiAqIEBwYXJhbSBhZnRlckxpZmVjeWNsZXtib29sfSBMaWZlY3ljbGUgTWV0aG9kZSAtPiBSZXJ1bnMgdGhlIGNvbnRyb2xsZXIgYWZ0ZXIgdGhlIHJvb3QgY29udHJvbGxlciBoYXMgcnVuIHRoZSBcIm9uUmVmcmVzaFwiIG1ldGhvZGUuIFRoaXMgaXMgb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7QWJzdHJhY3RTREN9Pj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250cm9sbGVyRnJvbVRlc3RIdG1sKGh0bWwsIGFmdGVyTGlmZWN5Y2xlID0gbnVsbCkge1xuICBzZXREZWZhdWx0cygpO1xuICBjb25zdCAkYm9keSA9ICQoXCJib2R5XCIpO1xuICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICRib2R5LnNhZmVFbXB0eSgpLmFwcGVuZChodG1sKTtcbiAgYXBwLl9pc0luaXQgPSBmYWxzZTtcbiAgYXBwLmNsZWFuQ2FjaGUoKTtcbiAgYXdhaXQgYXBwLmluaXRfc2RjKCk7XG5cbiAgbGV0IGNoaWxkcmVuID0gYXBwLnJvb3RDb250cm9sbGVyLml0ZXJhdGVBbGxDaGlsZHJlbigpO1xuXG4gIGlmICghYWZ0ZXJMaWZlY3ljbGUpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBjb25zdCBvcmlnZW5SZWZyZXNoID0gY2hpbGRyZW5bMF0ub25SZWZyZXNoO1xuXG4gIGNvbnN0IHJlZnJlc2hTcHkgPSBqZXN0LnNweU9uKGNoaWxkcmVuWzBdLCBcIm9uUmVmcmVzaFwiKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZWZyZXNoU3B5Lm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICByZWZyZXNoU3B5Lm1vY2tSZXN0b3JlKCk7XG4gICAgICBjb25zdCByZXMgPSBvcmlnZW5SZWZyZXNoLmFwcGx5KGNoaWxkcmVuWzBdLCBhcmd1bWVudHMpO1xuICAgICAgcmVzb2x2ZShjaGlsZHJlbik7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlci4gVGhpcyBjb250cm9sbGVyIGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIHVzaW5nIHRoZSBub3JtYWwgU0RDIGxpZmUgY3ljbGUuXG4gKlxuICogQHBhcmFtIHRhZ19uYW1le3N0cmluZ30gQ29udHJvbGxlciB0YWcgbmFtZSAoc25ha2UtY2FzZSlcbiAqIEBwYXJhbSBpbml0X2FyZ3VtZW50c3tvYmplY3R9IG9iamVjdDogTW9ja2VkcyB0aGUgdGFnIGRhdGEgYXJndW1lbnRzLlxuICogQHBhcmFtIG9yaWdlbl9odG1se3N0cmluZ30gSFRNTDogTW9ja2VkIGNvbnRlbnQgb2YgdGhlIGNvbnRlbnQgaW4geW91ciB0YXJnZXQgSFRNTCBjb250YWluZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7QWJzdHJhY3RTREN9Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldF9jb250cm9sbGVyKFxuICB0YWdfbmFtZSxcbiAgaW5pdF9hcmd1bWVudHMgPSB7fSxcbiAgb3JpZ2VuX2h0bWwgPSBcIlwiLFxuKSB7XG4gIHNldERlZmF1bHRzKCk7XG4gIGNvbnN0ICRib2R5ID0gJChcImJvZHlcIik7XG4gIGFwcC51cGRhdGVKcXVlcnkoKTtcblxuICAkYm9keS5zYWZlRW1wdHkoKTtcblxuICBjb25zdCAkY29udHJvbGxlciA9ICQoYDwke3RhZ19uYW1lfT4ke29yaWdlbl9odG1sfTwvJHt0YWdfbmFtZX0+YCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRfYXJndW1lbnRzKSkge1xuICAgICRjb250cm9sbGVyLmRhdGEoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgJGRpdkNvbnRhaW5lciA9ICQoXCI8ZGl2PjwvZGl2PlwiKS5hcHBlbmQoJGNvbnRyb2xsZXIpXG5cbiAgJGJvZHkuYXBwZW5kKCRkaXZDb250YWluZXIpO1xuICBhcHAuX2lzSW5pdCA9IGZhbHNlO1xuICBhcHAuY2xlYW5DYWNoZSgpO1xuICBhd2FpdCBhcHAuaW5pdF9zZGMoKTtcbiAgY29uc3QgY29udHJvbGxlciA9IGFwcC5nZXRDb250cm9sbGVyKCRjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci5uYXZDb250cm9sbGVyUGF0aCA9IFt0YWdfbmFtZV1cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_test_utils.js\n\n}");
118
128
 
119
129
  /***/ },
120
130
 
@@ -124,7 +134,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
124
134
  \*******************************************/
125
135
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
126
136
 
127
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr.slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\")).match(arg_names_reg);\n if (!result) {\n return [];\n }\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, number => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);\n return str;\n}\nfunction tagNameToReadableName(str) {\n str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);\n return str;\n}\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(targetClass.prototype).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype).concat(Object.getOwnPropertySymbols(source.prototype)).forEach(prop => {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(targetClass.prototype, prop, Object.getOwnPropertyDescriptor(source.prototype, prop));\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach(mixin => {\n let newMixin;\n Object.assign(this, newMixin = new mixin());\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n static get name() {\n return baseClass.name;\n }\n static className() {\n return this.name;\n }\n get mixins() {\n return this._mixins;\n }\n }\n }[baseClass.name];\n copyProps(base, baseClass);\n mixins.forEach(mixin => {\n copyProps(base, mixin);\n });\n return base;\n}\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url,\n //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\"progress\", progressHandlingFunction, false); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }\n });\n}\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round(e.loaded / e.total * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n percentVal += \"%\";\n $progressContainer.find(\".progress-bar\").css({\n width: percentVal\n }).text(percentVal);\n }\n}\nfunction checkIfParamNumberBoolOrString(paramElement, controller = null) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n return paramElement;\n}\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\nfunction clearErrorsInForm($form) {\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").remove();\n $form.find(\".non-field-errors\").remove();\n}\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form.find(\"input[type=file]\").parent().each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n let hasNoError = $resForm.find(\".non-field-errors\").insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField.find(\".form-input-container\").append($resErrorField.find(\".alert-danger\"));\n });\n return hasNoError;\n}\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nfunction getValueFromField(formItem) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n if (type === \"file\") {\n return formItem.files[0];\n }\n return $(formItem).val();\n }\n return null;\n}\nfunction setValueInField(formItem, value) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"checkbox\") {\n formItem.checked = !!value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(',')}]`);\n } else {\n if (value === null) {\n value = \"\";\n }\n $(formItem).val(value);\n }\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzNCLElBQUkzRyxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLEVBQUU7SUFFdkIsSUFBSTRCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDdkIrRSxRQUFRLENBQUNFLE9BQU8sR0FBRyxDQUFDLENBQUNMLEtBQUs7SUFDNUIsQ0FBQyxNQUFNLElBQUk1RSxJQUFJLEtBQUssTUFBTSxFQUFFO01BQzFCLElBQUk0RSxLQUFLLFlBQVlRLElBQUksRUFBRTtRQUN6QixJQUFJLE9BQU9DLFlBQVksS0FBSyxXQUFXLEVBQUU7VUFDdkMsSUFBSUMsU0FBUyxHQUFHLElBQUlELFlBQVksQ0FBQyxDQUFDO1VBQ2xDQyxTQUFTLENBQUNDLEtBQUssQ0FBQ0MsR0FBRyxDQUFDWixLQUFLLENBQUM7VUFDMUJHLFFBQVEsQ0FBQ0csS0FBSyxHQUFHSSxTQUFTO1FBQzVCO01BQ0Y7SUFDRixDQUFDLE1BQU0sSUFBSVYsS0FBSyxZQUFZN0ksK0NBQVEsRUFBRTtNQUNwQ00sQ0FBQyxDQUFDMEksUUFBUSxDQUFDLENBQUNDLEdBQUcsQ0FBQ0osS0FBSyxDQUFDYSxFQUFFLENBQUM7SUFDM0IsQ0FBQyxNQUFNLElBQUliLEtBQUssWUFBWTVJLGtEQUFXLEVBQUU7TUFDdkNLLENBQUMsQ0FBQzBJLFFBQVEsQ0FBQyxDQUFDQyxHQUFHLENBQUMsSUFBSUosS0FBSyxDQUFDYyxNQUFNLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLE1BQU07TUFDTCxJQUFJZixLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ2xCQSxLQUFLLEdBQUcsRUFBRTtNQUNaO01BQ0F2SSxDQUFDLENBQUMwSSxRQUFRLENBQUMsQ0FBQ0MsR0FBRyxDQUFDSixLQUFLLENBQUM7SUFDeEI7RUFDRjtFQUNBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY191dGlscy5qcz9kMGUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2RjTW9kZWwsIFNkY1F1ZXJ5U2V0fSBmcm9tIFwiLi4vaW5kZXguanNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIEhUTUwgYm9keS5cbiAqIEB0eXBlIHsqfGpRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmxldCBfJGJvZHk7XG5jb25zdCBhcmdfbmFtZXNfcmVnID0gLyg/PD1efCxcXHM/KVtePVxccyxdKy9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvZ207XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gIGlmICghXyRib2R5KSB7XG4gICAgXyRib2R5ID0gJChcImJvZHlcIik7XG4gIH1cblxuICByZXR1cm4gXyRib2R5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCBcIlwiKTtcbiAgdmFyIHJlc3VsdCA9IGZuc3RyXG4gICAgLnNsaWNlKGZuc3RyLmluZGV4T2YoXCIoXCIpICsgMSwgZm5zdHIuaW5kZXhPZihcIilcIikpXG4gICAgLm1hdGNoKGFyZ19uYW1lc19yZWcpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvVGFnTmFtZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGAtJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCAobnVtYmVyKSA9PiBgLSR7bnVtYmVyfWApO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC8tLi9nLCAobGV0dGVyKSA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAucmVwbGFjZSgvXi4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHNvdXJjZUNsYXNzO1xuICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICApLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldENsYXNzLnByb3RvdHlwZSkpO1xuICB3aGlsZSAoc291cmNlLm5hbWUgIT09IFwiXCIpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UucHJvdG90eXBlKVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZS5wcm90b3R5cGUpKVxuICAgICAgLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AubWF0Y2goXG4gICAgICAgICAgICAvXig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZXxhcmd1bWVudHN8Y2FsbGVyfG5hbWV8YmluZHxjYWxsfGFwcGx5fHRvU3RyaW5nfGxlbmd0aCkkLyxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvcE5hbWVzVGFyZ2V0LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgc291cmNlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG4gIGxldCBiYXNlID0ge1xuICAgIFtiYXNlQ2xhc3MubmFtZV06IGNsYXNzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKSB7XG4gICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIChuZXdNaXhpbiA9IG5ldyBtaXhpbigpKSk7XG4gICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgIF9taXhpbnNbbWl4aW4ubmFtZV0gPSBuZXdNaXhpbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICB0aGlzLl9taXhpbnMgPSBfbWl4aW5zO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgIH1cbiAgICB9LFxuICB9W2Jhc2VDbGFzcy5uYW1lXTtcblxuICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICB9KTtcblxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgcmV0dXJuIC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICByZXR1cm4gJC5hamF4KHtcbiAgICB1cmw6IHVybCwgLy9TZXJ2ZXIgc2NyaXB0IHRvIHByb2Nlc3MgZGF0YVxuICAgIHR5cGU6IG1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICB4aHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEN1c3RvbSBYTUxIdHRwUmVxdWVzdFxuICAgICAgdmFyIG15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAobXlYaHIudXBsb2FkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHVwbG9hZCBwcm9wZXJ0eSBleGlzdHNcbiAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTsgLy8gRm9yIGhhbmRsaW5nIHRoZSBwcm9ncmVzcyBvZiB0aGUgdXBsb2FkXG4gICAgICB9XG4gICAgICByZXR1cm4gbXlYaHI7XG4gICAgfSxcbiAgICAvL0Zvcm0gZGF0YVxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICBjYWNoZTogZmFsc2UsXG4gICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uKGUpIHtcbiAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgIHZhciBwZXJjZW50VmFsID0gTWF0aC5yb3VuZCgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCk7XG4gICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpO1xuICAgIGlmIChwZXJjZW50VmFsID09PSAxMDApIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcGVyY2VudFZhbCArPSBcIiVcIjtcblxuICAgICRwcm9ncmVzc0NvbnRhaW5lclxuICAgICAgLmZpbmQoXCIucHJvZ3Jlc3MtYmFyXCIpXG4gICAgICAuY3NzKHt3aWR0aDogcGVyY2VudFZhbH0pXG4gICAgICAudGV4dChwZXJjZW50VmFsKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nKFxuICBwYXJhbUVsZW1lbnQsXG4gIGNvbnRyb2xsZXIgPSBudWxsLFxuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1FbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbiAgfVxuXG4gIGlmIChjb250cm9sbGVyICYmIHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdLmJpbmQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF07XG4gIH1cblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudCA9PT0gXCJ0cnVlXCI7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHBhcmFtRWxlbWVudCk7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocGFyYW1FbGVtZW50KTtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudC5zdWJzdHIoMSwgcGFyYW1FbGVtZW50Lmxlbmd0aCAtIDIpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuIChbMWU3XSArIC0xZTMgKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCAoYykgPT5cbiAgICAoXG4gICAgICBjIF5cbiAgICAgIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmICgxNSA+PiAoYyAvIDQpKSlcbiAgICApLnRvU3RyaW5nKDE2KSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKSB7XG4gICRmb3JtXG4gICAgLmZpbmQoXCIuaGFzLWVycm9yXCIpXG4gICAgLnJlbW92ZUNsYXNzKFwiaGFzLWVycm9yXCIpXG4gICAgLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpXG4gICAgLnJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikucmVtb3ZlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcnJvcnNJbkZvcm0oJGZvcm0sICRyZXNGb3JtKSB7XG4gICRyZXNGb3JtID0gJChcIjxkaXY+XCIpLmFwcGVuZCgkcmVzRm9ybSk7XG5cbiAgJGZvcm1cbiAgICAuZmluZChcIi5oYXMtZXJyb3JcIilcbiAgICAucmVtb3ZlQ2xhc3MoXCJoYXMtZXJyb3JcIilcbiAgICAuZmluZChcIi5hbGVydC1kYW5nZXJcIilcbiAgICAuc2FmZVJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikuc2FmZVJlbW92ZSgpO1xuICBsZXQgJGZpbGVfY29udGFpbmVyID0gJHJlc0Zvcm0uZmluZChcImlucHV0W3R5cGU9ZmlsZV1cIikucGFyZW50KCk7XG4gICRmb3JtXG4gICAgLmZpbmQoXCJpbnB1dFt0eXBlPWZpbGVdXCIpXG4gICAgLnBhcmVudCgpXG4gICAgLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKCRmaWxlX2NvbnRhaW5lcltpbmRleF0pO1xuICAgIH0pO1xuXG4gIGxldCBoYXNOb0Vycm9yID1cbiAgICAkcmVzRm9ybVxuICAgICAgLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKVxuICAgICAgLmluc2VydEFmdGVyKCRmb3JtLmZpbmQoXCIuaGlkZGVuLWZvcm0tZmllbGRzXCIpKS5sZW5ndGggPT09IDA7XG4gICRyZXNGb3JtLmZpbmQoXCIuaGFzLWVycm9yXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGhhc05vRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgJHJlc0Vycm9yRmllbGQgPSAkKHRoaXMpO1xuICAgIGxldCBjbGFzc05hbWUgPSAkcmVzRXJyb3JGaWVsZC5kYXRhKFwiYXV0by1pZFwiKTtcbiAgICBsZXQgJGVycm9yRmllbGQgPSAkZm9ybS5maW5kKFwiLmZvcm0tZ3JvdXAuXCIgKyBjbGFzc05hbWUpO1xuICAgICRlcnJvckZpZWxkLmFkZENsYXNzKFwiaGFzLWVycm9yXCIpO1xuICAgICRlcnJvckZpZWxkXG4gICAgICAuZmluZChcIi5mb3JtLWlucHV0LWNvbnRhaW5lclwiKVxuICAgICAgLmFwcGVuZCgkcmVzRXJyb3JGaWVsZC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKSk7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNOb0Vycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganF1ZXJ5SW5zZXJ0QXQoJGNvbnRhaW5lciwgaW5kZXgsICRuZXdFbGVtZW50KSB7XG4gIGxldCBsYXN0SW5kZXggPSAkY29udGFpbmVyLmNoaWxkcmVuKCkuc2l6ZSgpO1xuICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAkY29udGFpbmVyLmNoaWxkcmVuKCkuZXEoaW5kZXgpLmJlZm9yZSgkbmV3RWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgJGNvbnRhaW5lci5hcHBlbmQoJG5ld0VsZW1lbnQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFBhcnNlIGhpZGRlbiBpbnB1dCB2YWx1ZXMgYmFjayBpbnRvIHRoZSBjbG9zZXN0IEphdmFTY3JpcHQgcHJpbWl0aXZlLlxuICpcbiAqIEhpZGRlbiBpbnB1dHMgYXJlIG9mdGVuIHVzZWQgdG8gcHJlc2VydmUgdmFsdWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGJvb2xlYW5zLFxuICogbnVtYmVycyBvciBxdW90ZWQgc3RyaW5ncy4gVGhpcyBrZWVwcyBmb3JtLXRvLW1vZGVsIHN5bmMgZnJvbSB0dXJuaW5nXG4gKiBldmVyeXRoaW5nIGludG8gcGxhaW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBwYXJzZUhpZGRlbklucHV0cyh2YWx1ZSkge1xuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSB7XG4gIGxldCB7dHlwZSwgbmFtZX0gPSBmb3JtSXRlbTtcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIikge1xuICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiKSB7XG4gICAgICByZXR1cm4gcGFyc2VIaWRkZW5JbnB1dHMoJChmb3JtSXRlbSkudmFsKCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5jaGVja2VkO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgcmV0dXJuIGZvcm1JdGVtLmZpbGVzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAkKGZvcm1JdGVtKS52YWwoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCB2YWx1ZSkge1xuICBsZXQge3R5cGUsIG5hbWV9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIGZvcm1JdGVtLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBEYXRhVHJhbnNmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBsZXQgY29udGFpbmVyID0gbmV3IERhdGFUcmFuc2ZlcigpO1xuICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQodmFsdWUpO1xuICAgICAgICAgIGZvcm1JdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwodmFsdWUuaWQpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkge1xuICAgICAgJChmb3JtSXRlbSkudmFsKGBbJHt2YWx1ZS5nZXRJZHMoKS5qb2luKCcsJyl9XWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgJChmb3JtSXRlbSkudmFsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOlsiU2RjTW9kZWwiLCJTZGNRdWVyeVNldCIsIl8kYm9keSIsImFyZ19uYW1lc19yZWciLCJjb21tZW5kX3JlZyIsImdldEJvZHkiLCIkIiwiZ2V0UGFyYW1zTmFtZU9mRnVuY3Rpb24iLCJmdW5jIiwiZm5zdHIiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJyZXN1bHQiLCJzbGljZSIsImluZGV4T2YiLCJtYXRjaCIsInByb21pc2VEdW1teUZhY3RvcnkiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbWVsQ2FzZVRvVGFnTmFtZSIsInN0ciIsImxldHRlciIsInRvTG93ZXJDYXNlIiwibnVtYmVyIiwidGFnTmFtZVRvQ2FtZWxDYXNlIiwidG9VcHBlckNhc2UiLCJ0YWdOYW1lVG9SZWFkYWJsZU5hbWUiLCJjb3B5UHJvcHMiLCJ0YXJnZXRDbGFzcyIsInNvdXJjZUNsYXNzIiwic291cmNlIiwicHJvcE5hbWVzVGFyZ2V0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsImNvbmNhdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm5hbWUiLCJmb3JFYWNoIiwicHJvcCIsImluY2x1ZGVzIiwicHVzaCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0UHJvdG90eXBlT2YiLCJhZ2lsZUFnZ3JlZ2F0aW9uIiwiYmFzZUNsYXNzIiwibWl4aW5zIiwiYmFzZSIsImNvbnN0cnVjdG9yIiwiX2FyZ3MiLCJfbWl4aW5zIiwibWl4aW4iLCJuZXdNaXhpbiIsImFzc2lnbiIsIl90YWdOYW1lIiwiX2lzTWl4aW4iLCJjbGFzc05hbWUiLCJjc3JmU2FmZU1ldGhvZCIsIm1ldGhvZCIsInRlc3QiLCJ1cGxvYWRGaWxlRm9ybURhdGEiLCJmb3JtRGF0YSIsInVybCIsImFqYXgiLCJ0eXBlIiwieGhyIiwibXlYaHIiLCJhamF4U2V0dGluZ3MiLCJ1cGxvYWQiLCJhZGRFdmVudExpc3RlbmVyIiwicHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uIiwiZGF0YSIsImNhY2hlIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsImJlZm9yZVNlbmQiLCJzZXR0aW5ncyIsImNyb3NzRG9tYWluIiwic2V0UmVxdWVzdEhlYWRlciIsIndpbmRvdyIsIkNTUkZfVE9LRU4iLCJlIiwibGVuZ3RoQ29tcHV0YWJsZSIsInBlcmNlbnRWYWwiLCJNYXRoIiwicm91bmQiLCJsb2FkZWQiLCJ0b3RhbCIsIiRwcm9ncmVzc0NvbnRhaW5lciIsImhpZGUiLCJzaG93IiwiZmluZCIsImNzcyIsIndpZHRoIiwidGV4dCIsImNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyIsInBhcmFtRWxlbWVudCIsImNvbnRyb2xsZXIiLCJiaW5kIiwiaXNGbG9hdFJlZyIsImlzSW50UmVnIiwiaXNCb29sUmVnIiwiaXNTdHJpbmdSZWciLCJ1bmRlZmluZWQiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzdWJzdHIiLCJsZW5ndGgiLCJ1dWlkdjQiLCJjIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiVWludDhBcnJheSIsImNsZWFyRXJyb3JzSW5Gb3JtIiwiJGZvcm0iLCJyZW1vdmVDbGFzcyIsInJlbW92ZSIsInNldEVycm9yc0luRm9ybSIsIiRyZXNGb3JtIiwiYXBwZW5kIiwic2FmZVJlbW92ZSIsIiRmaWxlX2NvbnRhaW5lciIsInBhcmVudCIsImVhY2giLCJpbmRleCIsInJlcGxhY2VXaXRoIiwiaGFzTm9FcnJvciIsImluc2VydEFmdGVyIiwiJHJlc0Vycm9yRmllbGQiLCIkZXJyb3JGaWVsZCIsImFkZENsYXNzIiwianF1ZXJ5SW5zZXJ0QXQiLCIkY29udGFpbmVyIiwiJG5ld0VsZW1lbnQiLCJsYXN0SW5kZXgiLCJjaGlsZHJlbiIsInNpemUiLCJlcSIsImJlZm9yZSIsInBhcnNlSGlkZGVuSW5wdXRzIiwidmFsdWUiLCJzdWJzdHJpbmciLCJnZXRWYWx1ZUZyb21GaWVsZCIsImZvcm1JdGVtIiwidmFsIiwiY2hlY2tlZCIsImZpbGVzIiwic2V0VmFsdWVJbkZpZWxkIiwiRmlsZSIsIkRhdGFUcmFuc2ZlciIsImNvbnRhaW5lciIsIml0ZW1zIiwiYWRkIiwiaWQiLCJnZXRJZHMiLCJqb2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
137
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ formatDate: () => (/* binding */ formatDate),\n/* harmony export */ formatDateTimeLocal: () => (/* binding */ formatDateTimeLocal),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ toDate: () => (/* binding */ toDate),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr\n .slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\"))\n .match(arg_names_reg);\n if (!result) {\n return [];\n }\n\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\n\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, (number) => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\n\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, (letter) => `${letter[1].toUpperCase()}`);\n return str;\n}\n\nfunction tagNameToReadableName(str) {\n str = str\n .replace(/-./g, (letter) => ` ${letter[1].toUpperCase()}`)\n .replace(/^./g, (letter) => `${letter.toUpperCase()}`);\n return str;\n}\n\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(\n targetClass.prototype,\n ).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype)\n .concat(Object.getOwnPropertySymbols(source.prototype))\n .forEach((prop) => {\n if (\n prop.match(\n /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/,\n )\n ) {\n return;\n }\n\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(\n targetClass.prototype,\n prop,\n Object.getOwnPropertyDescriptor(source.prototype, prop),\n );\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach((mixin) => {\n let newMixin;\n Object.assign(this, (newMixin = new mixin()));\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n\n static get name() {\n return baseClass.name;\n }\n\n static className() {\n return this.name;\n }\n\n get mixins() {\n return this._mixins;\n }\n },\n }[baseClass.name];\n\n copyProps(base, baseClass);\n\n mixins.forEach((mixin) => {\n copyProps(base, mixin);\n });\n\n return base;\n}\n\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\n\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url, //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\n \"progress\",\n progressHandlingFunction,\n false,\n ); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n },\n });\n}\n\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round((e.loaded / e.total) * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n\n percentVal += \"%\";\n\n $progressContainer\n .find(\".progress-bar\")\n .css({ width: percentVal })\n .text(percentVal);\n }\n}\n\nfunction checkIfParamNumberBoolOrString(\n paramElement,\n controller = null,\n) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n\n return paramElement;\n}\n\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16),\n );\n}\n\nfunction clearErrorsInForm($form) {\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .remove();\n $form.find(\".non-field-errors\").remove();\n}\n\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form\n .find(\"input[type=file]\")\n .parent()\n .each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n\n let hasNoError =\n $resForm\n .find(\".non-field-errors\")\n .insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField\n .find(\".form-input-container\")\n .append($resErrorField.find(\".alert-danger\"));\n });\n\n return hasNoError;\n}\n\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\n\nfunction getValueFromField(formItem) {\n let { type, name } = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n\n if (type === \"file\") {\n return formItem.files[0];\n }\n\n return $(formItem).val();\n }\n return null;\n}\n\nconst pad2 = (n) => String(n).padStart(2, \"0\");\n\n/**\n * Convert a Date, a date string or a timestamp into a valid Date.\n * A date-only string (\"YYYY-MM-DD\") is read as local midnight, not UTC,\n * so the day does not shift in time zones west of UTC.\n *\n * @param {*} value\n * @returns {?Date} null if the value is empty or not a valid date\n */\nfunction toDate(value) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n let date;\n if (value instanceof Date) {\n date = value;\n } else if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [y, m, d] = value.split(\"-\").map(Number);\n date = new Date(y, m - 1, d);\n } else {\n date = new Date(value);\n }\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * @param {*} value\n * @returns {string} \"YYYY-MM-DD\" in local time, or \"\" if not a valid date\n */\nfunction formatDate(value) {\n const date = toDate(value);\n if (!date) {\n return \"\";\n }\n return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;\n}\n\n/**\n * @param {*} value\n * @returns {string} \"YYYY-MM-DDTHH:MM\" in local time, or \"\" if not a valid date\n */\nfunction formatDateTimeLocal(value) {\n const date = toDate(value);\n if (!date) {\n return \"\";\n }\n return `${formatDate(date)}T${pad2(date.getHours())}:${pad2(date.getMinutes())}`;\n}\n\nfunction setValueInField(formItem, value) {\n let { type, name } = formItem;\n if (name && name !== \"\") {\n if (type === \"datetime-local\") {\n formItem.value = formatDateTimeLocal(value);\n } else if (type === \"date\") {\n formItem.value = formatDate(value);\n } else if (type === \"checkbox\") {\n formItem.checked = !!value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(\",\")}]`);\n } else {\n if (value === null) {\n value = \"\";\n }\n $(formItem).val(value);\n }\n }\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dXRpbHMuanM/YmYyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZGNNb2RlbCwgU2RjUXVlcnlTZXQgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIEhUTUwgYm9keS5cbiAqIEB0eXBlIHsqfGpRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmxldCBfJGJvZHk7XG5jb25zdCBhcmdfbmFtZXNfcmVnID0gLyg/PD1efCxcXHM/KVtePVxccyxdKy9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvZ207XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gIGlmICghXyRib2R5KSB7XG4gICAgXyRib2R5ID0gJChcImJvZHlcIik7XG4gIH1cblxuICByZXR1cm4gXyRib2R5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCBcIlwiKTtcbiAgdmFyIHJlc3VsdCA9IGZuc3RyXG4gICAgLnNsaWNlKGZuc3RyLmluZGV4T2YoXCIoXCIpICsgMSwgZm5zdHIuaW5kZXhPZihcIilcIikpXG4gICAgLm1hdGNoKGFyZ19uYW1lc19yZWcpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvVGFnTmFtZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGAtJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCAobnVtYmVyKSA9PiBgLSR7bnVtYmVyfWApO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC8tLi9nLCAobGV0dGVyKSA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAucmVwbGFjZSgvXi4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHNvdXJjZUNsYXNzO1xuICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICApLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldENsYXNzLnByb3RvdHlwZSkpO1xuICB3aGlsZSAoc291cmNlLm5hbWUgIT09IFwiXCIpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UucHJvdG90eXBlKVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZS5wcm90b3R5cGUpKVxuICAgICAgLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AubWF0Y2goXG4gICAgICAgICAgICAvXig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZXxhcmd1bWVudHN8Y2FsbGVyfG5hbWV8YmluZHxjYWxsfGFwcGx5fHRvU3RyaW5nfGxlbmd0aCkkLyxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvcE5hbWVzVGFyZ2V0LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgc291cmNlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG4gIGxldCBiYXNlID0ge1xuICAgIFtiYXNlQ2xhc3MubmFtZV06IGNsYXNzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKSB7XG4gICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIChuZXdNaXhpbiA9IG5ldyBtaXhpbigpKSk7XG4gICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgIF9taXhpbnNbbWl4aW4ubmFtZV0gPSBuZXdNaXhpbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICB0aGlzLl9taXhpbnMgPSBfbWl4aW5zO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgIH1cbiAgICB9LFxuICB9W2Jhc2VDbGFzcy5uYW1lXTtcblxuICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICB9KTtcblxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgcmV0dXJuIC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICByZXR1cm4gJC5hamF4KHtcbiAgICB1cmw6IHVybCwgLy9TZXJ2ZXIgc2NyaXB0IHRvIHByb2Nlc3MgZGF0YVxuICAgIHR5cGU6IG1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICB4aHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEN1c3RvbSBYTUxIdHRwUmVxdWVzdFxuICAgICAgdmFyIG15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAobXlYaHIudXBsb2FkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHVwbG9hZCBwcm9wZXJ0eSBleGlzdHNcbiAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTsgLy8gRm9yIGhhbmRsaW5nIHRoZSBwcm9ncmVzcyBvZiB0aGUgdXBsb2FkXG4gICAgICB9XG4gICAgICByZXR1cm4gbXlYaHI7XG4gICAgfSxcbiAgICAvL0Zvcm0gZGF0YVxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICBjYWNoZTogZmFsc2UsXG4gICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uKGUpIHtcbiAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgIHZhciBwZXJjZW50VmFsID0gTWF0aC5yb3VuZCgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCk7XG4gICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpO1xuICAgIGlmIChwZXJjZW50VmFsID09PSAxMDApIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcGVyY2VudFZhbCArPSBcIiVcIjtcblxuICAgICRwcm9ncmVzc0NvbnRhaW5lclxuICAgICAgLmZpbmQoXCIucHJvZ3Jlc3MtYmFyXCIpXG4gICAgICAuY3NzKHsgd2lkdGg6IHBlcmNlbnRWYWwgfSlcbiAgICAgIC50ZXh0KHBlcmNlbnRWYWwpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcoXG4gIHBhcmFtRWxlbWVudCxcbiAgY29udHJvbGxlciA9IG51bGwsXG4pIHtcbiAgaWYgKHR5cGVvZiBwYXJhbUVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50O1xuICB9XG5cbiAgaWYgKGNvbnRyb2xsZXIgJiYgdHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmICh0eXBlb2YgY29udHJvbGxlcltwYXJhbUVsZW1lbnRdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0uYmluZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XTtcbiAgfVxuXG4gIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICBsZXQgaXNCb29sUmVnID0gL14odHJ1ZXxmYWxzZSkkLztcbiAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuICBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50ID09PSBcInRydWVcIjtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC50b0xvd2VyQ2FzZSgpID09PSBcIm5vbmVcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0ludFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQocGFyYW1FbGVtZW50KTtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChwYXJhbUVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50LnN1YnN0cigxLCBwYXJhbUVsZW1lbnQubGVuZ3RoIC0gMik7XG4gIH1cblxuICByZXR1cm4gcGFyYW1FbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0KCkge1xuICByZXR1cm4gKFsxZTddICsgLTFlMyArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIChjKSA9PlxuICAgIChcbiAgICAgIGMgXlxuICAgICAgKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgKDE1ID4+IChjIC8gNCkpKVxuICAgICkudG9TdHJpbmcoMTYpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJFcnJvcnNJbkZvcm0oJGZvcm0pIHtcbiAgJGZvcm1cbiAgICAuZmluZChcIi5oYXMtZXJyb3JcIilcbiAgICAucmVtb3ZlQ2xhc3MoXCJoYXMtZXJyb3JcIilcbiAgICAuZmluZChcIi5hbGVydC1kYW5nZXJcIilcbiAgICAucmVtb3ZlKCk7XG4gICRmb3JtLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKS5yZW1vdmUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEVycm9yc0luRm9ybSgkZm9ybSwgJHJlc0Zvcm0pIHtcbiAgJHJlc0Zvcm0gPSAkKFwiPGRpdj5cIikuYXBwZW5kKCRyZXNGb3JtKTtcblxuICAkZm9ybVxuICAgIC5maW5kKFwiLmhhcy1lcnJvclwiKVxuICAgIC5yZW1vdmVDbGFzcyhcImhhcy1lcnJvclwiKVxuICAgIC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKVxuICAgIC5zYWZlUmVtb3ZlKCk7XG4gICRmb3JtLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKS5zYWZlUmVtb3ZlKCk7XG4gIGxldCAkZmlsZV9jb250YWluZXIgPSAkcmVzRm9ybS5maW5kKFwiaW5wdXRbdHlwZT1maWxlXVwiKS5wYXJlbnQoKTtcbiAgJGZvcm1cbiAgICAuZmluZChcImlucHV0W3R5cGU9ZmlsZV1cIilcbiAgICAucGFyZW50KClcbiAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJGZpbGVfY29udGFpbmVyW2luZGV4XSk7XG4gICAgfSk7XG5cbiAgbGV0IGhhc05vRXJyb3IgPVxuICAgICRyZXNGb3JtXG4gICAgICAuZmluZChcIi5ub24tZmllbGQtZXJyb3JzXCIpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoJGZvcm0uZmluZChcIi5oaWRkZW4tZm9ybS1maWVsZHNcIikpLmxlbmd0aCA9PT0gMDtcbiAgJHJlc0Zvcm0uZmluZChcIi5oYXMtZXJyb3JcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgaGFzTm9FcnJvciA9IGZhbHNlO1xuICAgIGxldCAkcmVzRXJyb3JGaWVsZCA9ICQodGhpcyk7XG4gICAgbGV0IGNsYXNzTmFtZSA9ICRyZXNFcnJvckZpZWxkLmRhdGEoXCJhdXRvLWlkXCIpO1xuICAgIGxldCAkZXJyb3JGaWVsZCA9ICRmb3JtLmZpbmQoXCIuZm9ybS1ncm91cC5cIiArIGNsYXNzTmFtZSk7XG4gICAgJGVycm9yRmllbGQuYWRkQ2xhc3MoXCJoYXMtZXJyb3JcIik7XG4gICAgJGVycm9yRmllbGRcbiAgICAgIC5maW5kKFwiLmZvcm0taW5wdXQtY29udGFpbmVyXCIpXG4gICAgICAuYXBwZW5kKCRyZXNFcnJvckZpZWxkLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc05vRXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqcXVlcnlJbnNlcnRBdCgkY29udGFpbmVyLCBpbmRleCwgJG5ld0VsZW1lbnQpIHtcbiAgbGV0IGxhc3RJbmRleCA9ICRjb250YWluZXIuY2hpbGRyZW4oKS5zaXplKCk7XG4gIGlmIChpbmRleCA8IGxhc3RJbmRleCkge1xuICAgICRjb250YWluZXIuY2hpbGRyZW4oKS5lcShpbmRleCkuYmVmb3JlKCRuZXdFbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICAkY29udGFpbmVyLmFwcGVuZCgkbmV3RWxlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogUGFyc2UgaGlkZGVuIGlucHV0IHZhbHVlcyBiYWNrIGludG8gdGhlIGNsb3Nlc3QgSmF2YVNjcmlwdCBwcmltaXRpdmUuXG4gKlxuICogSGlkZGVuIGlucHV0cyBhcmUgb2Z0ZW4gdXNlZCB0byBwcmVzZXJ2ZSB2YWx1ZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgYm9vbGVhbnMsXG4gKiBudW1iZXJzIG9yIHF1b3RlZCBzdHJpbmdzLiBUaGlzIGtlZXBzIGZvcm0tdG8tbW9kZWwgc3luYyBmcm9tIHR1cm5pbmdcbiAqIGV2ZXJ5dGhpbmcgaW50byBwbGFpbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGlkZGVuSW5wdXRzKHZhbHVlKSB7XG4gIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICBsZXQgaXNCb29sUmVnID0gL14odHJ1ZXxmYWxzZSkkLztcbiAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcIm5vbmVcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tRmllbGQoZm9ybUl0ZW0pIHtcbiAgbGV0IHsgdHlwZSwgbmFtZSB9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlSGlkZGVuSW5wdXRzKCQoZm9ybUl0ZW0pLnZhbCgpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW0uY2hlY2tlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5maWxlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJChmb3JtSXRlbSkudmFsKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHBhZDIgPSAobikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgRGF0ZSwgYSBkYXRlIHN0cmluZyBvciBhIHRpbWVzdGFtcCBpbnRvIGEgdmFsaWQgRGF0ZS5cbiAqIEEgZGF0ZS1vbmx5IHN0cmluZyAoXCJZWVlZLU1NLUREXCIpIGlzIHJlYWQgYXMgbG9jYWwgbWlkbmlnaHQsIG5vdCBVVEMsXG4gKiBzbyB0aGUgZGF5IGRvZXMgbm90IHNoaWZ0IGluIHRpbWUgem9uZXMgd2VzdCBvZiBVVEMuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgez9EYXRlfSBudWxsIGlmIHRoZSB2YWx1ZSBpcyBlbXB0eSBvciBub3QgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgZGF0ZTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGRhdGUgPSB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodmFsdWUpKSB7XG4gICAgY29uc3QgW3ksIG0sIGRdID0gdmFsdWUuc3BsaXQoXCItXCIpLm1hcChOdW1iZXIpO1xuICAgIGRhdGUgPSBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ30gXCJZWVlZLU1NLUREXCIgaW4gbG9jYWwgdGltZSwgb3IgXCJcIiBpZiBub3QgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlKSB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUpO1xuICBpZiAoIWRhdGUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZDIoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkMihkYXRlLmdldERhdGUoKSl9YDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBcIllZWVktTU0tRERUSEg6TU1cIiBpbiBsb2NhbCB0aW1lLCBvciBcIlwiIGlmIG5vdCBhIHZhbGlkIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lTG9jYWwodmFsdWUpIHtcbiAgY29uc3QgZGF0ZSA9IHRvRGF0ZSh2YWx1ZSk7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHJldHVybiBgJHtmb3JtYXREYXRlKGRhdGUpfVQke3BhZDIoZGF0ZS5nZXRIb3VycygpKX06JHtwYWQyKGRhdGUuZ2V0TWludXRlcygpKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCB2YWx1ZSkge1xuICBsZXQgeyB0eXBlLCBuYW1lIH0gPSBmb3JtSXRlbTtcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIikge1xuICAgIGlmICh0eXBlID09PSBcImRhdGV0aW1lLWxvY2FsXCIpIHtcbiAgICAgIGZvcm1JdGVtLnZhbHVlID0gZm9ybWF0RGF0ZVRpbWVMb2NhbCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRhdGVcIikge1xuICAgICAgZm9ybUl0ZW0udmFsdWUgPSBmb3JtYXREYXRlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgZm9ybUl0ZW0uY2hlY2tlZCA9ICEhdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBpZiAodHlwZW9mIERhdGFUcmFuc2ZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgY29udGFpbmVyLml0ZW1zLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgZm9ybUl0ZW0uZmlsZXMgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwoYFske3ZhbHVlLmdldElkcygpLmpvaW4oXCIsXCIpfV1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
128
138
 
129
139
  /***/ },
130
140
 
@@ -134,24 +144,24 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
134
144
  \******************************************/
135
145
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
136
146
 
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}");
147
+ 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 = {};\n\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\n\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(\n `_bind_to_update_handler sdc_uuid_${parentController._uuid}`,\n );\n } else {\n emptyList = emptyList.concat(\n findSdcTgs($element, tagNameList, parentController),\n );\n }\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 (Object.hasOwn(controller._urlParams, 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\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 { contentUrl, _tagName, contentReload } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n\n return $.get(contentUrl, args)\n .then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n\n return data;\n })\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 if (!contentReload) {\n controller.autoRedirect = data[\"url-link\"];\n }\n return '<p>Redirected</p>';\n }\n controller.autoRedirect = null;\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", { 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(\n $container,\n parentController,\n process = null,\n) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $container,\n parentController,\n process,\n );\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\n let { args, 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\n controller.parsedContentUrl = url;\n\n return { url: url, args };\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 = { args: {} };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(\n 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\n return null;\n },\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\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(\n $element,\n tagName,\n superTagNameList,\n parentController,\n process,\n) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n\n\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\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\n return replaceAllTagElementsInContainer(\n controller.$container,\n controller,\n process,\n );\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(\n tagList,\n $container,\n parentController,\n process,\n) {\n return new Promise((resolve) => {\n let tagDescriptionElements = findSdcTgs(\n $container,\n tagList,\n parentController,\n );\n let tagCount = tagDescriptionElements.length;\n\n if (tagCount === 0) {\n return resolve();\n }\n\n for (\n let elementIndex = 0;\n elementIndex < tagDescriptionElements.length;\n elementIndex++\n ) {\n runReplaceTagElementsInContainer(\n tagDescriptionElements[elementIndex].dom,\n tagDescriptionElements[elementIndex].tag,\n tagDescriptionElements[elementIndex].super,\n parentController,\n process,\n ).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\n\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(\n controller,\n $container ?? controller.$container,\n process,\n );\n}\n\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n\n $dom\n .find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`)\n .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\n .toLowerCase()\n .replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\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(\n Promise.resolve(result).then((x) => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(\n controller,\n $newContent,\n $this.children(),\n process,\n );\n }),\n );\n }\n });\n\n return Promise.all(plist);\n}\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 [\n [\"name\", \"\"],\n [\"type\", \"text\"],\n [\"id\", \"\"],\n ].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}\n\nfunction reconcileTree({ $element, id = [], parent = null }) {\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(\n 0,\n (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1,\n );\n return this.idx;\n },\n op: null,\n parent,\n };\n obj.getIdx.bind(obj);\n return [obj].concat(\n $element\n .contents()\n .toArray()\n .map((x) =>\n reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj,\n }),\n )\n .flat(),\n );\n}\n\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({ $element: $realNode });\n const $new = reconcileTree({ $element: $virtualNode });\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\n op_steps.forEach((op_step, i) => {\n const { op, $element, idx } = op_step;\n\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\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\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const { after, target } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n\n toRemove.forEach(($element) => $element.safeRemove());\n}\n\n/**\n * Replace the event listeners added by sdcDom (JSX on* props) on a kept node\n * with the listeners of its new virtual counterpart.\n */\nfunction syncListeners(real, virtual) {\n if (!real || !virtual || (!real._sdcListeners && !virtual._sdcListeners)) {\n return;\n }\n (real._sdcListeners ?? []).forEach(([type, fn]) => real.removeEventListener(type, fn));\n const listeners = virtual._sdcListeners ?? [];\n listeners.forEach(([type, fn]) => real.addEventListener(type, fn));\n real._sdcListeners = listeners;\n}\n\nfunction syncAttributes($real, $virtual) {\n syncListeners($real[0], $virtual[0]);\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\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\n .filter((x) => x.depth === depth && !x.op)\n .forEach((newNode) => {\n const oldNode = oldNodes.find((tempOldNode) => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = { type: \"keep\", idx: newNode.idx };\n newNode.op = { type: \"keep_counterpart\", counterpart: oldNode };\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\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = { type: \"delete\", idx };\n }\n });\n\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\"\n ? element.parent.op.counterpart\n : element.parent;\n }\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\"\n ? element.op.counterpart\n : element;\n }\n }\n\n return null;\n }\n\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = { type, target, after: x.getBefore() };\n }\n });\n\n const tagged = [...oldNodes, ...newNodes];\n\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n\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\n if (!leafController) {\n return Promise.resolve();\n }\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(\n process,\n leafController,\n );\n\n $dom ??= leafController.$container;\n\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $dom,\n leafController,\n process,\n ).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}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RVA7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLG1DQUFtQyxFQUFFLHlFQUFxQjtBQUNwRTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJLDZDQUFHO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY192aWV3LmpzP2NhMDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29udHJvbGxlckZhY3RvcnksXG4gIHByZXBhcmVSZWZyZXNoUHJvY2VzcyxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtLCBwcmVwYXJlRGF0YSB9IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9IFwiX2NvbnRyb2xsZXJfXCI7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9IFwiX3NkY19jb250cm9sbGVyX1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgaHRtbEZpbGVzID0ge307XG59XG5cbi8qKlxuICogZmluZFNkY1RncyBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gSXQgY29sbGVjdHMgYWxsIHRob3NlXG4gKiBkb21zIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxzbyB0aGUgdGFnIG5hbWUgdGhlIGRvbSBhbmQgdGhlIHRhZ1xuICogbmFtZXMgb2YgdGhlIHN1cGVyIGNvbnRyb2xsZXJcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXJcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTmFtZUxpc3QgLSBhIHN0cmluZyBsaXN0IHdpdGggdGFnIG5hbWVzLlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEByZXR1cm4ge0FycmF5fSAtIGEgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFsbCByZWdpc3RlciB0YWdzIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRTZGNUZ3MoJGNvbnRhaW5lciwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gIGxldCBlbXB0eUxpc3QgPSBbXTtcbiAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICBsZXQgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcChcInRhZ05hbWVcIikudG9Mb3dlckNhc2UoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnTmFtZVswXS5zdGFydHNXaXRoKFwidGhpcy5cIikpIHtcbiAgICAgICRlbGVtZW50LmFkZENsYXNzKFxuICAgICAgICBgX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgc2RjX3V1aWRfJHtwYXJlbnRDb250cm9sbGVyLl91dWlkfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KFxuICAgICAgICBmaW5kU2RjVGdzKCRlbGVtZW50LCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlciksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVtcHR5TGlzdDtcbn1cblxuLyoqXG4gKiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIGZpbGxzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbnRlbnRcbiAqIHVybCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHRhZyBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcGFyYW0gdXJsIC0gdGhlIG9yaWdpbiBjb250ZW50IFVSTFxuICogQHBhcmFtIHVybFZhbHVlcyAtIHZhbHVlcyBmb3IgdGhlIHVybCBwbGFjZWhvbGRlci4gSW4gc2FtZSBvcmRlciEhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHVybFZhbHVlcykge1xuICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKGNvbnRyb2xsZXIuX3VybFBhcmFtcywga2V5X2lkeCkpIHtcbiAgICAgIGxldCBrZXkgPSBjb250cm9sbGVyLl91cmxQYXJhbXNba2V5X2lkeF07XG4gICAgICBsZXQgcmUgPSBSZWdFeHAoXCIlXFxcXChcIiArIGtleSArIFwiXFxcXClcXFxcd1wiLCBcImdtXCIpO1xuICAgICAgY29uc3QgdmFsID0gdXJsVmFsdWVzW2tleV07XG4gICAgICBpZighdmFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtrZXl9IGlzIG5vdCBzZXQgZm9yIGNvbnRyb2xsZXIgJHsgY29udHJvbGxlci5fdGFnTmFtZSB9YCk7XG4gICAgICB9XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZShyZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG4vKipcbiAqIGxvYWRIVE1MRmlsZSBsb2FkcyB0aGUgSFRNTCBjb250ZW50IGZpbGUgZnJvbSB0aGUgc2VydmVyIHZpYSBhamF4IHJlcXVlc3QuXG4gKlxuICogSWYgdGhlIEhUTUwgZmlsZSBpcyBsb2FkZWQgYWxyZWFkeSB0aGUgZnVuY3Rpb24gdGFrZXMgbm8gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5fEJvb2xlYW4+fSAtIHdhaXRzIGZvciB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBhcmdzKSB7XG4gIGNvbnN0IHsgY29udGVudFVybCwgX3RhZ05hbWUsIGNvbnRlbnRSZWxvYWQgfSA9IGNvbnRyb2xsZXI7XG4gIGlmICghY29udGVudFVybCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1tfdGFnTmFtZV0pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGh0bWxGaWxlc1tfdGFnTmFtZV0pO1xuICB9XG5cbiAgYXJncy5WRVJTSU9OID0gYXBwLlZFUlNJT047XG4gIGFyZ3MuX21ldGhvZCA9IFwiY29udGVudFwiO1xuXG4gIHJldHVybiAkLmdldChjb250ZW50VXJsLCBhcmdzKVxuICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoIWNvbnRlbnRSZWxvYWQpIHtcbiAgICAgICAgaHRtbEZpbGVzW190YWdOYW1lXSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVyci5yZXNwb25zZUpTT047XG4gICAgICAgIHRyaWdnZXIoXCJfUmVkaXJlY3RPblZpZXdcIiwgZGF0YVtcInVybC1saW5rXCJdKTtcbiAgICAgICAgaWYgKCFjb250ZW50UmVsb2FkKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBkYXRhW1widXJsLWxpbmtcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc8cD5SZWRpcmVjdGVkPC9wPic7XG4gICAgICB9XG4gICAgICBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXIuY29uZmlybVBhZ2VMb2FkZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cmlnZ2VyKFwibmF2TG9hZGVkXCIsIHsgY29udHJvbGxlcl9uYW1lOiAoKSA9PiBlcnIuc3RhdHVzIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBgPHNkYy1lcnJvciBkYXRhLWNvZGU9XCIke2Vyci5zdGF0dXN9XCI+JHtlcnIucmVzcG9uc2VUZXh0fTwvc2RjLWVycm9yPmA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIgcmVwbGFjZXMgYWxsIHJlZ2lzdGVyZWQgdGFncyBieSB0aGUgY29udHJvbGxlci5cbiAqIEluIHRoaXMgc3RlcCB0aGUgbGlmZS1jeWNsZSBzdGFydHMuXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBnaXZlbiBjb250YWluZXJcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBwYXJlbnQgY29udG9sbGVyIHN1cnJvdW5kZWQgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MgPSBudWxsLFxuKSB7XG4gIHBhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyIHx8ICRjb250YWluZXIuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGFwcC50YWdOYW1lcyxcbiAgICAkY29udGFpbmVyLFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuLyoqXG4gKiBwYXJzZUNvbnRlbnRVcmwgdXNlcyB0aGUgY29udGVudCBVUkwgcHJlZml4IHRvIG1hcmdlIHRoZVxuICogY29ycmVjdCBVUkwuIEFsc28gcGFyc2VzIHRoZSB1cmwgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3VybDogU3RyaW5nLCBhcmdzOiBBcnJheX19IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgeyBhcmdzLCBwYXJhbXMgfSA9IGdldFVybFBhcmFtKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoKSB7XG4gICAgdXJsID0gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHBhcmFtcyk7XG4gIH1cblxuICBjb250cm9sbGVyLnBhcnNlZENvbnRlbnRVcmwgPSB1cmw7XG5cbiAgcmV0dXJuIHsgdXJsOiB1cmwsIGFyZ3MgfTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXIoJGVsZW0pIHtcbiAgaWYgKCRlbGVtLmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgcmV0dXJuICRlbGVtLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgfVxuICByZXR1cm4gJGVsZW0uY2xvc2VzdChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG59XG5cbi8qKlxuICogbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKiBUaGUgY29udGVudCBpcyBzYXZlZCBhcyBqUXVlcnkgb2JqZWN0IHRvIHRoZSBjb250cm9sbGVyLiRjb250ZW50IHByb3BlcnR5IG9mXG4gKiB0aGUgY29udHJvbGxlci5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBsZXQgZ2V0RWxlbWVudHMgPSB7IGFyZ3M6IHt9IH07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKV0pLnRoZW4oXG4gICAgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGxldCBodG1sRmlsZSA9IHJlc3VsdHNbMF07XG4gICAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gJChodG1sRmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiAkKFwiPGRpdj48L2Rpdj5cIikuYXBwZW5kKGh0bWxGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIHJlbG9hZEhUTUxDb250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgbGV0IGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGdldEVsZW1lbnRzLmFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZSgkKCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICBsZXQgY29udHJvbGxlciA9ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIGlmIChjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbiAgfVxuXG5cbiAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJGYWN0b3J5KFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCBlbXB0aWVzIHRoZSByZWdpc3RlcmVkIHRhZyBhbmQgcmVwbGFjZXMgaXQgYnkgdGhlIGNvbnRyb2xsZXJcbiAqIGNvbnRlbnQuIEl0IHNldHMgdGhlIENTUyB0YWdzIGZvciB0aGUgcmVsYXRpb24gd2l0aCB0aGUgQ1NTIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sLCBwcm9jZXNzID0gbnVsbCkge1xuICBpZiAoJGh0bWwgJiYgJGh0bWwubGVuZ3RoID4gMCkge1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX3RhZ05hbWUsIFwiXCIpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgXCJcIik7XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hcHBlbmQoJGh0bWwpO1xuICB9XG5cbiAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBjb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgdGFnTGlzdCxcbiAgJGNvbnRhaW5lcixcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBsZXQgdGFnRGVzY3JpcHRpb25FbGVtZW50cyA9IGZpbmRTZGNUZ3MoXG4gICAgICAkY29udGFpbmVyLFxuICAgICAgdGFnTGlzdCxcbiAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgKTtcbiAgICBsZXQgdGFnQ291bnQgPSB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcblxuICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGVsZW1lbnRJbmRleCA9IDA7XG4gICAgICBlbGVtZW50SW5kZXggPCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcbiAgICAgIGVsZW1lbnRJbmRleCsrXG4gICAgKSB7XG4gICAgICBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICAgICBwcm9jZXNzLFxuICAgICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoXG4gICAgY29udHJvbGxlcixcbiAgICAkY29udGFpbmVyID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG5mdW5jdGlvbiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkZG9tLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHBsaXN0ID0gW107XG5cbiAgJGRvbVxuICAgIC5maW5kKGAuX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIuc2RjX3V1aWRfJHtjb250cm9sbGVyLl91dWlkfWApXG4gICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgbGV0IHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICgkdGhpcy5oYXNDbGFzcyhgX3dpdGhfaGFuZGxlcmApKSB7XG4gICAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoXCJoYW5kbGVyXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLnJlcGxhY2UoL150aGlzLi8sIFwiXCIpO1xuICAgICAgICBpZiAoY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHByZXBhcmVEYXRhKCR0aGlzLmRhdGEoKSwgY29udHJvbGxlcik7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBwbGlzdC5wdXNoKFxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oKHgpID0+IHtcbiAgICAgICAgICAgIGxldCAkbmV3Q29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICAgICAkbmV3Q29udGVudC5hcHBlbmQoeCk7XG5cbiAgICAgICAgICAgIGlmICgkdGhpcy5odG1sKCkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgJHRoaXMuYXBwZW5kKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhcHAucmVjb25jaWxlKFxuICAgICAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAkbmV3Q29udGVudCxcbiAgICAgICAgICAgICAgJHRoaXMuY2hpbGRyZW4oKSxcbiAgICAgICAgICAgICAgcHJvY2VzcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlWzBdLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGBURVhUX18ke25vZGVbMF0ubm9kZVZhbHVlfWA7XG4gIH1cbiAgY29uc3QgcmVzID0gW25vZGVbMF0udGFnTmFtZV07XG4gIGlmIChub2RlWzBdLm5vZGVOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICBbXG4gICAgICBbXCJuYW1lXCIsIFwiXCJdLFxuICAgICAgW1widHlwZVwiLCBcInRleHRcIl0sXG4gICAgICBbXCJpZFwiLCBcIlwiXSxcbiAgICBdLmZvckVhY2goKFtrZXksIGRlZmF1bHRWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBub2RlLmF0dHIoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoYXR0cikge1xuICAgICAgICByZXMucHVzaChhdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzLmpvaW4oXCJfX1wiKTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50LCBpZCA9IFtdLCBwYXJlbnQgPSBudWxsIH0pIHtcbiAgaWQucHVzaChnZXROb2RlS2V5KCRlbGVtZW50KSk7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICAkZWxlbWVudCxcbiAgICBpZDogaWQuam9pbihcIjo6XCIpLFxuICAgIGRlcHRoOiBpZC5sZW5ndGgsXG4gICAgaWR4OiAwLFxuICAgIGdldFJlYWxQYXJlbnQ6ICgpID0+IHBhcmVudCxcbiAgICBnZXRJZHg6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaWR4ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgICh0aGlzLmdldFJlYWxQYXJlbnQoKT8uZ2V0SWR4KCkgPz8gLTEpICsgJGVsZW1lbnQuaW5kZXgoKSArIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuaWR4O1xuICAgIH0sXG4gICAgb3A6IG51bGwsXG4gICAgcGFyZW50LFxuICB9O1xuICBvYmouZ2V0SWR4LmJpbmQob2JqKTtcbiAgcmV0dXJuIFtvYmpdLmNvbmNhdChcbiAgICAkZWxlbWVudFxuICAgICAgLmNvbnRlbnRzKClcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXAoKHgpID0+XG4gICAgICAgIHJlY29uY2lsZVRyZWUoe1xuICAgICAgICAgICRlbGVtZW50OiAkKHgpLFxuICAgICAgICAgIGlkOiBpZC5zbGljZSgpLFxuICAgICAgICAgIHBhcmVudDogb2JqLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5mbGF0KCksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpIHtcbiAgY29uc3QgJG9sZCA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHJlYWxOb2RlIH0pO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50OiAkdmlydHVhbE5vZGUgfSk7XG4gICRvbGQubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gICRuZXcubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKCh4KSA9PiB4LmRlcHRoKSk7XG4gIGNvbnN0IG9wX3N0ZXBzID0gbGNiRGlmZigkb2xkLCAkbmV3LCBkZXB0aCk7XG4gIGxldCB0b1JlbW92ZSA9IFtdO1xuICB3aW5kb3cuTUFJTiA9ICRyZWFsTm9kZTtcbiAgd2luZG93Lk9QUyA9IG9wX3N0ZXBzO1xuXG4gIG9wX3N0ZXBzLmZvckVhY2goKG9wX3N0ZXAsIGkpID0+IHtcbiAgICBjb25zdCB7IG9wLCAkZWxlbWVudCwgaWR4IH0gPSBvcF9zdGVwO1xuXG4gICAgaWYgKG9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiKSB7XG4gICAgICBsZXQgY0lkeCA9IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpO1xuICAgICAgaWYgKGNJZHggIT09IGlkeCkge1xuICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgb3Bfc3RlcC5nZXRSZWFsUGFyZW50KCkuJGVsZW1lbnQucHJlcGVuZChvcC5jb3VudGVycGFydC4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3luY0F0dHJpYnV0ZXMob3AuY291bnRlcnBhcnQuJGVsZW1lbnQsICRlbGVtZW50KTtcbiAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpLiRjb250YWluZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudDtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdG9SZW1vdmUucHVzaCgkZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICAkZWxlbWVudC5zYWZlUmVtb3ZlKCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSBcImluc2VydFwiKSB7XG4gICAgICBjb25zdCB7IGFmdGVyLCB0YXJnZXQgfSA9IG9wX3N0ZXAub3A7XG4gICAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgICAgJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoYWZ0ZXIuJGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LiRlbGVtZW50LnByZXBlbmQoJGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgdG9SZW1vdmUuZm9yRWFjaCgoJGVsZW1lbnQpID0+ICRlbGVtZW50LnNhZmVSZW1vdmUoKSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIGJ5IHNkY0RvbSAoSlNYIG9uKiBwcm9wcykgb24gYSBrZXB0IG5vZGVcbiAqIHdpdGggdGhlIGxpc3RlbmVycyBvZiBpdHMgbmV3IHZpcnR1YWwgY291bnRlcnBhcnQuXG4gKi9cbmZ1bmN0aW9uIHN5bmNMaXN0ZW5lcnMocmVhbCwgdmlydHVhbCkge1xuICBpZiAoIXJlYWwgfHwgIXZpcnR1YWwgfHwgKCFyZWFsLl9zZGNMaXN0ZW5lcnMgJiYgIXZpcnR1YWwuX3NkY0xpc3RlbmVycykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgKHJlYWwuX3NkY0xpc3RlbmVycyA/PyBbXSkuZm9yRWFjaCgoW3R5cGUsIGZuXSkgPT4gcmVhbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuKSk7XG4gIGNvbnN0IGxpc3RlbmVycyA9IHZpcnR1YWwuX3NkY0xpc3RlbmVycyA/PyBbXTtcbiAgbGlzdGVuZXJzLmZvckVhY2goKFt0eXBlLCBmbl0pID0+IHJlYWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikpO1xuICByZWFsLl9zZGNMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIHN5bmNBdHRyaWJ1dGVzKCRyZWFsLCAkdmlydHVhbCkge1xuICBzeW5jTGlzdGVuZXJzKCRyZWFsWzBdLCAkdmlydHVhbFswXSk7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoISR2aXJ0dWFsLmlzKGBbJHthdHRyLm5hbWV9XWApKSB7XG4gICAgICAkcmVhbC5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGQgb3IgdXBkYXRlXG4gIFsuLi52aXJ0dWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoIWF0dHIubmFtZS5zdGFydHNXaXRoKGBkYXRhYCkgJiYgJHJlYWwuYXR0cihhdHRyLm5hbWUpICE9PSBhdHRyLnZhbHVlKSB7XG4gICAgICAkcmVhbC5hdHRyKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICAkcmVhbC5yZW1vdmVEYXRhKCk7XG4gIE9iamVjdC5lbnRyaWVzKCR2aXJ0dWFsLmRhdGEoKSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgJHJlYWwuZGF0YShrZXksIHZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTENCIChMb25nZXN0IENvbW1vbiBCcmFuY2gpIGZpbmRzIG1hdGNoaW5nIGJyYW5jaGVzIGFuZCByZXNlcnZlcyB0aGVtIVxuICpcbiAqIEBwYXJhbSBvbGROb2Rlc1xuICogQHBhcmFtIG5ld05vZGVzXG4gKiBAcGFyYW0gZGVwdGhcbiAqIEByZXR1cm5zIHsqfCpbXX1cbiAqL1xuZnVuY3Rpb24gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoKSB7XG4gIG5ld05vZGVzXG4gICAgLmZpbHRlcigoeCkgPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApXG4gICAgLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICAgIGNvbnN0IG9sZE5vZGUgPSBvbGROb2Rlcy5maW5kKCh0ZW1wT2xkTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gIXRlbXBPbGROb2RlLm9wICYmIHRlbXBPbGROb2RlLmlkID09PSBuZXdOb2RlLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbGROb2RlKSB7XG4gICAgICAgIGNvbnN0IGtlZXBUcmVlQnJhbmNoID0gKG9sZE5vZGUsIG5ld05vZGUpID0+IHtcbiAgICAgICAgICBvbGROb2RlLm9wID0geyB0eXBlOiBcImtlZXBcIiwgaWR4OiBuZXdOb2RlLmlkeCB9O1xuICAgICAgICAgIG5ld05vZGUub3AgPSB7IHR5cGU6IFwia2VlcF9jb3VudGVycGFydFwiLCBjb3VudGVycGFydDogb2xkTm9kZSB9O1xuICAgICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnQ7XG4gICAgICAgICAgaWYgKCFvbGROb2RlIHx8IG9sZE5vZGUub3AgfHwgbmV3Tm9kZT8ub3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIGtlZXBUcmVlQnJhbmNoKG9sZE5vZGUsIG5ld05vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICBpZiAoZGVwdGggPiAxKSB7XG4gICAgcmV0dXJuIGxjYkRpZmYob2xkTm9kZXMsIG5ld05vZGVzLCBkZXB0aCAtIDEpO1xuICB9XG5cbiAgb2xkTm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgaWR4ID0gKG9sZE5vZGVzW2kgLSAxXT8ub3AuaWR4ID8/IC0xKSArIDE7XG4gICAgICB4Lm9wID0geyB0eXBlOiBcImRlbGV0ZVwiLCBpZHggfTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFJlYWxQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgID8gZWxlbWVudC5wYXJlbnQub3AuY291bnRlcnBhcnRcbiAgICAgIDogZWxlbWVudC5wYXJlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCZWZvcmUoZWxlbWVudCwgaWR4KSB7XG4gICAgY29uc3Qgc3RhcnREZXB0aCA9IGVsZW1lbnQuZGVwdGg7XG4gICAgd2hpbGUgKGlkeCA+PSAxICYmIGVsZW1lbnQuZGVwdGggPj0gc3RhcnREZXB0aCkge1xuICAgICAgaWR4IC09IDE7XG4gICAgICBlbGVtZW50ID0gbmV3Tm9kZXNbaWR4XTtcbiAgICAgIGlmIChlbGVtZW50LmRlcHRoID09PSBzdGFydERlcHRoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiXG4gICAgICAgICAgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0XG4gICAgICAgICAgOiBlbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbmV3Tm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIHguZ2V0QmVmb3JlID0gKCkgPT4gZ2V0QmVmb3JlKHgsIGkpO1xuICAgIHguZ2V0UmVhbFBhcmVudCA9ICgpID0+IGdldFJlYWxQYXJlbnQoeCk7XG5cbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHguZ2V0UmVhbFBhcmVudCgpO1xuICAgICAgY29uc3QgdHlwZSA9IHRhcmdldD8ub3AudHlwZSA9PT0gXCJpbnNlcnRcIiA/IFwiaW5zZXJ0X2lnbm9yZVwiIDogXCJpbnNlcnRcIjtcbiAgICAgIHgub3AgPSB7IHR5cGUsIHRhcmdldCwgYWZ0ZXI6IHguZ2V0QmVmb3JlKCkgfTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHRhZ2dlZCA9IFsuLi5vbGROb2RlcywgLi4ubmV3Tm9kZXNdO1xuXG4gIHJldHVybiB0YWdnZWQuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFWYWwgPSBhLm9wPy5pZHggPz8gYS5pZHg7XG4gICAgY29uc3QgYlZhbCA9IGIub3A/LmlkeCA/PyBiLmlkeDtcblxuICAgIHJldHVybiBhVmFsIC0gYlZhbDtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZG9tXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICBsZWFmQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGRvbSk7XG4gIH1cblxuICBpZiAoIWxlYWZDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgIHByb2Nlc3MsXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICk7XG5cbiAgJGRvbSA/Pz0gbGVhZkNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgYXBwLnRhZ05hbWVzLFxuICAgICRkb20sXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkTWV0aG9kSFRNTChsZWFmQ29udHJvbGxlciwgJGRvbSwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
138
148
 
139
149
  /***/ }
140
150
 
141
151
  /******/ });
142
152
  /************************************************************************/
143
153
  /******/ // The module cache
144
- /******/ var __webpack_module_cache__ = {};
154
+ /******/ const __webpack_module_cache__ = {};
145
155
  /******/
146
156
  /******/ // The require function
147
157
  /******/ function __webpack_require__(moduleId) {
148
158
  /******/ // Check if module is in cache
149
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
159
+ /******/ const cachedModule = __webpack_module_cache__[moduleId];
150
160
  /******/ if (cachedModule !== undefined) {
151
161
  /******/ return cachedModule.exports;
152
162
  /******/ }
153
163
  /******/ // Create a new module (and put it into the cache)
154
- /******/ var module = __webpack_module_cache__[moduleId] = {
164
+ /******/ const module = __webpack_module_cache__[moduleId] = {
155
165
  /******/ // no module.id needed
156
166
  /******/ // no module.loaded needed
157
167
  /******/ exports: {}
@@ -160,7 +170,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
160
170
  /******/ // Execute the module function
161
171
  /******/ if (!(moduleId in __webpack_modules__)) {
162
172
  /******/ delete __webpack_module_cache__[moduleId];
163
- /******/ var e = new Error("Cannot find module '" + moduleId + "'");
173
+ /******/ const e = new Error("Cannot find module '" + moduleId + "'");
164
174
  /******/ e.code = 'MODULE_NOT_FOUND';
165
175
  /******/ throw e;
166
176
  /******/ }
@@ -173,11 +183,26 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
173
183
  /************************************************************************/
174
184
  /******/ /* webpack/runtime/define property getters */
175
185
  /******/ (() => {
176
- /******/ // define getter functions for harmony exports
186
+ /******/ // define getter/value functions for harmony exports
177
187
  /******/ __webpack_require__.d = (exports, definition) => {
178
- /******/ for(var key in definition) {
179
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
180
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
188
+ /******/ if(Array.isArray(definition)) {
189
+ /******/ var i = 0;
190
+ /******/ while(i < definition.length) {
191
+ /******/ var key = definition[i++];
192
+ /******/ var binding = definition[i++];
193
+ /******/ if(!__webpack_require__.o(exports, key)) {
194
+ /******/ if(binding === 0) {
195
+ /******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
196
+ /******/ } else {
197
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
198
+ /******/ }
199
+ /******/ } else if(binding === 0) { i++; }
200
+ /******/ }
201
+ /******/ } else {
202
+ /******/ for(var key in definition) {
203
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
204
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
205
+ /******/ }
181
206
  /******/ }
182
207
  /******/ }
183
208
  /******/ };
@@ -192,7 +217,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
192
217
  /******/ (() => {
193
218
  /******/ // define __esModule on exports
194
219
  /******/ __webpack_require__.r = (exports) => {
195
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
220
+ /******/ if(Symbol.toStringTag) {
196
221
  /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
197
222
  /******/ }
198
223
  /******/ Object.defineProperty(exports, '__esModule', { value: true });
@@ -204,7 +229,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
204
229
  /******/ // startup
205
230
  /******/ // Load entry module and return exports
206
231
  /******/ // This entry module is referenced by other modules so it can't be inlined
207
- /******/ var __webpack_exports__ = __webpack_require__("./src/index.js");
232
+ /******/ let __webpack_exports__ = __webpack_require__("./src/index.js");
208
233
  /******/ const __webpack_exports__AbstractSDC = __webpack_exports__.AbstractSDC;
209
234
  /******/ const __webpack_exports__SdcModel = __webpack_exports__.SdcModel;
210
235
  /******/ const __webpack_exports__SdcQuerySet = __webpack_exports__.SdcQuerySet;
@@ -224,4 +249,4 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
224
249
  /******/ export { __webpack_exports__AbstractSDC as AbstractSDC, __webpack_exports__SdcModel as SdcModel, __webpack_exports__SdcQuerySet as SdcQuerySet, __webpack_exports__allOff as allOff, __webpack_exports__app as app, __webpack_exports__checkIfParamNumberBoolOrString as checkIfParamNumberBoolOrString, __webpack_exports__clearErrorsInForm as clearErrorsInForm, __webpack_exports__controllerFactory as controllerFactory, __webpack_exports__on as on, __webpack_exports__registerModel as registerModel, __webpack_exports__runControlFlowFunctions as runControlFlowFunctions, __webpack_exports__setErrorsInForm as setErrorsInForm, __webpack_exports__setEvent as setEvent, __webpack_exports__socketReconnect as socketReconnect, __webpack_exports__test_utils as test_utils, __webpack_exports__trigger as trigger };
225
250
  /******/
226
251
 
227
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQUFBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTs7U0FFQTtTQUNBO1NBQ0E7Ozs7O1VDNUJBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EseUNBQXlDLHdDQUF3QztVQUNqRjtVQUNBO1VBQ0EsRTs7Ozs7VUNQQSx3Rjs7Ozs7VUNBQTtVQUNBO1VBQ0E7VUFDQSx1REFBdUQsaUJBQWlCO1VBQ3hFO1VBQ0EsZ0RBQWdELGFBQWE7VUFDN0QsRTs7Ozs7U0VOQTtTQUNBO1NBQ0E7U0FDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovLy93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
252
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FBQTtTQUNBOztTQUVBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBOztTQUVBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBOzs7OztVQzVCQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQSwyQ0FBMkMsMENBQTBDO1VBQ3JGLE1BQU07VUFDTiwyQ0FBMkMsZ0NBQWdDO1VBQzNFO1VBQ0EsS0FBSyx5QkFBeUI7VUFDOUI7VUFDQSxHQUFHO1VBQ0g7VUFDQTtVQUNBLDBDQUEwQyx3Q0FBd0M7VUFDbEY7VUFDQTtVQUNBO1VBQ0EsRTs7Ozs7VUN0QkEsd0Y7Ozs7O1VDQUE7VUFDQTtVQUNBO1VBQ0EsdURBQXVELGlCQUFpQjtVQUN4RTtVQUNBLGdEQUFnRCxhQUFhO1VBQzdELEU7Ozs7O1NFTkE7U0FDQTtTQUNBO1NBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly8vd2VicGFjay9zdGFydHVwIiwid2VicGFjazovLy93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIG1vZHVsZSBjYWNoZVxuY29uc3QgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRjb25zdCBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0Y29uc3QgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdGNvbnN0IGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyL3ZhbHVlIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRpZihBcnJheS5pc0FycmF5KGRlZmluaXRpb24pKSB7XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHdoaWxlKGkgPCBkZWZpbml0aW9uLmxlbmd0aCkge1xuXHRcdFx0dmFyIGtleSA9IGRlZmluaXRpb25baSsrXTtcblx0XHRcdHZhciBiaW5kaW5nID0gZGVmaW5pdGlvbltpKytdO1xuXHRcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRcdGlmKGJpbmRpbmcgPT09IDApIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBkZWZpbml0aW9uW2krK10gfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGJpbmRpbmcgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZihiaW5kaW5nID09PSAwKSB7IGkrKzsgfVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbmxldCBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9